From a5707610d69f82a156d9c5e3d934bf9eae03c511 Mon Sep 17 00:00:00 2001 From: shim_ <> Date: Sun, 8 Jul 2018 16:03:06 +0200 Subject: [PATCH] python3 update --- .drone.yml | 9 + {modules => imports}/encryptedscreenshot.py | 36 +- {modules => imports}/processors.py | 0 {modules => imports}/seafapi.py | 4 +- make-modules.sh | 6 + modules/Crypto/Cipher/AES.py | 115 - modules/Crypto/Cipher/ARC2.py | 130 - modules/Crypto/Cipher/ARC4.py | 120 - modules/Crypto/Cipher/Blowfish.py | 121 - modules/Crypto/Cipher/CAST.py | 123 - modules/Crypto/Cipher/DES.py | 118 - modules/Crypto/Cipher/DES3.py | 133 - modules/Crypto/Cipher/PKCS1_OAEP.py | 255 - modules/Crypto/Cipher/PKCS1_v1_5.py | 226 - modules/Crypto/Cipher/XOR.py | 86 - modules/Crypto/Cipher/_AES.so | Bin 39688 -> 0 bytes modules/Crypto/Cipher/_ARC2.so | Bin 22952 -> 0 bytes modules/Crypto/Cipher/_ARC4.so | Bin 18248 -> 0 bytes modules/Crypto/Cipher/_Blowfish.so | Bin 35520 -> 0 bytes modules/Crypto/Cipher/_CAST.so | Bin 35456 -> 0 bytes modules/Crypto/Cipher/_DES.so | Bin 60440 -> 0 bytes modules/Crypto/Cipher/_DES3.so | Bin 60480 -> 0 bytes modules/Crypto/Cipher/_XOR.so | Bin 14184 -> 0 bytes modules/Crypto/Cipher/__init__.py | 83 - modules/Crypto/Cipher/blockalgo.py | 296 - modules/Crypto/Hash/CMAC.py | 343 - modules/Crypto/Hash/HMAC.py | 212 - modules/Crypto/Hash/MD2.py | 91 - modules/Crypto/Hash/MD4.py | 91 - modules/Crypto/Hash/MD5.py | 97 - modules/Crypto/Hash/RIPEMD.py | 94 - modules/Crypto/Hash/SHA.py | 98 - modules/Crypto/Hash/SHA1.py | 92 - modules/Crypto/Hash/SHA224.py | 95 - modules/Crypto/Hash/SHA256.py | 95 - modules/Crypto/Hash/SHA384.py | 96 - modules/Crypto/Hash/SHA512.py | 95 - modules/Crypto/Hash/_MD2.so | Bin 18584 -> 0 bytes modules/Crypto/Hash/_MD4.so | Bin 18648 -> 0 bytes modules/Crypto/Hash/_RIPEMD160.so | Bin 22952 -> 0 bytes modules/Crypto/Hash/_SHA224.so | Bin 18624 -> 0 bytes modules/Crypto/Hash/_SHA256.so | Bin 18624 -> 0 bytes modules/Crypto/Hash/_SHA384.so | Bin 18624 -> 0 bytes modules/Crypto/Hash/_SHA512.so | Bin 18624 -> 0 bytes modules/Crypto/Hash/__init__.py | 56 - modules/Crypto/Hash/hashalgo.py | 116 - modules/Crypto/IO/PEM.py | 163 - modules/Crypto/IO/PKCS8.py | 209 - modules/Crypto/IO/_PBES.py | 348 - modules/Crypto/IO/__init__.py | 32 - modules/Crypto/Protocol/AllOrNothing.py | 319 - modules/Crypto/Protocol/Chaffing.py | 245 - modules/Crypto/Protocol/KDF.py | 123 - modules/Crypto/Protocol/__init__.py | 41 - modules/Crypto/PublicKey/DSA.py | 379 -- modules/Crypto/PublicKey/ElGamal.py | 373 -- modules/Crypto/PublicKey/RSA.py | 719 --- modules/Crypto/PublicKey/_DSA.py | 115 - modules/Crypto/PublicKey/_RSA.py | 81 - modules/Crypto/PublicKey/__init__.py | 41 - modules/Crypto/PublicKey/_slowmath.py | 187 - modules/Crypto/PublicKey/pubkey.py | 240 - .../Random/Fortuna/FortunaAccumulator.py | 145 - .../Crypto/Random/Fortuna/FortunaGenerator.py | 132 - modules/Crypto/Random/Fortuna/SHAd256.py | 98 - modules/Crypto/Random/Fortuna/__init__.py | 0 modules/Crypto/Random/OSRNG/__init__.py | 40 - modules/Crypto/Random/OSRNG/fallback.py | 46 - modules/Crypto/Random/OSRNG/nt.py | 74 - modules/Crypto/Random/OSRNG/posix.py | 86 - modules/Crypto/Random/OSRNG/rng_base.py | 88 - modules/Crypto/Random/_UserFriendlyRNG.py | 215 - modules/Crypto/Random/__init__.py | 43 - modules/Crypto/Random/random.py | 142 - modules/Crypto/SelfTest/Cipher/__init__.py | 48 - modules/Crypto/SelfTest/Cipher/common.py | 399 -- modules/Crypto/SelfTest/Cipher/test_AES.py | 1433 ----- modules/Crypto/SelfTest/Cipher/test_ARC2.py | 124 - modules/Crypto/SelfTest/Cipher/test_ARC4.py | 81 - .../Crypto/SelfTest/Cipher/test_Blowfish.py | 113 - modules/Crypto/SelfTest/Cipher/test_CAST.py | 57 - modules/Crypto/SelfTest/Cipher/test_DES.py | 339 - modules/Crypto/SelfTest/Cipher/test_DES3.py | 333 - modules/Crypto/SelfTest/Cipher/test_XOR.py | 72 - .../Crypto/SelfTest/Cipher/test_pkcs1_15.py | 174 - .../Crypto/SelfTest/Cipher/test_pkcs1_oaep.py | 372 -- modules/Crypto/SelfTest/Hash/__init__.py | 52 - modules/Crypto/SelfTest/Hash/common.py | 197 - modules/Crypto/SelfTest/Hash/test_CMAC.py | 249 - modules/Crypto/SelfTest/Hash/test_HMAC.py | 223 - modules/Crypto/SelfTest/Hash/test_MD2.py | 64 - modules/Crypto/SelfTest/Hash/test_MD4.py | 64 - modules/Crypto/SelfTest/Hash/test_MD5.py | 64 - modules/Crypto/SelfTest/Hash/test_RIPEMD.py | 73 - .../Crypto/SelfTest/Hash/test_RIPEMD160.py | 73 - modules/Crypto/SelfTest/Hash/test_SHA.py | 64 - modules/Crypto/SelfTest/Hash/test_SHA1.py | 64 - modules/Crypto/SelfTest/Hash/test_SHA224.py | 65 - modules/Crypto/SelfTest/Hash/test_SHA256.py | 96 - modules/Crypto/SelfTest/Hash/test_SHA384.py | 63 - modules/Crypto/SelfTest/Hash/test_SHA512.py | 60 - modules/Crypto/SelfTest/IO/__init__.py | 34 - modules/Crypto/SelfTest/IO/test_PKCS8.py | 418 -- modules/Crypto/SelfTest/Protocol/__init__.py | 41 - .../SelfTest/Protocol/test_AllOrNothing.py | 76 - modules/Crypto/SelfTest/Protocol/test_KDF.py | 98 - .../Crypto/SelfTest/Protocol/test_chaffing.py | 74 - .../Crypto/SelfTest/Protocol/test_rfc1751.py | 62 - modules/Crypto/SelfTest/PublicKey/__init__.py | 44 - modules/Crypto/SelfTest/PublicKey/test_DSA.py | 244 - .../Crypto/SelfTest/PublicKey/test_ElGamal.py | 210 - modules/Crypto/SelfTest/PublicKey/test_RSA.py | 415 -- .../SelfTest/PublicKey/test_importKey.py | 345 - .../SelfTest/PublicKey/test_import_DSA.py | 389 -- .../SelfTest/PublicKey/test_import_RSA.py | 404 -- .../SelfTest/Random/Fortuna/__init__.py | 44 - .../Random/Fortuna/test_FortunaAccumulator.py | 189 - .../Random/Fortuna/test_FortunaGenerator.py | 83 - .../SelfTest/Random/Fortuna/test_SHAd256.py | 55 - .../Crypto/SelfTest/Random/OSRNG/__init__.py | 49 - .../SelfTest/Random/OSRNG/test_fallback.py | 48 - .../SelfTest/Random/OSRNG/test_generic.py | 48 - .../Crypto/SelfTest/Random/OSRNG/test_nt.py | 48 - .../SelfTest/Random/OSRNG/test_posix.py | 48 - .../SelfTest/Random/OSRNG/test_winrandom.py | 48 - modules/Crypto/SelfTest/Random/__init__.py | 42 - .../SelfTest/Random/test__UserFriendlyRNG.py | 171 - modules/Crypto/SelfTest/Random/test_random.py | 171 - .../SelfTest/Random/test_rpoolcompat.py | 55 - modules/Crypto/SelfTest/Signature/__init__.py | 40 - .../SelfTest/Signature/test_pkcs1_15.py | 219 - .../SelfTest/Signature/test_pkcs1_pss.py | 446 -- modules/Crypto/SelfTest/Util/__init__.py | 44 - modules/Crypto/SelfTest/Util/test_Counter.py | 165 - modules/Crypto/SelfTest/Util/test_Padding.py | 140 - modules/Crypto/SelfTest/Util/test_asn1.py | 293 - modules/Crypto/SelfTest/Util/test_number.py | 295 - .../Crypto/SelfTest/Util/test_winrandom.py | 48 - modules/Crypto/SelfTest/__init__.py | 92 - modules/Crypto/SelfTest/st_common.py | 62 - modules/Crypto/Signature/PKCS1_PSS.py | 355 -- modules/Crypto/Signature/PKCS1_v1_5.py | 236 - modules/Crypto/Signature/__init__.py | 31 - modules/Crypto/Util/Counter.py | 127 - modules/Crypto/Util/Padding.py | 103 - modules/Crypto/Util/RFC1751.py | 364 -- modules/Crypto/Util/__init__.py | 37 - modules/Crypto/Util/_counter.so | Bin 19000 -> 0 bytes modules/Crypto/Util/_number_new.py | 119 - modules/Crypto/Util/_time.py | 28 - modules/Crypto/Util/asn1.py | 286 - modules/Crypto/Util/number.py | 1456 ----- modules/Crypto/Util/py21compat.py | 84 - modules/Crypto/Util/py3compat.py | 107 - modules/Crypto/Util/randpool.py | 82 - modules/Crypto/Util/strxor.so | Bin 13008 -> 0 bytes modules/Crypto/Util/winrandom.py | 28 - modules/Crypto/__init__.py | 51 - modules/Crypto/pct_warnings.py | 60 - modules/__init__.py | 0 modules/_salsa20.so | Bin 55640 -> 0 bytes modules/_scrypt.so | Bin 174152 -> 0 bytes modules/bson/__init__.py | 69 - modules/bson/codec.py | 396 -- modules/bson/network.py | 67 - modules/bson/objectid.py | 295 - modules/bson/py3compat.py | 88 - modules/bson/tz_util.py | 52 - modules/crypto.py | 29 - modules/dateutil/__init__.py | 8 - modules/dateutil/_common.py | 43 - modules/dateutil/_version.py | 4 - modules/dateutil/easter.py | 89 - modules/dateutil/parser/__init__.py | 60 - modules/dateutil/parser/_parser.py | 1578 ----- modules/dateutil/parser/isoparser.py | 406 -- modules/dateutil/relativedelta.py | 590 -- modules/dateutil/rrule.py | 1672 ----- modules/dateutil/tz/__init__.py | 17 - modules/dateutil/tz/_common.py | 415 -- modules/dateutil/tz/_factories.py | 49 - modules/dateutil/tz/tz.py | 1785 ------ modules/dateutil/tz/win.py | 331 - modules/dateutil/tzwin.py | 2 - modules/dateutil/utils.py | 71 - modules/dateutil/zoneinfo/__init__.py | 167 - .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 139130 -> 0 bytes modules/dateutil/zoneinfo/rebuild.py | 53 - modules/requests/__init__.py | 83 - modules/requests/__init__.pyc | Bin 2778 -> 0 bytes modules/requests/adapters.py | 453 -- modules/requests/adapters.pyc | Bin 16920 -> 0 bytes modules/requests/api.py | 145 - modules/requests/api.pyc | Bin 6536 -> 0 bytes modules/requests/auth.py | 223 - modules/requests/auth.pyc | Bin 8787 -> 0 bytes modules/requests/cacert.pem | 5616 ----------------- modules/requests/certs.py | 25 - modules/requests/certs.pyc | Bin 959 -> 0 bytes modules/requests/compat.py | 62 - modules/requests/compat.pyc | Bin 1729 -> 0 bytes modules/requests/cookies.py | 485 -- modules/requests/cookies.pyc | Bin 23061 -> 0 bytes modules/requests/exceptions.py | 114 - modules/requests/exceptions.pyc | Bin 6772 -> 0 bytes modules/requests/hooks.py | 34 - modules/requests/hooks.pyc | Bin 1364 -> 0 bytes modules/requests/models.py | 848 --- modules/requests/models.pyc | Bin 27676 -> 0 bytes modules/requests/packages/README.rst | 11 - modules/requests/packages/__init__.py | 36 - modules/requests/packages/__init__.pyc | Bin 1671 -> 0 bytes modules/requests/packages/chardet/__init__.py | 32 - .../requests/packages/chardet/__init__.pyc | Bin 921 -> 0 bytes modules/requests/packages/chardet/big5freq.py | 925 --- .../requests/packages/chardet/big5prober.py | 42 - .../requests/packages/chardet/chardetect.py | 80 - .../packages/chardet/chardistribution.py | 231 - .../packages/chardet/charsetgroupprober.py | 106 - .../packages/chardet/charsetprober.py | 62 - .../packages/chardet/codingstatemachine.py | 61 - modules/requests/packages/chardet/compat.py | 34 - .../requests/packages/chardet/constants.py | 39 - .../requests/packages/chardet/cp949prober.py | 44 - .../requests/packages/chardet/escprober.py | 86 - modules/requests/packages/chardet/escsm.py | 242 - .../requests/packages/chardet/eucjpprober.py | 90 - .../requests/packages/chardet/euckrfreq.py | 596 -- .../requests/packages/chardet/euckrprober.py | 42 - .../requests/packages/chardet/euctwfreq.py | 428 -- .../requests/packages/chardet/euctwprober.py | 41 - .../requests/packages/chardet/gb2312freq.py | 472 -- .../requests/packages/chardet/gb2312prober.py | 41 - .../requests/packages/chardet/hebrewprober.py | 283 - modules/requests/packages/chardet/jisfreq.py | 569 -- modules/requests/packages/chardet/jpcntx.py | 227 - .../packages/chardet/langbulgarianmodel.py | 229 - .../packages/chardet/langcyrillicmodel.py | 329 - .../packages/chardet/langgreekmodel.py | 225 - .../packages/chardet/langhebrewmodel.py | 201 - .../packages/chardet/langhungarianmodel.py | 225 - .../packages/chardet/langthaimodel.py | 200 - .../requests/packages/chardet/latin1prober.py | 139 - .../packages/chardet/mbcharsetprober.py | 86 - .../packages/chardet/mbcsgroupprober.py | 54 - modules/requests/packages/chardet/mbcssm.py | 572 -- .../packages/chardet/sbcharsetprober.py | 120 - .../packages/chardet/sbcsgroupprober.py | 69 - .../requests/packages/chardet/sjisprober.py | 91 - .../packages/chardet/universaldetector.py | 170 - .../requests/packages/chardet/utf8prober.py | 76 - modules/requests/packages/urllib3/__init__.py | 71 - .../requests/packages/urllib3/__init__.pyc | Bin 3039 -> 0 bytes .../requests/packages/urllib3/_collections.py | 323 - .../packages/urllib3/_collections.pyc | Bin 15034 -> 0 bytes .../requests/packages/urllib3/connection.py | 277 - .../requests/packages/urllib3/connection.pyc | Bin 9246 -> 0 bytes .../packages/urllib3/connectionpool.py | 816 --- .../packages/urllib3/connectionpool.pyc | Bin 26797 -> 0 bytes .../packages/urllib3/contrib/__init__.py | 0 .../packages/urllib3/contrib/__init__.pyc | Bin 209 -> 0 bytes .../packages/urllib3/contrib/appengine.py | 222 - .../packages/urllib3/contrib/ntlmpool.py | 114 - .../packages/urllib3/contrib/pyopenssl.py | 309 - .../packages/urllib3/contrib/pyopenssl.pyc | Bin 11932 -> 0 bytes .../requests/packages/urllib3/exceptions.py | 193 - .../requests/packages/urllib3/exceptions.pyc | Bin 12698 -> 0 bytes modules/requests/packages/urllib3/fields.py | 177 - modules/requests/packages/urllib3/fields.pyc | Bin 7237 -> 0 bytes modules/requests/packages/urllib3/filepost.py | 93 - .../requests/packages/urllib3/filepost.pyc | Bin 3613 -> 0 bytes .../packages/urllib3/packages/__init__.py | 4 - .../packages/urllib3/packages/__init__.pyc | Bin 337 -> 0 bytes .../packages/urllib3/packages/ordered_dict.py | 259 - .../urllib3/packages/ordered_dict.pyc | Bin 11623 -> 0 bytes .../requests/packages/urllib3/packages/six.py | 385 -- .../packages/urllib3/packages/six.pyc | Bin 15857 -> 0 bytes .../packages/ssl_match_hostname/__init__.py | 13 - .../packages/ssl_match_hostname/__init__.pyc | Bin 572 -> 0 bytes .../ssl_match_hostname/_implementation.py | 105 - .../requests/packages/urllib3/poolmanager.py | 280 - .../requests/packages/urllib3/poolmanager.pyc | Bin 10923 -> 0 bytes modules/requests/packages/urllib3/request.py | 149 - modules/requests/packages/urllib3/request.pyc | Bin 6437 -> 0 bytes modules/requests/packages/urllib3/response.py | 485 -- .../requests/packages/urllib3/response.pyc | Bin 17851 -> 0 bytes .../packages/urllib3/util/__init__.py | 24 - .../packages/urllib3/util/__init__.pyc | Bin 849 -> 0 bytes .../packages/urllib3/util/connection.py | 100 - .../packages/urllib3/util/connection.pyc | Bin 3264 -> 0 bytes .../requests/packages/urllib3/util/request.py | 71 - .../packages/urllib3/util/request.pyc | Bin 2264 -> 0 bytes .../packages/urllib3/util/response.py | 73 - .../packages/urllib3/util/response.pyc | Bin 2375 -> 0 bytes .../requests/packages/urllib3/util/retry.py | 285 - .../requests/packages/urllib3/util/retry.pyc | Bin 10545 -> 0 bytes .../requests/packages/urllib3/util/ssl_.py | 286 - .../requests/packages/urllib3/util/ssl_.pyc | Bin 9639 -> 0 bytes .../requests/packages/urllib3/util/timeout.py | 240 - .../packages/urllib3/util/timeout.pyc | Bin 10289 -> 0 bytes modules/requests/packages/urllib3/util/url.py | 214 - .../requests/packages/urllib3/util/url.pyc | Bin 6564 -> 0 bytes modules/requests/sessions.py | 680 -- modules/requests/sessions.pyc | Bin 21050 -> 0 bytes modules/requests/status_codes.py | 90 - modules/requests/status_codes.pyc | Bin 4761 -> 0 bytes modules/requests/structures.py | 104 - modules/requests/structures.pyc | Bin 5974 -> 0 bytes modules/requests/utils.py | 717 --- modules/requests/utils.pyc | Bin 22694 -> 0 bytes modules/salsa20.py | 133 - modules/scrypt/__init__.py | 1 - modules/scrypt/scrypt.py | 232 - modules/six.py | 891 --- requirements.txt | 5 + 315 files changed, 40 insertions(+), 55034 deletions(-) create mode 100644 .drone.yml rename {modules => imports}/encryptedscreenshot.py (93%) rename {modules => imports}/processors.py (100%) rename {modules => imports}/seafapi.py (97%) create mode 100755 make-modules.sh delete mode 100644 modules/Crypto/Cipher/AES.py delete mode 100644 modules/Crypto/Cipher/ARC2.py delete mode 100644 modules/Crypto/Cipher/ARC4.py delete mode 100644 modules/Crypto/Cipher/Blowfish.py delete mode 100644 modules/Crypto/Cipher/CAST.py delete mode 100644 modules/Crypto/Cipher/DES.py delete mode 100644 modules/Crypto/Cipher/DES3.py delete mode 100644 modules/Crypto/Cipher/PKCS1_OAEP.py delete mode 100644 modules/Crypto/Cipher/PKCS1_v1_5.py delete mode 100644 modules/Crypto/Cipher/XOR.py delete mode 100755 modules/Crypto/Cipher/_AES.so delete mode 100755 modules/Crypto/Cipher/_ARC2.so delete mode 100755 modules/Crypto/Cipher/_ARC4.so delete mode 100755 modules/Crypto/Cipher/_Blowfish.so delete mode 100755 modules/Crypto/Cipher/_CAST.so delete mode 100755 modules/Crypto/Cipher/_DES.so delete mode 100755 modules/Crypto/Cipher/_DES3.so delete mode 100755 modules/Crypto/Cipher/_XOR.so delete mode 100644 modules/Crypto/Cipher/__init__.py delete mode 100644 modules/Crypto/Cipher/blockalgo.py delete mode 100644 modules/Crypto/Hash/CMAC.py delete mode 100644 modules/Crypto/Hash/HMAC.py delete mode 100644 modules/Crypto/Hash/MD2.py delete mode 100644 modules/Crypto/Hash/MD4.py delete mode 100644 modules/Crypto/Hash/MD5.py delete mode 100644 modules/Crypto/Hash/RIPEMD.py delete mode 100644 modules/Crypto/Hash/SHA.py delete mode 100644 modules/Crypto/Hash/SHA1.py delete mode 100644 modules/Crypto/Hash/SHA224.py delete mode 100644 modules/Crypto/Hash/SHA256.py delete mode 100644 modules/Crypto/Hash/SHA384.py delete mode 100644 modules/Crypto/Hash/SHA512.py delete mode 100755 modules/Crypto/Hash/_MD2.so delete mode 100755 modules/Crypto/Hash/_MD4.so delete mode 100755 modules/Crypto/Hash/_RIPEMD160.so delete mode 100755 modules/Crypto/Hash/_SHA224.so delete mode 100755 modules/Crypto/Hash/_SHA256.so delete mode 100755 modules/Crypto/Hash/_SHA384.so delete mode 100755 modules/Crypto/Hash/_SHA512.so delete mode 100644 modules/Crypto/Hash/__init__.py delete mode 100644 modules/Crypto/Hash/hashalgo.py delete mode 100644 modules/Crypto/IO/PEM.py delete mode 100644 modules/Crypto/IO/PKCS8.py delete mode 100644 modules/Crypto/IO/_PBES.py delete mode 100644 modules/Crypto/IO/__init__.py delete mode 100644 modules/Crypto/Protocol/AllOrNothing.py delete mode 100644 modules/Crypto/Protocol/Chaffing.py delete mode 100644 modules/Crypto/Protocol/KDF.py delete mode 100644 modules/Crypto/Protocol/__init__.py delete mode 100644 modules/Crypto/PublicKey/DSA.py delete mode 100644 modules/Crypto/PublicKey/ElGamal.py delete mode 100644 modules/Crypto/PublicKey/RSA.py delete mode 100644 modules/Crypto/PublicKey/_DSA.py delete mode 100644 modules/Crypto/PublicKey/_RSA.py delete mode 100644 modules/Crypto/PublicKey/__init__.py delete mode 100644 modules/Crypto/PublicKey/_slowmath.py delete mode 100644 modules/Crypto/PublicKey/pubkey.py delete mode 100644 modules/Crypto/Random/Fortuna/FortunaAccumulator.py delete mode 100644 modules/Crypto/Random/Fortuna/FortunaGenerator.py delete mode 100644 modules/Crypto/Random/Fortuna/SHAd256.py delete mode 100644 modules/Crypto/Random/Fortuna/__init__.py delete mode 100644 modules/Crypto/Random/OSRNG/__init__.py delete mode 100644 modules/Crypto/Random/OSRNG/fallback.py delete mode 100644 modules/Crypto/Random/OSRNG/nt.py delete mode 100644 modules/Crypto/Random/OSRNG/posix.py delete mode 100644 modules/Crypto/Random/OSRNG/rng_base.py delete mode 100644 modules/Crypto/Random/_UserFriendlyRNG.py delete mode 100644 modules/Crypto/Random/__init__.py delete mode 100644 modules/Crypto/Random/random.py delete mode 100644 modules/Crypto/SelfTest/Cipher/__init__.py delete mode 100644 modules/Crypto/SelfTest/Cipher/common.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_AES.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_ARC2.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_ARC4.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_Blowfish.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_CAST.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_DES.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_DES3.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_XOR.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_pkcs1_15.py delete mode 100644 modules/Crypto/SelfTest/Cipher/test_pkcs1_oaep.py delete mode 100644 modules/Crypto/SelfTest/Hash/__init__.py delete mode 100644 modules/Crypto/SelfTest/Hash/common.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_CMAC.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_HMAC.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_MD2.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_MD4.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_MD5.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_RIPEMD.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_RIPEMD160.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_SHA.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_SHA1.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_SHA224.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_SHA256.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_SHA384.py delete mode 100644 modules/Crypto/SelfTest/Hash/test_SHA512.py delete mode 100644 modules/Crypto/SelfTest/IO/__init__.py delete mode 100644 modules/Crypto/SelfTest/IO/test_PKCS8.py delete mode 100644 modules/Crypto/SelfTest/Protocol/__init__.py delete mode 100644 modules/Crypto/SelfTest/Protocol/test_AllOrNothing.py delete mode 100644 modules/Crypto/SelfTest/Protocol/test_KDF.py delete mode 100644 modules/Crypto/SelfTest/Protocol/test_chaffing.py delete mode 100644 modules/Crypto/SelfTest/Protocol/test_rfc1751.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/__init__.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/test_DSA.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/test_ElGamal.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/test_RSA.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/test_importKey.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/test_import_DSA.py delete mode 100644 modules/Crypto/SelfTest/PublicKey/test_import_RSA.py delete mode 100644 modules/Crypto/SelfTest/Random/Fortuna/__init__.py delete mode 100644 modules/Crypto/SelfTest/Random/Fortuna/test_FortunaAccumulator.py delete mode 100644 modules/Crypto/SelfTest/Random/Fortuna/test_FortunaGenerator.py delete mode 100644 modules/Crypto/SelfTest/Random/Fortuna/test_SHAd256.py delete mode 100644 modules/Crypto/SelfTest/Random/OSRNG/__init__.py delete mode 100644 modules/Crypto/SelfTest/Random/OSRNG/test_fallback.py delete mode 100644 modules/Crypto/SelfTest/Random/OSRNG/test_generic.py delete mode 100644 modules/Crypto/SelfTest/Random/OSRNG/test_nt.py delete mode 100644 modules/Crypto/SelfTest/Random/OSRNG/test_posix.py delete mode 100644 modules/Crypto/SelfTest/Random/OSRNG/test_winrandom.py delete mode 100644 modules/Crypto/SelfTest/Random/__init__.py delete mode 100644 modules/Crypto/SelfTest/Random/test__UserFriendlyRNG.py delete mode 100644 modules/Crypto/SelfTest/Random/test_random.py delete mode 100644 modules/Crypto/SelfTest/Random/test_rpoolcompat.py delete mode 100644 modules/Crypto/SelfTest/Signature/__init__.py delete mode 100644 modules/Crypto/SelfTest/Signature/test_pkcs1_15.py delete mode 100644 modules/Crypto/SelfTest/Signature/test_pkcs1_pss.py delete mode 100644 modules/Crypto/SelfTest/Util/__init__.py delete mode 100644 modules/Crypto/SelfTest/Util/test_Counter.py delete mode 100644 modules/Crypto/SelfTest/Util/test_Padding.py delete mode 100644 modules/Crypto/SelfTest/Util/test_asn1.py delete mode 100644 modules/Crypto/SelfTest/Util/test_number.py delete mode 100644 modules/Crypto/SelfTest/Util/test_winrandom.py delete mode 100644 modules/Crypto/SelfTest/__init__.py delete mode 100644 modules/Crypto/SelfTest/st_common.py delete mode 100644 modules/Crypto/Signature/PKCS1_PSS.py delete mode 100644 modules/Crypto/Signature/PKCS1_v1_5.py delete mode 100644 modules/Crypto/Signature/__init__.py delete mode 100644 modules/Crypto/Util/Counter.py delete mode 100644 modules/Crypto/Util/Padding.py delete mode 100644 modules/Crypto/Util/RFC1751.py delete mode 100644 modules/Crypto/Util/__init__.py delete mode 100755 modules/Crypto/Util/_counter.so delete mode 100644 modules/Crypto/Util/_number_new.py delete mode 100644 modules/Crypto/Util/_time.py delete mode 100644 modules/Crypto/Util/asn1.py delete mode 100644 modules/Crypto/Util/number.py delete mode 100644 modules/Crypto/Util/py21compat.py delete mode 100644 modules/Crypto/Util/py3compat.py delete mode 100644 modules/Crypto/Util/randpool.py delete mode 100755 modules/Crypto/Util/strxor.so delete mode 100644 modules/Crypto/Util/winrandom.py delete mode 100644 modules/Crypto/__init__.py delete mode 100644 modules/Crypto/pct_warnings.py delete mode 100644 modules/__init__.py delete mode 100755 modules/_salsa20.so delete mode 100755 modules/_scrypt.so delete mode 100644 modules/bson/__init__.py delete mode 100644 modules/bson/codec.py delete mode 100644 modules/bson/network.py delete mode 100644 modules/bson/objectid.py delete mode 100644 modules/bson/py3compat.py delete mode 100644 modules/bson/tz_util.py delete mode 100644 modules/crypto.py delete mode 100644 modules/dateutil/__init__.py delete mode 100644 modules/dateutil/_common.py delete mode 100644 modules/dateutil/_version.py delete mode 100644 modules/dateutil/easter.py delete mode 100644 modules/dateutil/parser/__init__.py delete mode 100644 modules/dateutil/parser/_parser.py delete mode 100644 modules/dateutil/parser/isoparser.py delete mode 100644 modules/dateutil/relativedelta.py delete mode 100644 modules/dateutil/rrule.py delete mode 100644 modules/dateutil/tz/__init__.py delete mode 100644 modules/dateutil/tz/_common.py delete mode 100644 modules/dateutil/tz/_factories.py delete mode 100644 modules/dateutil/tz/tz.py delete mode 100644 modules/dateutil/tz/win.py delete mode 100644 modules/dateutil/tzwin.py delete mode 100644 modules/dateutil/utils.py delete mode 100644 modules/dateutil/zoneinfo/__init__.py delete mode 100644 modules/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz delete mode 100644 modules/dateutil/zoneinfo/rebuild.py delete mode 100644 modules/requests/__init__.py delete mode 100644 modules/requests/__init__.pyc delete mode 100644 modules/requests/adapters.py delete mode 100644 modules/requests/adapters.pyc delete mode 100644 modules/requests/api.py delete mode 100644 modules/requests/api.pyc delete mode 100644 modules/requests/auth.py delete mode 100644 modules/requests/auth.pyc delete mode 100644 modules/requests/cacert.pem delete mode 100644 modules/requests/certs.py delete mode 100644 modules/requests/certs.pyc delete mode 100644 modules/requests/compat.py delete mode 100644 modules/requests/compat.pyc delete mode 100644 modules/requests/cookies.py delete mode 100644 modules/requests/cookies.pyc delete mode 100644 modules/requests/exceptions.py delete mode 100644 modules/requests/exceptions.pyc delete mode 100644 modules/requests/hooks.py delete mode 100644 modules/requests/hooks.pyc delete mode 100644 modules/requests/models.py delete mode 100644 modules/requests/models.pyc delete mode 100644 modules/requests/packages/README.rst delete mode 100644 modules/requests/packages/__init__.py delete mode 100644 modules/requests/packages/__init__.pyc delete mode 100644 modules/requests/packages/chardet/__init__.py delete mode 100644 modules/requests/packages/chardet/__init__.pyc delete mode 100644 modules/requests/packages/chardet/big5freq.py delete mode 100644 modules/requests/packages/chardet/big5prober.py delete mode 100644 modules/requests/packages/chardet/chardetect.py delete mode 100644 modules/requests/packages/chardet/chardistribution.py delete mode 100644 modules/requests/packages/chardet/charsetgroupprober.py delete mode 100644 modules/requests/packages/chardet/charsetprober.py delete mode 100644 modules/requests/packages/chardet/codingstatemachine.py delete mode 100644 modules/requests/packages/chardet/compat.py delete mode 100644 modules/requests/packages/chardet/constants.py delete mode 100644 modules/requests/packages/chardet/cp949prober.py delete mode 100644 modules/requests/packages/chardet/escprober.py delete mode 100644 modules/requests/packages/chardet/escsm.py delete mode 100644 modules/requests/packages/chardet/eucjpprober.py delete mode 100644 modules/requests/packages/chardet/euckrfreq.py delete mode 100644 modules/requests/packages/chardet/euckrprober.py delete mode 100644 modules/requests/packages/chardet/euctwfreq.py delete mode 100644 modules/requests/packages/chardet/euctwprober.py delete mode 100644 modules/requests/packages/chardet/gb2312freq.py delete mode 100644 modules/requests/packages/chardet/gb2312prober.py delete mode 100644 modules/requests/packages/chardet/hebrewprober.py delete mode 100644 modules/requests/packages/chardet/jisfreq.py delete mode 100644 modules/requests/packages/chardet/jpcntx.py delete mode 100644 modules/requests/packages/chardet/langbulgarianmodel.py delete mode 100644 modules/requests/packages/chardet/langcyrillicmodel.py delete mode 100644 modules/requests/packages/chardet/langgreekmodel.py delete mode 100644 modules/requests/packages/chardet/langhebrewmodel.py delete mode 100644 modules/requests/packages/chardet/langhungarianmodel.py delete mode 100644 modules/requests/packages/chardet/langthaimodel.py delete mode 100644 modules/requests/packages/chardet/latin1prober.py delete mode 100644 modules/requests/packages/chardet/mbcharsetprober.py delete mode 100644 modules/requests/packages/chardet/mbcsgroupprober.py delete mode 100644 modules/requests/packages/chardet/mbcssm.py delete mode 100644 modules/requests/packages/chardet/sbcharsetprober.py delete mode 100644 modules/requests/packages/chardet/sbcsgroupprober.py delete mode 100644 modules/requests/packages/chardet/sjisprober.py delete mode 100644 modules/requests/packages/chardet/universaldetector.py delete mode 100644 modules/requests/packages/chardet/utf8prober.py delete mode 100644 modules/requests/packages/urllib3/__init__.py delete mode 100644 modules/requests/packages/urllib3/__init__.pyc delete mode 100644 modules/requests/packages/urllib3/_collections.py delete mode 100644 modules/requests/packages/urllib3/_collections.pyc delete mode 100644 modules/requests/packages/urllib3/connection.py delete mode 100644 modules/requests/packages/urllib3/connection.pyc delete mode 100644 modules/requests/packages/urllib3/connectionpool.py delete mode 100644 modules/requests/packages/urllib3/connectionpool.pyc delete mode 100644 modules/requests/packages/urllib3/contrib/__init__.py delete mode 100644 modules/requests/packages/urllib3/contrib/__init__.pyc delete mode 100644 modules/requests/packages/urllib3/contrib/appengine.py delete mode 100644 modules/requests/packages/urllib3/contrib/ntlmpool.py delete mode 100644 modules/requests/packages/urllib3/contrib/pyopenssl.py delete mode 100644 modules/requests/packages/urllib3/contrib/pyopenssl.pyc delete mode 100644 modules/requests/packages/urllib3/exceptions.py delete mode 100644 modules/requests/packages/urllib3/exceptions.pyc delete mode 100644 modules/requests/packages/urllib3/fields.py delete mode 100644 modules/requests/packages/urllib3/fields.pyc delete mode 100644 modules/requests/packages/urllib3/filepost.py delete mode 100644 modules/requests/packages/urllib3/filepost.pyc delete mode 100644 modules/requests/packages/urllib3/packages/__init__.py delete mode 100644 modules/requests/packages/urllib3/packages/__init__.pyc delete mode 100644 modules/requests/packages/urllib3/packages/ordered_dict.py delete mode 100644 modules/requests/packages/urllib3/packages/ordered_dict.pyc delete mode 100644 modules/requests/packages/urllib3/packages/six.py delete mode 100644 modules/requests/packages/urllib3/packages/six.pyc delete mode 100644 modules/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 modules/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc delete mode 100644 modules/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 modules/requests/packages/urllib3/poolmanager.py delete mode 100644 modules/requests/packages/urllib3/poolmanager.pyc delete mode 100644 modules/requests/packages/urllib3/request.py delete mode 100644 modules/requests/packages/urllib3/request.pyc delete mode 100644 modules/requests/packages/urllib3/response.py delete mode 100644 modules/requests/packages/urllib3/response.pyc delete mode 100644 modules/requests/packages/urllib3/util/__init__.py delete mode 100644 modules/requests/packages/urllib3/util/__init__.pyc delete mode 100644 modules/requests/packages/urllib3/util/connection.py delete mode 100644 modules/requests/packages/urllib3/util/connection.pyc delete mode 100644 modules/requests/packages/urllib3/util/request.py delete mode 100644 modules/requests/packages/urllib3/util/request.pyc delete mode 100644 modules/requests/packages/urllib3/util/response.py delete mode 100644 modules/requests/packages/urllib3/util/response.pyc delete mode 100644 modules/requests/packages/urllib3/util/retry.py delete mode 100644 modules/requests/packages/urllib3/util/retry.pyc delete mode 100644 modules/requests/packages/urllib3/util/ssl_.py delete mode 100644 modules/requests/packages/urllib3/util/ssl_.pyc delete mode 100644 modules/requests/packages/urllib3/util/timeout.py delete mode 100644 modules/requests/packages/urllib3/util/timeout.pyc delete mode 100644 modules/requests/packages/urllib3/util/url.py delete mode 100644 modules/requests/packages/urllib3/util/url.pyc delete mode 100644 modules/requests/sessions.py delete mode 100644 modules/requests/sessions.pyc delete mode 100644 modules/requests/status_codes.py delete mode 100644 modules/requests/status_codes.pyc delete mode 100644 modules/requests/structures.py delete mode 100644 modules/requests/structures.pyc delete mode 100644 modules/requests/utils.py delete mode 100644 modules/requests/utils.pyc delete mode 100644 modules/salsa20.py delete mode 100644 modules/scrypt/__init__.py delete mode 100644 modules/scrypt/scrypt.py delete mode 100644 modules/six.py create mode 100644 requirements.txt diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..0e8b3c3 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,9 @@ +pipeline: + modules: + image: python:3.6 + commands: + - ./make-modules.sh + package: + image: kramos/alpine-zip + commands: + - zip seafile.zip -r modules icon.png main.py metadata.xml settings.ui diff --git a/modules/encryptedscreenshot.py b/imports/encryptedscreenshot.py similarity index 93% rename from modules/encryptedscreenshot.py rename to imports/encryptedscreenshot.py index 825acc8..55f2965 100644 --- a/modules/encryptedscreenshot.py +++ b/imports/encryptedscreenshot.py @@ -15,10 +15,10 @@ class EncryptedScreenshot: random.choice("1234567890ABCDEFGHIJKLMNOPQRSTUWVXYZabcdefghijklmnopqrstuwvxyz") for _ in range(len)) self.password = rand(16) - print "Passphrase %s" % str(bytearray(self.passphrase())).encode("hex") - self.id = id - if id is None: - self.id = rand(8) + print("Passphrase %s" % str(bytearray(self.passphrase())).encode("hex")) + self.id = id + if id is None: + self.id = rand(8) self.metadata_encryption = True self.metadata = metadata self.signer = signer @@ -32,7 +32,7 @@ class EncryptedScreenshot: def passphrase(self): # new ScryptParameters(64, 8, 1,32, new Uint8List.fromList(new List())) - print "Password units: %s" % (map(ord, self.password.encode("utf-8")),) + print("Password units: %s" % (map(ord, self.password.encode("utf-8")),)) sha = hashlib.sha256() sha.update(self.password) return sha.digest() # scrypt.hash(self.password.encode("utf-8"), '', 64, 8, 1, 32) @@ -50,12 +50,12 @@ class EncryptedScreenshot: encrypted_metadata = iv + str(bytearray(encrypted_metadata)) - print "Metadata: %s" % str(encrypted_metadata).encode("base64").replace("\n", "") - print "%s %s" % (str(encrypted_metadata[:16]).encode("hex"), str(encrypted_metadata[16:]).encode("hex")) - print "Unencrypted: %s" % (unencrypted_metadata.encode("hex")) - print "Password %s" % self.password + print("Metadata: %s" % str(encrypted_metadata).encode("base64").replace("\n", "")) + print("%s %s" % (str(encrypted_metadata[:16]).encode("hex"), str(encrypted_metadata[16:]).encode("hex"))) + print("Unencrypted: %s" % (unencrypted_metadata.encode("hex"))) + print("Password %s" % self.password) - print bson.loads(unencrypted_metadata) + print(bson.loads(unencrypted_metadata)) fields = { "image": encrypted_image, @@ -74,7 +74,7 @@ class EncryptedScreenshot: def encryptor(self,length=0): iv = os.urandom(16) ctr = Counter.new(128, initial_value=long(iv.encode("hex"), 16)) - print "IV: %s" % iv.encode("hex") + print("IV: %s" % iv.encode("hex")) cipher = AES.new(self.passphrase(), AES.MODE_CTR, counter=ctr) #salsa @@ -180,20 +180,20 @@ if __name__ == "__main__": signer=Signer.default(), password_encryptor=EncryptedPassword(RSA.importKey(publicKey.decode("base64")),"PUBLIC")) fixed_id = encrypted.id #"W9u9Zm0u" - print len(encrypted.passphrase()) + print(len(encrypted.passphrase())) out = open("/home/marvin/Dokumente/IdeaProjects/EncryptedScreencloud/Frontend/WebApp/web/data/" + fixed_id, 'wb') assembled = encrypted.assemble("5x5red.png") out.write(assembled) b = bson.loads(assembled) del b["image"] - print b - #print assembled.encode("base64").replace("\n","") - print "http://localhost:8080/#%s%s" % (fixed_id, encrypted.password) + print(b) + #print(assembled.encode("base64").replace("\n","") + print("http://localhost:8080/#%s%s" % (fixed_id, encrypted.password)) caesar_key = reduce(lambda sum,charcode: sum+charcode, map(ord,list(fixed_id))) caesar_plaintext = map(ord,encrypted.password) caesar_ciphertext = Caesar().encrypt(caesar_plaintext,caesar_key) assert caesar_plaintext == Caesar().decrypt(caesar_ciphertext,caesar_key) - print "caesar_key=%s %s -> %s" % (caesar_key,encrypted.password,''.join(map(chr,caesar_ciphertext))) - print "http://localhost:8080/#%s%sC" % (fixed_id, encrypted.caesar_encrypted_password()) - print "http://localhost:8080/#%s" % (fixed_id, ) + print("caesar_key=%s %s -> %s" % (caesar_key,encrypted.password,''.join(map(chr,caesar_ciphertext)))) + print("http://localhost:8080/#%s%sC" % (fixed_id, encrypted.caesar_encrypted_password())) + print("http://localhost:8080/#%s" % (fixed_id, )) out.close() diff --git a/modules/processors.py b/imports/processors.py similarity index 100% rename from modules/processors.py rename to imports/processors.py diff --git a/modules/seafapi.py b/imports/seafapi.py similarity index 97% rename from modules/seafapi.py rename to imports/seafapi.py index 621c3c1..b9dd3ab 100644 --- a/modules/seafapi.py +++ b/imports/seafapi.py @@ -24,7 +24,7 @@ class SeafileClient: req=requests.post("%s/auth-token/" % self.api_endpoint(), data = {'username': user, 'password': passw }) json = req.json() if "non_field_errors" in json: - print json["non_field_errors"] + print(json["non_field_errors"]) return False return SeafileToken(user,json["token"]) except: @@ -58,7 +58,7 @@ class SeafileLibrary: def upload(self,file,file_name,directory,link=None): def obtain_link(): #curl -H "Authorization: Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd" https://cloud.seafile.com/api2/repos/99b758e6-91ab-4265-b705-925367374cf0/upload-link/ - print "%s/upload-link" % self.api_endpoint() + print("%s/upload-link" % self.api_endpoint()) quoted = requests.get("%s/upload-link" % self.api_endpoint(), headers = {'Authorization': "Token %s" % self.client.token.token,}).text return quoted[1:-1] diff --git a/make-modules.sh b/make-modules.sh new file mode 100755 index 0000000..ea0593b --- /dev/null +++ b/make-modules.sh @@ -0,0 +1,6 @@ +rm -rf modules +mkdir modules +pip3 install --install-option="--prefix=$PWD" -r requirements.txt +mv lib/python3.6/site-packages/* modules/ +cp imports/* -r modules/ + diff --git a/modules/Crypto/Cipher/AES.py b/modules/Crypto/Cipher/AES.py deleted file mode 100644 index 14f68d8..0000000 --- a/modules/Crypto/Cipher/AES.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/AES.py : AES -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""AES symmetric cipher - -AES `(Advanced Encryption Standard)`__ is a symmetric block cipher standardized -by NIST_ . It has a fixed data block size of 16 bytes. -Its keys can be 128, 192, or 256 bits long. - -AES is very fast and secure, and it is the de facto standard for symmetric -encryption. - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import AES - >>> from Crypto import Random - >>> - >>> key = b'Sixteen byte key' - >>> iv = Random.new().read(AES.block_size) - >>> cipher = AES.new(key, AES.MODE_CFB, iv) - >>> msg = iv + cipher.encrypt(b'Attack at dawn') - -.. __: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard -.. _NIST: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import blockalgo -from Crypto.Cipher import _AES - -class AESCipher (blockalgo.BlockAlgo): - """AES cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize an AES cipher object - - See also `new()` at the module level.""" - blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs) - -def new(key, *args, **kwargs): - """Create a new AES cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - It must be 16 (*AES-128*), 24 (*AES-192*), or 32 (*AES-256*) bytes long. - :Keywords: - mode : a *MODE_** constant - The chaining mode to use for encryption or decryption. - Default is `MODE_ECB`. - IV : byte string - The initialization vector to use for encryption or decryption. - - It is ignored for `MODE_ECB` and `MODE_CTR`. - - For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption - and `block_size` +2 bytes for decryption (in the latter case, it is - actually the *encrypted* IV which was prefixed to the ciphertext). - It is mandatory. - - For all other modes, it must be `block_size` bytes longs. It is optional and - when not present it will be given a default value of all zeroes. - counter : callable - (*Only* `MODE_CTR`). A stateful function that returns the next - *counter block*, which is a byte string of `block_size` bytes. - For better performance, use `Crypto.Util.Counter`. - segment_size : integer - (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext - are segmented in. - It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8. - - :Return: an `AESCipher` object - """ - return AESCipher(key, *args, **kwargs) - -#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`. -MODE_ECB = 1 -#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`. -MODE_CBC = 2 -#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`. -MODE_CFB = 3 -#: This mode should not be used. -MODE_PGP = 4 -#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`. -MODE_OFB = 5 -#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`. -MODE_CTR = 6 -#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`. -MODE_OPENPGP = 7 -#: Size of a data block (in bytes) -block_size = 16 -#: Size of a key (in bytes) -key_size = ( 16, 24, 32 ) - diff --git a/modules/Crypto/Cipher/ARC2.py b/modules/Crypto/Cipher/ARC2.py deleted file mode 100644 index 7b5f43a..0000000 --- a/modules/Crypto/Cipher/ARC2.py +++ /dev/null @@ -1,130 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/ARC2.py : ARC2.py -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""RC2 symmetric cipher - -RC2_ (Rivest's Cipher version 2) is a symmetric block cipher designed -by Ron Rivest in 1987. The cipher started as a proprietary design, -that was reverse engineered and anonymously posted on Usenet in 1996. -For this reason, the algorithm was first called *Alleged* RC2 (ARC2), -since the company that owned RC2 (RSA Data Inc.) did not confirm whether -the details leaked into public domain were really correct. - -The company eventually published its full specification in RFC2268_. - -RC2 has a fixed data block size of 8 bytes. Length of its keys can vary from -8 to 128 bits. One particular property of RC2 is that the actual -cryptographic strength of the key (*effective key length*) can be reduced -via a parameter. - -Even though RC2 is not cryptographically broken, it has not been analyzed as -thoroughly as AES, which is also faster than RC2. - -New designs should not use RC2. - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import ARC2 - >>> from Crypto import Random - >>> - >>> key = b'Sixteen byte key' - >>> iv = Random.new().read(ARC2.block_size) - >>> cipher = ARC2.new(key, ARC2.MODE_CFB, iv) - >>> msg = iv + cipher.encrypt(b'Attack at dawn') - -.. _RC2: http://en.wikipedia.org/wiki/RC2 -.. _RFC2268: http://tools.ietf.org/html/rfc2268 - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import blockalgo -from Crypto.Cipher import _ARC2 - -class RC2Cipher (blockalgo.BlockAlgo): - """RC2 cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize an ARC2 cipher object - - See also `new()` at the module level.""" - blockalgo.BlockAlgo.__init__(self, _ARC2, key, *args, **kwargs) - -def new(key, *args, **kwargs): - """Create a new RC2 cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - Its length can vary from 1 to 128 bytes. - :Keywords: - mode : a *MODE_** constant - The chaining mode to use for encryption or decryption. - Default is `MODE_ECB`. - IV : byte string - The initialization vector to use for encryption or decryption. - - It is ignored for `MODE_ECB` and `MODE_CTR`. - - For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption - and `block_size` +2 bytes for decryption (in the latter case, it is - actually the *encrypted* IV which was prefixed to the ciphertext). - It is mandatory. - - For all other modes, it must be `block_size` bytes longs. It is optional and - when not present it will be given a default value of all zeroes. - counter : callable - (*Only* `MODE_CTR`). A stateful function that returns the next - *counter block*, which is a byte string of `block_size` bytes. - For better performance, use `Crypto.Util.Counter`. - segment_size : integer - (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext - are segmented in. - It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8. - effective_keylen : integer - Maximum cryptographic strength of the key, in bits. - It can vary from 0 to 1024. The default value is 1024. - - :Return: an `RC2Cipher` object - """ - return RC2Cipher(key, *args, **kwargs) - -#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`. -MODE_ECB = 1 -#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`. -MODE_CBC = 2 -#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`. -MODE_CFB = 3 -#: This mode should not be used. -MODE_PGP = 4 -#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`. -MODE_OFB = 5 -#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`. -MODE_CTR = 6 -#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`. -MODE_OPENPGP = 7 -#: Size of a data block (in bytes) -block_size = 8 -#: Size of a key (in bytes) -key_size = xrange(1,16+1) - diff --git a/modules/Crypto/Cipher/ARC4.py b/modules/Crypto/Cipher/ARC4.py deleted file mode 100644 index b745e7c..0000000 --- a/modules/Crypto/Cipher/ARC4.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/ARC4.py : ARC4 -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""ARC4 symmetric cipher - -ARC4_ (Alleged RC4) is an implementation of RC4 (Rivest's Cipher version 4), -a symmetric stream cipher designed by Ron Rivest in 1987. - -The cipher started as a proprietary design, that was reverse engineered and -anonymously posted on Usenet in 1994. The company that owns RC4 (RSA Data -Inc.) never confirmed the correctness of the leaked algorithm. - -Unlike RC2, the company has never published the full specification of RC4, -of whom it still holds the trademark. - -ARC4 keys can vary in length from 40 to 2048 bits. - -One problem of ARC4 is that it does not take a nonce or an IV. If it is required -to encrypt multiple messages with the same long-term key, a distinct -independent nonce must be created for each message, and a short-term key must -be derived from the combination of the long-term key and the nonce. -Due to the weak key scheduling algorithm of RC2, the combination must be carried -out with a complex function (e.g. a cryptographic hash) and not by simply -concatenating key and nonce. - -New designs should not use ARC4. A good alternative is AES -(`Crypto.Cipher.AES`) in any of the modes that turn it into a stream cipher (OFB, CFB, or CTR). - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import ARC4 - >>> from Crypto.Hash import SHA - >>> from Crypto import Random - >>> - >>> key = b'Very long and confidential key' - >>> nonce = Random.new().read(16) - >>> tempkey = SHA.new(key+nonce).digest() - >>> cipher = ARC4.new(tempkey) - >>> msg = nonce + cipher.encrypt(b'Open the pod bay doors, HAL') - -.. _ARC4: http://en.wikipedia.org/wiki/RC4 - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import _ARC4 - -class ARC4Cipher: - """ARC4 cipher object""" - - - def __init__(self, key, *args, **kwargs): - """Initialize an ARC4 cipher object - - See also `new()` at the module level.""" - - self._cipher = _ARC4.new(key, *args, **kwargs) - self.block_size = self._cipher.block_size - self.key_size = self._cipher.key_size - - def encrypt(self, plaintext): - """Encrypt a piece of data. - - :Parameters: - plaintext : byte string - The piece of data to encrypt. It can be of any size. - :Return: the encrypted data (byte string, as long as the - plaintext). - """ - return self._cipher.encrypt(plaintext) - - def decrypt(self, ciphertext): - """Decrypt a piece of data. - - :Parameters: - ciphertext : byte string - The piece of data to decrypt. It can be of any size. - :Return: the decrypted data (byte string, as long as the - ciphertext). - """ - return self._cipher.decrypt(ciphertext) - -def new(key, *args, **kwargs): - """Create a new ARC4 cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - It can have any length, with a minimum of 40 bytes. - Its cryptograpic strength is always capped to 2048 bits (256 bytes). - - :Return: an `ARC4Cipher` object - """ - return ARC4Cipher(key, *args, **kwargs) - -#: Size of a data block (in bytes) -block_size = 1 -#: Size of a key (in bytes) -key_size = xrange(1,256+1) - diff --git a/modules/Crypto/Cipher/Blowfish.py b/modules/Crypto/Cipher/Blowfish.py deleted file mode 100644 index 3f12bea..0000000 --- a/modules/Crypto/Cipher/Blowfish.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/Blowfish.py : Blowfish -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""Blowfish symmetric cipher - -Blowfish_ is a symmetric block cipher designed by Bruce Schneier. - -It has a fixed data block size of 8 bytes and its keys can vary in length -from 32 to 448 bits (4 to 56 bytes). - -Blowfish is deemed secure and it is fast. However, its keys should be chosen -to be big enough to withstand a brute force attack (e.g. at least 16 bytes). - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import Blowfish - >>> from Crypto import Random - >>> from struct import pack - >>> - >>> bs = Blowfish.block_size - >>> key = b'An arbitrarily long key' - >>> iv = Random.new().read(bs) - >>> cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv) - >>> plaintext = b'docendo discimus ' - >>> plen = bs - divmod(len(plaintext),bs)[1] - >>> padding = [plen]*plen - >>> padding = pack('b'*plen, *padding) - >>> msg = iv + cipher.encrypt(plaintext + padding) - -.. _Blowfish: http://www.schneier.com/blowfish.html - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import blockalgo -from Crypto.Cipher import _Blowfish - -class BlowfishCipher (blockalgo.BlockAlgo): - """Blowfish cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize a Blowfish cipher object - - See also `new()` at the module level.""" - blockalgo.BlockAlgo.__init__(self, _Blowfish, key, *args, **kwargs) - -def new(key, *args, **kwargs): - """Create a new Blowfish cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - Its length can vary from 4 to 56 bytes. - :Keywords: - mode : a *MODE_** constant - The chaining mode to use for encryption or decryption. - Default is `MODE_ECB`. - IV : byte string - The initialization vector to use for encryption or decryption. - - It is ignored for `MODE_ECB` and `MODE_CTR`. - - For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption - and `block_size` +2 bytes for decryption (in the latter case, it is - actually the *encrypted* IV which was prefixed to the ciphertext). - It is mandatory. - - For all other modes, it must be `block_size` bytes longs. It is optional and - when not present it will be given a default value of all zeroes. - counter : callable - (*Only* `MODE_CTR`). A stateful function that returns the next - *counter block*, which is a byte string of `block_size` bytes. - For better performance, use `Crypto.Util.Counter`. - segment_size : integer - (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext - are segmented in. - It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8. - - :Return: a `BlowfishCipher` object - """ - return BlowfishCipher(key, *args, **kwargs) - -#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`. -MODE_ECB = 1 -#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`. -MODE_CBC = 2 -#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`. -MODE_CFB = 3 -#: This mode should not be used. -MODE_PGP = 4 -#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`. -MODE_OFB = 5 -#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`. -MODE_CTR = 6 -#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`. -MODE_OPENPGP = 7 -#: Size of a data block (in bytes) -block_size = 8 -#: Size of a key (in bytes) -key_size = xrange(4,56+1) - diff --git a/modules/Crypto/Cipher/CAST.py b/modules/Crypto/Cipher/CAST.py deleted file mode 100644 index f08dab3..0000000 --- a/modules/Crypto/Cipher/CAST.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/CAST.py : CAST -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""CAST-128 symmetric cipher - -CAST-128_ (or CAST5) is a symmetric block cipher specified in RFC2144_. - -It has a fixed data block size of 8 bytes. Its key can vary in length -from 40 to 128 bits. - -CAST is deemed to be cryptographically secure, but its usage is not widespread. -Keys of sufficient length should be used to prevent brute force attacks -(128 bits are recommended). - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import CAST - >>> from Crypto import Random - >>> - >>> key = b'Sixteen byte key' - >>> iv = Random.new().read(CAST.block_size) - >>> cipher = CAST.new(key, CAST.MODE_OPENPGP, iv) - >>> plaintext = b'sona si latine loqueris ' - >>> msg = cipher.encrypt(plaintext) - >>> - ... - >>> eiv = msg[:CAST.block_size+2] - >>> ciphertext = msg[CAST.block_size+2:] - >>> cipher = CAST.new(key, CAST.MODE_OPENPGP, eiv) - >>> print cipher.decrypt(ciphertext) - -.. _CAST-128: http://en.wikipedia.org/wiki/CAST-128 -.. _RFC2144: http://tools.ietf.org/html/rfc2144 - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import blockalgo -from Crypto.Cipher import _CAST - -class CAST128Cipher(blockalgo.BlockAlgo): - """CAST-128 cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize a CAST-128 cipher object - - See also `new()` at the module level.""" - blockalgo.BlockAlgo.__init__(self, _CAST, key, *args, **kwargs) - -def new(key, *args, **kwargs): - """Create a new CAST-128 cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - Its length may vary from 5 to 16 bytes. - :Keywords: - mode : a *MODE_** constant - The chaining mode to use for encryption or decryption. - Default is `MODE_ECB`. - IV : byte string - The initialization vector to use for encryption or decryption. - - It is ignored for `MODE_ECB` and `MODE_CTR`. - - For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption - and `block_size` +2 bytes for decryption (in the latter case, it is - actually the *encrypted* IV which was prefixed to the ciphertext). - It is mandatory. - - For all other modes, it must be `block_size` bytes longs. It is optional and - when not present it will be given a default value of all zeroes. - counter : callable - (*Only* `MODE_CTR`). A stateful function that returns the next - *counter block*, which is a byte string of `block_size` bytes. - For better performance, use `Crypto.Util.Counter`. - segment_size : integer - (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext - are segmented in. - It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8. - - :Return: an `CAST128Cipher` object - """ - return CAST128Cipher(key, *args, **kwargs) - -#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`. -MODE_ECB = 1 -#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`. -MODE_CBC = 2 -#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`. -MODE_CFB = 3 -#: This mode should not be used. -MODE_PGP = 4 -#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`. -MODE_OFB = 5 -#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`. -MODE_CTR = 6 -#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`. -MODE_OPENPGP = 7 -#: Size of a data block (in bytes) -block_size = 8 -#: Size of a key (in bytes) -key_size = xrange(5,16+1) diff --git a/modules/Crypto/Cipher/DES.py b/modules/Crypto/Cipher/DES.py deleted file mode 100644 index 2fae42f..0000000 --- a/modules/Crypto/Cipher/DES.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/DES.py : DES -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""DES symmetric cipher - -DES `(Data Encryption Standard)`__ is a symmetric block cipher standardized -by NIST_ . It has a fixed data block size of 8 bytes. -Its keys are 64 bits long, even though 8 bits were used for integrity (now they -are ignored) and do not contribute to securty. - -DES is cryptographically secure, but its key length is too short by nowadays -standards and it could be brute forced with some effort. - -DES should not be used for new designs. Use `AES`. - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import DES3 - >>> from Crypto import Random - >>> - >>> key = b'Sixteen byte key' - >>> iv = Random.new().read(DES3.block_size) - >>> cipher = DES3.new(key, DES3.MODE_OFB, iv) - >>> plaintext = b'sona si latine loqueris ' - >>> msg = iv + cipher.encrypt(plaintext) - -.. __: http://en.wikipedia.org/wiki/Data_Encryption_Standard -.. _NIST: http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import blockalgo -from Crypto.Cipher import _DES - -class DESCipher(blockalgo.BlockAlgo): - """DES cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize a DES cipher object - - See also `new()` at the module level.""" - blockalgo.BlockAlgo.__init__(self, _DES, key, *args, **kwargs) - -def new(key, *args, **kwargs): - """Create a new DES cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - It must be 8 byte long. The parity bits will be ignored. - :Keywords: - mode : a *MODE_** constant - The chaining mode to use for encryption or decryption. - Default is `MODE_ECB`. - IV : byte string - The initialization vector to use for encryption or decryption. - - It is ignored for `MODE_ECB` and `MODE_CTR`. - - For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption - and `block_size` +2 bytes for decryption (in the latter case, it is - actually the *encrypted* IV which was prefixed to the ciphertext). - It is mandatory. - - For all other modes, it must be `block_size` bytes longs. It is optional and - when not present it will be given a default value of all zeroes. - counter : callable - (*Only* `MODE_CTR`). A stateful function that returns the next - *counter block*, which is a byte string of `block_size` bytes. - For better performance, use `Crypto.Util.Counter`. - segment_size : integer - (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext - are segmented in. - It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8. - - :Return: an `DESCipher` object - """ - return DESCipher(key, *args, **kwargs) - -#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`. -MODE_ECB = 1 -#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`. -MODE_CBC = 2 -#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`. -MODE_CFB = 3 -#: This mode should not be used. -MODE_PGP = 4 -#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`. -MODE_OFB = 5 -#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`. -MODE_CTR = 6 -#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`. -MODE_OPENPGP = 7 -#: Size of a data block (in bytes) -block_size = 8 -#: Size of a key (in bytes) -key_size = 8 diff --git a/modules/Crypto/Cipher/DES3.py b/modules/Crypto/Cipher/DES3.py deleted file mode 100644 index 7fedac8..0000000 --- a/modules/Crypto/Cipher/DES3.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/DES3.py : DES3 -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""Triple DES symmetric cipher - -`Triple DES`__ (or TDES or TDEA or 3DES) is a symmetric block cipher standardized by NIST_. -It has a fixed data block size of 8 bytes. Its keys are 128 (*Option 1*) or 192 -bits (*Option 2*) long. -However, 1 out of 8 bits is used for redundancy and do not contribute to -security. The effective key length is respectively 112 or 168 bits. - -TDES consists of the concatenation of 3 simple `DES` ciphers. - -The plaintext is first DES encrypted with *K1*, then decrypted with *K2*, -and finally encrypted again with *K3*. The ciphertext is decrypted in the reverse manner. - -The 192 bit key is a bundle of three 64 bit independent subkeys: *K1*, *K2*, and *K3*. - -The 128 bit key is split into *K1* and *K2*, whereas *K1=K3*. - -It is important that all subkeys are different, otherwise TDES would degrade to -single `DES`. - -TDES is cryptographically secure, even though it is neither as secure nor as fast -as `AES`. - -As an example, encryption can be done as follows: - - >>> from Crypto.Cipher import DES - >>> from Crypto import Random - >>> from Crypto.Util import Counter - >>> - >>> key = b'-8B key-' - >>> nonce = Random.new().read(DES.block_size/2) - >>> ctr = Counter.new(DES.block_size*8/2, prefix=nonce) - >>> cipher = DES.new(key, DES.MODE_CTR, counter=ctr) - >>> plaintext = b'We are no longer the knights who say ni!' - >>> msg = nonce + cipher.encrypt(plaintext) - -.. __: http://en.wikipedia.org/wiki/Triple_DES -.. _NIST: http://csrc.nist.gov/publications/nistpubs/800-67/SP800-67.pdf - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import blockalgo -from Crypto.Cipher import _DES3 - -class DES3Cipher(blockalgo.BlockAlgo): - """TDES cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize a TDES cipher object - - See also `new()` at the module level.""" - blockalgo.BlockAlgo.__init__(self, _DES3, key, *args, **kwargs) - -def new(key, *args, **kwargs): - """Create a new TDES cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - It must be 16 or 24 bytes long. The parity bits will be ignored. - :Keywords: - mode : a *MODE_** constant - The chaining mode to use for encryption or decryption. - Default is `MODE_ECB`. - IV : byte string - The initialization vector to use for encryption or decryption. - - It is ignored for `MODE_ECB` and `MODE_CTR`. - - For `MODE_OPENPGP`, IV must be `block_size` bytes long for encryption - and `block_size` +2 bytes for decryption (in the latter case, it is - actually the *encrypted* IV which was prefixed to the ciphertext). - It is mandatory. - - For all other modes, it must be `block_size` bytes longs. It is optional and - when not present it will be given a default value of all zeroes. - counter : callable - (*Only* `MODE_CTR`). A stateful function that returns the next - *counter block*, which is a byte string of `block_size` bytes. - For better performance, use `Crypto.Util.Counter`. - segment_size : integer - (*Only* `MODE_CFB`).The number of bits the plaintext and ciphertext - are segmented in. - It must be a multiple of 8. If 0 or not specified, it will be assumed to be 8. - - :Attention: it is important that all 8 byte subkeys are different, - otherwise TDES would degrade to single `DES`. - :Return: an `DES3Cipher` object - """ - return DES3Cipher(key, *args, **kwargs) - -#: Electronic Code Book (ECB). See `blockalgo.MODE_ECB`. -MODE_ECB = 1 -#: Cipher-Block Chaining (CBC). See `blockalgo.MODE_CBC`. -MODE_CBC = 2 -#: Cipher FeedBack (CFB). See `blockalgo.MODE_CFB`. -MODE_CFB = 3 -#: This mode should not be used. -MODE_PGP = 4 -#: Output FeedBack (OFB). See `blockalgo.MODE_OFB`. -MODE_OFB = 5 -#: CounTer Mode (CTR). See `blockalgo.MODE_CTR`. -MODE_CTR = 6 -#: OpenPGP Mode. See `blockalgo.MODE_OPENPGP`. -MODE_OPENPGP = 7 -#: Size of a data block (in bytes) -block_size = 8 -#: Size of a key (in bytes) -key_size = ( 16, 24 ) diff --git a/modules/Crypto/Cipher/PKCS1_OAEP.py b/modules/Crypto/Cipher/PKCS1_OAEP.py deleted file mode 100644 index 9afe176..0000000 --- a/modules/Crypto/Cipher/PKCS1_OAEP.py +++ /dev/null @@ -1,255 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/PKCS1_OAEP.py : PKCS#1 OAEP -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== - -"""RSA encryption protocol according to PKCS#1 OAEP - -See RFC3447__ or the `original RSA Labs specification`__ . - -This scheme is more properly called ``RSAES-OAEP``. - -As an example, a sender may encrypt a message in this way: - - >>> from Crypto.Cipher import PKCS1_OAEP - >>> from Crypto.PublicKey import RSA - >>> - >>> message = 'To be encrypted' - >>> key = RSA.importKey(open('pubkey.der').read()) - >>> cipher = PKCS1_OAEP.new(key) - >>> ciphertext = cipher.encrypt(message) - -At the receiver side, decryption can be done using the private part of -the RSA key: - - >>> key = RSA.importKey(open('privkey.der').read()) - >>> cipher = PKCS1_OAP.new(key) - >>> message = cipher.decrypt(ciphertext) - -:undocumented: __revision__, __package__ - -.. __: http://www.ietf.org/rfc/rfc3447.txt -.. __: http://www.rsa.com/rsalabs/node.asp?id=2125. -""" - -from __future__ import nested_scopes - -__revision__ = "$Id$" -__all__ = [ 'new', 'PKCS1OAEP_Cipher' ] - -import Crypto.Signature.PKCS1_PSS -import Crypto.Hash.SHA - -from Crypto.Util.py3compat import * -import Crypto.Util.number -from Crypto.Util.number import ceil_div -from Crypto.Util.strxor import strxor - -class PKCS1OAEP_Cipher: - """This cipher can perform PKCS#1 v1.5 OAEP encryption or decryption.""" - - def __init__(self, key, hashAlgo, mgfunc, label): - """Initialize this PKCS#1 OAEP cipher object. - - :Parameters: - key : an RSA key object - If a private half is given, both encryption and decryption are possible. - If a public half is given, only encryption is possible. - hashAlgo : hash object - The hash function to use. This can be a module under `Crypto.Hash` - or an existing hash object created from any of such modules. If not specified, - `Crypto.Hash.SHA` (that is, SHA-1) is used. - mgfunc : callable - A mask generation function that accepts two parameters: a string to - use as seed, and the lenth of the mask to generate, in bytes. - If not specified, the standard MGF1 is used (a safe choice). - label : string - A label to apply to this particular encryption. If not specified, - an empty string is used. Specifying a label does not improve - security. - - :attention: Modify the mask generation function only if you know what you are doing. - Sender and receiver must use the same one. - """ - self._key = key - - if hashAlgo: - self._hashObj = hashAlgo - else: - self._hashObj = Crypto.Hash.SHA - - if mgfunc: - self._mgf = mgfunc - else: - self._mgf = lambda x,y: Crypto.Signature.PKCS1_PSS.MGF1(x,y,self._hashObj) - - self._label = label - - def can_encrypt(self): - """Return True/1 if this cipher object can be used for encryption.""" - return self._key.can_encrypt() - - def can_decrypt(self): - """Return True/1 if this cipher object can be used for decryption.""" - return self._key.can_decrypt() - - def encrypt(self, message): - """Produce the PKCS#1 OAEP encryption of a message. - - This function is named ``RSAES-OAEP-ENCRYPT``, and is specified in - section 7.1.1 of RFC3447. - - :Parameters: - message : string - The message to encrypt, also known as plaintext. It can be of - variable length, but not longer than the RSA modulus (in bytes) - minus 2, minus twice the hash output size. - - :Return: A string, the ciphertext in which the message is encrypted. - It is as long as the RSA modulus (in bytes). - :Raise ValueError: - If the RSA key length is not sufficiently long to deal with the given - message. - """ - # TODO: Verify the key is RSA - - randFunc = self._key._randfunc - - # See 7.1.1 in RFC3447 - modBits = Crypto.Util.number.size(self._key.n) - k = ceil_div(modBits,8) # Convert from bits to bytes - hLen = self._hashObj.digest_size - mLen = len(message) - - # Step 1b - ps_len = k-mLen-2*hLen-2 - if ps_len<0: - raise ValueError("Plaintext is too long.") - # Step 2a - lHash = self._hashObj.new(self._label).digest() - # Step 2b - ps = bchr(0x00)*ps_len - # Step 2c - db = lHash + ps + bchr(0x01) + message - # Step 2d - ros = randFunc(hLen) - # Step 2e - dbMask = self._mgf(ros, k-hLen-1) - # Step 2f - maskedDB = strxor(db, dbMask) - # Step 2g - seedMask = self._mgf(maskedDB, hLen) - # Step 2h - maskedSeed = strxor(ros, seedMask) - # Step 2i - em = bchr(0x00) + maskedSeed + maskedDB - # Step 3a (OS2IP), step 3b (RSAEP), part of step 3c (I2OSP) - m = self._key.encrypt(em, 0)[0] - # Complete step 3c (I2OSP) - c = bchr(0x00)*(k-len(m)) + m - return c - - def decrypt(self, ct): - """Decrypt a PKCS#1 OAEP ciphertext. - - This function is named ``RSAES-OAEP-DECRYPT``, and is specified in - section 7.1.2 of RFC3447. - - :Parameters: - ct : string - The ciphertext that contains the message to recover. - - :Return: A string, the original message. - :Raise ValueError: - If the ciphertext length is incorrect, or if the decryption does not - succeed. - :Raise TypeError: - If the RSA key has no private half. - """ - # TODO: Verify the key is RSA - - # See 7.1.2 in RFC3447 - modBits = Crypto.Util.number.size(self._key.n) - k = ceil_div(modBits,8) # Convert from bits to bytes - hLen = self._hashObj.digest_size - - # Step 1b and 1c - if len(ct) != k or k>> from Crypto.Cipher import PKCS1_v1_5 - >>> from Crypto.PublicKey import RSA - >>> from Crypto.Hash import SHA - >>> - >>> message = 'To be encrypted' - >>> h = SHA.new(message) - >>> - >>> key = RSA.importKey(open('pubkey.der').read()) - >>> cipher = PKCS1_v1_5.new(key) - >>> ciphertext = cipher.encrypt(message+h.digest()) - -At the receiver side, decryption can be done using the private part of -the RSA key: - - >>> From Crypto.Hash import SHA - >>> from Crypto import Random - >>> - >>> key = RSA.importKey(open('privkey.der').read()) - >>> - >>> dsize = SHA.digest_size - >>> sentinel = Random.new().read(15+dsize) # Let's assume that average data length is 15 - >>> - >>> cipher = PKCS1_v1_5.new(key) - >>> message = cipher.decrypt(ciphertext, sentinel) - >>> - >>> digest = SHA.new(message[:-dsize]).digest() - >>> if digest==message[-dsize:]: # Note how we DO NOT look for the sentinel - >>> print "Encryption was correct." - >>> else: - >>> print "Encryption was not correct." - -:undocumented: __revision__, __package__ - -.. __: http://www.ietf.org/rfc/rfc3447.txt -.. __: http://www.rsa.com/rsalabs/node.asp?id=2125. -""" - -__revision__ = "$Id$" -__all__ = [ 'new', 'PKCS115_Cipher' ] - -from Crypto.Util.number import ceil_div -from Crypto.Util.py3compat import * -import Crypto.Util.number - -class PKCS115_Cipher: - """This cipher can perform PKCS#1 v1.5 RSA encryption or decryption.""" - - def __init__(self, key): - """Initialize this PKCS#1 v1.5 cipher object. - - :Parameters: - key : an RSA key object - If a private half is given, both encryption and decryption are possible. - If a public half is given, only encryption is possible. - """ - self._key = key - - def can_encrypt(self): - """Return True if this cipher object can be used for encryption.""" - return self._key.can_encrypt() - - def can_decrypt(self): - """Return True if this cipher object can be used for decryption.""" - return self._key.can_decrypt() - - def encrypt(self, message): - """Produce the PKCS#1 v1.5 encryption of a message. - - This function is named ``RSAES-PKCS1-V1_5-ENCRYPT``, and is specified in - section 7.2.1 of RFC3447. - For a complete example see `Crypto.Cipher.PKCS1_v1_5`. - - :Parameters: - message : byte string - The message to encrypt, also known as plaintext. It can be of - variable length, but not longer than the RSA modulus (in bytes) minus 11. - - :Return: A byte string, the ciphertext in which the message is encrypted. - It is as long as the RSA modulus (in bytes). - :Raise ValueError: - If the RSA key length is not sufficiently long to deal with the given - message. - - """ - # TODO: Verify the key is RSA - - randFunc = self._key._randfunc - - # See 7.2.1 in RFC3447 - modBits = Crypto.Util.number.size(self._key.n) - k = ceil_div(modBits,8) # Convert from bits to bytes - mLen = len(message) - - # Step 1 - if mLen > k-11: - raise ValueError("Plaintext is too long.") - # Step 2a - class nonZeroRandByte: - def __init__(self, rf): self.rf=rf - def __call__(self, c): - while bord(c)==0x00: c=self.rf(1)[0] - return c - ps = tobytes(map(nonZeroRandByte(randFunc), randFunc(k-mLen-3))) - # Step 2b - em = b('\x00\x02') + ps + bchr(0x00) + message - # Step 3a (OS2IP), step 3b (RSAEP), part of step 3c (I2OSP) - m = self._key.encrypt(em, 0)[0] - # Complete step 3c (I2OSP) - c = bchr(0x00)*(k-len(m)) + m - return c - - def decrypt(self, ct, sentinel): - """Decrypt a PKCS#1 v1.5 ciphertext. - - This function is named ``RSAES-PKCS1-V1_5-DECRYPT``, and is specified in - section 7.2.2 of RFC3447. - For a complete example see `Crypto.Cipher.PKCS1_v1_5`. - - :Parameters: - ct : byte string - The ciphertext that contains the message to recover. - sentinel : any type - The object to return to indicate that an error was detected during decryption. - - :Return: A byte string. It is either the original message or the ``sentinel`` (in case of an error). - :Raise ValueError: - If the ciphertext length is incorrect - :Raise TypeError: - If the RSA key has no private half. - - :attention: - You should **never** let the party who submitted the ciphertext know that - this function returned the ``sentinel`` value. - Armed with such knowledge (for a fair amount of carefully crafted but invalid ciphertexts), - an attacker is able to recontruct the plaintext of any other encryption that were carried out - with the same RSA public key (see `Bleichenbacher's`__ attack). - - In general, it should not be possible for the other party to distinguish - whether processing at the server side failed because the value returned - was a ``sentinel`` as opposed to a random, invalid message. - - In fact, the second option is not that unlikely: encryption done according to PKCS#1 v1.5 - embeds no good integrity check. There is roughly one chance - in 2^16 for a random ciphertext to be returned as a valid message - (although random looking). - - It is therefore advisabled to: - - 1. Select as ``sentinel`` a value that resembles a plausable random, invalid message. - 2. Not report back an error as soon as you detect a ``sentinel`` value. - Put differently, you should not explicitly check if the returned value is the ``sentinel`` or not. - 3. Cover all possible errors with a single, generic error indicator. - 4. Embed into the definition of ``message`` (at the protocol level) a digest (e.g. ``SHA-1``). - It is recommended for it to be the rightmost part ``message``. - 5. Where possible, monitor the number of errors due to ciphertexts originating from the same party, - and slow down the rate of the requests from such party (or even blacklist it altogether). - - **If you are designing a new protocol, consider using the more robust PKCS#1 OAEP.** - - .. __: http://www.bell-labs.com/user/bleichen/papers/pkcs.ps - - """ - - # TODO: Verify the key is RSA - - # See 7.2.1 in RFC3447 - modBits = Crypto.Util.number.size(self._key.n) - k = ceil_div(modBits,8) # Convert from bits to bytes - - # Step 1 - if len(ct) != k: - raise ValueError("Ciphertext with incorrect length.") - # Step 2a (O2SIP), 2b (RSADP), and part of 2c (I2OSP) - m = self._key.decrypt(ct) - # Complete step 2c (I2OSP) - em = bchr(0x00)*(k-len(m)) + m - # Step 3 - sep = em.find(bchr(0x00),2) - if not em.startswith(b('\x00\x02')) or sep<10: - return sentinel - # Step 4 - return em[sep+1:] - -def new(key): - """Return a cipher object `PKCS115_Cipher` that can be used to perform PKCS#1 v1.5 encryption or decryption. - - :Parameters: - key : RSA key object - The key to use to encrypt or decrypt the message. This is a `Crypto.PublicKey.RSA` object. - Decryption is only possible if *key* is a private RSA key. - - """ - return PKCS115_Cipher(key) - diff --git a/modules/Crypto/Cipher/XOR.py b/modules/Crypto/Cipher/XOR.py deleted file mode 100644 index 26ec1b1..0000000 --- a/modules/Crypto/Cipher/XOR.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Cipher/XOR.py : XOR -# -# =================================================================== -# The contents of this file are dedicated to the public domain. To -# the extent that dedication to the public domain is not available, -# everyone is granted a worldwide, perpetual, royalty-free, -# non-exclusive license to exercise all rights associated with the -# contents of this file for any purpose whatsoever. -# No rights are reserved. -# -# THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# =================================================================== -"""XOR toy cipher - -XOR is one the simplest stream ciphers. Encryption and decryption are -performed by XOR-ing data with a keystream made by contatenating -the key. - -Do not use it for real applications! - -:undocumented: __revision__, __package__ -""" - -__revision__ = "$Id$" - -from Crypto.Cipher import _XOR - -class XORCipher: - """XOR cipher object""" - - def __init__(self, key, *args, **kwargs): - """Initialize a XOR cipher object - - See also `new()` at the module level.""" - self._cipher = _XOR.new(key, *args, **kwargs) - self.block_size = self._cipher.block_size - self.key_size = self._cipher.key_size - - def encrypt(self, plaintext): - """Encrypt a piece of data. - - :Parameters: - plaintext : byte string - The piece of data to encrypt. It can be of any size. - :Return: the encrypted data (byte string, as long as the - plaintext). - """ - return self._cipher.encrypt(plaintext) - - def decrypt(self, ciphertext): - """Decrypt a piece of data. - - :Parameters: - ciphertext : byte string - The piece of data to decrypt. It can be of any size. - :Return: the decrypted data (byte string, as long as the - ciphertext). - """ - return self._cipher.decrypt(ciphertext) - -def new(key, *args, **kwargs): - """Create a new XOR cipher - - :Parameters: - key : byte string - The secret key to use in the symmetric cipher. - Its length may vary from 1 to 32 bytes. - - :Return: an `XORCipher` object - """ - return XORCipher(key, *args, **kwargs) - -#: Size of a data block (in bytes) -block_size = 1 -#: Size of a key (in bytes) -key_size = xrange(1,32+1) - diff --git a/modules/Crypto/Cipher/_AES.so b/modules/Crypto/Cipher/_AES.so deleted file mode 100755 index d9bc7d135b9f63568d17ca03ecab7940db068b3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39688 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 diff --git a/modules/Crypto/Cipher/_ARC4.so b/modules/Crypto/Cipher/_ARC4.so deleted file mode 100755 index c9e150b0abedb4b8cb29cc92d0986345c143b98a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18248 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 diff --git a/modules/Crypto/Cipher/_Blowfish.so b/modules/Crypto/Cipher/_Blowfish.so deleted file mode 100755 index 15e03ccceafa6f0fbef2a7b4ff8e91732537e3c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35520 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

?QaD6R87c-z;}9_ws2C)bL&Q{} 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 z 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 ZFKE~ioBq?Fh+$x0_zKkrqhRia@c~W6O*{Yq diff --git a/modules/Crypto/Cipher/_CAST.so b/modules/Crypto/Cipher/_CAST.so deleted file mode 100755 index 175297e002569afe58254b6bc9f0a7f70549e763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35456 zcmb<-^>JfjWMqH=W(GS35Klo6BH{p{7#fme5H|$r1j(y0Fo5F?^zu;Va?j|sbfZ{aZKBm;K!-*JfF!eOs34slTWfaEOHa8SVE&Tbs; zw8No(5)SneINYO#L;M#G@%cE!OK`;34jk^egu|R#9O^T1s9%Od+yX~Be}%(*3moY) zh=GAY2{o#~yl5QuZeU_y5MU5v&?rWY<-=fcaRvi4@$FD?boD0S@Z@25Uo??@Pl{=EC%)$FT)vYgcz6=AD^C^pBG^RyS`^~zoRgoI8j_fllM0c;E)$(0O5)v$@^gLi!S06`1QvlX9rIG4 zmcc`eAvZB6CqEfvTUlaGd~jk}YDh*=Y9h!uSCB|hYH>+^5lk=*WNmJ0Zf<^ADnopH zVsUY5Q3=dHt`*7g!Ii}&skyN5frdROAR$bUJr&9EzNxwSMW9%KgknWNRDyyK9F7bDmGPc=nI*pYDWy57Ch=w_3;~r8PP}7Eif3MlbADcN zNn#!-@Z;SQOA>P+rsZTN6;zgFlx}9Fo48Lz#avOfceQFmKj5QYD!{B zB13$9QgJaT&WcJH;#2cd7~Fk4ot)#1^bAelOa#kF&lH^285rQr4HzF(ze3p11_-!j zhKRsa!(Zm*+T5qKoh@U0ui@B6K8;$lYl191vMuFP22+N z&H^-XQ>b_anm8ZSoCY*;F{tc_2by@&J-Ja>MTgk~ngeZ~;jixt(?cNn99gGK6@5BrXaO z0+TP0#1+9J5aI)pxH3ctO#VO;hXw&y{6-!m96){rwSmBb3=9kpki-#rm4V>}k~pjl z57P4iNgTPK^8-m76xJZMU<`E+$X-|;1Br7WiF1MkpjZG&oC_)jq9l;Sxj_O@tbioW z3l#%V8c5=xIvXSg!Ujm<(5wy;X0SjK2lX4kf}p+~k~pZ2hlzV2iHpMo85kG>ki;dB z#3PWzC6UAvki?~s#50h@rIEx7kiH-Y$|r2Db~%wGlKgOcpa0x*9Oh!0AtFB8E0Ss*?riM|W~ z^Fi)Qn*fR+5ccS`WlU0F2=(Y?{h6r1;9>d0qw{Hrq(?VvQ5+F7Wdz@&*Y+StU$5z|M36C>|2#UMdK~=6?9utb55{927yp$=cyzNSLJi~r z8Hmfg2HV0!1qOyveUD~a^Ed?thER}ucszP-UqvY}ys-WM|Nje*|Ns9VWA#i_U|<9} zrvc=!&xh0a>Y@CPrx4E$&e9Xal*tPWue;=q%>DcR|^550) zw&4NK&YvEgB`QB0J1=$msC;?3jDdk6ZGt2Jwi-qU$8M8GNB;eXGY^D?GBCJw-g4=@ znRf6O|G^gmniqOm95fGho^asbc0R530DsGBkjCa8jQp*jPO;&=&QF&QbzXGryuiQh z-@%sxjt5^z@Nc`szwM+)FKez71A|BMf0u5P9Ui@`@m>rJZpLL%zU#c}$-n=wqva9)K5<5nV?MjKUgB>F{{R1fw~xvf&4V7v z2NAB`5f&O6`u%0+iGx4nH4pW&1R*=MHT3`g|Ggq|oj-BA@U$n`g>KzoXYF+by9MN| zO^#p}g515_mVv>A*<`}YNO(MH-t*|S?e}D0@aeVfaAjcV{N&SXTJOlf;L&SZVavd9 z`H*Ahh0cqhz&Q9)Ag%R)Q@2ffXN}4S{%t=!I)A!$+wAAx_RlBzy?eLGIv4(JuY5XR zxpnKT<8R3T*#QdPmOcOe|L-nQ`QXC%&(ZLktLD3xH~+!XiAQ&d$`6;$kDVtv@|ZgO zm=C^?=%{1sh-2?y>pXGrg+PZJW9JQ!pc@N_7U*zejgEDUag240bBsTX$Pb-2J72%v zh2VqIpGPn6Rs#kGP%`xCwOwVwzz`bj(fCGyk%6H*p2wxzp97STJUn_$`%D-ZJUVMs zHgw+L-*)-n3kjEQmT4}Xr(BF#8eKY1xEQm86T^QHAM6bNZ3kS9S=v2%S%Y;zAZ~NqEY%|@XGel*FOXndcW1AWL z+palv>ufZ(nFbO);nNwTa-cIu<&EL{&R_i7-nn$^tn=)A)A{${TM3uWSB{;39S^=0 zaOK~2*R5M;CP?)J-_GAIojEFVT)K5uxOTpB?L6zszwIPc*;{90ne{IG+ul1H%dGAU zQTgE8`QD{7MCFTHH&35ix5@&a&Ki{f7sJbjmyKgo=J0R3?!v$AvS;U2pUx1K1m|v% z)sCHaeY#^*Hoy$@>C91y0L87Vu{TR+h{_K)W1fj16%#)`bU$_~wbozAm zsDMf^SN?4$TsjYdxE%}(4DQ`L{rubB9egFwt+UP*WXwgE&O--ZNw^rk2kGv-1X4MJ zfq|hjM@7WgW`alO6ctdZ?$I5hasU(%0*3FMjBPqyx_PF#8a{OF{O!WO?Rn=fP?~Tv z=2__2`O5_qQm+JjI#X0GxES-S@a%lezwMo?G0%Ee{%w~$JKwk&^Gx&YyzbLEM`Zy6 zsOUKB(s|02f7{E0ZzT?bG_FwrjYm0lzH;i;ndsPg$*Egprs3tz5EYru92E(}*Djr> z9Qn7sax#`#=h3-F8Lz zo+lVycQUq_>A=73edjO7&cCkRD(gUY9(*g|*!j!1^F1Uxq^KN7Z?~ATn%r4)94A;&ch&MTtSu2QIKa{`L~^N1?T_UZrwbcE}fS^`OkoV+cnS5 zORk+~e7b#9Zh(@diIcHR2Pkr!jAdpR*Ql&9mYL>a_}H=YhGXZ=&KMO7$Ad2fK%v6F z?EwF_Yi`{tjgFv#>b9e?%{-8uAkTqD-rc%c8eBV{yL8s5*ti%T2gO6aTh& zf=g$KibH3Jii?Xe%RHBEn|&_EE-E%|#w^QR4d1(T{&zCAS?JSi>ub!w;ACvm;bQpR zr+bSE$T5c3J8M*49DFa(`K#Mzrn9lld?#a@4ZfZKx?@ycI2+sayL8v6xHuaAcj~s8 z>11p(0px5Kkf4JL|F%n@Jmk~)$<^>UC>%gVGRRkM-8R#ljcwXox?NOET#Q*(I2!)v z-}ak-+kKF32ap3@4UfBY{s#q(Ter;wpKceG2R_|PAPJ}2M@7Y>dk#3_()jaARBRj# z|997@D1goEtWhy>?R@WSY_rVq;Clg(3)1-Wa#T!Q`L`WUPdesk_^%rjZ8r0qjBOfRI$wiA?SYfAO&|ZZ`;chvwwVdC7?dd8x=j|O z@#h?bSiJ;fjd6|23XliZ7~9N*7^Y!d14@o1DocF2d%!6bn`0UGeEjQ#atSHUWm#Pw{Dw-U@xr!d*=bf2|P~5Hj|u; zZJIz%SYceFBH_|)GcS!luSR7B)Qi_04gWcH+jKb@+syOno&zp^K%QKZ#-DQvRGWbW zLFEdl41kyl3crak6GcD{1{E&GH7YV7H+3*DFo1k=!J|7yB>-Xu8rT&er9Z$ff6-Z^GN-#ng#+Y!kiH186>~sbm(GU=UxLD-iGSNk zkcGxJece7PZ;W|nbk?XWapd3j$Czhd8h>7j$`U7Io`%j7E}akgx1BX+>FRV*S>e&` zqT&ILGEh`J!q&1Ze=uy&J%0S)}nNoloOWIs!^* z{F>|@jYmN39;CJtYJb8pB-Eqxd$336HIH82`N0Yd9=)OxatsU}jc-6zO^Qc1iz;Xc z&7-pgTuB%n@aT0>(K+s-0v;VX?xLar>T4c%QPBZ)3p|dysDP(<13=0=z@!P73;>fJ z0fq;BdVN$pe0p6}B3|Tu{Quvh`G`U50sfZt%nS_OAu0+Uy{7l&7#Mn;{x|<%HmL^&cnwYK!L(Sc- zPOWw7FjjBqe^3Kg!=w2SqetiY7h)g(|8M@w@6mbCBl&85c5e~m4p0wP^MXh70mkNk z0{cK==)v!Q%!Bci;s53z9GwUGn;e-zt??p`&VwGuLH&0IkK-;}pn8zOqxsnn56w@# zJOa%Re>DH(D3WY`_`~o(=c&$v%?CIvFL-p?@D+Uq_sw|-!?@BG_l4%|A0?# zii(3rZ?R1;ODm|;?a`Z~65!MMytBCn)L7Ww0`^JT!2=xp+YcOkz`=O|qsZHszm4<4-)4#-Be2++s}Q&pegJpMN2Z zKk;B1f9AzB{(K*m0;rOUY5a+&)A%zlr}5|COyf^HmBycWD~&&2RNDb$?CnDk`P-+` z_|p%j@!w`uc3@!O7j&+9!S(+Ce-BUwxXZx6;L)tj$ltmI#OikD@aVj6c>8~Vfk$@_ zxNJ-DFy?{g#vA;tA3#aE@d&7N1!eEU;P?im@s^z+nO@TgQVa}xK`HBn+q?h&TMzKJ zvi|-5ADkgxe1VF5`~wnUW%UE)d{Z?U1_s019^Do%Oy2$f|GGVGf=92ZffNJ7F3p$TUj+t_ZVST$FPPu||8IEvW#a$;|3M{+M>p$1kX)~+lMDk$$%{{K|NnoX`wrr{ zR^|Wy|9c#F1`oM;B!{TTc=T4wfbxie$8l$HQS##B+yDQ&T~ri~JBxs9>vR@)$qedC zg8c=`ldT6z5_$vvH~+HdZ|`AbU|7M<-`c_mvaLqN0_<_+KmY%~G-L#YICT7E1q*-c zbVddSP^t0Z&;S454l*5MV&HFi^5_45!vkrZE?oa!-uMIZ17y4fRIq_;f4vGap25G( zMJ1s5fqaK^4Tu>6X4Zn35nyH=h#3QB)`OS{AZ9bD<^}Omz`RCK&f4apk^$y5L3ue~ z9%va1NM!+-2XX_5R|4j>LRD6Pd2LW$4Vc#s=CyzmCRhMevGQ+gQ2`kN7U+bk07-xa zx}XA}j1Cq6&CS28`3v$qgGV}D zP^s_HYnmg;!0_@iSPT>hAahqj^l3>#^%)*`aSWtW?eG8pkb>>F3)de|?eWs@H#jxc zLv$p-bi7#h`v3oz-~Rmn|Dxyh|Nm(dkox-}o}GU}J$h|-h%+z*?*xr&f=0qRuYO*} zKm9QOq(hpQ`S;y!z0KbW3Neq?xBM-ju9Zi(E62A6&`1zRNr*@1`xjGQgKDB59Hnv~ z-ZT)eo58cwMMb9b1~hlU{BzR_91c#fY_S_OED6aJ?_U4^|N0y>KkS64dnC!g08{ef z?yLX*U$6D(Jmk^M3YCvSk~ci?Vl~K!ZjWx(SrF~nNYXFnz54(EWi}*JfFhcKA=slk z+`yyrw@2%x57m>Kl-KVD^RL&0gayg z@aVO*7Gq$5hW)3{%Sxg=dTq5qLZD$}kIrkKmz9`%^xDdTgg_&|5TOu{URzO+5NNO% zB4p^%Yr6~N@6KZ{H@yPIv`2D@)o@i_Qeq4S`}!B+;LA;~nygGV?Hz7*i! ze%qCQ`xE|cmkvJWa6I^ggMZse&dZLRXFNMy89EOhe9Yl-@P!5E;coW;knF*i5{{f_ zS`T!(sC?k>TfhkF7G5$u32Nh*8kvCx*Lbz{KoqNr76SvQ-~8isB)B{?ymk3d=QYr< z-@(KRl>);OUYuM=LwQiCAw1fZn`M3G-JAj5jKe%*W>t%6B(>&Js zp(Ho0`5z;HOZET%|21#<^xAeALPq;8cV6tg26D*3ccAe;=WdaCpkX5i{%zMhI}o=5T}7h|0buG%^iU72+{UJ8S?yMX$x;9;d7ofjNCLYW;qVnHKvjvcNH zofi(i5OC~pW#r#>%(26j2{b$>;n?8{87_3}aAoD+cHFVUl?{}8p~Hs!@(iF}`s3Fd z(_rZZmOes*L7AxYyGO5SmoTUveq({u_H|Lw05yDlR75;_LsTSQ9D4??Ph0G`K!dL} zDk81_OKKgy9cS-$7ATQw{=rrv+WdnVQfc;@T8J?)@VAz6F)%d$U@n#Jc9!V%U~fIZ z?|Gv0$HAY>Gr#|Ay~N+@%f-O(!uC11zVz%o!rzhz66ksU|9^9}0GmfAiwb{x9UB8f zx3hppujmwUkj*Sj9*h_MKj4>VF#Klt|Hb>K|Nnb-9{1?>QPF_66?{5>@V6>)gZy;F z0x2*c^;>s|ib(4>{=O@qepzp^jYn^eih`@*e^~f{8o?62$?rWn-}!WYcjDhBqT$Q< z)F@b{BSb~Pu{WI2Bl!~lHW2}%VA+lk6-CG1a3;8jTt|qCl4EZ;Gh9TzBSb~nu{WFr zE~3y8qN3v18_o(BQS1m&QFZJMXM>9IrfILJ2oHZ0E@B+_;kK9a#rqeQBi*( z`RD(C7t0zI5zlT{29Hi>8UB7ZND&DtpSo>SUZ_9)|KB6IL`4MD2t4%!97rJM`6vJX zzdQ#TlZMZ?fcktQuB`{^j`{Rv%lPyb+qfG32M5Y)K2W*t%6J}ZSKTs?&R0I*KzT9a z_y7Oh!4kbr?5&shJr5oH!Q6VlvGX8*-(_$+u0%z`H~G2~|27*j2csGlh2|fO&K))) z{4HBRgKoX`jGzey{%s<5E=D0Lip@WmTsuT;_*+2DY{%YuCS+Nq<{!);*^(N^-g;(a z8Rh05EMS==$KHAtWEqv_AFN;*569kmR%98~<{xZe89m3|dNyPkwdNn}U>Om|-gtPxJ4|eve>w2CD6=y#G(TeJZ+-Re|9_w46X3+|)A?TWkauqhFN05~ zj|wQRUd(>-|37Fbgu_Skghy`xhiCF}AI1ls%|AK#oB7!p7#zPHWZ`eU%+A2z+j_D@ zfq$EUX;@#)Qmr|Pr`;8^?S)A|0zqo1I*hKq`VXYzNCPG=c#O6T7uVqgSH*&QM# z@YHQ00P?z`V~2?dJbgpNl%Qge6b=znhKfPbI7CbZDh5gA5HVG#7$luT#MGc-$SK{( zMMWK)2ouPdXAeFLxhFDg&(4s39R`dD_AoVL~}4!&CE!eFENAEyE20{Pl0G=c5MF1&fhPF zRWl2c=BW_PEMU#y5X~%(V9hrfusNF*Ni%3Iv`eomD_FA>L^CTyGpHYm>1Q@1&C(E? z*}$6bf&;*V4Wzj~8B-%WlEz0&VE?j%H7)@~(*gG8AMEuyzR3qXW`K$hb_b&xW|`)H z91a~d%red$HZ1%tYnT`qnvZgTqP>6xG+w|vOAthv9_Im3w)c4$7BuAbt4HVk=A#^*y&@(a%q1!kFAjeD|KBo4MWp`m%Wc09 z^L92WFRtGQ6?g(3-K<;f!ENDb0-#g*;N8cXq@-Ji3QR>Vf@i~wbNPTWy)_zI_UPcVEhX0;kTYF3GnGI zHgN0?^J%?Q!sFQO762LuQD@HLA=&iQ#=na;6q4NclzP>yD z4|6!~3|h6p&>f;8@{$#7JgmMqzY8kbs|^gly|@EnwjS{8JkH<3`2!^E0PFbiw}2L3 z`*i+)F&(4`l(JgmKpv2|2eRY8XXmjOy&#$1V9;oVjYsFP7i&L*q`tqndguRt&t`qb zQZCPKcMhM<|NjFFUOWIP?qpGUnFMaVg8M6;$;Tacf(mEPZWb0$HS==U_y7M9{a07R z|1W*Mfx-q7ULM^B9-T&B-6b49ygEy`et7g2aX^RrJQ*)~XkPGae)t1idp3Ri0dm8` zABLAax@`nJI&H)}nh$aKSe`0+|MDuxtG%Y*xEUBaPkD5+s@fpg1) zhL_x+p`%`2EnaXk2#n$r|&u{(z|MJLD(2UtJ0JYEgTXunphhA70!K2sIiJgJL@W6{%w;+9mBvw$19a8+Z zTxDcnfc6*oTQ-2pMR<3ClMB>c@Bs~XWA7fcz`sEF|Q?*0b~B4-&;N_gkf`QD?`MMdF-%q>vWKcf0NCDGu1&LdFB!TUMi zLH!&PK6p20%XMfs2h^JYHJ^MmPxy46^60JLcp-5e)E-Cgw@d=1n+c#r4ifN6!lRpo z30z5({sR?6pm+;W5ox`|-=_;6xpz^K0Ch>h{ZUuLxBT)99^Jt*zM%XF>YjUa2CH~= zvsgfr4=BEJZv6ib8c|l@-&UfcXyh#8U{oyY+`(c4?(Ts4^A;V!GLDe^3+jDR?o?*b%JY z*c%GU-^fyG9l?qYM#V~wy`i9djx43_U{tK!5e$+7=XY=}_ej13Q_~Tw%-{1Jln+7G zQQ8E<11~NAAhka{dQCsFKr2B7Q`qE%+cj|R;0F)rWGKwZz2+&Py+hu7cIP z{{8>|3$d$UBf;$pu)1K6Uek*p<9cmpFfuS0o^;&t6+9d0(aE~dOo8FWkt?9u#meU*CV>3K7c&iGkMUg47v8#1cSakb%|v zFJvKNp&&8P8eNb&PKelg23YmldH==N%V6h#)=Yx(^Zgf3F8}}kq93HP^+1VGv`4S4 z6e9z}%d=OY=`Q*(Xu#+V2V~VTXjmA6i~6_OM4^72a*l2R2)GEx=t zN^^1)iXq#dJi`=nON+r$s+kH&l_jag3OS&CMe*?g&LQ#6AwluM9{xcg&Y>ak@eH0} z47vF!sSHUu`N`Sw#h@Kc*{PKfMzJzOaZ$29M5-h;w;(66Bvmh&AyYd`!A2n`HIJb< zH78BiE;+w6uLLaS+j+k@9ONt0A@Hl zIYSw4P>}%l0Emb`OvE`Ph#@&KPrXC|w6iD^yl+e)7rc*10b*ueYB@t{UNXowhLltY zot;|A0CrSr5kqlmdTwf73B*U>fDFyc&dV>)Q%D9oO(88cH6IR2LV0FM zhJtfQ5ZHkX3=9Z;2=%ZSPgF=wgzSA&$Omtq!=XMuFQ-zWv^X`bGzY_cXUE_Wkdxqk zN-R;xNlh#+Q80xjCy+1l@)bZ~p-_^Mn5ST929*IPG_da&81nM-bWR2{cy~!%aw3K#pS7OohxmP*zAU0dE8V8BB~mP^N{ZOa)M;Q@~=7 zU%o;vc)OiKVp(D)ctaz|GKjNbNuGfLmeLiGvM_avXhozk8xMQx~5zt&A%zbxOa#yaF3SFfAH65$C186 zc||Y6|5Q|^xWu;2oP4!AftgPs=Ue<8%f$@bv7go_uQR&VUB}ZSP~aJGc{j`b8Jb#O zcxFuek~=&2ZrwbO)`@KFb*Cfr-j`T!{I4H$hQs~RS@k-ZXvNn{9$orqV^Ot5QliY? z$ugnU^!YvUxz9{rt5<(pe{#pyU1n#~k8o}j=sZ}xU-sb-sk3Yx#|jEVjN^2pJnvm$ zyKpQ;=h%Tgn|UwTn)LS(Ujck0Hk)Bb$m z`s*Y7Z-Z@az@t|}v;9>+iGIp2R$ioWWXt?Y&kL$QgpZrFHzppLkyrKVPu|6voOUx2 zcE^y9BJb|)Q(ylw%yEg=f|)12+dSL#W>PL=`rX$}VxsroIjz`|uuya{TD5p`YfO-Gx+**Oc4{|q-p`TB-23T?&?JK z-yTSM+_Lg7`{<)BQ_dT<@oaiaGp{NCFN?^}^DLd%t7n?oa<=d#+O71ezLC(()4ft& z$HG%^scPBF?H5JZyj4{B+?&gIntJC&T#QuUmD`=Rq>1a+4}*yxSq}K+?Mew$o5`#E zT&`j5rU1r_cdwckZR(x(wfmK%!-LlJuiD1{_v@xj4m)-}zrI&X=;Z9x3po<*$=}jY zc)mxSNlY`vm*Ma)iKgz40fMJD>BKxY+Vp9vnfE>R_D$dR#4mW+=y;Y#G2r3ekA9CD z4`*!beE#I`jSZDC&VRe*7y~?g9i8`C$iB0gXg_E9qF>UH?_1%UL|Ga9gn88wVMyOB?xP*xPOEDlT5DZzRq%ib1ye-?q9{kDrb6tTkC7K zSkr%@*MgZIkHt!TFaNiy_LEL`jyHesZBFx=M$dC;PR83EC-)o(xpAQ*$Lh4E#vXU` zU8?Tdm$H`0$zQAbwJU~){iC@{(#+@E#BN-2>JXa7m3Lt2!}NJ2!crW6ioRQ3+~{f^ z@iXGS^Gqy94^& z;+-`stR+-F&fg{5^o9T1`dmMqS1FSoi*SJ&ZO!{$vT*Q)?fV#NZT9qe?5BmBTX*04Zo~X9(Kx9@Ov8uSri3T=R?g8?m1`e9 zv0*y#Au#Imj~VlqsEKK6-+1>}-$HiQPJft^TvnbJ)17+yxIxgBZikE7 z+wBe{RP?g#{1Rfmxb}p>7bfB5CyaV>ckX+B<+bkI?tN^(D=RsIm7bTMFYR8^`(7~O zMDv6EitOHH;>l49zQ_DBX1Eo*VSnEzfx|n$HXM4jpsH*q$A(Kc7mGVxuIw$8V#+c; zHY?$;p!(y02ImzVGue*3t+#!zo!eB_^4d@Je6L5^)stq9e$O>daU~u)ztYq8{?5m{ zp7q9WOIg2e(zC0_tvFd%%&TS8{#0NuzT~i&+})qoABeW^*cfotf4+9puBfD>O2(`? z(g*Zbc6o?8JQusJ6UFMFH0#pjS^IS#?{sZvmAeyclBYTITK@kW&oGNWj?Xz3zyyh^rZEYUFHn82_<*=w0*+LO8qO0Eo1$ajTXkr z7}-vF`1LU3WHoPnruoO~>So%oO!bf3`}>zY-`ekGUnZw%=AV0cttU(F2;*F7IGD{O7D--`-qJ-50a4XGlPji0}S-kSK?V3C7q z|BQ>5Bpz?u6Y$Gk@q>fyy1fSu`y7h!++@}tSa5k`OY^z6{I_oPwjZxt^y!84gDKwm zg%cKcc~70&|LfbsoHaV>9*ccy>Wv>g=eRv}i*p9!o|w09)&z$dC2-E)|Mt|M{)kEq~qMrZ_oN<+I!b0 zrlHvNLft(aSc=D(NrCoE6g5n31o!>6}%|f#6WH&VOCc_N(sc zO4_ntPwBiz{u0Q7mxUjVHa{U3ds9XLsv_Eg+rK!=!{SF-dq%t%1qSJzU-n0MJ^Qu2|-C4nQ(6v}!S?)`lvY4q_ z=c{K^HW(X!I#wsTzC_#nNwI3C$BmUQJDJ2j%f3&tvUt?KyzJZ3&%qvMCCLI)6?!wv zT-mSu+7|FrD^l6?yIFhQZ=VC_mej7&70p>Ojrnx!Ki;FO*{}c6KcdLF`@{XtihYmb zjs5#wP71q~_FiDsZoRtG!*L4Bo!R}IC)%FBtt~d5b(odG(J4@zGi%w2&wSU47&@EE z6g2jIU%7H_y3zj9=;$j9e}gwiJl=4cONqZ(WK+L9$N8em!d^CK(hR@#>}!`{>*zn( zG5v8;LRH^+_vWAz+kUS(WK))Tz&?nn-_O_ZM#|#?i(8Q)X>uPpI1esWGzi?D5uLN3 zOTWqPEW5$`d4(m7YVCKfI2g0v)OW6PJQT;1qrurR@y4XD-walAuzs$ay7&L@?fEa$ z4$WBeB>%vh;*DBc687AhVKP-{-NN5y*S&RD|5D|D{pa%%<%!cC+49t@dan1FyoW)= z%qzd~1;Zy13ulL)iw}iV%?bA}*z@zb<1MSpQHNR3t>#x(MT=-#)hk4~@O zdOT{^`g`BDSe;In@~V7EVDwe-fR5Np*UNH*T~4fEVNqQ8bVt`D zsU4XSZxg0PADu2e^UW*a$jO=?xBq4Q)!WDM_1m^t^Y{B$uYMfsWh%@1EcC|11s{E~ zFTZ~4@>Rw3<%YfeyZ4<>y1pnx|D>nk=dBhYOEd~uH7z}M$VM;QJ6)z#|9t5+7M_!J zJ4^C(?x*q17OXU0_P;)B$JdCU z#PUaEhU%mD7aV)HIQaeE)~E7MW>+uM?3IozT%l5@Q~P&4{}NcFD!z2;^*3w>xn?Y# zzG|oC(X4-!zRBM|e{yJ8pAj~X=WX}YErK0UuODuB#@QZL_~82Tf0}-}Pt%ea4qRkn z?OSuC@N4;GEpt|$Po}NmO#2d*PA+h|*04zU{-x-xB?o3IX1sZ-c;$u7@8HdE*Pb|8 zze1yN=2TmTpYky?FI)WM{_n^0id}_mqrd*Dvdo?StW%FqC|SN@!~cb$?+-1S^Hg1T z+p=V*tY`8JsrS=3kMivay?Z~D?VjeWV!4T>o$JMACLTA+nDV2u;Uy#Qmr(bhlQ!F! zH@TePS@q%bo|k58+SN*|o@(FN%;;G%PpVG$UCOPEx6cZAo@8v;pRwcbXEomEZ=EK$ z99qh<%{)C>Y}?m>$7$}L4w{|nyUm&>JhA!XKl7@N-&ejrzjm_r_woCGk`3;4e%*G< zQS;5zv?pqkDPh}>z7P4fJ)-vlW5^_r`qR4(@`wI^>S@5S?Zt(y(NTKW+aKm-tv;7# zrF8bQ_OYL>9P`}mPG|5l=5Q#ykX>{yv-@Is__xpB4m15ae5=kO;Ogenz8sUqckx}{ zaJ6DH7tim&n_;)E-+QuK#W9Tg)Rc>%;rw||A3oT(wIy-B3RlDd@9$IkI@BL0hE~sS zV7hZyv^<0LdUj6AX5R@ei$82h>q_}}VExs)%y0THJ^jt+8DyDm(`c)0BF$txDnH1iT=X9g5`P-wWT)~ZJDr2{Q6Rx zUD9H;0u$EGS)}c@{!-+V`H`-dU4?Iby4fCb?6%*}C!g~@a>ZW>*Ki(RDx2I?9Pjd_ zIZS+d*0Hl4O#2Fo&Y#`<`BH3NWx`~Ir46%PZ$C=d$7pzHWsKp{*PopHl!`=SWOSs9 zzJ30GNy^VbwMYNDpV8m#=?;Cu%B&T87RTgWTnSr7Z_ zb^rd9{oh)?pGmnVtn|w&tqpGRj2fKU-@jVen#r%=>GE11bl~~bv=R>M`vQTiQ&(J% zl3sgN?px)PZ#gZEr3$IP&RvMu_q{_cgT?Ffk8k`1^>Y?1SnU?9k@GTU@!PV8^#*IQ zFKK3&ujDst)%y2XJbn6h6@~1TU#F^`y|!QOe};}rXz4z-`5$McKKLo?x$~U_JEO^t zQwF<5|0%s_<_z!fOyVmItxLMK;(uA3n``h!j(hI8SDwFoufVc-?!A}WjsMv~(|AsWkFP78=d%9YxP5v`vV6+t`(AP? z@%17aXLl^}cVKWnsi1V2$AJ6tUw`wZ2W~Rx%8FKts7ML=zDo~0#qTrWf8oD)N!|Dq zR;hpggn3SJNOLGMinB5>1~>eRvwQL5%d9nw>d))r-|e`R=yad0Yxca|s;?#&-T&Wm zjYlx>3t8Zk>+<#5=bZbiJ=MM*U$E|AkFnY0I{Sb`h4RY} zEw%|V^92;`-o*DqFW|xId*!`v8s(;kyQTX-WC$@n*>9+jIdiux$5NKV|5+tWeILiz z)*nkdv25j;=-5~JZ*EP@pEO@z$!&hE+eFL0-2F@ak2ni5HBWVZ?WcHQN3#MGkHj{6 zxye5yo<)dh*yVYs6?9$iKKP`(q~-zJR#h(D&rIE%m5sY!JyEt6(y&;2FH`JPiD;5^ z`~B?>GKxRvNiD557hyQjCC9?-Ajo;?N#x$EVHY1?Eqmebuy~^Wy%*J?%b&brcys6} z&$8WHeE;tad%h;q_^#;&@i*$q;cOdDte-jY@QE;)#?)-dM3K1C)2(?-2iW(OhZ-Gv z^TobX_vHR)RqHnwwo5f^SFz6ReV=?>;m^{v!wni1b6Abeadm~9Ty^~V!Z$|0q*$Vo z#AJ0QFs6r8mCpWNe#OvmgWAN~`De`By19>gWIelC8TB;mwNDn)|2pTOEoJ@sOB;Uj zK0aI0_L}9^Tb6w*#qWQS(3x9bvVF^Ut?nVR-0LCcm)iqI$6#Cq7BAESo09uv$%&S24yg`Ard5+~0q@Ja2MTO0@0e z?Ok3VXvmW?+wQu6-I;BdPhIUeypHD~qrvz8T}3$yAH6Ef`#eit|KjQM;w|?MX76KP zb7P^)=`jA;-G@6Y8BggS-FVh;-xfBFiW`rXEEY0)TARPE?r#LcOSub&{;yRz%0KhV z(N%)er&h}{TzdYr>09v(foTSb42n~A5C2zOxK^}ff@b~n-SxLO&s(qc_M~R&l1DK* zpADA3uwQjy;(?g1=Q{JQtPFX=({`5YnxterBlAS|@^4lP?!|?zsJI{Y_};#l4~p%N zOS=Qvj&6Q`c3Xk(^d4){r8#rzpI|D-*lwlOZ4jppUY;PxyIx6#L}Ym zmb`v*yJUJX!>J!G6IagD%+{QGNZ)hyzO+f1dFfkk-Mu_ppSAA3Oo8g{cY$%z&s2iH z!ovE~Ja{P8yd$RB0@NG?(?)&j*KCQ|Q-f8ns zL9Vqf)Of~*4{wBvHvhkT@Mx?3rMmZA4u{_N&X4`2y5DxfYxa`@FaFmjxO+dDZ{~7L zzGuRzbL;m1+_>-6so(DcB+tKC$9_MMt%Glp2kY7o&Am1cuL=}QnqMm*xU)8e{mPTa zo8mP5Z539m-}#{F-mh-8^aXmAMNJ1b*@tRBn&mNN`ui(;?Bj&q{rRu>S30`s?a|Ol z4vWHtn3|>h{?|X)_1vu~h)*QEZ~ymVEw3V11nMv%?~&9=S+{c z-}~v{_x}!mdbi6Typ-KH`)RfFe%lQ*y^r1A`s_e&^31u7p)x0?FU-?r^wRL^I9iy0 z_>Ax&=N%uN*>h|iQLkTDf8hH5`T!=DS-+z$TykHoCmASax4&S0gYe-9 zJ%btXM-JB%F>T@JYIJJ#6wRQi`H5FOVcU~3rjpdZ zQ#Q3$PC9+Ntf{QAoT+!>`XBSYd-&bYP3-4unfs`@R=?%MQy!D1ZM&y=Y}_(=wT;1h zjrIOBX0M-L&Kq`Tl7gJCQpYOumT7l1YwuhRQ-4=8q1)k-{MN@c2c9q7lJ+z%@#W#U z3O{TfU!0QQxOmQ4KDV+M>lv>Y8Y`|{(Fu3|d-HA1_c=-{_O4o6E9A%C8025=MSBDpIE56=HnsDrZYQy6w@y@Ki!yQcW3*#y#nj+x1f0LVQb?%D#sR{I{m9S8Z|4cxv4|v(}Y2Az-q; zM$%@JW(7gnn+tk#wGHL8Qy8KQ=5##U6Vw&KEPeI;uJ3c+Iynl)7%n+#XVh%w_WnNO zQR9U&!Ixh)o14CyBA_52y`1}f-TB9v4bJwKRp%4`RVf^OH)T#oXdv64qRRKn*P0f| z`khOTy1L7Z<=%UPBQvM4^TgNQz9aGZ{k4VF`db&Un!SjevO)A6=gt2w+ZbH#M7m6Q zzxhn_uHR=5KWKEkb#bE>r}e>)(|=Zuy|8)J~6SOq6G@Px@}zVjyQ`9sc^sk`(=fIcKe|nY!(f z)@5#-$Mcm@eM?o#%*y+Z7xaA2*)_$WMIdgax$3|C{4es>{}*Qc?olY|aqU-M^x&q6 z)p5T}|BgTRU-;T}Fz~(aO^Gz^v2g85b8e9RJ6pDBcT3w+<7CwrLQQ@xGa7n@w%A|( z_mE5D+|t<()q@T#ySg`I`jfk%*N&zXq`mg#ZYgJ6v2Ec>wc9Ns>02LccmAN55OLvY zi@}GGqA&Su!3(7phq~XnwLdm#>oe)Fj49ctnyoM8>E32M|7O>P%gbVH8@6#SFJJGo zc#HA16V;YewI9W?1oOow=D%%Bael5)Asn}5cCy4hrG+vb7uC{tzF6+rP){cLt*~O3F0k3iz8>K zEp&-Vd9$+oM9?zh|7RV=wHGY9xvM6hxj~U*&dq>C5Bt-p*Rv0;{@Gao->B44YuN+|@s5 zD7Mf!|C>R`n_ruMU9T5CQ`!1H;$G0jxWD?hCC?f4SN+T~_+j^f>FO-Qnf$+;4sCe- zcsZMA-!UHLTRSuini@`gzIUf^WBlb4(p?-0M-S|KadL5@@7EQ3e!bT}K2xtrX-mP; zrcS?`H};swbUzc5GpKxNt-kEl{|(1>+)T{$*u-Fe?*DdcjXNAs-)=e2nEvp){&vZ- zC9`Gv7nrx**?4)m*!IbX=fBPqUT$}6&oL+SK&d?%8Sk&9G6$_L&(igNt8OZGNxn%h zFNX8?r%AU@Yrcy6Iw?Y=-aleub!KzOnHA}39to1Iuhw|?TuHEK{`o+ex2w(~$Me!N zE}n#zO|r$NH{6eHyz?r|XU*ouy>=T`^C`FQu}Jx~aqEZ8i{kp7+$8=~WixZ_?cCts zxpZzyoTKYvSP?fsFQ9LuE%g$4We7qgbNH-CJi?0UuF zw*mM61@raKzR9lYQMK2%SCqT#%P_~`DRYA7$@%Bi*I(Jcb?@$u2@cGUN~c|z@nAu6 z-lfFDqOxhv5B2@OqLgo)p%HnZ{=kV!<^PWY;>#~P9Ci+C)4wmZq^3i6@1;f89-Le# z>5*g7p1VC!pFc$Dq0v6AY_X74R()Yg7aT7yI^l3TP2aL*x&D7&hI^NG>aMY$GX2KE z>0aAi%7T`gf7$wem(GsJi-FhQe)yg*U&R@9A)~rU@9UchAqO@nnMU^Qsn^f-UX-#s zK)^HYl5XSEeG`<7x6c=~eku5*Z%eGne{Y9Fu7B;P8?M#6@a;%yy+cw^f5I*jD zv^6<)GQZ%}uHf*=ES6ah%x#}-{uZJYUt3|dbwOFu{XfejvlN`Fu3q`6IZ;CTTbz2) z?)1ihRTBj!SiEN4daUR4@fQB5>ssm}UhUbFFD_c&c1dgErLa{A&YjnJOJkhW=53yQ zvZYW$cQZqd$nHnQHhcChs5DOsSv}7+rK#Jpby!>M27SXr#YSM|m=cwJy<4zbZPVz_@cWq;qY@Lk&G$4VV9uMa3SI=K8Rchtny z`$MwTM7XuDpY&PXbaswQ>Zjk|KOb#fJ>_<&w94ZvtL*nKIsa(!D_tgEg?VdK_nz1s zdjHjod3&#JG8B58v-YaiJx%AS8m{}+X7U%_;6E9->RWcjDmnW=rP<2^SDkUWto6Y$ zs(S73n#-(H*`y~vdE@xZ=+8A{A&xDrn0)>)j(*_ge*;&(yT$(zi)_bl&Uxs@#N zAmxjh`wflDQPa-2Z$8YwyY#no;0)6RpCI8Ut-_iX7Z@89og33mZVED1_|9{Xjc#s$fgT!JO7#J?B|Np-XWS0}4KtGccpF|(C6Q4paixZzl z533`eK^vPRpG7k}a}X03pMfKvh7+HH6Q6_=pMVn|hc{@MHv;L~Ppw)Cvd;&d8j(ier%r1Ni z%`6doHyEq<9x%G`ym8JQ@O{Aut*OqaiRF0;3@?8UntXk3fZ9AD^)UIb|NiHL_@KShAR4ss14IXa+NaRF%RqbssQW+% zt%LZWZM`5G)UE{4ptdE525m3_(FdUS4M4Rq6hIlE_Bu$O9YioNFn|s^2QhCzJqi=Q z0cvYAFfhQ}3BD+dfq?-k%mA|wMuW@%;otuu{(*(_KPZ0&RO5drA140+%C~~b|Ag{E z2egCCqc(=$`-Wz488m*|p!75-y$nikgVM*K^ff5`3`&24(rn} z#s?f%*?>V0IN4p#hDpk^#!Up3j?fPK^13Z zfR(?f;%p4CavN2godH%qpo()a!0HiHam@SRK=RBCTnq`&audXdVP*zy1_3PP7&8M8 zg927@EceQR@3!P)cz}N299WzmelI7?P7uw^Ai!`T5yV2p%nX9?`$myvm>Gl^VD&nx zxG=oEfhsP-fUW*vW)Nk7)z_%%#Ta1sPoav7W8B{dl4pk3${-#DgX&ophL7OANe~eT z399ayu!JY*A{LN%0$MnO?p6Yc!|wlrn8Ltd4sJss+yk-?BjFEwXVI|lcJ_d(Skg3p1Tp1V`*1*JLQN=;K zXc-y!7#t!|#W%s!2cn8^g}T21+K>W|Nir}n9EYiQMOA+aChm(WeikO~i7E~{dLHZ^ zM^tgpQDY$g!s;#X_$31a1L&SmMg}nk*!^S%P;C#v=8G{bfZqGn0gafKQ1`>icks9+ z0|Ubsn7As$0Py%E0|Nsn;ehOg)eEq(NiIgvov>mI3{dkEAlev286ojI0dzqusC@}- zcPc~0Vf7|>9Fl>7K_6@mAAo^GY2}B6r?^G zY>pTMtRA-m2{JG+6hg&e^)qP979<5aR~BRrEPp|-TLagh*wWi{usH$@Iq)5hAX6Y1 zoBE|-^_b77UI)?s=)@4B6#5nZ+d_ zUP)y^Du^ylEdlNF2QgDpK^xMOLCkc7XfF5)++yhY6R=(F$Xm7J;{$?RLqa0s-9r7G zLp=Tc;^XxU4Gk=eK_Vx1#)9^!t2W(XQSF-P7yf0K2jlbUQ8Xt8yK2-kywf zvohp5W<)v*LB6Uvpc2bf!2uYz^+Ipfh2LR}dfzfQ(J`Q3lZ@~L=(b;wH_`46M!$g> z9S&eS zQ7?`L$0q7k&=tw?7*|n){0F`58hnv=5w>f*K?kmYM{5}3j!86i* z)(m>ZmANH}Nep_$B}EWA1IEhBFGs2dPVtQcO~X#CNt=PL>cswii;WalJj#x z=gT0M?_{z;8UjVK9KsFk5I1w@*JcjoFKd4y;76!F9K@1oT9kzlE z7bC`xL5dg{7%UhV7(ipzF#BQS6fjx=Y9WXMHHl&4&#-Z3PQ|qj18he>lZ*{&@lb5aSs?B0a64WBY-eq>R>deTL~J|hVfzJBQP4|K9Ejy_k+Yh z7}R|L$-(r)#!+B2EZ{(X1gS^&Kj_#JkbWnSBm)C{yahJy0vqQC=?9IWqwB8#_X`;q zpwkNs9?^T24Bd!gFl z=?5kby5#|sE@1A5jR(Q#Ra!8e5E^DLgvY?pi)KG;9tTE4ry*dmL&i5ieQbybY`h9agZfVp z83+jrHwce`VKV~*189r~ls-UWuz9N$P>a#k!}u_IKj@MXr2GLJ|Jp#L{?kzZ!|aF6 z%k3bbALLdL2HoukihG!T*m&9jsD1`$z{0`}=5AOz0Nu_4ia)r1=sej0P{v|lU;wS> z0@(w@F#RwZGOoe^%ch9&xdMm|4Vb|YE=J$?Ido19rVQ4v(Ew#Es2o%)m;$*K%zzSa zpy3A_=Ya|{!1Tk$H(=s0{m3*lh+s;ZU<|G5-VyU hjEAs*hj1~JfjWMqH=W(GS35HCRxBH{p{7$lxT84L^z4h$9y>#U=MaIzjU43=H6S1G%r`fC3`}OCTpmOpAemL5G2X!O8XNn_Z75)tK(- zFTPP2A+xjhBj4-G@A*LbabW>Q1_mK4l7AT)7@$cBMfL{{^#x4W&9TIxej5&P83tI2 zL9v$MF%I={IP49@p+1oTyE~Pcu>1D_4)v25u&dvILtGn&dqCL}Tlj<02P9{qhJz^% zcdo}_eh?1zRXEfa;qY$*4sm`Q;eQB+`5ida&%%-3I&qkD8;5uf4slRXi7lK@;!uA9 zM?5aZ5e^nO(rpj}1A`K36oPr5ahP+2iGe|YL5xA;GHUE!2aAg{7@&!Jg2R)CLBJSn zEW;-V#c&#`9^D*Jc_qZa$#CERj`+{B!m{A7^wvc#PD;KZ`j zkc^_##1w|y)ZE=Ks*65xgt5< zH#IlEs1l|Mq|d)BwJ0qozZ@b4N;mN?uE7iem7v%GM-eEfJ@Yb4eDhOEb5c#>%}f{q zDj}SB$CMP$yb|a9yyB9?JW#yGyCs$+=0FU~$xJG!EXl~vGtx8HE6&$5)H7fJiIsqT z1`+}DlR+#qhWON!#F9jY`1qvaVo+);Dq)CE%}Zf$_wjUcjyKXXG=Vb_EF(QrSQdab zNnl)XT@B&DWMHiakSI(HMuWr{z|9**24u+0unU|=A@WluPGbYLcJ4sML^3mZL9K%4 zP=2XYCMU?0k5FS_?Fv{ssR3HJt$?o~cmgz>U!aLU5QnH= za2^uQpf(^hDS#zbAc?bsMIgimByk>y5SZM7B#zubJb)yQTt%Ef5{D)!usIiy#D&2k z5aI@sxF|#jOg=yo2etLUf(#4{FObBM>&p*F;;=S8NY4)>aaE826kj+82_H}xfZ9+{ zVTKz>;-I!PO#A_oIC3t2fh3OHPx^o)4vGVqIX{rZVR;EG2X!aNJ)B?x2*H6Q&IJ(y zlLAQM++Yz1A%P^$3lRd73P|Fhx*aUYz`&q^B#zvUH$V~x^*dndEs(@PZ2_3L1Cls2 z34*0Oki?-$87v-vBo0l=VDShfaVf9}gh)UVmxc&|$qXcMXpsRHFF+EP1B*b23M6rP zh!B`;KoWoVLv630`Wmf_2mXI|JObRh73>=eYpV4{{-TLlIF_^VE!u*ACx3tHh}q$KzvZL zdszVH-vaSLN%Lg_n12bx2PMgu0bu?q5FeBjUpj#Khd_K#5`1X@=I;XWK}E<*1u%aT zh!0ANF9pE-RUkg7D0#^M<}U*AK}E>R5C1^^odx29lIY6^VE!Z!ACxp-UI6pEKzvZq z^6~(f-vr`=ijz2PN5;1z>&@ zh!0AtFB8E0AP^svL|+Dg`5^bEO#np@2z&JMN@_4Lc=VdSQ36r6??F`a8;)I|9^{L& z|Nj5?=;eK;4w5rH36krzJp-aZO2R+|+Nyv5|EKBk%eR1xWANy;Ej*~e5bDv(nt4!x z!Nc;0N9WTLNsn&UTYDi%hd1{B1BCk6!=O}y;CuAi8iMronreZK(fsGp`PAd!KW2~4 z4;}|!*n2P@^SJo0M8cz+^&-?j9*}`B`_av7uzh$yfq|h^-=o=f`CbJEhER}ucszP- zgLWw}ymr|Ns9##=7%>0s|vRJE#lD@cD2Wzq|`XdF;!y|Ns9(_>SR@VIIAr ztmzC4j-ierKE1lXmNPJf2K)4?eq6@D&@JEX&*IUm`*bA(gGXnL$`7Aj*_*2w7<_s~ zFRcYpyr)-yDApsZ7#KS5^KUzR@V$gbH_IUpGY z!P%H+k89_5$Aj-VK*CPOK6@F!{C5(L2j2@gHb1imi8~wf>~=Qh+2q)H&GFzn4v?_3 zG0#TF&T9u>NjM&SC(!)J9xAxOm}k1->CT%6PqG;M{c!0n`{QVMuk(~^=XbE0=k|`> zAyXNgjYaktUU2FBbnq1iNZgoZqD$u|$Aj-A4!#203K5*pdFtRR4ku%l?ahzuja{ZP zbe=l+5~QU0p*=*!WJhC`E)UBRl@I)_od3aT+DVmxq4OU9w#x_KNqBVEsQmEg7P;tQ zJmn)K8a{xTplCP-QUDSMN5gk;G)(!(0E>n%9>!B{f}`Pu0ROfFU~QlrWjy5|BpNPs zihCSPfo!>wyiS_v!aCU20%fR5#_+|zp zC^AD-I6QjSsDQ??3@@d4bhD^xFo48cR5}C)@Q$iMAIZ-9(v=OL%#E-j!E zkHLfS^>LRiU?x<5^ABnM_UDWY3@-fJc(|JnFuHW`@Ov~LWVF0c`gjMZW#q~D>a{XF zJ$7DfKE%kst%nEX(GDJVkLCl69?d^2N~D{AnU_6uPMhG;>+z)d0HYf$3gOXx zh`;s2-~az#a)3(QupjX9G{m#>PpC()t+5OPL-0;eI{*|$omW3EYvOhVP#sGYDIRE>LdTNoaAvG2$K|F6%1Y9x%;y!Lrni8)LasHFrE zGV$oOT?bMHYFt5t6g_%vy+Ho%Jod8b`~UxG6FibD1YWv>Z3CAl`#~Z8(hMXAvA?%M zW*=DW&{vT9&|r_w?;gFpDPU8sdGw0rN-;2aG{12`D)U@a3=9u=^tz~s9CuLxHPsl7 zyMRkZ5DjWNF?bwzQ2~{Y3;`fz24GSKOj>|Rg8;(=KD|CF20pzmDh@BozJgNE5rftP z{4K1E3=G}i($;jkGy_Ag)Bollto-frObiUozgYNNx|kRkx_MNZe{%4*s(}P+R9HCp zrygwn#mGPPK+C}r&gNfi{H>sY{N`WG{4KW_KpNRVRg40E>sxRt{?Ff%!~`m^OlL?k zFzf}jj$ask{r?|iKWJprqt|xvHU)+k|3L2QJbc^%R2niIcL0^~4Baj&Je|%Gpvd7Mu!5bxH3V#Fjf#Rt>wo@MHBc4x_ND57P^tr` z15m_)qW$$PNV^IgJTKmT0fj;76_0M#-J8MA{UgP|0CI@M3!^Xp|G&%vo8SWS0_#DD zifjoG&*Fs;$V0wg{{Q!AJ;2|p531y0`6W3-g~g+{TE?ThL`4FYdtL~B`TrkOfF5@i z0lB2pS>Po%Bx{1q?+tb^{01sZqCjOy?_^NfxepXkAThTe|Np<-_wWDz2_C(sjpERP z#G{*)733yxQBn+Y?oLqK7?RGrSzm4f`>0D2svPVs!viloK`JNy0|ku(gGV>(L5Mmd zxX&#<|Njqe-1Eyb>;mO>k6zOpNd|`3eQ6Usx>+Ye)N@HfL(1^Li*FzucA&ORY8}2EXYY0uD3NOZ!CWHR{DTc#+IsYw9*|^U z;BTGG!@$t|gSk|?+f}01gT3_tzvqe09|wOj&;0(g^%8$;77qi%i@l$~@#)!ll)t4B zB*63e|NrJ%0XC0L78U+>HVy`cZdU=1UQrQgkj*Sj9*h_MKj4>VF#Klt|3&`C|NlKZ zk9l;*fRnKdI2rqNe&BC4;05^!l#JmmGDte?20Na=Zw3pfL6qv?YWUxyH%3L_<#JG^ zD9_-)zwQ6QM-s05+b$h^E^zPxh;`D1^OEDihXR~G__v*O<==L|fq&aK&J!-2ryLJH z;5hh|F$!Z9d68^W^#uglVgWi z=b>&F6%|k`whKq-vee)Ztzi& zaO`zwbnGo>b?uF3_f7upF~cMI8>kJ&=-BJd#J|nP(6P6i%{TeB6aO|5Lys9op)xK; zzOpX-+gLy}bD(^7^q}GXl8;_)s ztAdfQvM=L1{?8NpM3v6#y^ib$ z-%GTfG18_w>L ze96U#Ma;FsMUCk_UN=7;S3trtQ0Ir#)Q7x{F4*F5CeYr^Nz>7xQN=*8jp z|Nn!^YYq?16CS+*9G=O?eHdSOfU2qH;~WeO-wv|yx5jWXFnF|{EaB(hX7KGGlS79Q zf9p(6P`FFDfb*aWzvl_ZgFl&Hra;Rhmu??W{GH_QYXg<&y{-=6h;s#%jV>x26S`f& zr7DL{=X1~fpoY}{{|x`Zk%km|$3Oi4-|eHK;IZ#NNc#W(|Bjuf9Xn4scAj)R_*w!K zA&v)Ma`<#!aOt?+aomxA+d)w47u3w^yurWiriUs>o5#V&5+0lvxdu+1Pt{(C5X=)89D z9ft?!4F~>h_k0w8cy?a*IQZDW^Wbv}xS=3-dMF+S)v*#joWFgO|9N!A%D5THSh#n@ z*fO~G#xeRP-*z(+k#O$_k!5i04P)|6zT{@aBjDcQBg){~>&NVyeA3B?hr_wUhnK;z z*N?>``J{^x3x{im3z*O9k$lp@$cDqQqXx`p1M^Kd96L(De0GoIlSU#Oj?Kq7Tr5jK zxjclIfxo{8lnA+TXz86Bgd z;A;2;)UI{3{8GEW+f}6VBRCzoXg<_DWO2+Xq zZ2rN)-!ctkMDl;%Sh7yE`jJ~f#|*iDn~F}&Wf!2GBd>A ztRUTH5Z$a0-Se>OW<%CJ6{?#Jr27Xe*xzg*-SsIR81}Lw>x_o#WC!Wo$I8Iae1N_A z2YbDaNAiDAk<4QW31$vZC_6$zSskRO`3Q%j=*(lb2ZpM43AAgDBf5eg=kJ z^^6P*FK)jAmE8=Wbkq8czi+}{P_g2oBH__|)B)78YLWW|>JF!3j}Kul%P#wOqFY3%DFmd2!+mteWdcX6kST)p8xeov;e7Bbc%CP)9Obhcl>p z>j;L`Y$Ylp9l@;peSCla|MyHj=Ghy=%HYB5q9VcHGW#c}RdBns>qWwAkZVEhHBg>7 z|MLI;?oa`bZr0S5;I`H@Ay91y>e)Sc_5Z(5=X+PfZ!a=m{{R2-1-MJ%z|eYgCSu`a6v8Xh{FBkCBZOB5T=4U^9A^Z@eTWL9kLh;bRL*@t}&R8>*KHq<0-y zFB4d=4>-l5>t#mP>krk-4ANT!*2~=dpPj!S)IGqomjzj`FjOxKNUs@KFAG@j6>w@r zx0e-J?{#qH7^1=o())`U-Wgc+vLWl84b{sA(z_3=m#z6fdwl|?d)X2CO41#B zLsZy7db+@R*g<-9;CfgDT#Q^mVawst;Q|U<7g2^1V@FsT4+FO~c;y8_iQ6;|)GF<@ zE#qNe*i`~biKfvIH8OYjB7L}J$u>PHA@^QzVpl+FGw+kx+sBQc5;#W|AtJ}b%)5xQ{ zgyV-tX9?F2kKQ5|#)Tw{?!|;+vw~c^Dr;V6L z^C1oo%Tq<~Uvh)9zYA!z^V`cipFsn{rir`^44tPux>+5TDlmW=IN*NV>SzD|zufg1 zR-bxwvq~-nmn~JiVBMg;^z^6y|G%6DYRnsS8g;vH{ONSz`tx%6H&CqDsJyUv`u{(; zw)N;WodfE4bhAEPqQLMn={Lw;-by}jD%}BUoAufr<78miRR@Zez^DKJ^KW;)=N>q8FoleL& z*R`jRNZ@aM@$3J8L`1y2`3r2Y8$_2n)Zpz;{{Me{{>1{2t-ZV_L885;91!=4f!tdR za__L&YEft_qmmkcqAT8tucPH7v%~)_N7Of|l&&I&;q8Q}()&riM$N5{@K>~+B0-Y`@ z9Nn%0%|Dp8#@3$lZXc(A!5T#iQJ$}ZL^ zu%>YjXb8o(^F3%JiQ~nQhw$d{{}<^GK^fyeD2iTWgCx3HR9^E!#$`I+zu*9Oosh=} z_*)xUFa`*~>YINs^S7@5`~UyT{=cB{O7J)X`@{eLU+)FWgStzgHbvQgP%9}F+S`2# zPA{(o(k8evo^`R#Q4!(q4f+57KdATAdEck=8Mvi{)MJ|Zn5h2lVNm@G>F-{J_jhf? z`CC?jYu#FG-CYrT{+4ctG`8NZh2kztE1$A#Q`?x$R9?6$pJa_;qoOo0`lfQZ} zgGTZ+Pk?4zdMh|yxIO>{CVD5fAKZxr*Yl7BoqQBhsd#j=FoEloT(AlkP?l%pZ(Yv- z9?%p44OeUhH+(}>Bs^L#@waq>0va?9W)l;ahOu5i(!V zE#TAn&7%{eW%C3S0X`}UpdzXBMCbW~FC>gyWe&a*jDUs+BYHm3QbUl?BN&c_hQ-9Xd+oKw_YADaQ^TbN+2S z2B2=dgo9D3LWi$BsAK{aEsh-~{QTQ^I6!g&4o0Pl9li=6IZz3MEXUzsRH|eYs@&nL z2$BYsH8AN8UnP(btfX=55aH+FCc*(OX*xoc`Fm%Bs_pJj8QCw%45+vVis>KG5vKL-=!4Z}H z`~UwJdUru89gxOnLF2=76c~a%dQBJ31=aqxyFg>>CmnZuWoBS7yyVfzS~yRE;l-6Z zptgnS21W)3kOBse&f^}PhhNk}gcpH?L2Gb4I`6;8gosTCi7|uHdFTBXp%AeikQit! z4oICNM63}c2ALST|3VicRt6FSt;qqYlZ1$MFu`CgjTOK~=B1W1q~;}q>|#hsh0xill?-4fr4}(1r>5to=9NGK1{}tD`FXmj6`=L* zc_j*9uPG#h-KdZcUP7*r2wPgNpsrf1&fpBTJ|#6LwIo%+GYm;OKMk9Huq6x(3`8h} zM{F^8y*xx`XkK<+et90uQE92EDM^XR*&ttoQUD}?0^9=>GK&@R@=FwoOA89}i%L>c z6cY0)bMuQ*A;vIxr&hwvM@cw3U~Q_IP<6;51lN#Tnp2WlkdvyApQd1;ppleWQmm0&K z17><^W=TeBk%FO_LVl5gkqJ_s(gej@UO{Pz0whL?;Q^AUfE*;MnF^VCpbU^+0$vaZ z3QA8R^p#|!DnP><;wCHx`Q+`zB$g#+g7*u6ECZ!>1z1W4*#`}Fh4P}rf&ysx z=9iWzfHn)1$Ad%@i}FkJQb1}!7!>p{J!z$R$t9Wjc?w0TC8b4qsVPwZf>TC*8q{Zy zD8{NUB{Kz-DIwYw5~12b)-a%^-;&gd5(V@$Y^_j|ky)%zoRMFe12!iEfM^IGq5xzqln)kQg4z%A z8Q8T9VEaLGaNGcP3y2GL4#<9x^FRV%8Y~aufz&ZU^+W6jks$YjoC&f5OheRzT*?6A zgXJOG8Nh-dd62;%_kd^!AFKl89kBf%jSzXT|3TgYn-4MotR7@D0|Q7LVm?R$%m;@* z$lD+T!8AxcNHfU!Ai4qMO)v+fgn;y0$Bn8q3_CHt(On`g{kq0RN z34!bf(;x!uB9J^t7Gx!ehVsGkAOgY%$$&fs(GT%Im=AUz)O+9n1gi&0fh=c&xE~Y{ zVDrK052PEU144t;gZvG042W(3n*#O>*ir}|%mg`y0m=ul!5GX3NrUu3{137nEC+G| zL>{C76n$X#gDnQz2Tp$w*MayTRUq{s%}_qbe;|$Eum%|nkq5gUBo2`WX#_<#)P9fz zSU<%7pm>Jphxi}F2U!88LFR${4e~LFZUCDFayf{{zy#rgl!N$83{XDEDPS|fe2^X} zhVmiuAp61MQ2ikLA$+Jj6WDx^5XgQI4bl%*4JIJ=gB64M5c@#^2vHB!57G#d2l*dD zL$pBc2Zu0N9I78A0O5n}2l))<;|8!!Fb`}hgbz{-u@TA#sR9Xt^n=*olYW z3SjjR`$1x$@CDIu43Y;~1Tr5)L-}BNki`%_hy`*O*!^J3A?m^I2T6eK2U!DF4|V}4 zdxO#sh=%G1=RYtXVm_$+f#?P&0T2Ol187Aihz+74e9$01NQ49AMUXI5fP(`p59NWD zQ$zU>5e^2ZJcP@@0oBjJ0TJMU=!b9^K-$6Pb3m9NK3G2ohy}8h0ivG+WDtZ8k%t-p zG8JS$2UG)yhVUT@K-NO}U;z%O{UD!#jRPeEh}|H0FlGYtK}?V%!1jZj2ND3&V0jP^ zq>clWLKr}{gG9hIL>|Nii9_{+90FDk_CLtkASZxnkb028AoqZ12p^&!WFV9e5&(G* zdg0Rl1~Ifw1q(s-gEWHppzw##5dBd5A>M_A7}z|J09YMFKgegGgm1Ee10Z; z1HuQ{4{{yIelQI(4I2L-IWQBXivg@2VmgQq(GM~ciXrldBn;w%Oa$2vqM>}S`5==a zd=Lw4DA;_6B$y92A7nIGKREm$vQR!$9;zSge~>)Heu)1;wu0RcW-x&R3mm#2K1e@E zGbHhV>L0K?SU*S{A`eyx5@P_l59}~V=!3!^Bo0;zvKT5476b9Y`a#-3>OnNfevoP? zA1V(L0a*+Vf3RkVJShG_zJRzN6b@khU>AVJA^JfQATGrJU=~R3yNtd2Dt(0 zcn}2$AGRA+0h9?q(og{fh&+@BI(7-HUID}cDPw@jLlr1M^(!bq1Qa0pAsonAIw1WD z5GKeFuzn=t!1gOJK=gxXuzIKgAWPm0@Qw}*TH%?Aa;Y;U<~1d zm|*9C^n;uS5&+X+c@PhzPXUzV89>ejiGXQ{JctVt2m2r7Y>)t$2FZgspwI%*P(FwW z@(#%VAa8)22&N(OASqBFfWr^!8wM~9mIv9)0OmvVgO!8$5c@&?2HOYmKgcc+7i0$m z2gsWszd&gSAEX3=p?r|vL3$Lxe2^4KJ=p(XDKG)@F+?7u03-ymA54P?unR%*AX$)= zAR5XC%Yz6AA0z|v6huEL;2`Qj{)h0ue5n24fC5<#j(?CmR6jWVf%zb#!2tp?AM9~Z zaDuWCga*ljHF1FXU?xZm6h0stj=}OEX^=XI{Sb#j_@M9sSqKg*kPt*YC_+H41iK%^ z0n3Ao0m*|52L}!VDE)$>6(j?pA@U$CU_RJ<5D%;#YCp(iC?6^h)erGMDEdKGfN79< zVE==Zfcy`kL4E)UD{z4MAmv~#1C$SySAfWa)Ic#<9wZClL*=3RLH2{iAua?(07yMZ z2%3Dr=7Uv(2?nr!kZ}-s1*kkkKPX_q`auSO)PwvFp&?p8@ek&M2ylo%^n-&A%mKzy(~NEb*yhy&3L(GM~J$_LvI(g5Z|{15RRND;*Upm+wm4ZG6RYs@=*Pt z@(08O+XVI{SUhx zVvu@}c98ub8p;Q$1vvoZK9B(*tH3lw9>jzg0Oo@0mK3+V}Qy-6*NHg zH#9&58X)>19PrpV*!%_v6J!WjKaz1!d5Hc72B?0h0U%M3{S8nJAR5AlC;(Xt<%0zp zp!S1&26io|6o%Lhk_Tf2FdxJOI|pPx$ax?EFb$Rm@j&VtKnaHdWIIR%Ohe>BT#z`} z{~%|B1i&;%9>f9J52B%b5EJAbkpDs6067s%L*zkH3?M#49;BLq0pvZf`#=(4^BTb6 z5Ar5NKP3D?e2@+>4KfcT335J&RseYu%mFC@=?BpW43P)f4;E_x^Fd6IKCu5m!2;!g z?FaEe3LrE@Jybt9{6WD4vKc~ySTkD&p=2U!Q=H!wi?Ag6%M1oJ_9 zpcu-B$b;+$i$nE;?1%87@(p0~K|&z=K{QA|ST&e{*bi0==0ofU1t3H{R6j@~NFL;W z2o2E!wI7@@z~WH-AOQ#;Y(L0nFdr*`b%J?dQz3kiVu+1UK1dZv5TqZ(2BjD<4VDM7 zpcujjDFvAcwjbnts4Uq1pvVC02U!SGk5CQvKQuZa2@E0+76K7q`@sf4Oa;Xc#CH%r zR32g?NCK=M!~n}f?1%UtWIF?c0@yH!TR{;F;e+&p{ez}XGt z0kC?I2uL5q{~)zcd2slF_;3tT53&fFeZl5~EP(Ps;S2I1SU<>Eh2%fXwNj5%K+s=1sEan zP#)-*39vlq=s<{as612wBO^pVBO^qB5uzW$ft(i%($5HCf{X*}M=}nqpOFEgA4G%I zLk$3lLiu13Mn(pRevkynQ&9UEq4tAlkb00)LDC@F0b(~uKNv&!AST#3Ap1ei0||g> zusnzd(#Hrow;FnIB7_gJALLAs(O?>)9_%0xA1n{i4)GL79%L}cJs=vw2de;i2W&q` zBSan?eo)^qfN8LLNPvO(5c9#-f#kvA5Art1Krjtb4{{vHxggpBeRzK`Nnqu=x-bAQI$$ zFb!4$3J0)ykVa6jL+u9#6oe1a53&x-hw2A~41^Ds2l<-;68sDf5E^7Y$W)L#hz$vD z2C#k*ACAH5K`KG|AohbD2sRJme~>dF`oZZBWdp*nJ=yAo3suAaRKMK`gL&knjgdf`S_y3=S|Jl!ov@ z#(|_68K8WSQ^0-#^FeB%7|MspgZvK`hw2CUAHs*qGctnIgM^?d25df9HJD(4%0oGz z@CP$NJ_9)!svl$kNE{UY5E^VgNEO(8aBzWr3^5-R#9(z0{UD!#k^_i#0P6(vz@|d@ zAjJ?DLir$7AVHA(Ky0vMKq|oUAQ32r@IgvJW`e^H6m3vhu>By{f%Std1gS@;2Kyi6 z4X8XsKga-xX;A$jjUYjY{~^AE@WJi_34ql@!XFgkb2U!jZD6st?hk@(|(_r-=7Dyk&evnyEd2slF_;3tT53&gC7*PHPMG83N zKn8%rA7mL=Kgd{!dXNxE9%4VpC1Cv!|AQr3a~)!2l))_T2P9H*bUMT z#*AP-hzWKMNI%GVAOSE9mIv`b>R3P##{hCJNCZqnX~`5-Bfda(b&QeXn)V~9LR0Z0gBKbQs)U>Abq zL9!q#K{S*PmIo0KK1c@SDTsbhz(Lf5{14%Q`B3}80R^%g9RDDBsD5zz1M@*fg98L) zKG@@+-~`7%IIuwSU`>o*aWE4k1_~b#4aZ=4kTggg#D0iFA$(ByfGh-u6-Wr89%Ki| zm0ArS&jOW)=m!NXSU<=Bkb02+Av8n_DE`5G5CIMmh<uzMNGZrnu=_#I zhRTA&4;p=-)WHC9ABYc@2k8Ro2XP>}A^JfEK>1+%K^nk(i2otJ11W;|9~94E_kkq9 z=7AVsd5HZWe?x2s*$?tI*ffwZ3nSEUh&;%CkUS{-Av9PX!UWmD0Of;B2k{~LL1sWP zL>{UiRQ`aNV4J|c1nUR+8)P4d2B`yhd;=nU@agq zh<=bAPz+KJ(hjm8L__%?wIBz8+y^oMWEGf($b*;=1HgQcMo=t6{127@n+LTYBmm)q z{SQ$ICPDEJvIgXH2nHF&0J_!#!WDq@&I`jLzS>la{v=m*hY^-u#qqEJ3qL_mN6q8}sy zat_pf0jT{T8l)cLRgiU{hzHXk{b0-jb_<9J5(m2<ZkQV1fZ0 z{vaku0fdIA2RR7L7Xa}=vLGu#G?WjL1e*xqgJeLy2e}_iL*+r~2NVh*r$cD4dXN&3 ziBn76y@*rtQ z^n%?7k^t+6+7HqR;Y0O<1wg(BhaXrsD6ql)hw-2^3z!C32a*+Ffbv0p1iKl`2dRN# zC?6sZvL7rC)ej1P2p=jhAOKPi5(3!|qM>}SJV+OW4`P915Ntmv;2`Ru`av2&N%0TiUi$FGlXeb{n53&Hl2eBXt49bVfgWV7E4cLB=HDGzL zEXZ^Qu=~IYz_vo{2gN+tK2ZJ#sRel)q#4u-h0q|?U{Mw@A7nqsbs+s<8Y&O6A0!7( z3LrNyfYpP{1nC2ZKS&;dA@ZOU3KkOp@j)g+e8&LR50ZiMq4FRRu%S?Sh<=bG!1_T3 zK!hOjV5J~gkpDq6R6jWVf%zZ;6hL6}K^_HhKr{V0n-Q5I%?nF%Zg!%7eonBmp)b z6y#uesQsWIf$*XFq4q=KA4Ed*gZvG{AUA-9A)tH*2p={|?f}XJAZe(814JIm0}W1t z)jNP#AY}|td8h&hsD1|rh=2n`KZFAsy96g8kY=!u0|P`ql5t@B9T*_`K{Uud2#*0Q z3gtueJ3#eA6@aXT$U_7ip!UQ33Zexd&H(8LV+bF_gg6Vz2MK_j2l5}X^FZzc@gedM z`$5hG84aev`auo>*#og3;uwhY!TLc4gF+8PgVcizgz&-P=KwYctR5VG5Ys?>2XOd- z_+a}%3c>mzHh{bfF(0G?tRA8tOAoC%nLHHnfkV=T<3}F2rK1dc!3qV<*xCXfi z%7=(T><2p+A`jIMu^%K3HXmdmNFGFk^n(nB@}cq&5s;w}c~I1Y6C6Yyq!DZy#QhLi zPy%3p%0u--!XFg0SX|nJjkOU4u}>2#SPfy5K|$1uznB$@*ju>=?Bwbd5{M{ z`XKg$oC%Q!$3MuSV5J~2h<>nIusFzmutgyILB@d01F44cq4FRRuqLp6utA{MV*rOA zNCFi8U>d9+>;i}a2p_5+9RDD3h}|F-NFL;G7zWjkAPnMzXb=XmK@|sx2DLH3VxT4k zD8GU@APklS*FT`98;A#{!BQXsioyEP*$~xG64ZDBF(EXBgjob`=0KbRYTST@p$-9w zf|;PE5mY~v50Zj82Gm#rxdFrn(I7s=)lfYkGr<}_qA=UR20>)NOfUgzB!Y|qISQm1 zOoP1!G8m*9>PE04hy;WQk_Q<9k_U-{?E^7D_CYYrb`TH525SV_2+{*m52eBG2bqU1 zhNc#*AEXD0L41&25QaD&WB|e@u=7C#SP0AjIS`@^qyZYtAmbo9K^B4)!;A#eAa8=@ zK^_5dK>9!?L20mlka-}JA=ZF>0}4!-GN?3&3vMRE86fo_Tc83Ud%(s*`5=Qpe2_Ru zBZ!8ydZ8M@?t!QRiGW-W76K^*IRN1$m=wsB5GO+o26I40fK`Az39<>{0FZegO<Y+492&5Hk9aIt66p%4cK3E>)PY@sE0g(HkG=u`#2Qmqy6C?uRgS3FGf!Gg~ z2TOxo1!jP30V@WFF~kvI(?NW&Di8zY0FWw>JV+4A2Qfij0XYk-3~U)l5y%J#4b}#B z7C3}KP69axBm$)A7LZu7X$4j0&QD_ii7oo_)rYugUv#-0K9b( zqzAMG6J!QRA&3uB4B~@!KSKE+t>Ep8AO=Vs$ZU{4C?BK+WFANg>`;(ANIys(N`v)- z6@U!|v%q>lc7emf{-nv5N%*hAOWyau$>?w zka~y$kS;I=n+Y->WET{J0~l;3c*`hQ6l4%sEl3=ML3%*ufn=e4kUbzZAhj?I76ZwH z)Iu@H>0rwt1V|Pn1g1gG1aUydf@rW7FavBNhyYsw)(TM!vI49EWB^zQ|d~jV22?HuzrYVAO=H?25Sac2+{-6^mH`h$>5NIh=W}Q;)5hX zTA?)9Ltsfz06=+AK3F+O7{rHo1grog4t5;K`yg?!D9Du%2EWm*!90+Dkda_lAUp#$3+z;|Dv)(x4B~}ZhvAZwtiL5e_r0NVvJ2BZjV0!Rzk7O;L03oHfI58{KALnM({ zU_}tUATvQ+kR2dxP#Po&VS@Ywwj5+3#6*yK2n!U85Ys`5K{h~XuznC9st&9f$_JSS z;)9gJFxU{V{a{5PX^;^RVX%D=aWE51fR(`2fE9w2K;=Mu5EF(Wc0%;P+2Aw|Awcut zAPnMxXb=Xm!4vPG`619!29N-h2Cp7~DMA)QQw!D)l80gtAEXzALB@e+&Ov%WOHaT8 z;N=u>9%wxWNEo!10c;&;2?R(z$N-1{*a(m=kPwIiqCtF+U10rSyFp7Uz#1V!AVpvW zVAH`YupW>Sxa}Z~PkP?uaL0X}FuwOvp5M6K^ zA-X^$1cUqnb}Yz7kQpHLP#RLrxgZK64_dzhvJ~VQkVC;90@(+Z0IP)X!8SnEfn>o3fEnO80=WWY1(*gANL~eL z1qp!-0uvy2LqtJdf!GQ*5aLvjVvtoxP6O)z$$}Mwcp&vq8f*y2Jdh+*5yXCwDIgX^ zF~~a*`yt{WK13E|0w@3=G{jg4AEFW>4pI-Y0_<(Dkzf``7_1l+0AM$R2#`fk8YBs3 zLKq+;L9PW^4W>axft?L90Ax8xF<2H9wjdip0#Fqod2j$h_+Xbo&4pPB(h5=n;)7@q zA7TPnA;{5SdqF0Hkbxlm5J8YISQUr?(gLDEQV?Ze)4@z|_<{lqWC0X|#K2C4 zii3;=i-EL(#Go|T0&w_)Re-_|Yz4Ynh%Cqj5Demj^nx%*EyP-oD?!?!o&gJjjD)HN z@gXh-*$$Eb@j$jioC*>J84nVH(hwo2eh>$)1H=F;g6IYL3B(220dfYE21!DgP&a|h z0LepXu=~MIhS&j84>lR33BmxW1i1)IgVckCp*#>Dq!fn1!XWd(ZUGq#@g|rHA|RT< z${+;D1cVy67@ArT7lc9DK^TP%PU8>)bUq#kgLohsgh6cZ!F-_e@jyojf&`#6=*&Tw z9Eb*~2aBPp1<8RhNDhQi*dX&j0w6u0LldEVuvt)X(D{!bVbF1fAaM{MM1%McB@hQe zjy?pd1Sx@-22lt)91V1AB3K+mfZPGr4>160J4hKw1B8aLAWA^TCPKtPe7Id8gTPjT zM8HQef_Mr)YDcD0G10W`W z^@Gd@s|0xpA`aq$+yT-CHUP{38w+w3*Z{Ct0pq7GypSSMHkNIyst#DUOY5^Mw5B_LNrCBZUa zKG=LDQINe*EpR5tWRN;=sDZSCWWeqLnG1CVC^W#1f$+i7pnw2r1}Ou{gWM10gXKZu zAVWdwAg+O`0{IUr0ivMlKqiBgfy@ChK;j_tK<)?W1UVAQ2b&KS2MdAZLGA`|pft#6 zkTA%QU?~s_q#0}?)D92@ zb0bs{C{{s6gFFRN4z?Sl4y+$!ELaqz1ZqCmPOt=63CMb|5~w&xFIWts1uO+2z{{Eegh6c3&NmPZ+H43G18;`}?Mnph z8Uo2cXpkI84M+q;gZN;*AO=Ve6obUT@*r`LVvqpX2+%f1kN|{+kRS<&Ldfn$2p=Q@ z;zP883IVyf35Y{MOz_@GsD3CPqzj}2M1#$Q7zo-k3ui$X5VOH<0_g>* z0BZmdP&2_4gb#8Xm<9GISOT=K6}0yfWEGeONr5?F3qU4AFh~r-0+|4^3_?T9gz&-g zAOk=cq#xuru$wT|LM?{c3Dpl$57rCP3=RP>4_Ss$wM(% zKRO$v7wkw70d^2b8^{-6K3Ezm4)H(8c90~$3TmaS&G75^J ziowo6W`j(F8V%9{mVyvqE?7NC4O|S&0b2wX0&zhYzVnebYgajQ11i~O5hz4O0 z8+5i2hz1`e1ZIGatO6ZN1UkD3Bmkj7>OpEiA|M*X2kQkfKnEK^F-Qz74-y9{1_^+T z0G)CK5`fSU5+ngp2tL#ZEDezX@gZ7427}xLI$8;=0CdC?=pZDJAjF{{CE%lzAm%~r z2bl}PP(2_ih=E|e5E+n0s63bnCLr=41t5dK(nxLsnFF#5Dh@Uh#0O~wsfW@aCe(o- z9S}1iic#2L&wxZgW`N|OG{pa4M}YkZasgNjO)XeINDmZ)_#ky4400maatHx&64*4b z%Rq*M7+@N#9i#yo%pg9nK+Q9N)2H3G6SAnbm(;xyA zhG3&1P6r8rJOZXc?gh(34F>U%oDQ=BY#!8UV3lB_K#D;;kOQDJNC;#&$R!{eEDSOQ z>R=EbBo5|+3<0?tBoCz_6es{dCV^ZA5`pj`_Cv(M`oT=7JeUHR4ss00K#-FmJ^_0a z6aWxMfh0f%gK3azusoOmn+kFs$U-m;Vt}lHD2A8^ayHlouytTV!RCR~fy{$i1=9jj z3N{@?fEB_`2H6J|0ht6=2l6A>d@v7WA6yE|fvE;@KMd=L%7;G_>FKzk5C7{mq9 zAPi!IwqSs0&}Id&7-&lYcvljL0LegTkQ_)2NCZTK_+Y&t21pMSgT%n{AaRglkO0^S z(B=h@0EC8+API;<&?W~k3$%p+EDSObq8?-fNIl40$QBMT2_iuIBfvCRKga-(evnqM zVvqpD3=j)s28;*dLo`A~Kzbk+fwt&?wwXZ821`S9g6x2BA$+hRkU_|Hg3N*P!RCX^ zgqR2>L1G}?APi!I%>c=O^nlbtX|P=|KOl>tsRio?$wM)S57G<5Ah&{o5=4WY1!6#b z1>%Fb5Qjjtfds&tP{4|yG9U|~E(Q4&Bn8n7kq40=K1d%(9!i6p12PVz97IEfLC%5t z3QU2dLAt=(V&DvjDv-%w7C2bID!?Xzy#_K5Bn}b=(V#sqU=zU%u(2Rlfi-|!58@yj z2;zgpVZH;o7c37o7{mt!3djK<8l)a?aTh>>IE;kXIl)SO|a=futZbSR2SgAO_fah&V_E$hlzsP$NMmK$U{5 zhA9EL0HhO4gPaSI1gQl30;C%(1ab#R6l5+~5UdL<1!jTeL6R^S&k%CLFR(>gN=iE3POYRgA{>{1Sx=sgUkc-K;mG{AQyo|AsFT;uy;Z7 zV1vLmfpma)U>f8SP(XmxgJ_U?uo&2}P_w|QL9$T&P(DZ<2!r*4m4XP6V?l0#&>+`> z<-uH#elPL!SRU>|^(AUh!1pk{&;gPjNx1v9|PK(Y`K7zv@l`oZ==+yPY#vKAx-#vmg>szEf^ z{UG%q21pQO1qh>yLFGW^ftWB1(gwmHK8OZka1w_Sp!4xT7{mq9APi!I4weVepxXk# zVxTJxK<6ccI3Ns`1f5?Fx~c%gfzV(n5CO$t{pf74a*!ZMKlmC2kjY>xVLZ@%4j^Tq zy9~f8L02GvRDlfy%YZb4F0Ozo1zn*45<+q)hzZgMG5|`0%mb+cnE;}}Qec}QJP;qm zf(W6S3340AdZ>k94};W0%mi^kD!`5e8v#-WQV*6#b_>{Wuuh2kp?r{T5C&@oX#~lF z+zpb4(h##Cdco#H)qwPXmG5};A zNF7KTqz}pmaY0@MDFf>V3xITkG(%{xQmEyi7y>&B%135{j0MYsw1MQIG{_{F9Eb+% z0b7c&6(kPBAoU;&;)7@q2AK=;JBS7u3o--52hkutNE~b$SP<-DkTBHeU=yH9LB0fe z5)l|6g&@1Y`av9!G{}8W8bpDN1=|5u1Th1|2P+5p6)c2lCRiS77DzovJJ=y$CxUrk zH-cC&H-KCVwiBWmq!O$J;s!7mtOUddD*@RJ!XPP-K@iPgDF^{p4lx5N2d2=}g18_I zk^^C6wgY$%BPa#4FgSoti~=3QAOJcF10)8b!D~ff2G0-syp#6{zAhST~pfu>TCeUt3P@5T~4$KD0 zLEQq@$G{>0mIK=kaxX{~=%5I&ILJNlQ@FtX0yXSFegc~VRu4MV2IMx7d%!0&fufj+ zL4k#d1GL5yv>@~D6oKbkAUtTW#Ry_6+nwVK*oX8Akhk-`%S^_0GkbR6L?_>xD*1J0WueK zNf$^B1Hyga#Va5;faGCjg6#m?2QmZX7nnOhYh6Kp1>Kj)pa2R$1qKEO1#sXwIDpxp zUBLnnHmLQl06KRA#1LR$PynBq;{fp(DB?jL0Er2J#K4gUI%fl<4irfaAoXAmfX#4l zPyp+JGmJ@}To?z-EE` z0`e2YPOv*b=7H5Pfb>HB0d_NZ@(z4eG7|$MgA*u1K@*Cgq{9HZ!kUr80V>AC0AfSb zI59ASw*7!@0$sZdQUmfmXu{Befsq3w@5I0eiUtrHtPT`ZAaPI<0$~svlHfpQg4_X) zN|0I(h+81`fz*P`2dRg-0b~})UXU0FgZLmCp;3VWjKKq$AU;C_10x7SLJV{<3>Y_pATvP2zKo#D zr9kF_%mEGFg7~0eR1gg^2ZTZ5V0rN6B@D>sgNy}VXaiEu(7@0LR>uIg1KGVWJ>cL| z0C^SU4hGQWF%Uf<{aD-wO2MEDazHW9zy!*jpjc+&0A2D7vYP|4dJA-GDk%GcHll%Z z3|6* zn=MF(9AyQxMs-8eFn(U+$ zAa{e@4?4OWQmTQR3UMQ-B4A|X72pzQU}2KxV-?{P6XIr;Wanp-66RslFqTu%Gm}*} z(oxXYHc&HHG||;GRF;uvWMX0C;Ns!q7Zes1mz0*VFwjtt5a3|2G}Kg-6y#*IGSX6# z65?XAHr7_QGt*O(6XRpEHPuy>73F2MG0{c0Qf5XVYa3Sjde;pq@WJ>0e^7{l#6TDnk}(Vn3=;nT|9gP!a^e%{XL90`=wtTeQ|M)J;?wA1_24sT zV{_!QXl7?tW8yP#0T#b5x%4YMyo%!Yx1p@NZtAtvQS zc(?@e6);`F8Y=D(vp|i>32FcT2eA`0%Zsmoc@Op=cH;)6mjEUPh9$ZG|9=Ac-vb<8 zm$>*i!nhqlp#~Bh#iJoG8UmvsFd71*Aut*Oun=evg0LK*^oBE_b||Pf01=-CYX5-R zX%H^MDm4BsD4z!^-@y-IfZLOxrnd=%FA1R-7C_CHhVo%;Hz_E81ymkXr-OuG@?Zb` z&j;~8fEuj~3=FIw4yc{T24O%c1_P*jxFEs|f1!L(y9y)(YFmM5Q1b^w?>GnXFH{*r z0h9r1UxMU8O%o6;4kAG9N~p(R;tWuWVD6NF8q5h(k48he48Q+F`~&q4!#^nh0950D zC?6*O0m@H<%KwD&MPUX~nce}72Xte%LF4xrl)eU~pF!zwP?`TL$sG=R2 zlA2spSx}-;TvC*om#%50-~tg)D9K1wC@9J=%S=g4QGm!Q1MnUyELdzKiC>;kCPlM7J8leKP`~~I0DMzTj2hj8clXw6tK%fE%&~SMG zDt@`BMCDwGq5qh%5PM0b_Q5I zfhx|yAOWpUP{lbJVD%`fI2XeLX!(jN&dm^jr95M1;9*F>D$dKm0?j9==I}AV@(-#w zKf{7U$RZFnGlKww#9;^TOi@ zVhq^I4Q2*$293*@6QJ!R@YoUq0|O{J7#a8& z7F2>%fd4bdK86LmAbiN^BLf4dodZ_C6IEOerhX5qxDrf!AF8+-O#A?xM_9QH8$)XWn=i(|a1r7{n7#c_b71)hJif-jz_0|Yo{ymc z8a|-mFp!f#(F8KT8Jh24>Mujp7oe$s3pF2Bzk6%dWuzD9f2FJj_U8 zpAHp=^;a7rFrWo7 zSbho)^~-RG@53Q}3y1hKCdkwV*fJ!7i5a^)#c_yhGK0p(F~h+ChkAFgIA%TQ3l>Lm z2$Y%0j6Hm+aj5Ucp?(ey@ijQiIgUg8Dl_(QdxFFKA2`h6X2I?+aTe_1uZBb11c$gA z4)G`);(4G;92vwJ4AAQ9VjSulakzgP)ExABe-RFIHiN}^7zB(V5e}Y5U|?X_0~Uvf zA(Izzh~LK{{tkyYXdnYyz7u7|9{x(K*yG)Xm4N}&RzP+mh#dho2eUmH2NnmZK*KJs z!FtIIDXGP2rFmdFKC^%!IKZ4CIKYA-IKY%4IKY@8IKYr0IKYe{IKYGLN^jTjt#+>2975=%;oK+KfX#GIV` zWDqkQA)1?7l98WM%#f6mpPU^J?L_MpBo>wE88XDj2L!o>gha->h59*%c>4Rr$Lkpy zTUZ!Cl|y^75amX=l$#ra?959oXUHzk$t*4b@k%NSQbBY)wA+nCucf&OSQWG{&ybs+ zQks(rbF-t5dtPdJe0)lNa(p~k9n>^rA*fcEP;ya8aY<=f8aU{SQqwbwOHzyCOLF6r zbMo_2iy1)b;?r~TlM-{{Q%drSisKVYD;SdVa|?1(OHxzx%q%TTuq%pB%goD+Pb?}* ztc*|1D=DgENGnRrO^r_}&CRW3h>u6&#b@SamY^t&k9P}l^mUDQ^>c}j2bo`-AD@w! zmy(mp5bqM{=jiL{%n%>%?iU*G>H$^i;S$6UA0OiD4AbQ9c+5^rY05T6PfqhScB^al@?#Cs$bJC>9bLHxo14t0k3_~Mep=6jkxg8L7$H4B%Aj;u_45o0^-OUxt=c;^8sm zms-vcQ0bXh0#0;3`FZIeZ-L@EII#>7(V(ya#bjnuX$dr-Au;2YUzD3z0!ceqQ%-z* zaz!F2<`Z)=tI(YRawRAkxn<_1_<~C}1_r(2%G{E~BnG|Wk|GG50b}Lmm!#^Y=auRu zm1gFo=w_xcfO#2-#Tg8GDV2G}mAMeQqzEEYmReMtnV*Nki7#T%D@x5t1ZjY>3UW#q z^uTV>E66F)OV2N1&?`x;C}Ge8l@knlMfu=lt(TesEg3RWiWuNLh*n4u0nq_tgLHxH z(ksdbyDKp_GnqjTB+8(dR9wuUmzHD3H-G{m||xcufw-Y?yx7I1`M9&0B!%0%4FDAR2~2YcW7`1Tg)u@hBJ_1yu;L z1H^=>gVCW34B$Bj7#}un1*2j8K6Lkk%mU#Q(A*BV?+W5EAjY?#^C7T#5Sabw{s;BX zL1sHawZq22U^HwV2BaS}$APZD0^AQ~V1NzJ!N$vAG;}xsYC34G7n})Z6r<^fjjO?E z&^jitLMQE}Z!j9>UZ{5Px+@SHCf<&wKLOeZgwc!88gnpvL1ut(FPeVX zcpi-A1Svwops+^bGE9c*hs8f^+z&=Kzy?O3njoVhP!0nF!)!GD3!vjQFd99hquaj{ zO+RcL5k|w}A7&#g++h683=9mQF&9w!0Exlo6&IWV@jwepAvBDH>4(vv;V#hF9ZWxL zTyh1G`cFgM57Q4DzuZ7TKg>Nh7$9jErXM!WxdW;nyg(0{$3S{u?uMmpxG89X9|Hq}2Fzg)WkzaSosUe rA27Fr^uh3kdk|I*Y=RlWg$>_Ad5}IcHvKYBAWFVMC^!joH%tHkm{qb< diff --git a/modules/Crypto/Cipher/_DES3.so b/modules/Crypto/Cipher/_DES3.so deleted file mode 100755 index de8fbd022e1c86c5a6039d47756ae3708149b71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60480 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