From 04fba91816c2c2756c4ec266eed6ed827db21ba8 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Tue, 21 Mar 2017 17:28:28 -0500 Subject: [PATCH] Added more writeups, and made small adjustments to previous writeups I submitted --- cryptography/Hash-On-Hash-100-points.md | 31 + cryptography/Premium-RSA-350-points.md | 90 ++ .../Security-Through-Obscurity-150-points.md | 85 ++ cryptography/genius-230-points.md | 9 +- cryptography/paillier-service-400-points.md | 4 +- cryptography/rsa-4-200-points.md | 3 +- files/HashOnHash.txt | 1160 +++++++++++++++++ files/key.txt | 3 + files/premiumRSA.txt | 4 + files/sage.py | 41 + programming/match-me-300-points.md | 6 +- .../phunky-python-ii-115-points.md | 2 +- .../useless-python-50-points.md | 3 +- 13 files changed, 1428 insertions(+), 13 deletions(-) create mode 100644 cryptography/Hash-On-Hash-100-points.md create mode 100644 cryptography/Premium-RSA-350-points.md create mode 100644 cryptography/Security-Through-Obscurity-150-points.md create mode 100644 files/HashOnHash.txt create mode 100644 files/key.txt create mode 100644 files/premiumRSA.txt create mode 100644 files/sage.py diff --git a/cryptography/Hash-On-Hash-100-points.md b/cryptography/Hash-On-Hash-100-points.md new file mode 100644 index 0000000..0b16dfd --- /dev/null +++ b/cryptography/Hash-On-Hash-100-points.md @@ -0,0 +1,31 @@ +# Hash On Hash - 100 points + +There's a lot of hex strings here. Maybe they're hiding a message? [hexstrings](../files/HashOnHash.txt) + +### Solution +###### Writeup by Valar Dragon + + +The file hexstrings is a file with many lines of 32 chars of hex. +I ignored the hint, and put the first few into the online hash cracker [CrackStation](https://crackstation.net/) + +From that you could see that they were all MD5 hashes of 1 letter! +Then it was easy, +I just wrote a script to make all the 256 1 character MD5's. +Then iterate line by line and replace the lines with character that md5's to it. Concatenate the characters, and print the corresponding characters. + +``` +$ python3 hexstringsSolver.py +Im far too lazy to put anything meaningful here. Instead, here's some information about what you just solved. +The MD5 algorithm is a widely used hash function producing a 128-bit hash value. Although MD5 was initially designed to be used as a cryptographic hash function, it has been found to suffer from extensive vulnerabilities. It can still be used as a checksum to verify data integrity, but only against unintentional corruption. +Like most hash functions, MD5 is neither encryption nor encoding. It can be cracked by brute-force attack and suffers from extensive vulnerabilities as detailed in the security section below. +MD5 was designed by Ronald Rivest in 1991 to replace an earlier hash function MD4.[3] The source code in RFC 1321 contains a "by attribution" RSA license. The abbreviation "MD" stands for "Message Digest." +The security of the MD5 has been severely compromised, with its weaknesses having been exploited in the field, most infamously by the Flame malware in 2012. The CMU Software Engineering Institute considers MD5 essentially "cryptographically broken and unsuitable for further use".[4] +easyctf{1_h0p3_y0u_d1dn7_d0_7h47_by_h4nd} +``` + +We learn a few facts about MD5 and get our flag! + +### External Writeups + +* [https://github.com/HackThisCode/CTF-Writeups/tree/master/2017/EasyCTF/Hash%20On%20Hash/README.md](https://github.com/HackThisCode/CTF-Writeups/tree/master/2017/EasyCTF/Hash%20On%20Hash/README.md) diff --git a/cryptography/Premium-RSA-350-points.md b/cryptography/Premium-RSA-350-points.md new file mode 100644 index 0000000..46d12ed --- /dev/null +++ b/cryptography/Premium-RSA-350-points.md @@ -0,0 +1,90 @@ +# Premium RSA - 350 points + +My RSA is the greatest. It's so strong, in fact, that I'll even give you [d](../files/premiumRSA.txt)! + +### Solution +###### Writeup by Valar Dragon + + + +This was a terrific challenge about RSA Partial Key Recovery! (Something I didn't even know existed before) Thankfully we were given over half of the private key. If we were given a quarter of the key, we would have to implement the Coppersmith attack, in addition to whats below. + +**Due to a lack of Latex, if notation is non-standard mathematics notation, it is Python notation** + +We are given N, The last 2048 bits of d, e, and c, and asked to get the message! + +Lets call the least significant 2048 bits of d we have `d0` + +Solving this involved a lot of derivation and reading up on RSA Attacks, namely the following two documents: +* http://www.ijser.org/researchpaper/Attack_on_RSA_Cryptosystem.pdf +* http://honors.cs.umd.edu/reports/lowexprsa.pdf + +The idea is that `ed - k(N-p-q+1) = 1` by definition of modulo. `[1]` + +Note that `N-p-q+1 = φ(N)` + +d must be less than φ(N), since `d = modInv(e,φ(N))` + +Therefore `k < e` since `ed > kφ(N)` + +Thus k is in `range(1,e)`! + +But we don't have φ(N), we have N, so we will switch φ(N) with N in the `[1]` + +Lets call this `d'` since its just an approximation. +`ed' - kN = 1` + +Rearrange, and solve for `d'` as: + +`d' = (kN + 1) // e` + +The maximum error in d' is: `3 sqrt(nBitSize)` bits, where nBitSize is how many bits long the modulus is. See the links for a proof of this maximum error. + +That error is less than `dBitSize/2`, so we can just replace the least significant bits with `d0` +and get the plaintext! + +But we need a way of testing k. One way to do it would be to try encrypting a known message with e and n, and decrypting it with the d were getting from that particular k. +The only issue is that modpows are slow, especially as the exponent d is growing, as is the case with increasing k. + +We actually have a way to speed this up greatly! +Using `[1]` again, +``` +ed - k(N-p-q+1) = 1 +ed ≡ 1 mod k +ed -1 ≡ 0 mod k +``` +Nearly all k will fail that criterion, making it perfect! +I'm then going to decrypt test messages, just to be absolutely sure. +Now we have e,d, and N! Just for completion, lets find p and q. +Rearranging `[1]` +`φ(N) = (ed - 1)//k` +``` +φ(N) = (p-1)(q-1) = n - p - q + 1 +p^2 - p^2 - N + N = 0 +p^2 - p^2 - pq + N = 0 +p^2 + (-p -q)p + N = 0 +p^2 + (φ(N) -n -1) + N = 0 +``` +Solving this quadratic for variable p: +``` python +b = totientN - n - 1 +discriminant = b*b - 4*n +#make sure discriminant is perfect square +root = self.floorSqrt(discriminant) +assert root*root == discriminant +p = (-b + root) // 2 +q = n // p +``` +Now raise the message to d, and we get our flag! + +My code is in [premiumRSA.py](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Premium%20RSA/premiumRSA.py), the method halfdPartialKeyRecoveryAttack +comes from my RSA Solver, https://github.com/ValarDragon/CTF-Crypto/blob/master/RSA/RSATool.py + +``` bash +$ python3 premiumRSA.py +easyctf{wow_i_pR0bABLY_5h0uldntA_l33k3d_d} +``` +_All the flags have randomized 1337 speak, so your flag may vary_ +### External Writeups + +* [https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Premium%20RSA/README.md](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Premium%20RSA/README.md) diff --git a/cryptography/Security-Through-Obscurity-150-points.md b/cryptography/Security-Through-Obscurity-150-points.md new file mode 100644 index 0000000..40c41ea --- /dev/null +++ b/cryptography/Security-Through-Obscurity-150-points.md @@ -0,0 +1,85 @@ +# Security Through Obscurity - 150 points + +I've never seen such a cryptosystem]before! It looks like a public key cryptosystem, though... Could you help me crack it? + +[encrypt.sage](../files/sage.py) +[publickey_and_ciphertext.txt](../files/key.txt) + +### Solution +###### Writeup by Valar Dragon + + +I think this problem achieves the true definition of failed Security Through Obscurity! These files, except for my [solver](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Security%20Through%20Obscurity/sageSolver.py), are all sage files. +Sage is an open source python-based alternative to Mathematica and Matlab. + +Lets analyze the code in sage.py + +``` python +def calc_root(num, mod, n): + f = GF(mod) + temp = f(num) + return temp.nth_root(n) +``` +Looking through the Sage documentation, we can see that +f becomes a finite field of order mod. Mod is actually a prime, being passed from `gen_v_list(primelist, p, secret)`. + +temp.nth_root(n) is finding the nth root of temp in this finite field. This means that +``` python +pow(temp.nth_root(n),n) ≡ temp mod num +``` + +This means that we can quite easily brute force for SECRET, see [sageSecret](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Security%20Through%20Obscurity/sageSecret.py) file. +We don't actually need to solve for SECRET however. + +So now this tells us what +``` python +def gen_v_list(primelist, p, secret): + a = [] + for prime in primelist: + a.append(calc_root(prime, p, secret)) + return a +``` +means. gen_v_list is the nth root of each prime in the finite field of size p. + +``` python +primelist = [2,3,5,7,11,13,17,19,23,29,31,37,43,47,53,59] +message = REDACTED +chunks = [] +for i in range(0,len(message),2): + chunks += [message[i:i+2]] +``` +This splits the message into 2 byte chunks + +``` python +for chunk in chunks: + binarized = bin(int(chunk.encode('hex'),16)).replace('0b','').zfill(16)[::-1] #lsb first + enc = 1 + for bit in range(len(binarized)): + enc *= vlist[bit]**int(binarized[bit]) + enc = enc%p + print(enc) +``` +This converts every chunk to hex, removes any `0b` in the hex, converts it to binary, pads the left with 0's until its 16 bits longs, and then reverses the string. The for loop is multiplying enc by that +index in vlist if binarized[i] is 1. If its 0, then do nothing to enc. Finally take enc modulo p. + +Wait!!! Only 16 bits in a chunk?? That means theres only `2**16 = 65536` options, well within the brute force range! + We can just do a reverse lookup on everything in the ciphertext! + + +Brute forcing all 16 bits of options, and doing reverse lookups on Ciphertext, gives us the flag: +``` bash +$ python3 sageSolver.py +flag{i_actu4lly_d0nt_know_th3_name_of_th15_crypt0sy5tem} +``` + +In discussion with Neptunia, the challenge creator, I found out this was actually an unintended solution, + and this solution reduced the point value from 500 points (iirc), + to this current 150. + +The intended solution involved learning what cryptosystem this is through google, and from there figuring out its decrypt function. + +A link for the cryptosystem given post-CTF on this cryptosystem is: + https://www.di.ens.fr/~stern/data/St63.pdf + ### External Writeups + + * [https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Security%20Through%20Obscurity/README.md](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Security%20Through%20Obscurity/README.md) diff --git a/cryptography/genius-230-points.md b/cryptography/genius-230-points.md index 4e45adc..89cce26 100644 --- a/cryptography/genius-230-points.md +++ b/cryptography/genius-230-points.md @@ -3,7 +3,7 @@ Your boss told you that this team has come up with the cryptographic hash of the future, but something about their operation just seems a little fishy. ### Solution - +###### Writeup by Valar Dragon Here's the site: ![Screenshot 1](https://raw.githubusercontent.com/ValarDragon/CTF-Writeups/master/2017/EasyCTF/Genius/Site-1.png) ![Screenshot 2](https://raw.githubusercontent.com/ValarDragon/CTF-Writeups/master/2017/EasyCTF/Genius/Site-2.png) @@ -18,9 +18,10 @@ This shows us that there are 4 byte words in these hashes! Lets take the MD5 hash of `like`, and see how it compares to these strings. `md5(like) = be1ab1632e4285edc3733b142935c60b` -That hash is be1ab1632e4285edc3733b142935c60b90383bad42309f7f6850d2b4250a713d0b2d7a97350465a02554d29d92bfefaf +The hash it was found in is +`be1ab1632e4285edc3733b142935c60b90383bad42309f7f6850d2b4250a713d0b2d7a97350465a02554d29d92bfefaf` -So, these md5's are looking like they are concatenations of 3 md5's of 4 byte strings! +So the md5 of `like` is the first 32 chars of the line it was in! Each line of the hash is looking like it is the concatenation of 3 md5's of 4 byte strings! So I split the given hash into 32 char chunks, and than began brute forcing 4 byte strings with lowercase and UPPERCASE letters, `{_}`, and numbers. This gives us: @@ -53,4 +54,4 @@ Putting that into the website's prompt gives a popup with the flag: ### External Writeups -* [https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Genius/README.md](https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Genius/README.md) +* [https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Genius/README.md](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Genius/README.md) diff --git a/cryptography/paillier-service-400-points.md b/cryptography/paillier-service-400-points.md index 4e25bbf..1b9567e 100644 --- a/cryptography/paillier-service-400-points.md +++ b/cryptography/paillier-service-400-points.md @@ -5,7 +5,7 @@ My friend made some sort of encryption service using the Paillier cryptosystem. Access his encryption service at `paillier.tcp.easyctf.com 8570` ### Solution - +###### Writeup by Valar Dragon This was a really easy/straightforward Paillier Cryptosystem Problem! It was a great way to learn about the Paillier Cryptosystem! We are not actually 'cracking' the Paillier Cryptosystem for this challenge, we are gaining the ability to encrypt our own messages already given the ability to choose the message and random number. @@ -69,4 +69,4 @@ as our flag! ### External Writeups -* [https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Paillier%20Service/README.md](https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Paillier%20Service/README.md) +* [https://github.com/HackThisCode/CTF-Writeups/tree/master/2017/EasyCTF/Paillier%20Service/README.md](https://github.com/HackThisCode/CTF-Writeups/tree/master/2017/EasyCTF/Paillier%20Service/README.md) diff --git a/cryptography/rsa-4-200-points.md b/cryptography/rsa-4-200-points.md index afbacd9..4e2f3da 100644 --- a/cryptography/rsa-4-200-points.md +++ b/cryptography/rsa-4-200-points.md @@ -3,6 +3,7 @@ After doing so much RSA, I finally messed up.... pls help. I encrypted my secret [message](../files/rsa4.txt) but the decryption isn't working!! ### Solution +###### Writeup by Valar Dragon \*Unfortunately due to a flag leak this challenge was taken down. @@ -75,4 +76,4 @@ bytearray(b'easyctf{m0dul4r_fuN!}') ### External Writeups -* [https://github.com/ValarDragon/CTF-Writeups/tree/master/2017/EasyCTF/RSA%204/README.md](https://github.com/ValarDragon/CTF-Writeups/tree/master/2017/EasyCTF/RSA%204/README.md) +* [https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/RSA%204/README.md](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/RSA%204/README.md) diff --git a/files/HashOnHash.txt b/files/HashOnHash.txt new file mode 100644 index 0000000..36818ad --- /dev/null +++ b/files/HashOnHash.txt @@ -0,0 +1,1160 @@ +dd7536794b63bf90eccfd37f9b147d7f +6f8f57715090da2632453988d9a1501b +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +0cc175b9c0f1b6a831c399e269772661 +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +d95679752134a2d9eb61dbd7b91c4bcc +7215ee9c7d9dc229d2921a40e899ec5f +2db95e8e1a9267b7a1188556b2013b33 +0cc175b9c0f1b6a831c399e269772661 +fbade9e36a3f36d3d676c1b808451dd7 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +7215ee9c7d9dc229d2921a40e899ec5f +83878c91171338902e0fe0fb97a8c47a +7b774effe4a349c6dd82ad4f4f21d34c +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +415290769594460e2e485922904f345d +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +7215ee9c7d9dc229d2921a40e899ec5f +6f8f57715090da2632453988d9a1501b +e1671797c52e15f763380b45e841ec32 +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +8fa14cdd754f91cc6554c9e71929cce7 +7b774effe4a349c6dd82ad4f4f21d34c +2db95e8e1a9267b7a1188556b2013b33 +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +5058f1af8388633f609cadb75a75dc9d +7215ee9c7d9dc229d2921a40e899ec5f +dd7536794b63bf90eccfd37f9b147d7f +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +0cc175b9c0f1b6a831c399e269772661 +8277e0910d750195b448797616e091ad +c0cb5f0fcf239ab3d9c1fcd31fff1efc +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +3590cb8af0bbb9e78c343b52b93773c9 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +d95679752134a2d9eb61dbd7b91c4bcc +6f8f57715090da2632453988d9a1501b +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +8fa14cdd754f91cc6554c9e71929cce7 +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +6f8f57715090da2632453988d9a1501b +0cc175b9c0f1b6a831c399e269772661 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +92eb5ffee6ae2fec3ad71c777531578f +d95679752134a2d9eb61dbd7b91c4bcc +7b774effe4a349c6dd82ad4f4f21d34c +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +f1290186a5d0b1ceab27f4e77c0c5d68 +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +415290769594460e2e485922904f345d +d95679752134a2d9eb61dbd7b91c4bcc +7b774effe4a349c6dd82ad4f4f21d34c +7215ee9c7d9dc229d2921a40e899ec5f +363b122c528f54df4a0446b6bab05515 +7b774effe4a349c6dd82ad4f4f21d34c +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +d95679752134a2d9eb61dbd7b91c4bcc +2db95e8e1a9267b7a1188556b2013b33 +9e3669d19b675bd57058fd4664205d2a +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +5058f1af8388633f609cadb75a75dc9d +68b329da9893e34099c7d8ad5cb9c940 +b9ece18c950afbfa6b0fdbfa4ff731d3 +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +e4da3b7fbbce2345d7772b0674a318d5 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +b2f5ff47436671b6e533d8dc3614845d +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +6f8f57715090da2632453988d9a1501b +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7215ee9c7d9dc229d2921a40e899ec5f +f1290186a5d0b1ceab27f4e77c0c5d68 +865c0c0b4ab0e063e5caa3387c1a8741 +8277e0910d750195b448797616e091ad +e1671797c52e15f763380b45e841ec32 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +7b774effe4a349c6dd82ad4f4f21d34c +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +4a8a08f09d37b73795649038408b5f33 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +83878c91171338902e0fe0fb97a8c47a +4b43b0aee35624cd95b910189b3dc231 +d95679752134a2d9eb61dbd7b91c4bcc +8277e0910d750195b448797616e091ad +7b774effe4a349c6dd82ad4f4f21d34c +4a8a08f09d37b73795649038408b5f33 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7215ee9c7d9dc229d2921a40e899ec5f +c4ca4238a0b923820dcc509a6f75849b +c81e728d9d4c2f636f067f89cc14862c +c9f0f895fb98ab9159f51fd0297e236d +336d5ebc5436534e61d16e63ddfca327 +92eb5ffee6ae2fec3ad71c777531578f +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +9e3669d19b675bd57058fd4664205d2a +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +7b774effe4a349c6dd82ad4f4f21d34c +e1671797c52e15f763380b45e841ec32 +5058f1af8388633f609cadb75a75dc9d +7215ee9c7d9dc229d2921a40e899ec5f +7fc56270e7a70fa81a5935b72eacbe29 +2db95e8e1a9267b7a1188556b2013b33 +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +d95679752134a2d9eb61dbd7b91c4bcc +7b774effe4a349c6dd82ad4f4f21d34c +b2f5ff47436671b6e533d8dc3614845d +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +e4da3b7fbbce2345d7772b0674a318d5 +7215ee9c7d9dc229d2921a40e899ec5f +f1290186a5d0b1ceab27f4e77c0c5d68 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +8277e0910d750195b448797616e091ad +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +865c0c0b4ab0e063e5caa3387c1a8741 +b2f5ff47436671b6e533d8dc3614845d +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +7b774effe4a349c6dd82ad4f4f21d34c +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +4b43b0aee35624cd95b910189b3dc231 +415290769594460e2e485922904f345d +83878c91171338902e0fe0fb97a8c47a +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +b2f5ff47436671b6e533d8dc3614845d +4b43b0aee35624cd95b910189b3dc231 +0cc175b9c0f1b6a831c399e269772661 +83878c91171338902e0fe0fb97a8c47a +2510c39011c5be704182423e3a695e91 +865c0c0b4ab0e063e5caa3387c1a8741 +4a8a08f09d37b73795649038408b5f33 +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +4a8a08f09d37b73795649038408b5f33 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +c0cb5f0fcf239ab3d9c1fcd31fff1efc +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +d95679752134a2d9eb61dbd7b91c4bcc +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +7b774effe4a349c6dd82ad4f4f21d34c +8fa14cdd754f91cc6554c9e71929cce7 +8fa14cdd754f91cc6554c9e71929cce7 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +4b43b0aee35624cd95b910189b3dc231 +d95679752134a2d9eb61dbd7b91c4bcc +6f8f57715090da2632453988d9a1501b +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +9dd4e461268c8034f5c8564e155c67a6 +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +865c0c0b4ab0e063e5caa3387c1a8741 +9e3669d19b675bd57058fd4664205d2a +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +9e3669d19b675bd57058fd4664205d2a +7b774effe4a349c6dd82ad4f4f21d34c +2db95e8e1a9267b7a1188556b2013b33 +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +0cc175b9c0f1b6a831c399e269772661 +92eb5ffee6ae2fec3ad71c777531578f +865c0c0b4ab0e063e5caa3387c1a8741 +2db95e8e1a9267b7a1188556b2013b33 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +5058f1af8388633f609cadb75a75dc9d +7215ee9c7d9dc229d2921a40e899ec5f +dd7536794b63bf90eccfd37f9b147d7f +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +2db95e8e1a9267b7a1188556b2013b33 +2db95e8e1a9267b7a1188556b2013b33 +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +7b774effe4a349c6dd82ad4f4f21d34c +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +4a8a08f09d37b73795649038408b5f33 +8ce4b16b22b58894aa86c421e8759df3 +03c7c0ace395d80182db07ae2c30f034 +7b774effe4a349c6dd82ad4f4f21d34c +6f8f57715090da2632453988d9a1501b +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +7215ee9c7d9dc229d2921a40e899ec5f +9e3669d19b675bd57058fd4664205d2a +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +8fa14cdd754f91cc6554c9e71929cce7 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +8277e0910d750195b448797616e091ad +0cc175b9c0f1b6a831c399e269772661 +e358efa489f58062f10dd7316b65649e +0cc175b9c0f1b6a831c399e269772661 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +b2f5ff47436671b6e533d8dc3614845d +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +415290769594460e2e485922904f345d +c0cb5f0fcf239ab3d9c1fcd31fff1efc +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +7b774effe4a349c6dd82ad4f4f21d34c +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +b2f5ff47436671b6e533d8dc3614845d +0cc175b9c0f1b6a831c399e269772661 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +4b43b0aee35624cd95b910189b3dc231 +7b774effe4a349c6dd82ad4f4f21d34c +83878c91171338902e0fe0fb97a8c47a +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +5058f1af8388633f609cadb75a75dc9d +68b329da9893e34099c7d8ad5cb9c940 +d20caec3b48a1eef164cb4ca81ba2587 +865c0c0b4ab0e063e5caa3387c1a8741 +8ce4b16b22b58894aa86c421e8759df3 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +6f8f57715090da2632453988d9a1501b +d95679752134a2d9eb61dbd7b91c4bcc +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +4a8a08f09d37b73795649038408b5f33 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +c0cb5f0fcf239ab3d9c1fcd31fff1efc +7215ee9c7d9dc229d2921a40e899ec5f +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +e4da3b7fbbce2345d7772b0674a318d5 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +4a8a08f09d37b73795649038408b5f33 +4b43b0aee35624cd95b910189b3dc231 +415290769594460e2e485922904f345d +83878c91171338902e0fe0fb97a8c47a +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +7b8b965ad4bca0e41ab51de7b31363a1 +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +4a8a08f09d37b73795649038408b5f33 +d95679752134a2d9eb61dbd7b91c4bcc +8277e0910d750195b448797616e091ad +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +5058f1af8388633f609cadb75a75dc9d +7215ee9c7d9dc229d2921a40e899ec5f +dd7536794b63bf90eccfd37f9b147d7f +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +4b43b0aee35624cd95b910189b3dc231 +0cc175b9c0f1b6a831c399e269772661 +4a8a08f09d37b73795649038408b5f33 +8ce4b16b22b58894aa86c421e8759df3 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +4b43b0aee35624cd95b910189b3dc231 +7b774effe4a349c6dd82ad4f4f21d34c +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +336d5ebc5436534e61d16e63ddfca327 +8fa14cdd754f91cc6554c9e71929cce7 +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +4a8a08f09d37b73795649038408b5f33 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +e358efa489f58062f10dd7316b65649e +e358efa489f58062f10dd7316b65649e +0cc175b9c0f1b6a831c399e269772661 +4a8a08f09d37b73795649038408b5f33 +8ce4b16b22b58894aa86c421e8759df3 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +7b774effe4a349c6dd82ad4f4f21d34c +8fa14cdd754f91cc6554c9e71929cce7 +8fa14cdd754f91cc6554c9e71929cce7 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +4b43b0aee35624cd95b910189b3dc231 +d95679752134a2d9eb61dbd7b91c4bcc +6f8f57715090da2632453988d9a1501b +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +9dd4e461268c8034f5c8564e155c67a6 +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +865c0c0b4ab0e063e5caa3387c1a8741 +9e3669d19b675bd57058fd4664205d2a +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +9e3669d19b675bd57058fd4664205d2a +7b774effe4a349c6dd82ad4f4f21d34c +2db95e8e1a9267b7a1188556b2013b33 +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +0cc175b9c0f1b6a831c399e269772661 +92eb5ffee6ae2fec3ad71c777531578f +865c0c0b4ab0e063e5caa3387c1a8741 +2db95e8e1a9267b7a1188556b2013b33 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +8277e0910d750195b448797616e091ad +e1671797c52e15f763380b45e841ec32 +e358efa489f58062f10dd7316b65649e +0cc175b9c0f1b6a831c399e269772661 +865c0c0b4ab0e063e5caa3387c1a8741 +2db95e8e1a9267b7a1188556b2013b33 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +4a8a08f09d37b73795649038408b5f33 +7b774effe4a349c6dd82ad4f4f21d34c +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +4a8a08f09d37b73795649038408b5f33 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +2db95e8e1a9267b7a1188556b2013b33 +d95679752134a2d9eb61dbd7b91c4bcc +f1290186a5d0b1ceab27f4e77c0c5d68 +5058f1af8388633f609cadb75a75dc9d +68b329da9893e34099c7d8ad5cb9c940 +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +e4da3b7fbbce2345d7772b0674a318d5 +7215ee9c7d9dc229d2921a40e899ec5f +f1290186a5d0b1ceab27f4e77c0c5d68 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +8277e0910d750195b448797616e091ad +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +865c0c0b4ab0e063e5caa3387c1a8741 +b2f5ff47436671b6e533d8dc3614845d +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +e1e1d3d40573127e9ee0480caf1283d6 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +e1e1d3d40573127e9ee0480caf1283d6 +865c0c0b4ab0e063e5caa3387c1a8741 +9e3669d19b675bd57058fd4664205d2a +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +c4ca4238a0b923820dcc509a6f75849b +45c48cce2e2d7fbdea1afc51c7c6ad26 +45c48cce2e2d7fbdea1afc51c7c6ad26 +c4ca4238a0b923820dcc509a6f75849b +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +7215ee9c7d9dc229d2921a40e899ec5f +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +83878c91171338902e0fe0fb97a8c47a +2db95e8e1a9267b7a1188556b2013b33 +0cc175b9c0f1b6a831c399e269772661 +4a8a08f09d37b73795649038408b5f33 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +0cc175b9c0f1b6a831c399e269772661 +4b43b0aee35624cd95b910189b3dc231 +2db95e8e1a9267b7a1188556b2013b33 +865c0c0b4ab0e063e5caa3387c1a8741 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +4a8a08f09d37b73795649038408b5f33 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +a87ff679a2f3e71d9181a67b7542122c +5058f1af8388633f609cadb75a75dc9d +815417267f76f6f460a4a61f9db75fdb +eccbc87e4b5ce2fe28308fd9f2a7baf3 +0fbd1776e1ad22c59a7080d35c7fd4db +7215ee9c7d9dc229d2921a40e899ec5f +b9ece18c950afbfa6b0fdbfa4ff731d3 +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +d95679752134a2d9eb61dbd7b91c4bcc +7b774effe4a349c6dd82ad4f4f21d34c +4b43b0aee35624cd95b910189b3dc231 +4a8a08f09d37b73795649038408b5f33 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +d95679752134a2d9eb61dbd7b91c4bcc +8277e0910d750195b448797616e091ad +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +e1e1d3d40573127e9ee0480caf1283d6 +800618943025315f869e4e1f09471012 +0d61f8370cad1d412f80b84d143e1257 +7215ee9c7d9dc229d2921a40e899ec5f +c4ca4238a0b923820dcc509a6f75849b +eccbc87e4b5ce2fe28308fd9f2a7baf3 +c81e728d9d4c2f636f067f89cc14862c +c4ca4238a0b923820dcc509a6f75849b +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +e358efa489f58062f10dd7316b65649e +0cc175b9c0f1b6a831c399e269772661 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7215ee9c7d9dc229d2921a40e899ec5f +b15835f133ff2e27c7cb28117bfae8f4 +92eb5ffee6ae2fec3ad71c777531578f +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +e358efa489f58062f10dd7316b65649e +e358efa489f58062f10dd7316b65649e +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +92eb5ffee6ae2fec3ad71c777531578f +7b774effe4a349c6dd82ad4f4f21d34c +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +b15835f133ff2e27c7cb28117bfae8f4 +7215ee9c7d9dc229d2921a40e899ec5f +e1e1d3d40573127e9ee0480caf1283d6 +5dbc98dcc983a70728bd082d1a47546e +7fc56270e7a70fa81a5935b72eacbe29 +7215ee9c7d9dc229d2921a40e899ec5f +2db95e8e1a9267b7a1188556b2013b33 +865c0c0b4ab0e063e5caa3387c1a8741 +4a8a08f09d37b73795649038408b5f33 +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +5058f1af8388633f609cadb75a75dc9d +7215ee9c7d9dc229d2921a40e899ec5f +b9ece18c950afbfa6b0fdbfa4ff731d3 +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +92eb5ffee6ae2fec3ad71c777531578f +92eb5ffee6ae2fec3ad71c777531578f +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +9e3669d19b675bd57058fd4664205d2a +865c0c0b4ab0e063e5caa3387c1a8741 +0cc175b9c0f1b6a831c399e269772661 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +b15835f133ff2e27c7cb28117bfae8f4 +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +b15835f133ff2e27c7cb28117bfae8f4 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +8277e0910d750195b448797616e091ad +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +b15835f133ff2e27c7cb28117bfae8f4 +69691c7bdcc3ce6d5d8a1361f22d04ac +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +03c7c0ace395d80182db07ae2c30f034 +0cc175b9c0f1b6a831c399e269772661 +b2f5ff47436671b6e533d8dc3614845d +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +f623e75af30e62bbd73d6df5b50bb7b5 +865c0c0b4ab0e063e5caa3387c1a8741 +b2f5ff47436671b6e533d8dc3614845d +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +5058f1af8388633f609cadb75a75dc9d +b15835f133ff2e27c7cb28117bfae8f4 +68b329da9893e34099c7d8ad5cb9c940 +b9ece18c950afbfa6b0fdbfa4ff731d3 +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +4a8a08f09d37b73795649038408b5f33 +7b774effe4a349c6dd82ad4f4f21d34c +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +d95679752134a2d9eb61dbd7b91c4bcc +8fa14cdd754f91cc6554c9e71929cce7 +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +e4da3b7fbbce2345d7772b0674a318d5 +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +9e3669d19b675bd57058fd4664205d2a +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +d95679752134a2d9eb61dbd7b91c4bcc +6f8f57715090da2632453988d9a1501b +83878c91171338902e0fe0fb97a8c47a +4b43b0aee35624cd95b910189b3dc231 +d95679752134a2d9eb61dbd7b91c4bcc +6f8f57715090da2632453988d9a1501b +865c0c0b4ab0e063e5caa3387c1a8741 +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +c0cb5f0fcf239ab3d9c1fcd31fff1efc +7215ee9c7d9dc229d2921a40e899ec5f +f1290186a5d0b1ceab27f4e77c0c5d68 +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +f1290186a5d0b1ceab27f4e77c0c5d68 +e1671797c52e15f763380b45e841ec32 +0cc175b9c0f1b6a831c399e269772661 +8ce4b16b22b58894aa86c421e8759df3 +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +2510c39011c5be704182423e3a695e91 +0cc175b9c0f1b6a831c399e269772661 +9e3669d19b675bd57058fd4664205d2a +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +e1671797c52e15f763380b45e841ec32 +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +9dd4e461268c8034f5c8564e155c67a6 +83878c91171338902e0fe0fb97a8c47a +2db95e8e1a9267b7a1188556b2013b33 +d95679752134a2d9eb61dbd7b91c4bcc +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +865c0c0b4ab0e063e5caa3387c1a8741 +e1671797c52e15f763380b45e841ec32 +2db95e8e1a9267b7a1188556b2013b33 +8277e0910d750195b448797616e091ad +c0cb5f0fcf239ab3d9c1fcd31fff1efc +7215ee9c7d9dc229d2921a40e899ec5f +6f8f57715090da2632453988d9a1501b +d95679752134a2d9eb61dbd7b91c4bcc +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +8fa14cdd754f91cc6554c9e71929cce7 +0cc175b9c0f1b6a831c399e269772661 +6f8f57715090da2632453988d9a1501b +d95679752134a2d9eb61dbd7b91c4bcc +7b774effe4a349c6dd82ad4f4f21d34c +03c7c0ace395d80182db07ae2c30f034 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +800618943025315f869e4e1f09471012 +2db95e8e1a9267b7a1188556b2013b33 +0cc175b9c0f1b6a831c399e269772661 +6f8f57715090da2632453988d9a1501b +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +6f8f57715090da2632453988d9a1501b +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +f1290186a5d0b1ceab27f4e77c0c5d68 +0cc175b9c0f1b6a831c399e269772661 +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +c81e728d9d4c2f636f067f89cc14862c +cfcd208495d565ef66e7dff9f98764da +c4ca4238a0b923820dcc509a6f75849b +c81e728d9d4c2f636f067f89cc14862c +5058f1af8388633f609cadb75a75dc9d +7215ee9c7d9dc229d2921a40e899ec5f +b9ece18c950afbfa6b0fdbfa4ff731d3 +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +0d61f8370cad1d412f80b84d143e1257 +69691c7bdcc3ce6d5d8a1361f22d04ac +4c614360da93c0a041b22e537de151eb +7215ee9c7d9dc229d2921a40e899ec5f +5dbc98dcc983a70728bd082d1a47546e +d95679752134a2d9eb61dbd7b91c4bcc +8fa14cdd754f91cc6554c9e71929cce7 +e358efa489f58062f10dd7316b65649e +f1290186a5d0b1ceab27f4e77c0c5d68 +0cc175b9c0f1b6a831c399e269772661 +4b43b0aee35624cd95b910189b3dc231 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +3a3ea00cfc35332cedf6e5e9a32e94da +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +e1671797c52e15f763380b45e841ec32 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +865c0c0b4ab0e063e5caa3387c1a8741 +7b8b965ad4bca0e41ab51de7b31363a1 +b2f5ff47436671b6e533d8dc3614845d +7215ee9c7d9dc229d2921a40e899ec5f +dd7536794b63bf90eccfd37f9b147d7f +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +7b774effe4a349c6dd82ad4f4f21d34c +e358efa489f58062f10dd7316b65649e +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +4a8a08f09d37b73795649038408b5f33 +d95679752134a2d9eb61dbd7b91c4bcc +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +865c0c0b4ab0e063e5caa3387c1a8741 +8277e0910d750195b448797616e091ad +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +03c7c0ace395d80182db07ae2c30f034 +7215ee9c7d9dc229d2921a40e899ec5f +69691c7bdcc3ce6d5d8a1361f22d04ac +f623e75af30e62bbd73d6df5b50bb7b5 +e4da3b7fbbce2345d7772b0674a318d5 +7215ee9c7d9dc229d2921a40e899ec5f +e1671797c52e15f763380b45e841ec32 +03c7c0ace395d80182db07ae2c30f034 +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +e358efa489f58062f10dd7316b65649e +865c0c0b4ab0e063e5caa3387c1a8741 +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +b15835f133ff2e27c7cb28117bfae8f4 +4a8a08f09d37b73795649038408b5f33 +4b43b0aee35624cd95b910189b3dc231 +415290769594460e2e485922904f345d +83878c91171338902e0fe0fb97a8c47a +e358efa489f58062f10dd7316b65649e +d95679752134a2d9eb61dbd7b91c4bcc +b2f5ff47436671b6e533d8dc3614845d +4b43b0aee35624cd95b910189b3dc231 +0cc175b9c0f1b6a831c399e269772661 +83878c91171338902e0fe0fb97a8c47a +2510c39011c5be704182423e3a695e91 +865c0c0b4ab0e063e5caa3387c1a8741 +4a8a08f09d37b73795649038408b5f33 +0cc175b9c0f1b6a831c399e269772661 +2db95e8e1a9267b7a1188556b2013b33 +2db95e8e1a9267b7a1188556b2013b33 +415290769594460e2e485922904f345d +7215ee9c7d9dc229d2921a40e899ec5f +92eb5ffee6ae2fec3ad71c777531578f +4b43b0aee35624cd95b910189b3dc231 +d95679752134a2d9eb61dbd7b91c4bcc +8ce4b16b22b58894aa86c421e8759df3 +e1671797c52e15f763380b45e841ec32 +7b8b965ad4bca0e41ab51de7b31363a1 +7215ee9c7d9dc229d2921a40e899ec5f +0cc175b9c0f1b6a831c399e269772661 +7b8b965ad4bca0e41ab51de7b31363a1 +8277e0910d750195b448797616e091ad +7215ee9c7d9dc229d2921a40e899ec5f +7b774effe4a349c6dd82ad4f4f21d34c +7b8b965ad4bca0e41ab51de7b31363a1 +03c7c0ace395d80182db07ae2c30f034 +7b774effe4a349c6dd82ad4f4f21d34c +865c0c0b4ab0e063e5caa3387c1a8741 +e358efa489f58062f10dd7316b65649e +0cc175b9c0f1b6a831c399e269772661 +92eb5ffee6ae2fec3ad71c777531578f +2db95e8e1a9267b7a1188556b2013b33 +e1671797c52e15f763380b45e841ec32 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +d95679752134a2d9eb61dbd7b91c4bcc +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +8fa14cdd754f91cc6554c9e71929cce7 +7b774effe4a349c6dd82ad4f4f21d34c +4b43b0aee35624cd95b910189b3dc231 +e358efa489f58062f10dd7316b65649e +2510c39011c5be704182423e3a695e91 +e1671797c52e15f763380b45e841ec32 +4b43b0aee35624cd95b910189b3dc231 +7215ee9c7d9dc229d2921a40e899ec5f +7b774effe4a349c6dd82ad4f4f21d34c +03c7c0ace395d80182db07ae2c30f034 +e1671797c52e15f763380b45e841ec32 +b15835f133ff2e27c7cb28117bfae8f4 +5058f1af8388633f609cadb75a75dc9d +815417267f76f6f460a4a61f9db75fdb +a87ff679a2f3e71d9181a67b7542122c +0fbd1776e1ad22c59a7080d35c7fd4db +68b329da9893e34099c7d8ad5cb9c940 +e1671797c52e15f763380b45e841ec32 +0cc175b9c0f1b6a831c399e269772661 +03c7c0ace395d80182db07ae2c30f034 +415290769594460e2e485922904f345d +4a8a08f09d37b73795649038408b5f33 +e358efa489f58062f10dd7316b65649e +8fa14cdd754f91cc6554c9e71929cce7 +f95b70fdc3088560732a5ac135644506 +c4ca4238a0b923820dcc509a6f75849b +b14a7b8059d9c055954c92674ce60032 +2510c39011c5be704182423e3a695e91 +cfcd208495d565ef66e7dff9f98764da +83878c91171338902e0fe0fb97a8c47a +eccbc87e4b5ce2fe28308fd9f2a7baf3 +b14a7b8059d9c055954c92674ce60032 +415290769594460e2e485922904f345d +cfcd208495d565ef66e7dff9f98764da +7b774effe4a349c6dd82ad4f4f21d34c +b14a7b8059d9c055954c92674ce60032 +8277e0910d750195b448797616e091ad +c4ca4238a0b923820dcc509a6f75849b +8277e0910d750195b448797616e091ad +7b8b965ad4bca0e41ab51de7b31363a1 +8f14e45fceea167a5a36dedd4bea2543 +b14a7b8059d9c055954c92674ce60032 +8277e0910d750195b448797616e091ad +cfcd208495d565ef66e7dff9f98764da +b14a7b8059d9c055954c92674ce60032 +8f14e45fceea167a5a36dedd4bea2543 +2510c39011c5be704182423e3a695e91 +a87ff679a2f3e71d9181a67b7542122c +8f14e45fceea167a5a36dedd4bea2543 +b14a7b8059d9c055954c92674ce60032 +92eb5ffee6ae2fec3ad71c777531578f +415290769594460e2e485922904f345d +b14a7b8059d9c055954c92674ce60032 +2510c39011c5be704182423e3a695e91 +a87ff679a2f3e71d9181a67b7542122c +7b8b965ad4bca0e41ab51de7b31363a1 +8277e0910d750195b448797616e091ad +cbb184dd8e05c9709e5dcaedaa0495cf +68b329da9893e34099c7d8ad5cb9c940 diff --git a/files/key.txt b/files/key.txt new file mode 100644 index 0000000..8d6fc41 --- /dev/null +++ b/files/key.txt @@ -0,0 +1,3 @@ +p = 196732205348849427366498732223276547339 +vlist = [186290890175539004453897585557650819247, 75402298316736094226532182518108134406, 125495142022496378270547998225256386407, 97774267687164931514953833940936099082, 101991197227908059637463567354647370660, 153833851791059142883915934225837717549, 57404874013093467650483424580890463792, 21385179362692238453302681296928238570, 73119997627509808412069264512026243174, 187307466063352771786747395191866088255, 99696708971915885525739992181010504930, 35400960589917132410614021764179554582, 165004028169785856134522269878963539096, 23921651712221317415895203722083962980, 101282552285744196401422074083408273639, 36527324251768098978171373433957274016] +ciphertext = [10804437392992369932709952388461430442, 176193785024128365464527424154073333243, 149270645998191619421663334736314262928, 84083279828403258970202482839973583723, 105542809657403162156368566034837560781, 170535468317794277192003839288646533914, 1709561989051017137832962458645802494, 30208132812353075834728747743616689590, 179552149608863037880916374596103803214, 146319871444551859531557724256502213689, 94266034977624098660397183255753485858, 59624105602644297614582310044425417646, 150207980679551836987813576795479579005, 47189940152625174480564945084004798024, 60923399917552243674613186036841652885, 56060552313063913798237738953734149992, 153365453785043472981157196787373992079, 97439800863356756323659264743487719966, 105572255903480949865247928773026019148, 47189940152625174480564945084004798024, 32547907449246015626932936731350157592, 97471053149217334376536988401195572824, 156999991149661497460742185971412527182, 97705058765750947378422286408948780428, 56123764944636237849915747435965967337, 180380146745295930385428990214293723238, 178014626944341285289827069179285260436, 99504741454750536629756505680249931430] diff --git a/files/premiumRSA.txt b/files/premiumRSA.txt new file mode 100644 index 0000000..b1903c7 --- /dev/null +++ b/files/premiumRSA.txt @@ -0,0 +1,4 @@ +n: 0x6c451672f63e8ece9c3bde03f4483ed3d0e286c908a55b78e2d235021d95f4ba403e6cbaf14d15928867bb14ac855d7fbdc6ebbf99f151ab49832e70fdd19e8d29dfc4c4ca7329564a1d4182c1b02ef040d7e347e13db768203319357abe07b1ecaf5d099d3326d2639e0a5991ded8cb46b825709e0942e67f770520c26306e5f44c8ca72313106ff0dd9a90294edaa7e0097997ff2425c266e1d52c6935799a8cf7ebf12f88edd1dc683ffd252facf7fb3e9bca0467ebbb1dbe731e7ff9b245a78ca50e8f810202eef4e44ea0c01443584baf727b13aa2ba8978445345981a264fb15709f7b71b9611e0ef3f0b69c6a3ba9f12ea703bf742b3aa3fc1522d8d20466223bdfe5c2cc726d66a1416bcb26cab2976a915e6646143500e012896f355dea77e10a7ec36aacd547f66bf543a7d7841acbcd4f54ec267ad185984ef74a995ad7c141fa34f46956bb3d66db54c5f8f84252800d968cb1bd47b30030f3c54c8d45b2ed9e1809ae7aad3367a7d3b11c80539282b3deaa8e23bda567e09b87f33a60666e9247cc38c0d09666346d54e18fcd58e987fcfc1796ad4bc0cb498d5e100d640abdbdfcb45039464fe023679ad70fce916a5adffcb58520a22bbf1870cfe5fcbf651a30ace03a716b2a283bfaa076330abd502e1460f2182e64b565c3c1b3a77312fe98e77dd1b8eca1f80fe11d6f2675f9ea90cc533abd507dc285L +e: 0x10001 +d: [??? 2045 REDACTED BITS ???]0xa5cb79ef8059485d8ee47a9da0ed128ea83febf509c009aafcada53d35b28a7b020f7308078257aae306052f2086fa89ad9c810a4fd9afe498825bdc16b3050e6e26c2ebcc49de22ab34c09e53a699f29252adc01c1a3c036f192105154d94858bbaf42bf1dfadc0cdf7338c5c9e9fdf9c508bdc9d260df831b781e5ce33b874999ebb0f07d72bbe6d0971a2164b660e1d3df4cb265e8edbc63ec56c2b05ce2eb32cf9808931a3968f1045c38ea022bfd750c3925073d1c5befec2268efe0bd047f2411f081aee2b71c443c5fd26fed6a75c9e31b89dfd93180215eaa51117bcf4be54f140fc39322c5deb32ae1ec164f4ae451a1391d7b612645c06cdf83541L +c: 0x36e7437512d71ca2a412fa411f7d376feaf02db7a6c301284ed9dc7dcffa8a658c24d199aa14d008ed72a88e36e2c5520caf95c88e5deb0d311d4fe2641732455bde7bc1c64a7274bcbe3825cd59b66727354fbbd01ab4ea39dbddd765395fa9c653556987f2f7efbdf86e741573338699e7fb7ad8405eeb02bc8fbca39a55870255328fcd44998bb5339805298575c0aef9bcfe791e8330bac92cd11620ad837ac2f7e9fcc4bf61da3c09cb8455e6d46890d5beb0b1af0bf989c10c6d83604de862bbb82fc697c2513488a9e3321d2590e9f5c0eb4a1882aa26c455da6e45f1fff42e233208ebd494365e89fb8e1ae89ea5b2f800e07b9e6b362bf4caaec11e81a8fc04377a7820f1392057f44bcbac03e9846b29989106e0dcf98559af1d5221aea01dd0d64667eb6615f7cce13e004249f2a0ccf065044450c1bd6661a986a53c983bf810d961f5c0a551fa66a08cf6cabf4e08291f1a08c7ee73c3b7c51a6d1620c9005530b8c1ce883eae095b1949eb4df159a35c7ce654cfc18527f08c8483d3630803bd688040a4b4bae86766f5535421bb8ec9c6e071b280f9e0db26c1cc90b56dba1cd09adeb520a996d6fd6ce135edb9e496986770cff49abc68473edc51ce0c79db915aae4ce1bb6fd42adb62b6b350cb84d37c52f30fe1e4943babf868bed50fa912ca431500ecb18643bb3df560450f673769818fdc48cdcdf6L diff --git a/files/sage.py b/files/sage.py new file mode 100644 index 0000000..8419636 --- /dev/null +++ b/files/sage.py @@ -0,0 +1,41 @@ +p = 196732205348849427366498732223276547339 +secret = REDACTED +def calc_root(num, mod, n): + f = GF(mod) + temp = f(num) + return temp.nth_root(n) + +def gen_v_list(primelist, p, secret): + a = [] + for prime in primelist: + a.append(calc_root(prime, p, secret)) + return a + +def decodeInt(i, primelist): + pl = sorted(primelist)[::-1] + out = '' + for j in pl: + if i%j == 0: + out += '1' + else: + out += '0' + return out + +def bin2asc(b): + return hex(int(b,2)).replace('0x','').decode('hex') + +primelist = [2,3,5,7,11,13,17,19,23,29,31,37,43,47,53,59] +message = REDACTED +chunks = [] +for i in range(0,len(message),2): + chunks += [message[i:i+2]] + +vlist = gen_v_list(primelist,p,secret) +print(vlist) +for chunk in chunks: + binarized = bin(int(chunk.encode('hex'),16)).replace('0b','').zfill(16)[::-1] #lsb first + enc = 1 + for bit in range(len(binarized)): + enc *= vlist[bit]**int(binarized[bit]) + enc = enc%p + print(enc) diff --git a/programming/match-me-300-points.md b/programming/match-me-300-points.md index f748aa1..b8e3ac2 100644 --- a/programming/match-me-300-points.md +++ b/programming/match-me-300-points.md @@ -14,6 +14,7 @@ MD5 hash of `(male_1,female_1)(male_2,female_2)...(male_n,female_n)`, where the Here are the lists of preferences:[male preferences](https://github.com/EasyCTF/easyctf-2017-problems/blob/master/match-me/male_prefs.txt), [female preferences](https://github.com/EasyCTF/easyctf-2017-problems/blob/master/match-me/female_prefs.txt). ### Solution +###### Writeup by Valar Dragon This was a fun programming problem! I had already seen the video [https://www.youtube.com/watch?v=Qcv1IqHWAzg](https://www.youtube.com/watch?v=Qcv1IqHWAzg) \(Stable Marriage Problem by Dr Emily Riehl and filmed by Brady Haran from Numberphile\) which happened to describe the algorithm to this exact same problem! I encourage watching it. @@ -55,7 +56,4 @@ MD5 of that \( Our flag\): ### External Writeups -* [https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Match%20me/README.md](https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Match me/README.md) - - - +* [https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Match%20me/README.md](https://github.com/HackThisCode/CTF-Writeups/blob/master/2017/EasyCTF/Match me/README.md) diff --git a/reverse-engineering/phunky-python-ii-115-points.md b/reverse-engineering/phunky-python-ii-115-points.md index 7edf630..f482364 100644 --- a/reverse-engineering/phunky-python-ii-115-points.md +++ b/reverse-engineering/phunky-python-ii-115-points.md @@ -3,7 +3,7 @@ We stumbled across another phunky Python file. Can you find the redacted value of jkx that makes [this program](https://github.com/ValarDragon/CTF-Writeups/blob/master/2017/EasyCTF/Phunky%20Python%20-%202/phunky2.py) print `True`? ### Solution - +###### Writeup by Valar Dragon So were given a super weird python 2 file, _phunky2.py_. To unravel this, lets start from the beggining. ``` python diff --git a/reverse-engineering/useless-python-50-points.md b/reverse-engineering/useless-python-50-points.md index 62e761a..f515706 100644 --- a/reverse-engineering/useless-python-50-points.md +++ b/reverse-engineering/useless-python-50-points.md @@ -3,6 +3,7 @@ Boredom took over, so I wrote this python file! I didn't want anyone to see it though because it doesn't actually run, so I used the coolest base-16 encoding to keep it secret. [python](https://github.com/EasyCTF/easyctf-2017-problems/blob/master/useless-python/useless.py) ### Solution +###### Writeup by Valar Dragon The first step is clear from the problem statement, unhexlify the file useless.py @@ -27,4 +28,4 @@ Quick 50 points. ### External Writeups -* [https://github.com/ValarDragon/CTF-Writeups/tree/master/2017/EasyCTF/Useless%20Python/README.md](https://github.com/ValarDragon/CTF-Writeups/tree/master/2017/EasyCTF/Useless%20Python/README.md) +* [https://github.com/HackThisCode/CTF-Writeups/tree/master/2017/EasyCTF/Useless%20Python/README.md](https://github.com/HackThisCode/CTF-Writeups/tree/master/2017/EasyCTF/Useless%20Python/README.md)