From a7856f5c32fe95a8bc00cb48d50a980d0293b6f1 Mon Sep 17 00:00:00 2001 From: Apprentice Alf Date: Thu, 30 Dec 2010 22:41:07 +0000 Subject: [PATCH] tools v3.0 First combined mobi/topaz kindle tool --- Adobe_EPUB_Tools/ineptepub.pyw | 5 +- Adobe_PDF_Tools/ineptkey.pyw | 458 ++++ ineptpdf.pyw => Adobe_PDF_Tools/ineptpdf.pyw | 0 .../ineptpdf8.pyw | 0 Barnes_and_Noble_EPUB_Tools/ignobleepub.pyw | 1 + .../K4MobiDeDRM_plugin}/convert2xml.py | 17 +- .../K4MobiDeDRM_plugin}/flatxml2html.py | 36 +- .../K4MobiDeDRM_plugin/flatxml2svg.py | 151 ++ Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py | 561 +++++ .../K4MobiDeDRM_plugin/kgenpids.py | 312 +++ .../K4MobiDeDRM_plugin}/stylexml2css.py | 0 .../K4MobiDeDRM_plugin/topazextract.py | 434 ++++ Calibre_Plugins/README-Ineptpdf-plugin.txt | 36 + Calibre_Plugins/README-K4MobiDeDRM-plugin.txt | 14 +- Calibre_Plugins/eReaderPDB2PML_plugin.zip | Bin 148407 -> 13129 bytes .../eReaderPDB2PML_plugin.py | 16 +- .../eReaderPDB2PML_plugin/erdr2pml.py | 10 +- .../eReaderPDB2PML_plugin/pycrypto_des.py | 31 + .../eReaderPDB2PML_plugin/python_des.py | 2 + .../windows/psyco/__init__.pyo | Bin 2079 -> 0 bytes .../windows/psyco/_psyco.pyd | Bin 278016 -> 0 bytes .../windows/psyco/builtin.pyo | Bin 7116 -> 0 bytes .../windows/psyco/classes.pyo | Bin 1684 -> 0 bytes .../windows/psyco/clibrary.pyo | Bin 526 -> 0 bytes .../windows/psyco/core.pyo | Bin 6168 -> 0 bytes .../windows/psyco/kdictproxy.pyo | Bin 1920 -> 0 bytes .../windows/psyco/logger.pyo | Bin 2780 -> 0 bytes .../windows/psyco/profiler.pyo | Bin 13248 -> 0 bytes .../windows/psyco/support.pyo | Bin 6591 -> 0 bytes Calibre_Plugins/ignobleepub_plugin.zip | Bin 28861 -> 6502 bytes .../ignobleepub_plugin/ignobleepub_plugin.py | 16 +- .../windows/Crypto/Cipher/AES.pyd | Bin 31744 -> 0 bytes .../windows/Crypto/Cipher/__init__.py | 51 - .../windows/Crypto/__init__.py | 46 - .../windows/Crypto/pct_warnings.py | 57 - Calibre_Plugins/ineptepub_plugin.zip | Bin 83396 -> 10855 bytes .../ineptepub_plugin/ineptepub_plugin.py | 16 +- .../windows/Crypto/Cipher/AES.pyd | Bin 31744 -> 0 bytes .../windows/Crypto/Cipher/__init__.py | 51 - .../windows/Crypto/Hash/SHA256.pyd | Bin 11264 -> 0 bytes .../windows/Crypto/Hash/__init__.py | 44 - .../windows/Crypto/PublicKey/RSA.py | 184 -- .../windows/Crypto/PublicKey/_RSA.py | 95 - .../windows/Crypto/PublicKey/__init__.py | 37 - .../windows/Crypto/PublicKey/_slowmath.py | 134 - .../windows/Crypto/PublicKey/pubkey.py | 192 -- .../Random/Fortuna/FortunaAccumulator.py | 139 -- .../Crypto/Random/Fortuna/FortunaGenerator.py | 128 - .../windows/Crypto/Random/Fortuna/SHAd256.py | 88 - .../windows/Crypto/Random/Fortuna/__init__.py | 0 .../windows/Crypto/Random/OSRNG/__init__.py | 40 - .../windows/Crypto/Random/OSRNG/fallback.py | 46 - .../windows/Crypto/Random/OSRNG/nt.py | 74 - .../windows/Crypto/Random/OSRNG/rng_base.py | 86 - .../windows/Crypto/Random/OSRNG/winrandom.pyd | Bin 10752 -> 0 bytes .../windows/Crypto/Random/_UserFriendlyRNG.py | 213 -- .../windows/Crypto/Random/__init__.py | 43 - .../windows/Crypto/Random/random.py | 143 -- .../windows/Crypto/Util/Counter.py | 61 - .../windows/Crypto/Util/__init__.py | 36 - .../windows/Crypto/Util/_counter.pyd | Bin 11264 -> 0 bytes .../windows/Crypto/Util/_number_new.py | 117 - .../windows/Crypto/Util/number.py | 250 -- .../windows/Crypto/Util/python_compat.py | 84 - .../windows/Crypto/__init__.py | 46 - .../windows/Crypto/pct_warnings.py | 57 - Calibre_Plugins/ineptpdf_plugin.zip | Bin 0 -> 21812 bytes Calibre_Plugins/ineptpdf_plugin/ade_key.py | 346 +++ .../ineptpdf_plugin/ineptpdf_plugin.py | 2204 +++++++++++++++++ Calibre_Plugins/k4mobidedrm_plugin.zip | Bin 16172 -> 42817 bytes .../k4mobidedrm_plugin/k4mobidedrm_plugin.py | 657 ++--- .../k4mobidedrm_plugin/k4mutils.py | 178 +- .../k4mobidedrm_plugin/k4pcutils.py | 5 - .../k4mobidedrm_plugin/mobidedrm.py | 286 ++- DeDRM_Macintosh_Application/DeDRM.app.txt | 98 +- .../DeDRM.app/Contents/Info.plist | 8 +- .../Contents/Resources/Scripts/main.scpt | Bin 193026 -> 203536 bytes .../Contents/Resources}/cmbtc_v2.2.py | 0 .../Contents/Resources/convert2xml.py | 817 ++++++ .../Contents/Resources/flatxml2html.py | 706 ++++++ .../Contents/Resources/flatxml2svg.py | 151 ++ .../DeDRM.app/Contents/Resources/genbook.py | 561 +++++ .../DeDRM.app/Contents/Resources}/genxml.py | 0 .../Contents/Resources/ignobleepub.pyw | 1 + .../Contents/Resources/ineptepub.pyw | 5 +- .../Contents/Resources}/k4mdumpkinfo.py | 0 .../Contents/Resources/k4mobidedrm.py | 641 ++--- .../DeDRM.app/Contents/Resources/k4mutils.py | 178 +- .../DeDRM.app/Contents/Resources/kgenpids.py | 312 +++ .../DeDRM.app/Contents/Resources/mobidedrm.py | 286 ++- .../Contents/Resources}/scrolltextwidget.py | 0 .../Contents/Resources/stylexml2css.py | 243 ++ .../Contents/Resources/topazextract.py | 434 ++++ .../FindTopazEbooks.pyw | 0 .../KindleBooks/KindleBooks.pyw | 75 +- .../KindleBooks/README_KindleBooks.txt | 59 + .../KindleBooks/lib/cmbtc_v2.2.py | 759 ++++-- .../KindleBooks/lib/convert2xml.py | 817 ++++++ .../KindleBooks/lib/flatxml2html.py | 706 ++++++ .../KindleBooks/lib/flatxml2svg.py | 151 ++ KindleBooks_Tools/KindleBooks/lib/genbook.py | 561 +++++ KindleBooks_Tools/KindleBooks/lib/genxml.py | 145 ++ .../KindleBooks/lib/k4mdumpkinfo.py | 333 +++ .../KindleBooks/lib/k4mobidedrm.py | 333 +++ .../KindleBooks}/lib/k4mutils.py | 178 +- .../KindleBooks}/lib/k4pcutils.py | 5 - KindleBooks_Tools/KindleBooks/lib/kgenpids.py | 312 +++ .../KindleBooks/lib/mobidedrm.py | 361 +++ .../KindleBooks}/lib/scrolltextwidget.py | 0 .../KindleBooks/lib/stylexml2css.py | 243 ++ .../KindleBooks}/lib/subasyncio.py | 0 .../KindleBooks/lib/topazextract.py | 434 ++++ .../Kindle_4_Mac_Unswindle/K4Munswindle.pyw | 0 .../README_K4Munswindle.txt | 0 .../gdb_kindle_cmds_r1.txt | 0 .../gdb_kindle_cmds_r2.txt | 0 .../gdb_kindle_cmds_r3.txt | 0 .../gdb_kindle_cmds_r4.txt | 0 .../Kindle_4_Mac_Unswindle}/lib/mobidedrm.py | 0 .../lib/scrolltextwidget.py | 0 .../Kindle_4_Mac_Unswindle/lib/subasyncio.py | 0 .../README-unswindlev7.txt | 0 .../Kindle_4_PC_Unswindle}/mobidedrm.py | 0 .../Kindle_4_PC_Unswindle/unswindle.pyw | 0 .../MobiDeDRM.py | 103 +- .../README_K4MobiDeDRM.txt | 25 - .../lib/k4mobidedrm.py | 600 ----- .../lib/k4pcutils.py | 110 - .../Kindle_4_PC_Unswindle/mobidedrm.py | 291 --- Mobi_Additional_Tools/lib/kindlepid.py | 12 +- Topaz_Tools/FindTopazEbooks.pyw | 216 -- Topaz_Tools/README_Topaz_Tools.txt | 33 - Topaz_Tools/TopazExtract.pyw | 234 -- Topaz_Tools/TopazFiles2HTML.pyw | 159 -- Topaz_Tools/TopazFiles2SVG.pyw | 159 -- Topaz_Tools/TopazFiles2XML.pyw | 159 -- Topaz_Tools/lib/decode_meta.py | 112 - Topaz_Tools/lib/genhtml.py | 185 -- Topaz_Tools/lib/gensvg.py | 405 --- Topaz_Tools/lib/getpagedim.py | 53 - Topaz_Tools/lib/k4mutils.py | 334 --- Topaz_Tools/lib/subasyncio.py | 149 -- Topaz_Tools/lib/topaz-readme.txt | 129 - .../lib/eReaderPDB2PML_plugin.py | 16 +- eReader_PDB_Tools/lib/erdr2pml.py | 10 +- eReader_PDB_Tools/lib/ereader2html.py | 884 ------- eReader_PDB_Tools/lib/pycrypto_des.py | 31 + eReader_PDB_Tools/lib/python_des.py | 2 + 148 files changed, 13783 insertions(+), 8875 deletions(-) create mode 100644 Adobe_PDF_Tools/ineptkey.pyw rename ineptpdf.pyw => Adobe_PDF_Tools/ineptpdf.pyw (100%) rename ineptpdf8.pyw => Adobe_PDF_Tools/ineptpdf8.pyw (100%) rename {Topaz_Tools/lib => Calibre_Plugins/K4MobiDeDRM_plugin}/convert2xml.py (98%) rename {Topaz_Tools/lib => Calibre_Plugins/K4MobiDeDRM_plugin}/flatxml2html.py (96%) create mode 100644 Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2svg.py create mode 100644 Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py create mode 100644 Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py rename {Topaz_Tools/lib => Calibre_Plugins/K4MobiDeDRM_plugin}/stylexml2css.py (100%) create mode 100644 Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py create mode 100644 Calibre_Plugins/README-Ineptpdf-plugin.txt create mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/pycrypto_des.py delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/__init__.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/_psyco.pyd delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/builtin.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/classes.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/clibrary.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/core.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/kdictproxy.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/logger.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/profiler.pyo delete mode 100644 Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/support.pyo delete mode 100644 Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/AES.pyd delete mode 100644 Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/__init__.py delete mode 100644 Calibre_Plugins/ignobleepub_plugin/windows/Crypto/__init__.py delete mode 100644 Calibre_Plugins/ignobleepub_plugin/windows/Crypto/pct_warnings.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Cipher/AES.pyd delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Cipher/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/SHA256.pyd delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/RSA.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_RSA.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_slowmath.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/pubkey.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaAccumulator.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaGenerator.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/SHAd256.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/fallback.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/nt.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/rng_base.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/winrandom.pyd delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/_UserFriendlyRNG.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/random.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/Counter.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_counter.pyd delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_number_new.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/number.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/python_compat.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/__init__.py delete mode 100644 Calibre_Plugins/ineptepub_plugin/windows/Crypto/pct_warnings.py create mode 100644 Calibre_Plugins/ineptpdf_plugin.zip create mode 100644 Calibre_Plugins/ineptpdf_plugin/ade_key.py create mode 100644 Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py rename {Topaz_Tools/lib => DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources}/cmbtc_v2.2.py (100%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/convert2xml.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2html.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2svg.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py rename {Topaz_Tools/lib => DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources}/genxml.py (100%) rename {Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib => DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources}/k4mdumpkinfo.py (100%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py rename {Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib => DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources}/scrolltextwidget.py (100%) create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/stylexml2css.py create mode 100644 DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/topazextract.py rename {Kindle_Mobi_Tools => KindleBooks_Tools}/FindTopazEbooks.pyw (100%) rename Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/K4MobiDeDRM.pyw => KindleBooks_Tools/KindleBooks/KindleBooks.pyw (79%) create mode 100644 KindleBooks_Tools/KindleBooks/README_KindleBooks.txt rename Topaz_Tools/lib/cmbtc_dump.py => KindleBooks_Tools/KindleBooks/lib/cmbtc_v2.2.py (63%) create mode 100644 KindleBooks_Tools/KindleBooks/lib/convert2xml.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/flatxml2html.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/flatxml2svg.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/genbook.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/genxml.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/k4mdumpkinfo.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/k4mobidedrm.py rename {Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool => KindleBooks_Tools/KindleBooks}/lib/k4mutils.py (52%) rename {Topaz_Tools => KindleBooks_Tools/KindleBooks}/lib/k4pcutils.py (98%) create mode 100644 KindleBooks_Tools/KindleBooks/lib/kgenpids.py create mode 100644 KindleBooks_Tools/KindleBooks/lib/mobidedrm.py rename {Kindle_Mobi_Tools/Kindle_4_Mac_Unswindle => KindleBooks_Tools/KindleBooks}/lib/scrolltextwidget.py (100%) create mode 100644 KindleBooks_Tools/KindleBooks/lib/stylexml2css.py rename {Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool => KindleBooks_Tools/KindleBooks}/lib/subasyncio.py (100%) create mode 100644 KindleBooks_Tools/KindleBooks/lib/topazextract.py rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/K4Munswindle.pyw (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/README_K4Munswindle.txt (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/gdb_kindle_cmds_r1.txt (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/gdb_kindle_cmds_r2.txt (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/gdb_kindle_cmds_r3.txt (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/gdb_kindle_cmds_r4.txt (100%) rename {Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool => KindleBooks_Tools/Kindle_4_Mac_Unswindle}/lib/mobidedrm.py (100%) rename {Topaz_Tools => KindleBooks_Tools/Kindle_4_Mac_Unswindle}/lib/scrolltextwidget.py (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_Mac_Unswindle/lib/subasyncio.py (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_PC_Unswindle/README-unswindlev7.txt (100%) rename {Kindle_Mobi_Tools/Kindle_4_Mac_Unswindle/lib => KindleBooks_Tools/Kindle_4_PC_Unswindle}/mobidedrm.py (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/Kindle_4_PC_Unswindle/unswindle.pyw (100%) rename {Kindle_Mobi_Tools => KindleBooks_Tools}/MobiDeDRM.py (75%) delete mode 100644 Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/README_K4MobiDeDRM.txt delete mode 100644 Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/k4mobidedrm.py delete mode 100644 Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/k4pcutils.py delete mode 100644 Kindle_Mobi_Tools/Kindle_4_PC_Unswindle/mobidedrm.py delete mode 100644 Topaz_Tools/FindTopazEbooks.pyw delete mode 100644 Topaz_Tools/README_Topaz_Tools.txt delete mode 100644 Topaz_Tools/TopazExtract.pyw delete mode 100644 Topaz_Tools/TopazFiles2HTML.pyw delete mode 100644 Topaz_Tools/TopazFiles2SVG.pyw delete mode 100644 Topaz_Tools/TopazFiles2XML.pyw delete mode 100644 Topaz_Tools/lib/decode_meta.py delete mode 100644 Topaz_Tools/lib/genhtml.py delete mode 100644 Topaz_Tools/lib/gensvg.py delete mode 100644 Topaz_Tools/lib/getpagedim.py delete mode 100644 Topaz_Tools/lib/k4mutils.py delete mode 100644 Topaz_Tools/lib/subasyncio.py delete mode 100644 Topaz_Tools/lib/topaz-readme.txt delete mode 100644 eReader_PDB_Tools/lib/ereader2html.py create mode 100644 eReader_PDB_Tools/lib/pycrypto_des.py diff --git a/Adobe_EPUB_Tools/ineptepub.pyw b/Adobe_EPUB_Tools/ineptepub.pyw index 701fc2e..442c37a 100644 --- a/Adobe_EPUB_Tools/ineptepub.pyw +++ b/Adobe_EPUB_Tools/ineptepub.pyw @@ -1,7 +1,7 @@ #! /usr/bin/python # -*- coding: utf-8 -*- -# ineptepub.pyw, version 5.2 +# ineptepub.pyw, version 5.4 # Copyright © 2009-2010 i♥cabbages # Released under the terms of the GNU General Public Licence, version 3 or @@ -25,6 +25,8 @@ # 5.1 - Improve OpenSSL error checking # 5.2 - Fix ctypes error causing segfaults on some systems # 5.3 - add support for OpenSSL on Windows, fix bug with some versions of libcrypto 0.9.8 prior to path level o +# 5.4 - add support for encoding to 'utf-8' when building up list of files to decrypt from encryption.xml + """ Decrypt Adobe ADEPT-encrypted EPUB books. """ @@ -288,6 +290,7 @@ class Decryptor(object): for elem in encryption.findall(expr): path = elem.get('URI', None) if path is not None: + path = path.encode('utf-8') encrypted.add(path) def decompress(self, bytes): diff --git a/Adobe_PDF_Tools/ineptkey.pyw b/Adobe_PDF_Tools/ineptkey.pyw new file mode 100644 index 0000000..bd66e78 --- /dev/null +++ b/Adobe_PDF_Tools/ineptkey.pyw @@ -0,0 +1,458 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +# ineptkey.pyw, version 5 +# Copyright © 2009-2010 i♥cabbages + +# Released under the terms of the GNU General Public Licence, version 3 or +# later. + +# Windows users: Before running this program, you must first install Python 2.6 +# from and PyCrypto from +# (make certain +# to install the version for Python 2.6). Then save this script file as +# ineptkey.pyw and double-click on it to run it. It will create a file named +# adeptkey.der in the same directory. This is your ADEPT user key. +# +# Mac OS X users: Save this script file as ineptkey.pyw. You can run this +# program from the command line (pythonw ineptkey.pyw) or by double-clicking +# it when it has been associated with PythonLauncher. It will create a file +# named adeptkey.der in the same directory. This is your ADEPT user key. + +# Revision history: +# 1 - Initial release, for Adobe Digital Editions 1.7 +# 2 - Better algorithm for finding pLK; improved error handling +# 3 - Rename to INEPT +# 4 - Series of changes by joblack (and others?) -- +# 4.1 - quick beta fix for ADE 1.7.2 (anon) +# 4.2 - added old 1.7.1 processing +# 4.3 - better key search +# 4.4 - Make it working on 64-bit Python +# 5 - Clean up and improve 4.x changes; +# Clean up and merge OS X support by unknown +# 5.1 - add support for using OpenSSL on Windows in place of PyCrypto +# 5.2 - added support for output of key to a particular file + +""" +Retrieve Adobe ADEPT user key. +""" + +from __future__ import with_statement + +__license__ = 'GPL v3' + +import sys +import os +import struct +import Tkinter +import Tkconstants +import tkMessageBox +import traceback + +class ADEPTError(Exception): + pass + +if sys.platform.startswith('win'): + from ctypes import windll, c_char_p, c_wchar_p, c_uint, POINTER, byref, \ + create_unicode_buffer, create_string_buffer, CFUNCTYPE, addressof, \ + string_at, Structure, c_void_p, cast, c_size_t, memmove, CDLL, c_int, \ + c_long, c_ulong + + from ctypes.wintypes import LPVOID, DWORD, BOOL + import _winreg as winreg + + def _load_crypto_libcrypto(): + from ctypes.util import find_library + libcrypto = find_library('libeay32') + if libcrypto is None: + raise ADEPTError('libcrypto not found') + libcrypto = CDLL(libcrypto) + AES_MAXNR = 14 + c_char_pp = POINTER(c_char_p) + c_int_p = POINTER(c_int) + class AES_KEY(Structure): + _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), + ('rounds', c_int)] + AES_KEY_p = POINTER(AES_KEY) + + def F(restype, name, argtypes): + func = getattr(libcrypto, name) + func.restype = restype + func.argtypes = argtypes + return func + + AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', + [c_char_p, c_int, AES_KEY_p]) + AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', + [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, + c_int]) + class AES(object): + def __init__(self, userkey): + self._blocksize = len(userkey) + if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : + raise ADEPTError('AES improper key used') + key = self._key = AES_KEY() + rv = AES_set_decrypt_key(userkey, len(userkey) * 8, key) + if rv < 0: + raise ADEPTError('Failed to initialize AES key') + def decrypt(self, data): + out = create_string_buffer(len(data)) + iv = ("\x00" * self._blocksize) + rv = AES_cbc_encrypt(data, out, len(data), self._key, iv, 0) + if rv == 0: + raise ADEPTError('AES decryption failed') + return out.raw + return AES + + def _load_crypto_pycrypto(): + from Crypto.Cipher import AES as _AES + class AES(object): + def __init__(self, key): + self._aes = _AES.new(key, _AES.MODE_CBC) + def decrypt(self, data): + return self._aes.decrypt(data) + return AES + + def _load_crypto(): + AES = None + for loader in (_load_crypto_libcrypto, _load_crypto_pycrypto): + try: + AES = loader() + break + except (ImportError, ADEPTError): + pass + return AES + + AES = _load_crypto() + + + DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device' + PRIVATE_LICENCE_KEY_PATH = r'Software\Adobe\Adept\Activation' + + MAX_PATH = 255 + + kernel32 = windll.kernel32 + advapi32 = windll.advapi32 + crypt32 = windll.crypt32 + + def GetSystemDirectory(): + GetSystemDirectoryW = kernel32.GetSystemDirectoryW + GetSystemDirectoryW.argtypes = [c_wchar_p, c_uint] + GetSystemDirectoryW.restype = c_uint + def GetSystemDirectory(): + buffer = create_unicode_buffer(MAX_PATH + 1) + GetSystemDirectoryW(buffer, len(buffer)) + return buffer.value + return GetSystemDirectory + GetSystemDirectory = GetSystemDirectory() + + def GetVolumeSerialNumber(): + GetVolumeInformationW = kernel32.GetVolumeInformationW + GetVolumeInformationW.argtypes = [c_wchar_p, c_wchar_p, c_uint, + POINTER(c_uint), POINTER(c_uint), + POINTER(c_uint), c_wchar_p, c_uint] + GetVolumeInformationW.restype = c_uint + def GetVolumeSerialNumber(path): + vsn = c_uint(0) + GetVolumeInformationW( + path, None, 0, byref(vsn), None, None, None, 0) + return vsn.value + return GetVolumeSerialNumber + GetVolumeSerialNumber = GetVolumeSerialNumber() + + def GetUserName(): + GetUserNameW = advapi32.GetUserNameW + GetUserNameW.argtypes = [c_wchar_p, POINTER(c_uint)] + GetUserNameW.restype = c_uint + def GetUserName(): + buffer = create_unicode_buffer(32) + size = c_uint(len(buffer)) + while not GetUserNameW(buffer, byref(size)): + buffer = create_unicode_buffer(len(buffer) * 2) + size.value = len(buffer) + return buffer.value.encode('utf-16-le')[::2] + return GetUserName + GetUserName = GetUserName() + + PAGE_EXECUTE_READWRITE = 0x40 + MEM_COMMIT = 0x1000 + MEM_RESERVE = 0x2000 + + def VirtualAlloc(): + _VirtualAlloc = kernel32.VirtualAlloc + _VirtualAlloc.argtypes = [LPVOID, c_size_t, DWORD, DWORD] + _VirtualAlloc.restype = LPVOID + def VirtualAlloc(addr, size, alloctype=(MEM_COMMIT | MEM_RESERVE), + protect=PAGE_EXECUTE_READWRITE): + return _VirtualAlloc(addr, size, alloctype, protect) + return VirtualAlloc + VirtualAlloc = VirtualAlloc() + + MEM_RELEASE = 0x8000 + + def VirtualFree(): + _VirtualFree = kernel32.VirtualFree + _VirtualFree.argtypes = [LPVOID, c_size_t, DWORD] + _VirtualFree.restype = BOOL + def VirtualFree(addr, size=0, freetype=MEM_RELEASE): + return _VirtualFree(addr, size, freetype) + return VirtualFree + VirtualFree = VirtualFree() + + class NativeFunction(object): + def __init__(self, restype, argtypes, insns): + self._buf = buf = VirtualAlloc(None, len(insns)) + memmove(buf, insns, len(insns)) + ftype = CFUNCTYPE(restype, *argtypes) + self._native = ftype(buf) + + def __call__(self, *args): + return self._native(*args) + + def __del__(self): + if self._buf is not None: + VirtualFree(self._buf) + self._buf = None + + if struct.calcsize("P") == 4: + CPUID0_INSNS = ( + "\x53" # push %ebx + "\x31\xc0" # xor %eax,%eax + "\x0f\xa2" # cpuid + "\x8b\x44\x24\x08" # mov 0x8(%esp),%eax + "\x89\x18" # mov %ebx,0x0(%eax) + "\x89\x50\x04" # mov %edx,0x4(%eax) + "\x89\x48\x08" # mov %ecx,0x8(%eax) + "\x5b" # pop %ebx + "\xc3" # ret + ) + CPUID1_INSNS = ( + "\x53" # push %ebx + "\x31\xc0" # xor %eax,%eax + "\x40" # inc %eax + "\x0f\xa2" # cpuid + "\x5b" # pop %ebx + "\xc3" # ret + ) + else: + CPUID0_INSNS = ( + "\x49\x89\xd8" # mov %rbx,%r8 + "\x49\x89\xc9" # mov %rcx,%r9 + "\x48\x31\xc0" # xor %rax,%rax + "\x0f\xa2" # cpuid + "\x4c\x89\xc8" # mov %r9,%rax + "\x89\x18" # mov %ebx,0x0(%rax) + "\x89\x50\x04" # mov %edx,0x4(%rax) + "\x89\x48\x08" # mov %ecx,0x8(%rax) + "\x4c\x89\xc3" # mov %r8,%rbx + "\xc3" # retq + ) + CPUID1_INSNS = ( + "\x53" # push %rbx + "\x48\x31\xc0" # xor %rax,%rax + "\x48\xff\xc0" # inc %rax + "\x0f\xa2" # cpuid + "\x5b" # pop %rbx + "\xc3" # retq + ) + + def cpuid0(): + _cpuid0 = NativeFunction(None, [c_char_p], CPUID0_INSNS) + buf = create_string_buffer(12) + def cpuid0(): + _cpuid0(buf) + return buf.raw + return cpuid0 + cpuid0 = cpuid0() + + cpuid1 = NativeFunction(c_uint, [], CPUID1_INSNS) + + class DataBlob(Structure): + _fields_ = [('cbData', c_uint), + ('pbData', c_void_p)] + DataBlob_p = POINTER(DataBlob) + + def CryptUnprotectData(): + _CryptUnprotectData = crypt32.CryptUnprotectData + _CryptUnprotectData.argtypes = [DataBlob_p, c_wchar_p, DataBlob_p, + c_void_p, c_void_p, c_uint, DataBlob_p] + _CryptUnprotectData.restype = c_uint + def CryptUnprotectData(indata, entropy): + indatab = create_string_buffer(indata) + indata = DataBlob(len(indata), cast(indatab, c_void_p)) + entropyb = create_string_buffer(entropy) + entropy = DataBlob(len(entropy), cast(entropyb, c_void_p)) + outdata = DataBlob() + if not _CryptUnprotectData(byref(indata), None, byref(entropy), + None, None, 0, byref(outdata)): + raise ADEPTError("Failed to decrypt user key key (sic)") + return string_at(outdata.pbData, outdata.cbData) + return CryptUnprotectData + CryptUnprotectData = CryptUnprotectData() + + def retrieve_key(keypath): + if AES is None: + tkMessageBox.showerror( + "ADEPT Key", + "This script requires PyCrypto or OpenSSL which must be installed " + "separately. Read the top-of-script comment for details.") + return False + root = GetSystemDirectory().split('\\')[0] + '\\' + serial = GetVolumeSerialNumber(root) + vendor = cpuid0() + signature = struct.pack('>I', cpuid1())[1:] + user = GetUserName() + entropy = struct.pack('>I12s3s13s', serial, vendor, signature, user) + cuser = winreg.HKEY_CURRENT_USER + try: + regkey = winreg.OpenKey(cuser, DEVICE_KEY_PATH) + except WindowsError: + raise ADEPTError("Adobe Digital Editions not activated") + device = winreg.QueryValueEx(regkey, 'key')[0] + keykey = CryptUnprotectData(device, entropy) + userkey = None + try: + plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) + except WindowsError: + raise ADEPTError("Could not locate ADE activation") + for i in xrange(0, 16): + try: + plkparent = winreg.OpenKey(plkroot, "%04d" % (i,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkparent, None)[0] + if ktype != 'credentials': + continue + for j in xrange(0, 16): + try: + plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkkey, None)[0] + if ktype != 'privateLicenseKey': + continue + userkey = winreg.QueryValueEx(plkkey, 'value')[0] + break + if userkey is not None: + break + if userkey is None: + raise ADEPTError('Could not locate privateLicenseKey') + userkey = userkey.decode('base64') + aes = AES(keykey) + userkey = aes.decrypt(userkey) + userkey = userkey[26:-ord(userkey[-1])] + with open(keypath, 'wb') as f: + f.write(userkey) + return True + +elif sys.platform.startswith('darwin'): + import xml.etree.ElementTree as etree + import Carbon.File + import Carbon.Folder + import Carbon.Folders + import MacOS + + ACTIVATION_PATH = 'Adobe/Digital Editions/activation.dat' + NSMAP = {'adept': 'http://ns.adobe.com/adept', + 'enc': 'http://www.w3.org/2001/04/xmlenc#'} + + def find_folder(domain, dtype): + try: + fsref = Carbon.Folder.FSFindFolder(domain, dtype, False) + return Carbon.File.pathname(fsref) + except MacOS.Error: + return None + + def find_app_support_file(subpath): + dtype = Carbon.Folders.kApplicationSupportFolderType + for domain in Carbon.Folders.kUserDomain, Carbon.Folders.kLocalDomain: + path = find_folder(domain, dtype) + if path is None: + continue + path = os.path.join(path, subpath) + if os.path.isfile(path): + return path + return None + + def retrieve_key(keypath): + actpath = find_app_support_file(ACTIVATION_PATH) + if actpath is None: + raise ADEPTError("Could not locate ADE activation") + tree = etree.parse(actpath) + adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) + expr = '//%s/%s' % (adept('credentials'), adept('privateLicenseKey')) + userkey = tree.findtext(expr) + userkey = userkey.decode('base64') + userkey = userkey[26:] + with open(keypath, 'wb') as f: + f.write(userkey) + return True + +elif sys.platform.startswith('cygwin'): + def retrieve_key(keypath): + tkMessageBox.showerror( + "ADEPT Key", + "This script requires a Windows-native Python, and cannot be run " + "under Cygwin. Please install a Windows-native Python and/or " + "check your file associations.") + return False + +else: + def retrieve_key(keypath): + tkMessageBox.showerror( + "ADEPT Key", + "This script only supports Windows and Mac OS X. For Linux " + "you should be able to run ADE and this script under Wine (with " + "an appropriate version of Windows Python installed).") + return False + +class ExceptionDialog(Tkinter.Frame): + def __init__(self, root, text): + Tkinter.Frame.__init__(self, root, border=5) + label = Tkinter.Label(self, text="Unexpected error:", + anchor=Tkconstants.W, justify=Tkconstants.LEFT) + label.pack(fill=Tkconstants.X, expand=0) + self.text = Tkinter.Text(self) + self.text.pack(fill=Tkconstants.BOTH, expand=1) + self.text.insert(Tkconstants.END, text) + +def cli_main(argv=sys.argv): + keypath = argv[1] + try: + success = retrieve_key(keypath) + except ADEPTError, e: + print "Key generation Error: " + str(e) + return 1 + except Exception, e: + print "General Error: " + str(e) + return 1 + if not success: + return 1 + return 0 + +def main(argv=sys.argv): + root = Tkinter.Tk() + root.withdraw() + progname = os.path.basename(argv[0]) + keypath = 'adeptkey.der' + success = False + try: + success = retrieve_key(keypath) + except ADEPTError, e: + tkMessageBox.showerror("ADEPT Key", "Error: " + str(e)) + except Exception: + root.wm_state('normal') + root.title('ADEPT Key') + text = traceback.format_exc() + ExceptionDialog(root, text).pack(fill=Tkconstants.BOTH, expand=1) + root.mainloop() + if not success: + return 1 + tkMessageBox.showinfo( + "ADEPT Key", "Key successfully retrieved to %s" % (keypath)) + return 0 + +if __name__ == '__main__': + if len(sys.argv) > 1: + sys.exit(cli_main()) + sys.exit(main()) diff --git a/ineptpdf.pyw b/Adobe_PDF_Tools/ineptpdf.pyw similarity index 100% rename from ineptpdf.pyw rename to Adobe_PDF_Tools/ineptpdf.pyw diff --git a/ineptpdf8.pyw b/Adobe_PDF_Tools/ineptpdf8.pyw similarity index 100% rename from ineptpdf8.pyw rename to Adobe_PDF_Tools/ineptpdf8.pyw diff --git a/Barnes_and_Noble_EPUB_Tools/ignobleepub.pyw b/Barnes_and_Noble_EPUB_Tools/ignobleepub.pyw index 46cd4e8..469713a 100644 --- a/Barnes_and_Noble_EPUB_Tools/ignobleepub.pyw +++ b/Barnes_and_Noble_EPUB_Tools/ignobleepub.pyw @@ -144,6 +144,7 @@ class Decryptor(object): enc('CipherReference')) for elem in encryption.findall(expr): path = elem.get('URI', None) + path = path.encode('utf-8') if path is not None: encrypted.add(path) diff --git a/Topaz_Tools/lib/convert2xml.py b/Calibre_Plugins/K4MobiDeDRM_plugin/convert2xml.py similarity index 98% rename from Topaz_Tools/lib/convert2xml.py rename to Calibre_Plugins/K4MobiDeDRM_plugin/convert2xml.py index d3ccd48..3070ab6 100644 --- a/Topaz_Tools/lib/convert2xml.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/convert2xml.py @@ -730,7 +730,20 @@ class PageParser(object): return xmlpage - +def fromData(dict, fname): + flat_xml = True + debug = False + pp = PageParser(fname, dict, debug, flat_xml) + xmlpage = pp.process() + return xmlpage + +def getXML(dict, fname): + flat_xml = False + debug = False + pp = PageParser(fname, dict, debug, flat_xml) + xmlpage = pp.process() + return xmlpage + def usage(): print 'Usage: ' print ' convert2xml.py dict0000.dat infile.dat ' @@ -801,4 +814,4 @@ def main(argv): return xmlpage if __name__ == '__main__': - sys.exit(main('')) \ No newline at end of file + sys.exit(main('')) diff --git a/Topaz_Tools/lib/flatxml2html.py b/Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2html.py similarity index 96% rename from Topaz_Tools/lib/flatxml2html.py rename to Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2html.py index cf3f9f9..81d93bc 100644 --- a/Topaz_Tools/lib/flatxml2html.py +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2html.py @@ -12,15 +12,14 @@ from struct import unpack class DocParser(object): - def __init__(self, flatxml, classlst, fileid, bookDir, fixedimage): + def __init__(self, flatxml, classlst, fileid, bookDir, gdict, fixedimage): self.id = os.path.basename(fileid).replace('.dat','') self.svgcount = 0 self.docList = flatxml.split('\n') self.docSize = len(self.docList) self.classList = {} self.bookDir = bookDir - self.glyphPaths = { } - self.numPaths = 0 + self.gdict = gdict tmpList = classlst.split('\n') for pclass in tmpList: if pclass != '': @@ -41,9 +40,8 @@ class DocParser(object): def getGlyph(self, gid): result = '' - id='gl%d' % gid - return self.glyphPaths[id] - + id='id="gl%d"' % gid + return self.gdict.lookup(id) def glyphs_to_image(self, glyphList): @@ -52,31 +50,12 @@ class DocParser(object): e = path.find(' ',b) return int(path[b:e]) - def extractID(path, key): - b = path.find(key) + len(key) - e = path.find('"',b) - return path[b:e] - - svgDir = os.path.join(self.bookDir,'svg') - glyfile = os.path.join(svgDir,'glyphs.svg') imgDir = os.path.join(self.bookDir,'img') imgname = self.id + '_%04d.svg' % self.svgcount imgfile = os.path.join(imgDir,imgname) - # build hashtable of glyph paths keyed by glyph id - if self.numPaths == 0: - gfile = open(glyfile, 'r') - while True: - path = gfile.readline() - if (path == ''): break - glyphid = extractID(path,'id="') - self.glyphPaths[glyphid] = path - self.numPaths += 1 - gfile.close() - - # get glyph information gxList = self.getData('info.glyph.x',0,-1) gyList = self.getData('info.glyph.y',0,-1) @@ -720,11 +699,8 @@ class DocParser(object): -def convert2HTML(flatxml, classlst, fileid, bookDir, fixedimage): - +def convert2HTML(flatxml, classlst, fileid, bookDir, gdict, fixedimage): # create a document parser - dp = DocParser(flatxml, classlst, fileid, bookDir, fixedimage) - + dp = DocParser(flatxml, classlst, fileid, bookDir, gdict, fixedimage) htmlpage = dp.process() - return htmlpage diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2svg.py b/Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2svg.py new file mode 100644 index 0000000..6f6795d --- /dev/null +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/flatxml2svg.py @@ -0,0 +1,151 @@ +#! /usr/bin/python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab + +import sys +import csv +import os +import getopt +from struct import pack +from struct import unpack + + +class PParser(object): + def __init__(self, gd, flatxml): + self.gd = gd + self.flatdoc = flatxml.split('\n') + self.temp = [] + foo = self.getData('page.h') or self.getData('book.h') + self.ph = foo[0] + foo = self.getData('page.w') or self.getData('book.w') + self.pw = foo[0] + self.gx = self.getData('info.glyph.x') + self.gy = self.getData('info.glyph.y') + self.gid = self.getData('info.glyph.glyphID') + def getData(self, path): + result = None + cnt = len(self.flatdoc) + for j in xrange(cnt): + item = self.flatdoc[j] + if item.find('=') >= 0: + (name, argt) = item.split('=') + argres = argt.split('|') + else: + name = item + argres = [] + if (name.endswith(path)): + result = argres + break + if (len(argres) > 0) : + for j in xrange(0,len(argres)): + argres[j] = int(argres[j]) + return result + def getDataTemp(self, path): + result = None + cnt = len(self.temp) + for j in xrange(cnt): + item = self.temp[j] + if item.find('=') >= 0: + (name, argt) = item.split('=') + argres = argt.split('|') + else: + name = item + argres = [] + if (name.endswith(path)): + result = argres + self.temp.pop(j) + break + if (len(argres) > 0) : + for j in xrange(0,len(argres)): + argres[j] = int(argres[j]) + return result + def getImages(self): + result = [] + self.temp = self.flatdoc + while (self.getDataTemp('img') != None): + h = self.getDataTemp('img.h')[0] + w = self.getDataTemp('img.w')[0] + x = self.getDataTemp('img.x')[0] + y = self.getDataTemp('img.y')[0] + src = self.getDataTemp('img.src')[0] + result.append('\n' % (src, x, y, w, h)) + return result + def getGlyphs(self): + result = [] + if (self.gid != None) and (len(self.gid) > 0): + glyphs = [] + for j in set(self.gid): + glyphs.append(j) + glyphs.sort() + for gid in glyphs: + id='id="gl%d"' % gid + path = self.gd.lookup(id) + if path: + result.append(id + ' ' + path) + return result + + +def convert2SVG(gdict, flat_xml, counter, numfiles, svgDir, raw, meta_array, scaledpi): + ml = '' + pp = PParser(gdict, flat_xml) + ml += '\n' + if (raw): + ml += '\n' + ml += '\n' % (pp.pw / scaledpi, pp.ph / scaledpi, pp.pw -1, pp.ph -1) + ml += 'Page %d - %s by %s\n' % (counter, meta_array['Title'],meta_array['Authors']) + else: + ml += '\n' + ml += '\n' + ml += 'Page %d - %s by %s\n' % (counter, meta_array['Title'],meta_array['Authors']) + ml += '\n' + ml += '\n' + ml += '\n' + ml += '
\n' + if (counter == 0) : + ml += '\n' + else: + ml += '\n' + ml += '' % (pp.pw, pp.ph) + if (pp.gid != None): + ml += '\n' + gdefs = pp.getGlyphs() + for j in xrange(0,len(gdefs)): + ml += gdefs[j] + ml += '\n' + img = pp.getImages() + if (img != None): + for j in xrange(0,len(img)): + ml += img[j] + if (pp.gid != None): + for j in xrange(0,len(pp.gid)): + ml += '\n' % (pp.gid[j], pp.gx[j], pp.gy[j]) + if (img == None or len(img) == 0) and (pp.gid == None or len(pp.gid) == 0): + ml += 'This page intentionally left blank.\nUntil this notice unintentionally gave it content. (gensvg.py)\n' + if (raw) : + ml += '' + else : + ml += '\n' + if (counter == numfiles - 1) : + ml += '\n' + else : + ml += '\n' + ml += '
\n' + ml += '
zoom in - zoom out
\n' + ml += '\n' + ml += '\n' + return ml + diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py b/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py new file mode 100644 index 0000000..a483dec --- /dev/null +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/genbook.py @@ -0,0 +1,561 @@ +#! /usr/bin/python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab + +class Unbuffered: + def __init__(self, stream): + self.stream = stream + def write(self, data): + self.stream.write(data) + self.stream.flush() + def __getattr__(self, attr): + return getattr(self.stream, attr) + +import sys +sys.stdout=Unbuffered(sys.stdout) + +import csv +import os +import getopt +from struct import pack +from struct import unpack + + +# local support routines +import convert2xml +import flatxml2html +import flatxml2svg +import stylexml2css + + +# Get a 7 bit encoded number from a file +def readEncodedNumber(file): + flag = False + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + if data == 0xFF: + flag = True + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + if data >= 0x80: + datax = (data & 0x7F) + while data >= 0x80 : + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + datax = (datax <<7) + (data & 0x7F) + data = datax + if flag: + data = -data + return data + +# Get a length prefixed string from the file +def lengthPrefixString(data): + return encodeNumber(len(data))+data + +def readString(file): + stringLength = readEncodedNumber(file) + if (stringLength == None): + return None + sv = file.read(stringLength) + if (len(sv) != stringLength): + return "" + return unpack(str(stringLength)+"s",sv)[0] + +def getMetaArray(metaFile): + # parse the meta file + result = {} + fo = file(metaFile,'rb') + size = readEncodedNumber(fo) + for i in xrange(size): + tag = readString(fo) + value = readString(fo) + result[tag] = value + # print tag, value + fo.close() + return result + + +# dictionary of all text strings by index value +class Dictionary(object): + def __init__(self, dictFile): + self.filename = dictFile + self.size = 0 + self.fo = file(dictFile,'rb') + self.stable = [] + self.size = readEncodedNumber(self.fo) + for i in xrange(self.size): + self.stable.append(self.escapestr(readString(self.fo))) + self.pos = 0 + def escapestr(self, str): + str = str.replace('&','&') + str = str.replace('<','<') + str = str.replace('>','>') + str = str.replace('=','=') + return str + def lookup(self,val): + if ((val >= 0) and (val < self.size)) : + self.pos = val + return self.stable[self.pos] + else: + print "Error - %d outside of string table limits" % val + sys.exit(-1) + def getSize(self): + return self.size + def getPos(self): + return self.pos + + +class PageDimParser(object): + def __init__(self, flatxml): + self.flatdoc = flatxml.split('\n') + # find tag if within pos to end inclusive + def findinDoc(self, tagpath, pos, end) : + result = None + docList = self.flatdoc + cnt = len(docList) + if end == -1 : + end = cnt + else: + end = min(cnt,end) + foundat = -1 + for j in xrange(pos, end): + item = docList[j] + if item.find('=') >= 0: + (name, argres) = item.split('=') + else : + name = item + argres = '' + if name.endswith(tagpath) : + result = argres + foundat = j + break + return foundat, result + def process(self): + (pos, sph) = self.findinDoc('page.h',0,-1) + (pos, spw) = self.findinDoc('page.w',0,-1) + if (sph == None): sph = '-1' + if (spw == None): spw = '-1' + return sph, spw + +def getPageDim(flatxml): + # create a document parser + dp = PageDimParser(flatxml) + (ph, pw) = dp.process() + return ph, pw + +class GParser(object): + def __init__(self, flatxml): + self.flatdoc = flatxml.split('\n') + self.dpi = 1440 + self.gh = self.getData('info.glyph.h') + self.gw = self.getData('info.glyph.w') + self.guse = self.getData('info.glyph.use') + if self.guse : + self.count = len(self.guse) + else : + self.count = 0 + self.gvtx = self.getData('info.glyph.vtx') + self.glen = self.getData('info.glyph.len') + self.gdpi = self.getData('info.glyph.dpi') + self.vx = self.getData('info.vtx.x') + self.vy = self.getData('info.vtx.y') + self.vlen = self.getData('info.len.n') + if self.vlen : + self.glen.append(len(self.vlen)) + elif self.glen: + self.glen.append(0) + if self.vx : + self.gvtx.append(len(self.vx)) + elif self.gvtx : + self.gvtx.append(0) + def getData(self, path): + result = None + cnt = len(self.flatdoc) + for j in xrange(cnt): + item = self.flatdoc[j] + if item.find('=') >= 0: + (name, argt) = item.split('=') + argres = argt.split('|') + else: + name = item + argres = [] + if (name == path): + result = argres + break + if (len(argres) > 0) : + for j in xrange(0,len(argres)): + argres[j] = int(argres[j]) + return result + def getGlyphDim(self, gly): + maxh = (self.gh[gly] * self.dpi) / self.gdpi[gly] + maxw = (self.gw[gly] * self.dpi) / self.gdpi[gly] + return maxh, maxw + def getPath(self, gly): + path = '' + if (gly < 0) or (gly >= self.count): + return path + tx = self.vx[self.gvtx[gly]:self.gvtx[gly+1]] + ty = self.vy[self.gvtx[gly]:self.gvtx[gly+1]] + p = 0 + for k in xrange(self.glen[gly], self.glen[gly+1]): + if (p == 0): + zx = tx[0:self.vlen[k]+1] + zy = ty[0:self.vlen[k]+1] + else: + zx = tx[self.vlen[k-1]+1:self.vlen[k]+1] + zy = ty[self.vlen[k-1]+1:self.vlen[k]+1] + p += 1 + j = 0 + while ( j < len(zx) ): + if (j == 0): + # Start Position. + path += 'M %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly]) + elif (j <= len(zx)-3): + # Cubic Bezier Curve + path += 'C %d %d %d %d %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly], zx[j+1] * self.dpi / self.gdpi[gly], zy[j+1] * self.dpi / self.gdpi[gly], zx[j+2] * self.dpi / self.gdpi[gly], zy[j+2] * self.dpi / self.gdpi[gly]) + j += 2 + elif (j == len(zx)-2): + # Cubic Bezier Curve to Start Position + path += 'C %d %d %d %d %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly], zx[j+1] * self.dpi / self.gdpi[gly], zy[j+1] * self.dpi / self.gdpi[gly], zx[0] * self.dpi / self.gdpi[gly], zy[0] * self.dpi / self.gdpi[gly]) + j += 1 + elif (j == len(zx)-1): + # Quadratic Bezier Curve to Start Position + path += 'Q %d %d %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly], zx[0] * self.dpi / self.gdpi[gly], zy[0] * self.dpi / self.gdpi[gly]) + + j += 1 + path += 'z' + return path + + + +# dictionary of all text strings by index value +class GlyphDict(object): + def __init__(self): + self.gdict = {} + def lookup(self, id): + # id='id="gl%d"' % val + if id in self.gdict: + return self.gdict[id] + return None + def addGlyph(self, val, path): + id='id="gl%d"' % val + self.gdict[id] = path + + +def generateBook(bookDir, raw, fixedimage): + # sanity check Topaz file extraction + if not os.path.exists(bookDir) : + print "Can not find directory with unencrypted book" + return 1 + + dictFile = os.path.join(bookDir,'dict0000.dat') + if not os.path.exists(dictFile) : + print "Can not find dict0000.dat file" + return 1 + + pageDir = os.path.join(bookDir,'page') + if not os.path.exists(pageDir) : + print "Can not find page directory in unencrypted book" + return 1 + + imgDir = os.path.join(bookDir,'img') + if not os.path.exists(imgDir) : + print "Can not find image directory in unencrypted book" + return 1 + + glyphsDir = os.path.join(bookDir,'glyphs') + if not os.path.exists(glyphsDir) : + print "Can not find glyphs directory in unencrypted book" + return 1 + + metaFile = os.path.join(bookDir,'metadata0000.dat') + if not os.path.exists(metaFile) : + print "Can not find metadata0000.dat in unencrypted book" + return 1 + + svgDir = os.path.join(bookDir,'svg') + if not os.path.exists(svgDir) : + os.makedirs(svgDir) + + xmlDir = os.path.join(bookDir,'xml') + if not os.path.exists(xmlDir) : + os.makedirs(xmlDir) + + otherFile = os.path.join(bookDir,'other0000.dat') + if not os.path.exists(otherFile) : + print "Can not find other0000.dat in unencrypted book" + return 1 + + print "Updating to color images if available" + spath = os.path.join(bookDir,'color_img') + dpath = os.path.join(bookDir,'img') + filenames = os.listdir(spath) + filenames = sorted(filenames) + for filename in filenames: + imgname = filename.replace('color','img') + sfile = os.path.join(spath,filename) + dfile = os.path.join(dpath,imgname) + imgdata = file(sfile,'rb').read() + file(dfile,'wb').write(imgdata) + + print "Creating cover.jpg" + isCover = False + cpath = os.path.join(bookDir,'img') + cpath = os.path.join(cpath,'img0000.jpg') + if os.path.isfile(cpath): + cover = file(cpath, 'rb').read() + cpath = os.path.join(bookDir,'cover.jpg') + file(cpath, 'wb').write(cover) + isCover = True + + + print 'Processing Dictionary' + dict = Dictionary(dictFile) + + print 'Processing Meta Data and creating OPF' + meta_array = getMetaArray(metaFile) + + xname = os.path.join(xmlDir, 'metadata.xml') + metastr = '' + for key in meta_array: + metastr += '\n' + file(xname, 'wb').write(metastr) + + print 'Processing StyleSheet' + # get some scaling info from metadata to use while processing styles + fontsize = '135' + if 'fontSize' in meta_array: + fontsize = meta_array['fontSize'] + + # also get the size of a normal text page + spage = '1' + if 'firstTextPage' in meta_array: + spage = meta_array['firstTextPage'] + pnum = int(spage) + + # get page height and width from first text page for use in stylesheet scaling + pname = 'page%04d.dat' % (pnum + 1) + fname = os.path.join(pageDir,pname) + flat_xml = convert2xml.fromData(dict, fname) + + (ph, pw) = getPageDim(flat_xml) + if (ph == '-1') or (ph == '0') : ph = '11000' + if (pw == '-1') or (pw == '0') : pw = '8500' + + # print ' ', 'other0000.dat' + xname = os.path.join(bookDir, 'style.css') + flat_xml = convert2xml.fromData(dict, otherFile) + cssstr , classlst = stylexml2css.convert2CSS(flat_xml, fontsize, ph, pw) + file(xname, 'wb').write(cssstr) + xname = os.path.join(xmlDir, 'other0000.xml') + file(xname, 'wb').write(convert2xml.getXML(dict, otherFile)) + + print 'Processing Glyphs' + gd = GlyphDict() + filenames = os.listdir(glyphsDir) + filenames = sorted(filenames) + glyfname = os.path.join(svgDir,'glyphs.svg') + glyfile = open(glyfname, 'w') + glyfile.write('\n') + glyfile.write('\n') + glyfile.write('\n') + glyfile.write('Glyphs for %s\n' % meta_array['Title']) + glyfile.write('\n') + counter = 0 + for filename in filenames: + # print ' ', filename + print '.', + fname = os.path.join(glyphsDir,filename) + flat_xml = convert2xml.fromData(dict, fname) + + xname = os.path.join(xmlDir, filename.replace('.dat','.xml')) + file(xname, 'wb').write(convert2xml.getXML(dict, fname)) + + gp = GParser(flat_xml) + for i in xrange(0, gp.count): + path = gp.getPath(i) + maxh, maxw = gp.getGlyphDim(i) + fullpath = '\n' % (counter * 256 + i, path, maxw, maxh) + glyfile.write(fullpath) + gd.addGlyph(counter * 256 + i, fullpath) + counter += 1 + glyfile.write('\n') + glyfile.write('\n') + glyfile.close() + print " " + + # start up the html + htmlFileName = "book.html" + htmlstr = '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '' + meta_array['Title'] + ' by ' + meta_array['Authors'] + '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n\n' + + print 'Processing Pages' + # Books are at 1440 DPI. This is rendering at twice that size for + # readability when rendering to the screen. + scaledpi = 1440.0 + + svgindex = '\n' + svgindex += '\n' + svgindex += '' + svgindex += '\n' + svgindex += '' + meta_array['Title'] + '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + + filenames = os.listdir(pageDir) + filenames = sorted(filenames) + numfiles = len(filenames) + counter = 0 + + for filename in filenames: + # print ' ', filename + print ".", + + fname = os.path.join(pageDir,filename) + flat_xml = convert2xml.fromData(dict, fname) + + xname = os.path.join(xmlDir, filename.replace('.dat','.xml')) + file(xname, 'wb').write(convert2xml.getXML(dict, fname)) + + # first get the html + htmlstr += flatxml2html.convert2HTML(flat_xml, classlst, fname, bookDir, gd, fixedimage) + + # now get the svg image of the page + svgxml = flatxml2svg.convert2SVG(gd, flat_xml, counter, numfiles, svgDir, raw, meta_array, scaledpi) + + if (raw) : + pfile = open(os.path.join(svgDir,filename.replace('.dat','.svg')), 'w') + svgindex += 'Page %d\n' % (counter, counter) + else : + pfile = open(os.path.join(svgDir,'page%04d.xhtml' % counter), 'w') + svgindex += 'Page %d\n' % (counter, counter) + + + pfile.write(svgxml) + pfile.close() + + counter += 1 + + print " " + + # finish up the html string and output it + htmlstr += '\n\n' + file(os.path.join(bookDir, htmlFileName), 'wb').write(htmlstr) + + # finish up the svg index string and output it + svgindex += '\n\n' + file(os.path.join(bookDir, 'index_svg.xhtml'), 'wb').write(svgindex) + + # build the opf file + opfname = os.path.join(bookDir, 'book.opf') + opfstr = '\n' + opfstr += '\n' + # adding metadata + opfstr += ' \n' + opfstr += ' ' + meta_array['GUID'] + '\n' + opfstr += ' ' + meta_array['ASIN'] + '\n' + opfstr += ' ' + meta_array['oASIN'] + '\n' + opfstr += ' ' + meta_array['Title'] + '\n' + opfstr += ' ' + meta_array['Authors'] + '\n' + opfstr += ' en\n' + opfstr += ' ' + meta_array['UpdateTime'] + '\n' + if isCover: + opfstr += ' \n' + opfstr += ' \n' + opfstr += '\n' + opfstr += ' \n' + opfstr += ' \n' + # adding image files to manifest + filenames = os.listdir(imgDir) + filenames = sorted(filenames) + for filename in filenames: + imgname, imgext = os.path.splitext(filename) + if imgext == '.jpg': + imgext = 'jpeg' + if imgext == '.svg': + imgext = 'svg+xml' + opfstr += ' \n' + if isCover: + opfstr += ' \n' + opfstr += '\n' + # adding spine + opfstr += '\n \n\n' + if isCover: + opfstr += ' \n' + opfstr += ' \n' + opfstr += ' \n' + opfstr += '\n' + file(opfname, 'wb').write(opfstr) + + print 'Processing Complete' + + return 0 + +def usage(): + print "genbook.py generates a book from the extract Topaz Files" + print "Usage:" + print " genbook.py [-r] [-h [--fixed-image] " + print " " + print "Options:" + print " -h : help - print this usage message" + print " -r : generate raw svg files (not wrapped in xhtml)" + print " --fixed-image : genearate any Fixed Area as an svg image in the html" + print " " + + +def main(argv): + bookDir = '' + + if len(argv) == 0: + argv = sys.argv + + try: + opts, args = getopt.getopt(argv[1:], "rh:",["fixed-image"]) + + except getopt.GetoptError, err: + print str(err) + usage() + return 1 + + if len(opts) == 0 and len(args) == 0 : + usage() + return 1 + + raw = 0 + fixedimage = False + for o, a in opts: + if o =="-h": + usage() + return 0 + if o =="-r": + raw = 1 + if o =="--fixed-image": + fixedimage = True + + bookDir = args[0] + + rv = generateBook(bookDir, raw, fixedimage) + return rv + + +if __name__ == '__main__': + sys.exit(main('')) diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py b/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py new file mode 100644 index 0000000..5c44bfa --- /dev/null +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/kgenpids.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python + +from __future__ import with_statement +import sys +import os, csv +import binascii +import zlib +import re +from struct import pack, unpack, unpack_from + +class DrmException(Exception): + pass + +global kindleDatabase +global charMap1 +global charMap2 +global charMap3 +global charMap4 + +if sys.platform.startswith('win'): + from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 +if sys.platform.startswith('darwin'): + from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + +charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" +charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" + +# crypto digestroutines +import hashlib + +def MD5(message): + ctx = hashlib.md5() + ctx.update(message) + return ctx.digest() + +def SHA1(message): + ctx = hashlib.sha1() + ctx.update(message) + return ctx.digest() + + +# Encode the bytes in data with the characters in map +def encode(data, map): + result = "" + for char in data: + value = ord(char) + Q = (value ^ 0x80) // len(map) + R = value % len(map) + result += map[Q] + result += map[R] + return result + +# Hash the bytes in data and then encode the digest with the characters in map +def encodeHash(data,map): + return encode(MD5(data),map) + +# Decode the string in data with the characters in map. Returns the decoded bytes +def decode(data,map): + result = "" + for i in range (0,len(data)-1,2): + high = map.find(data[i]) + low = map.find(data[i+1]) + if (high == -1) or (low == -1) : + break + value = (((high * len(map)) ^ 0x80) & 0xFF) + low + result += pack("B",value) + return result + + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = openKindleInfo(kInfoFile) + infoReader.read(1) + data = infoReader.read() + if sys.platform.startswith('win'): + items = data.split('{') + else : + items = data.split('[') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB + +# Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). Return the decoded and decrypted record +def getKindleInfoValueForHash(hashedKey): + global kindleDatabase + global charMap1 + global charMap2 + encryptedValue = decode(kindleDatabase[hashedKey],charMap2) + if sys.platform.startswith('win'): + return CryptUnprotectData(encryptedValue,"") + else: + cleartext = CryptUnprotectData(encryptedValue) + return decode(cleartext, charMap1) + +# Get a record from the Kindle.info file for the string in "key" (plaintext). Return the decoded and decrypted record +def getKindleInfoValueForKey(key): + global charMap2 + return getKindleInfoValueForHash(encodeHash(key,charMap2)) + +# Find if the original string for a hashed/encoded string is known. If so return the original string othwise return an empty string. +def findNameForHash(hash): + global charMap2 + names = ["kindle.account.tokens","kindle.cookie.item","eulaVersionAccepted","login_date","kindle.token.item","login","kindle.key.item","kindle.name.info","kindle.device.info", "MazamaRandomNumber"] + result = "" + for name in names: + if hash == encodeHash(name, charMap2): + result = name + break + return result + +# Print all the records from the kindle.info file (option -i) +def printKindleInfo(): + for record in kindleDatabase: + name = findNameForHash(record) + if name != "" : + print (name) + print ("--------------------------") + else : + print ("Unknown Record") + print getKindleInfoValueForHash(record) + print "\n" + +# +# PID generation routines +# + +# Returns two bit at offset from a bit field +def getTwoBitsFromBitField(bitField,offset): + byteNumber = offset // 4 + bitPosition = 6 - 2*(offset % 4) + return ord(bitField[byteNumber]) >> bitPosition & 3 + +# Returns the six bits at offset from a bit field +def getSixBitsFromBitField(bitField,offset): + offset *= 3 + value = (getTwoBitsFromBitField(bitField,offset) <<4) + (getTwoBitsFromBitField(bitField,offset+1) << 2) +getTwoBitsFromBitField(bitField,offset+2) + return value + +# 8 bits to six bits encoding from hash to generate PID string +def encodePID(hash): + global charMap3 + PID = "" + for position in range (0,8): + PID += charMap3[getSixBitsFromBitField(hash,position)] + return PID + +# Encryption table used to generate the device PID +def generatePidEncryptionTable() : + table = [] + for counter1 in range (0,0x100): + value = counter1 + for counter2 in range (0,8): + if (value & 1 == 0) : + value = value >> 1 + else : + value = value >> 1 + value = value ^ 0xEDB88320 + table.append(value) + return table + +# Seed value used to generate the device PID +def generatePidSeed(table,dsn) : + value = 0 + for counter in range (0,4) : + index = (ord(dsn[counter]) ^ value) &0xFF + value = (value >> 8) ^ table[index] + return value + +# Generate the device PID +def generateDevicePID(table,dsn,nbRoll): + global charMap4 + seed = generatePidSeed(table,dsn) + pidAscii = "" + pid = [(seed >>24) &0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF,(seed>>24) & 0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF] + index = 0 + for counter in range (0,nbRoll): + pid[index] = pid[index] ^ ord(dsn[counter]) + index = (index+1) %8 + for counter in range (0,8): + index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) + pidAscii += charMap4[index] + return pidAscii + +def crc32(s): + return (~binascii.crc32(s,-1))&0xFFFFFFFF + +# convert from 8 digit PID to 10 digit PID with checksum +def checksumPid(s): + global charMap4 + crc = crc32(s) + crc = crc ^ (crc >> 16) + res = s + l = len(charMap4) + for i in (0,1): + b = crc & 0xff + pos = (b // l) ^ (b % l) + res += charMap4[pos%l] + crc >>= 8 + return res + + +# old kindle serial number to fixed pid +def pidFromSerial(s, l): + global charMap4 + crc = crc32(s) + arr1 = [0]*l + for i in xrange(len(s)): + arr1[i%l] ^= ord(s[i]) + crc_bytes = [crc >> 24 & 0xff, crc >> 16 & 0xff, crc >> 8 & 0xff, crc & 0xff] + for i in xrange(l): + arr1[i] ^= crc_bytes[i&3] + pid = "" + for i in xrange(l): + b = arr1[i] & 0xff + pid+=charMap4[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))] + return pid + + +# Parse the EXTH header records and use the Kindle serial number to calculate the book pid. +def getKindlePid(pidlst, rec209, token, serialnum): + + if rec209 != None: + # Compute book PID + pidHash = SHA1(serialnum+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + # compute fixed pid for old pre 2.5 firmware update pid as well + bookPID = pidFromSerial(serialnum, 7) + "*" + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + return pidlst + + +# Parse the EXTH header records and parse the Kindleinfo +# file to calculate the book pid. + +def getK4Pids(pidlst, rec209, token, kInfoFile=None): + global kindleDatabase + global charMap1 + kindleDatabase = None + try: + kindleDatabase = parseKindleInfo(kInfoFile) + except Exception, message: + print(message) + pass + + if kindleDatabase == None : + return pidlst + + # Get the Mazama Random number + MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") + + # Get the HDD serial + encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) + + # Get the current user name + encodedUsername = encodeHash(GetUserName(),charMap1) + + # concat, hash and encode to calculate the DSN + DSN = encode(SHA1(MazamaRandomNumber+encodedSystemVolumeSerialNumber+encodedUsername),charMap1) + + # Compute the device PID (for which I can tell, is used for nothing). + table = generatePidEncryptionTable() + devicePID = generateDevicePID(table,DSN,4) + devicePID = checksumPid(devicePID) + pidlst.append(devicePID) + + # Compute book PID + if rec209 == None: + print "\nNo EXTH record type 209 - Perhaps not a K4 file?" + return pidlst + + # Get the kindle account token + kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + + # book pid + pidHash = SHA1(DSN+kindleAccountToken+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + # variant 1 + pidHash = SHA1(kindleAccountToken+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + # variant 2 + pidHash = SHA1(DSN+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + return pidlst + +def getPidList(md1, md2, k4, pids, serials, kInfoFiles): + pidlst = [] + if k4: + pidlst = getK4Pids(pidlst, md1, md2) + for infoFile in kInfoFiles: + pidlst = getK4Pids(pidlst, md1, md2, infoFile) + for serialnum in serials: + pidlst = getKindlePid(pidlst, md1, md2, serialnum) + for pid in pids: + pidlst.append(pid) + return pidlst diff --git a/Topaz_Tools/lib/stylexml2css.py b/Calibre_Plugins/K4MobiDeDRM_plugin/stylexml2css.py similarity index 100% rename from Topaz_Tools/lib/stylexml2css.py rename to Calibre_Plugins/K4MobiDeDRM_plugin/stylexml2css.py diff --git a/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py b/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py new file mode 100644 index 0000000..e371d76 --- /dev/null +++ b/Calibre_Plugins/K4MobiDeDRM_plugin/topazextract.py @@ -0,0 +1,434 @@ +#!/usr/bin/env python + +class Unbuffered: + def __init__(self, stream): + self.stream = stream + def write(self, data): + self.stream.write(data) + self.stream.flush() + def __getattr__(self, attr): + return getattr(self.stream, attr) + +import sys +sys.stdout=Unbuffered(sys.stdout) +import os, csv, getopt +import zlib, zipfile, tempfile, shutil +from struct import pack +from struct import unpack + +class TpzDRMError(Exception): + pass + +# local support routines +import kgenpids +import genbook +# +# Utility routines +# + +# Get a 7 bit encoded number from file +def bookReadEncodedNumber(fo): + flag = False + data = ord(fo.read(1)) + if data == 0xFF: + flag = True + data = ord(fo.read(1)) + if data >= 0x80: + datax = (data & 0x7F) + while data >= 0x80 : + data = ord(fo.read(1)) + datax = (datax <<7) + (data & 0x7F) + data = datax + if flag: + data = -data + return data + +# Get a length prefixed string from file +def bookReadString(fo): + stringLength = bookReadEncodedNumber(fo) + return unpack(str(stringLength)+"s",fo.read(stringLength))[0] + +# +# crypto routines +# + +# Context initialisation for the Topaz Crypto +def topazCryptoInit(key): + ctx1 = 0x0CAFFE19E + for keyChar in key: + keyByte = ord(keyChar) + ctx2 = ctx1 + ctx1 = ((((ctx1 >>2) * (ctx1 >>7))&0xFFFFFFFF) ^ (keyByte * keyByte * 0x0F902007)& 0xFFFFFFFF ) + return [ctx1,ctx2] + +# decrypt data with the context prepared by topazCryptoInit() +def topazCryptoDecrypt(data, ctx): + ctx1 = ctx[0] + ctx2 = ctx[1] + plainText = "" + for dataChar in data: + dataByte = ord(dataChar) + m = (dataByte ^ ((ctx1 >> 3) &0xFF) ^ ((ctx2<<3) & 0xFF)) &0xFF + ctx2 = ctx1 + ctx1 = (((ctx1 >> 2) * (ctx1 >> 7)) &0xFFFFFFFF) ^((m * m * 0x0F902007) &0xFFFFFFFF) + plainText += chr(m) + return plainText + +# Decrypt data with the PID +def decryptRecord(data,PID): + ctx = topazCryptoInit(PID) + return topazCryptoDecrypt(data, ctx) + +# Try to decrypt a dkey record (contains the bookPID) +def decryptDkeyRecord(data,PID): + record = decryptRecord(data,PID) + fields = unpack("3sB8sB8s3s",record) + if fields[0] != "PID" or fields[5] != "pid" : + raise TpzDRMError("Didn't find PID magic numbers in record") + elif fields[1] != 8 or fields[3] != 8 : + raise TpzDRMError("Record didn't contain correct length fields") + elif fields[2] != PID : + raise TpzDRMError("Record didn't contain PID") + return fields[4] + +# Decrypt all dkey records (contain the book PID) +def decryptDkeyRecords(data,PID): + nbKeyRecords = ord(data[0]) + records = [] + data = data[1:] + for i in range (0,nbKeyRecords): + length = ord(data[0]) + try: + key = decryptDkeyRecord(data[1:length+1],PID) + records.append(key) + except TpzDRMError: + pass + data = data[1+length:] + if len(records) == 0: + raise TpzDRMError("BookKey Not Found") + return records + + +class TopazBook: + def __init__(self, filename, outdir): + self.fo = file(filename, 'rb') + self.outdir = outdir + self.bookPayloadOffset = 0 + self.bookHeaderRecords = {} + self.bookMetadata = {} + self.bookKey = None + magic = unpack("4s",self.fo.read(4))[0] + if magic != 'TPZ0': + raise TpzDRMError("Parse Error : Invalid Header, not a Topaz file") + self.parseTopazHeaders() + self.parseMetadata() + + def parseTopazHeaders(self): + def bookReadHeaderRecordData(): + # Read and return the data of one header record at the current book file position + # [[offset,decompressedLength,compressedLength],...] + nbValues = bookReadEncodedNumber(self.fo) + values = [] + for i in range (0,nbValues): + values.append([bookReadEncodedNumber(self.fo),bookReadEncodedNumber(self.fo),bookReadEncodedNumber(self.fo)]) + return values + def parseTopazHeaderRecord(): + # Read and parse one header record at the current book file position and return the associated data + # [[offset,decompressedLength,compressedLength],...] + if ord(self.fo.read(1)) != 0x63: + raise TpzDRMError("Parse Error : Invalid Header") + tag = bookReadString(self.fo) + record = bookReadHeaderRecordData() + return [tag,record] + nbRecords = bookReadEncodedNumber(self.fo) + for i in range (0,nbRecords): + result = parseTopazHeaderRecord() + # print result[0], result[1] + self.bookHeaderRecords[result[0]] = result[1] + if ord(self.fo.read(1)) != 0x64 : + raise TpzDRMError("Parse Error : Invalid Header") + self.bookPayloadOffset = self.fo.tell() + + def parseMetadata(self): + # Parse the metadata record from the book payload and return a list of [key,values] + self.fo.seek(self.bookPayloadOffset + self.bookHeaderRecords["metadata"][0][0]) + tag = bookReadString(self.fo) + if tag != "metadata" : + raise TpzDRMError("Parse Error : Record Names Don't Match") + flags = ord(self.fo.read(1)) + nbRecords = ord(self.fo.read(1)) + for i in range (0,nbRecords) : + record = [bookReadString(self.fo), bookReadString(self.fo)] + self.bookMetadata[record[0]] = record[1] + return self.bookMetadata + + def getPIDMetaInfo(self): + keysRecord = None + KeysRecordRecord = None + if 'keys' in self.bookMetadata: + keysRecord = self.bookMetadata['keys'] + keysRecordRecord = self.bookMetadata[keysRecord] + return keysRecord, keysRecordRecord + + def getBookTitle(self): + title = '' + if 'Title' in self.bookMetadata: + title = self.bookMetadata['Title'] + return title + + def setBookKey(self, key): + self.bookKey = key + + def getBookPayloadRecord(self, name, index): + # Get a record in the book payload, given its name and index. + # decrypted and decompressed if necessary + encrypted = False + compressed = False + try: + recordOffset = self.bookHeaderRecords[name][index][0] + except: + raise TpzDRMError("Parse Error : Invalid Record, record not found") + + self.fo.seek(self.bookPayloadOffset + recordOffset) + + tag = bookReadString(self.fo) + if tag != name : + raise TpzDRMError("Parse Error : Invalid Record, record name doesn't match") + + recordIndex = bookReadEncodedNumber(self.fo) + if recordIndex < 0 : + encrypted = True + recordIndex = -recordIndex -1 + + if recordIndex != index : + raise TpzDRMError("Parse Error : Invalid Record, index doesn't match") + + if (self.bookHeaderRecords[name][index][2] > 0): + compressed = True + record = self.fo.read(self.bookHeaderRecords[name][index][2]) + else: + record = self.fo.read(self.bookHeaderRecords[name][index][1]) + + if encrypted: + if self.bookKey: + ctx = topazCryptoInit(self.bookKey) + record = topazCryptoDecrypt(record,ctx) + else : + raise TpzDRMError("Error: Attempt to decrypt without bookKey") + + if compressed: + record = zlib.decompress(record) + + return record + + def processBook(self, pidlst): + raw = 0 + fixedimage=True + try: + keydata = self.getBookPayloadRecord('dkey', 0) + except TpzDRMError, e: + print "no dkey record found, book may not be encrypted" + print "attempting to extrct files without a book key" + self.createBookDirectory() + self.extractFiles() + print "Successfully Extracted Topaz contents" + rv = genbook.generateBook(self.outdir, raw, fixedimage) + if rv == 0: + print "\nBook Successfully generated" + return rv + + # try each pid to decode the file + bookKey = None + for pid in pidlst: + # use 8 digit pids here + pid = pid[0:8] + print "\nTrying: ", pid + bookKeys = [] + data = keydata + try: + bookKeys+=decryptDkeyRecords(data,pid) + except TpzDRMError, e: + pass + else: + bookKey = bookKeys[0] + print "Book Key Found!" + break + + if not bookKey: + raise TpzDRMError('Decryption Unsucessful; No valid pid found') + + self.setBookKey(bookKey) + self.createBookDirectory() + self.extractFiles() + print "Successfully Extracted Topaz contents" + rv = genbook.generateBook(self.outdir, raw, fixedimage) + if rv == 0: + print "\nBook Successfully generated" + return rv + + def createBookDirectory(self): + outdir = self.outdir + # create output directory structure + if not os.path.exists(outdir): + os.makedirs(outdir) + destdir = os.path.join(outdir,'img') + if not os.path.exists(destdir): + os.makedirs(destdir) + destdir = os.path.join(outdir,'color_img') + if not os.path.exists(destdir): + os.makedirs(destdir) + destdir = os.path.join(outdir,'page') + if not os.path.exists(destdir): + os.makedirs(destdir) + destdir = os.path.join(outdir,'glyphs') + if not os.path.exists(destdir): + os.makedirs(destdir) + + def extractFiles(self): + outdir = self.outdir + for headerRecord in self.bookHeaderRecords: + name = headerRecord + if name != "dkey" : + ext = '.dat' + if name == 'img' : ext = '.jpg' + if name == 'color' : ext = '.jpg' + print "\nProcessing Section: %s " % name + for index in range (0,len(self.bookHeaderRecords[name])) : + fnum = "%04d" % index + fname = name + fnum + ext + destdir = outdir + if name == 'img': + destdir = os.path.join(outdir,'img') + if name == 'color': + destdir = os.path.join(outdir,'color_img') + if name == 'page': + destdir = os.path.join(outdir,'page') + if name == 'glyphs': + destdir = os.path.join(outdir,'glyphs') + outputFile = os.path.join(destdir,fname) + print ".", + record = self.getBookPayloadRecord(name,index) + if record != '': + file(outputFile, 'wb').write(record) + print " " + + +def zipUpDir(myzip, tempdir,localname): + currentdir = tempdir + if localname != "": + currentdir = os.path.join(currentdir,localname) + list = os.listdir(currentdir) + for file in list: + afilename = file + localfilePath = os.path.join(localname, afilename) + realfilePath = os.path.join(currentdir,file) + if os.path.isfile(realfilePath): + myzip.write(realfilePath, localfilePath) + elif os.path.isdir(realfilePath): + zipUpDir(myzip, tempdir, localfilePath) + + +def usage(progname): + print "Removes DRM protection from Topaz ebooks and extract the contents" + print "Usage:" + print " %s [-k ] [-p ] [-s ] " % progname + + +# Main +def main(argv=sys.argv): + progname = os.path.basename(argv[0]) + k4 = False + pids = [] + serials = [] + kInfoFiles = [] + + try: + opts, args = getopt.getopt(sys.argv[1:], "k:p:s:") + except getopt.GetoptError, err: + print str(err) + usage(progname) + return 1 + if len(args)<2: + usage(progname) + return 1 + + for o, a in opts: + if o == "-k": + if a == None : + print "Invalid parameter for -k" + return 1 + kInfoFiles.append(a) + if o == "-p": + if a == None : + print "Invalid parameter for -p" + return 1 + pids = a.split(',') + if o == "-s": + if a == None : + print "Invalid parameter for -s" + return 1 + serials = a.split(',') + k4 = True + + infile = args[0] + outdir = args[1] + + if not os.path.isfile(infile): + print "Input File Does Not Exist" + return 1 + + bookname = os.path.splitext(os.path.basename(infile))[0] + tempdir = tempfile.mkdtemp() + + tb = TopazBook(infile, tempdir) + title = tb.getBookTitle() + print "Processing Book: ", title + keysRecord, keysRecordRecord = tb.getPIDMetaInfo() + pidlst = kgenpids.getPidList(keysRecord, keysRecordRecord, k4, pids, serials, kInfoFiles) + + try: + tb.processBook(pidlst) + except TpzDRMError, e: + print str(e) + print " Creating DeBug Full Zip Archive of Book" + zipname = os.path.join(outdir, bookname + '_debug' + '.zip') + myzip = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + zipUpDir(myzip, tempdir, '') + myzip.close() + return 1 + + print " Creating HTML ZIP Archive" + zipname = os.path.join(outdir, bookname + '_nodrm' + '.zip') + myzip1 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + myzip1.write(os.path.join(tempdir,'book.html'),'book.html') + myzip1.write(os.path.join(tempdir,'book.opf'),'book.opf') + if os.path.isfile(os.path.join(tempdir,'cover.jpg')): + myzip1.write(os.path.join(tempdir,'cover.jpg'),'cover.jpg') + myzip1.write(os.path.join(tempdir,'style.css'),'style.css') + zipUpDir(myzip1, tempdir, 'img') + myzip1.close() + + print " Creating SVG ZIP Archive" + zipname = os.path.join(outdir, bookname + '_SVG' + '.zip') + myzip2 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + myzip2.write(os.path.join(tempdir,'index_svg.xhtml'),'index_svg.xhtml') + zipUpDir(myzip2, tempdir, 'svg') + zipUpDir(myzip2, tempdir, 'img') + myzip2.close() + + print " Creating XML ZIP Archive" + zipname = os.path.join(outdir, bookname + '_XML' + '.zip') + myzip3 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + targetdir = os.path.join(tempdir,'xml') + zipUpDir(myzip3, targetdir, '') + zipUpDir(myzip3, tempdir, 'img') + myzip3.close() + + shutil.rmtree(tempdir) + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/Calibre_Plugins/README-Ineptpdf-plugin.txt b/Calibre_Plugins/README-Ineptpdf-plugin.txt new file mode 100644 index 0000000..13c938b --- /dev/null +++ b/Calibre_Plugins/README-Ineptpdf-plugin.txt @@ -0,0 +1,36 @@ +Inept PDF Plugin - ineptpdf_vXX_plugin.zip +Requires Calibre version 0.6.44 or higher. + +All credit given to IHeartCabbages for the original standalone scripts. +I had the much easier job of converting them to a Calibre plugin. + +This plugin is meant to decrypt Adobe Digital Edition PDFs that are protected with Adobe's Adept encryption. It is meant to function without having to install any dependencies... other than having Calibre installed, of course. It will still work if you have Python, PyCrypto and/or OpenSSL already installed, but they aren't necessary. + +Installation: + +Go to Calibre's Preferences page... click on the Plugins button. Use the file dialog button to select the plugin's zip file (ineptpdf_vXX_plugin.zip) and click the 'Add' button. you're done. + +Configuration: + +When first run, the plugin will attempt to find your Adobe Digital Editions installation (on Windows and Mac OS's). If successful, it will create an 'adeptkey.der' file and save it in Calibre's configuration directory. It will use that file on subsequent runs. If there are already '*.der' files in the directory, the plugin won't attempt to +find the Adobe Digital Editions installation installation. + +So if you have Adobe Digital Editions installation installed on the same machine as Calibre... you are ready to go. If not... keep reading. + +If you already have keyfiles generated with I <3 Cabbages' ineptkey.pyw script, you can put those keyfiles in Calibre's configuration directory. The easiest way to find the correct directory is to go to Calibre's Preferences page... click on the 'Miscellaneous' button (looks like a gear), and then click the 'Open Calibre configuration directory' button. Paste your keyfiles in there. Just make sure that +they have different names and are saved with the '.der' extension (like the ineptkey script produces). This directory isn't touched when upgrading Calibre, so it's quite safe to leave them there. + +Since there is no Linux version of Adobe Digital Editions, Linux users will have to obtain a keyfile through other methods and put the file in Calibre's configuration directory. + +All keyfiles with a '.der' extension found in Calibre's configuration directory will be used to attempt to decrypt a book. + +** NOTE ** There is no plugin customization data for the Inept PDF plugin. + +Troubleshooting: + +If you find that it's not working for you (imported PDFs still have DRM), you can save a lot of time and trouble by trying to add the PDF to Calibre with the command line tools. This will print out a lot of helpful debugging info that can be copied into any online help requests. I'm going to ask you to do it first, anyway, so you might +as well get used to it. ;) + +Open a command prompt (terminal) and change to the directory where the ebook you're trying to import resides. Then type the command "calibredb add your_ebook.pdf". Don't type the quotes and obviously change the 'your_ebook.pdf' to whatever the filename of your book is. Copy the resulting output and paste it into any online help request you make. + +** Note: the Mac version of Calibre doesn't install the command line tools by default. If you go to the 'Preferences' page and click on the miscellaneous button, you'll see the option to install the command line tools. \ No newline at end of file diff --git a/Calibre_Plugins/README-K4MobiDeDRM-plugin.txt b/Calibre_Plugins/README-K4MobiDeDRM-plugin.txt index 036cfb0..ee9dc06 100644 --- a/Calibre_Plugins/README-K4MobiDeDRM-plugin.txt +++ b/Calibre_Plugins/README-K4MobiDeDRM-plugin.txt @@ -1,20 +1,18 @@ -Plugin for K4PC, K4Mac and Mobi Books +Plugin for K4PC, K4Mac, standalone Kindles, Mobi Books, and for Devices with Fixed PIDs. -Will work on Linux (standard DRM Mobi books only), Mac OS X (standard DRM Mobi books and "Kindle for Mac" books, and Windows (standard DRM Mobi books and "Kindle for PC" books. +This plugin supersedes MobiDeDRM, K4DeDRM, and K4PCDeDRM and K4X plugins. If you install this plugin, those plugins can be safely removed. -This plugin supersedes MobiDeDRM, K4DeDRM, and K4PCDeDRM plugins. If you install this plugin, those plugins can be safely removed. - -This plugin is meant to convert "Kindle for PC", "Kindle for Mac" and "Mobi" ebooks with DRM to unlocked Mobi files. Calibre can then convert them to whatever format you desire. It is meant to function without having to install any dependencies except for Calibre being on your same machine and in the same account as your "Kindle for PC" or "Kindle for Mac" application if you are going to remove the DRM from those types of books. +This plugin is meant to remove the DRM from .prc, .azw, .azw1, and .tpz ebooks. Calibre can then convert them to whatever format you desire. It is meant to function without having to install any dependencies except for Calibre being on your same machine and in the same account as your "Kindle for PC" or "Kindle for Mac" application if you are going to remove the DRM from those types of books. Installation: -Go to Calibre's Preferences page... click on the Plugins button. Use the file dialog button to select the plugin's zip file (k4mobidedrm_vXX_plugin.zip) and click the 'Add' button. You're done. +Go to Calibre's Preferences page... click on the Plugins button. Use the file dialog button to select the plugin's zip file (K4MobiDeDRM_vXX_plugin.zip) and click the 'Add' button. You're done. Configuration: -Highlight the plugin (K4MobiDeDRM under the "File type plugins" category) and click the "Customize Plugin" button on Calibre's Preferences->Plugins page. Enter a comma separated list of your 10 digit PIDs. This is not needed if you only want to decode "Kindle for PC" or "Kindle for Mac" books. +Highlight the plugin (K4MobiDeDRM under the "File type plugins" category) and click the "Customize Plugin" button on Calibre's Preferences->Plugins page. Enter a comma separated list of your 10 digit PIDs. Include in this list (again separated by commas) any 16 digit serial numbers the standalone Kindles you may have (these typically begin "B0...") This is not needed if you only want to decode "Kindle for PC" or "Kindle for Mac" books. Troubleshooting: -If you find that it's not working for you (imported azw's are not converted to mobi format), you can save a lot of time and trouble by trying to add the azw file to Calibre with the command line tools. This will print out a lot of helpful debugging info that can be copied into any online help requests. I'm going to ask you to do it first, anyway, so you might +If you find that it's not working for you, you can save a lot of time and trouble by trying to add the azw file to Calibre with the command line tools. This will print out a lot of helpful debugging info that can be copied into any online help requests. I'm going to ask you to do it first, anyway, so you might as well get used to it. ;) Open a command prompt (terminal) and change to the directory where the ebook you're trying to import resides. Then type the command "calibredb add your_ebook.azw". Don't type the quotes and obviously change the 'your_ebook.azw' to whatever the filename of your book is. Copy the resulting output and paste it into any online help request you make. diff --git a/Calibre_Plugins/eReaderPDB2PML_plugin.zip b/Calibre_Plugins/eReaderPDB2PML_plugin.zip index 5e0fc75d14ea23f15b872e0d44b5cb9597ad3c56..f496b348d84df98173373e72759935dd2586efda 100644 GIT binary patch delta 12054 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 u5(Gm0w{o?p{-L^9*xUW&!|IYl+?Ee9KN}eSE literal 148407 zcmZs?Q?M{P(5|^`+s3zS+qP}nwr$(CZQHhO>+JK-)YMGPNmaUX^>l91>9;$PmjVWX z0{Gv&AwsUi$Q&ENl0RAqUmaZq-l6G;21^@&(2L=H6A0z+& z5Fo9r{yzk`{};jD$-~I*|Kcn#Z%hC0`G4S`{O9{Wzlv1c<&;(ePUC<80K6ao82>+x z-v8ie?LCbDXJ_a9Qd0j1;&l(KyYk2jyEmIx5_P=+`a1tGfr45L7)z#n1hz9UVFZ!^ zTh@+9fUwqv^V*eefNPy6W*Q}i59FJJZp_qUJbo5|;1#^)Z@`Q7I2 z)U12#Z}7meQm^*R7K~1L5D`5{LoIu^u!$8!Y9T?`+{nlrKn`f@2g%c5KxU&>WgT;hv$Hn4hiWkH`(_iR^-_U01H>rhyC- zX$rf{60_ErSO>BDOPz@TO^?I}@&3&*l!<_Jh#q@4^HPy4uM`69Sai!z*vzZA7kkec zihBKYp|OGBAu6$7bY|#Bi!5}NYhVXx;~Q#PXWrZwENH8mxQjR$S>In}~U< zd$aY_izycnhJ{_LhalmEwOU``23?==g?60WsFc+k=DnW}SeTz4<+taryUP_ONZ&e5 zI)GWE*tM%xIoW0CxE@aS#tCy;=3t?AL4>G|(MnbUZO{2&v8UptxG~9_9I_%J0ko!j z`&toal=~UcP2!Ar)0M@<33$HUypunw=x6b_e)9zbgJ+A9eoEL$&tbKD3vb-#^oO!d zG2OR=&rbiFM%pKgG{XlGMkv1_2GR?-hF|mZ2k88W>c6rYbw|XjSo4GDmvsvacEnx% zo<}L7Wj;<6;72qdPIEQ6o^(xERtUhC_%WEinwRRT+NN^4R-TR@!1sU`c~;T}99?Ml z<&vw4(nLXunsOh4@7A(yxDFl~%FdY^)A1G_mDK0!he7TZ&lNN{e)7~h=}CC$5?Ymm zV609dT5;H#QMeUtVf|v&eMqonC65!&GhMlmIVONI>-57Lqb%swf4f6D%)UJflR~w+ z6il37`Bzo-MF*Mlp60a8m|Hj!;>|$4xUkTIVGKJC;Kgr<)T@C%lZitvV>xuxR>aZ@ zBaODidSrmCn0}zxSRQgG&R>X4Jqa&HVJ-DFgea3EXtlYLJu#}Z_AXLK$%6gimM$(~ zeI}U7s4=A2kbWqZ1O9_!mm`6mQF%1>n!q(;5Iumej>c~d2-{E*1rqDWY9-4gQ^rj- zpx8aR{+$-78u|jzSC6R9tLb{LPGeeVyJMd5<{5x2Bnx9RXX-&$NG)Pmdw9{ zzHgA>TUsdoXU^uoowzoT6GxqN?T- z5<@NSiM=a3S>I}YpXi3|Nrt4Tgj*X;iJhhbm)e(76r)-+EL0B;mI^alq>I54%Xml} zhwHP2pSDRgzQE~5)+qcz$uJ97YyIFXPUDY5XTv4YIC6Ar#Q{hE9K0)xxF{>08wZ+X?@4)Hp$YZlOi@Y->Jp4DM&ApY9;p2Mo0T{Ol zgvXenPyU?NkDS3;+7T08ShWrW23jZ-{ibsofxkNf_Kw4HuF}bs5L8PZyBp#u6fEGx z!|NED5Cu$jdm?T@qp^Yi`lI0i?i@^5voo89-D>jO4=Dm`?ShLzh70F-QvjUSNp3f4jiwA(-XKvaWYQpENm*s!q<3_ zVk56)3f;T5FoDk--d3tj3KJOwePx-qa`}*deGvlG`9@ zE+$eYq(ufQzy2_6>OWR;h&`jClIyIx$Lx*p_49}SA*cHQl5yM&oI?}l-wLpJGEP5w z$cDkAy?D^K@*|-<&8=4(ZcAnE@F|&UE|>hUFC||H^F6pgSJi`WD1+dd%Z7@1p{FKn z!-Th|&oB~n3MiAogD&9lLDwXm1y2?;=P0vnN2bg1Yc5<(+;L}F@Mjc&0a;H!G(;>^AU7(R3nOTz^ zSYhs4rHb?z^X*Gj)HC&!*!D7-+LAwMs;ksq$xMtgZ$;%kR0rV=?fqkNyn5>^doQiW zR9}XH7!48i66}ajcj4Vt3NB5kw-^A*b|XIH$S6zJu~eW2eh6W2Y|qSgy#RS-OvGT3 z!6K_Fy}vJf{m7x25?e2>0?5#7+929ed~U6|5m5iXxsK(t7Qe@yjbQSNKaE`o}+Kv55MdjaEBQs-CgIGDNNNJTotC&`~GNB!O03 z)xK2E0O;zgz@^xBUScQ_VeBx4TUb?Pkyk~tmV#n0o&2|EX~22|E_A+fG{3ST@&pF2%ch{1xBiQckgkLgl+Jk_9N=FKUgZrid^qExRdtVpiIEu5Ndh)F^QGr>U}{Y; zyE=lkU7#uxR&%=W+KM$J?WfTea_VcCCfyGy1#1T zCc#%s&brIta;9h_-j1dv*kvP>XD^8$1$T-M(j+x$%gY*kn16CLmfgYTL%ZuGQNZxVRao zoHs3LT(y`qM;FeDcgiTT#Sgo(OkN?gB zJJvd-Hev2Ij-9!R8-VFEe4N_bf;cAnFSc-{2m zvp0~&h2V`$=IoE{fKO{m{JEc@9Ne@ATn~>|7yef-*bgqtmS$748B%u=7!59!VQV^= zar{G)H-0zR`4El;{T_Z$+)-_Anpah=MQ9Aa8s*o5tZYpIa=k2as6T85j2}uT=K!Y| zgBS}W&eH*}23PjeF!ue{U$bKDs9I4B*FiGkvqN@D<^_H|KsG3*^#wqM5wDe}Y~u`+ zf?DZ^Vi`?JO>ds+2D(p`FYO;o4E&jbMpKDOks3Kb+e!y?q%KUCDSa=4v)X(up`Nj2 ztJn#G-p1NJr9oJ4FU0Gl?=gH;Go|?Dm3Y$PNnGqdH08!Xfc6c6YXgMI+|)4%w;h1z z9b9LDl;S1Q(c4ZC!da7ssyFe_kJMHi#dX;xp*z&9gPUORP`t*CA4EbcZ7ukTos61Yl#JFo zs2MhnX)Rrc^gxI;C@Ij|AyK1KRQ?<-o`IL4SMRUp22D}{ph}|y%l7a76Y!N%kqD@+ zCH1zy{NIhy1YG~_TBOJ)yk!21V``e6AX}1g61H>UCeDyNj$WPvq9vF1C?HYMo@o{f zARU-k(~n@vbj;(7;h44mLOe>Njd63V*swlNVd)LzPr4XX_PP^>S0?@uqXAqI+%YT> zbsFd!z_%-!v)&Q*-=bem8lOEUnX@XKfo$aP(Q=W0$y7M^c0gh1Y>=Z9&qj zwR6saM{fYt-mSQRDVcVh>=Y7l;A%@QgHgchPi)%yK+)%9W)E??guFS+7$->_?Vz_- zxNXLas?$9iRVT)16i4385*+H1Q=*nbaX_ZVi_zeV6rBVxw?rzdV|QrU(7Yy_5c_Js z-e54%_$AY{cq>nG2yYcJ zi_|?-WULiA1>bcE%>H1)AdcViD+L*)n(6rByQeTc$)uP(RD3y*?s~;j`~)K^aC{hjw9yy521JA%F}D6A zS+fKw)zCgL+)5~<1{=3BJDBO8STK#W((MG;2c3OV&8O*GyK|&8*CWb*QLaA0lQxrC zsGMhI5TNL86shP{i%LnE*2juTCzlp(P-V&lI4)5MqE(^jTMJeQ|5D`F@IkTvo!$ci`nElC9hV-;1tsW%acn zBDqkha1octt4kjmM&4i=54#qcd_fAKBqVh9bvmQpB$?t#KUH#;TL;pa1asG0)w6f; zIGY5Y1Ira~zzX^aEK*AfqISVLWPI1=V}08Zfe`u-$i^|Xbi=kTG|=e?H~Lza7fgIB zH(!tEf#Bwkr_4yEcnAziKD!@5lCT&HeBB9Pa}i70028kd{dA4wMbFFpSRa$OzcJDL z;GdQ;vZ4`*$=@I%-6b$*RY@vj-e9WcI@&sZaz%P=cG;PqO>#Uhh^hsoSI~~Wft1L| zFz2~@Xiq^A0+^}$grdTyzm8#q5AFux&K=OV_#1{J*(Am~;o_B$VTG8Q+fe5{Wp`h_ z-9|#O-HX&CMD+u0xNusmY=p+?=%yTH6omZVw_NhUM6bvVq->|FCw( zwk(f3WbXyR)*!r)K2&m(wX_Y7xb=An{RmluH0$d*H|lS3o!>Re03HCPCs}=GHJc~&A=vu`;&b34HKj}HEz}`Dpo_~(cKHR>WTZxRRPf?#inr4Kn&|M)`@P? zSQW1)|5D^8!=CLiynvmA7|56Y6yu?Xy>2A&=2g9b1rh*2y&8YgtG{P6IiOe00!p`r z13$R$zaQuB-)_K{CbmmYM}vLv#{WCWfyqQqA8*|_IEoB_AuP)Fq>V3K=enxste}4LQNh0zjFLwSvu*6oF zBaO0bO_=ZBd@X4P#(_XD7pC;UH!}YCrdbw4QqXY*xkcs(1`n2630}7FS)3n=nDV-# zkEit^oMp+RZxF`rX(kSwRC*MN>z{h-McEdAeb#Y{vB8&X9gtqhR(`Fq_8>b$uT~3uGoGz!bleIG?j3cm*SndoM1va1^j$K_>PVxzIOphfz)Z=6y4i zAOeOyJ#`#phfUE3D3pZDd>GVgsRN$rhL!Uj&%dF0J_Bpp7+Q>BjM>K6=C zH-^)jjTNxDDBgk-JxB7j+uRcWWjQk;fy{&8$rM9^5Z6e|AM%~ay^gUIrVeh9Or6_g zfWxUDlB3#cA?@ZE)@p`vj~S(;&o#U+n0XTVMh`f!!~a?p8aQnh{748#@sqWK=$%Rf zG8C#ft8-HqL?u@IHVguJMi;((tquw`>ehjuA?ww>wsqJ0Q?_N z3ek>b;!7C|RV+ZYj)N`^lC&f}2Ro*%B30q#^j=gMhe0f?zbn71BwLLK&z64$y?(lRzWiUWCvG-`y6StJqF+C4C~h>K zUq8W{*Z9hLl25#^L5eY7`IW!1Wo_bPpV|vFU-^Ytj8VyfAh|Nm{IbU1EH{3jC8P#D z6^fSV37s(njE^9M*T5$^ro_NDu0ZQVvu?u@zEA63wyP}xct)RU0KHTn`8e@oui@hI zV^%r$T+O&1lKV>}$%|AM*g@eA(tzb+aqDdf8kVVH^POT?>&od0S@K{as$cPmOx5_vR^3%ftK1EQD(r9UKH=+$KR0N;3xf_XMq|yO{&IB; zX*Vw`8RuGdIt+NX<}0qQ%A$hx{oyycm~_3lw+jCnnb>;OO+(>q(xK^yvS3xT)=hB4 z*{Gaz&}qX&HrO-B#jNm=HU1MV{w)Fl59KvroA!)X`a=ON$;kFYQc`*%c-c>8*uPecE1_{9x1TCSyZ81Or*iVaBa|;{NzX4y5-M??p6l8r zO6sC*S?8qK8=cAPeikI+VoTI`E=9C;<_9z`FF|L(neYzwXf>H<)4;-~i?)AUl{9eK zX&%C_lK<5xQ=YOpXuuZ-$!k1csxO;D>#AK(n{6}=%+l~)<}WH+L07uTN94dA&%Kx9 zGCc5nx)pr!Ab-5}G0deh>ina!TYj=0Zwj{ck`$t~3PS+0sWaP$%ZianGZhLXCixVv@ z4iXABk6G^_3N|fFa+v}8u?b9J#0Qy~oRQo^JC|QQgQ}mHyJ`I)9O~7$;EV-|#>Y4; zxp)0PuNRmbBd+)MA{sN2XDGoN>{E#N%JV=>{B0#g~G^QT&j`5m!!y|PGq^(_I@560a5#9S*4806X4=1rsD!Fbb~02`!GnP zOExvCqg5z{UnY@f%C7}}bZTaFkJRd*6Mtu6ai)aS57tN+{~Z{*hDA5B4?puT~wdc2$&2S!;1Dk+>bMTHPjaEkPSjvV^51 zX}cT}iShgF`!tIM&HhVKwUr#xRWa34s=kECSv@W~+G`|nT|!pw8&)~~uS)4S_Wey6 zE@{tSs$M)|?M`{Cpo}iyNe-7efxv|T9 z6b(H_>0F{!&ldeyL0XQ;coe~M+}}NgSPUbZ>V288_Oif=RvUNcY@7|bHJ)CGYbi&Q zd?Baj`wQJZZ)7HB7Ve*#cP;RO4Ad;-+2?}k!fgEn*e8^)aoHh3f1M%@&J^j2-ZCc2 zA5&h;CWN}MQHWkS0eh*_cIeT~2wO3Vw zPiB*G+|25aA{`kp870%)xmjYM*$FT$zH{!9>j9w#>D|AS5n;Y_%8pEwTor~CT4yF{Fk=TbiGE~7 z8zXmJM?t*9=!EgczF8WZ{%74Kb(MH|AZk7A+T=yJxN8cuz$0*Pe)jfgQ^O=%(41IO z*r?2ytmHiNzbe?G)$pB`1X(dETo>yNe0|ozEf0`qyu@o+o4Q8`883u&>PS^?G%~k7 zRiiBC`(DG|t0&Bl~>~dJ*7T5V%#|#l(go^t7ees8|5A63N zw#*Q7Udd=tVJsd51SI{#hsdiJboQ!#f@-6-`D??P4=DBm5Zvnt&bplA9B?8vCHaV~ z!BT>u$v@0YgeldBZ-ALP7h2^ETNTD}DBF(tXQ-@zu7)C8+a5!p*j>71Dp%X46X4MB z9qG`f?Njxi#97kz9?|$Mt9mFaL`IcbSc1%=iPRL8^@{-;mC`MZ5aQe;eN>KzY#h}D z?70aORF8*jZqZc{q8Iz`Vj_{l59GMX}*#Ve3DNXn4j1p`DS-^9Mmo=j^sTdxkIHC44| zd!1yd*G)Cu0QzQZ(d1W(d4oEJxlCyU6JIBye?w$#rAIX-W?_ z4dS;2pazS9^b*AuD?ug13M5Ax^zTpdTLDxq;4q2yLL7YY(+(42whMj@}p^zP&& z)uv*fJeRw`!c5u!rfyh5+C*4G#0u))fdaMbs2lZ>6&NBVk!ukgNKuG*YY_x?>O)Y7 z&_k>HTg%x@?Sbbk)#2pR7#GXS{|h)n>U^lSai56x*4~7GNtfpf&FvBmqzn-szM#!Q z!h*R|uddgv4KZJPU>xed)4_)K9Q0fDglpv^s;qZ#h;dJ^kR&0jpgqFd7^AI^j8 zzMH!x+ShDQ{=Wa|lrrdrPdrP`*hrDm3#_le-0vD-;QUX^HdJ(vaasD|*<- z^+R%5=*V;{dgzM#ib;JdpvG6Y2M`BhWdBwoMD;s6r#)Cef7LAev(l+A|}7reYpnHS~++GWq8C9t$uLEnK^;)xWFPFyjqnC0XlOflI%o)7ID19IJi$BH$x zEKpgrCvSRUGza$mlXGWe=I~0`7dtpgCO$Y^ng5Ez!et%iZWR)mt@xuTT8{>LPsP$S zPaeapS^Ux0aOL4*x6UT9>z^TDEFK%I zvxJw|1)UcJV(Z$>L2&gk+6Dc+zE@7)Hf(+&S4{ga*`an>Z2R5M%jIQ>gmp&y0W$qu z&Y-W!Q1j6rD2=icnDT%ZP#=%vAn}HQKEOtM4$HB`d9X&9&)7y86;?jw>ApYr+NZ48 zmWZt%HE|9U>3bCqpPGDx0IeV2mvR=p9PgF_qa+vV*38wMb$WU(i$Cc*`hmVZ(A&F@ zJP|5rVQU3f@Dt~3gLsY35~|fa4Q@-p#SbcO{Y{(T!=kt>nC&fE zWrJ$=oZdUmu--bZA;_bgwW?^wGadcXg? zUv{DOxH^}DbC=q%_=jZE;uK~0Aowg^a;$0y$icbeIVB{oanUU|LY^V|W?WwSHT zZM#?XAKZlsSb|0#{R$JV94=c)?a$_B`X-& z5dzUUKYIVzA~d@yN8Ez2gPBuTl}mIiiyk18(k=g5Wkv0|cQfUYf!<_+ z=#SoL-*GiN$O^n?aP^%UUhhl2y$Hg`D8iG;%5eSu3v2QL8NfJ5$&jIV{+0j)(BR=N z3kNP&wO;y+`pA;O;c_DLg`_-tW9c{i6Inq*I50E>Ih(6J%_ysinNS|vJaE#>PEikhDcVp z#p1`2Gayc~I4TxsX7C15i+`z;P>FX4!ObU1qXDw*hq{(QF#D1XF3Hn%V^W z$c*??sl>6m(8%XYb6dn;6SaV!D&0N4=RE3>SR_gug0=1#Sk{L+!7Ctr%4EP&gk-*z z9J?GG>J(Xo7?}kewk}0-cXT3}`ekz^pi%Z#qnyo;D@4|Z!VR&mQkodVZy&qtM?#_g zBCWPe3klEX70}-oa&os3l8$DS0$^mNjope7KO=C_=z>@CfjxyKxNNeAT55nrc=4oA zYCD%1)z}_J9~F|pj2i_!3V^b_#GD!gw9NK6gpsW{VpiLrYRF>S6_6fSdygIUnv@3XyKxf!6z3`xC}avwtJyamjb zohq;ZuX4+$pS@@jv2BJ(Bz_iW9PMaH;6x?KK|wAle!K!ti&F|>;hfuq{KBsEhrnD{ zB1sb-3c_>sM}F`Z=x=kFdW^{S2M0s2=S=L^F}d*^#*gp9+GfVpl|#X-kpI$Y?sKr8 zcjOhD@`b|-BoJ?P!Vr+{hl;1YO!_o(q0L7L5X|YwWp5z78Hth4`aA^;8ZPoMz_#G^ zG8#v{$DLUq=r=uOVwDHCC-hk?AMi46+oj*P^I6$xZqxGQC5xH+>K_J&G z$BZLh@!?O)=7bFT#KX|EXNw6!$O|BM08tzTAUU*!^5RAD3%mmfIt~iB*&=!ybdDan z*XFBC5ENfvVL&GES9SoMG}`#X_sA}84q`q@A=L(H_M z;}6~LRk_V;HIBWhSou1IcAe=kCI8mA)1_HAdVQgB>(4W|ViP-n$5X9znmf@|IW+qO z-s+&P}vCA~)9sOkkeCq>& zl)Vn>%a0LrE;%yA#XD2^(~;hhzKNv5%^1GF&~M_j?3;Go#V${3(4gnu(6gj{QC0EJ|)SX?7*$4!zZ|YOUJ>?Y`@L`-^N` zt?8cTM2T`J!w%D3?hTPVN8$hBQS53_w`T$O!&Q`^ZWo)M;+EcUdmPYOt2671NKzu; z?5|)B_kZKZOqa28Xx=MGXchSl$7;5w&MzUBlJ)jD?`R44EP~-ABD|a?+l%r!M_^hM z%vvLYb5FRJbH^qmXtgM?k$?@RJ4hLV+RIQjd-txSYldGG467);20vV)%YqiWdR5RX zj_%CO@nW{w_q{lIWre+smk-|}sUA5D>8unGhRc%%z}gnrRzko0?7j6o;r{ve=U3T> zxybt$wtfU(Ux#lFpU2+kcb{{Vx3~8^>*wUlH=ny(K39wdqIwmJ2!4dm6`LxSX`_unnhrj2m|Gf1V^V8q(EyLU3bnmeV%mtoT<^%urqj${= zqxTE_<@1qW>P2_ZDVOPKcLRbHbjE#i3db_jO?VOVH@ds`NN@@7ikNJC*LQ8c*>L?+ zWC(I~S|&nHA{!M?>v>4l9D)5=-uDmLB6Z4=lb;I!5VjSpTm1Qzt5dJ3;FkC$)BUCL zm2sfmZ!6+vv^r@Ex8h3%6+*vs7zDC@Y~EJ-)=}8(Ai{KMX&YvmJ+bVAxa zM$!md&lzt(Ylw{EXJjp3X06r!v?*(?pmFVGrDJkI0!R(x7?~uv7i>Qzsq) zB2-rBHQj`8Pjg7rL-0^YVo^EQp)KK@{J(qNgklrr!ityUaw5Xy{B_j5&O<<1ewH$c zExeX3^EIER;A-Zitbqp9?w~?XSu+FK<-2pAe>(atB8-Z-Ab*?m5b{y&nz8GH5v9lJ z^6EJD`D2nf%CRB^Kg`}oF(ky>inKeh5vF8uhLJg700^eCPb>SdIqg<$;YXn@%5 z{+>^H^6$WWcF1FD-g@x9_Hn_B8AV-Y8s!%!&Yx1-;Oa5be2EX|Pq0|P4}2lWuP4D< zJ6#YynFEa!c_2_Tv-4e=+)LZl-^M6K^`$c?bJf$FxUi=UI~8HWOAD0~`L6b#C>!Gy zgPRD}l`>`Jx^(j!$Bv@W#oW^Spx{$g+${l<{K4!+F=6p)Q&-yt;nJ1a;n{=+B5L${K5qxA8|r_a(8wY;ueJI&-m?g%Y4AB8<{)-|FoeT^@qsm?06gxeL^ zL=M5CVH}W+C+9lsGvvb7hZSY6PID7YoSyaW*jTPZ`A; zKTpyOF$`_1ejsPW)^(ufTz4?GiSl>r0jgnqFly^r0}a#}EmNuvi|nXShtEP@6D;yq zzh&7i7pf}TfJ(o_=p_hbA4P-b4syhcQD6KszA+3{ex7WG*(2`ruxoD*IZfs?-9xqf zwCrKdf-6q)v$Y%FcWip6#YpCm?%MnjujR|g)W4<4FM6q4#1!QGMO}on_?-6P>S@CuXk^$Xi+}7I?wI8cNsL`MNH`CTClQU0A@mDKYF`@jJNYZ+WwXTSv`@YgtSLKf z+7)%?I#;Q|bjmpz0r0^m2^4KwMurQeg|5lLSRi#_UTMww)7K%=oyVX-0B3%w!noEsN~~jax;UeFtPwEwdE#C*+7$irh7$$oGXf+@$5RB)e4L zbGoe|Vc@`*X?7Q{ztv8)--$&^y8GFNfsL}+N+Yc)#4^TGEG42l9Mm%ND>sgPrdGsM zRhWfK+L>f2ZM0|Gl~ef2b{+HW=5|(I5FJ;)3X2u}wOgCAqh-3!94B6^vsF_!WLnsZ z*nOQinfb6{ydZaY$1s;Ds-}b-1m(TIk-lCNtE@}Hr71~;{aclEeo<)`Ha6{Ayj1NX z0zV)zPHb(xM9LZ*$U}Wx^p}7^={rUh^ks2YSz5WZaG$bSHqV3ONxf z2L;7J1w-h{1PbyL2$va8Kv(pr2@*N+)!1YB7h-c^Vqhf6M|@=z4d;tw_axsXlM~h4 zgYPZe89}ub^gJ?kl1C3@@^Dzf@`R?%eqOr&70V9Jb`_z3$OxwItaW7RbcIQ$|@hQ zlu@C&%80klj=tEwfkwL8Z&i|}j%9WNY*!snO*K2_Ivr0smcjmR9xy@q#)U>Rq#yX> zZ?p}>HQZx@!*lcsWR^JfYBeznPR)<)?M_fWN}Z}_#tapwCi9*LS&T8klUFr2ZK(3? z+5#iisoMybN`+{vMb~wOGShrn{uFCF<2JV7q8?7_r^<*02~;`e^cV~BX7YU(8xN9v zbIp$F3C)m@wR3h%YcLid{3lX!d_lrEi_s~TqnZi6-05n=!|tyTGvT3~XN-AK6E7bW zm4(opeF+Cca`|-_E|5|~QtJCrR28mGnxL$>tr`sK#+uOdp4|g|2~bW$nf;{;vC77o zKw$r+GD-7(baNO>g5@NOJ_P+07tu3cWb4f}MAe0~6$$xU+)tjaS2_3u91Dv~bMI1Q z`!7Pmloo^bzGv7ra>zF2G~T4!;3v=MX9|V7gu`(EBU7MY0oLqIY^#=&^iU&|M4`Wr zn$VKxctyofk1u-4=UZtV7vGoDzsyF_gYZ~1@3-o3a5d}lQNvnjr)(V`EIn&S)11d$ zeoUCQF)4`?Vb(ep_%{#hl=`|e#1N%G+o%O4=JY2jjrnMFGV8eR zm%)5kpE{u7#zCeln(br|HrpGw1UNy$pGx8o_|`)H2EWlG*^?CWAe$O@7k3S}2Z~aH zBTTqH3$@bABdm6FE|1$kMJ^QwvzaF^gZdIxuQ7w*pWW4Sx!Ch*8=|HXU?^zW;CZH& z4SyaNVNM8>sFBu*Fj{b2e0l)6HZy)ha=fPoi7WqX;sS=21Mi*6r;C<@mCVfXWRrl| z&Ld6w7>}7Xp39124%k3e-ifz3-*uXU-4S%=8{3a_n7|1=No}itROZf3!*(t7xbTKe z&8*)Iq)TV4`mmH;P`y#FJr8bDd32VKxgFmxLLfn2ln5l#>SrOS7`%x~LG_FgS#@T6 zBtF1ZWAa*v%Wpm^!lMc=y|K+sF*=UO0F5w-18V0iK5Mzg*4o zDpJ$#m-x=@FmW-io4)1pQVZ+Y}{F&l%o^H0ty(!|MAEpUJlJL z9GtVQdnb2(r7tt3gO&{%U|z%2H%jbQdI36w-!!|2V!aMzq+1LqRi(8rgkI^NRr3IX z>KVp^#kq5(a!|AZe zM0*g7B*WzV2ng+!IHPav2m6@BcIJQ;C*K~T+>@cjBU! zAd+)Ewr+5?=|;#bNdXfkn{mn#BU7NDQ`w0~M*{L&a{2Ok6~Lp3_mzJBpMF#LFTlX5 zXnQ9yhY&9%)g3Jr`k|(2;2W1)hxX*`$n`d1BW|EG5il5BBW^km5}6RvE%?2fl~jY* zhLU|5dNZZ%c<$8P%7d`ZU1(0{LNFEEM(X=m!Rtw251|}x4h_WCn|VgH8;xp9&nzB< zd$OsO8>j~S`S@M!_(?0s=W|puT^ma_lI1sXeAHOGF|&ECJpky83^@VCfhy8H@$oXf z<$e*IS&Z2{f-<&Hf8%+Ifo2Aa3$yb#U(;utdl$xAk;*HySjbqLO^RsUV><0~<{+GvT#b-Q)2o4P)x$78xZ`8c3n@`fAlzEa#67Q9CfPrW1Q~ubY4&B4LUdQ0 zO?$A;CnBGzR~~oGP9MPwMCZCly(%pbuX4&?XaN`lHz9T~!eRaKNAh>aU&xuN04U^b zaf?;7Uq~CV&9#F)+2_ATso!Ru-4H@CbrlZ+h$dsnwk%a+H=AwU(BN<2c&)v=^u1UR}^A5APC%Ij1)_H8>4@4 z`DL1|z-+2*<7h-w3}Ef1@$z}YIfr7|MAxzdjGUX>^1*&vYgDkirYykhPhV*+!*e*N-SWzt?BI_K9<-39UCvglv=qpB%^C39p z9i1U~oWmv?LZ;lIjV18vHg$#I++r$+;{NLv5FuFbJBF76M4px+ZQOVzPozH$fMAXD zc-JG1J4CshKbo}grnIwtANPxX@)`YJD1sK0;K#FsToL~F!fr^cw*y-Q24sT$oYq|urp%j5;ap?P!2Ol)C|iu_Cd4+Wl~jYXm*H1DvJ zI~yd(n2nk3Sfk=6!R_RcBewhLOCtu!^9v5d0P+~+#e;udV6UyyGQi19%*F=3u(x?L zBM&378_RI2TVj8Gled58Lj_iyMU2re6*?y-^m9 z(-UumZG$ZVcV?-`1xpk8wBOt&kMJCN^^vfKF)6t!qnjPeA$1K+U#cpKEIRTLp zOZyZRux{X@rSrzU1L`w|Quz?)sD1WH-Ym(%CJM#EnXpL$z3;*D;IXh5$-lEBQik6l zXZ8;$;&U%g+TB&lAf1O0UfS+|0eL`%zhiBj?+N&mAPb*T0a&m%bq+SY$5=MNgXMDh zJ4Iw4Jmfm}oZ_HTHwwa@@%!!k2#U;RgCL~5NQZ3tK@%|2cxu_3#HZ<-H@V>g#$&k~ z$OA||CmBmYnc*e}WphLMu$8M(E;EH%ZU&yCRK4GdUf!z_4ZTI}N`+miZ~$|wROBiZ zc}j&-smKo~6_dO{<=R4}qIhM+lqAMOvNc>CD#ltb;I$^L`azNqajTtpp6VvSj~YeM zX;S>E#IS&RjyBMP^*|4d#_>!qo44N{oo-Uf_uEl;u`M|xS&|u_Y{{|Tk+9@Iqtd9f z-vOd}JJ8OXk+Qk54~t*neHcm3avj@QhO%Irs8trjL@JC<*Pci68)GE!qWUZ2W0QTj3QD@&RcCEfeuxqo66B>M0y}{0Xq-~N;4Me344wi9AN$JL@xG_Ak zBqWB1bqn;;rNxm=;ZN!Y(gQDdt^iA26Pt$Bb600{BjphJ@5YVwQ(DJ|9J5$;ugDy| zQL)zxbCCQ{Lo)QLwX_!-36IsP4*`P*AIC<;(aWkgiVC~~;)+#}o`CJh%WA2fuf?eN zHM4t-i;Tc(3}Wk{>hGu*wx_={KkA;XvZ>Gv?vNJ1w(lQ^~Acor$)s z>FBP=BQ@3Via4V!;;(i|6l%jg(j9!O(O@bMM2*^Q$VST-YhiV@nE4J<^EM+OSn! z!K27*1K3&)c_e$wp<3zex|Q`)jH~5c>H_Ws`IN_NOVV{!O*N8_wl3ZEhWaIykVe33 z#-;DNuF5F_x1*P*dWc88aUdfYB2V0Yb~a)x$niKTj>os-I2^%m!W3;~{ZoQdYplL6 zEjOv(g=L_Ksg;SyW-Pv~K8;Qasj4Oi#250)oE zI`F79Um0H1bL2*l??+?M!&y1u;VAoeC1K z5h9*8SYM>1TH}JzfcGh$298Y09BX(92Gy9tDvynkpn6R|$4Ia5Mf+`n9SuMP_Kvy_ zn)HR*?|>A#-hWg*pMbEcR~(`7%J#jO$bCnB$+(+?$V<9{LGfTbYGki|CPpVp7vKsE zpU2ONm*cgGxS2L=<>*1G4&{d^SBr~nFkyS-PBK0Yt$sM!V7vOrKznz$9hw`P(%f0p zoU>v0fL2C_u!Rs-uR1#k#e>E}*H2m5%qjkW$E!Yvu9|%I8uf8hA@`y_hJ+3~yT;x( z!;vRtu}*af%p-n}p4wkw91XMxLAESMN@rD;So$+~bD^l+wJaBR7H`n67CueKfE78M zs~el74N4}(*XFp+)s@#ueO`(NReLko^+Rq*2@Cis|-l8%uCdzEsuTRpU@Mp*Kl7L6LSY5XJhYpRx zj}d5Qsii5eH$c}Ar9^w;NCpJE(RKw93}aQaiE!NE^#p6w*PbN%1z;NE`iUQg#Beea zajK`T*9TSuZZi9l*DEDG)Hn2c{ zlGf5!a4AN`S5jHD*~p@O==vahu|5FONSK`O9j3s^MC6A1)DchetKSyaWWt9VS>cjo zbzH1~d%|)e|K@sG8U`W=#)pfI@rU9hLmk5%s1^08B?pK=Ok%V15lHzJja5zpAU9&+ zfqbMXNI=Hj29>Yn=Glb<7oKxc;PqTjr$n87-W|BDJ&ePcUpFCl9{)y!4kR$ zXYz|L80LJ|?h27~mE4!vEF-c+>S1_dKcQ<6{7hYLwvsmZ7)P7vpyB$&2`1gzE~D#2 zbR#1EETyrHq^O(5GtupdRX&)$q*8OPdH7DjUbNM<5d)%bh&k!!8vJ>JYvYOS`?tkL zxjJIQT^;m09n)Zx*5+T2;o0eWuO@V^bzVV;5aBYdua&rjjg1fMqe(0!bB zPdsdp@uE#XQ>un5RfgiEXp>SUDpheJ&qjGbj-GVAaW@E9sj?}Fa0#!qPRV$3@#m5? zRP`6bi9(7^m$zl=JeWz>qMg1}Lzh!Rf?yZaqSrMIZw_fTbOF=banwQDtre&87liPz zu5@}cmeWuWS_rkPz0YwgxlEq36iS~(mBoEslXWBTHVwt07JTCc{ssvb=x6Y})hG|7 z_d=uH0s@ZKlhEO4m9?AftCY-EQl#0jI6JU(bNv7pm}_g%lSh#C;!S8a75m$I5uso> zM*)vbZ4vN#K2Fw;=#3X^>86u3EZS&gnE>K`)~)VDrQQW}A+4glyMimxO&}E~U7KK8 z_$Gy99gXxrUJ6y4-0Tu7EaR`y|LX*VA;2bMxggyLJ|z_*)C`m~i%Ue;(HpWkP#=a? z8#(0ssM~3yn4>&a>YD|##OPfuz>J$HKDyG3p$`!~u7fwcN&R^Szg%6=pDHUexw@b~ z6;^;fYt9igQk`X0CgZQc=S7JBp2|d!65YRK5qIF&Rgfw7yP8Las{fkg4>_pbOtE&m zGJ52$bO7%S;-r;Xht(sHp}3Ou9anNhpNK-h$?=7%Us7L(x#U?v$>KlprcCyg39g36 zL%teVP77+0ETPqZCEc&OP*-Id_8*N&=SflGKV?!d<>?;3^!m`6o?zn9atDja%GsFf z`Zg@0;a6xIb-XZswu-@X*Ps$&JIKxLwGP7G+{FSwfyrP2~z0yE`jO2u&H zS}SZrR=oIiEif?ly7`?Y*GySHGNk?`39r6@I{zj>EJ@WCs4$CJg5LOQSC*Bcf>OC= zN|MqcE>Abm9he;TMDAZaq0i9snc3qlYF7^*P09X09`EG`$9EA@Fq@=DzM(l2|BUOo7>9jA|0e{|A)SQ&SB%|IqBgnU?JiRkQXlFnOLHn-v)qx{Wom!~!E~KP?nqN?uG!)u;08CZ;1c(aX1kA1 ziMsoe?bzAvXn3iVS=ilVfjJHR6ZoU^^2I>nd|`=&ri4}vL}<5I@U0vZTlWA(%OrcF zv+qr|H=_F<1Kk-b=J2z1@fhfI9R;_NTd2t@3!5XdGuZ`k>n+^`^oc`cdO;UxHrm?O zkZc&)ZM(mnVmwp1RN_e#073aZ&l+(6psiP}H?y4}ov}(5Htc@#Yr6EXX z@w8p5HlG!=K*Gv^78~1@5rwpeun%murC=iu&KrQ8MZH={;~uNJG88DY4WMJ41(g=5 zo|>Od%}>QCIAyBddOx<_o@hO2IqR*Jfz;MJ&#I)>D+agzDsMeH{qR(fF@>g|bY)z@ zHdgH4F8Qd*Qfl%?*yHo`9-oOl9s@nL>20p8pyp2L+om_DCyYvJOR2zSx-x1iK(_44 z*Z}*dNj>cmF0(`{%&9R?kUuy(geo&Nt)pM;Gy- zzhkGE-k`G_bbil0|D}b;1GSxsl`pbSMdw9}hf!15&U!niTigxwQM)brF9EL{brDUF zcbZuBEt7yryp;VyWN+&P@T92!XzM|$a18v#8b`E#NmU*cW9iRgovwGnW99Thy#Li* zCZ31aQ_63d#AT!Xo3Y|rsCcV%8EX*P>pGw(MK3$rdO)xEfL?JAReS&{eug|j_nBO8 zVBK`Lta}>2QmWToKVL_Pb{cwrPr@(kdqwT7OOJZi3U&+@lS&R>Yu)u2o&vIao$Imx zu-Kn-ZpOvCyJ)L|Co>D2dGN`ZGS1eP&yPI|3*L;jQ6UQGx=`fTpmJAbt}J(sv%SzR zx4)=7@d(Z!xqq_lmgi7I|5S_nujqUvG70_|?nbfeW6^i0Pv1~%ZNrC=t!YvblawVt z0N0pW~~XHg=ag^CU!y zMS8@&QY@*Q(Q>gM4a1||p54em1HSs&2xPmhtsca7Ahdac~5aSrWON3sMG6J z<;8`iS4m=N8MDPtaiP?-Fc+AdL+}>*n)*r;ON($XQDlp{{oXw0iP>HxJ-8vdiS5)v(x7Hf*6dtWoTq&RxKdaLuH3 zF=t79UC7HO39KlbAulTgL^NmtpStQdX}BU$Pt1B*n@$~CrU*FArE`cNY-}kt-2fA~ z=@BW!2uLVjISXoyjf0zW;(+!lW3@87tG`Tq-nsdT3Viri=m-Z!TUYR&DGDhjSleW693>DHTZk1BxS_~YZPknR|S6kmo^cubE+b~}8 zEcBp0V}A#c@3R{OpZeLO7#X3>xlKS%^y<$7`h7adYj{-|^E)Gq(fVXk+F-)Cl0NmJ zN9l6qe!h)U#gg8v$LmwG13cbVd$^8ox&ETvB|zbtFI!bU$=Gf$WWXP=iz1p-7?oZS zxjzJQwa=-2YZcO@uGG#XwyMkz4}4H{v>=#;qxu9bL$@b zZeMCi`6k_Ynkbr?cKySG{nbAS_G{tu{-2>9^YQ-;$~VC$&A9K>AgDjN7em{1nYwwr z2l-18#a)=mWiXRL7CuRr)~t|Fz7nNi;0xe)8<&U`6C@}jU9*VO?^;OX3_LCQCr;}U zy4a-_xktqCs!*pJ>TJh4jn(0XI;$v}>Tvkorr__)E3H>jTYD-wFxM!8uOmS5Rr zlA$(O$}>PH=IeMfAvOzeR|<&jG6`j|Svqpd2$DT5H-*=44L@-= zUtX+p?tu7uQi8b;asi+gMj$B=gRSiZqSH{WGFeXG#e#`qU!&yWXV)2WlqtM`U1pAK z3J=pV=FjE6B?BVcK*4#6X`Qkfb5tBIjbXh-UoFpK8;f39o(V&=JK+xlB5NgznJIJp*y#tOYz7P*{Sq{S={U}q*Ib;bzAl_jfb;WJx5LcM8hI36IHZTGdajgd_-uPa6MH(w5zNx=XHcQpCc z7jGNXss9`ODZ>7&Q?Wmn_5ASuZ0Z@ZKN)^?Z}h+H&u_o8Kg*8OpHs0vZ+(INS*{+V zKVygL57{TH2UO}0H<#so5&i0^gZo1In+?d|T!8hS9i65{HiS=zY;DTMNIdFJL@BJz z93o2APHzo7{Pj09nLD)%*43Ht2=UO(sU9KlU$-0i55etGpZdbE1EzQ|jzRQeWHSAb zYW1KTDY)~+vnMA<-|(?HX4(${ffsHGPo|a27Mi8(fKSU_urVKx#@gDAkd?N-e-lub ze2%z1`HKV@LZ19BbuZbv&F%EFYvVK@mCj)s^PAZ>>YI>H!DL|Soc?FTzcg|G%k+0# zz^BJ)4yyUTMHD%xWWZO1#!IRrDQz%+kc18^_IFeYIW^bUrBKsLp?idR+ut#aXnXiX z^|Xklp_W3>5kBK{!xgk~OF23Bj6^O5DWWNGAx?pF_!JliQ(%nx(dT^lPxzG{7qk;- z7d-#@Zk?QUa$1)(3+``AnFW0OTvZ?ueW6I!~8waHOt$vSsB^4hYFYblT?uvIloN07dzw0GF zYPQ43zIPe1>iV`hbbnH(_Y%62SEkARCoLHai0V<_{R9DN{WKYnpWJBx0&CL%MLv+% zgdP1Oz2J$zV1Ss*LA)RZ#3A_8A2$CG%>A1^Y9Y1y-X}(@0hACM(t_&GiAFdme&LYy zk4dRNod8R20XNhA+jxxQ%&9PFEz%B;+Ws-N*AQ=yI2hbd%|UhFJ@F>LNB@RwKWSc# z#Ces=I_T^$W-%rf?h-oYb=rLvkn6~%7o^_nxX5OVrD?9xwpHvYVV*VcLzFN=iZb)Fja^rOkviBR84 z{ViMkEnB1!Z6W$8Kk~p3`E&3NQV`F3?H={VzvCMp)1HU^{sums&tUi^!DKR}rQrvN z6y?3Ee?HbfST^Tb{`cf(`3K8o!QUx*`q}#L=k?#o{I?b3Q&AW?9)oU={F%*FDTYV7 z{v-V~zDLfDpQDc@Jv8i?-Z%yQ5Gm*YX~&T&?fi?>m?8^`t_|TrsCu|jS~>-tR>()v zn$zVY>EYq1(?EPv%yvQ-?4ZWdEu$Fm_-hoaGP7wwJlNaw=k`#1|uoqs)Uu0&7)Q6G_zS49yi_&Z~B*7752N1w%Ew z3sc3|6ep<4a#DX=6BZpF^$#C%hKOt@tOG4RJZePGPi(EzmnUzns1Zvp@7K$}wtfNH zE^Yd!O+OOpb|1DsAlMbOnp;_AS?L)D>woHkqh@>4r|a>|Zrx7w6q(fv-|O1(#4mj_ zd?PEf?g4sy48GBVRX?xi$Mv#iw?*&ZT&|t{NB+db%I}{9OZ{hl7W!f5j`Lk_hBGi4 zDq4e25?Dq!LvAhv;fu~_7qq6H(OT=Nqa9y}t=)Jg8&t30q0H+Q003FJ#1V+SNk2Im z%UPhJc3B%`yR%(C3#mvt3kfevJqy7@kQ7Ib@%ZLsk32O0pEzYi^91yr!e*rMuzsV6 zbVKTF^O$S=K6Nh-vWUhJ4SB(aET6jjF78{RUz5sx>UAF&S0*k4zH(DhpBm-Y9O|&Z zsXld9yg;tO0_^%5umC=_cm`(yxLxx^XzZp$V*qB*uXel-8&*T6Pi>6wy%Z19(P25= z!K@~OJjF!jn#)2GY#gfX*Mm%85;qmdEE%n7lPyx|`mqAo3EhJgyz#4n6%6!`>@V8w z+I&M8rXAOp+n&1gD|TbQ{AF&m_;pMu_-g-$%=*u$+*0;0UDdU*=Pq|a`A{4$y@ao``FU1W=l(#h(~o~8CaZpE9iEsDp{?WX%{uI?p&(r*eDkbOa9(+V;=Ixuk&?aI1W z?W)eW{|+K)Bl=za(p4yu=ExTbN^_3nBact!Q=1(v&CuIyHmk7U^~RCd_%OYa5&fj_ zlP36s9`$czt#9FXG)7>`@5nyT%6HHTJlJFFR74uv-WXb#&gA-pT6UySl%U|N316y4rd zS()2`2eS`bB-8YVMffV}19{-`0DD=r^Q%k&_BQKQ{F68FV@dN8}KVV zJm#SMQVy_~M*t3o?Y2L_rVwp&qFxvZHvx>3(7+Urx1v@3a{E_GtuqfTIPhRJ`F?sH zOx@a5^DcBegO@8!)y{kqp2e%?4tS${8oAFZ$LsNU(71A5zP07h6}Fq6ro}If%eFmL zJjE&k`4&5HUCb@w;qmgMm`-(;BSSBxY5_bO)oRH5U z4z9bMc4|C|9#p&Ssq#eI9Xl=Nj*idK*O+}oFP_S++Hh96v;64Bm8dYtSy_JOnRo`L z6e`l0g~-SN4Js$*t#Y5d*LsQEzf>A4_unXu0%8oV-@*4bM-Lkq=vSL7Jt6c3YOpB%C9}~(Z zj;0es7hrdHVt0G7yDhiHyNix2DP-x_N+Bv}DwGnr-70rjVGB>mC{&zORc`44+R1)1 zNT#tut+)bfnm}Z`9KDUfCn&y#}k{hi;IJ4Vr#b6T}V4$zlEy1|( zx896aLyb_pyUY&sUTfQ7TX~OwrbZ?9FnR+9zS$#|cn*iNfH$l(7P6Iw2@ znV1EB+2~i52tP&o3Fz)}k1&%T^9s2=*Y!1G+ji@Hc$s*UEz$&k*YbFWwzjWukZz@k zfi8e~P%k}PsV#yVt^B6eg9OkB7O$LGGOB#t?rZH?_?Zq@WvR9) zMP@)s31o)Hpnf}Jg%$o33t=MfB6%UUzKk9ABEP;+_a$Qi-k~_6!8ZR3*sDXI;tPOOCR`X7DbWU?^f{> z9D8)3qoc>nI>>3EtF)`x;*J(~6>N;95exo#{h;fHuK`aBh#18xtX_|LF2Bc${s~|k zAIqKLxjH1P?h)A{r477qpx^gi^ACPI+QC`Ou@o>eVD;9hJH9pQtm`B{9>=PeL-s@O zARL3>Py|1&O;rRD;9&GsEysuM!0|zEK-c;cYgKxn6;QKsf+>`}_ z{8(r*C}qiG^gZHN{W;9dn*OW!RcvF&0lT-xL$2A$=Zr_S&^-X|bA;j#vdtX_?KP;W z^Xdg_)Kiz!UN}hK=*1c_5*GXVt~t;8n~ zK_SB{4!&@~^OINMq^UJfw{*(XU*VqK#vt=&-#G>WHW{6dB}c0%``JKu*F=Gr zh&;9nseJ$T)08MVcpQm`l7UK}?n!{IMiY6h`2`t7aF%trFQ8s^JsDuRzJP*mB*hvBX6rLlO*Q=k<8>|P*MGAX0{a{A#+@?^$tFt~tkN>b z{t9@7OSt2Zl0qqMAhrkVOFdq7`;$i8Q_>x}x+DsrorqzdOocrmj8*}BN6}JpVKT6O zFUBgun5wT9R5{lF^)G)pYk!ZQT_du&7HtN)RnFLQFvt#e?44*ni0XS~p3|D5!2jzn zxV_=5V!7!yt00v!YxJH&X1g-0nAP59jck?9+CPn3*ND}%kSo586ijol%^WXZZaK&{bf^=}8gXwYnId&eiaBi>T{V(S-JLzlqdy@Geqz_mU+Ds2<~Z`mZStTLgc zYd%lV%{)i8Y$}J0l^(KqwYF?(gC_-_GTD5w<4`V+v_8rsd@#seKc_+N5;XZxx|9y% z5wp0vgc)6K6Ko=BaRh=8EcRS7Bgsq_J^xi=2p5wyBFOcpXqP+0NzjkuZ9uK*Xu0P# zE1opDJtKZNw71+a>y7^lvi{_A8hgsYUs^r709$HETj+d-C}-=($R(rc>=?NO1ZZM< zfiD??1JAby8! z#A17)dG*C3nl>N;Qy_`>J$7XZ@$&~8(uk9c2ebNmV?3CZ`je|P4FgvZePw5t>bi9# zwA-%y&ahxJt{gfnSZds=fJM2&LdIIaS=7&OIS}XZri(fWZLoMkrgn?aVDhS~7Y*ib z8HQ7Aa+UfV*U!hhm2knih;+~ z;^+G?o)@A(j}Zo{j8mfUBm;4noQk+V+>nGgZvJD0CuxyR$0!RhqooO~1*3LQP&+hK z_Nc$)(A4V@esWMx=J5st>b|4g1K1#a0nF3W@OsBo!6FD@H;O~9EcE#kE*``i?wvPe zEXQQta3BZ3?VGw(X+ODgnrHxp1_H=cTfH^FLfr6@&h(RBrWQTf6CJASG~O@X&n+A< zBoxIULumoUArye@7{5zB?zs zyuVL=<#GwKJgk^3+A-hGYqzIjl>29L2iQL_;v0LXz+-p4!!|6>i9T@$YNJ8WldNvJ zOLVnjfu_9$8WK4 zEF%jO>pO?+|2UR~t1u)1Ic_j}1L{U{XlEz+Vc>f5aZk$8I*TvbEaJkp>csmZAv}^a z(@KV}pq4L&eS<5{6q}Le!ZaRJYK)$iY?G_|UuIRsIAOT82lr6Ca7vIhmMU|KmCzK$ zQ#z!({zPbxRMvjfpq+$Gu7v^gg&xL<^Nv6C1pP%#t|!z^zqzsYK!YY8zqOx(Ss1Mc zG+Zb8VgH$Py?&?pV)jdcoroAIK{pf4#X{Jg8cQos%qoh}LEjW~bA~@kjUUByCECPh zO;LtJGA>GbVu4b~#DjAR>qs7QBfBLt$N-TY@L*P&ighBoUsdY}IKLTWO82Ju7W-^t>k2sM0m&}LFj zw=Q#PJYHB(PaQRMFGNp(Gf*s=Np~*B!THo9E?-;+M<&)tpoeMCG9Qz>UdGzCpFrFNIvN4<-n`1=_3uwUS3HrS?(Q4-; zFEo+&F*MOt?kv3lzAi3RW7XP^m0cX1lfQEA_*#!QSNO4z8aAIH>+@97I@5GmZL{ z>7~j{H)}5B%gq;W2=DwSh)Pm}vKbR*B9-y+NHHlEB6P8#P-!mY<)$Mu<>SoM%f`h7 zlxHg3$TVJ!VA15n`LvYglP4HHh22Fbj}`73Pe^=%=2PCMIG;w5^S(Tgcy6N-0k^j% zWW^GuPz#mV`!8G%e2amSaV0Kn6ra{7Z81qQQ6S`a!fZ0X~+6J{Fa134doJm$eS}!F8y5T33u;sK{Hl5Wn1H_gGGEiC7o%VQbO5iIVN4 z_bspF)6v)DTr4_y9(~_S-&Xp*mA)5{ndBt+#_?Qdr+OXuot=XXc_^Wl66RpSYD&11 z67InSff7VYuwX(9CA3k(N=&$t60W9%5PZkCMfruRvHRguxO}ACjF03X)`e$&PC%X- z;s*)jf0F3kU0BG20T*=1hfJz2!WT;Mg$u5Ut8R6FIY35W;=*Lh@p@nb18yGPYOn`f zv&3*oL8XIj)OAB3`F)2PL@k+Yn8d3iXBa=@`!9|t0vYglQvxeV^Ah3D!qqHm!S!?` zX7i>5sJsA3z9=OkyPW|W@&0N2rE#HOVh?MfhoJ@7&6aDp{TW`QnA%8Urb`zy8@ZS{ zo=-V%sO<@ggc-VCN7wSvp`}>atyqtxf#Vln8pyAB69Eox=9V8KyWA{SOfdzOc}}}6 zg3hAWwor57pX;qR@z(W&KZ;0~JWyTO@S?#|J&7vfN7;WHcO zq2=$PLl~G^M~xh>I&qh#1=KT(G|jI*euSHYk`#G)C(|dAWb>yumHiL%1Lep;p>Z>7 zB*Q^Xa{JVO$26_M9&&#n*c;LVY@1p%jrdozZ@5$7eq5A%U>B4|QOm^0^i@_ZlM8W| zcRuqR^d>sP@%`gDL2q$7C#sNNpoq(1n@?S@J6OD#Z0zpBZ-0$Gnfgh|VQX`sIY|8F zB>pnUw)q0;ng?)43)jaqrUtJydeUw0*!5d1gUc_YQ47sZ4Rnc{8$FE&Z*?WxGG4eqPcs< z{Cd>;{0}3A$$h0dL`Zz~@{WA=X9@!mkKqJr<>erJu~BWO&s5e~2eS-v{ zYX>(E7(QiA;;Q`ofdSkH;``qFhQ{|l;`shk0^jr1`Jd|ezK-Mj`JIUGB_Ad5?IgZA z=!3Z`tS2uS38e20rXYQ1a3IpJJ**@Bz9EqAJ**@BH%0}&4-Sd+?)}@wxBH#LML_xM z`?p6?eKCF$U^j1V9OEq?4fnKk0M4sZa6a|%1kT%7)=HAmb)=iFqyzS1z+8S!5O61K zA+{!gd0TK0<`cpBd~CubiAM&q>uwJ8&{W||;oWa|+yRe~_9NKY?u_$)IV@{6kpNF< z%9CdFa%74+Amemjq_LYo<#oYfh6_iiEHn@p6(8Wo=lEr$1lm$IxWGP zP|K4>&}4(Y=$B|31eD3|xjt^dW(dSds=GmaE9=4|-~HR_tA@Ux2(=jQ*Ut^L9UIQ{@vi*f2j`XpEGtrD>v;CjrmTA()F-FcRG){wk$^4;;IH4-f8N zAhbTUGhx*O1Mt}O#|S{^C5OQNK+prbe)jsf8*Va0{FWcF<+8J%zy>AsBhj2g(Mqr@ zWl9E8iAvP29coe`os7w0dCoOF#D!5YZy)3|+2AVT#k}joz=6n`NlIV;+>^+W&~=qj zAfvV?&u4q=4C5lpr>UJM5yppe$fs*rnw{ML4f=gYCpd##zt4_nEBa5< zLSs@=VUbQW+7_M~gm}8%f-c}@Sy^@K;VQ*?lZKaL_NL+-S=q>@@R_>X{3`V3pP}od zkQMh#QP5_|U8-QPk4@5W%|u$hY91ysvK3O&j1*{dI1f-y95Rp4V2j*>Vx)ySHYkuc zh@VC6bdE{3WL)K?kS`DJDi0d>>N8uEe#RzafL}#S%?nc{qa^C1$iA@J1f(< zaxuIyb_zgv7xRd&?2XV{iLL#&eh(S(7h6H)vDNEE*W{O=gsrUzb%~SP>31e+blJ4p zNc++(u8eovB4{1!n*1Er=fper?(hV5sg-3@)oI>P%TvUf>+~;nDx!yDM!Jz@QK?a( zs;6jD=>y0Et4QMrX+uOmFGsKRdiLNL=uBTND^t+EJh@0+=W(h=?4zx47WOGTg1Irp zq6x86Scm>A$B4pc_fTj?uHHjg#lT>#)9R_wZ6%Xc@Z_(BL=HB?5SIc$HdTOf(x}iz zz=L0V*Em}8u$lU)hbWyXFS7{Er?O?%&^9O)Og)6k=SL-Mi5NQ(mG_}f38V3vG8he_ zh7=;t@AHKAL4F_}gVV5hND7;wAK(l@?=8VlKfbN*{Yu{hvxNlj4&?CPoE(ZzC$CC6 zlfmxi`n2rLx=N;B3m3$R&dJD%&;me}B%W!6a-TN#F#s|)A*Fy1OEjcw*{@M$Ijnas z5bApxDCXcj*BeKM11&koK~KCt@-C#dY;qNC7fsH*kn?Fo?mI<0FsvcQ`L?@awg}#( zT>B~Yi=9nJ0S47|bIgY(@%MNvl5fJrESrj_#mVzHnC-+9gr+>5Jll2Rh624WwBTtP zmPZ!H!B3cgqdrU_)30J4 zBQ#0?arJ(Z7?Li(s>Md5HZ~YYh_$ef3=DFdP;e!MT!gJ=IwBDdrraJsdWB5|F7gvR zd(7UZV}=e@xQQ(_tVe1e9Nf_eB0kVu?KLk+?n&xh{h~DKuz*L*L}g1R{K!}k8;*Z& zP<#FZAduEl&r0W6={KlvKvs|udkP7b8;)x_5Sw@$(}9;hghogs%I-=WyLf9DQ3RwK z4sU}QnC@i{le!rhtor@i>MrNDKk+CT@-8~P&Ev<$JHol_mPS+#1=R<;OakujcsiX? zKbNk)SHs#4;I%MENaAyh;w)gaSY1V@`hDukE|gX==+NxM{bkub*g=dE!n@0tybWEs z8(U?)ff`>>ZKU@d+}T$daN6B7iI0v=9(1<#{KemOwgp|_qwU8f>gVwX=hxF{+dHBE z4(xwEtxY2+FZMV(&uNLJ<8e^}CAYs!Vz^?aOXG9VRskg(9V3lHW2D+y%6r#f^6DLY zn(E0nh)2@u!^ntplWib;H2?4@GZ?+U1#jv+M^COpi%utd*i2+Z3@z&YmlC45!G^pS z*tEqT>Ia5pBDVuPkJ|yB1#>8mB9%#QH4`0&aIC(Fr~{N={b0g54nNncOqdiplBZ)> z_pIXwd2P@8FqGF>?&%y=iA(LSK~*~R`|MEV)P07rhJLA&~Fgfl?dnEKCWNk z)6x>C@u+QFeLHAA%Db#6?NO}oDBigNQk7GqpNn!I*-doqkp}R?3kNujPIWa6C8{r^ zsXCl(VowJsY-#Z`T_|4OG48byp9of^`7kO#Q97pPpyk}=C19uq=0 z9D$%ZkB=i7?#fjd1~WDMjuC%Jayod}jBeey2$q@c_SZ0S0`L?ou91q#?X)z0 zssK0%`y0%_z53KIo~3T|OvYU)jgtPYC!K;x>6Fy*tgchmY;AAh0kL}VX5CiY*0uq+ zgg4ZwZ)h6Ygw5@oDu~dKb*hjK4ejcARiLWT!S_Qq_%A^`~#ft6q(! zn0lSVuv;_H{=MyK>K5#5(xu#%>J|!}){y3b3bT_cJcBCyNut6N@B&DNMn>LE(~VuF z=PKxp-qm-WNxZHK_E}Lm zkx^Ip3bo=*wwiWIxoK~0zQrjv-` zv>&Aq#bGf0!TkFU@Je3kX_Sgl-TN$bpGCRaa-Jtg`F+3#6VPzj}&_%A|IT#BUF zI*a24O}J`dWqNDW1N)OmG4j_aj_0D)PDj6mZsU-)J>MJ!Rv<~g#b^n+7vO)2gn-++SE)Md<@GyPT(=o zcyva9jv?|vb{^*OtIOUNgxEQn5IZ}roKc?u#@Vml!HsH=(W)m(YVQpA)qnk)8bm;$ z;*Ze*lWTvoE0)3UtF!XQ53}mW`vEukp0y-S?n(33gzQhkL^A`?gC-lv6*tB&6!4WST0Jx_^PK}lk2>Mmq5(E>a zbacNE9_|mQ&+!uY!f<%uZ~PI1Pe4865YKGpVNcNOSATpr9dW_Vcpo`w;s^k7K#srU z1{Z#hy7;2FH8RJw!7n)d0rof&O5iDr40ozA+h1Eepz>^NO@+t>qAtNpkYR)S07t*JE!Au`5WG@n(mztU7sv9FrWY z1t!>=S}bKPJNPc?Q-8#L7h!=+TE2~D{o;`=a>z`xd5R#NuD-AdT^c$4p|mn5Y)3xz zmt=5|gYCbK<=)U@X12IIA*Q~6o?(KUB&IGzG4;VNO|w0~Ta*f#jUh`h_59IFe4|^%482g3vMBJO?X)!3#8$0_%f9WyoAsiUXpqE03Q{ z+1maM6a85{mQp8eq>IIyTVD~}c0rwhkM!UaRD1lPR8Y+uc|ff!p{!h>`~LivqjAI0 zr*~L{crA45o)5JY z^|dUk6<|W;+HU?34S`a&wTtF%6wp06{E9oRGXb)sTAV=&kq; z+KWyvjPFIqx*7KCa}!}y^xz53%7K@{@HV7a)E=8~-0P58*j2Xqdlz>8kiw-uq;UBU zC|p)0#P5o}{np29V*oFUZb4J)9R2>Q`DGaPOKGQ1x)*oJg`B0)B#dEE?4BX_o6+}! z?bhp#QZ&k3+fy@ZWf(3ieC3$kE>vUZ+HQ4Y_5vU~yQQ;vkLns)sH{fyYn*74246 zJ#G@%?MUb3o^<)8a@{kI6KTq;X?RbjI@xvcm}J+*eACP~uEZp08th3w{>tF|b(-cj zm;9Zsenuo*e0O7$r)e-w(FOKH$}MEdzQAc$fAfu|74_MkYA<=37oQEqS60@-BFbxP zx81x$Uu2_RG8U>RL@VbYdtt1zqTTGnSPu7J;midQBL{>xi}C#b5Aon_E2ys6J7|bWOCkP6eo^1O&>U>W zboq$cc55qNU3s>rW)E6jdA3_?`0BE|7C4>FRndF@j_WHX($Nn>zxZ&?WqvsZ6C1cs z)$t`~IMn!(3I^2ceq<~uX9=pe3RZN)Y_cpk-SY5eHf>x1W#R$>51a@NNe4Sb!d& zrwfxbo>6_RjYOcsBO1)WpWVvgj^Ltnb=lfH=*?+k49%xtas%)6(~CIowY*%jMb5|N z6XDC>qc4BIdJ1Zxvi6~Y9ot6l`TXkH@Sa}O0hGb*Am8cxU0B-`82BSw`tjQ*g7v*hRXal}i&4W&SA+@;jo6I6u*2+EgxsRAUf@cOP|{<@a@GWy45FGrV{ z)TxJ1Ma!cXKpE+$e3!3iH#T6{jZ4~-cH>FyNxSjH_=7`GN8`g9>>AAa90B;#7cqet zHy9%{0}$`fBKW)?Iwyd%U~Ah4?S@dYQ`bF@bg)QcFRP7TqQPL=7Cs1TNWDBQLGea; z)X#5^%eA}DfLx=@)F0ysN@UR~0}c}0MIGweLUbZ&JII9 zAxDtuW;O!-s z*`8{7$YnwYZ{-)7NVSG`Uhs~^_LO8vgBmP&ftQ#iSi&8jTRL{y&0me^jZV`rKpwiC zV((F9H$3hOZC;P-t{1IS+A(t7KKK>dxju1u$sV7Cry_mviv@lRCkDKFQ--{}T9C%b z%clsoXy@rTgw4ZfoOQ7BN=&xM2n}{n8{6CXS+Q(x3xR@n&Sf$N&y4JxBxhH(~~q;qx9`q*)8G$ypWPwY^3sM z#j%n+ZkpC4$|%Jv`D4#SO|SY*&Gh_`RX;ye)hVgD-=o3Yl|9Rhre4)d_YK+9eM2^t zoLV|$>R%h$#s%jTh9a}djxjam&f#}@{m0TLi?H9rq_* z|2Fl$4JcUj{8AgD=2165n-xRloB?h2OhUEc^Z%mBz5qDL2*>Qrhgt2-{XQ=gYrmHp zp_=(-;8Xu|j?QV@+QNsAg9KaTeHbf1#H0L$p4V~cB5^46MzD=re@lLUk+-(B<)L%H z0aGwuuPKLcJC|2^tTH{zj@i^Gm;kX~51r?~2QVUO$9naTu)p>AkC}bOA0hik$IRZi z2C~N;Gy4E$_a77N3o(29F|%L26SAK@X7)VH{vBp#325q40+jRS_&VTo0!o+P+z+CT zI`S?)&#gEbzdHEcqw)HroBk%IqUJ%Erwo4$)`0savsUYpEJEYT&U+|7I4bD7A_^z@)JyU09`5L-QUqgrcc(-|u>@;(a!70DD7Jyp5r_l~d#Kd7lw-Ym+kNc1Hf5&lN%8d^Y8z19 zOkQ12+d;fT6j~Y2exMh#CnX@?`VHXvy>A9$#2dOb<(-}^04juD$JF}2qYR0TL{N-8 z?|pbb`VD6&Yt)+_#j7KwP$Y!D$ymQys28_FVG#>o35C@!|H0n?(eVv-R6b~464ab) zic3K{io}`Mrq;uWC*Ve_Tg5nMS_}E&O+l|Gv>E}$)6h`M*Vwt)t#nWX(s|Du0DtXa zZfANY+L`**uRh`08_2zo$6PNIq_GXA1{3>0ed%-K+_&x7uj8YT0I0MzgyvV>Vk-`Z z>VH(n1a$4p9niJN*NASaYH6aX>yA;?uac@7o>bL`?`eqH?(HZ`Mf#*~fYwYgR4dg^ zH}oC-;8b~QJcjA8-8cc7)7i3o2wxVL)!Lq#Q5$u*IRviqHCINP*37Zpw(~1aEzquV znBm?1_}q+kY7(d7nr&IJrRTS(_2eR_G&1za(@9OUreuMM_rLg-ZV}Dh1?b$l$)U4O zVQw?G`VNmXon(tlgL?e|HOgD;Df$X;I@*3g(db?2c%}!78|n$Dt1c&tGr8X!UdG;1 zV~-}Zr0R#pLzP8Px8TDp{RFqRRaCfEBVfTO_BWxoBUXEpMOib4r$U;Ar&*OX^Wte% zgzoNMf^P3A9J-b8nA}aSg<#fOlqgoFcR2+Sj$3%8dS1_r-T~`ypHA}*ds!4Op4NE0 zp>0p=x1B=0`*6P3H}jo04|iU3?{~AK7oGCm?CAL8m+85+KMpAjFq?PFVIS~6KNp0! zf$`G4nzojXU3<9(3U9Q;k6vw&k05DnKjll~lJd|CwEZgqug=o%LRi#v^x38U;V&es zPVxkNp~D7w@}dE8v3mJ({dhQ>i(9iiMX=r0w@1@Faf8L4FZK*1thaZIw;(WibDFp-yhoUvWD zw!aHpjeqGQNfUG`KJ>S~i4)Y%x?%qQ>#uRUm-C>S26F)RroOupV(y81P-ebHo2bWUl9%-TdqkI&?aFSAFZRdP~!+!YrSky~DcI6@S$!m6RUo3-`=|!HYhp zzlMXGLb_na0$TL>%09$_eo61r60Ezo^$j`!l$?`h%162OejYhbQFa*o%?Z&h`t0B#!p7ck$ zoqWchk~C9|7!E3~kh&sf^e<2onzY`aZ>#qpeOs|K&KjK-OM-1d0pN;?kIrrUdN+_m&h5H2_Wsvc^S2y*pb=KDCrrz6pL6zOD8^7Dyx`<90mIXJB z8p2Fq4xaK?{n60OqkVYLuP(VeZUE0u3A%DQbwNM}UVKwHk!umr!L-I9bpv>8tcsCLjD;+0t-8%1Y&y_vL9l1}|3^8)^28`U*$s@OA%`rx9 zqwQEDciTe)M(+7F14hnz;`bW4o7KT1m*jPKvD`=_N9)^(_Grl?m({B;)ev8*>)+xd zcb+=L$gz>%bL7<4Ka%cq(b3eUOAG$(2XVpQzAnC~nw%1=z5Otv!LL?cB_u9zAQm#l z>%yF^?cOiGYb)J;Lb7%@_ZEH5Ec}AD@LcB2<2M&?vU=6a2#(BkM3yByP2!X77GQmD zIb4H#-@nccbE69+=H93Z#Og7GYL?^qHnX%O%M18}Xcu-~Py?_R*^m z6`QSyw=vUu-M7O)MwS_+$nqD`2Hb8CJuS?p+S${0YYM)v{G^Kt8?Sb;q z%<$R7OTGCi9T~(Xde&BR_kFmzBJ~s()8=|My^%+SAN-V(p1sXDTyO(Z8nXtlwaCwP zV?E-3KOKS-H|Cs<*(b&h!DSC9vwCc@Vz~Hr9ffCnn#w6uue1(U1bb@uuIjA`Jrv(n zANv+})icRWYhKU8Ukp6@;9Gi)C-exuf+pvomOgx?@A~*gd@oAT$iHOnCH^Ir&H0!9 zJ*i8n=_YGXz4m@wO8LJ}<|}Y1tvZYgY3IBFWajtT`a%lN(C<D}$f^dejGh7eD&#c`4;( zgcoYwas^GI@yof;WtTOW6j5|da_G9SS>A7wHT&`lC@vPag80ykrhgtKT&~XGm2)59 zL8xWlIO5Wkc}_=90PE03*&>%E!N#HlmKRT~)r=(A@_8XUTSEnEsK95xO%%xdc#ulR zuf7Dra(p}820U@kU%wop*o0Mv<*dVCtqoo3WAM^i)fkn1kI<-mAS6cRrjJlC+3~kQ zIxM_0ma49OYK&pHLVfKiOdMv^(xrBX$NY*H`QO|}xHNPAN6C{l3UVKLH}yrWxB1oJ zR*p=a&K=lE+exuO>qh9b4(*|iPw!3|lc0CH-qe|sK*8Uz;(46NMs_rh*EOfFM)BCt zr(Rh}1fKQB(uy>lJ=Q1DZHI#%Adq#h5}DAq0GnY2{HM{$I?xNDmB@~!bL2NQHc+)W zGgWzd?Pz_$EKk}WW+wIrfVHO|7)B&wkWtN}+())7oe5i($9YxCeMzP+N!fQA*@I18mfH1g zL86M|@gkDtUR&hI`XX>>+51VDJfBc#Yx^qzO=z^WA^e0&9tGE< zzIRRB7N`yT_Okl$2D*2;6mS~-Gt@?RN?eD+!_+-yE#+q5(3eW6H_+Kr@KQ>Q`Sm&d9k^|Bbe` zXX(e%aQPssDqG|f*iQMxJ)KY7iG1Sb@QFLhqb_WStA4(Px2c!6z_QVL&?1yAwyC75T(MA#$l1Q2HSV;>z;!9t{(}Ro_Ip z+$Spj@}Au$bQjQIR)06mB=}js`pI9ow)_=Mz2`T&bvL?W5R10PCK@J}dOTdb^hBDP z4d#w7)684A!j*l^)j(Tg6AU$w5kL3yq|)!O*%n3$Q?Bk&q&vj_gAL6|ZpdOZlsllI z(~{oP^~c{+Nfm^JiA$PlKz%WvJw@#b%}GTk4fFWsvOpZa zfjIpT?_$s6o5|Ke^j^_cu1Ho&Z%$5Te9e$DJD#O$yl0BaW#xvQSlhq1XWcQ1T0$C~Vy!slxEJamG|-VA@ggwHQ>Om_b`ll^-5tcK6u z;WGj9k3xC`{{9R;Gfy@Av5B~N;Ud>4+`y257 zZunT?{Q~%03ZE>KDwuTkIp-FhcYaYYSUfrSqYI{#T<9vD8ocP@3tjHAY17MRR8&@761;Tg z%<5opS}=IotXZ>yvprs@uf|vF=QaC$zQF1e058Mga}eO&1)pi>@Q)KdMezAKd<^^N zf${b_b|POR3ej?lIh>v@;C;#_r$vzHx7c~?_;x=&a`d?I?WSS=|6+W*uMZ#nUx;s) z6t8a75nNfvj8`}M@X_POtNZ%U(f=Y|-4BglhF3wNrOzW*)`}!+#gdCyH~OVXiIE+@ z=ov#9wikF;^;8E@lwgApP!F9(p=cAM54(Td36N87(%=Osr+`ta1zeY=YJpv~8KL-F-Sc4vQ`%Q){ zY6r+;W6^o3?$9e2(A5X%vcyw{>s?8c90S6kbB{ICQODsZ=sbH00N&A`W-hZw8`D|0 z`ppqdYdx|NIlJEO3JbE$acfG=zZ*4Vt&ytPK| ztcq65@p;s=Q)&8BEUF4iIs)KPiw+a>S+8&}^v11H-TwqeNh)Rac8ol#0kuTy`AB=y zXh3R9Q<@`y21N*=6gMrBS2zVJ#42-&Hn}QueMn(@)Vk6kCQZQVuTdXr88B&f$EV1t z@kw)no-!&vX-=eA+2JAPjkakec=%O*u;-R~6(2>Fa~WjCvkxG+k>+Aom^0qYDUiZq3YsrCi*1 z2uh$loXJhxGP^5?3)4NhZsjT+c?At-r7@URH(u=a%H37bz?@)>I{9Q8%#`MSesGAf zwCeZSDJX^`5cC0)|Hg$W-;la*lZjuYzKY^uu5lNz;LGT})K0+>DyuQs|K>*b^Ll4U;CyY1`bA;RgWkB>eHagmavk%7)~%@;7|7oc1(s4r z;ix00#9h}) zd`01HbVMCDM62(x^4I8$=AHfTDR$;{!^~w05uHmC=lT|QiCL+##4=$<;Pj64NoTSk zl(n&)0)bWnvs+ino?VsB2|e2p&fVd&r8;cIlyBTnYYVQxpD#?xTt{!|lyyoG=~fq=AU zd@n%AC~bGx#%{o&vSV|XV<64BESttKO>lK;znd@z92WlIfyUQ&K5Pm$At-Pt$zbI}K?;rfTna{93k^+}t9IcbW%t1j@nN zscLvkg9(#N=q;R*wn-y^qbh2z?{xhq_6;7nz+*QO8UYg#1kH$no4%&*9MQfebnvlKPWLGneaMFpMYEIPNLVW_uCbPe^ z(BWs%lH^?yGJ!3-ypz1og$nV#Hx4J>`-I-xP=dnTb1bVLScA~UXVIDl-;Mn_jz5u{ z8`JU@nLDQwy=u}Hh!{T&v6oB_8idfo%b=;BBsFzH2>G{A?!V0TP$7J&@1%2uT-T8P z;gjfzm_kj8cKegaN&nhgiP+j*FH2{Y%&~{lOB!>eYhX4gXJbw{JMO7jFDbfS4!?sQ zhgdgzRsD)MPRfEBPUrko^4mthv!u6o*3X}-OvYyf42K#Ms;0#If%x)-b|MC@Iz-cd zfIMzrgkr)2vveH+$y4O4lwD_6Pr~yOjE|66&sp?9sPGb#y&+e9p7>;)x{3g3|K-kkJr&F*+viMnFo|fSwce2sDQ5LERsQK@j=-y)d z-6RL54T5@Rm8J!KTK1g9h7bJ{8PQAWBwTqX#PNgq|O`*y94hapD$UpZa zBrxQnJGpEZ_Dc6KlS5IG3@6+5+zA4RhBI&0hLegMTmSm;7suDX zZusJVSO2=`i~mOdDz~SlK2H&vExPGA`gBgx$F_cPTz%|KpC4Zz`{U358-1)M3>XhQ zknws{@oNrD+@KTEdcQh4h~Uvlw2ZuJJXUmBGET`siEce@~yxc!3oWbLLqx4|``C{8(Xt8{}T>RBulm5!ycj*=My={!*Ao=^yr$0!) zs=r?tfB#=YzklBG-=C6@|A&6R+&3^@`G%x;<&OiLiFoA`+LGdx=YM)MC0@BwFLDoH)Y-Yz z%{xCiIz(t?sv6^##{-sAl;3HIAl=FF$$P&YJik)cso9i<#vUI1vpF7?8$DyRlU=QI#K)(#ubdyz`4rSxP^Aa_p7YN*ErBC!aPs9ZD zbhcHSA!wOu0r0)CQ*oqjyVMjd0N zms4Lic>g|j`{xba{+D}>-~JnUn~s5cyg~JqN8(rMV5M3^I72a>*p=}m?l5JL z`>%yx>XQNe?Ba5tjthUJC#e2t%TfJeSE1o6Y&tItV&hSyY(i*d9M+&ZwnE3}+|Gb{ z`9Zp6shj1(s}`dj);UNYq?ge9R@_hO>u8Q5AXy%@{Qy6fz{IS301Ol! zZ;cOYP`!PI4n_iFr2ovyUBmpCU*wS*3-!9c(gc&^_IR*$b@$GW{%PoT!9-cn{*r|*_{@RZ>`zj~g^hn3EUU`XJ-xD!@7 zW6XX|UwU`Or;1OFP1nbW$K9mG9#GRy(l6nrg~uWFtg_cB=u+8Z#qd}?r+e|v+?_{h z6fHRH_au$uJ-kYy{d&9|5L;p5{e1$hkvz67I$h%n#dZs~1+uVTSR=b_Z58-58Fydy zGJ8`!8+|vUG4eTRYqYI-9w+@zeVau3|NJf4&pVB~glt|b-Q75ZziIbkolw=seR@@& zU^=Eewx3_iwzX|WrE;da7i;Rp;2|}nbnyq(+*RBs5Wa{qvCa~yPwW8dmtn*q#~7vF zn$W#~goZJp!p}_hp!zHF+nLW5X1MI`_&mNRXe8zi4|>$5c%mbb_;a2Jqg#MvWG2q; zQ}=87_Q86ahx-x{xAo&dptUX`IYW10C=EA!1zIo!Lq2K$vYx=mv>q6@hmw}-&N7|C zCCPDqP7ea=Hz&f_!Sab#9mUEIn3h}yvx7EKkY+EpH)pcz9a;up@l3*Ez!&tZ*ZTNG z?VlTWbLbDKD?j7i)1(Y?6WWPesd4F?qL)BYcDqhc9)2!iseDnHFu-d#%~xPr=p{^9hg+|D1tvc*7m_WZjg*WOT%C@|!aPcT zjgpa~s*~srYI&%T=WM2&hcIU}zTn}>|EA>Cn0yE!SvZec-A2g|VDhJ!{J?xl-bu+w z4Aj@@My5OTSUu&al!NP9eH>rt#TU$>U6hOiqTY+io-3*JK1#-^#QXo)l?2RTN=D?W z*Xq?50v6WY3n`(;2uC6DdBo70ljP|#sw4bB5|JZ=`9~;m6Yo*2;H69fC}wy=#wS?eKre}~YkY2k}c(`;xJ-MD13?Wxt1u105wYb@{w1Qjk< zl2e*aJUE4Kk-jbTJ&eAG~|XNlKZ0z_a7H`6x|{ z<3JT{`NJCu&#`>qlz( zANdnHsX38tDcZb$1J!KvsIO{9F(kcv)1=w*UXwIQ-kTY&BjYzIZ-}?nB)`Qf?8MnZ zv4S|zCwtU|P$)JQaxsGF;8>dSAxn7FT3RqlhC<5_qhryMtye}WL>LA}*bT5ncswCD zS_Nq|p3hZTU9U(M)`2PEuh^x42_!+vG^-L2QG|_bl5$y%7}+XiL-~?R@tk6jLmI(q ztnSFx@E(%Shc~6GYq3uo1~AlXv5%2W%gu5-X>BV2@mhvg%ig${+eVOmV0P#WJYdOr z0T%3~v7;JU@X!v7dr!3N>cCXQ)iztQ5Gt#+yuU)E7y@w$#twQ#*eu%lmzz|US%)w;uO8! zAq|6mL$`M&pQ$D^fBLg|z;pV5=Zw_nOIXJib;L%trQ^%A5wEb04prn&7XD-((UGDc ze+D^n*TxgK?tkwY^py@j+xKsamZ$04I-ZB{F5l4xO|^Ek4Ws*6ctm7X98TuAm5_0h zz8CA5`%s=w`PJB5I<k~3i2%els6x4mHc4OVV@k^g1JALbSDho@+(mqclhoKSkQYuP&&lHg>g zkhCvZvDDTEll?vTd<~zE^}oiary*hAPOfW{=OZVg9gP_D1?iIqZE)QdS4Vgss@dJC z;xwLD%2S_%SA_7%T6Q6bGVAb(mh;zukjmJ20xxE=&W-%ejI6=FH=NbMJ(|vEgLz!6(Z~oGdV_@?hG)jDcqXCy$we z0y!ZgAEOQw^)V1ci|xJ|?QKK&A02u-6K`rmjq1YBbXl)BPwsZeU7~!{t~6SjUY#x< zayPBva@PQl?rR_6qm$k<8pSFL=SY*zhaNNX7wP$rrRG0j!AAvtW|Wob*P;6+kRuli~-m8fx~b!75RiWmOi6(aNK8|Nq0<(||Ws zWtldwZGe;n34Rre7L8b?&U7qlyJ2R^UnzSXeMTKW zXBOteLDq3r$5Furg~(`2N}-4{s4P|3S^OEiwNy%>Km0X&&bjZsyd(v>4)9T$-22Ww z@7#0GJ@?%6V_JGUsH@ozle%h#|9k`J=<-LiPy~op{(E%Oq7>_&;NO$*uXPc| z-J}@tPpWSILH~$?{vm4m$1hR1-({1sRQ*Gp0UJAf0?0FtDsWYec!5mI<1M0!?=LzuBV$XsGv3i%nfc zkIEgfsS7mQ6}(DK(G(Rgm(U1X@HC-uu{D~WWDq8MbT@;!impi-Hrk&!?Ef79Cx=zW z^Cyj$592+PG~Po)j+a0D@pSYL_N};~P6!@+@+^7a!$@ zBi6hqH=yevQm~FSa4uc+t|$xLc}`8VHrH-rD{)P0#61sfD|^);9s}CGa9SZ&RV8|h z+d_UU_xSI0=M^ebp^L_dlRcpw$wCi4WH5FayF#08pa}7H_9$L_4Xi1b$6>oORDUDB zD!clml19Xzi8t)oZ26#aBcK(MCx5*yqy$E;Z0r9lOiJJhk)pnyX8}CKl)-1 zL^IHWb_Jna(E2KE)+0og+fB2Aw$@0;9SQoQ;*U;zhq-SU<<#|4;){0nIKZuLoMnj3 z=NjJe;*0#_9{nP>DKAt9se^HIDtgcgzqG3(BuIg4dh}ADMUh7&17c7=97upl z?`0F^TL@M-3$)Kb>oP{gHV5QchQMJXEK?RlU&40wG&~;8c^}nUc8$_S!1nu2^DGAK z>=)35r6aikZfxL+#DVqe*(`!;*shW*4HzSlST7&f6YHD41Y-5|4-I|T@Mp!r|8*k# z-<=me=RmhQCBTY6vA~hD0fx0PtMQgOHe;mtjZ*=%6u2ILaK#U=nM;b*Y{5My;sCk@V$-40{G#$E*BfOvM)$oqn zkF>S3T3I_I&Jgow)A~W=OKD$XE&vdI@qLQnv9qsE^I6SxLa)%B0_)*<>++DIt-Xos z$JTp+^%GmauP8XsdR52Y)kov+gWV{+fiK?sPU{x$E4+Opwr}I@vy^rdwl~mn$inpx zUHJV~9CAxfo^N@m_nQiOEed)^Kt5RBdC;Bg?)#0doYS;2y7{d-6 z;Ds)!ybIDSANY^6fH|C`x(;lxm!puO*UO(JB= zRR&;ZthHsJuwuJ^1Z-Zbk0HIoM{!vlqM#(u>J;wh$Y;q1Sou*xehjKME-%XT?&Ery zJ_w4b9k4kKazEV7rw!$^Hmx|{(Ed5LpXKd~ly)<=Z{+Qm{yS`HqV_VS-HPqM;qAZ2 zc3Ts%?NpWrJ$`O^+heo5v)dK&WRW~5bu!x^?hMe2jpQ(b=tGZSZa+!6mMQ?$JOq`; zhx)3YcQY&9t|eWm5PIE!y$X4+zhbW!tSO{2+KEg^Aw^IinI?B8lBumbe(OUb?FZ6@ zXErHo@BV(2CP7;Y1s&v;vm?On;ZnqYZa-g^`OuCLzU%{Rnu|?8;!kC#kh^!Gi*2Ay zFDvZC*0F?X4vNJgr!(-af+q@j!gFHxP}4aXF}<6={rk8uU$?7oze9y8f6ih4ki*P$ z6TE$jEVSPjZDKubeG7MH>r- zBCv;!C33>M-^Fo)%dIJvE+C#5W}J97cC!L8tDK>|K7161nQ)Q_QBsP8SlCU3u=Bm* zXPATBkl+rsM~SZw=X28{6%JKXUX)W<>BN1;K)Y z;hESig9C46i;%blO+|2ssIIa+uLNT(uyr2L^hY`X+Xd0fsD7qow}zbnqcNQ|_o#!( zqhUD5ZfUd}#o>z7;iBOR9By@wb`v=#H`pfGWS6yQI@-a0X_LmtbIidu|55JK@tCdi zgT~9l3-PgkJs*6V3cpRp+g11h2P1ioP4_7_p9%g4iSZ1H`DW;IsxJS`Kz5?PHc-Q| zR=twB4%E&RT@Om}mhjoq{6+RCB`*lN;CJiVM*%eb0K<>3c;f8~$5;I9?MoY9aoO9K zBEL;iyhYRCaN{ph-o9Y`Me61Y$6tK8=~BjD)Hfx^Uo37qPy7YN3iHy%SQ*^pQp*?X zJ^6M0FBGp)Y;u?$Nt0(b2o!56%K2C!!5gaEAkh8c?6ZMmLYcmz^JnjKcdb7Emo>@v zt*vY;9_M}nWEW#(kG1po5T%GYy16-7VQb89|3dL2*4AYI{!14>^5x6_@A#27U%q(! z$h&X-bMYg;8v6N*#E;}?&pU>Ge&R6WN2pG+l1*|n@SCWX%9gVAC6q7oHSrS4Qy-;6 zIg*JNP)@WTOhd26M>FJNL~kUrXQ>f>Mr5ZTPd7$*K2cXWn?aLpP2?|8S2BL##<*|} zk2f(srAHUfG4?HeJjYE_b@3?;8{^|Sl=Acs>k^IhZb%O2m>o+rqJ?ub-eppYhu2gg zVU#sDLr`2H^zkaikz{`M#yW`X>c}9aOt1whHDL{Uqnm0?F0I4hc7g!2@dd7!a;H~h zwLelF$)!DR^uI4qkD4G(qLnrA6s^TV$}YC~I^|khPUjYrz~h3!5_*HI-BSW}Pn!*1 zX{u}vtv&;Lb=eddz6nO98~bMqxMBG(dvf2(-OdIpWyugt#Us4Js(E;@?A|#Oo<(v# z__SH}2=ZxIny`h*pEZA#J?fK2kFe?+gwSe`;kn5NT8mTdHU2TFZTNR(o6t~-<#Ri8 z`4_8B304lp$9M&1bR$%kvEW^uY3bgER_h(7K5d zrMDWQfir1RTEqO5PE&EKVODD~eBYE>)tFxCC=r&7Xq4zU;95S140)Oncs+tX=cZZ#*tuWgN6k<&4gi$qgQ|8l*VwY$zQ05;1-X$N zjSo1<@3RJb6=JVIkwF?Sr?`C^)Lu@&FV?Gg3SfCP5CD3a+`dgZShCiurn2LW({aXa zb$&AQmQaj7P{Zll5{Y>{e`kxTMUMSOR07AffSf2NnFPY^O`0=njn1u!ZXDn!CGQdy z0$Vi#FChYZGy*%{*9Z*s{g2b!+uW~sIIqW{aJsS_-BM{>NhN>L`urul+!E%Mi*H-L z{!?BbXdAo;yu-I#0#|aVZZCTvmRvyUfTIfre0$u!L+X12X@575PWF}PNF7+7V~}n@ zx#01#7bc<=G{@=o9gf7DqVK2fxzv6AAwV0zeXRrcpJQX-68M?tYoMd;EJ3sr#cZH3 z2P-L4Q;dss6pXRx==W3#mI4JAp5hdg95?~RMk@XdYi~{k9A|K;-bnvjEx|#QW8*&M z2^AP%3P^7E6P>s>Jm_T@OYMq|E5uNPlDWLd4eB8|TTLyn3w-QP+iHei=&N$Ki;4mP znAggbJXeJjvR;UZvlBfNVFd;I;6U_STu3DtY40JxRu!;K1svFJ)4`rMH0%xMg$)Ft zp2;X+9MhJp7Rqvywk5j-OG&w%>!&PH${WFG$H#DY|Ni#sE1RnN+sV%0ir=tDp)BIE zBc1Qq^4~o2pE1@2FX4h+Aa!>|s}@AuVzA2+8V{37`_(kuue_{m+aT4#vtc|&mjP1} z1A`7+&r=ao#Q8|Cn=Rd}Xqc9IN&tvw#%Z=!jQ)9j)2v4SoHd}(8n-tOq+&SIU3UJo z7S2?pJPku&H6|sMp1Cp0_<*%q-qC#6TA8_LhQR<>;`8GZpFg!pd0r|bHFUbQ7MLT~ z=mJzjSMkkNLv@eRxlfu{n+nj@UY7vvH5HoQR9(qwgC?=Y@daJ-j%qzJs=SAH6);UB zP!@!KK^KbsE9Ln{Tph&~jd$BkuM&4x;D1)>MtR)KC6s(28xI3^moKM9U8+u&P07Tw zlx&Ncv;^>4HQQ%L09Zh$zn*ilcd1&0nTLc}Dc&t=d`?I~#am7n`N|~m|M~f_P# z;8r31i`;-E(lO^C9Ln>Go_z{FNp>^>dCT3tndf<$L5dqPc!1wy*jZC% z87#s3K|v8c9rN)VhB*jDDT4{<3zWugQb(1{@`vo|{%EwL2)n8Ar{^{j{DQ7diyFH6 z?MCfQWlA9^O`_@~bM3k1F1K&4Iy*2o>*lC)!_dR^pmarTs+(;+Mj1J`ck}By)`50K z#oZC)wHaleJdWytq`G`gfCr$Sr(Ef_j&+0aJGeaCg#MO=2HJSVm|U7o2Z=d~T)G`r zOT65g5tCcRxLLfFQ}3#fM#%qmFXoe?lDU+=s@_>4rOAu$#hhY}U6%U)h3{PPk$rm% zn8S;g$0OfRTc{2flh^Hgo~QwUL=OPO#bRKMr9>5ca<751)=#8L0^1F-eAvMaYSn2fEhO%{I`NYx|t%;gx?}=PQYz#3^&$G0k+xI zRe0jXghcr2ohy@0kLO;x*y)jj(B{WUd^>4UT)aA};P+gw9z%+H;25Gl;apz|Qo=?4 zp1v0~UUIQ}C_{L5qW<7g1SB0&NGle-C?L(K7cUb)Oqn|;)e0^}W$>_rn^l!zENrFc z=)M6ntY8SYpQ3zmx58-cB<%y3B{!yhc-XTlC`BuqF2j+C3qYg zXXo++sJ!p`Z4~Nhso#(Kn>VgpCh~#f#~7FBACFheXk5s_+9=BX7phSUB7L(fa?sce zl5@qqAeVkhDbGMx_@g?lUJtvfMB|ZH^{lp5$7;H-vg7%+5~`(8l^hBV@`r)F`1 zpM`;{l?r*}R(UVrlYm1l5fVt+MRj$OP>s2njN*#SI zf64G1Ow=P!y0>38R>AO;j~DL9BHVWOFws{ zq1`~LcBElMsw6tnR^sO}?Q|r~aHLUSx&sAVqt{GMHW)vgPjxzZ+-_N*ZleHu*G2)v z@EB(~6S)TjyxbSq9eSy6;39`S3}1BaETL7(*1(#?!~aBj2&>|t@S3NcVfZ zTKzBi7p9#vxQ)V(i3cZz>NX28quyAYm(e6{oXqeS)v)*Xz~ctP@{t}bcvP-5M^UXj zlj46JBuuuUrpkX?(m`jT&B;=uA4Hb#W#g+;ECDb581R z&78xN*)F##rrcX!B+NV0$d-%uOU5=d_P`LvwkTHi4Ri>NGsl47H)A;HQS`Xw{>rF3 z`K-T5u{v4)Pm>dTegAw#H?O;}J^iwEm)4%X{STMIp02Zh|KTF`?-wqq{rlA+?BB0` zkNiUk_UxhT&AZ+lp1t|SHta`Q zsUAN~QrNJF^@S$>NU7qr=M{1ek$q zo#pRj%|2zsxtLG2DI=|Zi$ zI>WxFT4{p+bPu-;B~Nf1J{Aq1xpL_gz-Od90)B$7(U~b17gCTT=0OBBH?^vUOp!5% zI<9KETMMm#{|}RgRf3@eS|_D^otR$J$uE8T9Ny0U9BX&+?1FcL9_3~=9qMEoVfPc| z#Z%N=x@cwzEH?w2y$8Q}3c84Si+&(2^?1B)CXUzc6kKkWdq!1|=2F6o%U!-L>g$!e z*@*w+?OMR2DzbDZ-H}!ry1|Y{2}{&=zUUxEiAx~pG$BB60Q*6A14&2}1}`n60lOi{ z+XOURR7TN3*KuvoUHx`;W&Fn3jN%vwB;g^TAVd)i$T(L~L4*(nOz%0Ts_wo0NCS%N z_op@KxK~9vPqnj?{AYMV zU(^l9SpqI;eUn%jUgg^%%rh@G(Mbuzswii>x_Z#p(1ht)l#lNvs=F@!0n9$7cmD_avjcKrbNF&fRfIktK3U2yJZ7z(gU3Y+Y}VQb)2N(m7W`|+va*90 z7`PTy=Ew~o(21)BO|7;0@U&lP=n!-rL0L-18eCFdvpDMaD=!yBg?Y?ciz|dBOM9O3 zT%(AX%fv)$?FXpcc9XX;|GF|qe`Lw<=t5na&!KO$GDdClS1=dXQy!TS29K2AtbM<^ zTDzestj!xSS$He9S_Vqr{?Hg;0Na#%PSf<^$;lW;F2k~U-5#l+Svxcd7LY=k&wOFC zRRPHFQXYC)O$MXCJmF<=IHexaj8LD575hUyy4IET+?i)VHF zDQhcV=wM7_icH{2y3Hdwo5hi_TlpJhjL$&>`03V05yFaAN{^g5eijyPg}>cWiFgNg z=;icIHh-t)>m1xMbMgDigZ*gz5%Ec0R#A@8kKT9Cd9HTC_|UD)?2{`ykx19c=#vA~s z4|+*N-*ZyH%oIe*W?>0N5OfynNOq3$rDgNygng`1XCJF=*6d?D&UD7v$G+Cv$DaC+ z1p8Rbe)-v9v0o0Aoq1@&lbtzie|%iGI9u}L_s12@v_D$Q686U!{6$Idvl;#$b@);O z{yK*LMrmsNeo65AGyGjTd~*W+9)^F5&{_uh*>?f{RI7#k$3A$=)K)Q3Fc(?Zk1AMPPOk^}uZkp3NY;4!D%pUtnkI?L6n8 z-Q$w71O|Mq*Jv31^%(th7{6f{#Fb|_vY>-S*c+c)%GUK}=WQy|;Z7aWN1Yl{9}S5p za~aYh90Fn$ejFYEL!C|}F=2S~WZp(ji)Pz>fVDxChetrVE;fXFFq#g)KSH_uXwmNR zxg>|^o>cidWa81`HWY2R?Q4~vpBN6PEhR2)q-MXcR=1D?^XirxUQm+ z+q1PCi9x5|tCXYwdy#=jWzZW2b_EAxVTAE`LjkYjT-SJGI9{cS_jYG0yaK>`Ed}1W z-!r_aDqb)pULN30NP+i9jwh*j*QUhF2Rw5MyfThAL&e+rLn=HI;MJe)8qdPzMb` zwO+rpLdT+7`qL+l%}Xn(Q`_Xd${KxGdHi_|6~K#ak{J|d@+M~)BWMah7o0lWHv8h< z;POXzGhwwlvY76MrfJto<&nq~2b~@{-e5>K0C%iMtAinQW2735ogit>pNTFz(kkq{ z;WA2T_`q=_K-SSbvA3^oL0=8!O0V8s1q8!4Yf-0xA9MZuWC?bKHqLvq{2pn&N)n&) z)-RbMS(QZXs~DY|W5b8Je~x;7We=KR_UCl)31i0t>b`u2?M^mu zqkK1#ZL~=qZItKc%j04n@soX)c)FW@PR|!+2)o;*%zZ|+y;HTE&{cRs=XGJI=-5s{ zh0;b)Z~Mw4=mDxgmFED~%3ZBmkrNZH6m%i< zh3AlO7R>J5@-2McKZW+&o)DI!VNJe;QmAI)!*UONv~Y9CT(~i0D%=phxA41AcHxFl z7KVzzHM2Z6Pac+aw5ROJlZ&!o#)sv}&MeBRJRWV_9%+|u@RM)i_RG+nVx0M6ocH}s zsJJ;~bkD3J0=uO>0>BecZuy4kwWQ#TAEZ?bzbXZOEyq8n;-C1wOMKPFVh;oj!7_QXk}06AwaawQF$?0i zo^iB0P2#)LM58<}Uw9^@KOwfAfuIU?F#c!|k^5vN^ zJM7gf#83x_p*q-5adPgY(wBTk-K>1luG@0kfe<6jlt3RDj ztn&NH%_sE4z@dwLQa)wJF79540S@GRyeQA$75i-m?6*wL3J95s@3$SW-->HuzYXDb z;FoM-f32d!`Kc+u#fs^`cq#p==@n+k!sD?DNF5xTbV7Vpg|G z0=k@z;jdAFVr->Dw~#4qTTzUyROJsAJT~94BWC_f8%fCap`+9bxbkn|v(F?e>ryQC zz$ERC&|T{F@IVZc#`C`&qQAGv&H}l_)$om3R{R?f;SkZlvX zy@}4DE!?yT6#o42PA*iTEi-8LszEq&VS~XBAef!d4U%D9_xx0zlF^Q-pz-1`@7Mzb_KobPzj>4Zcs9mo!eEe zHxYewDfq)dd<;Z;%D6AJ=&bU`{)L}CHP%$;8?3cG(a{)XSfuTv+f~|HYf&>{3LB8N zIT>mHMKycr_nJaEU+cyt)3eUOF z9Vnrq|MY^xam(n%WxOauV<`;7U%v|wltG`7(W#=8g>3khy|dLR34O_ywQURM}rP5DFCRMn-7YEwbsl0u5(~Of8VN`oQgEv z{Pka2aB=NN5{)dUAjac^tWCW-js$EDZJDX|iYH@|lb;VR-F3ODLo3WFjFI12zFH z!e_w$DODyK3S7$JYJnW?5zWM^z`(M)!BoQk%#mEOaWzJ;MZHg?Hz41Mv_u24^2TQM z=!H3FHHWN$uKdH^;{IVQUel-NCHr90!3sk5rQd`mkwi*uzzD})cnhIlq5D@KbOO+a zAkSMS;#e;Oj#E+E2>dFFk!*Ba^{w2hJP*n$-ayR&8~3VL3G7NMPY2l;bAR!l#QplD_g!y_`>S>LBS;9pT$Lw}b4oc) zX*RcV)0G(WI8<`NUmm3o{xz~ds%%0R;U4hUzy{bunlp~W$56Q`&DNZ85`HznueBZU zW6e4I&krrUY({+k4~^gUemFJ1Ju&Oj^4m4DE-}B|Fe@d$-8eHfzg;u)Qu+@UFJPUy z7=GJOb1D3LQ{;zuYDz+Wh=lr_!avr#G^u|qC^0PiLdd?Pnn)1t4qYGdIj4OuLrl64 zmY+|nczI`43`>6(0fHu<%Fz$QI<0%qtemQfsdhPESM4%bm6V%T=(zd5hxFVW^U99m z6IX4jlgx~pM~w`fKr;pC)peN+G(8^l(T5TpSpkfyXZkU}Vm8*zEOul?4b*@o+D-0D z4eW;o{`?R|n!@{6@&=65z&u?8*Tpn2ylw*am9+y6RMZvOsFYUhj4)FH1$5MO;+Env zqhL(xZB1wT>~^^Xoez%HbQ))WB|DMle@)+WIEFTy9Qy6y$n;$DYFJ|fbfrb>zn6w-d2)Vt`1I;1_uu61*szg@+L~n9Cw8&%8 ztHVcL9pnQ%vC*vsfct|MpOoHUF<_8j{$kCuD1*6mj5IlnfuZT4f+Y*t!oSt;RmQZb z`}Iv~8PvP*lk+M$mFnk)Wl(c@wY!j3PIC;NRtsE1v+CMbGz@ zcf>ruwn`6d6*J$)KR$=Wu4KfDkYO5ONBnXM}@M+TW9=cCT*;nG4t8M{zO3y9pC;+1`_ zfa2Rl+7YY(@>dP`l!xbV^{9zgBINuqF+MC(%f2kvHqDT9<8HQ`vN14w$wE573uVbY zFbvNv+|}9^5zCdEbZ21h2(AIS#3>!$hQdI0cT5_FEl7DgP#);so#}B~qs=S!i{ zxZ!BJ@u0xXj>ElC2fB-4;@$_sF#x98{9tqz!v&!(-^u}&Z{xR@gJ?XtDdTIPmZAGb zez7Uz8~nSp`^L2j{D^fqzS#U~ntb)<^wjdz)6*}ld{s34|0AE7PW~D;J*E6rB&C+W zu9q&Q{I%&}E`MEYezFwuSXPqRWtXuK z$R~tCeXS+@N0s-c%u6codHMOAPKKL1Ek=fmFIv7vr<4!4KSqq(^spwzt(|sWG0rwk zFUDyi+&dI;If2V@Iw|g+X|YlqYF8Y0ln%H4H+n$}fHZv{Rs13|rf(ey5|?C2khoYr zCDIR3)ple4(SM`*!;RuT`J2mb8?2bWG0jc~;3F>wq|o&##=pQ8naz9vV66LVmg>H7gj6YAFsRrc1BbP!;KgZ^3dQwD!Yd4-kGny?*1Fjk>#RfT2Ha276?$7Q)#T9oI=4io6yM+^d{^yE11T6)qx-AlLiWDQhPH$rZ@M=lTGq)%U@T) z)#bJ!y~5Ylei-V#+?6)Oofhs1azxFB^x6-@M?j#<0EMU(Q!n?G8`til0)b9x*Iw-7 zcI@LI>Z6(U(T}Q}pHw;4$9u5T0hVm4ymWHSCP(7_9TQ(I&C>Smi$1?r^FM}??vD{9 z4-@>QJ@`R#fj_^wGbTZV+yet#RZ;)c!wHco+Wu10k--obI$e>~DC)0#UsEMMY0_z? zEUR!V_VYSynWj(cnJ1vU(4_V()DWQ(^5V^k#9p!Zn-_KQH>=*)Z1&@HePQu8h^NNi zSd-%E{15U&s{g@igf$w;|KRjyeMnY3eUiWbqVE0wP5C~HPlb`B4YSZWeMyzJK8PT4 zNrBu;YTJ*W>wo=gLE|GoA_TW#~2NLol^eMfl{0J8-@9XVr>n2@+AD@zqR! zhykJijpxMU$kP@}n!7FfEg+f}MGkgHlq(K2-ZnPgmmf$RFY>YUHk9Gq%HkyV4?uhH zuc`He&)V8IWju1lfsgC481sSF#)BW@rT^pYYT%-(w*3qYFd8_c0+CHRCYp8CDA6z! zK@q78=EFH-sp#ujop{yd=1f|mVIvmzT&#QR-s)BN#kJnEewEhkmDbHrOsp(W%fOgI zpVsyPie?~L%-w74^EESPfH80N8xQB4efGy%`(y33{%h^L;GXgoP2aL8-2kuh9}MqA zLGM@f{a&xp3DxiO`g`9``EeTW{r%M6-%tJh{nX#zPyPMuu-@brpnF>A=u^F4*3bKS z+V7iBAV&{>)9P=A7Fudvpgq;!1Wu`+(Zw*3lFLk`pdn}}r;KE1h?^UpCWSq<|y`{FWlU6}vcjebiy>8;S~Xvs94ob{^FLei$?VqSYR^YX`S^2VB5 z78@CB?_rq*QX0!796>5%Dn9*Odg>{lPn&D~$Ju97TasR&*@!jq(3-T=(sV70&G_CV zzzi8- ziRE7#I9RW{9CWbb{Y~=U7RcaoZ%XqC+PAV;N+Z05|1fh;HcK)>NJ3{FJzaBOWWg>a z0tqRbFwR8y8>o+(twH^%uhAg)$HeAVe_EaT{xG{|{Rw&#;RLVQKcAMg`GlKp8&fff(FyE(bUe@O^EzGCe&ver@hgxqt|B1s(c5fGJ(%7!$K3egR*=F;K3 z`CHJ_XTHb4T~@k<8wT@!fx%%TB@D$&U*zc44Ca(@X7!TF->G2LsQ{hxqU>I5S_eV% zYS6!>i2(|2&Y-w`e+5<1!i>tVJgbD+Hrn$&9G}*pY#j7mvas%P3JvIg1opbBScs=b z-t1u}lByWtA_zqU(P9F6Ats>1Ksj`yUsj^lP>2C^=<@~AbJ*-lh(ALE;(gmKqH+M< zl^Qv5F>{jx%X(Sli$qRbz}!`_51~(j{mD+$g!q$*c;8OuXCC5BW~v00g4&Z%1f(ux-LTU$TzLlQ zTRPt?tP>zm%$#mKOUF_bkGEVm_AM)A>kv2~hc?^Hc)D0-s)Y1q{!|tlgg1VDo`}k! zRh7owA)9C<<`hVgo2~>3wl=zwt?>sK#zQZW6Upc8<(fW&eSWWj`5} z$>k830G1a}5_a6mx`7yG6iO!(`>*{99%JO{_*(%_j%fJe}Qw{sPjA7p6aF zJ{dL_nfYHT|G<*P=pP6!Do$}0agpk!pvH8HGl)w#OID%LeZ0^F8mkW|{bA~SM@IP4 zo<2bz60+V@d5K=`=caXE>%!iDB2T@Yp0wa__k#cgdwj}iJmbqEe9F$->lAMm(;JB2 zG!-gRYg#u+k0E-kzMi-h%L3`uPj~3e+iDN%&21C6wZdiGHr)|=8O1J%+pKUIiWlKa zp;tI991xm>oi@(t=I0|@?JiP}F}taq|o{x0GrQm03}`_)>lGwi)eau%(XM0 zNrzxxX5(`q$Ds}v@xI0M$&dw%NZ;AG6?X>GE4R@4Zr4FYM{l>nWyJPexD4N30hh$> zOW_i?{RMgf5-8g>7dcF4RU57LbgVY#B4#Wk1GlhE_*lE%yq5l! z)8B*i_ZRwml>TPY3SC2gW9aWH`YWKnEcy$c|Ipt-={Fp4m8km-sK009oIjo}*Q4M- z0-Kv(#70f$Q5ZGL{*H?TOhjy+67y&C1@ll*Vw*VJ#P_2zpdZymnlC2a)Zcuu1hp2T z)(Uoqa0YVfDY1{iuw*e%V3BCxq>-5zkRQIwNx^q8D@sqbMJi(b>w1*>*GH`XJvR=h z{$R6Wv$y3YT;S8N_Q{;X#xE7creiQ+L%eU=zw^^Gpke7!8@gPf^ALS_m_4NO&M=tT zIfLCner9JdQkf}uf(OSCt>*X9{<8yW{|(W$|HjbvFJtYuvi5J$ZvT9(_RrU7|B3Tz zzs7o3*R8aFUBvb7p2G87@0O{u{~_{v_p>u-)i}X!$?kS(y>m*0tt&*rS_O7^GM#(e z=z^}p?7;fx)L827k{_n2)<37h3@VKl8|Wx4>yVf+ zlQP4tNc#{FT6>jD3T|(&Lwl9n+duzey9UC)*9y*)e=q(pApXs81hr=pyCv~$Vf>4o z8<~G)jDJg!e}`Vv|Q+(e1^PN@*{76LpO`Lt6{7YA5e>O7z-Y*Jj&+F`#tp6^If44_p9sdHd(EW-g3vERjEX*#_VBxqT4Hgb93TNR&5;Y4yzB#DL@7>%d3&GjL z*A5WrH1)A&7YVr{1P70;NJilwER7bsP?!PrrUG*s|G1=HaoET#j1F$WP?z~ETv2j0 z0DLLmj1HTd{H{}B*=Vsx3?}D}QC5f_SvdNE89p$>2f3;b{34Ij@LU5bsE{L6)FJO5 zgG1WjbD5Fv=AmB7B1;(=99G<6v-6M2jBGsu;>LzeA|taDMpDV*k$Dn(#w+5+eey$< z46=A$D0k_@!g&fKCC%5eZ?y#z@HS-4m)bS>q|_voRT6{s8OR9cA2XhB>;P5UpjO!A zTltI=V6Q#*4ZSO{@SP{XKc)ljiqiSclaTToxJ%_bJ0anIOlaV@oQ8zEFrkqzI|B*d zhC42i&**}bn=oaXZ&xng*$s)Gf(N*567m4&Q-T4SZdk@ww9&8I;(6WwL$b1OkPh{6 zjeyJj4sf}j11^`qUrm59rT^`YYk|LZ$NAw>7cIUtvVD2h%)af*m(RSg_T~LKzcSu* zUrwL)<^41IwlBXq<3ie(=ihLic+(JjbF}v3Qd6m(&Xc$2is+QE`0Jlck1Ae&wCAg~ zAXF#v`Kr;{r`b6=bBtWDKMSfY)c!0^aA-*o7Jzq6Jkx5_v_c4Zn08^wYE%^8n>I4V zH-xFoDAfsdEuB}7e9%FYPuPUS&a(maBC z6ioL`0Qaf7)x5AS5DR`w(w*49K$B63{{6xY<9!bpb!)B!a7C#OF&4HOvYfd)Jld$h zMZc@TrM1rK5_p*W69e&X73_Dx^+<{YAz`D+cWZ?~xa^GNe)Zur(f#ToR`I#pk>;^D zx>p&hmK!TOyw`-acEdC+t3Echs?69nDKJNcQQbE!5}x!C7NFi&o^I8l^VGdI;jA~I zzQD$uy9!ZTI1i%SxSdqEb0Z)rt?FJIm0|#Fh?2~yd>Ne!N5UP+mt`nbU>{lEh2io5 z*GY>x6Qt%k5VPB%Fa!+_;P=Sc@aBVG=?0fwZWcIv^1(G&Oo=Uk! z9XSWbkS;e0BPB`#`D6Ykz%sO<2JWT_H$0>bC zz`9O{Z^h4g^TrnX$HrFr&+fRR^k4n%xMTEU3SIA7gJ;ap^?vMt@nnwc`d;s^z3#%U z_eZAwE7p6}`hIF^pX>YSDSfZ+`=?yU_1%*vuJ5n{`i|>8Lwv_$Jg`zT4o&`OT4Ai| zd5LZEe^L4W&b<)+zmd-O`O_6aKt?sa)H~8=Gk?+f>{0ul*vT!G(Z`2iYw5|!A^5Hk z{Mt?xzH4J<5WZ`j3cr??*+0H(-Q=k7T{7e~priXCCT-xo8o$;!C!F5`2EOrF!MViO z6YwU?&;h*L{7iR`u#*zkI(gq}OYDxinoZ2iUcN6B^b^cqG=1PvZ!}}@&@-;>!5mYB z9nW<43XP`C2Y>T1&Gxg^mckM_+vh^Fl`v{BPlz^Ubib_pYRzP!x2sO?F`G7@qBS2Y z?51_iuJ>NP?;PE&_6R#noA*=(JcFRT0DV5V@~ekF1^U1t-iT!x%Ku}Z8u23n5h3dez_t#Twl;TXZY+AZ$Uk>hvA|qh=4ypHJJb zfD_uEmK;5490FSL=FLBz));~ls)V?3Jp9u#;Z^| zE=Mk=&7*a*ZDbk`^u45+&__w^bYUeEY!^p9T#G}1onPpU55yxlJs+~=#B6P(c9zuE zn36geI3|pu7*r)C9$cx>Emvs0{3S!g)7&`n1|Gi%Q9lyt{+@|oa1_&a^uqQY#Qp%< z9J|HMTO^u0II{97k>hod+OMuCE$KV)pu$?uARD>$oVwE5^*xxUQQx)d`X={P-*h)` zRn>RTUzGZ)?41Ih;pyba*@vPC+afBOyqBm0wv5Y@&&l>mf+6M(+ck@eBYz%v5gspO zKU3|DRG%vim+_Pmw8nS*P24_thSuoiu@R!2eKb}jnek<$--zbKEQhzhZY zi`6ua&5?$*L_4}CngFyi({+Teh>tOIWaJZ~UIFNSO}9dKjtt+|%Mc`LYMc2C6}4M2 zvbIH`_RKB~Y9G2PitemQ?>(!2DZRU<_e1a7qbWj@-cL-|pm(NB??$Be>wi?yd&duI zdT(sdpm!plrJ{G)A4BNfa7KgPrC0t^dM|h|3SykpqWAjje(3$f15p&=)1vp7Yz=x( z521I?<0^XF%=`Ll3(vn_P4isU~(7DDnx-)oS(`-%aR9PB%N7~oX)Y2oafBC}8UP-q~Z zgS`(j*dS(L!pEBZsX3nf-jk@l$#DmJ}x zT49r${9!Lzk1$T8NSDG47t&*%EONMs3v;k4e0obfG)Jp{uUrvD=ldV6{{7!s{q*mY zffvEz#s&55xmj}GhL~|B(6=FI+yo|$b=XMdDTPSb-d&v<{c_3JXr=;5zGm?P=pLDc zl(Rd?J50@17y2GU%F*{vMR<=P<>>nr%6lz-5brOQS5mL*haZ&#FG53Jd1q>fywdf& zN?z$X8HK!JZS>ATKB;B)@)rhyBKv)~E1JNY z2Sduum@=KW4Th98a2LMo(HYWXR;~of$xflNVREmuW|6Mr$?wzCh*2n*C z)P>c@J4XGB_3{5Us!x6VZ6o{E$IlvhA@%V`uVj^x&!MHy8m|o3aQEx)U0}>Mu1TU_ zKRl9o=M)5G5T?H`GFH#kXY1D_+3ciP{)A>D6w~B6{71)zFGpvGr<2FO1O*gvK2|VjP`ByG=3{9LT__B~1UM!YJGb=D_fb>|x1ggB{7jO0_A4!AT0hB)fE z>BohaDi8x4`tdmQ?^XHZ|L+L3Iio-vc4Y>Ls#T1pj45iuL#_{x5OYmsA61nY0sFu? zWpfMgfZTMwUPrTl-jm1N)#y?_bsV!*yU|u) z1Wt5ZbJ1L_{}Dj(!C2Yhxdhd#d2HQZF`-vF5L?+8sX`Zt69IjKY;m|`p~CItASyPQ zV$$i_;z-e2RzhNBhxa-$mcN}NcW!6;?_r{}p!eQSp7+g~Y%Oooy zY0G_J7g>5hiM!;ekXd3{_Xs2kB_^e0W)1Xm8*%l(LDeV0#gtGMf4WtdM+q?M90NE? zO*OG*l)~XmzMmwB&J;#1h-c~)Db+xZ{wPr@RieqhG0gU`7#qVrss?C5d3qZAjtqf3 zC^Ob$L1vmX)QZBnOLc*iauAG}MD88NL)0~X8ErZ#%3yQ`arq0Ro1lK>Pa<(1j!%{r0>0vQZ$oWYPU!4L&L?<10pia5MHDtniZhxGi+#H(EiI zc}qkP*2is?v4sEFgGht->BWTeZYaJWT72P-vzAbMZ+^PL^qe&9jiqeTt5QIq)$Wjc z(~iTIi$uFPjJ!_O`-^C9>H;F42XS9&-}00r^}@8CLr+gKY(zkqdB>6(h zSL>|d@>Q8Nf_xPX-f_V4*y-e`<*^Tv`;o_9A9X(R*!XdZ+{D?X2(!Xz2vtl|$DRV! zAt#Dvu{!~HO{J}C5pR(eYERXax8jrgk+*&r`76m=k?|vrI4%5$93O4W6}^E_=ZL)_ zc#WCE29DSGepp1j20yHSyvFB4&kwJ`=okKiM+nm2A!!I4r!v>Q(yUp zM4j6+T}Z5c`W!94C{v(MAgE{eTmwvq-eJGrSMjm!QM2!#+&v9+Q&pPzc?~I~BtT$- zwpcZ22a8r(5e&=;P}=fiO`0aLmbU6TJ8yDumw|-A6_HHZnZ{=s$8jCk!K19WyY8w- zUC+pzLAOw*6s$)DR2bB$igGbf3Y1z}((L!$`~LFN(kgrQoY8Yi-h20c@7;U9?|wh` z`zbTxTb$W`E_?^BPS4)bEi`3%boCY!mc|=^rGPC`II`=@+zAJxUM_qbA+&1*=y$`% z?M|J&Av8(15C7l1k87^b!m7mz*p2W2o{c;-ar3@Xc+l+9M_RdUL|f1xo{8g)M?1b9^^DaN7Q6Dx4fpB7_UF*NSm1-N;5O*kzFQNvyM(o znQ?J;dD_IRf{A&M6HbSZ(}~%&t1EXxfAm2v{1u%Toq)MnZ}@ZjVx7HCJu}O-k=^>( z_3Xw%Wnz|Vn-}XNyTyrFu8rc=IKgBWmT>7w5(jHP9LG zk^N`mD2Rw@pm8PzgE*I_0E&SZtaLJQi-8G+Da?sh=pwBK5dxjVrnBN4dW6G1;S5$K zrnz5DiLapW8^lk%o_!*Uesq5gf1%fC zjNt+N8!}Ut>;`lvH-U^=ld>OG7zJ&F$U;Koq*2I0@rM<*q@FbSxG5DxPU*e;=0lPI z=!vej7m(Z6i#bJLlokwhug5_5Q|2vLMvJEQSj6(_AIq0Ta&zM>cv#$r&Gu_p270VF zDUk5HG*fw;rTxB2csFU!5xy+uw(zS6WM}?c(0aDP%6tDAT*mFEkh?S6vsV&Qa+uDfH-w9F9E&ZL-fFUJUg`T z$)q2|U?1GlTp@bN*0JOhxVuUqI1vPNmz1b8HWtZ5ld4KPF)})1N|_Qf z&KI2My#KzWPKb#^Ub2Zsu{NQ-Ep>l>)|9kAfj|u%43MVWZec=RXjd(jC zRX*6CT>0P&Rpo=Tg4d}3w%h^QPIT4locU4MrW3WoQUyP55tb_WQ9!fUIETDG2}h>M zdf2a~iI|3w4-NI8R;umITzCUTg-|vsmKxkVl=BVQU&>D%rj{{<{OeprAy*202Xe4Z z;&Op$(c@sIsWO|*-VWP9@TN%I61+JQpA?+v^^x~4#zi-)8B*axzVQ&P>e)mqVwmb` zSwhq$X}Uh#S#7t$1T3VVeh+e(kHz!gYNjiG&?mZ~BaQBnE@1j;Jz0G@7PfV0*I9*) zVJ0=*4MT_xLx>GSfDM48 zy9d&-;W@+xFZuZa<|2vMP&W)V0GWgzW_Wy`6b_*c)d1?|!;FN+iynQU@`Qn*$LqbS znSP;HwT4gOML)bozd2-778^Q#$;j(%~g`M6*ONW&!nb*Eplvl!~@B75>hOQvIYa8Xr~lXf9S znhH7n^ysz3M_t7_BxwQ0bnQPdbw~vSdwBf+gKIE<6K8JvH!4ILh3S!)KDrW^YBLt< zp1%Pe3HS&^mHCm=_{g&1Av&Keg>T^|Os1VvO>6c!)!JM`^uJTdr_5s(C;E&U62c2((hkhBDgu9 zi{B%S5U_61{YseG)NMFGF|o3j7_MOEn_8?VfB-sG`>9A+h17Hi1mosAC4#DQkr+*K zYLjvqQ@B21O^Gm(cW%R2)$uQ|Lo(-0Xgj*N9gowjyya#*A?x1GPU$qoXhiD5D>n0M z=V87eT0NWNd;Wycs=K$d2-vQj2=$Ha^ozyji&tZ&vWdK=0HHp$U5slz2`i_$0c}w| zZIUgjw@tD|^~0~M_N)s@Q7@_XmJ#v?pW!mtL%wtV?uad;eoF15Id7n`t=i7H_?;h$ zp5M@AO@@4`$p7GTcdVr*CDW(VCC7g8KRMA$F*hV49!>P(;#(=?EKDmu7gu94g^nfN zC(k#iL!v1Mqe;swQqnSOTE;S|CKvnuovQrYdp=b1bH5T$QvTV5shHtPPR_md2W*Ag zleT;XAF;6rQ&?Q&7L0rcg>0mds{;zMs|p$=zrvjUis9i`aD1og1?PS`iWj^xE%gN> zz&G;ms{lSg!N1`Db~NxS#{%EPA5y_D9u55Nsbhd|;Sa0eALK^?e@iC#fG?YwgNzJ5 zm;Xe<8ke7J;1#S<7pvN=E>=~X26_be`FxiOzHKz{4_e0n-_9RX!Qb(dQNUj}7Wjoc zQNh1+H1MYk3xBxvE#gnA@&E5fga1>;fIlUCj~f3+1HW=C@aOTpYWyD!{O-wPfWLt6 zSL6SWM}z-kf$!ums^G614g4F&0Kb`fu4q0|USS!{E8dxu^opc-RhqIe$!C?5z=P!Q z+I`GtHHqKRF4P|gxcRNfhxTtp`GMo_z7^$%op=R0e(SBs>0iOCN)w+y4_iJ*TUz+d z^RVUPw55%IZUMGzq%Cv#F4}VaR_0>loR2Me+R~1mInT|<#{R9$%Sdw@HeN;>7x8!B zhK(JxaS7jg8@8Oim3a>3JFw+dwB-VRvjbaBqAi_#mjhes@oEcmC|-b#&;A~V?@ZNa zzH|MyvxD&w&z}z9^UHYt^a}>>d!IigpEoJzNv{vYM?6n@d?5ZE&XeT&w+1m@_Iu{T z7|EaIG1K>tmmO>UwUcjA)$+2{Uz76}TOtE^9FN&8*!g^9K)e218X*|$p-vG2joY=Y z70bc&ex$gxzC-h!=Bfe&U(6aIK+r1}j4eK;PEYI+E4Svx=HHp42U<*u0GE5< zJ9}$Up|oMgeyXBR(KFE0F-A%vg?W{w>ps}|b-`Hxrx4&2V0wdcj<kw8yeXgUxvc`$p=yv$k1;0r5psM=mWvx0& z`#;iw)k0rlJ{K?JKhdfG0spAaQ&afO=>123aeicebMN`f%Wo#1|1SJy1b@++&&Nmd zXPDDFGXI&}`(60Yu=RfuafKg^z5Y*>)chCy<0^~_|J5V^waEO}<>oDiCI9}`a`f-7tPzg^ zW#(Hr6i;Hl%%3qswE(N%Meab7JDgq$9Uhf1;!#SWO92#V0}LK-h_12JV;NI6vLpvU zb-kz7p5*29r>347Ql*|+cP42)ZK`@mq$hr<(yiW}Q7@+zmQ#(j4GbZs^r-O`Eoqr> zSE=t=VWB7?*1N=t@zja$Fk{7bJZ|1JgU-7g0t0h5MOa~qa<7$@JI-(Xx`Eb&Z$p1V zli)#C?hylM>g1pp8V@5Zq4;8ED=!8l`mN}Y=&dQ5bu&|}K_J+7k1|300xe*G$XEI55>dVHdLObe*4XJtvT zC$f5b78kE~S~LN@n;h0C`=SzG6tH-BeJi%`kw0jpfIL0=`l75D$Z>&`l=qKPfKKp6 z*cyX3!M+#-DU`g?C7lN4ihjDh4d&kMBY_?4XpngUFHPJ2mvVkd6hu#Bheke}3X1uu zDh8+&fsUsK$%Fw`k_EBqmVm~K^-q4H9Lii1(BMkGa8Jq+Tge6XeMdv%8rY|J==mWn zVyW`krR41q4g9VZDC7LFg&FwQtU#^zO1Pqp1n27Fqwo$#TW})(YB}n_iAR|SY&4JC zQ($S%Gt$4=@Hd+G1bU3;J=KACwj!QnT?A_HDMxup11($?`0FvuPq|!YY0r8FT}W%k zoR9MV+h25ed1}tdk>#n$Coiu&wL5ls^!H)qs}Eu$%2x-z8Ckx1{hP}vUsd-$%CqPa@QWM*yUl?1Q~Xh@`-J}kd9w}oBpf6jA=&iznZ;I<-a;L2_SUf6tEuy^ zKmdqNk}g~DtZk5rbKp?5kt;$aMm2Vf@XJ8*!nUWtJc9> z-Y6W++-_5SN+-sP;sF!} zeEIyW3f=}pqD15Zs+TSctB!|u-8HC*_MvmwA?Vz6z}$$wt>|&I2mZxP!y3?3`Mu0|?lhVrFGh1*C?g)u^V^PN&aHo$kP)K%0ds zz*yD=_ZO*6Hn|F&Mf+nn0N5wc5pgPxt%_8f!?AsFPBk`Yu@+h+#$n2)@CJ%W!s*Z^ zMwsR2RfKul`2?#svCJq;a_n9=URV|8qO0tdm{FoGC)_p&E5jVn$v)~)8Z2ts7c7KN z1_k|rDkUNlHk}G8@uTlC7FkOjmthba?YYz~ zcN}aJusgM0RE<#PkCJQ!ab(<>ChVg@FK$s2iT(ncP-CB6RRr#;nvWFJL`cn+Vu;xp{paC^xDvsUb1GEnzxLX`9_;x_%n@P z@d!OUij1(IKEY%oc2JFhK+hkOM75}ge8jxfac4}Gm#84<3+RL%5S+*}HFAO^L;VCq zEDw(EN*rep4GVrU>mAvs5NXv0>tSo4pKXZ3OvVgR+;6)vu|OP^(WSDgY;K~dBsb_a z=B6*`F*BAO)tMXrqC*a@H8*}he`J{(JK#sHh}Wy^`9fQS=z`r50&QN_p$r?$S3;q* zp((WJK@R3A*n%JiwXr`1G%!bZ^hmsMVq}mrH?E;ivtrK#G&tB-?^KxS?eNG?Ug?%P zT#e(P85st%Lbm~<%SY`vR*1i-_x&~aRazV~v?2P?G<=eUPmnF<<7P|09VB=^nHv}D zdD{E{H=kUG*8~YqvL&EN3KoLS(~H>GNrMOH;h%gMzPahQID3P-V0L6sZ*FRWtG7GL zKwW5$EyUYda67d2?au4ytywtn>r+&ra5r9pLiFutSN4U!rrJ@v&M$mO45wIaaN)3D zXea$A8F}{LjD9I94c+)r7?6M@u-;E+uJ}}}22};%y~kDzCGaPZ(qZ!P3hMgI0Q{>6 z;AOVvCKu=ot|J&^!mqwhZ}F283#ljd0=GcW-cD-hvJ_Gr#9G?19H2**S_?0Q_h4m1 zSh`OPdHdt%6d`Gv2)~E?C%eSSm5OWsPQGQ6ZZ*ocOmwpYoH9!Q`OhWNF-t(b;w@Pk z0qtm!0#&w(0_0ijb}c432f$J>8F@cNc~@APERZbCD3AzwD2jksvIxYIgG?lunN2MjlPiY60+EiHq9SW7fod+|+ zD+yIxcW&g~@;IZg3;{X>7`}kmcHLXMTrF69v|KHCV+S~h)xwie(k zaoPR(6P*p`zAkVIJ#kq}iY7a8@uv#w95v_)<&}hsHyTAec#*GN?^~0L`o<4B6x0b6 zp!Lx0y~?L0LyWcN(~|f1I1u;|w}7f(A#?(eG$2%eGca=BQ9*+qh7C)rbAm-hUlSMF zaQDwACzy2MqZv}lDcZXo{pbo3@dDuS(w)IbZ+q*)_k6I`* z45lx4K}oT-GLb~Y46Vl-_Qd^lvdCX&`aEvVbId|>-X#2%?+CA(h6cRR^SHmxk;l>S zmyO?O9NC!J;ia?jiA=o5SL8z@Fkf}G+!JU5`SAFZE98A=rAk>|HvL%W2sh8b;?B*D zW2I~`ve{G6;^%;?rF50PNAujt*h3lVZpV+>ZrSir9mFSw!Bs=Z>`?MQPQq1n!t1rr z+F3u=L!yv<-5%IOE<~f?qepGGO!(Lg>}t$80%e?TS=fmZv!l4P=&r)fqPy6BQ9?Lx z4<_&##M?0#KVnW7e5lSa2NC=pW#~B5^nY#t>>&T&;g0Q{0}kIn_)| zt6{iS{JOaR+qrh_M~VLbb)Cn1`43(b@3p_~`uLJzb>9x}m6-qMKvH{?R3XQV`G4vX z+M8~`Gi7w5y~_`Dsl7%#j4c5V^Z(Kwckyr+>~V`;`wsRvZlB4xSYQK@2e=v&E0AC# z*;meiYt>aTWr5jIRR`CNeXHtV5*vG0)!hXjwyL^&Fr;4lt=B?(VwthlYCoj71Rl-;Qy;}HtSf^T?(e4yTM} z!^n&rsSj30N~*o$)D?{OqU0Pm3|LUP(5eks8au39M0kBI1vJ<6-~4gq8>&H@Ct1vs zsJ^6?W6`YG-+8F;2`YcfHB@i0S4_w1{mNgDB~%|VRDVEu>KhcBH0&eBQmo*Qvs9M$ z5rtOp_<~9n<-@S)k=D~$S{-+sc7#0P5&A^G&((-uCcUosW;#tG+GK)WOe#4)9a!Pu@)Y)cmdO z;io)aWqW!T@)PR(R`2?D`7LgrFSG&|Ft`dc#JcweLyNPbyKEw!P*3L5f{|GBqPryb z-m*sbUV8;*?OQYc3RFB>3r@;oZbj^+uJE8UuwXWGIM+@p_H+B%Uzm8zqWUXBT7$hv zmO3wNf;T1RmDqGkmm(Jxb|G>R%>X-m?|&nGC~&vMX0EoCEoEQE6Xvept+BGS1E;t$ zV{@evo;bHSuP8Q#M>&`=t!4xDd6Fw5y7x*TJnoEcFpJG`xs?5b4P<|u9$PFeg?IlH zDpOmQ9mWw@7ge?3Vuurhi@lc|FRZZh!NtU&^7Xxs&H1@>&1w#dG39UW>QXgnCO?lA zL)+^l&Jg9>z&&=<=NJ16kq}$ybVjw~U<^;@uvbc|(BO`9W%zv{-yCe?w7f_gVt_fW6iPgyQ&=E@!oGowD^7|}gUyB-P^6^3~n%4^Z>~+bb zyt$`MJ2T~{aei{Y>7tWXr^R^gu6F3&{rT>%Vr9%`ul#qF6ol7>`Ro7uJc)E57@|DV zi+7^t3nUJU79lMiDEN+eGU?i}Qa<9Xp8ZiA_~x0;5t(aiS7#)?4QY*f=cVa|Pi zXIp!*y2}k_*d9CE+K<&8wz7#lR(FeL9iFTecbgs+EnO6uZzyu>+eRTWA4>x6QZJeL zF)A8r=Wq&h)Z8*xx_#|RK~7>{Yvg3M3+8u+Nlm#qB!tO3OwdCK0}QN_$XA%!K#UU337qf;&H2`gJ&TjGgpLeY&Ad}{;O4Fo3`wA?f^ECmTv;lzp-jj`er>k^a4S zltolW^LIUd6SVz( zoRvKb>+mL3HCe9)7FYUMH}o?G_1P=?(}}>>5ln`&iPY`GSfLaMg(qp8hS#q=+Mio3 zGLSBwrD*?6x^M~S=72*S9uY4K7fxCeHy)wwC=@Q#ITydutG~g|S!X*9{!r)}FVJo; z9njz$=nq92kkT|n52ua1hCkHCSFiGi@|+=msOeFI6c-AceKy3v$y)1^4!{jf$@Yui zOy%~ArAyI%QHkI3rSOr(Xq_mZnqZyCC{8p_luV6VAjScup7kVJ6$;@hYmwQZWM8;h zjKJ#sQ0MUvHcKyfpt2XdctSfTq2m7A#{>CbTgUR|?rk?h-t2rlj}NwXED!G9dL!k* z*}Dz?)Ln`1(T@Mj{{3;e?uP2qfA`8&`t;;{^_`6W(JNdn;(sin-GkM%7yhHm{vW!$ z_~AS4%8STvbByA{lE-UAkq;8EVkj1>T#BI*5hPBBJ;>WWFM)_{#WfgDPA|_J&#yum zQ4C!V1+}gZH6}}OQrCgje6f%d4nkG4g%%uu3N_N5--zyf9{C%jUlc(yOP=E%wF-m- zd<D+G%+v;hKbO`v{q&Cj=BX2fkw9i63*;tF_H=ay8+X$s+K?lx0$|ik^9+O^<;( zt)`-S@!gcKayIN}f4~=>b5LFLtc6oG<2$)3SR`hl{~)E)tfxG==^ikYbQdk%H7 zinE*XIL_83r$Epbo`tVkEGAQU-Et&)6Z(lje)8lZf*DS$Nla6B9t}s@RGrbM>KF>N zP+~Z&73lFQO+hW3%U@7?dn=*agUVNL8%)nep$ykYbfMK08OS(xuP>ZjmmWg2c@`W5 zs&ky?>&&;6^90ZNH}|YD=U-xeLMz97A*PV6z{V2OZ`fRccaulm-3;F4wF29IcGw-AsB~WYjfiBD;I9p1BcYG z6~8ti#vmAe{%rjGoFCB7&&2WI{>DIDmf~yS^=ISo+R^+S!}H1X$uHvLlsNpV^T_-- zAhib^jU18chn6UV&X`PUY7kgwZf#PXOKG4TT=O3<562VAeA*GZR(T;Tul_VFyIApc zN=s^=5ipz7zE!8OeHb#nTq@y(Qc(%*Y5#p{PvL2@=#=P95)BdlG0`RICi!j-k2!(8 z0)EO93U53c=a=rMfSVbO6Ij8NKbZ1h={x^`svSAC%CyStXw0bc;73ooS+#x@C97?K z4=gJbe#J1=A5$F3bk{=+H%t%-~00Wu%Fy%3KS4Ij$v+mO6&^}SUFbavQ?;M zZvkzqG6H{Ir5*8NU`;5c)Z|mPe-12WcPNp_8&i}FqilIgYn;I4oQ}!MFkbUoMabHp zw%lwEe2|d?p8_1XnOAi&UX?&;=v8r?#uox5bcO4>5Y=%w5!Lar;pt1rfm7X{AQ$tWaoH3kH-++d1_k6G@_umiXlWM$>;(1u71*6f(!0 z3}LLKOt0S)Vh7)x1vI8=6Raua??N0yg-K5CN@NBiUOGPJz%v1#KU}ZV}oMVIQ)s|zznmzur64IKKR4u^FL!`Q^_2K8A@NSVR2yvKpJL$+&?0Q%_ExC*Ip zNZI+6V9hn{2KQG&{2CngA#S^-b%|!{pT3ri;74J;wt$kru%X2GeG1RLvkBp0jXhYv z#8pV8rh-y)?Rd`WEtYD>a|?M-1bN;e63MX^(s#9O()C?bg@yD53nYU>Lg}Ws1`BVF z6>xkY9NhHI%cSD|#EY}C-nx3qCCVIYP*3&Q)E>rx3L6`nDj|!ZT3E;$n{Go<7VS^5 zhp@2Bpw9!7JryVW3{Li^0xj4bk!4wMoZ{XGd1@Pngr=fPSq2&0ekpEgz9i9Y8hR5$ z^ycKQz=eWASjZy_2mzyH=5x`5#_tJ#WZ)-8^w!U=tMsSdC{RxmHv&k3AmaM%%O8RF z{2@bfgB7o~B_uaUoLbUI(s+LM#{_jGpIFjE#-5gH$MSj2ZG?Fp8lP8O69ZorYhtn~ zu6>6kK~oVhPA~go0>*-7OyDc1`0=s-z|i_xDhwPN)?@!>Lrdi(O!J3N1Lx@RvIB31 zaZVJRlWAWY=EM={C0LwZD4!q#H$E@7!n|C5BYxWg3=t51C4P(CMt>qEM?#=(RWsDl zm`2h5WtXGs!dViwGRbTk@Od`K&=3l)4WwpmPd!?F@uhlro5Y)-N2z#&W|Yv3v@>v=Y(Pes<>j$wk^f{dWU9gq$UXjkHp!yM0>#ph!BR#} zK-3@J2%A=-h&>o?Y`~ww%`1`Lyd57%tH(fq)hiL$XQemr7!GH}@Qq7_*pxwXcnT@+qLHz|{)bS`EwQ4>tn}GTryQ2~V3x&-Hj5NJ(aj3^N7{sHx1LIP8Jm(0* zn;AA9DW(!D)bsMLtHiswCzJ(rw-WEpT8npa+?Aq2?f{yc*qWLkDwh)~pN(Qzo^5+2 z++8!lwAwMUXQc1)V{)(6o|KW^l*p~oYIAg#dHJ!(M>*Av-TGBW>s442nTWvgI@lOn zIBOkNzYwc`zu<}hY$T=RgT)I+ON0vt4ziqiXKFRtmS6h6)Wq#T?K5xd0UBc%j;Mu*Lw}y761% z?@g>Gq z%kz-_P=bp$oBz}7Sk~%*|K;Ji>+pn-2Ld&!g`uZufg|S?7)|E<2qi5u_XBK!lK4vz zD}O0+C&*$8C=bdJc-*H;_a*3Rf*uk&R~i3@=Nak`P^z;=1~4x4EHN~DK|-@1XDhL; z?O5?BY`C1A`waF%?yt44G$q{f57I8Q&}+7e>cv06m>Bdtw3eQa^wV3L)nIHbMbE$_ ztQ_Y6!YD|pOVKfjcm@y&5=b{2jx!TdPl|wU{3>DEi$QKM>esDW`n3lvxV$6Z2Vv|S z(&=cmv}`wAG)G%4a`$Dsk($T+651eJac9W)!;zVbK@-aFUbE3f%-BSr_gjGePue2M zHpEFO&yn}1HQ#-y?A%rQ^q^R9Bz8y3sg?PB`QUMg`5&XZQ==cWxObPk7#wb?(S{aO z{3-J_xXCT56UB6x)8d*~caZOm3O^ z=M(~_-M=`J7fY#7Wp{K5^}m4nA7oESFtIR)w=p|VXUu@ao=k^ZyxX6!KCnny_+~9e zd3)7*ROYEiH(=qal{qi)AEP5pawgr3jxa6hRWd^z*o>`FolX1!L!KQYy=;&A2oIt_#ITgj)5`TjAOQ0l6x^2j(}JBC5;-%H#luHNGq?hN2x>?Q04?&D z2$}~4j>oOC9jl30fL#c(xgcncfGd9B^I9=j) zgj2F(Ih9tAfdP=P;kQU1;7RkemMrd3VlcU8sxW-6Olax|?j)53Bne%Y$hs8i9$n}# zMS6t`fpngHkiF@;dYJMz$I6*8zM*%b&8HL;PH zZm;+Yw$%`cJI zOqR};q~jZrL+E@iXziU?_mRe*Lt7t2#&o2Sx;5Shw2BEf;xq(@ok(Qj+KBK(k^(w5*b3eEMi=jox`OM%q!_= z9I^DluzIT{)!f(vk>L{E)~VxgojML~Ol^-orU88n_>@(&SZzok8of)Y9%Uo16SrPNaY?++ zBzh^T>Sn3I?C@I2Lqy5_nVL|xjhUe6?H$oW!b>gPM3#}M)<7`lVyNPD`Dog~3vEzd zDlSb_iw)@AjoiM0PFriZ4i}B#w5?$tD@8fbgVG>_fqYdB?LjHN2d(Yy!3)McXidt8 zgzfPMGy*pXWN=omgj7AhJjaZ|n8;%i_tpZ5b%)(?pL;Ky&%I$!_&myz-|En@h%Vg% z+XGYyo{gMfX%cZ10XQg3ye~N_X>@GlLJNZ3Q9Z6sjo!YXMu1CA7>t18#)?`fSs`q} z?8Kw`N#3}=><-G>^}o!034Bvk)_B^aZNSt7OeIQ{szK|3S}ka?h((|jMaV)D5NJ_R zAJtJD5-o}>rd7ftirb6}pJT=OhW}q@#%+Fs%V?oU0Z~yLZN;*Tj^0|9B2vmy@||<; zeJ?M`YZ0b?^Etnv$<1BPId?nf+_MD4y)f@$1r$6S%?i`>z{Nb}`&a}aKp^lug;;z* zo`_;FJv)kGo7c*}13R_T4NOBt zJseYlllJ<9nXxSSVC#5**QRpRXDMrCT0-OUsnlHP5!&#zYzaQhq`?7}V^Mg$c@l^D z#n%PQ!2oLL(1f3ZjI>4PmJ<1_SD=yf|4_BDcqcM(Td0TN`J6{7L&CU-Fn(znRFIxj zYT>*)Qp9)xUE2C`OZX^v|cum(N8Vvezh{DoV^MW z-(`!MoGvn!a7QO$GL}ise0+t@kD|s=s{R(ChkuX=MMNqm85FOz)q5+A8Z%0`Aamj3 z$e4;hQM9D%Fc66)hDt*?K;+rxKw+$=eg5UqyDZ`aw&%;&nid^e5B&!RNcczlQXDdm z4S!%NJ~nR)RxUnft-&iWTAJph>t&vG9EwS{G;d)c?$Me2~b2cCKa1EmuTUP!H zh?s%@wx$DKcQ~DqQRGGt@uIOP5SS~>7B8oFKQC-syv{8kBy#{Uv{9<*CQHwf4?qZ;w?wv3ipcGCkmp9JW-2;=aiC{pFMwAPwmkS0Nc=~=O_z^Kz4jgtdoCa`R4Vz#N z^#NAU<7KO#5++rle)2u29N(%8b}IYVo>;8a%ICFS8I=H2)kj}98=02pIzJla*en-_t)&U)_l%SmV!Y1B3CUuVbch9z=kt7!2}rJ^F${X ze}erfVwe$%JuWvpn}VNN3fo)oQG~XjIf_h36rBx5<7wn{2r&owivuFez$C=cQoQkj zOnD<_B1KMrfmt>VI%HfQa2wYE8Q+~vk0#DRKp@8DFtBE; z1Nq4$u*9UWd?UiE@Pse~hk|_d*#X70^a3)BbOW%MN~|E<0OFVQ0%zL;Vo z_yQhwA^A7pgaXX$Ib8N|H;3pXC7HwpLW!M>Gb}Z`gMEl0I;GO!W4~X{-zrrY6?+Ak zneclgv4!k@t&En*RY|mc@YWx$XeEN@3zZQ{S!c=-l&gT1wbA2_*G0k=DnkTYg2ir6 zz{{qQAy3@y5LY_Lki>UJF(`9odS$w_5?|S3Ih$xHpbbf8VI2vIaOtvMJi=YX@gnsWo_zVThm@XZ>6~4>5mXa&3+fp_bV(Vc!Ex482CNl zsWd>H$BruRTBM`W+&VR}ig_EgJ;x6%kh>D~ohN9Ic)a(8!81DX&`;EUG9Ldt zdgAfV)h1oVKY#jo@z4GG?tPX7_dYx9xc$$QQD@Tid;7|xAvlU%|Cwph5O|bdfz$G{BlbtcAsBPUbqYqWoAGWe?fazEK%%P6cZdet#E3*wF&2cBT z!&|=RYv2&d1_5;qxP0t&x}5A0BR-|P$?s?k6@UjEoq8}l9DAYOveC5)bD+bloZ=?O zXdm-+#^O$9s@al!m-IIbUG!Z*WM)ZA2+DEcZ`dx4wfqI{A9@StLOxKL+0#P(`^lXNn@L>+(x!usQ-h_U*HLHc8&G zR--SOHau3DJl7bV5@XrOx*Ctl9dmnm*}@2E5Taw#BQW(7K{7FU*oTLZ7xf*E#e8yO zVT|?1SOxPakX|m(4hot12!)EaRJCU7?TxTlW z-D;F)Wy+(($$F(!t^pl$Q z2U7I^l-qcuSaLDWZ@%Kj?B(*kgjoPh?`ZPuFS1f^yqy9@q8l=?>krScR?ecjYhhu}(kZjavJnMoP z!_1@4MfiPwQ0E1-2X$XR8&}FL+4(g#9FKaJE1;FlOEt3jm8xuB5Hq}eM+;e!X1qNc zK6rgD4_QXK{cNUFSVmTGvuErWu8T3@dCtjbk&;hx&ot-Y(3!|$qpk;9Z3_!MjI|m) z?cuJ-_prH82=e@3;JKc^m0zUq(}^1se86buv}gsMymTkk1x>P{HQO(LD1X4B2NgdY zvZz7LmW(#68-V$m&6BsV8c(LGXm{3%Bq^cHjn|y*Iv)kiT4&YgDaeI9pKTOdOw&tih z*YiyjmkN5D1hPldLd6xcNEFfw0Z<#dwHy&AleN0c!~@{UAG3A)VzCObO!#1C3K@#G z3osuJWtH#;=k@;-u^q;v3e!@&asDatr%=t-@+f+`MI&j{v7^{!wnpdiFPNxi9B$f| zf7Cb)Kd*d&oyi`%nwsTKrxX(ydSc2c-uLX8DxdHbNR!bj})23PM* zm%ozt!ju*_Tcf>T$kyKCKA;G{@)jPz=+FB!@srB<)Yu12q8riT!ee5KU;c#GU9&GH zY_`c>`x{~o&7+E&=e^wWds4o;U4Axie`h?lXnQ&Zpr9D?@UzFyrtj}ma|fJ(iZE*p zMwRya*b}_JmNk4SIN1{|Zv%~u6^#j)%;o?Q(gR48qCjuYB`ou5}Fj*w;UrgP3 z*~UG{08iQ*i*bLF4#wJOCMMyvfzxGy>H35{-p0Gl0(ua|UR$gjXw#tU^oXN^dnyk{ zbM{Fdw(nuoBx69?g9izMX#qGOKV&>nHRX6YrP2^!vqV4Qb{)@NL%#X==k}+p)=XvQ5&1>n4^Ty>KsAheQO1Gb-Z}5 zX1|@Ym!@$%B8C^Wjqg0RVUH53;6m~_fGYfn(QCq0G!3LuKU>?boFg@Ly6fkShlD^X z&ae1=ZzG;-5`T9vV*lwG<{o**kcu; z93_6uMqbA6evK!M3O`ZJQn-N?(20_$p(OhWv$$W(biY{S5<3=!_G=AI}YB%i#0wdzl4anUqjo;io6zuG)9@5`OTLu6y1fON^W8o|HY z0nnaGU)*dac>~&#m(y|W=i~a?^s4Ulwg0^LWc0NtS4W5c{SGKzgsC?c+&e;Uz??!v z7#Fv2R{sdE5 zX?-gS-S2A6Wlv2omu-kt*ec@FKx@(;%UMM&Obw+J0y_SCY+xPy5{EauV0esD&dFnK zfLrI=JX)qHJl|mmO_xh^y>f+v$DQUD#0z06F(pXGs@?|jsJo&17*|3&#OtA{aBFLN z%m{5!1_pt>G?&Zk8Vim{dG1tsLT>RyM<_!sb;O<8X}^}(!n^EnB1z6cY|(CXc3It- zUbqzl@}S{f2A25o><=uH3%tlgNlSOpa~hk?tybEDx5Alf_i$HHMdHWHI-jhAhWtiY zw*>o2^{5>Xq?)Sc4< z*_MD@We$ILjIvuHt^i>MtuLGaUudp;ug%XEyv3OvQ}}^gL-2N7ikq^Cx}3DZ$zFLo zkAK!SmDcaK2>Wt`JLfnOQi8d+=J#zFm~y&j&)T#3HcSGpM8r{2W*`-9B6 zMGylAt9C$heDXRbV+^G`N6Qbn&?n5r`e)FBkvoQ6GCgQ2jJ0M*$C`klI4>Z$95(lU zigo3HE7=QMW(f6XN7+-l5(liq0f+DbQ*?0Lf<MFEq=Pn@O`F2CFHyojZxfPY4 zJMUAZaqz%_l$^q_^ zYB?7piyyKb0<>#~lVzWuo4np@CN8`>Uf9 zqrh#L>Z{b!D`1fu*fvy7-ex(58Kf+n3Km@|6rV*`$)yNjXi$pT6y62Fv*jFymw7sz z=LMW3t-WDAWm2P5pTvf-G$A}iMm&@ zO@(r6~7%YgAM(b0lSCi@Q(bt;XOY0~gLfL+6ACn?_G zZ?1u$;6@?2DAxUzU$El#3oSs;DRJqVVg}jbgexf{mIfb0u#^lcx2Nbkc z7vnW>Q1(x%`D|`B_k1m})}Z-P@m24lUA6BZ`UaJRu9qiR6eoVS^vWKx5#%O1mev3a zP(vnF>#5g!PHTjXrSAG7BSD>H>o0md#uwyCY>$t5Q7(LswOiW(fUwTk6T zCg((p%oRJ71Jr{)O}GTqE#RarFpcZOD$2#a!MP!klwETqWiu)KUzsJmGc7V6-Qw0K zrpMc)oJU1_lgyw+Kkix-r{rui{+m+=vepV@o@?>UjAXAOOG*>jM%Iz_u8&?=`i;C0^K`as-OG?~`gA&F$l_ z$BFg{b0w&jY_VQ39flkum(IgZD(x<5GJ*asXP_HO=i&E;(yEp8XZEs>@M$^N0V}uR zA-whsA7X(cZ+*J0ydfjFKHs)uJw|`4f=?wI@l!Q?T8OnW7Q&|)R5lOIRG}+1kiyTh zm(tirolHKKp2@$mW>)w1Q!mcyS^Fu^te&x->dIc~L8*KB`zEO;{k2WORQsv6IX!7V z^|*Ax_EQyVlP>J1Cd@gW{giI}ySZ_Fikp;in3#fMpbH(Q%fr68uQN&2!{O~FUixfJ zziR!7aKE?lNIcO}1+j;2Q*2={Edqb9y$BKOFOtuPe$z>=PixH$qhB|16#-OjfU4rl zMELTWDN%W_>BRL-C!>!!3P%omV}4v8BQNVxAJe`4*W|A3zw+buU$^Mme_hyx{g*b! zJ+&{^Z+~g`?KSy-W}cA!*-6GbRPE7@0BAs$zvg#ukLLEWmcN1!b~@f9_nQpz`iRA8 zjlO1xC${kgg2gGBZ7x(Y+w@to+TvQAPKj+w&DZoAo08aO+9MXUzuvp(drEAxdi9Rn zQ#vB|n-=|x65FK9(5_<82kWj$cTU%4wz)PfyvEpi0WY`;Hik%Sb8XtU-BWB9u9PZY1d<^igAC}-^vPCi}gN>iPT}oC-;zGhqIC7@Qg=49V zf#lpG(dxq^VVxnit|ToxQkEXB%M?9O4xCV_$bsXP8~yUWxWPqQFgwiBL!;RWkOeRw z2=yP3=Nc2nsNrKos?x;})PIElu^$H!ZK_55DDtMvt;`EZS#^1a$}B(ghA1)bD8+Kg zuB-^J8V0gJo7=n}tq8B5{cye#q>AFh%Mt~G#Hi3}%=lHPyJeS>I;Uo9$Xa=xRIm^B zsP%rXRq|OP-V%9CE{{q?Henc)XxUAvL5XbfphR(X%E248dti)L+$xfCtN6JBh*iu! z7W2xCT>+O#Wo|&qtjjf2X8KtGzng&ttK;Ey$HI5uUwxHn(SQkGQy!{8@|MBetja9O zHL!JudEy^>PDqI9lw=PVE;0u0>5T?Z)|#_XiipQ_di_R<%8?~!t%&E_ZWwEVd5*FZ@~9Pb!||x5_?>`frH_sEs^=u8_$~5FW&1D@ zB673^A7DP|q3ij;fA8SWQd>i(`B*`w2)U;k+}&dikHBor_h7c>cE68Z|JpI$b4CBU z^VaFw!{rgZ2m9s5fLH#2-G59Qsq^$vCBPZW!rQR}gV1GD){i{#=;{ry;kT=LG0ent5&!D*veQ0OpNlc& zBoMuisEXmfN1{mGo+htD(w~P3uB!irW(+`nFI(@{lHXeWU;N?RR%!D{#yXp!(&%Nu zyJ3ktT~d0T6JYiNc}my}D1+wDe2UEr=*1F~6M5P99pc5(TJ1K92>6Pi&93Z-zfock zHFlv|U^cK^Ix z2vDlI)t1vBZ$>{K7CcCxIiPGf0XCSehF&VuE0H9bJe?nrWL+nc4w zy=wB{e?~Vn`gA)PyHKOYsL}7$M$=V6fBZfQ9RKYFnp2aOWDt6751L|`ty%2!4suUH zv(gU%D#X-5nC?Ch(=MMqoB`!nnhlXjfX1`!B4sPSA)~zvTs%YE@_Mhlj{O;$2c+tK zO2X5&1`Ng85hG6B<&l|J{sgK$e1MLJA}?#^pIkum5-}KURYt73*=+UDN+af2WMc}^+=3tQi%1bGd)-5el7J$dao?DY3 zN5tzdjMslsQ~&mq`rJeSFAjF+;bfgmEz0xK3)}Dkc=lmfXW0mcRJRQufh(|p29nyg z;rsOjD5ymlU&`A~`ETL7wE2s48?97!$zdEjKjFST>3Hpz-O#-}-uH%{mB-gi`QPwo z(!^U^J*C@tYilNVFTcMy`QPz(nl!WL;=!+~jLWUv$+yci^;G)wSU#|uuGPy2cB1mr zyZyVDpW^Y~Z`Y0go)8}{=KuNe;ob;z86Pe`aQygiPx^ZxKkLL~c)Q8ZY7BIlpS8+= ze0ab0^-O+NKN`AlMlZlFkksa3bQL4_4ZR`Qg6l^MVR2A#mm~cw-yL=r; z-^&I`N$cy%a%Fv;0|L^!$Bqe;8L`0nmv_6s$p4xitF`F;c4mBIQivYPgXfblIWFM% z$J^pozLW%a4B+|tbQ(xJMf)U7mkV|8zfFag5j~dhdNsSDDVh`l(Dx=b^|I4>>ZR#P z#tg~l$KIQh&kwS*MAiv?31Rd<-NpqEbv7*16Aux<{g5lb1`beD(-OjpNg+Rq4vynE zFhej8y>%`_{v3^s=|c6p*{$62Ms939L(Zw9=VGb)M~XRq9lxLow<^hpmrPS2K;+0x zi0Dr)`R)Mw>JA=Bpf2de$2a&pl#Cl`1LATNUTyZCFy)4{*;c7$_14RafCc>Xt{%XS0t|&Q6Hd@@Y3hJs%Y}3*4O2N&Ewsf8C-OoxWU3IXlbZsr@OUegcCTctvl}Xn0rvTf zIIvl??Wfdt&0B5L@>ZuSyw!}p@k~}z6!r=qp;1tLneu0iLj_-e-5MV)_&8;!sm%8K z0_@|DlMcfu=b^(#V!`tRay`kzT-F>Q=QQ$-GkHI4oW5kyYMHJ8&tr_+nYuDzZ**WGMLuNoOvrARjnjCRFto2P20C{xUDU`p% z#*cdqH6N-F(-$&Tz#x9Pjd>4{+ab~73@t5gsL)Wpyn=w&kmQ|@l1OsjWR)ZXkt7?{ zG%sf>nZ@Sqr!8#g$0;H@RfFVXHX_+=@wucI6vSXbrxRInr&DHyii3?@uNs#}*Q4Vz zojfkL^pZkPXxQ`yN5BD-nYU=Z=^R)M!G5(!N6t;d(s+uP3Y)wx`G6+6XRlSGBB_pU z6#vr^aQS`GN_8+VyWuttA$1(x)m|hibTDb8uF; z%A6LuSIMmHO1P1RH z`Zbt6Hei2T703GSCk>Y!mYA3Qffj(xNBG0{r}%emq&xnf+b6vO=&@j{FdaqZP8g%X zR~n=@;TIo!27hX#2wX1dT`Y>gA;KPPrDePVX@~X<#boqotu92n2A&|Ugc8Kf{h^Z* z#JO5g#J?TCmD;5lyHLQNj^8->?=Ip~I6(F*`Qfgnx@Kv|yJ=AO(jN#1X~*t#o3s%A zsZ5jB6NFdn;ucI9h9_Uh6tPWy@?%eY4d(ErEm(jV+2oB?`!~^2Zyh0zJt~*uX_)PjM}aK(-!1&K%c6wo*TITpPw*m; zMN(}Z8*JeP9R_Pn2#tGDVN@PES8HG~6*CQ_geAmMZT$Cf$BF+wu7~5lkL!u}?{F2& zH=_|0oD8_3HTsEj#&xToIJc~O{X}}%zoVaclRsJ1pYVIMR-Roj_UFs9g=JmJvn$6Q zU!Jv(?IC$KAYauu+i0VlJh3msMdyV2*RJH8SKCionrUP2@H6FrU*pGT*IWLK@z{$ZQ;6LmcX!<#t4ec^F=Q`0ik$f;0 z1BA_^Df*MP_-;`Qcx;Y0`cnM5%0Rzbk{Z?WVtYdE(4CqhUNbb67ulNO7HDGlL(VD~ zg=3D_;4Z))>f~aD_O+w$%W2MNgrC%!6uYXvIb*X4#1`tVegx7=|TEX1#&wAoPpb@uEeg90y19<}aLL!Rd^@7WBjB}8geKsyv>cd}sXHUVu^yq&A{*AxxDfl-X`QL=! zA(k@EevKK{wm_PUytHfvmvob zkp>N3FL;)wV^P!_J3bdXHYd;!xceZoy7uNYLCQsk6;hf|{mXs7lID+B72V{lolTka z@)X2Rat_Uhf4Mo-Uw^LKdu;z7`cLei-&P(6{xg$S+yu4n@hR|KnGD~B`tWtNl7jtJ zYK-VmsF9^6@krE=>Ep9$*8fd>?mT#c_#hHZJ2@KSkoY$i*WUJDc5!vTzgeb4v-0n5 z?+brPEcDmYgSYk6{=VbDe`0^HzxDs-eklLx-@FQ*BjD(F&mGe6<5 z^=TUPwXBsGMax==qTVV3U2d3*_Ng0YY6WFLnp%;N-yC{1c{#tQ;JZbOuTz7Z7`6`< zA%aain;odS)JkSs;xtJjlNF0l>)W)mqWKK;+$ExP&DX|q7V?khU}(p~7->Dp(3V@P_a5Vcg__d^`Tx9E37J&A(k2Fz_rG~AN3uGYY%R~FCE%}VliS3;o+QS%%5$(DO8br$NwiJE3z<``JKR2S?+lSUxh;uepifu+?m^)-*$vrkyQc;GflBweXg`ni~N_ zbc#eL#dUI9g)a^2PW@bN3IKgqc7tfmc3JDLY5fZLTxZtdN?6&m9I2Ef*!Q%9^4_P1SK zUem%~){$f1aGP1D`c24N~rb_=`r?bEI0YAQxE0 zs)y|>RQ&Gg71!mK9N6YGba}};kZudGPo5mTT%Gjzl@52#D6?EqjObSilo?3DQ+H^3j%Juaz0rQwW&={7%m`FDbbMM%TJN;s^Sij!#wg^#L*_ITla zYM~=ucuR4d+7rz@4Bw~UE7ZOks2xzLO?fv(3|`7^6z}G2Jt%q=3&ZKeOfSb*D+L~DG-D`~dyRhr~^A44U zn+-;|KW|^AdwWygKXW z%+LS-;&}73_zT_nX%q9aP%}T-kLu0O!3(;cpDJ~J>e6t2K72%Xe%4;5Lz%x^rZYd! zUZyiYHJ7E%&%SLZJU=7!pt$g|lbj!$^mFE?_dkv|KkRee`LTS!=Vz&AetsR*o1eh> zUC&Q-{0uVU{0xff&X4m_9m-fQ)tR5e1v>NduY%P1aW|jv{5)Tv14X3Zr1;Orx9Fbd zW^rFXsg?hh>dJoulh5;IDlHA2B>&0!^4}$T^4}#o^554zDgS+@i|oitn;x zh;J;Si*Lt8I{1EbQ7XO@zv@AJ*KF3s*Cf{SD;j*qM)dH#^xR~8SE~5BVu-I*A78T` zzWWEK;#<+wgZO^-i7viJ#r(dh!8fp258sjJB;)(4imwfLi2xh0SQlT%U>$soI{4nz zc*6MlrBwg~!=TtwL8j4GX_nihx&wGJ-@O{j^0Kf@T8||wP&dbJz+#)3iZ@d+s<7B7 zEH?Bqq7`Z*6{Dty4PK34j+S2NO$~O?FR002eX+r^Q>d6xF^b~s2tu;ZLdCnN7$sKr zEf&wtrsAKd7zI1_Q5|+)BF#9Je(9iJPy}LcU;~$xiVf{pjFJLdj>RQ50@F;z$WU|q zcl4oR8xxu{OrJ=*(7X`mqXp>QUkmm*;QCkBk;wKg7o>2TG za;(*u)>~zlu^7-%oOP2UYRd~TuC0J#H8UOD9NwXg@8%|lHlHk&xLC=%JQo(`+=hcD zWSTy8N_{|nz$uS4@u-icP*w#G`67?8_~m=e#clJ`k2xu@qfsB+Tf_FEMIrOBrnO6ZXki6T^iO_(J+|VLH{$qM9 z>|3deG3;U&_P8dV|FRxZytQPE3t)Y4bOipKQimt!>*(aXG3-wGM&qQw(CC4i_tGR3 zG4MT?h$8PZH{#CgpzgQjo+~xKEwi+^0+}?;wi(`o=BTgD8I4!U8~Jr9r>Yw}b($Qn z%z!sJM|G>gdhHSng5Q^;_|e}`oYU_3am*_%cUsP3I*H?k5NDHQZN2%l-z7des{A(xld+e~&>=O`Tg^(@H@Fq%68WM4>}AJJ=l{E!4@c z9jPiwJ?RbAS|vRIO1V)>Xk>xbfbu;cO4tSx3YO?+qC|tHX}nN?pwj~-XDUUb4|diEXHp-6+miZ_{I9yEsRBXl9bxf3(9w92!cIQel>EYj%xQ?N zx@mP1vERy?!#U1azelE=?-1DNw7G62ZyH9SStKGD)CbZlB0SEAMms65M?73se3Wob}eP^pln2}`bTP~_(enwU_5Po z$3P~n(;|5h!oevZi^OnRKo zDCdLE0DPc~JCZIQk-y$3r$FTje8OQgrC@T8ktY~=wML$ZNgXCNn7A?V81>c~^$LyN ze`fUg3?_M)1Tgv3+2u5S9gpJxcu8vKA@6|kUV6s{V}KeUU_1Z_4&cB+lN>;Sr& z9v{E1_~1O-xbUqR3q0F6fD(11UJJ{vTb=PJ@i+=DkP3egxTgn?w%Xj0(r0Lzog4TtBJN#RWYYU5!ONEz z-QWzsa0&1#hb|q!8Ude4olN%{PgJMo3FGAPMxN?)zFzzhXDd1)eE}*DHqFTfq{ByU z>I+rJjS;&w@EibWD2J5C1h+Z|c&n>gJ@@cvoE6HqAfc)+V3mzRG*gLInkphIOwn?a zqZ|?e6DuZrFsUfl3;6Q#C>EHWf=@eqI?F*d`9o5}&4-}jWr=r>vUhKOn6z^FmW_wz zrFyuZEZz`>(k$tg1~nH`Q}rK>{-TrZ4^#CgjqgwP@RZKKt83IP>wnVzR=3`g>TmU~ zzmCKc{#I*12>IO-&O2M`EJgEG4ba0wqv((hb&>kcI=3hCP-z{}WHC?y>K%iMN03+A zK*T64+EfgZkmbFyI&Sl{rix)bLNOYV?kq;<$Ur@-7Bc6mzgwbI35}L$@)c?dVNi}y z3`9bG*&SkQrm{+qMW(k(XYeR#0k8n)Lfpv6Q)+nfz*^{0E+}6FPUAxil5z`(=FN_R zfhf|9HCP0a55*M_eA5Cw_*bss`}6Ud^-*gCGn8t;@J^BQI+eU<2*1^(igzc5FIq5A z$?!WXe8S)B3KdA@fZ#0{PNUG7y^Rm7(2%@SL-I~h*~BXsScfo@UEp&<_i)E)d+va| z3ArdtsUnceqE53zhQEO9qxj$7!-rfZQ2t}ZEF*A%usy@yQvn6xT1Q^UWdX(!v-x}4 zAP4tJWX#Dz#|3l+qK5Anwo6;)gPMzLI!ugmyPUWSq`U{|JZQx~9QS5f-#jX>{Z|{_(m#uF8b+;cD$3CG9;jgrz6K44 zt4pnKo|9Vkid>|5ujs7+h-#pOe9S_K`Z##cjXFSQBm;Df;LKiU0COqXa11~dXn=Br zPXMS+;(vcHA6l(}iZTpP^;SSZc&)<`TFpR(WAgX5L9V=!Km{}-`#9x89Hz2aP)cvZ zFf63uJ)%v;e!nFu8C z3DQdLdC;p7qcYH-zb78M8&(QsxlnW%-|L$h?ny9*W%SMk;S<_hhcx~`Zw)P@H;UTZ zmeJdgN?_#h%8pa^$d1LxnB}|i&a-TvT~=ATIoG8`4gF27Tu3ew$B7Rix|L#t9EQ(j zzIr3~yiD;BJTac!cB~nZ`uP<|;vimORP-8T8-0OO_)clq;`FD%&Zrqnyo`EAoDkloY_TuuGc zTw;pzB?{CzudW(HXlyFsxRQ3rR5;&ai|oOJ#Wm<#*ae?j_^gJ{T6{Bn9)M31 ze45pKbtH}v&Z-3IKp{|6A-)m-=7LWxaByB`@kbvhJJJQu;;6t%=|)7{VZV{jQ(;Y_&a zrj-JehE~L5v!a<1$oo^Y((Hg<744TREmAZ~_6QV=*iqf&oR1NWp?}S)2bdfHqqz=7 zz7W*Y(->`PrJ$UZ4xzaj`i`T-_!|YkLT|ApMzjwldc1ck_hKaF8wbi$c*WIH74V8ip)z|7A6TBuE5t!_JO0nvAI+3Ql_n`_?t(X9 zQS3SxN8n>@r>H|3EZmgep_=_Id|o_K!RPt-kS%73au@E94)W5lVBK+loDSzVm3ahT z6$V;~G&}NNhsWb#Q(JrMmHt+aYgqu_Y~gZ~$s?49-}m>fUK+Z(lD>qlhCJ(=?UhTr zD%z+6<*{f(8K88t)g3`UzdHvt$Gs)pO2v-(!FKN|klhp)QUQxQUbG*<52Nm2qY`-< zk|lOyxR0$2x)=ZpgWD8B6yY?7MZs-i2rHL{gqG)lMAs`FMOA{gfykwt$fZmg^taqf zO>DmzzIzMW+PCB-QA>wLE%P)2xd?f9grYv#jc-dH-k%M>#A_X5G_zm1TTr4>G^6Mp zdBq4-bV}QK&b!z})g|<-dlu`}2v`eaD#>nEady*c^sd_m6R+u6oPF+VQ2s{wpXES>Z`aY8mxH{b~^^N<e;~TH_BY4z@0k`=K?{t(-1Z*HMOihcZ zvj`#Vrlpg*rFEIXKa-?-@)(6Kefp$R7LR|}Vhw)8(dC!OTS=;zcgYw<>?U0in-PW~ zxI#A4#M~fPdd6sC&7g_Z@yc-E6p7{^bbMmZJto(YXzmu6=w5W3gsp2ZZeFsu1rOr( z+^}7)b=YHTSP>gys~s!jFkKeCCa>4LnU%FcfhMxo8D%q-m zG~`8jG*+KQc9+7>vL0VfV)&@6URL0snp%?pPJhQ|_S|j>>z} z%O?abfUHJY2XK8(ChA4kLv8}Tz5Z?&&^^L;1;BS@0=~}?eESFR z>>NmXoHdB?O_fLaj!}E?%a&|u)M9<&FhjXCWch7A2tw0wf1>QL*Tyhg7t5maCCjl+ zQa7RYS5W&4sQLNSQ7(h+rbL1Z5*2!G)39mLAYahL$+lR3v2ry;*~TX|+4!KG|S-pcpmoi~&htdak` zY%~s(8Z>?z_1v_@y^DY`r%mIN_`B zTk`XYwJ@<)hkLPYm^|v~A?VpYt8~CtrKlhei{aVJLv`HJs$jS88+k$5BV@=4{DllT zjVU47(PN6zfu2i?@W9dZC`=*~B>4&?v$)u8K!OFF_38EqfAAF;Lsk7F3_j;e%Fe!c03|!1>AcB6>EMu+N3AYK%)*>QZk(^-ZOfP#Fbs5MA<5xlkHH_oj2XYe49v~tV(T#@#A>WmoR*R}Xjq56x1zXV!?G?cLv1iO zb~6A<>=+bM8^Q{?W+=KMHWM?Wm}!FFxmeGnd21~2;30*1t6Ug-)4oa-hFDBS5>LjS zCu0$Y>=a=r(l{TOp$%CfM(t7JN)c{LBa)P*yi47MjyPAMr^|V0zyy9^1AZV%Lve4G z)bb=um})H6=FG|j$G{q&DYZ|E!K2;<19#}Qt`Abxt^3IHU*Iln7ClL`NPG&k5}a%8 zA-6f)@#pOCz7X3(l^M}YYqZh=AATPhIi+Z329SU#FXiRtCq*O&n9`lR)C?qvqp}7U zphG_;IWCRndl|JBCCitIdJBbU@~Ed+@K>b~IKgh>1R6(fELFU_(Pnp3!o;L;V;sjy z-~=lY_PX6P29!4(ijP;`BQ{_{qeOYf1-sI#d>B6F?-|r2oIYStXoLZ&;jfHgpfuQS z&V3KW1{#&tU_aguR^HK0cI0CluZBpXskX?-<}zYip#8G1y}v<5^DrO$5;*Kif!Upk z-qtv5Z#u`R2p`jIg1Uu=Y=WAF=Xz!jWELLauzJsxw>yUH(ET22#Y`5j6+BFm2ACz* z;6I`1t`bJR}W#%X+AtTv=sRzydw$wiCnxiG6wV zH*g+xq@SdGP_8pIhudER#sX0bliKa$NbN)4jid$>Ph(EIMReb-&CeR*f4XR(WO@>G zs7nUPE7D|A0a|kFlnp#E&A44TE}>zS?(M$~l%yO3DKQV}X%05@Dhc!j%5omWMkbQS zww0atZpB`E* z?Mg*#;kT14JI{&h>eKZ>9MxTXP2GPXnpo)O%xmBF1cujs}pzZC)4R?k*nm(8VZ#FpE_m z;Vv6@91(EyHIYNaO?^$^D1h%fG~r4F)cCs(G0b3$J1x51jQ_>~dt7eyMRsT0rM_(Cif1*!N~3P?!ZDG%Yj>V8<`M_N?Fl#qtZ9%rzsAI7IBGCgASc=CGr zlf@{2<0D*;fW0+H&_5x{_2HV89pySgXiTvf$UT3Ikjq5hWPSwr+UVl6ogPJ16}G4Fj4kqkm(D<1+;JA4eL+&$@2Zp;w`=LFz(q=0+Y_>;}w;>df@ zmx~>e1$-(ijOIO?(*W_IcXSD_kn{cw158(bs7vixEWTkUt&lCYfu&QF`R2zapK!@b z=*8#TZ_Zxk`BwNhGvCmr#SQ}Q0i~qj$D%xgz<&LfPGEVY7P{5XPNu7cDZ*I6IKtQ| z^-@^(#p&nozq-uy4a32nRK?$|T24%e;qk<6?(~$|`2_spjx#?Y ze)0bxpRtz1eL2UXoQdrWM7gV=Ck>a_l|>VF<*JmfTtRyf1U}?f<8K$S9U`_rbQyLZ zu!4rSP_4t3(+6a3L+YM`NOYQi&U$Kau@|~hxR~HpuQ@(tE@uC9Y62+Tmto|cLfsFL z>oXBIYYU|F{+5RW=LyKa#0`fiCn?L(fKi!lz_8-MY(P$^z}f#4S@q~C%x+<33@C|h zfuC>N zvMGE}rMM5gcKM8t;BS4?{$lW{PzgSC98PNGIgd5+5_g$5u4^u3=equf>{@}$7UjyA zA#r8el!FfVrgsd_@t+z=tl4+6jB#h&4Jk8j4)B_ep*jAK2ier?@prc~L^Nt_9gy(S zfyt0?x$UnoYtRxdKW@@YtiTC@Vlw*@s`}+mo4K8 zrw!vtr%!w|Rf{AY7IMFddndjO{39e8+o|Q#AMYUu*3>d-C9+*3(m*FaO!=z1IJ~{;#$6T9ZW^r(JAc za3DXpruFW=#|vMh*EEYZRXRnBHqEs!*gD+WG4%6Sg_H42W<}`_iOS#S$CmfmAKMix zbS~JRACwcZe8S4Y2|b1Vn@Te)0>1n;Bl8296_b4Vtt0a%Wv(x7YwJ5WTzzP0&I`lC z;Gc4^$&#UoUwZ5xrVW(dGEg_MZ}8Zx#|CQ7?Z3X*Ue9-*FDKRLEE?EN({saHM1t;F zbmZ`&8~65Jc+r&|u664BRpFXz!onS*~oi2)?tw|hf=|CMyZ z;fA+C^yBs#c%sWPZ|~0^_Av{C(nWbW%5PF+Va!ign^Y z9eV5+fmuiMlEpV1>U#qE`pUN}RumHsb{i*04JXHCv_QX99@nj)FKb?Y`0DY`_tp48%VI zCg3->o)B9wN2iMD>oR&FSbz;6;XZ!so=fwtm*~R6-L=&(4P0N!U(sYHVtCWC2Zn!| zYfIPg_c8pxfz|gNDD3-V@%A6nVWP}MnV;-ByyN_V($<1Q1&1=vW_~j3DLM=Pk^Srd z7_0BKLeICLvrR`o=`mGpUV~ILB?#XrkJqxjas<#$g! zMf|_Nm)&{ex^(jkeq9>mm!Z8MxG2af)sFrZr9yzk7a1<>Ta@Qqz$^9F6^`)}8f%2WO(8Ylt`{fsyBH1ArnJFvJn!GcdpUmlpE5w6 zzCRY(#XEmgj0xx0b(-aMo$8nNGY8K_n@aoPB~APi9fMts=VR4}7j;a63|~C)OOI#X z>W5d8`4y&mpma{bk46jUh8!L37tUEEoEJejFTCm5H(zwcQ@p&LmMflWkJ3Swn}`DZK1>h}KDhT|l(O?jKsE!c57g!t z4hP|&pL6s)FfwuR@%|q8ot?V_wP*+(Y>*uwxV}~_@Dc2+tyo=51GBH?IBwuLw)g$# z&h0IN!9RNiBKFi95BGi&i0~7#0!tN0ZKCU#*X&+1eD(T$Z@!R||N6-MQM!rBs{Rt* zdI4@Kzo^wx=*j17-%DDtg2?ATrdEpSC;yYm(#o7(jUQd;D|`Xua1Dz8^d+}AiXyG= zExO;eGWUL$CtGX(<%Im%gj{xhn*T#s>g+Kt8ITKSa^L09AM$!mi(qPX-`dQx(sBTU z>R%HMv&euH!GK5%YF`=`gUh_4?)Wb}qw#;~5kCG+nJ2GN_YIe^YYPIyWhdx=29!O` zzYp^7z5M%O{{0aDevp6P&%f{E-+TD?-TeDb{(U?DzLkI9%)fW@?;GjgOAL3!h;4=^ z_fYIu$MEFs2&`X!ukuuR;NFX$q90arimLb4Zray3oeeFAe-PWK)6cUZbf9orGKTPE zgxB+b^fA0P^ZJ@Ka3>o}oeLHf&402yaDC12`Sk4DQJR-Ie=~J6p{-+G|M>wlK5^I2 z(0e3v{uDCBy@icEI$x;*B4E-7Fq<^|uMEO*3s1jN0*VAS^8rSJ2 zMmv=X(oaW}P+tE6DqB6ge$kFnrx-m=o{K&gEuDr``{EcqhCW3o^Zy><1UiPD;^E1Z zJj^kE?IUOu6qvZH7=g$=9JijrKJ5e(_zB!5o)oDQ9#VbB^X>D2(sk73YyU{IwSZ

ZYp?JzmPT24Z)nLF|`+dgiUn|I1ucjLiPV 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 V+=dc>ILSx)*!0B8o_1ej*BD+`sjh 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 diff --git a/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/_psyco.pyd b/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/_psyco.pyd deleted file mode 100644 index 6acad6c192615c9e9f6799018d311cac864c94dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278016 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 diff --git a/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/classes.pyo b/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/classes.pyo deleted file mode 100644 index 24ae574b9f85af81ca280d06f16ff8f0cbc5ecea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1684 zcmbtUO^+Kz5Un2DWA9{_T?Gjgp_TfAY!GV+4jfQ~5)zQ2peS-8A&gg}*_pQ8@yzt> zbUTTW&1Lx|ocKHZ6>gm1Rktw^ae~oyZGTj~s(MxBUw%DFe!BPgaZdZMkN@|utc56u zrjUY)h>8v^IyA+;OGS@X5tTT0NbotPRhOpN;IB`s9+fdoW4uMAIy8sTfPN&pA^LXO zC)M|uN3_HhKn8p>Jz|(=qlBIRCWxNeO>SgfX4Xo(ZW_}%S(##8s&SGG8-5-8S7paI znX4B=sjbXvnUzkpb>@`x7#F5-y3*gPLbk>@IX7*9g<*2P-t2wodZ}9NbiI)C)>KkE z3B|SL3%69VQZ5V84Ab;*NYkOL^kV6fg@VDslWkP4=Q_{Ia^pSvP{#6+;~>@bTEEOn zRXgdBBb1Vm(3P%>(FfAh-equy%vA1VHb+*7%F4V|nbW2Q505J5g+o*?Rl9M^L-+x2 zPmt7LWzU{`rOQ%kZ^&MfH`A%JN_`})0gvUMM9D(UbqxkX6j_qU@Oi4<@D-pxOcL)Y zTRT%B-ay6LDxaFC<8PHY5IRm=j1~YS@^;5zdw6vxxcCSC`geRI^b5IL5V@(EEO&0x zs3+l;A--DIIWzVg*N0YTn=i2JyATSkjy8ovs|#*c^!DW0C}M^C5dRkNg{OBcpRd~* zod>!Q=+YDxe50=3L^iE?t z=T#z}orjl0nnkpWY1b#$p)F*WZXzMYHz3y| z9W&r|KzHCV?CxGK=^F>I0c|mn5$Pk|Z1Enk%1sw@$wWMHr;uri;^ZbxxmnZHPb{J# z!UP~5sF_;96OneRvW_QOV~niJ>Re4&!>i?{4QkBL#v5SHRXg#;RrO9b@<4v)NP3 zkf}fUboRBrnpq@pfp%JD3uR|M>)C#y#?5BJy(qEl83c(_aU#yeNc1Td?}?GmlLJB) z2sceV5$Ik28-`=ZurPU=dZ@pG`OgtCbLUu=oyQ`M0wz~ratC7X6P*hGJZ7Pk6RzHb vwLGajJl5CAmtul@nsEL9e}uk5cLN2VzYR$H7DU`R?VO2YaTdLEd|UhhcnGd* diff --git a/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/clibrary.pyo b/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/clibrary.pyo deleted file mode 100644 index 593d23c0b6beef42f6fc04adb3a94b5dc823842a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmbVJO-sW-5Pg%R))opqc<>^4GZz(l5EPL@#Y?4>RuD?0q?@(I#%!A1Km+xpKgB=f zU-1vh}_yFBzcL&Ql~01072Aj=&r93(C#9!PqS zgviA^@J2Q#HAEi9zLkl;Ieg-ku{6uos@%{6rn#KQ+Q@t=9*b0%Sf!n;$YoZVCzT3^ zZ@Amh<5?dutPZgTt{?XC>R`=Dcy^#_AOnnPS;xI0E^bQ>d@Er*hP%9wm4llw(bBiF z#)6hhV=t*$MZ>i8nV|xG%B$W*Fs$r!&Vt)`7U<17@5a4vO_=~AdbB=IZ{^YVm^ z@9~?VF2{0N$W+K_Po*Y|Q{CWw-DH4U#}2iqK?8q>>83AMXJk)}-J4drqpEGY%zyhd dsx$dB_jwviChIZ<^@U9>U*C){hjZe?!Wwf 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 JfUTLe_$ON^eCq%J diff --git a/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/logger.pyo b/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/logger.pyo deleted file mode 100644 index 869f0054b6878137b7254792d9eab2b89150b02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2780 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 Shf=jXHe^5OQCZ|iz5feI>EVz7 diff --git a/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/support.pyo b/Calibre_Plugins/eReaderPDB2PML_plugin/windows/psyco/support.pyo deleted file mode 100644 index d276bd5a3569293d9c1f8a8526e6d188973b11d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6591 zcmcgwOK%*<5w4kCK6d#K^`cCPvPX_&t!;_1Wk*09BbLn2uwsT1W(C<^%NPuIdUuCf z&a7r;MH8?QATk2vnp~1wU?8^~l7A2&$DDG{e@Ku&;Cx^8a7YnKf`~#$PP4oERaIT} zbyffMpL5M`ZhZ7nSIVCm{J()O|FbI+iF8mp61nogkq#=h?n=kqtJkDc6XQx;mrh+G z)F-5eVRiXhHs5WC7P4#(Y!>*@NYq)~}9mZT5jtn@|dojEbH@}ti$NM~LQ{v3&q$(AGO4A?;DyqtLWcX9B2HfLun z9GU_7k5@C$$r%?M2j6E4D%~4cNteY=(OFsA5=rMlgDTF+V~G3kr;fIkwWSI;K?OzU z<*_Si3uA5jMQy)e*E=co=q1(TDOq%H{h0G2PolRZx=YJa8D1If`kZ_WU(UTIoi4f2D*msMei=on7?GhP zU%@E8bmU8L27AKk)uBGefqS=G6BxUpqPDnBQAa^>mF>I$6GQXJ3}bH4s&NE`D;1La zq$opHa5lH|zLNJPeHJ0P(kXm784_o~iT?p9^J{24GFcv{iMJi++hNfic$=o!F(&cs z5s$*G$gg;ri4*WY9C~pPzkq4+0*h~1P=tb#hr`hzjDO1}_rXG8{0FugD7s-1#Zg$8 z_)jEpd@qK1kP`v~3UOUG7OAnQvzTBp$pWljL1B5y%)@b~R}Z;$f=O7O-bavO2I%yiT3Q9Lw}9^}pS^ z#T@pyx8}cpyS)~yuiaZ)&tCyWjqDvS8z(e$c!C$1&2hia229s@(D$WWb?`w3yY6C+ z{`?nL@Y(OH@o@OjY=W$Rh_5vKf|r%m$iLx<2VmV3w*EEzRBtU--~_Hx^vWV-f-YRg zgf6+|$HpqY{2U564-PeUWB^Cfi|{&8JE9M9@J2C-GU!n`2SFf;y9Gdio%VQaC)du+ zuxG7GCxPT9GkT)!!1BvZKR3O!!RUSTssZAPt?#$084~LktqoJCrITy zl5{h8_jp(w$-vd1gP`0f2-;XbUqm6!oKtg_oq4CJ-*L1j+%7f7k9_FSo~mTO3SS@s*in<{PSFaNcV{9c^=Y~8wEkgUFj-fjgnPzubdO=4{{Ex zu)cMO?Z^Nri_Egk74#&O?dQR4xqJ{rSh{4kMbFvCF`umZFR^%;#YGhRTWjrE?z?#` zvyM+gib=OI(U@=4)KK*X`QYiG`yc0NfSYgh#paiIl^e3KGSDf0DfXH7eg+fD@g zP$F^hL)$x{y(evNgTS=a(Afz0$s-UJOCvJ^G?bYUk_I-WDZ?UCr4n6d*;aIIQRf>z z!Aqg97YyUXAckNd3OpUh!-ApFESf>p#2rOKF941e87?hE4%12)rd^y}&Ra#R-lH&! z!_6TAleFjc#!0t8G?p`V@HTf#WbTFuqZR}uVYh4Y98n2kiZI#rcEa5&UY=&zuEs}Z zd(7D9NksPs;Uj~v$GdzfzwFWBMfvlc?b#p7cur|MoFM}h%YBt?Bn<`Aov14BKb*tbG1pB z>zq?zI$o*Zw`- zc|mgBE#KK+DP#6w6G78Gq4vL#*#i%pd^-QGs}Rl%UeT?PbuES8+7 zS&W2@uN#Ntj{6Dvz{df=fD(p93gu7~#@9ufDM~j-d~i^`k?m4wO+mA;fhh)da3~&IKd~*E^peSI;>sjE9C+8xMZ9iJUyN-F2z&s_I7?Kn~0o<*c&z+UF|b9bJ^t4Z@sIrAo<*2>G-g z@*V&7>RP*f+xIn!-wA4Q9|+58@hAE3}jDq3j;K)OU0?gXmJf=NSVHTz^6(#A=k z5CwU8k`MR{hMbx;{auQeuT=Vqs7ry5QJ)Puhb K=a{>I1m|D%!;-ZC diff --git a/Calibre_Plugins/ignobleepub_plugin.zip b/Calibre_Plugins/ignobleepub_plugin.zip index fc1bd10791e80f870ab2a88e45c411341fe00922..369835303239c589095408a586584ad9413de8ab 100644 GIT binary patch delta 5225 zcmZvgXD}QNx5iiWUKY^_t3>ZLh_>ny-9~h)M~k-F3c?~n5TYlmuNs8tHEPt2_ScEt zW3^~E?|VPodGEb*X3m*2bLKhEr*me0ZL2t&;tbDpaq(yY000pn$v;m~@G-p+Kk#oW zpITzVfnZx@fh-=fK>UM90XTSPH~_%EXTMv%d^Inda#v;Z8X~OAUob9mQrz%jz0%i% zdoO$TM0RxXz|lxBKHBl!VquF@Dxrr|IOVL*)fvQEoCpKo%B2{x|K1GEe(g`k_2)MhG5P zZu*_v9~!1eiIa7AviuPg{_zh|NQhyvEqOhfe<+nt!1uAqi{f$}96EwUbz)rMy-RS! zDXreU*$?F6w*eLKhfUH*i%C#=s}@71nB0s^nK&ihVY>K`K%~Co3#AJF6KVce<5*1} z70!po121r3CUHdH%wUFt-%^N0D-oDoFbnT@yltyS!<dW74aAVmQ1bsWV}i9e9UMY-N@RHQAM4`olG-m{`8&3fl_XR zcz=#N63oc4c@y5X^FO$AEQsE+CvEaF*iIQwVw%gmT!v^WG0G6Ictr&B{o7I7#~DRA z!znq>+WsUEM5}aD5A>A?0<$tTYTv-P&8hJy1Du~xI<~$5$F6yS21&`X_YXRhyzedS zoIM_}k#&;rO-xS2vvl(`^M0^=B7052!cZ(c3uh|Qfp0KdV=A-1Zh~<gMn)j zMnPCO5-9Cx{xWfhubWrumn4NB+FL_6z?@D?NfQ5yO*K6%O;(I?G&0Cq<=4P_y7v;i zc25}xeg+zmLh5Eg{V~^Ys9@#Xk^8%2`8c#zzs`@{$o(BzWp^$c6I0(NG&WlLv&Q}g z&J|xaXM`n!Y@juun>cLMHu8bGJ2?~lVofnV;3NoCA{MYxWIWV zFHt`>A!;47v+9~fvT!3uLAD@dt?Y*#y&-YEnNFf)}c-F-3@iYs7 z9L>`8Fy-3eR~aTo@3T+)FDDirMQ|C6?9X@|Dr$42o(n9z-w{m`qV6ax54@D8?#Qu< z$*)2vTSE-aZg;SYvFm#~WvrBs@oM>t$ch<(p@|{XkGm+PJcB~;d2y-f!*b|I-ia{@ z)!Gx($>xRodR}N2obH_Y1o?z2-Qwkid1VU2&T3MY@IDh&TjyG}&Od%kEikFJ%UBXUj-0j;`SBpu0WS4Ek1%~{Gou6g>h^N^Q_IpBpH}O`w@=z z*xG5Y_g!{2HMKO)iJYb0=swXHKQN~1G!)k*D56I-s(+TT*OCR1iCWmb0W?AhYUXQ= z9J||NQG*hK6H~{;rr(gElrrMML2Z;))SrH&-Q?N*`ND{&`dmwWla!WUC`DX{T1)<) zljp~+0QXWJVAODK3g}3NvM(YD>|m!?nrNEe+EzLe`l!hun&kC zlIWAT`$sf(M?pQyc|F}!d_7Q!KG=~PNRbTuHH*)js3uzJ5#jQPdK_K*p%B3)e%Ogm zz`8PGb@5dr>EgU$swTS7H^w~v-&E!|sgzIFbx5w*odD2kD*X3IoNKth~3!4gHM0SZ%kTju>Qn1;_2=DheaSx8qS zh%W0%)NBSllvbGlzCID#C`6!&>~Q?0*@XNq5zP3|a+ZP*^?I4`9yjzX(fT8K+r0AZ z-J#SpAeMQ70-w%XtE*PMtNVk1xy@40E5U5{tuNBFiY@JpuRkfYwn|h7n>lie?I7`2 zSH^&1AdZzQ!~Jk}%Og%&+&E87??;-EkE{oSS*0w)m}=k3muVgBq#%M>G^1Pxcz5CI zN%r>hi1WSM!$S$tDa<52wOsm`EU)AjdMX1k*A2xkGT;{lP;o)Q(Fb5$@3DT-anAQ? z0I{&QOl2AW8qQ`IuPKN_Hz7gy{3fMZAQ+jI`?yE(X7-;sO*53xrJCY%p)z-B#b z2m|nX0-ok$m+X`p3`k+-C%B+sDMZ^NkO`V7!hM>s{r}2$!T%!aE z%D)$~F4X$6c$Mbk5m*4%ZjF0dUi9yO_L}kA`uM2+@H;*lQf4x6KrK#2J}os(LHlh& zvS_nzg)F(^1C{K|O?iwX6x);W$=4n*!gTUvXA%*9>cVd*Ei}%$kiWdP{-uFR9yO?8oiPtt&FDOF5zXZ@nDP z5a0;-^6%zXr_x;$4LX~{OW8fuYRA}SqSzSFK?R< zlW>8gR|b)56;wTLNN1X5d)qyVAF@g?C2d!4y$~dN-=D2myttoT)nG7B+@3oo;Ow0s zW?JZ~! zU!ERvB=GZX)P9q2Z8v^Gyo6g^SskE^Nu%I=3_9`@D&TK-l^%t<(j7#uE@uT)VwdO- zKEqmpas^?z!E}B*&eY`JjZ;Kl*8GY3y)V@C&GO!Fb_Q}AzEV=2*e-o6UU4La5XJ(9 zIC$H#3?=k&A=*w_g*DpQEb^Y7%)grR;LUcJ`MxZL^`!IpV%>n0=?FcUbIpaWxRF7I z`OU2WalCka`ojj&X=2R@$*NFh5`f>YLuQD}e62+faG8arEkS%rmv#Pjsuy2&KN!q7 zVHwhVr2IV3&7ly(i(0!sL7E3jGfs8ys0jDOHT1Lh+36w+UK{3R{5DW0&WL+ z^6~kYqE|kxapjSoH>|Dt;r-Bh^Ti&QEN_!BkU(a1fR`R)cSjI3Yv!Wf8OnDzUXqaJ zEDp6=w9R|;IJbCW*94p?cm_K6SmY_~P@oP0+L>+WnqY>58JQAe0&-$PB&Z1q9Ug7Z zPWyhhk_u~nwq4mko70al)Q7q{y#$DwNP}VE{(Ul~A}&Q@g`dn)ifFzh6m2Z{NuAuY zU!TR$O8frM;RbsCy@j%*nIb+ur__<-Eo4$Jjwr-piy#@y zR$NG=zJX#G7J+VT9^G;pG`2N_l(T&unjAU`U+0`lYiC*M*bgu2IGl9-gyWp#=lO^L zvrE!9IiXVerZ3I#u8VKEJ5dI3qNz#ddjDbOI4v~)R_FI!k~1(^%dI^tj|GwCNnzHi zW~T3%)vWGAh*4t@f~M!GEg~fZo`JunwTodoeU zlr8CZNq?HNFmRdP+_bsvc9B+I)x&xrtvFGav_Bndz{DR#OhYg-q1fE8n!U(3S#P}K zdvo80s9;k(Ko`_*ZuV~Uk-txC&LVn>+{S4sP<=!fP&iIWL~sEq^kYebhj_?+w#_`o zNnuV|xEB+4!@;@(yBm2X6l&+oaK zx(-`wa38%%7V>!$yUV*O-cnsma7yn#x7Tz<4E}1^_}fP%51Eee*i5=qsd?SRUdT32 zO|{Nzb**79_Q!1>OH}U_*o{mlT+5gmNw#6%!;~IEO{#v%aSS8FyC${k@VcT9 zf`>++d!J!h#_WTc5(vBX+3i*Ig}(-&f>aBih>V)(C-(Do=toCw*(Q58-8x+sskg zU~rdw4*nK5`N{PN^?CLt9@q5Ed;%zyw~b&6%IwagvF-G!l(v}E*gP)NCRWPh5r zL(p*I=&xCuf3WsnP5i+p?z+xKq)Fl0m{j|uzQ;hvf9Bo?UH6k-&$HJ|L+JISVT$to z3nl$GG;x;Pmn-W72jB;mtYZ~Mm#VB?c}JwawkuGjXj2P zx$1_mqmiP~S7O8zEMp86@&7!XPRUjzT1+?)DQP!|?4!z0UW~cP<1mOFRX|1xF!wTv zo7^R4?!K3MiUKa~474@;mVzVJnhP;yEdR`73}53`%Ph9EeUP`IFJ-IjYFr7}-R#2b zT)#3a(v1$&3R@BclRx&{T}rRYR#NB1ypa*N%xvgI=|dDwYhocme*!J{RsWc~zvNMt zgX{BBj2M*4CqZ9qURXMKVLSeZ!P%uaDpm%I^6laQ0Pd8jmM*k(W?~q<)s_Fn;Oe4X ze&g}}f7}iLpaU@c1$Y3!Us?w!eEm12R+un^-~({~Mf3g_$$O@Y^MDQazjgj|HvmBV qA3E^AR4~}p+sQRZ*c)zY@>lL(#{Q2SKEc0MKlmHyzqR<^PW}t9F4#2y literal 28861 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 z

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

xR9h6SPc$p{yVa-x9PT$p^P+ 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 0x80: + datax = (data & 0x7F) + while data >= 0x80 : + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + datax = (datax <<7) + (data & 0x7F) + data = datax + + if flag: + data = -data + return data + + +# returns a binary string that encodes a number into 7 bits +# most significant byte first which has the high bit set + +def encodeNumber(number): + result = "" + negative = False + flag = 0 + + if number < 0 : + number = -number + 1 + negative = True + + while True: + byte = number & 0x7F + number = number >> 7 + byte += flag + result += chr(byte) + flag = 0x80 + if number == 0 : + if (byte == 0xFF and negative == False) : + result += chr(0x80) + break + + if negative: + result += chr(0xFF) + + return result[::-1] + + + +# create / read a length prefixed string from the file + +def lengthPrefixString(data): + return encodeNumber(len(data))+data + +def readString(file): + stringLength = readEncodedNumber(file) + if (stringLength == None): + return "" + sv = file.read(stringLength) + if (len(sv) != stringLength): + return "" + return unpack(str(stringLength)+"s",sv)[0] + + +# convert a binary string generated by encodeNumber (7 bit encoded number) +# to the value you would find inside the page*.dat files to be processed + +def convert(i): + result = '' + val = encodeNumber(i) + for j in xrange(len(val)): + c = ord(val[j:j+1]) + result += '%02x' % c + return result + + + +# the complete string table used to store all book text content +# as well as the xml tokens and values that make sense out of it + +class Dictionary(object): + def __init__(self, dictFile): + self.filename = dictFile + self.size = 0 + self.fo = file(dictFile,'rb') + self.stable = [] + self.size = readEncodedNumber(self.fo) + for i in xrange(self.size): + self.stable.append(self.escapestr(readString(self.fo))) + self.pos = 0 + + def escapestr(self, str): + str = str.replace('&','&') + str = str.replace('<','<') + str = str.replace('>','>') + str = str.replace('=','=') + return str + + def lookup(self,val): + if ((val >= 0) and (val < self.size)) : + self.pos = val + return self.stable[self.pos] + else: + print "Error - %d outside of string table limits" % val + sys.exit(-1) + + def getSize(self): + return self.size + + def getPos(self): + return self.pos + + def dumpDict(self): + for i in xrange(self.size): + print "%d %s %s" % (i, convert(i), self.stable[i]) + return + +# parses the xml snippets that are represented by each page*.dat file. +# also parses the other0.dat file - the main stylesheet +# and information used to inject the xml snippets into page*.dat files + +class PageParser(object): + def __init__(self, filename, dict, debug, flat_xml): + self.fo = file(filename,'rb') + self.id = os.path.basename(filename).replace('.dat','') + self.dict = dict + self.debug = debug + self.flat_xml = flat_xml + self.tagpath = [] + self.doc = [] + self.snippetList = [] + + + # hash table used to enable the decoding process + # This has all been developed by trial and error so it may still have omissions or + # contain errors + # Format: + # tag : (number of arguments, argument type, subtags present, special case of subtags presents when escaped) + + token_tags = { + 'x' : (1, 'scalar_number', 0, 0), + 'y' : (1, 'scalar_number', 0, 0), + 'h' : (1, 'scalar_number', 0, 0), + 'w' : (1, 'scalar_number', 0, 0), + 'firstWord' : (1, 'scalar_number', 0, 0), + 'lastWord' : (1, 'scalar_number', 0, 0), + 'rootID' : (1, 'scalar_number', 0, 0), + 'stemID' : (1, 'scalar_number', 0, 0), + 'type' : (1, 'scalar_text', 0, 0), + + 'info' : (0, 'number', 1, 0), + + 'info.word' : (0, 'number', 1, 1), + 'info.word.ocrText' : (1, 'text', 0, 0), + 'info.word.firstGlyph' : (1, 'raw', 0, 0), + 'info.word.lastGlyph' : (1, 'raw', 0, 0), + 'info.word.bl' : (1, 'raw', 0, 0), + 'info.word.link_id' : (1, 'number', 0, 0), + + 'glyph' : (0, 'number', 1, 1), + 'glyph.x' : (1, 'number', 0, 0), + 'glyph.y' : (1, 'number', 0, 0), + 'glyph.glyphID' : (1, 'number', 0, 0), + + 'dehyphen' : (0, 'number', 1, 1), + 'dehyphen.rootID' : (1, 'number', 0, 0), + 'dehyphen.stemID' : (1, 'number', 0, 0), + 'dehyphen.stemPage' : (1, 'number', 0, 0), + 'dehyphen.sh' : (1, 'number', 0, 0), + + 'links' : (0, 'number', 1, 1), + 'links.page' : (1, 'number', 0, 0), + 'links.rel' : (1, 'number', 0, 0), + 'links.row' : (1, 'number', 0, 0), + 'links.title' : (1, 'text', 0, 0), + 'links.href' : (1, 'text', 0, 0), + 'links.type' : (1, 'text', 0, 0), + + 'paraCont' : (0, 'number', 1, 1), + 'paraCont.rootID' : (1, 'number', 0, 0), + 'paraCont.stemID' : (1, 'number', 0, 0), + 'paraCont.stemPage' : (1, 'number', 0, 0), + + 'paraStems' : (0, 'number', 1, 1), + 'paraStems.stemID' : (1, 'number', 0, 0), + + 'wordStems' : (0, 'number', 1, 1), + 'wordStems.stemID' : (1, 'number', 0, 0), + + 'empty' : (1, 'snippets', 1, 0), + + 'page' : (1, 'snippets', 1, 0), + 'page.pageid' : (1, 'scalar_text', 0, 0), + 'page.pagelabel' : (1, 'scalar_text', 0, 0), + 'page.type' : (1, 'scalar_text', 0, 0), + 'page.h' : (1, 'scalar_number', 0, 0), + 'page.w' : (1, 'scalar_number', 0, 0), + 'page.startID' : (1, 'scalar_number', 0, 0), + + 'group' : (1, 'snippets', 1, 0), + 'group.type' : (1, 'scalar_text', 0, 0), + + 'region' : (1, 'snippets', 1, 0), + 'region.type' : (1, 'scalar_text', 0, 0), + 'region.x' : (1, 'scalar_number', 0, 0), + 'region.y' : (1, 'scalar_number', 0, 0), + 'region.h' : (1, 'scalar_number', 0, 0), + 'region.w' : (1, 'scalar_number', 0, 0), + + 'empty_text_region' : (1, 'snippets', 1, 0), + + 'img' : (1, 'snippets', 1, 0), + 'img.x' : (1, 'scalar_number', 0, 0), + 'img.y' : (1, 'scalar_number', 0, 0), + 'img.h' : (1, 'scalar_number', 0, 0), + 'img.w' : (1, 'scalar_number', 0, 0), + 'img.src' : (1, 'scalar_number', 0, 0), + 'img.color_src' : (1, 'scalar_number', 0, 0), + + 'paragraph' : (1, 'snippets', 1, 0), + 'paragraph.class' : (1, 'scalar_text', 0, 0), + 'paragraph.firstWord' : (1, 'scalar_number', 0, 0), + 'paragraph.lastWord' : (1, 'scalar_number', 0, 0), + + 'word_semantic' : (1, 'snippets', 1, 1), + 'word_semantic.type' : (1, 'scalar_text', 0, 0), + 'word_semantic.firstWord' : (1, 'scalar_number', 0, 0), + 'word_semantic.lastWord' : (1, 'scalar_number', 0, 0), + + 'word' : (1, 'snippets', 1, 0), + 'word.type' : (1, 'scalar_text', 0, 0), + 'word.class' : (1, 'scalar_text', 0, 0), + 'word.firstGlyph' : (1, 'scalar_number', 0, 0), + 'word.lastGlyph' : (1, 'scalar_number', 0, 0), + + '_span' : (1, 'snippets', 1, 0), + '_span.firstWord' : (1, 'scalar_number', 0, 0), + '-span.lastWord' : (1, 'scalar_number', 0, 0), + + 'span' : (1, 'snippets', 1, 0), + 'span.firstWord' : (1, 'scalar_number', 0, 0), + 'span.lastWord' : (1, 'scalar_number', 0, 0), + + 'extratokens' : (1, 'snippets', 1, 0), + 'extratokens.type' : (1, 'scalar_text', 0, 0), + 'extratokens.firstGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens.lastGlyph' : (1, 'scalar_number', 0, 0), + + 'glyph.h' : (1, 'number', 0, 0), + 'glyph.w' : (1, 'number', 0, 0), + 'glyph.use' : (1, 'number', 0, 0), + 'glyph.vtx' : (1, 'number', 0, 1), + 'glyph.len' : (1, 'number', 0, 1), + 'glyph.dpi' : (1, 'number', 0, 0), + 'vtx' : (0, 'number', 1, 1), + 'vtx.x' : (1, 'number', 0, 0), + 'vtx.y' : (1, 'number', 0, 0), + 'len' : (0, 'number', 1, 1), + 'len.n' : (1, 'number', 0, 0), + + 'book' : (1, 'snippets', 1, 0), + 'version' : (1, 'snippets', 1, 0), + 'version.FlowEdit_1_id' : (1, 'scalar_text', 0, 0), + 'version.FlowEdit_1_version' : (1, 'scalar_text', 0, 0), + 'version.Schema_id' : (1, 'scalar_text', 0, 0), + 'version.Schema_version' : (1, 'scalar_text', 0, 0), + 'version.Topaz_version' : (1, 'scalar_text', 0, 0), + 'version.WordDetailEdit_1_id' : (1, 'scalar_text', 0, 0), + 'version.WordDetailEdit_1_version' : (1, 'scalar_text', 0, 0), + 'version.ZoneEdit_1_id' : (1, 'scalar_text', 0, 0), + 'version.ZoneEdit_1_version' : (1, 'scalar_text', 0, 0), + 'version.chapterheaders' : (1, 'scalar_text', 0, 0), + 'version.creation_date' : (1, 'scalar_text', 0, 0), + 'version.header_footer' : (1, 'scalar_text', 0, 0), + 'version.init_from_ocr' : (1, 'scalar_text', 0, 0), + 'version.letter_insertion' : (1, 'scalar_text', 0, 0), + 'version.xmlinj_convert' : (1, 'scalar_text', 0, 0), + 'version.xmlinj_reflow' : (1, 'scalar_text', 0, 0), + 'version.xmlinj_transform' : (1, 'scalar_text', 0, 0), + 'version.findlists' : (1, 'scalar_text', 0, 0), + 'version.page_num' : (1, 'scalar_text', 0, 0), + 'version.page_type' : (1, 'scalar_text', 0, 0), + 'version.bad_text' : (1, 'scalar_text', 0, 0), + 'version.glyph_mismatch' : (1, 'scalar_text', 0, 0), + 'version.margins' : (1, 'scalar_text', 0, 0), + 'version.staggered_lines' : (1, 'scalar_text', 0, 0), + 'version.paragraph_continuation' : (1, 'scalar_text', 0, 0), + 'version.toc' : (1, 'scalar_text', 0, 0), + + 'stylesheet' : (1, 'snippets', 1, 0), + 'style' : (1, 'snippets', 1, 0), + 'style._tag' : (1, 'scalar_text', 0, 0), + 'style.type' : (1, 'scalar_text', 0, 0), + 'style._parent_type' : (1, 'scalar_text', 0, 0), + 'style.class' : (1, 'scalar_text', 0, 0), + 'style._after_class' : (1, 'scalar_text', 0, 0), + 'rule' : (1, 'snippets', 1, 0), + 'rule.attr' : (1, 'scalar_text', 0, 0), + 'rule.value' : (1, 'scalar_text', 0, 0), + + 'original' : (0, 'number', 1, 1), + 'original.pnum' : (1, 'number', 0, 0), + 'original.pid' : (1, 'text', 0, 0), + 'pages' : (0, 'number', 1, 1), + 'pages.ref' : (1, 'number', 0, 0), + 'pages.id' : (1, 'number', 0, 0), + 'startID' : (0, 'number', 1, 1), + 'startID.page' : (1, 'number', 0, 0), + 'startID.id' : (1, 'number', 0, 0), + + } + + + # full tag path record keeping routines + def tag_push(self, token): + self.tagpath.append(token) + def tag_pop(self): + if len(self.tagpath) > 0 : + self.tagpath.pop() + def tagpath_len(self): + return len(self.tagpath) + def get_tagpath(self, i): + cnt = len(self.tagpath) + if i < cnt : result = self.tagpath[i] + for j in xrange(i+1, cnt) : + result += '.' + self.tagpath[j] + return result + + + # list of absolute command byte values values that indicate + # various types of loop meachanisms typically used to generate vectors + + cmd_list = (0x76, 0x76) + + # peek at and return 1 byte that is ahead by i bytes + def peek(self, aheadi): + c = self.fo.read(aheadi) + if (len(c) == 0): + return None + self.fo.seek(-aheadi,1) + c = c[-1:] + return ord(c) + + + # get the next value from the file being processed + def getNext(self): + nbyte = self.peek(1); + if (nbyte == None): + return None + val = readEncodedNumber(self.fo) + return val + + + # format an arg by argtype + def formatArg(self, arg, argtype): + if (argtype == 'text') or (argtype == 'scalar_text') : + result = self.dict.lookup(arg) + elif (argtype == 'raw') or (argtype == 'number') or (argtype == 'scalar_number') : + result = arg + elif (argtype == 'snippets') : + result = arg + else : + print "Error Unknown argtype %s" % argtype + sys.exit(-2) + return result + + + # process the next tag token, recursively handling subtags, + # arguments, and commands + def procToken(self, token): + + known_token = False + self.tag_push(token) + + if self.debug : print 'Processing: ', self.get_tagpath(0) + cnt = self.tagpath_len() + for j in xrange(cnt): + tkn = self.get_tagpath(j) + if tkn in self.token_tags : + num_args = self.token_tags[tkn][0] + argtype = self.token_tags[tkn][1] + subtags = self.token_tags[tkn][2] + splcase = self.token_tags[tkn][3] + ntags = -1 + known_token = True + break + + if known_token : + + # handle subtags if present + subtagres = [] + if (splcase == 1): + # this type of tag uses of escape marker 0x74 indicate subtag count + if self.peek(1) == 0x74: + skip = readEncodedNumber(self.fo) + subtags = 1 + num_args = 0 + + if (subtags == 1): + ntags = readEncodedNumber(self.fo) + if self.debug : print 'subtags: ' + token + ' has ' + str(ntags) + for j in xrange(ntags): + val = readEncodedNumber(self.fo) + subtagres.append(self.procToken(self.dict.lookup(val))) + + # arguments can be scalars or vectors of text or numbers + argres = [] + if num_args > 0 : + firstarg = self.peek(1) + if (firstarg in self.cmd_list) and (argtype != 'scalar_number') and (argtype != 'scalar_text'): + # single argument is a variable length vector of data + arg = readEncodedNumber(self.fo) + argres = self.decodeCMD(arg,argtype) + else : + # num_arg scalar arguments + for i in xrange(num_args): + argres.append(self.formatArg(readEncodedNumber(self.fo), argtype)) + + # build the return tag + result = [] + tkn = self.get_tagpath(0) + result.append(tkn) + result.append(subtagres) + result.append(argtype) + result.append(argres) + self.tag_pop() + return result + + # all tokens that need to be processed should be in the hash + # table if it may indicate a problem, either new token + # or an out of sync condition + else: + result = [] + if (self.debug): + print 'Unknown Token:', token + self.tag_pop() + return result + + + # special loop used to process code snippets + # it is NEVER used to format arguments. + # builds the snippetList + def doLoop72(self, argtype): + cnt = readEncodedNumber(self.fo) + if self.debug : + result = 'Set of '+ str(cnt) + ' xml snippets. The overall structure \n' + result += 'of the document is indicated by snippet number sets at the\n' + result += 'end of each snippet. \n' + print result + for i in xrange(cnt): + if self.debug: print 'Snippet:',str(i) + snippet = [] + snippet.append(i) + val = readEncodedNumber(self.fo) + snippet.append(self.procToken(self.dict.lookup(val))) + self.snippetList.append(snippet) + return + + + + # general loop code gracisouly submitted by "skindle" - thank you! + def doLoop76Mode(self, argtype, cnt, mode): + result = [] + adj = 0 + if mode & 1: + adj = readEncodedNumber(self.fo) + mode = mode >> 1 + x = [] + for i in xrange(cnt): + x.append(readEncodedNumber(self.fo) - adj) + for i in xrange(mode): + for j in xrange(1, cnt): + x[j] = x[j] + x[j - 1] + for i in xrange(cnt): + result.append(self.formatArg(x[i],argtype)) + return result + + + # dispatches loop commands bytes with various modes + # The 0x76 style loops are used to build vectors + + # This was all derived by trial and error and + # new loop types may exist that are not handled here + # since they did not appear in the test cases + + def decodeCMD(self, cmd, argtype): + if (cmd == 0x76): + + # loop with cnt, and mode to control loop styles + cnt = readEncodedNumber(self.fo) + mode = readEncodedNumber(self.fo) + + if self.debug : print 'Loop for', cnt, 'with mode', mode, ': ' + return self.doLoop76Mode(argtype, cnt, mode) + + if self.dbug: print "Unknown command", cmd + result = [] + return result + + + + # add full tag path to injected snippets + def updateName(self, tag, prefix): + name = tag[0] + subtagList = tag[1] + argtype = tag[2] + argList = tag[3] + nname = prefix + '.' + name + nsubtaglist = [] + for j in subtagList: + nsubtaglist.append(self.updateName(j,prefix)) + ntag = [] + ntag.append(nname) + ntag.append(nsubtaglist) + ntag.append(argtype) + ntag.append(argList) + return ntag + + + + # perform depth first injection of specified snippets into this one + def injectSnippets(self, snippet): + snipno, tag = snippet + name = tag[0] + subtagList = tag[1] + argtype = tag[2] + argList = tag[3] + nsubtagList = [] + if len(argList) > 0 : + for j in argList: + asnip = self.snippetList[j] + aso, atag = self.injectSnippets(asnip) + atag = self.updateName(atag, name) + nsubtagList.append(atag) + argtype='number' + argList=[] + if len(nsubtagList) > 0 : + subtagList.extend(nsubtagList) + tag = [] + tag.append(name) + tag.append(subtagList) + tag.append(argtype) + tag.append(argList) + snippet = [] + snippet.append(snipno) + snippet.append(tag) + return snippet + + + + # format the tag for output + def formatTag(self, node): + name = node[0] + subtagList = node[1] + argtype = node[2] + argList = node[3] + fullpathname = name.split('.') + nodename = fullpathname.pop() + ilvl = len(fullpathname) + indent = ' ' * (3 * ilvl) + result = indent + '<' + nodename + '>' + if len(argList) > 0: + argres = '' + for j in argList: + if (argtype == 'text') or (argtype == 'scalar_text') : + argres += j + '|' + else : + argres += str(j) + ',' + argres = argres[0:-1] + if argtype == 'snippets' : + result += 'snippets:' + argres + else : + result += argres + if len(subtagList) > 0 : + result += '\n' + for j in subtagList: + if len(j) > 0 : + result += self.formatTag(j) + result += indent + '\n' + else: + result += '\n' + return result + + + # flatten tag + def flattenTag(self, node): + name = node[0] + subtagList = node[1] + argtype = node[2] + argList = node[3] + result = name + if (len(argList) > 0): + argres = '' + for j in argList: + if (argtype == 'text') or (argtype == 'scalar_text') : + argres += j + '|' + else : + argres += str(j) + '|' + argres = argres[0:-1] + if argtype == 'snippets' : + result += '.snippets=' + argres + else : + result += '=' + argres + result += '\n' + for j in subtagList: + if len(j) > 0 : + result += self.flattenTag(j) + return result + + + # reduce create xml output + def formatDoc(self, flat_xml): + result = '' + for j in self.doc : + if len(j) > 0: + if flat_xml: + result += self.flattenTag(j) + else: + result += self.formatTag(j) + if self.debug : print result + return result + + + + # main loop - parse the page.dat files + # to create structured document and snippets + + # FIXME: value at end of magic appears to be a subtags count + # but for what? For now, inject an 'info" tag as it is in + # every dictionary and seems close to what is meant + # The alternative is to special case the last _ "0x5f" to mean something + + def process(self): + + # peek at the first bytes to see what type of file it is + magic = self.fo.read(9) + if (magic[0:1] == 'p') and (magic[2:9] == 'marker_'): + first_token = 'info' + elif (magic[0:1] == 'p') and (magic[2:9] == '__PAGE_'): + skip = self.fo.read(2) + first_token = 'info' + elif (magic[0:1] == 'p') and (magic[2:8] == '_PAGE_'): + first_token = 'info' + elif (magic[0:1] == 'g') and (magic[2:9] == '__GLYPH'): + skip = self.fo.read(3) + first_token = 'info' + else : + # other0.dat file + first_token = None + self.fo.seek(-9,1) + + + # main loop to read and build the document tree + while True: + + if first_token != None : + # use "inserted" first token 'info' for page and glyph files + tag = self.procToken(first_token) + if len(tag) > 0 : + self.doc.append(tag) + first_token = None + + v = self.getNext() + if (v == None): + break + + if (v == 0x72): + self.doLoop72('number') + elif (v > 0) and (v < self.dict.getSize()) : + tag = self.procToken(self.dict.lookup(v)) + if len(tag) > 0 : + self.doc.append(tag) + else: + if self.debug: + print "Main Loop: Unknown value: %x" % v + if (v == 0): + if (self.peek(1) == 0x5f): + skip = self.fo.read(1) + first_token = 'info' + + # now do snippet injection + if len(self.snippetList) > 0 : + if self.debug : print 'Injecting Snippets:' + snippet = self.injectSnippets(self.snippetList[0]) + snipno = snippet[0] + tag_add = snippet[1] + if self.debug : print self.formatTag(tag_add) + if len(tag_add) > 0: + self.doc.append(tag_add) + + # handle generation of xml output + xmlpage = self.formatDoc(self.flat_xml) + + return xmlpage + + +def fromData(dict, fname): + flat_xml = True + debug = False + pp = PageParser(fname, dict, debug, flat_xml) + xmlpage = pp.process() + return xmlpage + +def getXML(dict, fname): + flat_xml = False + debug = False + pp = PageParser(fname, dict, debug, flat_xml) + xmlpage = pp.process() + return xmlpage + +def usage(): + print 'Usage: ' + print ' convert2xml.py dict0000.dat infile.dat ' + print ' ' + print ' Options:' + print ' -h print this usage help message ' + print ' -d turn on debug output to check for potential errors ' + print ' --flat-xml output the flattened xml page description only ' + print ' ' + print ' This program will attempt to convert a page*.dat file or ' + print ' glyphs*.dat file, using the dict0000.dat file, to its xml description. ' + print ' ' + print ' Use "cmbtc_dump.py" first to unencrypt, uncompress, and dump ' + print ' the *.dat files from a Topaz format e-book.' + +# +# Main +# + +def main(argv): + dictFile = "" + pageFile = "" + debug = False + flat_xml = False + printOutput = False + if len(argv) == 0: + printOutput = True + argv = sys.argv + + try: + opts, args = getopt.getopt(argv[1:], "hd", ["flat-xml"]) + + except getopt.GetoptError, err: + + # print help information and exit: + print str(err) # will print something like "option -a not recognized" + usage() + sys.exit(2) + + if len(opts) == 0 and len(args) == 0 : + usage() + sys.exit(2) + + for o, a in opts: + if o =="-d": + debug=True + if o =="-h": + usage() + sys.exit(0) + if o =="--flat-xml": + flat_xml = True + + dictFile, pageFile = args[0], args[1] + + # read in the string table dictionary + dict = Dictionary(dictFile) + # dict.dumpDict() + + # create a page parser + pp = PageParser(pageFile, dict, debug, flat_xml) + + xmlpage = pp.process() + + if printOutput: + print xmlpage + return 0 + + return xmlpage + +if __name__ == '__main__': + sys.exit(main('')) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2html.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2html.py new file mode 100644 index 0000000..81d93bc --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2html.py @@ -0,0 +1,706 @@ +#! /usr/bin/python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab +# For use with Topaz Scripts Version 2.6 + +import sys +import csv +import os +import math +import getopt +from struct import pack +from struct import unpack + + +class DocParser(object): + def __init__(self, flatxml, classlst, fileid, bookDir, gdict, fixedimage): + self.id = os.path.basename(fileid).replace('.dat','') + self.svgcount = 0 + self.docList = flatxml.split('\n') + self.docSize = len(self.docList) + self.classList = {} + self.bookDir = bookDir + self.gdict = gdict + tmpList = classlst.split('\n') + for pclass in tmpList: + if pclass != '': + # remove the leading period from the css name + cname = pclass[1:] + self.classList[cname] = True + self.fixedimage = fixedimage + self.ocrtext = [] + self.link_id = [] + self.link_title = [] + self.link_page = [] + self.link_href = [] + self.link_type = [] + self.dehyphen_rootid = [] + self.paracont_stemid = [] + self.parastems_stemid = [] + + + def getGlyph(self, gid): + result = '' + id='id="gl%d"' % gid + return self.gdict.lookup(id) + + def glyphs_to_image(self, glyphList): + + def extract(path, key): + b = path.find(key) + len(key) + e = path.find(' ',b) + return int(path[b:e]) + + svgDir = os.path.join(self.bookDir,'svg') + + imgDir = os.path.join(self.bookDir,'img') + imgname = self.id + '_%04d.svg' % self.svgcount + imgfile = os.path.join(imgDir,imgname) + + # get glyph information + gxList = self.getData('info.glyph.x',0,-1) + gyList = self.getData('info.glyph.y',0,-1) + gidList = self.getData('info.glyph.glyphID',0,-1) + + gids = [] + maxws = [] + maxhs = [] + xs = [] + ys = [] + gdefs = [] + + # get path defintions, positions, dimensions for ecah glyph + # that makes up the image, and find min x and min y to reposition origin + minx = -1 + miny = -1 + for j in glyphList: + gid = gidList[j] + gids.append(gid) + + xs.append(gxList[j]) + if minx == -1: minx = gxList[j] + else : minx = min(minx, gxList[j]) + + ys.append(gyList[j]) + if miny == -1: miny = gyList[j] + else : miny = min(miny, gyList[j]) + + path = self.getGlyph(gid) + gdefs.append(path) + + maxws.append(extract(path,'width=')) + maxhs.append(extract(path,'height=')) + + + # change the origin to minx, miny and calc max height and width + maxw = maxws[0] + xs[0] - minx + maxh = maxhs[0] + ys[0] - miny + for j in xrange(0, len(xs)): + xs[j] = xs[j] - minx + ys[j] = ys[j] - miny + maxw = max( maxw, (maxws[j] + xs[j]) ) + maxh = max( maxh, (maxhs[j] + ys[j]) ) + + # open the image file for output + ifile = open(imgfile,'w') + ifile.write('\n') + ifile.write('\n') + ifile.write('\n' % (math.floor(maxw/10), math.floor(maxh/10), maxw, maxh)) + ifile.write('\n') + for j in xrange(0,len(gdefs)): + ifile.write(gdefs[j]) + ifile.write('\n') + for j in xrange(0,len(gids)): + ifile.write('\n' % (gids[j], xs[j], ys[j])) + ifile.write('') + ifile.close() + + return 0 + + + + # return tag at line pos in document + def lineinDoc(self, pos) : + if (pos >= 0) and (pos < self.docSize) : + item = self.docList[pos] + if item.find('=') >= 0: + (name, argres) = item.split('=',1) + else : + name = item + argres = '' + return name, argres + + + # find tag in doc if within pos to end inclusive + def findinDoc(self, tagpath, pos, end) : + result = None + if end == -1 : + end = self.docSize + else: + end = min(self.docSize, end) + foundat = -1 + for j in xrange(pos, end): + item = self.docList[j] + if item.find('=') >= 0: + (name, argres) = item.split('=',1) + else : + name = item + argres = '' + if name.endswith(tagpath) : + result = argres + foundat = j + break + return foundat, result + + + # return list of start positions for the tagpath + def posinDoc(self, tagpath): + startpos = [] + pos = 0 + res = "" + while res != None : + (foundpos, res) = self.findinDoc(tagpath, pos, -1) + if res != None : + startpos.append(foundpos) + pos = foundpos + 1 + return startpos + + + # returns a vector of integers for the tagpath + def getData(self, tagpath, pos, end): + argres=[] + (foundat, argt) = self.findinDoc(tagpath, pos, end) + if (argt != None) and (len(argt) > 0) : + argList = argt.split('|') + argres = [ int(strval) for strval in argList] + return argres + + + # get the class + def getClass(self, pclass): + nclass = pclass + + # class names are an issue given topaz may start them with numerals (not allowed), + # use a mix of cases (which cause some browsers problems), and actually + # attach numbers after "_reclustered*" to the end to deal classeses that inherit + # from a base class (but then not actually provide all of these _reclustereed + # classes in the stylesheet! + + # so we clean this up by lowercasing, prepend 'cl-', and getting any baseclass + # that exists in the stylesheet first, and then adding this specific class + # after + + # also some class names have spaces in them so need to convert to dashes + if nclass != None : + nclass = nclass.replace(' ','-') + classres = '' + nclass = nclass.lower() + nclass = 'cl-' + nclass + baseclass = '' + # graphic is the base class for captions + if nclass.find('cl-cap-') >=0 : + classres = 'graphic' + ' ' + else : + # strip to find baseclass + p = nclass.find('_') + if p > 0 : + baseclass = nclass[0:p] + if baseclass in self.classList: + classres += baseclass + ' ' + classres += nclass + nclass = classres + return nclass + + + # develop a sorted description of the starting positions of + # groups and regions on the page, as well as the page type + def PageDescription(self): + + def compare(x, y): + (xtype, xval) = x + (ytype, yval) = y + if xval > yval: + return 1 + if xval == yval: + return 0 + return -1 + + result = [] + (pos, pagetype) = self.findinDoc('page.type',0,-1) + + groupList = self.posinDoc('page.group') + groupregionList = self.posinDoc('page.group.region') + pageregionList = self.posinDoc('page.region') + # integrate into one list + for j in groupList: + result.append(('grpbeg',j)) + for j in groupregionList: + result.append(('gregion',j)) + for j in pageregionList: + result.append(('pregion',j)) + result.sort(compare) + + # insert group end and page end indicators + inGroup = False + j = 0 + while True: + if j == len(result): break + rtype = result[j][0] + rval = result[j][1] + if not inGroup and (rtype == 'grpbeg') : + inGroup = True + j = j + 1 + elif inGroup and (rtype in ('grpbeg', 'pregion')): + result.insert(j,('grpend',rval)) + inGroup = False + else: + j = j + 1 + if inGroup: + result.append(('grpend',-1)) + result.append(('pageend', -1)) + return pagetype, result + + + + # build a description of the paragraph + def getParaDescription(self, start, end, regtype): + + result = [] + + # paragraph + (pos, pclass) = self.findinDoc('paragraph.class',start,end) + + pclass = self.getClass(pclass) + + # build up a description of the paragraph in result and return it + # first check for the basic - all words paragraph + (pos, sfirst) = self.findinDoc('paragraph.firstWord',start,end) + (pos, slast) = self.findinDoc('paragraph.lastWord',start,end) + if (sfirst != None) and (slast != None) : + first = int(sfirst) + last = int(slast) + + makeImage = (regtype == 'vertical') or (regtype == 'table') + if self.fixedimage: + makeImage = makeImage or (regtype == 'fixed') + + if (pclass != None): + makeImage = makeImage or (pclass.find('.inverted') >= 0) + if self.fixedimage : + makeImage = makeImage or (pclass.find('cl-f-') >= 0) + + if not makeImage : + # standard all word paragraph + for wordnum in xrange(first, last): + result.append(('ocr', wordnum)) + return pclass, result + + # convert paragraph to svg image + # translate first and last word into first and last glyphs + # and generate inline image and include it + glyphList = [] + firstglyphList = self.getData('word.firstGlyph',0,-1) + gidList = self.getData('info.glyph.glyphID',0,-1) + firstGlyph = firstglyphList[first] + if last < len(firstglyphList): + lastGlyph = firstglyphList[last] + else : + lastGlyph = len(gidList) + for glyphnum in xrange(firstGlyph, lastGlyph): + glyphList.append(glyphnum) + # include any extratokens if they exist + (pos, sfg) = self.findinDoc('extratokens.firstGlyph',start,end) + (pos, slg) = self.findinDoc('extratokens.lastGlyph',start,end) + if (sfg != None) and (slg != None): + for glyphnum in xrange(int(sfg), int(slg)): + glyphList.append(glyphnum) + num = self.svgcount + self.glyphs_to_image(glyphList) + self.svgcount += 1 + result.append(('svg', num)) + return pclass, result + + # this type of paragraph may be made up of multiple spans, inline + # word monograms (images), and words with semantic meaning, + # plus glyphs used to form starting letter of first word + + # need to parse this type line by line + line = start + 1 + word_class = '' + + # if end is -1 then we must search to end of document + if end == -1 : + end = self.docSize + + # seems some xml has last* coming before first* so we have to + # handle any order + sp_first = -1 + sp_last = -1 + + gl_first = -1 + gl_last = -1 + + ws_first = -1 + ws_last = -1 + + word_class = '' + + while (line < end) : + + (name, argres) = self.lineinDoc(line) + + if name.endswith('span.firstWord') : + sp_first = int(argres) + + elif name.endswith('span.lastWord') : + sp_last = int(argres) + + elif name.endswith('word.firstGlyph') : + gl_first = int(argres) + + elif name.endswith('word.lastGlyph') : + gl_last = int(argres) + + elif name.endswith('word_semantic.firstWord'): + ws_first = int(argres) + + elif name.endswith('word_semantic.lastWord'): + ws_last = int(argres) + + elif name.endswith('word.class'): + (cname, space) = argres.split('-',1) + if space == '' : space = '0' + if (cname == 'spaceafter') and (int(space) > 0) : + word_class = 'sa' + + elif name.endswith('word.img.src'): + result.append(('img' + word_class, int(argres))) + word_class = '' + + elif name.endswith('region.img.src'): + result.append(('img' + word_class, int(argres))) + + if (sp_first != -1) and (sp_last != -1): + for wordnum in xrange(sp_first, sp_last): + result.append(('ocr', wordnum)) + sp_first = -1 + sp_last = -1 + + if (gl_first != -1) and (gl_last != -1): + glyphList = [] + for glyphnum in xrange(gl_first, gl_last): + glyphList.append(glyphnum) + num = self.svgcount + self.glyphs_to_image(glyphList) + self.svgcount += 1 + result.append(('svg', num)) + gl_first = -1 + gl_last = -1 + + if (ws_first != -1) and (ws_last != -1): + for wordnum in xrange(ws_first, ws_last): + result.append(('ocr', wordnum)) + ws_first = -1 + ws_last = -1 + + line += 1 + + return pclass, result + + + def buildParagraph(self, pclass, pdesc, type, regtype) : + parares = '' + sep ='' + + classres = '' + if pclass : + classres = ' class="' + pclass + '"' + + br_lb = (regtype == 'fixed') or (regtype == 'chapterheading') or (regtype == 'vertical') + + handle_links = len(self.link_id) > 0 + + if (type == 'full') or (type == 'begin') : + parares += '' + + if (type == 'end'): + parares += ' ' + + lstart = len(parares) + + cnt = len(pdesc) + + for j in xrange( 0, cnt) : + + (wtype, num) = pdesc[j] + + if wtype == 'ocr' : + word = self.ocrtext[num] + sep = ' ' + + if handle_links: + link = self.link_id[num] + if (link > 0): + linktype = self.link_type[link-1] + title = self.link_title[link-1] + if (title == "") or (parares.rfind(title) < 0): + title=parares[lstart:] + if linktype == 'external' : + linkhref = self.link_href[link-1] + linkhtml = '' % linkhref + else : + if len(self.link_page) >= link : + ptarget = self.link_page[link-1] - 1 + linkhtml = '' % ptarget + else : + # just link to the current page + linkhtml = '' + linkhtml += title + '' + pos = parares.rfind(title) + if pos >= 0: + parares = parares[0:pos] + linkhtml + parares[pos+len(title):] + else : + parares += linkhtml + lstart = len(parares) + if word == '_link_' : word = '' + elif (link < 0) : + if word == '_link_' : word = '' + + if word == '_lb_': + if ((num-1) in self.dehyphen_rootid ) or handle_links: + word = '' + sep = '' + elif br_lb : + word = '
\n' + sep = '' + else : + word = '\n' + sep = '' + + if num in self.dehyphen_rootid : + word = word[0:-1] + sep = '' + + parares += word + sep + + elif wtype == 'img' : + sep = '' + parares += '' % num + parares += sep + + elif wtype == 'imgsa' : + sep = ' ' + parares += '' % num + parares += sep + + elif wtype == 'svg' : + sep = '' + parares += '' % num + parares += sep + + if len(sep) > 0 : parares = parares[0:-1] + if (type == 'full') or (type == 'end') : + parares += '

' + return parares + + + + # walk the document tree collecting the information needed + # to build an html page using the ocrText + + def process(self): + + htmlpage = '' + + # get the ocr text + (pos, argres) = self.findinDoc('info.word.ocrText',0,-1) + if argres : self.ocrtext = argres.split('|') + + # get information to dehyphenate the text + self.dehyphen_rootid = self.getData('info.dehyphen.rootID',0,-1) + + # determine if first paragraph is continued from previous page + (pos, self.parastems_stemid) = self.findinDoc('info.paraStems.stemID',0,-1) + first_para_continued = (self.parastems_stemid != None) + + # determine if last paragraph is continued onto the next page + (pos, self.paracont_stemid) = self.findinDoc('info.paraCont.stemID',0,-1) + last_para_continued = (self.paracont_stemid != None) + + # collect link ids + self.link_id = self.getData('info.word.link_id',0,-1) + + # collect link destination page numbers + self.link_page = self.getData('info.links.page',0,-1) + + # collect link types (container versus external) + (pos, argres) = self.findinDoc('info.links.type',0,-1) + if argres : self.link_type = argres.split('|') + + # collect link destinations + (pos, argres) = self.findinDoc('info.links.href',0,-1) + if argres : self.link_href = argres.split('|') + + # collect link titles + (pos, argres) = self.findinDoc('info.links.title',0,-1) + if argres : + self.link_title = argres.split('|') + else: + self.link_title.append('') + + # get a descriptions of the starting points of the regions + # and groups on the page + (pagetype, pageDesc) = self.PageDescription() + regcnt = len(pageDesc) - 1 + + anchorSet = False + breakSet = False + inGroup = False + + # process each region on the page and convert what you can to html + + for j in xrange(regcnt): + + (etype, start) = pageDesc[j] + (ntype, end) = pageDesc[j+1] + + + # set anchor for link target on this page + if not anchorSet and not first_para_continued: + htmlpage += '\n' + anchorSet = True + + # handle groups of graphics with text captions + if (etype == 'grpbeg'): + (pos, grptype) = self.findinDoc('group.type', start, end) + if grptype != None: + if grptype == 'graphic': + gcstr = ' class="' + grptype + '"' + htmlpage += '' + inGroup = True + + elif (etype == 'grpend'): + if inGroup: + htmlpage += '\n' + inGroup = False + + else: + (pos, regtype) = self.findinDoc('region.type',start,end) + + if regtype == 'graphic' : + (pos, simgsrc) = self.findinDoc('img.src',start,end) + if simgsrc: + if inGroup: + htmlpage += '' % int(simgsrc) + else: + htmlpage += '
' % int(simgsrc) + + elif regtype == 'chapterheading' : + (pclass, pdesc) = self.getParaDescription(start,end, regtype) + if not breakSet: + htmlpage += '
 
\n' + breakSet = True + tag = 'h1' + if pclass and (len(pclass) >= 7): + if pclass[3:7] == 'ch1-' : tag = 'h1' + if pclass[3:7] == 'ch2-' : tag = 'h2' + if pclass[3:7] == 'ch3-' : tag = 'h3' + htmlpage += '<' + tag + ' class="' + pclass + '">' + else: + htmlpage += '<' + tag + '>' + htmlpage += self.buildParagraph(pclass, pdesc, 'middle', regtype) + htmlpage += '' + + elif (regtype == 'text') or (regtype == 'fixed') or (regtype == 'insert') or (regtype == 'listitem'): + ptype = 'full' + # check to see if this is a continution from the previous page + if first_para_continued : + ptype = 'end' + first_para_continued = False + (pclass, pdesc) = self.getParaDescription(start,end, regtype) + if pclass and (len(pclass) >= 6) and (ptype == 'full'): + tag = 'p' + if pclass[3:6] == 'h1-' : tag = 'h4' + if pclass[3:6] == 'h2-' : tag = 'h5' + if pclass[3:6] == 'h3-' : tag = 'h6' + htmlpage += '<' + tag + ' class="' + pclass + '">' + htmlpage += self.buildParagraph(pclass, pdesc, 'middle', regtype) + htmlpage += '' + else : + htmlpage += self.buildParagraph(pclass, pdesc, ptype, regtype) + + elif (regtype == 'tocentry') : + ptype = 'full' + if first_para_continued : + ptype = 'end' + first_para_continued = False + (pclass, pdesc) = self.getParaDescription(start,end, regtype) + htmlpage += self.buildParagraph(pclass, pdesc, ptype, regtype) + + + elif (regtype == 'vertical') or (regtype == 'table') : + ptype = 'full' + if inGroup: + ptype = 'middle' + if first_para_continued : + ptype = 'end' + first_para_continued = False + (pclass, pdesc) = self.getParaDescription(start, end, regtype) + htmlpage += self.buildParagraph(pclass, pdesc, ptype, regtype) + + + elif (regtype == 'synth_fcvr.center'): + (pos, simgsrc) = self.findinDoc('img.src',start,end) + if simgsrc: + htmlpage += '
' % int(simgsrc) + + else : + print ' Making region type', regtype, + (pos, temp) = self.findinDoc('paragraph',start,end) + (pos2, temp) = self.findinDoc('span',start,end) + if pos != -1 or pos2 != -1: + print ' a "text" region' + orig_regtype = regtype + regtype = 'fixed' + ptype = 'full' + # check to see if this is a continution from the previous page + if first_para_continued : + ptype = 'end' + first_para_continued = False + (pclass, pdesc) = self.getParaDescription(start,end, regtype) + if not pclass: + if orig_regtype.endswith('.right') : pclass = 'cl-right' + elif orig_regtype.endswith('.center') : pclass = 'cl-center' + elif orig_regtype.endswith('.left') : pclass = 'cl-left' + elif orig_regtype.endswith('.justify') : pclass = 'cl-justify' + if pclass and (ptype == 'full') and (len(pclass) >= 6): + tag = 'p' + if pclass[3:6] == 'h1-' : tag = 'h4' + if pclass[3:6] == 'h2-' : tag = 'h5' + if pclass[3:6] == 'h3-' : tag = 'h6' + htmlpage += '<' + tag + ' class="' + pclass + '">' + htmlpage += self.buildParagraph(pclass, pdesc, 'middle', regtype) + htmlpage += '' + else : + htmlpage += self.buildParagraph(pclass, pdesc, ptype, regtype) + else : + print ' a "graphic" region' + (pos, simgsrc) = self.findinDoc('img.src',start,end) + if simgsrc: + htmlpage += '
' % int(simgsrc) + + + if last_para_continued : + if htmlpage[-4:] == '

': + htmlpage = htmlpage[0:-4] + last_para_continued = False + + return htmlpage + + + +def convert2HTML(flatxml, classlst, fileid, bookDir, gdict, fixedimage): + # create a document parser + dp = DocParser(flatxml, classlst, fileid, bookDir, gdict, fixedimage) + htmlpage = dp.process() + return htmlpage diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2svg.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2svg.py new file mode 100644 index 0000000..6f6795d --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/flatxml2svg.py @@ -0,0 +1,151 @@ +#! /usr/bin/python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab + +import sys +import csv +import os +import getopt +from struct import pack +from struct import unpack + + +class PParser(object): + def __init__(self, gd, flatxml): + self.gd = gd + self.flatdoc = flatxml.split('\n') + self.temp = [] + foo = self.getData('page.h') or self.getData('book.h') + self.ph = foo[0] + foo = self.getData('page.w') or self.getData('book.w') + self.pw = foo[0] + self.gx = self.getData('info.glyph.x') + self.gy = self.getData('info.glyph.y') + self.gid = self.getData('info.glyph.glyphID') + def getData(self, path): + result = None + cnt = len(self.flatdoc) + for j in xrange(cnt): + item = self.flatdoc[j] + if item.find('=') >= 0: + (name, argt) = item.split('=') + argres = argt.split('|') + else: + name = item + argres = [] + if (name.endswith(path)): + result = argres + break + if (len(argres) > 0) : + for j in xrange(0,len(argres)): + argres[j] = int(argres[j]) + return result + def getDataTemp(self, path): + result = None + cnt = len(self.temp) + for j in xrange(cnt): + item = self.temp[j] + if item.find('=') >= 0: + (name, argt) = item.split('=') + argres = argt.split('|') + else: + name = item + argres = [] + if (name.endswith(path)): + result = argres + self.temp.pop(j) + break + if (len(argres) > 0) : + for j in xrange(0,len(argres)): + argres[j] = int(argres[j]) + return result + def getImages(self): + result = [] + self.temp = self.flatdoc + while (self.getDataTemp('img') != None): + h = self.getDataTemp('img.h')[0] + w = self.getDataTemp('img.w')[0] + x = self.getDataTemp('img.x')[0] + y = self.getDataTemp('img.y')[0] + src = self.getDataTemp('img.src')[0] + result.append('\n' % (src, x, y, w, h)) + return result + def getGlyphs(self): + result = [] + if (self.gid != None) and (len(self.gid) > 0): + glyphs = [] + for j in set(self.gid): + glyphs.append(j) + glyphs.sort() + for gid in glyphs: + id='id="gl%d"' % gid + path = self.gd.lookup(id) + if path: + result.append(id + ' ' + path) + return result + + +def convert2SVG(gdict, flat_xml, counter, numfiles, svgDir, raw, meta_array, scaledpi): + ml = '' + pp = PParser(gdict, flat_xml) + ml += '\n' + if (raw): + ml += '\n' + ml += '\n' % (pp.pw / scaledpi, pp.ph / scaledpi, pp.pw -1, pp.ph -1) + ml += 'Page %d - %s by %s\n' % (counter, meta_array['Title'],meta_array['Authors']) + else: + ml += '\n' + ml += '\n' + ml += 'Page %d - %s by %s\n' % (counter, meta_array['Title'],meta_array['Authors']) + ml += '\n' + ml += '\n' + ml += '\n' + ml += '\n' + ml += '\n' + ml += '\n' + ml += '\n' + return ml + diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py new file mode 100644 index 0000000..a483dec --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genbook.py @@ -0,0 +1,561 @@ +#! /usr/bin/python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab + +class Unbuffered: + def __init__(self, stream): + self.stream = stream + def write(self, data): + self.stream.write(data) + self.stream.flush() + def __getattr__(self, attr): + return getattr(self.stream, attr) + +import sys +sys.stdout=Unbuffered(sys.stdout) + +import csv +import os +import getopt +from struct import pack +from struct import unpack + + +# local support routines +import convert2xml +import flatxml2html +import flatxml2svg +import stylexml2css + + +# Get a 7 bit encoded number from a file +def readEncodedNumber(file): + flag = False + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + if data == 0xFF: + flag = True + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + if data >= 0x80: + datax = (data & 0x7F) + while data >= 0x80 : + c = file.read(1) + if (len(c) == 0): + return None + data = ord(c) + datax = (datax <<7) + (data & 0x7F) + data = datax + if flag: + data = -data + return data + +# Get a length prefixed string from the file +def lengthPrefixString(data): + return encodeNumber(len(data))+data + +def readString(file): + stringLength = readEncodedNumber(file) + if (stringLength == None): + return None + sv = file.read(stringLength) + if (len(sv) != stringLength): + return "" + return unpack(str(stringLength)+"s",sv)[0] + +def getMetaArray(metaFile): + # parse the meta file + result = {} + fo = file(metaFile,'rb') + size = readEncodedNumber(fo) + for i in xrange(size): + tag = readString(fo) + value = readString(fo) + result[tag] = value + # print tag, value + fo.close() + return result + + +# dictionary of all text strings by index value +class Dictionary(object): + def __init__(self, dictFile): + self.filename = dictFile + self.size = 0 + self.fo = file(dictFile,'rb') + self.stable = [] + self.size = readEncodedNumber(self.fo) + for i in xrange(self.size): + self.stable.append(self.escapestr(readString(self.fo))) + self.pos = 0 + def escapestr(self, str): + str = str.replace('&','&') + str = str.replace('<','<') + str = str.replace('>','>') + str = str.replace('=','=') + return str + def lookup(self,val): + if ((val >= 0) and (val < self.size)) : + self.pos = val + return self.stable[self.pos] + else: + print "Error - %d outside of string table limits" % val + sys.exit(-1) + def getSize(self): + return self.size + def getPos(self): + return self.pos + + +class PageDimParser(object): + def __init__(self, flatxml): + self.flatdoc = flatxml.split('\n') + # find tag if within pos to end inclusive + def findinDoc(self, tagpath, pos, end) : + result = None + docList = self.flatdoc + cnt = len(docList) + if end == -1 : + end = cnt + else: + end = min(cnt,end) + foundat = -1 + for j in xrange(pos, end): + item = docList[j] + if item.find('=') >= 0: + (name, argres) = item.split('=') + else : + name = item + argres = '' + if name.endswith(tagpath) : + result = argres + foundat = j + break + return foundat, result + def process(self): + (pos, sph) = self.findinDoc('page.h',0,-1) + (pos, spw) = self.findinDoc('page.w',0,-1) + if (sph == None): sph = '-1' + if (spw == None): spw = '-1' + return sph, spw + +def getPageDim(flatxml): + # create a document parser + dp = PageDimParser(flatxml) + (ph, pw) = dp.process() + return ph, pw + +class GParser(object): + def __init__(self, flatxml): + self.flatdoc = flatxml.split('\n') + self.dpi = 1440 + self.gh = self.getData('info.glyph.h') + self.gw = self.getData('info.glyph.w') + self.guse = self.getData('info.glyph.use') + if self.guse : + self.count = len(self.guse) + else : + self.count = 0 + self.gvtx = self.getData('info.glyph.vtx') + self.glen = self.getData('info.glyph.len') + self.gdpi = self.getData('info.glyph.dpi') + self.vx = self.getData('info.vtx.x') + self.vy = self.getData('info.vtx.y') + self.vlen = self.getData('info.len.n') + if self.vlen : + self.glen.append(len(self.vlen)) + elif self.glen: + self.glen.append(0) + if self.vx : + self.gvtx.append(len(self.vx)) + elif self.gvtx : + self.gvtx.append(0) + def getData(self, path): + result = None + cnt = len(self.flatdoc) + for j in xrange(cnt): + item = self.flatdoc[j] + if item.find('=') >= 0: + (name, argt) = item.split('=') + argres = argt.split('|') + else: + name = item + argres = [] + if (name == path): + result = argres + break + if (len(argres) > 0) : + for j in xrange(0,len(argres)): + argres[j] = int(argres[j]) + return result + def getGlyphDim(self, gly): + maxh = (self.gh[gly] * self.dpi) / self.gdpi[gly] + maxw = (self.gw[gly] * self.dpi) / self.gdpi[gly] + return maxh, maxw + def getPath(self, gly): + path = '' + if (gly < 0) or (gly >= self.count): + return path + tx = self.vx[self.gvtx[gly]:self.gvtx[gly+1]] + ty = self.vy[self.gvtx[gly]:self.gvtx[gly+1]] + p = 0 + for k in xrange(self.glen[gly], self.glen[gly+1]): + if (p == 0): + zx = tx[0:self.vlen[k]+1] + zy = ty[0:self.vlen[k]+1] + else: + zx = tx[self.vlen[k-1]+1:self.vlen[k]+1] + zy = ty[self.vlen[k-1]+1:self.vlen[k]+1] + p += 1 + j = 0 + while ( j < len(zx) ): + if (j == 0): + # Start Position. + path += 'M %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly]) + elif (j <= len(zx)-3): + # Cubic Bezier Curve + path += 'C %d %d %d %d %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly], zx[j+1] * self.dpi / self.gdpi[gly], zy[j+1] * self.dpi / self.gdpi[gly], zx[j+2] * self.dpi / self.gdpi[gly], zy[j+2] * self.dpi / self.gdpi[gly]) + j += 2 + elif (j == len(zx)-2): + # Cubic Bezier Curve to Start Position + path += 'C %d %d %d %d %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly], zx[j+1] * self.dpi / self.gdpi[gly], zy[j+1] * self.dpi / self.gdpi[gly], zx[0] * self.dpi / self.gdpi[gly], zy[0] * self.dpi / self.gdpi[gly]) + j += 1 + elif (j == len(zx)-1): + # Quadratic Bezier Curve to Start Position + path += 'Q %d %d %d %d ' % (zx[j] * self.dpi / self.gdpi[gly], zy[j] * self.dpi / self.gdpi[gly], zx[0] * self.dpi / self.gdpi[gly], zy[0] * self.dpi / self.gdpi[gly]) + + j += 1 + path += 'z' + return path + + + +# dictionary of all text strings by index value +class GlyphDict(object): + def __init__(self): + self.gdict = {} + def lookup(self, id): + # id='id="gl%d"' % val + if id in self.gdict: + return self.gdict[id] + return None + def addGlyph(self, val, path): + id='id="gl%d"' % val + self.gdict[id] = path + + +def generateBook(bookDir, raw, fixedimage): + # sanity check Topaz file extraction + if not os.path.exists(bookDir) : + print "Can not find directory with unencrypted book" + return 1 + + dictFile = os.path.join(bookDir,'dict0000.dat') + if not os.path.exists(dictFile) : + print "Can not find dict0000.dat file" + return 1 + + pageDir = os.path.join(bookDir,'page') + if not os.path.exists(pageDir) : + print "Can not find page directory in unencrypted book" + return 1 + + imgDir = os.path.join(bookDir,'img') + if not os.path.exists(imgDir) : + print "Can not find image directory in unencrypted book" + return 1 + + glyphsDir = os.path.join(bookDir,'glyphs') + if not os.path.exists(glyphsDir) : + print "Can not find glyphs directory in unencrypted book" + return 1 + + metaFile = os.path.join(bookDir,'metadata0000.dat') + if not os.path.exists(metaFile) : + print "Can not find metadata0000.dat in unencrypted book" + return 1 + + svgDir = os.path.join(bookDir,'svg') + if not os.path.exists(svgDir) : + os.makedirs(svgDir) + + xmlDir = os.path.join(bookDir,'xml') + if not os.path.exists(xmlDir) : + os.makedirs(xmlDir) + + otherFile = os.path.join(bookDir,'other0000.dat') + if not os.path.exists(otherFile) : + print "Can not find other0000.dat in unencrypted book" + return 1 + + print "Updating to color images if available" + spath = os.path.join(bookDir,'color_img') + dpath = os.path.join(bookDir,'img') + filenames = os.listdir(spath) + filenames = sorted(filenames) + for filename in filenames: + imgname = filename.replace('color','img') + sfile = os.path.join(spath,filename) + dfile = os.path.join(dpath,imgname) + imgdata = file(sfile,'rb').read() + file(dfile,'wb').write(imgdata) + + print "Creating cover.jpg" + isCover = False + cpath = os.path.join(bookDir,'img') + cpath = os.path.join(cpath,'img0000.jpg') + if os.path.isfile(cpath): + cover = file(cpath, 'rb').read() + cpath = os.path.join(bookDir,'cover.jpg') + file(cpath, 'wb').write(cover) + isCover = True + + + print 'Processing Dictionary' + dict = Dictionary(dictFile) + + print 'Processing Meta Data and creating OPF' + meta_array = getMetaArray(metaFile) + + xname = os.path.join(xmlDir, 'metadata.xml') + metastr = '' + for key in meta_array: + metastr += '\n' + file(xname, 'wb').write(metastr) + + print 'Processing StyleSheet' + # get some scaling info from metadata to use while processing styles + fontsize = '135' + if 'fontSize' in meta_array: + fontsize = meta_array['fontSize'] + + # also get the size of a normal text page + spage = '1' + if 'firstTextPage' in meta_array: + spage = meta_array['firstTextPage'] + pnum = int(spage) + + # get page height and width from first text page for use in stylesheet scaling + pname = 'page%04d.dat' % (pnum + 1) + fname = os.path.join(pageDir,pname) + flat_xml = convert2xml.fromData(dict, fname) + + (ph, pw) = getPageDim(flat_xml) + if (ph == '-1') or (ph == '0') : ph = '11000' + if (pw == '-1') or (pw == '0') : pw = '8500' + + # print ' ', 'other0000.dat' + xname = os.path.join(bookDir, 'style.css') + flat_xml = convert2xml.fromData(dict, otherFile) + cssstr , classlst = stylexml2css.convert2CSS(flat_xml, fontsize, ph, pw) + file(xname, 'wb').write(cssstr) + xname = os.path.join(xmlDir, 'other0000.xml') + file(xname, 'wb').write(convert2xml.getXML(dict, otherFile)) + + print 'Processing Glyphs' + gd = GlyphDict() + filenames = os.listdir(glyphsDir) + filenames = sorted(filenames) + glyfname = os.path.join(svgDir,'glyphs.svg') + glyfile = open(glyfname, 'w') + glyfile.write('\n') + glyfile.write('\n') + glyfile.write('\n') + glyfile.write('Glyphs for %s\n' % meta_array['Title']) + glyfile.write('\n') + counter = 0 + for filename in filenames: + # print ' ', filename + print '.', + fname = os.path.join(glyphsDir,filename) + flat_xml = convert2xml.fromData(dict, fname) + + xname = os.path.join(xmlDir, filename.replace('.dat','.xml')) + file(xname, 'wb').write(convert2xml.getXML(dict, fname)) + + gp = GParser(flat_xml) + for i in xrange(0, gp.count): + path = gp.getPath(i) + maxh, maxw = gp.getGlyphDim(i) + fullpath = '\n' % (counter * 256 + i, path, maxw, maxh) + glyfile.write(fullpath) + gd.addGlyph(counter * 256 + i, fullpath) + counter += 1 + glyfile.write('\n') + glyfile.write('\n') + glyfile.close() + print " " + + # start up the html + htmlFileName = "book.html" + htmlstr = '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '' + meta_array['Title'] + ' by ' + meta_array['Authors'] + '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n' + htmlstr += '\n\n' + + print 'Processing Pages' + # Books are at 1440 DPI. This is rendering at twice that size for + # readability when rendering to the screen. + scaledpi = 1440.0 + + svgindex = '\n' + svgindex += '\n' + svgindex += '' + svgindex += '\n' + svgindex += '' + meta_array['Title'] + '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + svgindex += '\n' + + filenames = os.listdir(pageDir) + filenames = sorted(filenames) + numfiles = len(filenames) + counter = 0 + + for filename in filenames: + # print ' ', filename + print ".", + + fname = os.path.join(pageDir,filename) + flat_xml = convert2xml.fromData(dict, fname) + + xname = os.path.join(xmlDir, filename.replace('.dat','.xml')) + file(xname, 'wb').write(convert2xml.getXML(dict, fname)) + + # first get the html + htmlstr += flatxml2html.convert2HTML(flat_xml, classlst, fname, bookDir, gd, fixedimage) + + # now get the svg image of the page + svgxml = flatxml2svg.convert2SVG(gd, flat_xml, counter, numfiles, svgDir, raw, meta_array, scaledpi) + + if (raw) : + pfile = open(os.path.join(svgDir,filename.replace('.dat','.svg')), 'w') + svgindex += 'Page %d\n' % (counter, counter) + else : + pfile = open(os.path.join(svgDir,'page%04d.xhtml' % counter), 'w') + svgindex += 'Page %d\n' % (counter, counter) + + + pfile.write(svgxml) + pfile.close() + + counter += 1 + + print " " + + # finish up the html string and output it + htmlstr += '\n\n' + file(os.path.join(bookDir, htmlFileName), 'wb').write(htmlstr) + + # finish up the svg index string and output it + svgindex += '\n\n' + file(os.path.join(bookDir, 'index_svg.xhtml'), 'wb').write(svgindex) + + # build the opf file + opfname = os.path.join(bookDir, 'book.opf') + opfstr = '\n' + opfstr += '\n' + # adding metadata + opfstr += ' \n' + opfstr += ' ' + meta_array['GUID'] + '\n' + opfstr += ' ' + meta_array['ASIN'] + '\n' + opfstr += ' ' + meta_array['oASIN'] + '\n' + opfstr += ' ' + meta_array['Title'] + '\n' + opfstr += ' ' + meta_array['Authors'] + '\n' + opfstr += ' en\n' + opfstr += ' ' + meta_array['UpdateTime'] + '\n' + if isCover: + opfstr += ' \n' + opfstr += ' \n' + opfstr += '\n' + opfstr += ' \n' + opfstr += ' \n' + # adding image files to manifest + filenames = os.listdir(imgDir) + filenames = sorted(filenames) + for filename in filenames: + imgname, imgext = os.path.splitext(filename) + if imgext == '.jpg': + imgext = 'jpeg' + if imgext == '.svg': + imgext = 'svg+xml' + opfstr += ' \n' + if isCover: + opfstr += ' \n' + opfstr += '\n' + # adding spine + opfstr += '\n \n\n' + if isCover: + opfstr += ' \n' + opfstr += ' \n' + opfstr += ' \n' + opfstr += '\n' + file(opfname, 'wb').write(opfstr) + + print 'Processing Complete' + + return 0 + +def usage(): + print "genbook.py generates a book from the extract Topaz Files" + print "Usage:" + print " genbook.py [-r] [-h [--fixed-image] " + print " " + print "Options:" + print " -h : help - print this usage message" + print " -r : generate raw svg files (not wrapped in xhtml)" + print " --fixed-image : genearate any Fixed Area as an svg image in the html" + print " " + + +def main(argv): + bookDir = '' + + if len(argv) == 0: + argv = sys.argv + + try: + opts, args = getopt.getopt(argv[1:], "rh:",["fixed-image"]) + + except getopt.GetoptError, err: + print str(err) + usage() + return 1 + + if len(opts) == 0 and len(args) == 0 : + usage() + return 1 + + raw = 0 + fixedimage = False + for o, a in opts: + if o =="-h": + usage() + return 0 + if o =="-r": + raw = 1 + if o =="--fixed-image": + fixedimage = True + + bookDir = args[0] + + rv = generateBook(bookDir, raw, fixedimage) + return rv + + +if __name__ == '__main__': + sys.exit(main('')) diff --git a/Topaz_Tools/lib/genxml.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genxml.py similarity index 100% rename from Topaz_Tools/lib/genxml.py rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/genxml.py diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignobleepub.pyw b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignobleepub.pyw index 46cd4e8..469713a 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignobleepub.pyw +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignobleepub.pyw @@ -144,6 +144,7 @@ class Decryptor(object): enc('CipherReference')) for elem in encryption.findall(expr): path = elem.get('URI', None) + path = path.encode('utf-8') if path is not None: encrypted.add(path) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.pyw b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.pyw index 701fc2e..442c37a 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.pyw +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ineptepub.pyw @@ -1,7 +1,7 @@ #! /usr/bin/python # -*- coding: utf-8 -*- -# ineptepub.pyw, version 5.2 +# ineptepub.pyw, version 5.4 # Copyright © 2009-2010 i♥cabbages # Released under the terms of the GNU General Public Licence, version 3 or @@ -25,6 +25,8 @@ # 5.1 - Improve OpenSSL error checking # 5.2 - Fix ctypes error causing segfaults on some systems # 5.3 - add support for OpenSSL on Windows, fix bug with some versions of libcrypto 0.9.8 prior to path level o +# 5.4 - add support for encoding to 'utf-8' when building up list of files to decrypt from encryption.xml + """ Decrypt Adobe ADEPT-encrypted EPUB books. """ @@ -288,6 +290,7 @@ class Decryptor(object): for elem in encryption.findall(expr): path = elem.get('URI', None) if path is not None: + path = path.encode('utf-8') encrypted.add(path) def decompress(self, bytes): diff --git a/Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/k4mdumpkinfo.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mdumpkinfo.py similarity index 100% rename from Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/k4mdumpkinfo.py rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mdumpkinfo.py diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py index df05f89..5059fc4 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py @@ -28,7 +28,7 @@ from __future__ import with_statement -__version__ = '1.2' +__version__ = '1.4' class Unbuffered: def __init__(self, stream): @@ -44,344 +44,60 @@ import os, csv, getopt import binascii import zlib import re +import zlib, zipfile, tempfile, shutil from struct import pack, unpack, unpack_from - -#Exception Handling class DrmException(Exception): pass -# -# crypto digestroutines -# - -import hashlib - -def MD5(message): - ctx = hashlib.md5() - ctx.update(message) - return ctx.digest() - -def SHA1(message): - ctx = hashlib.sha1() - ctx.update(message) - return ctx.digest() - -# determine if we are running as a calibre plugin if 'calibre' in sys.modules: inCalibre = True - global openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 else: inCalibre = False -# -# start of Kindle specific routines -# - -if not inCalibre: - import mobidedrm - if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - -global kindleDatabase - -# Encode the bytes in data with the characters in map -def encode(data, map): - result = "" - for char in data: - value = ord(char) - Q = (value ^ 0x80) // len(map) - R = value % len(map) - result += map[Q] - result += map[R] - return result - -# Hash the bytes in data and then encode the digest with the characters in map -def encodeHash(data,map): - return encode(MD5(data),map) - -# Decode the string in data with the characters in map. Returns the decoded bytes -def decode(data,map): - result = "" - for i in range (0,len(data)-1,2): - high = map.find(data[i]) - low = map.find(data[i+1]) - if (high == -1) or (low == -1) : - break - value = (((high * len(map)) ^ 0x80) & 0xFF) + low - result += pack("B",value) - return result - - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(kInfoFile): - DB = {} - infoReader = openKindleInfo(kInfoFile) - infoReader.read(1) - data = infoReader.read() - if sys.platform.startswith('win'): - items = data.split('{') - else : - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - -# Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). Return the decoded and decrypted record -def getKindleInfoValueForHash(hashedKey): - global kindleDatabase - encryptedValue = decode(kindleDatabase[hashedKey],charMap2) - if sys.platform.startswith('win'): - return CryptUnprotectData(encryptedValue,"") - else: - cleartext = CryptUnprotectData(encryptedValue) - return decode(cleartext, charMap1) - -# Get a record from the Kindle.info file for the string in "key" (plaintext). Return the decoded and decrypted record -def getKindleInfoValueForKey(key): - return getKindleInfoValueForHash(encodeHash(key,charMap2)) - -# Find if the original string for a hashed/encoded string is known. If so return the original string othwise return an empty string. -def findNameForHash(hash): - names = ["kindle.account.tokens","kindle.cookie.item","eulaVersionAccepted","login_date","kindle.token.item","login","kindle.key.item","kindle.name.info","kindle.device.info", "MazamaRandomNumber"] - result = "" - for name in names: - if hash == encodeHash(name, charMap2): - result = name - break - return result - -# Print all the records from the kindle.info file (option -i) -def printKindleInfo(): - for record in kindleDatabase: - name = findNameForHash(record) - if name != "" : - print (name) - print ("--------------------------") - else : - print ("Unknown Record") - print getKindleInfoValueForHash(record) - print "\n" - -# -# PID generation routines -# - -# Returns two bit at offset from a bit field -def getTwoBitsFromBitField(bitField,offset): - byteNumber = offset // 4 - bitPosition = 6 - 2*(offset % 4) - return ord(bitField[byteNumber]) >> bitPosition & 3 - -# Returns the six bits at offset from a bit field -def getSixBitsFromBitField(bitField,offset): - offset *= 3 - value = (getTwoBitsFromBitField(bitField,offset) <<4) + (getTwoBitsFromBitField(bitField,offset+1) << 2) +getTwoBitsFromBitField(bitField,offset+2) - return value - -# 8 bits to six bits encoding from hash to generate PID string -def encodePID(hash): - global charMap3 - PID = "" - for position in range (0,8): - PID += charMap3[getSixBitsFromBitField(hash,position)] - return PID - -# Encryption table used to generate the device PID -def generatePidEncryptionTable() : - table = [] - for counter1 in range (0,0x100): - value = counter1 - for counter2 in range (0,8): - if (value & 1 == 0) : - value = value >> 1 - else : - value = value >> 1 - value = value ^ 0xEDB88320 - table.append(value) - return table - -# Seed value used to generate the device PID -def generatePidSeed(table,dsn) : - value = 0 - for counter in range (0,4) : - index = (ord(dsn[counter]) ^ value) &0xFF - value = (value >> 8) ^ table[index] - return value - -# Generate the device PID -def generateDevicePID(table,dsn,nbRoll): - seed = generatePidSeed(table,dsn) - pidAscii = "" - pid = [(seed >>24) &0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF,(seed>>24) & 0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF] - index = 0 - for counter in range (0,nbRoll): - pid[index] = pid[index] ^ ord(dsn[counter]) - index = (index+1) %8 - for counter in range (0,8): - index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) - pidAscii += charMap4[index] - return pidAscii - -# convert from 8 digit PID to 10 digit PID with checksum -def checksumPid(s): - letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" - crc = (~binascii.crc32(s,-1))&0xFFFFFFFF - crc = crc ^ (crc >> 16) - res = s - l = len(letters) - for i in (0,1): - b = crc & 0xff - pos = (b // l) ^ (b % l) - res += letters[pos%l] - crc >>= 8 - return res - - -class MobiPeek: - def loadSection(self, section): - before, after = self.sections[section:section+2] - self.f.seek(before) - return self.f.read(after - before) - def __init__(self, filename): - self.f = file(filename, 'rb') - self.header = self.f.read(78) - self.ident = self.header[0x3C:0x3C+8] - if self.ident != 'BOOKMOBI' and self.ident != 'TEXtREAd': - raise DrmException('invalid file format') - self.num_sections, = unpack_from('>H', self.header, 76) - sections = self.f.read(self.num_sections*8) - self.sections = unpack_from('>%dL' % (self.num_sections*2), sections, 0)[::2] + (0xfffffff, ) - self.sect0 = self.loadSection(0) - self.f.close() - def getBookTitle(self): - # get book title - toff, tlen = unpack('>II', self.sect0[0x54:0x5c]) - tend = toff + tlen - title = self.sect0[toff:tend] - return title - def getexthData(self): - # if exth region exists then grab it - # get length of this header - length, type, codepage, unique_id, version = unpack('>LLLLL', self.sect0[20:40]) - exth_flag, = unpack('>L', self.sect0[0x80:0x84]) - exth = '' - if exth_flag & 0x40: - exth = self.sect0[16 + length:] - return exth - def isNotEncrypted(self): - lock_type, = unpack('>H', self.sect0[0xC:0xC+2]) - if lock_type == 0: - return True - return False - -# DiapDealer's stuff: Parse the EXTH header records and parse the Kindleinfo -# file to calculate the book pid. -def getK4Pids(exth, title, kInfoFile=None): - global kindleDatabase - try: - kindleDatabase = parseKindleInfo(kInfoFile) - except Exception, message: - print(message) - - if kindleDatabase != None : - # Get the Mazama Random number - MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - - # Get the HDD serial - encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) - - # Get the current user name - encodedUsername = encodeHash(GetUserName(),charMap1) - - # concat, hash and encode to calculate the DSN - DSN = encode(SHA1(MazamaRandomNumber+encodedSystemVolumeSerialNumber+encodedUsername),charMap1) - - print("\nDSN: " + DSN) - - # Compute the device PID (for which I can tell, is used for nothing). - # But hey, stuff being printed out is apparently cool. - table = generatePidEncryptionTable() - devicePID = generateDevicePID(table,DSN,4) - - print("Device PID: " + checksumPid(devicePID)) - - # Compute book PID - exth_records = {} - nitems, = unpack('>I', exth[8:12]) - pos = 12 - - exth_records[209] = None - # Parse the exth records, storing data indexed by type - for i in xrange(nitems): - type, size = unpack('>II', exth[pos: pos + 8]) - content = exth[pos + 8: pos + size] - - exth_records[type] = content - pos += size - - # Grab the contents of the type 209 exth record - if exth_records[209] != None: - data = exth_records[209] - else: - raise DrmException("\nNo EXTH record type 209 - Perhaps not a K4 file?") - - # Parse the 209 data to find the the exth record with the token data. - # The last character of the 209 data points to the record with the token. - # Always 208 from my experience, but I'll leave the logic in case that changes. - for i in xrange(len(data)): - if ord(data[i]) != 0: - if exth_records[ord(data[i])] != None: - token = exth_records[ord(data[i])] - - # Get the kindle account token - kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") - - print("Account Token: " + kindleAccountToken) - - pidHash = SHA1(DSN+kindleAccountToken+exth_records[209]+token) - - bookPID = encodePID(pidHash) - bookPID = checksumPid(bookPID) - - if exth_records[503] != None: - print "Pid for " + exth_records[503] + ": " + bookPID - else: - print "Pid for " + title + ":" + bookPID - return bookPID - - raise DrmException("\nCould not access K4 data - Perhaps K4 is not installed/configured?") - return null +def zipUpDir(myzip, tempdir,localname): + currentdir = tempdir + if localname != "": + currentdir = os.path.join(currentdir,localname) + list = os.listdir(currentdir) + for file in list: + afilename = file + localfilePath = os.path.join(localname, afilename) + realfilePath = os.path.join(currentdir,file) + if os.path.isfile(realfilePath): + myzip.write(realfilePath, localfilePath) + elif os.path.isdir(realfilePath): + zipUpDir(myzip, tempdir, localfilePath) def usage(progname): - print "Removes DRM protection from K4PC, K4M, and Mobi ebooks" + print "Removes DRM protection from K4PC/M, Kindle, Mobi and Topaz ebooks" print "Usage:" - print " %s [-k ] [-p ] " % progname + print " %s [-k ] [-p ] [-s ] " % progname # # Main # def main(argv=sys.argv): - global kindleDatabase import mobidedrm - + import topazextract + import kgenpids progname = os.path.basename(argv[0]) + + k4 = False kInfoFiles = [] - pidnums = "" + serials = [] + pids = [] print ('K4MobiDeDrm v%(__version__)s ' 'provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc .' % globals()) + print ' ' try: - opts, args = getopt.getopt(sys.argv[1:], "k:p:") + opts, args = getopt.getopt(sys.argv[1:], "k:p:s:") except getopt.GetoptError, err: print str(err) usage(progname) sys.exit(2) - if len(args)<2: usage(progname) sys.exit(2) @@ -394,108 +110,145 @@ def main(argv=sys.argv): if o == "-p": if a == None : raise DrmException("Invalid parameter for -p") - pidnums = a + pids = a.split(',') + if o == "-s": + if a == None : + raise DrmException("Invalid parameter for -s") + serials = a.split(',') + + # try with built in Kindle Info files + k4 = True - kindleDatabase = None infile = args[0] - outfile = args[1] - DecodeErrorString = "" - try: - # first try with K4PC/K4M - ex = MobiPeek(infile) - if ex.isNotEncrypted(): - print "File was Not Encrypted" - return 2 - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title) - unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except DrmException, e: - DecodeErrorString += "Error trying default K4 info: " + str(e) + "\n" - pass - except mobidedrm.DrmException, e: - DecodeErrorString += "Error trying default K4 info: " + str(e) + "\n" - pass + outdir = args[1] + + # handle the obvious cases at the beginning + if not os.path.isfile(infile): + print "Error: Input file does not exist" + return 1 + + mobi = True + magic3 = file(infile,'rb').read(3) + if magic3 == 'TPZ': + mobi = False + + bookname = os.path.splitext(os.path.basename(infile))[0] + + if mobi: + mb = mobidedrm.MobiBook(infile) else: - file(outfile, 'wb').write(unlocked_file) - return 0 - - # now try alternate kindle.info files - if kInfoFiles: - for infoFile in kInfoFiles: - kindleDatabase = None - try: - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title, infoFile) - unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except DrmException, e: - DecodeErrorString += "Error trying " + infoFile + " K4 info: " + str(e) + "\n" - pass - except mobidedrm.DrmException, e: - DecodeErrorString += "Error trying " + infoFile + " K4 info: " + str(e) + "\n" - pass - else: - file(outfile, 'wb').write(unlocked_file) - return 0 - - # Lastly, try from the pid list - pids = pidnums.split(',') - for pid in pids: - try: - print 'Trying: "'+ pid + '"' - unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except mobidedrm.DrmException: - pass - else: - file(outfile, 'wb').write(unlocked_file) - return 0 + tempdir = tempfile.mkdtemp() + mb = topazextract.TopazBook(infile, tempdir) - # we could not unencrypt book - print DecodeErrorString - print "Error: Could Not Unencrypt Book" - return 1 + title = mb.getBookTitle() + print "Processing Book: ", title + # build pid list + md1, md2 = mb.getPIDMetaInfo() + pidlst = kgenpids.getPidList(md1, md2, k4, pids, serials, kInfoFiles) + + try: + if mobi: + unlocked_file = mb.processBook(pidlst) + else: + mb.processBook(pidlst) + + except mobidedrm.DrmException, e: + print " ... not suceessful " + str(e) + "\n" + return 1 + except topazextract.TpzDRMError, e: + print str(e) + print " Creating DeBug Full Zip Archive of Book" + zipname = os.path.join(outdir, bookname + '_debug' + '.zip') + myzip = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + zipUpDir(myzip, tempdir, '') + myzip.close() + return 1 + + if mobi: + outfile = os.path.join(outdir,bookname + '_nodrm' + '.azw') + file(outfile, 'wb').write(unlocked_file) + return 0 + + # topaz: build up zip archives of results + print " Creating HTML ZIP Archive" + zipname = os.path.join(outdir, bookname + '_nodrm' + '.zip') + myzip1 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + myzip1.write(os.path.join(tempdir,'book.html'),'book.html') + myzip1.write(os.path.join(tempdir,'book.opf'),'book.opf') + if os.path.isfile(os.path.join(tempdir,'cover.jpg')): + myzip1.write(os.path.join(tempdir,'cover.jpg'),'cover.jpg') + myzip1.write(os.path.join(tempdir,'style.css'),'style.css') + zipUpDir(myzip1, tempdir, 'img') + myzip1.close() + + print " Creating SVG ZIP Archive" + zipname = os.path.join(outdir, bookname + '_SVG' + '.zip') + myzip2 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + myzip2.write(os.path.join(tempdir,'index_svg.xhtml'),'index_svg.xhtml') + zipUpDir(myzip2, tempdir, 'svg') + zipUpDir(myzip2, tempdir, 'img') + myzip2.close() + + print " Creating XML ZIP Archive" + zipname = os.path.join(outdir, bookname + '_XML' + '.zip') + myzip3 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + targetdir = os.path.join(tempdir,'xml') + zipUpDir(myzip3, targetdir, '') + zipUpDir(myzip3, tempdir, 'img') + myzip3.close() + + shutil.rmtree(tempdir) + return 0 if __name__ == '__main__': sys.stdout=Unbuffered(sys.stdout) sys.exit(main()) - if not __name__ == "__main__" and inCalibre: from calibre.customize import FileTypePlugin class K4DeDRM(FileTypePlugin): - name = 'K4PC, K4Mac, Mobi DeDRM' # Name of the plugin - description = 'Removes DRM from K4PC, K4Mac, and Mobi files. \ + name = 'K4PC, K4Mac, Kindle Mobi and Topaz DeDRM' # Name of the plugin + description = 'Removes DRM from K4PC and Mac, Kindle Mobi and Topaz files. \ Provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc.' supported_platforms = ['osx', 'windows', 'linux'] # Platforms this plugin will run on author = 'DiapDealer, SomeUpdates' # The author of this plugin - version = (0, 1, 2) # The version number of this plugin - file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to + version = (0, 1, 7) # The version number of this plugin + file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import - priority = 200 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm + priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm def run(self, path_to_ebook): from calibre.gui2 import is_ok_to_use_qt from PyQt4.Qt import QMessageBox - global kindleDatabase - global openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 + from calibre.ptempfile import PersistentTemporaryDirectory + + import kgenpids + import zlib + import zipfile + import topazextract import mobidedrm + k4 = True + pids = [] + serials = [] + kInfoFiles = [] + # Get supplied list of PIDs to try from plugin customization. - pidnums = self.site_customization - + customvalues = self.site_customization.split(',') + for customvalue in customvalues: + customvalue = str(customvalue) + customvalue = customvalue.strip() + if len(customvalue) == 10 or len(customvalue) == 8: + pids.append(customvalue) + else : + if len(customvalue) == 16 and customvalue[0] == 'B': + serials.append(customvalue) + else: + print "%s is not a valid Kindle serial number or PID." % str(customvalue) + # Load any kindle info files (*.info) included Calibre's config directory. - kInfoFiles = [] try: # Find Calibre's configuration directory. confpath = os.path.split(os.path.split(self.plugin_path)[0])[0] @@ -513,70 +266,68 @@ if not __name__ == "__main__" and inCalibre: print 'K4MobiDeDRM: Error reading kindle info files from config directory.' pass - # first try with book specifc pid from K4PC or K4M + + mobi = True + magic3 = file(path_to_ebook,'rb').read(3) + if magic3 == 'TPZ': + mobi = False + + bookname = os.path.splitext(os.path.basename(path_to_ebook))[0] + + if mobi: + mb = mobidedrm.MobiBook(path_to_ebook) + else: + tempdir = PersistentTemporaryDirectory() + mb = topazextract.TopazBook(path_to_ebook, tempdir) + + title = mb.getBookTitle() + md1, md2 = mb.getPIDMetaInfo() + pidlst = kgenpids.getPidList(md1, md2, k4, pids, serials, kInfoFiles) + try: - kindleDatabase = None - ex = MobiPeek(path_to_ebook) - if ex.isNotEncrypted(): - return path_to_ebook - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title) - unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook,pid) - except DrmException: - pass + if mobi: + unlocked_file = mb.processBook(pidlst) + else: + mb.processBook(pidlst) + except mobidedrm.DrmException: - pass - else: - of = self.temporary_file('.mobi') + #if you reached here then no luck raise and exception + if is_ok_to_use_qt(): + d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "Error decoding: %s\n" % path_to_ebook) + d.show() + d.raise_() + d.exec_() + raise Exception("K4MobiDeDRM plugin could not decode the file") + return "" + except topazextract.TpzDRMError: + #if you reached here then no luck raise and exception + if is_ok_to_use_qt(): + d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "Error decoding: %s\n" % path_to_ebook) + d.show() + d.raise_() + d.exec_() + raise Exception("K4MobiDeDRM plugin could not decode the file") + return "" + + print "Success!" + if mobi: + of = self.temporary_file(bookname+'.mobi') of.write(unlocked_file) of.close() return of.name - - # Now try alternate kindle info files - if kInfoFiles: - for infoFile in kInfoFiles: - kindleDatabase = None - try: - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title, infoFile) - unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook,pid) - except DrmException: - pass - except mobidedrm.DrmException: - pass - else: - of = self.temporary_file('.mobi') - of.write(unlocked_file) - of.close() - return of.name - - # now try from the pid list - pids = pidnums.split(',') - for pid in pids: - try: - unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook, pid) - except mobidedrm.DrmException: - pass - else: - of = self.temporary_file('.mobi') - of.write(unlocked_file) - of.close() - return of.name - - #if you reached here then no luck raise and exception - if is_ok_to_use_qt(): - d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "Error decoding: %s\n" % path_to_ebook) - d.show() - d.raise_() - d.exec_() - raise Exception("K4MobiDeDRM plugin could not decode the file") - return "" + + # topaz: build up zip archives of results + print " Creating HTML ZIP Archive" + of = self.temporary_file(bookname + '.zip') + myzip = zipfile.ZipFile(of.name,'w',zipfile.ZIP_DEFLATED, False) + myzip.write(os.path.join(tempdir,'book.html'),'book.html') + myzip.write(os.path.join(tempdir,'book.opf'),'book.opf') + if os.path.isfile(os.path.join(tempdir,'cover.jpg')): + myzip.write(os.path.join(tempdir,'cover.jpg'),'cover.jpg') + myzip.write(os.path.join(tempdir,'style.css'),'style.css') + zipUpDir(myzip, tempdir, 'img') + myzip.close() + return of.name def customization_help(self, gui=False): - return 'Enter each 10 character PID separated by a comma (no spaces).' + return 'Enter 10 character PIDs and/or Kindle serial numbers, separated by commas.' diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py index 33771eb..4aa14dd 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mutils.py @@ -1,158 +1,13 @@ # standlone set of Mac OSX specific routines needed for K4DeDRM from __future__ import with_statement - import sys import os - -#Exception Handling -class K4MDrmException(Exception): - pass - -import signal -import threading import subprocess -from subprocess import Popen, PIPE, STDOUT - -# **heavily** chopped up and modfied version of asyncproc.py -# to make it actually work on Windows as well as Mac/Linux -# For the original see: -# "http://www.lysator.liu.se/~bellman/download/" -# author is "Thomas Bellman " -# available under GPL version 3 or Later - -# create an asynchronous subprocess whose output can be collected in -# a non-blocking manner - -# What a mess! Have to use threads just to get non-blocking io -# in a cross-platform manner - -# luckily all thread use is hidden within this class - -class Process(object): - def __init__(self, *params, **kwparams): - if len(params) <= 3: - kwparams.setdefault('stdin', subprocess.PIPE) - if len(params) <= 4: - kwparams.setdefault('stdout', subprocess.PIPE) - if len(params) <= 5: - kwparams.setdefault('stderr', subprocess.PIPE) - self.__pending_input = [] - self.__collected_outdata = [] - self.__collected_errdata = [] - self.__exitstatus = None - self.__lock = threading.Lock() - self.__inputsem = threading.Semaphore(0) - self.__quit = False - - self.__process = subprocess.Popen(*params, **kwparams) - if self.__process.stdin: - self.__stdin_thread = threading.Thread( - name="stdin-thread", - target=self.__feeder, args=(self.__pending_input, - self.__process.stdin)) - self.__stdin_thread.setDaemon(True) - self.__stdin_thread.start() - - if self.__process.stdout: - self.__stdout_thread = threading.Thread( - name="stdout-thread", - target=self.__reader, args=(self.__collected_outdata, - self.__process.stdout)) - self.__stdout_thread.setDaemon(True) - self.__stdout_thread.start() - - if self.__process.stderr: - self.__stderr_thread = threading.Thread( - name="stderr-thread", - target=self.__reader, args=(self.__collected_errdata, - self.__process.stderr)) - self.__stderr_thread.setDaemon(True) - self.__stderr_thread.start() - - def pid(self): - return self.__process.pid - - def kill(self, signal): - self.__process.send_signal(signal) - - # check on subprocess (pass in 'nowait') to act like poll - def wait(self, flag): - if flag.lower() == 'nowait': - rc = self.__process.poll() - else: - rc = self.__process.wait() - if rc != None: - if self.__process.stdin: - self.closeinput() - if self.__process.stdout: - self.__stdout_thread.join() - if self.__process.stderr: - self.__stderr_thread.join() - return self.__process.returncode - - def terminate(self): - if self.__process.stdin: - self.closeinput() - self.__process.terminate() - - # thread gets data from subprocess stdout - def __reader(self, collector, source): - while True: - data = os.read(source.fileno(), 65536) - self.__lock.acquire() - collector.append(data) - self.__lock.release() - if data == "": - source.close() - break - return - - # thread feeds data to subprocess stdin - def __feeder(self, pending, drain): - while True: - self.__inputsem.acquire() - self.__lock.acquire() - if not pending and self.__quit: - drain.close() - self.__lock.release() - break - data = pending.pop(0) - self.__lock.release() - drain.write(data) - # non-blocking read of data from subprocess stdout - def read(self): - self.__lock.acquire() - outdata = "".join(self.__collected_outdata) - del self.__collected_outdata[:] - self.__lock.release() - return outdata - - # non-blocking read of data from subprocess stderr - def readerr(self): - self.__lock.acquire() - errdata = "".join(self.__collected_errdata) - del self.__collected_errdata[:] - self.__lock.release() - return errdata - - # non-blocking write to stdin of subprocess - def write(self, data): - if self.__process.stdin is None: - raise ValueError("Writing to process with stdin not a pipe") - self.__lock.acquire() - self.__pending_input.append(data) - self.__inputsem.release() - self.__lock.release() - - # close stdinput of subprocess - def closeinput(self): - self.__lock.acquire() - self.__quit = True - self.__inputsem.release() - self.__lock.release() +class K4MDrmException(Exception): + pass # interface to needed routines in openssl's libcrypto @@ -236,6 +91,15 @@ LibCrypto = _load_crypto() # Utility Routines # + +# Various character maps used to decrypt books. Probably supposed to act as obfuscation +charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" +charMap2 = "ZB0bYyc1xDdW2wEV3Ff7KkPpL8UuGA4gz-Tme9Nn_tHh5SvXCsIiR6rJjQaqlOoM" +charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" + + + # uses a sub process to get the Hard Drive Serial Number using ioreg # returns with the serial number of drive whose BSD Name is "disk0" def GetVolumeSerialNumber(): @@ -244,10 +108,9 @@ def GetVolumeSerialNumber(): return sernum cmdline = '/usr/sbin/ioreg -l -S -w 0 -r -c AppleAHCIDiskDriver' cmdline = cmdline.encode(sys.getfilesystemencoding()) - p = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=False) - poll = p.wait('wait') - results = p.read() - reslst = results.split('\n') + p = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p.communicate() + reslst = out1.split('\n') cnt = len(reslst) bsdname = None sernum = None @@ -274,11 +137,6 @@ def GetUserName(): username = os.getenv('USER') return username -# Various character maps used to decrypt books. Probably supposed to act as obfuscation -charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" -charMap2 = "ZB0bYyc1xDdW2wEV3Ff7KkPpL8UuGA4gz-Tme9Nn_tHh5SvXCsIiR6rJjQaqlOoM" -charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" def encode(data, map): result = "" @@ -309,16 +167,16 @@ def CryptUnprotectData(encryptedData): cleartext = crp.decrypt(encryptedData) return cleartext + # Locate and open the .kindle-info file def openKindleInfo(kInfoFile=None): if kInfoFile == None: home = os.getenv('HOME') cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' cmdline = cmdline.encode(sys.getfilesystemencoding()) - p1 = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=False) - poll = p1.wait('wait') - results = p1.read() - reslst = results.split('\n') + p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p1.communicate() + reslst = out1.split('\n') kinfopath = 'NONE' cnt = len(reslst) for j in xrange(cnt): diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py new file mode 100644 index 0000000..5c44bfa --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/kgenpids.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python + +from __future__ import with_statement +import sys +import os, csv +import binascii +import zlib +import re +from struct import pack, unpack, unpack_from + +class DrmException(Exception): + pass + +global kindleDatabase +global charMap1 +global charMap2 +global charMap3 +global charMap4 + +if sys.platform.startswith('win'): + from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 +if sys.platform.startswith('darwin'): + from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap2 + +charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" +charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" + +# crypto digestroutines +import hashlib + +def MD5(message): + ctx = hashlib.md5() + ctx.update(message) + return ctx.digest() + +def SHA1(message): + ctx = hashlib.sha1() + ctx.update(message) + return ctx.digest() + + +# Encode the bytes in data with the characters in map +def encode(data, map): + result = "" + for char in data: + value = ord(char) + Q = (value ^ 0x80) // len(map) + R = value % len(map) + result += map[Q] + result += map[R] + return result + +# Hash the bytes in data and then encode the digest with the characters in map +def encodeHash(data,map): + return encode(MD5(data),map) + +# Decode the string in data with the characters in map. Returns the decoded bytes +def decode(data,map): + result = "" + for i in range (0,len(data)-1,2): + high = map.find(data[i]) + low = map.find(data[i+1]) + if (high == -1) or (low == -1) : + break + value = (((high * len(map)) ^ 0x80) & 0xFF) + low + result += pack("B",value) + return result + + +# Parse the Kindle.info file and return the records as a list of key-values +def parseKindleInfo(kInfoFile): + DB = {} + infoReader = openKindleInfo(kInfoFile) + infoReader.read(1) + data = infoReader.read() + if sys.platform.startswith('win'): + items = data.split('{') + else : + items = data.split('[') + for item in items: + splito = item.split(':') + DB[splito[0]] =splito[1] + return DB + +# Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). Return the decoded and decrypted record +def getKindleInfoValueForHash(hashedKey): + global kindleDatabase + global charMap1 + global charMap2 + encryptedValue = decode(kindleDatabase[hashedKey],charMap2) + if sys.platform.startswith('win'): + return CryptUnprotectData(encryptedValue,"") + else: + cleartext = CryptUnprotectData(encryptedValue) + return decode(cleartext, charMap1) + +# Get a record from the Kindle.info file for the string in "key" (plaintext). Return the decoded and decrypted record +def getKindleInfoValueForKey(key): + global charMap2 + return getKindleInfoValueForHash(encodeHash(key,charMap2)) + +# Find if the original string for a hashed/encoded string is known. If so return the original string othwise return an empty string. +def findNameForHash(hash): + global charMap2 + names = ["kindle.account.tokens","kindle.cookie.item","eulaVersionAccepted","login_date","kindle.token.item","login","kindle.key.item","kindle.name.info","kindle.device.info", "MazamaRandomNumber"] + result = "" + for name in names: + if hash == encodeHash(name, charMap2): + result = name + break + return result + +# Print all the records from the kindle.info file (option -i) +def printKindleInfo(): + for record in kindleDatabase: + name = findNameForHash(record) + if name != "" : + print (name) + print ("--------------------------") + else : + print ("Unknown Record") + print getKindleInfoValueForHash(record) + print "\n" + +# +# PID generation routines +# + +# Returns two bit at offset from a bit field +def getTwoBitsFromBitField(bitField,offset): + byteNumber = offset // 4 + bitPosition = 6 - 2*(offset % 4) + return ord(bitField[byteNumber]) >> bitPosition & 3 + +# Returns the six bits at offset from a bit field +def getSixBitsFromBitField(bitField,offset): + offset *= 3 + value = (getTwoBitsFromBitField(bitField,offset) <<4) + (getTwoBitsFromBitField(bitField,offset+1) << 2) +getTwoBitsFromBitField(bitField,offset+2) + return value + +# 8 bits to six bits encoding from hash to generate PID string +def encodePID(hash): + global charMap3 + PID = "" + for position in range (0,8): + PID += charMap3[getSixBitsFromBitField(hash,position)] + return PID + +# Encryption table used to generate the device PID +def generatePidEncryptionTable() : + table = [] + for counter1 in range (0,0x100): + value = counter1 + for counter2 in range (0,8): + if (value & 1 == 0) : + value = value >> 1 + else : + value = value >> 1 + value = value ^ 0xEDB88320 + table.append(value) + return table + +# Seed value used to generate the device PID +def generatePidSeed(table,dsn) : + value = 0 + for counter in range (0,4) : + index = (ord(dsn[counter]) ^ value) &0xFF + value = (value >> 8) ^ table[index] + return value + +# Generate the device PID +def generateDevicePID(table,dsn,nbRoll): + global charMap4 + seed = generatePidSeed(table,dsn) + pidAscii = "" + pid = [(seed >>24) &0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF,(seed>>24) & 0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF] + index = 0 + for counter in range (0,nbRoll): + pid[index] = pid[index] ^ ord(dsn[counter]) + index = (index+1) %8 + for counter in range (0,8): + index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) + pidAscii += charMap4[index] + return pidAscii + +def crc32(s): + return (~binascii.crc32(s,-1))&0xFFFFFFFF + +# convert from 8 digit PID to 10 digit PID with checksum +def checksumPid(s): + global charMap4 + crc = crc32(s) + crc = crc ^ (crc >> 16) + res = s + l = len(charMap4) + for i in (0,1): + b = crc & 0xff + pos = (b // l) ^ (b % l) + res += charMap4[pos%l] + crc >>= 8 + return res + + +# old kindle serial number to fixed pid +def pidFromSerial(s, l): + global charMap4 + crc = crc32(s) + arr1 = [0]*l + for i in xrange(len(s)): + arr1[i%l] ^= ord(s[i]) + crc_bytes = [crc >> 24 & 0xff, crc >> 16 & 0xff, crc >> 8 & 0xff, crc & 0xff] + for i in xrange(l): + arr1[i] ^= crc_bytes[i&3] + pid = "" + for i in xrange(l): + b = arr1[i] & 0xff + pid+=charMap4[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))] + return pid + + +# Parse the EXTH header records and use the Kindle serial number to calculate the book pid. +def getKindlePid(pidlst, rec209, token, serialnum): + + if rec209 != None: + # Compute book PID + pidHash = SHA1(serialnum+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + # compute fixed pid for old pre 2.5 firmware update pid as well + bookPID = pidFromSerial(serialnum, 7) + "*" + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + return pidlst + + +# Parse the EXTH header records and parse the Kindleinfo +# file to calculate the book pid. + +def getK4Pids(pidlst, rec209, token, kInfoFile=None): + global kindleDatabase + global charMap1 + kindleDatabase = None + try: + kindleDatabase = parseKindleInfo(kInfoFile) + except Exception, message: + print(message) + pass + + if kindleDatabase == None : + return pidlst + + # Get the Mazama Random number + MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") + + # Get the HDD serial + encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) + + # Get the current user name + encodedUsername = encodeHash(GetUserName(),charMap1) + + # concat, hash and encode to calculate the DSN + DSN = encode(SHA1(MazamaRandomNumber+encodedSystemVolumeSerialNumber+encodedUsername),charMap1) + + # Compute the device PID (for which I can tell, is used for nothing). + table = generatePidEncryptionTable() + devicePID = generateDevicePID(table,DSN,4) + devicePID = checksumPid(devicePID) + pidlst.append(devicePID) + + # Compute book PID + if rec209 == None: + print "\nNo EXTH record type 209 - Perhaps not a K4 file?" + return pidlst + + # Get the kindle account token + kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") + + # book pid + pidHash = SHA1(DSN+kindleAccountToken+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + # variant 1 + pidHash = SHA1(kindleAccountToken+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + # variant 2 + pidHash = SHA1(DSN+rec209+token) + bookPID = encodePID(pidHash) + bookPID = checksumPid(bookPID) + pidlst.append(bookPID) + + return pidlst + +def getPidList(md1, md2, k4, pids, serials, kInfoFiles): + pidlst = [] + if k4: + pidlst = getK4Pids(pidlst, md1, md2) + for infoFile in kInfoFiles: + pidlst = getK4Pids(pidlst, md1, md2, infoFile) + for serialnum in serials: + pidlst = getKindlePid(pidlst, md1, md2, serialnum) + for pid in pids: + pidlst.append(pid) + return pidlst diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/mobidedrm.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/mobidedrm.py index 183432c..cc83224 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/mobidedrm.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/mobidedrm.py @@ -24,7 +24,7 @@ # 0.14 - Working out when the extra data flags are present has been problematic # Versions 7 through 9 have tried to tweak the conditions, but have been # only partially successful. Closer examination of lots of sample -# files reveals that a confusin has arisen because trailing data entries +# files reveals that a confusion has arisen because trailing data entries # are not encrypted, but it turns out that the multibyte entries # in utf8 file are encrypted. (Although neither kind gets compressed.) # This knowledge leads to a simplification of the test for the @@ -39,13 +39,13 @@ # Removed the disabled Calibre plug-in code # Permit use of 8-digit PIDs # 0.19 - It seems that multibyte entries aren't encrypted in a v6 file either. -# 0.20 - Corretion: It seems that multibyte entries are encrypted in a v6 file. +# 0.20 - Correction: It seems that multibyte entries are encrypted in a v6 file. +# 0.21 - Added support for multiple pids +# 0.22 - revised structure to hold MobiBook as a class to allow an extended interface -__version__ = '0.20' +__version__ = '0.22' import sys -import struct -import binascii class Unbuffered: def __init__(self, stream): @@ -55,10 +55,19 @@ class Unbuffered: self.stream.flush() def __getattr__(self, attr): return getattr(self.stream, attr) +sys.stdout=Unbuffered(sys.stdout) + +import struct +import binascii class DrmException(Exception): pass + +# +# MobiBook Utility Routines +# + # Implementation of Pukall Cipher 1 def PC1(key, src, decryption=True): sum1 = 0; @@ -70,7 +79,6 @@ def PC1(key, src, decryption=True): wkey = [] for i in xrange(8): wkey.append(ord(key[i*2])<<8 | ord(key[i*2+1])) - dst = "" for i in xrange(len(src)): temp1 = 0; @@ -131,7 +139,9 @@ def getSizeOfTrailingDataEntries(ptr, size, flags): num += (ord(ptr[size - num - 1]) & 0x3) + 1 return num -class DrmStripper: + + +class MobiBook: def loadSection(self, section): if (section + 1 == self.num_sections): endoff = len(self.data_file) @@ -140,6 +150,78 @@ class DrmStripper: off = self.sections[section][0] return self.data_file[off:endoff] + def __init__(self, infile): + # initial sanity check on file + self.data_file = file(infile, 'rb').read() + self.header = self.data_file[0:78] + if self.header[0x3C:0x3C+8] != 'BOOKMOBI': + raise DrmException("invalid file format") + + # build up section offset and flag info + self.num_sections, = struct.unpack('>H', self.header[76:78]) + self.sections = [] + for i in xrange(self.num_sections): + offset, a1,a2,a3,a4 = struct.unpack('>LBBBB', self.data_file[78+i*8:78+i*8+8]) + flags, val = a1, a2<<16|a3<<8|a4 + self.sections.append( (offset, flags, val) ) + + # parse information from section 0 + self.sect = self.loadSection(0) + self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.mobi_length, = struct.unpack('>L',self.sect[0x14:0x18]) + self.mobi_version, = struct.unpack('>L',self.sect[0x68:0x6C]) + print "MOBI header version = %d, length = %d" %(self.mobi_version, self.mobi_length) + self.extra_data_flags = 0 + if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): + self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) + print "Extra Data Flags = %d" % self.extra_data_flags + if self.mobi_version < 7: + # multibyte utf8 data is included in the encryption for mobi_version 6 and below + # so clear that byte so that we leave it to be decrypted. + self.extra_data_flags &= 0xFFFE + + # if exth region exists parse it for metadata array + self.meta_array = {} + exth_flag, = struct.unpack('>L', self.sect[0x80:0x84]) + exth = '' + if exth_flag & 0x40: + exth = self.sect[16 + self.mobi_length:] + nitems, = struct.unpack('>I', exth[8:12]) + pos = 12 + for i in xrange(nitems): + type, size = struct.unpack('>II', exth[pos: pos + 8]) + content = exth[pos + 8: pos + size] + self.meta_array[type] = content + pos += size + + def getBookTitle(self): + title = '' + if 503 in self.meta_array: + title = self.meta_array[503] + else : + toff, tlen = struct.unpack('>II', self.sect[0x54:0x5c]) + tend = toff + tlen + title = self.sect[toff:tend] + if title == '': + title = self.header[:32] + title = title.split("\0")[0] + return title + + def getPIDMetaInfo(self): + rec209 = None + token = None + if 209 in self.meta_array: + rec209 = self.meta_array[209] + data = rec209 + # Parse the 209 data to find the the exth record with the token data. + # The last character of the 209 data points to the record with the token. + # Always 208 from my experience, but I'll leave the logic in case that changes. + for i in xrange(len(data)): + if ord(data[i]) != 0: + if self.meta_array[ord(data[i])] != None: + token = self.meta_array[ord(data[i])] + return rec209, token + def patch(self, off, new): self.data_file = self.data_file[:off] + new + self.data_file[off+len(new):] @@ -152,134 +234,122 @@ class DrmStripper: assert off + in_off + len(new) <= endoff self.patch(off + in_off, new) - def parseDRM(self, data, count, pid): - pid = pid.ljust(16,'\0') - keyvec1 = "\x72\x38\x33\xB0\xB4\xF2\xE3\xCA\xDF\x09\x01\xD6\xE2\xE0\x3F\x96" - temp_key = PC1(keyvec1, pid, False) - temp_key_sum = sum(map(ord,temp_key)) & 0xff + def parseDRM(self, data, count, pidlist): found_key = None - for i in xrange(count): - verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) - cookie = PC1(temp_key, cookie) - ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) - if verification == ver and cksum == temp_key_sum and (flags & 0x1F) == 1: - found_key = finalkey + keyvec1 = "\x72\x38\x33\xB0\xB4\xF2\xE3\xCA\xDF\x09\x01\xD6\xE2\xE0\x3F\x96" + for pid in pidlist: + bigpid = pid.ljust(16,'\0') + temp_key = PC1(keyvec1, bigpid, False) + temp_key_sum = sum(map(ord,temp_key)) & 0xff + found_key = None + for i in xrange(count): + verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) + if cksum == temp_key_sum: + cookie = PC1(temp_key, cookie) + ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) + if verification == ver and (flags & 0x1F) == 1: + found_key = finalkey + break + if found_key != None: break if not found_key: # Then try the default encoding that doesn't require a PID + pid = "00000000" temp_key = keyvec1 temp_key_sum = sum(map(ord,temp_key)) & 0xff for i in xrange(count): verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) - cookie = PC1(temp_key, cookie) - ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) - if verification == ver and cksum == temp_key_sum: - found_key = finalkey - break - return found_key - - def __init__(self, data_file, pid): - if len(pid)==10: - if checksumPid(pid[0:-2]) != pid: - raise DrmException("invalid PID checksum") - pid = pid[0:-2] - elif len(pid)==8: - print "PID without checksum given. With checksum PID is "+checksumPid(pid) - else: - raise DrmException("Invalid PID length") - - self.data_file = data_file - header = data_file[0:72] - if header[0x3C:0x3C+8] != 'BOOKMOBI': - raise DrmException("invalid file format") - self.num_sections, = struct.unpack('>H', data_file[76:78]) + if cksum == temp_key_sum: + cookie = PC1(temp_key, cookie) + ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) + if verification == ver: + found_key = finalkey + break + return [found_key,pid] - self.sections = [] - for i in xrange(self.num_sections): - offset, a1,a2,a3,a4 = struct.unpack('>LBBBB', data_file[78+i*8:78+i*8+8]) - flags, val = a1, a2<<16|a3<<8|a4 - self.sections.append( (offset, flags, val) ) - - sect = self.loadSection(0) - records, = struct.unpack('>H', sect[0x8:0x8+2]) - mobi_length, = struct.unpack('>L',sect[0x14:0x18]) - mobi_version, = struct.unpack('>L',sect[0x68:0x6C]) - extra_data_flags = 0 - print "MOBI header version = %d, length = %d" %(mobi_version, mobi_length) - if (mobi_length >= 0xE4) and (mobi_version >= 5): - extra_data_flags, = struct.unpack('>H', sect[0xF2:0xF4]) - print "Extra Data Flags = %d" %extra_data_flags - if mobi_version < 7: - # multibyte utf8 data is included in the encryption for mobi_version 6 and below - # so clear that byte so that we leave it to be decrypted. - extra_data_flags &= 0xFFFE - - crypto_type, = struct.unpack('>H', sect[0xC:0xC+2]) + def processBook(self, pidlist): + crypto_type, = struct.unpack('>H', self.sect[0xC:0xC+2]) if crypto_type == 0: print "This book is not encrypted." + return self.data_file + if crypto_type == 1: + raise DrmException("Cannot decode Mobipocket encryption type 1") + if crypto_type != 2: + raise DrmException("Cannot decode unknown Mobipocket encryption type %d" % crypto_type) + + goodpids = [] + for pid in pidlist: + if len(pid)==10: + if checksumPid(pid[0:-2]) != pid: + print "Warning: PID " + pid + " has incorrect checksum, should have been "+checksumPid(pid[0:-2]) + goodpids.append(pid[0:-2]) + elif len(pid)==8: + goodpids.append(pid) + + # calculate the keys + drm_ptr, drm_count, drm_size, drm_flags = struct.unpack('>LLLL', self.sect[0xA8:0xA8+16]) + if drm_count == 0: + raise DrmException("Not yet initialised with PID. Must be opened with Mobipocket Reader first.") + found_key, pid = self.parseDRM(self.sect[drm_ptr:drm_ptr+drm_size], drm_count, goodpids) + if not found_key: + raise DrmException("No key found. Most likely the correct PID has not been given.") + + if pid=="00000000": + print "File has default encryption, no specific PID." else: - if crypto_type == 1: - raise DrmException("cannot decode Mobipocket encryption type 1") - if crypto_type != 2: - raise DrmException("unknown encryption type: %d" % crypto_type) - - # calculate the keys - drm_ptr, drm_count, drm_size, drm_flags = struct.unpack('>LLLL', sect[0xA8:0xA8+16]) - if drm_count == 0: - raise DrmException("no PIDs found in this file") - found_key = self.parseDRM(sect[drm_ptr:drm_ptr+drm_size], drm_count, pid) - if not found_key: - raise DrmException("no key found. maybe the PID is incorrect") - - # kill the drm keys - self.patchSection(0, "\0" * drm_size, drm_ptr) - # kill the drm pointers - self.patchSection(0, "\xff" * 4 + "\0" * 12, 0xA8) - # clear the crypto type - self.patchSection(0, "\0" * 2, 0xC) - - # decrypt sections - print "Decrypting. Please wait . . .", - new_data = self.data_file[:self.sections[1][0]] - for i in xrange(1, records+1): - data = self.loadSection(i) - extra_size = getSizeOfTrailingDataEntries(data, len(data), extra_data_flags) - if i%100 == 0: - print ".", - # print "record %d, extra_size %d" %(i,extra_size) - new_data += PC1(found_key, data[0:len(data) - extra_size]) - if extra_size > 0: - new_data += data[-extra_size:] - #self.patchSection(i, PC1(found_key, data[0:len(data) - extra_size])) - if self.num_sections > records+1: - new_data += self.data_file[self.sections[records+1][0]:] - self.data_file = new_data - print "done" - - def getResult(self): + print "File is encoded with PID "+checksumPid(pid)+"." + + # kill the drm keys + self.patchSection(0, "\0" * drm_size, drm_ptr) + # kill the drm pointers + self.patchSection(0, "\xff" * 4 + "\0" * 12, 0xA8) + # clear the crypto type + self.patchSection(0, "\0" * 2, 0xC) + + # decrypt sections + print "Decrypting. Please wait . . .", + new_data = self.data_file[:self.sections[1][0]] + for i in xrange(1, self.records+1): + data = self.loadSection(i) + extra_size = getSizeOfTrailingDataEntries(data, len(data), self.extra_data_flags) + if i%100 == 0: + print ".", + # print "record %d, extra_size %d" %(i,extra_size) + new_data += PC1(found_key, data[0:len(data) - extra_size]) + if extra_size > 0: + new_data += data[-extra_size:] + if self.num_sections > self.records+1: + new_data += self.data_file[self.sections[self.records+1][0]:] + self.data_file = new_data + print "done" return self.data_file def getUnencryptedBook(infile,pid): - sys.stdout=Unbuffered(sys.stdout) - data_file = file(infile, 'rb').read() - strippedFile = DrmStripper(data_file, pid) - return strippedFile.getResult() + if not os.path.isfile(infile): + raise DrmException('Input File Not Found') + book = MobiBook(infile) + return book.processBook([pid]) + +def getUnencryptedBookWithList(infile,pidlist): + if not os.path.isfile(infile): + raise DrmException('Input File Not Found') + book = MobiBook(infile) + return book.processBook(pidlist) def main(argv=sys.argv): - sys.stdout=Unbuffered(sys.stdout) print ('MobiDeDrm v%(__version__)s. ' 'Copyright 2008-2010 The Dark Reverser.' % globals()) if len(argv)<4: print "Removes protection from Mobipocket books" print "Usage:" - print " %s " % sys.argv[0] + print " %s " % sys.argv[0] return 1 else: infile = argv[1] outfile = argv[2] - pid = argv[3] + pidlist = argv[3].split(',') try: - stripped_file = getUnencryptedBook(infile, pid) + stripped_file = getUnencryptedBookWithList(infile, pidlist) file(outfile, 'wb').write(stripped_file) except DrmException, e: print "Error: %s" % e diff --git a/Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/scrolltextwidget.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/scrolltextwidget.py similarity index 100% rename from Kindle_Mobi_Tools/K4_Mobi_DeDRM_Combined_Tool/lib/scrolltextwidget.py rename to DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/scrolltextwidget.py diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/stylexml2css.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/stylexml2css.py new file mode 100644 index 0000000..73f798f --- /dev/null +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/stylexml2css.py @@ -0,0 +1,243 @@ +#! /usr/bin/python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab +# For use with Topaz Scripts Version 2.6 + +import csv +import sys +import os +import getopt +from struct import pack +from struct import unpack + + +class DocParser(object): + def __init__(self, flatxml, fontsize, ph, pw): + self.flatdoc = flatxml.split('\n') + self.fontsize = int(fontsize) + self.ph = int(ph) * 1.0 + self.pw = int(pw) * 1.0 + + stags = { + 'paragraph' : 'p', + 'graphic' : '.graphic' + } + + attr_val_map = { + 'hang' : 'text-indent: ', + 'indent' : 'text-indent: ', + 'line-space' : 'line-height: ', + 'margin-bottom' : 'margin-bottom: ', + 'margin-left' : 'margin-left: ', + 'margin-right' : 'margin-right: ', + 'margin-top' : 'margin-top: ', + 'space-after' : 'padding-bottom: ', + } + + attr_str_map = { + 'align-center' : 'text-align: center; margin-left: auto; margin-right: auto;', + 'align-left' : 'text-align: left;', + 'align-right' : 'text-align: right;', + 'align-justify' : 'text-align: justify;', + 'display-inline' : 'display: inline;', + 'pos-left' : 'text-align: left;', + 'pos-right' : 'text-align: right;', + 'pos-center' : 'text-align: center; margin-left: auto; margin-right: auto;', + } + + + # find tag if within pos to end inclusive + def findinDoc(self, tagpath, pos, end) : + result = None + docList = self.flatdoc + cnt = len(docList) + if end == -1 : + end = cnt + else: + end = min(cnt,end) + foundat = -1 + for j in xrange(pos, end): + item = docList[j] + if item.find('=') >= 0: + (name, argres) = item.split('=',1) + else : + name = item + argres = '' + if name.endswith(tagpath) : + result = argres + foundat = j + break + return foundat, result + + + # return list of start positions for the tagpath + def posinDoc(self, tagpath): + startpos = [] + pos = 0 + res = "" + while res != None : + (foundpos, res) = self.findinDoc(tagpath, pos, -1) + if res != None : + startpos.append(foundpos) + pos = foundpos + 1 + return startpos + + + def process(self): + + classlst = '' + csspage = '.cl-center { text-align: center; margin-left: auto; margin-right: auto; }\n' + csspage += '.cl-right { text-align: right; }\n' + csspage += '.cl-left { text-align: left; }\n' + csspage += '.cl-justify { text-align: justify; }\n' + + # generate a list of each \n' - final += '\n' - in_tags = [] - def makeText(s): - s = s.replace('&', '&') - #s = s.replace('"', '"') - s = s.replace('<', '<') - s = s.replace('>', '>') - s = s.replace('\n', '
\n') - return s - while True: - r = self.next() - if not r: - break - text, cmd, attr = r - if text: - final += makeText(text) - if cmd: - def getTag(ti, end): - cmd, attr = ti - r = self.html_tags[cmd][end] - if type(r) != str: - r = r(attr) - return r - if cmd in self.html_tags: - pair = (cmd, attr) - if cmd not in [a for (a,b) in in_tags]: - final += getTag(pair, False) - in_tags.append(pair) - else: - j = len(in_tags) - while True: - j = j - 1 - final += getTag(in_tags[j], True) - if in_tags[j][0] == cmd: - break - del in_tags[j] - while j < len(in_tags): - final += getTag(in_tags[j], False) - j = j + 1 - - if cmd in self.html_one_tags: - final += self.html_one_tags[cmd] - if cmd == 'm': - unquotedimagepath = "images/" + attr - imagepath = urllib.quote( unquotedimagepath ) - final += '' % imagepath - if cmd == 'Q': - final += ' ' % attr - if cmd == 'C0': - final += '' % attr - if cmd == 'C1': - final += '' % attr - if cmd == 'C2': - final += '' % attr - if cmd == 'C3': - final += '' % attr - if cmd == 'C4': - final += '' % attr - if cmd == 'a': - final += self.pml_chars.get(attr, '&#%d;' % attr) - if cmd == 'U': - final += '&#%d;' % attr - final += '\n' - # while True: - # s = final.replace('
\n
\n
\n', '
\n
\n') - # if s == final: - # break - # final = s - s = final.replace('
','\n') - final = s - return final - -def convertEreaderToHtml(infile, name, cc, outdir): - if not os.path.exists(outdir): - os.makedirs(outdir) - sect = Sectionizer(infile, 'PNRdPPrs') - er = EreaderProcessor(sect.loadSection, name, cc) - - if er.getNumImages() > 0: - imagedir = "images/" - imagedirpath = os.path.join(outdir,imagedir) - if not os.path.exists(imagedirpath): - os.makedirs(imagedirpath) - for i in xrange(er.getNumImages()): - name, contents = er.getImage(i) - file(os.path.join(imagedirpath, name), 'wb').write(contents) - - pml_string = er.getText() - pmlfilename = bookname + ".pml" - file(os.path.join(outdir, pmlfilename),'wb').write(pml_string) - - bkinfo = er.getBookInfo() - - pml = PmlConverter(pml_string, bkinfo) - htmlfilename = bookname + ".html" - file(os.path.join(outdir, htmlfilename),'wb').write(pml.process()) - - # ts = er.getExpandedTextSizesData() - # file(os.path.join(outdir, 'xtextsizes.dat'), 'wb').write(ts) - - cv = er.getChapterNamePMLOffsetData() - file(os.path.join(outdir, 'chapters.dat'), 'wb').write(cv) - - # lv = er.getLinkNamePMLOffsetData() - # file(os.path.join(outdir, 'links.dat'), 'wb').write(lv) - - -def main(argv=None): - global bookname - if argv is None: - argv = sys.argv - - print "eReader2Html v%s. Copyright (c) 2008 The Dark Reverser" % __version__ - - if len(argv)!=4 and len(argv)!=5: - print "Converts DRMed eReader books to PML Source and HTML" - print "Usage:" - print " ereader2html infile.pdb [outdir] \"your name\" credit_card_number " - print "Note:" - print " if ommitted, outdir defaults based on 'infile.pdb'" - print " It's enough to enter the last 8 digits of the credit card number" - else: - if len(argv)==4: - infile, name, cc = argv[1], argv[2], argv[3] - outdir = infile[:-4] + '_Source' - elif len(argv)==5: - infile, outdir, name, cc = argv[1], argv[2], argv[3], argv[4] - bookname = os.path.splitext(os.path.basename(infile))[0] - - try: - print "Processing..." - import time - start_time = time.time() - convertEreaderToHtml(infile, name, cc, outdir) - end_time = time.time() - search_time = end_time - start_time - print 'elapsed time: %.2f seconds' % (search_time, ) - print 'output in %s' % outdir - print "done" - except ValueError, e: - print "Error: %s" % e - -if __name__ == "__main__": - #import cProfile - #command = """sys.exit(main())""" - #cProfile.runctx( command, globals(), locals(), filename="cprofile.profile" ) - - sys.exit(main()) \ No newline at end of file diff --git a/eReader_PDB_Tools/lib/pycrypto_des.py b/eReader_PDB_Tools/lib/pycrypto_des.py new file mode 100644 index 0000000..81502c8 --- /dev/null +++ b/eReader_PDB_Tools/lib/pycrypto_des.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab + + +def load_pycrypto(): + try : + from Crypto.Cipher import DES as _DES + except: + return None + + class DES(object): + def __init__(self, key): + if len(key) != 8 : + raise Error('DES improper key used') + self.key = key + self._des = _DES.new(key,_DES.MODE_ECB) + def desdecrypt(self, data): + return self._des.decrypt(data) + def decrypt(self, data): + if not data: + return '' + i = 0 + result = [] + while i < len(data): + block = data[i:i+8] + processed_block = self.desdecrypt(block) + result.append(processed_block) + i += 8 + return ''.join(result) + return DES + diff --git a/eReader_PDB_Tools/lib/python_des.py b/eReader_PDB_Tools/lib/python_des.py index c5bb204..cfb4f59 100644 --- a/eReader_PDB_Tools/lib/python_des.py +++ b/eReader_PDB_Tools/lib/python_des.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python +# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab import sys ECB = 0

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 J9PR#g_8)5^#vlLy diff --git a/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py b/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py index 91d472f..e0a8da7 100644 --- a/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py +++ b/Calibre_Plugins/ignobleepub_plugin/ignobleepub_plugin.py @@ -44,7 +44,7 @@ # 0.1.0 - Initial release # 0.1.1 - Allow Windows users to make use of openssl if they have it installed. # - Incorporated SomeUpdates zipfix routine. - +# 0.1.2 - bug fix for non-ascii file names in encryption.xml """ Decrypt Barnes & Noble ADEPT encrypted EPUB books. @@ -209,6 +209,7 @@ class Decryptor(object): enc('CipherReference')) for elem in encryption.findall(expr): path = elem.get('URI', None) + path = path.encode('utf-8') if path is not None: encrypted.add(path) @@ -266,7 +267,7 @@ class IgnobleDeDRM(FileTypePlugin): Credit given to I <3 Cabbages for the original stand-alone scripts.' supported_platforms = ['linux', 'osx', 'windows'] author = 'DiapDealer' - version = (0, 1, 1) + version = (0, 1, 2) minimum_calibre_version = (0, 6, 44) # Compiled python libraries cannot be imported in earlier versions. file_types = set(['epub']) on_import = True @@ -279,16 +280,10 @@ class IgnobleDeDRM(FileTypePlugin): from PyQt4.Qt import QMessageBox from calibre.constants import iswindows, isosx - # Add the included pycrypto import directory for Windows users. - pdir = 'windows' if iswindows else 'osx' if isosx else 'linux' - ppath = os.path.join(self.sys_insertion_path, pdir) - sys.path.append(ppath) - AES, AES2 = _load_crypto() if AES == None or AES2 == None: # Failed to load libcrypto or PyCrypto... Adobe Epubs can't be decrypted.' - sys.path.remove(ppath) raise IGNOBLEError('IgnobleEpub - Failed to load crypto libs.') return @@ -317,7 +312,6 @@ class IgnobleDeDRM(FileTypePlugin): # Get name and credit card number from Plugin Customization if not userkeys and not self.site_customization: # Plugin hasn't been configured... do nothing. - sys.path.remove(ppath) raise IGNOBLEError('IgnobleEpub - No keys found. Plugin not configured.') return @@ -330,7 +324,6 @@ class IgnobleDeDRM(FileTypePlugin): name, ccn = i.split(',') keycount += 1 except ValueError: - sys.path.remove(ppath) raise IGNOBLEError('IgnobleEpub - Error parsing user supplied data.') return @@ -360,7 +353,6 @@ class IgnobleDeDRM(FileTypePlugin): if result == 1: print 'IgnobleEpub: Not a B&N Adept Epub... punting.' of.close() - sys.path.remove(ppath) return path_to_ebook break @@ -369,7 +361,6 @@ class IgnobleDeDRM(FileTypePlugin): if result == 0: print 'IgnobleEpub: Encryption successfully removed.' of.close() - sys.path.remove(ppath) return of.name break @@ -379,7 +370,6 @@ class IgnobleDeDRM(FileTypePlugin): # Something went wrong with decryption. # Import the original unmolested epub. of.close - sys.path.remove(ppath) raise IGNOBLEError('IgnobleEpub - Ultimately failed to decrypt.') return diff --git a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/AES.pyd b/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/AES.pyd deleted file mode 100644 index 46a60a5c5418316685cf5687f376864d18c33cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31744 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 I-?YI01C5gb`v3p{ diff --git a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/__init__.py b/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/__init__.py deleted file mode 100644 index d8ceed9..0000000 --- a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/Cipher/__init__.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Secret-key encryption algorithms. - -Secret-key encryption algorithms transform plaintext in some way that -is dependent on a key, producing ciphertext. This transformation can -easily be reversed, if (and, hopefully, only if) one knows the key. - -The encryption modules here all support the interface described in PEP -272, "API for Block Encryption Algorithms". - -If you don't know which algorithm to choose, use AES because it's -standard and has undergone a fair bit of examination. - -Crypto.Cipher.AES Advanced Encryption Standard -Crypto.Cipher.ARC2 Alleged RC2 -Crypto.Cipher.ARC4 Alleged RC4 -Crypto.Cipher.Blowfish -Crypto.Cipher.CAST -Crypto.Cipher.DES The Data Encryption Standard. Very commonly used - in the past, but today its 56-bit keys are too small. -Crypto.Cipher.DES3 Triple DES. -Crypto.Cipher.XOR The simple XOR cipher. -""" - -__all__ = ['AES', 'ARC2', 'ARC4', - 'Blowfish', 'CAST', 'DES', 'DES3', - 'XOR' - ] - -__revision__ = "$Id$" - - diff --git a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/__init__.py b/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/__init__.py deleted file mode 100644 index d596e4f..0000000 --- a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Python Cryptography Toolkit - -A collection of cryptographic modules implementing various algorithms -and protocols. - -Subpackages: -Crypto.Cipher Secret-key encryption algorithms (AES, DES, ARC4) -Crypto.Hash Hashing algorithms (MD5, SHA, HMAC) -Crypto.Protocol Cryptographic protocols (Chaffing, all-or-nothing - transform). This package does not contain any - network protocols. -Crypto.PublicKey Public-key encryption and signature algorithms - (RSA, DSA) -Crypto.Util Various useful modules and functions (long-to-string - conversion, random number generation, number - theoretic functions) -""" - -__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util'] - -__version__ = '2.3' # See also below and setup.py -__revision__ = "$Id$" - -# New software should look at this instead of at __version__ above. -version_info = (2, 1, 0, 'final', 0) # See also above and setup.py - diff --git a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/pct_warnings.py b/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/pct_warnings.py deleted file mode 100644 index 2a5716c..0000000 --- a/Calibre_Plugins/ignobleepub_plugin/windows/Crypto/pct_warnings.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: ascii -*- -# -# pct_warnings.py : PyCrypto warnings file -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -# -# Base classes. All our warnings inherit from one of these in order to allow -# the user to specifically filter them. -# - -class CryptoWarning(Warning): - """Base class for PyCrypto warnings""" - -class CryptoDeprecationWarning(DeprecationWarning, CryptoWarning): - """Base PyCrypto DeprecationWarning class""" - -class CryptoRuntimeWarning(RuntimeWarning, CryptoWarning): - """Base PyCrypto RuntimeWarning class""" - -# -# Warnings that we might actually use -# - -class RandomPool_DeprecationWarning(CryptoDeprecationWarning): - """Issued when Crypto.Util.randpool.RandomPool is instantiated.""" - -class ClockRewindWarning(CryptoRuntimeWarning): - """Warning for when the system clock moves backwards.""" - -class GetRandomNumber_DeprecationWarning(CryptoDeprecationWarning): - """Issued when Crypto.Util.number.getRandomNumber is invoked.""" - -# By default, we want this warning to be shown every time we compensate for -# clock rewinding. -import warnings as _warnings -_warnings.filterwarnings('always', category=ClockRewindWarning, append=1) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin.zip b/Calibre_Plugins/ineptepub_plugin.zip index 562923be8eede92e83973507fa33f04ec3eaca62..a0047a7d40c30616167e7589a9d472377962d7f7 100644 GIT binary patch literal 10855 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 literal 83396 zcmaI6V{k1@6eSwnBsaG06Wex9Y+EE zs~R<$>Yne4Tyh7$<6k~FyorC3`9p+C7p`1+Fj=Gd-etymaHn@a?3uesG=+`tMb#<5 z&n6G-g=npEiZx~EBHbgYqLlCVi(}Oi)&aV+L|4wV6EAo;WYEkM>#+-{_g#f9++e(# zM3D*0*%C5H4iB5^a$Xgl+`3 z2^o`GhONR0bBE_ik2)f!^qKAMrv$47+o2IO1LA1!?ic`0WG%)yffxwI4sY#z&dq3e zk8YYJV>ca(2=DlM@%HQUZSV6F!r|T!cGvh_@G___CGT{e3skPfitCOVC;|&Nrrl8| zk!_da=_}`q04W%?8l(QpUdTU+2BZTL-m=!UrCAU3a*CW+BP%NyRIKM7bwf{h0-;bU zhzJ6^pVmIUU_9qcje(nN^80X}d+X=w63if^u&eX75V|9H}$&bl-c__#IfcsNFNl816g!&2A7t+Kie#`WahsZJsQv9&{(kyspM6;VrW=SwWB2u+dauob* z>#iVFR6)iOV=|W~5wj`bEEp|vAw3Zo`i{6)E~xbT_CIDxU3b}IY+~0(TwAoK6Ihcr;u+{wg? z-{p4@2Wyh~M;US!iKnxCeQBI*+CsB(XJ3jTq})c^%^4?r$Py9vx!}z<9aJFwWSv>D zS@zNjOrcF42qZuQdmb9no@q2s*6!f$I0AgSoxKZ57_HVwx}fsCa^pS#&MZ@$4n zyfVe-;jc?3l-{GHalI1>{$>Q->&LGNr>*%WrU+(8GeLc46^b7hPhZY@1Yb_~!bW>B zNeZ)=p8W5Qp+Acnf{({&Lw{NXWlvf4#$sTk`|=HaW(??fRXqXH z%Hh6~mm}WeRB!6h<~gJ66@|O{%95do_;R)}h!nJo@-MZ%{Z~qza3^Px_zOIfPj|Q` z?L0*@am`k67M>2?jeczPav)FEq?bOFPdPR^usA2M7UD4tU*CK;UIh+{mR#*^ zst7PI7Ye55Bzf4kW{Lk05ljAVxgX9tO*P`h64%6wok-H^MYz_kB$3@QJ*+*mXuXIe z+m@!|V{^#W8uew)&R{$y4A1y8;X&1vVNM>Lo2h^<7qn(5)t_Gg^zH!6 z#xZLw=lJ@f(oe0;EZ$oOI7tL+XU0=^If;3Bd672Gbo#pKWJ+w%Gv-kHXw~3b1UFT_ zh&X)6dD>eF*-&6?v2hMgep7_C#8=#bq>@9hrW~C5$ZeC3eyH}Dl}mKqJ3*fv=uV?E za9BJWs(i-%Z9tZ@m`>_akI4{^ofw8 z5-SbPJ#3$KN6OW1ovp1twVa7rsJIEe{>E?W*Ypctgp|vNtz&&`)>)W|UjzCKF|`yR zJQ^{O-qKlFT2LpYr6cM=E{ITpMj(vzl$acNzPOM@h}-TC8EfA?h-3C^4Qd{FcwiG> zQ?uwChw6Oy>{2@KVFE97XhjT;pLjCp*bHrOtXKr!^-y=io>I7escd!h%>DH=!Lr7i zRTtZOiBHul!Ay?*!2a^GhKh#_8*Xx|9GPc^b~d-nDi1VeEw+-&+Epc2j(%ICu@7+> z3n7or6|$nmRV=V)ypFW5L)w)yU2+mBs_~kc<_eUzNIEW$L9W2=<8*>Pa)fKH`=-X@ zBGM9ihC(<_OfsP>Ick9*GbaPY9T%@g*@$0+Av*A}Z^^Wf6hhtjuG8?uwZTWlYaBy9 znt^{nvvy`HPI2g*urB`$E^tzX2Dln-m zof$&z19d_hkxju+DUR}3&bBOCLrI_tC05x&!6yWd)kD{7U! z6vJGpo3<3fe>dXS;r{m`RU4h@_yJ6WK8L~He|hMELhR@a`-H8`#H=ea$|@Xk=i4;- zXuGV6v)p@ic>Q`Hbl+rQvYP_b_QvKUvt+_FX2|mafCk6i;8iwF%iy}xz$LX(UZfjp zFZ2;eIGvPGq!r_A1`Ss{*z88wf#JZZd3p@B7ob{vnC1pNxa+*T5F~qmR$waPhC3W2 zFDOT-5veNLYA0*vDeU@K>d*Kb1?#mw8jd@>UXg0~P7n+Z^-fZk-93XuYd%K@;pet; zGT`5|5(JIXG2)#%iTgYYcx9u}><}i!EJ?1#vJUdh3zn#-zASP%Kqm|G!#~#HTui&380C=2!rWA_qT;MEz1H_K|8CD?*Eos~FfFLI?;&^R+5;n0sJBd(R%X;QV$VDo4Uv(r z;D=jC$#h`}_hwjX?&N7Z#@Q5+0?E8jNA7&K?uHiYPxxU8eo=PtK#fmzK=hC10fCD^ z)iU9c?|A;IHw)7hzj?9^^%6TZ$|=(+T2gBO+O}n1k`3Uyr;wO%1Zjkz1@y8|bt~^y z4T_LIP|}*=>*(vqOxILdwK<+Qr96Y+Wyu#5Z23XjnV>~`TFBZbEp_X^1+uhY>3ak( z9@SnWbVD)x3Y5`7L(m(p{(9q_Nsq&MKtN1TK?PCT1{j97!pZkR5Q{-(_$$pJ!-hG!A*zgB!I;?;+tlgS0U=oM>5tB+y5(ZMG{+(!+;F zkwUDL=l5%d!SKf!6m1z;P#%?y6cSL7LZbRqE~Z*rAzfBwv4<9*&iV{kSv9w+u4tc` zC4g2})~$RmNTcgP{VqVKAWmwFCy|~wK{sSo%QmQV0YAAt=F)uXkR4K~XZOJ^ucBAQ zg?Ava>(fTivr1q4{l!S_->^b{{|HnhJOoRtZT5?p4C4z- zzM&&>PhBV+i9;{z9}Fr@x*gSC@#PlCPIA7X)!BhX5*HCJs*Jb8#`v6jr~GuW@e>Fb z>@$QLHO1H){IHHaUwJ8`UxTTmT25A634*JyEXNb8r0OT9p*X^8SPU|yuOdW|??yu= z@xCK=v6T~nrs&9n*!U)W`npriGUWMn$i&HRCsM&pPf8$9Sw)y2+`Mxq;$Fw^mdGSs zL*|#q%zBG^2x2&!5=kq#mBfM}iTnlO3Js}eqAR3%BSZ~M#$zW`9H0}Vc6$t;B^v4e zQi(=+9p;2$o~!6kYYtHp=p!0`iN4u-*5qdl=I$B+Bl$k(5jTP|%cxe0qsw@(JF*vKVeZAkW+} zqk3K#Zz>@ijWVw2FPU+eY(=!;J6=+tFoY-;3jt0UCu^S8zF5(MiPP zw5fxbv?LAW-{ee*mvTW)^*|sA(GV9Dru&q=2b{;4i6TYdT7{e=7GT0vPH3wsMw}8<+uau!eNL#RURYI>#6PxY^?L|0;?(j6G3afY(G9!D&9J^E zq4nUl9dJsIQO(PhK9#O^=X>I&?8vUH1d|75obb3Lb%)S4$U1wl`^jt_k5M$JD$)+w z?+HUVqQB`aRBsMi>e7?_aNBYX$!u2X(g;vuzZto}Ai{}_m$iSgX^Y_<`{H98%wH~)}09H2%Ac2 z%H7Y{6nJ}&n?yrK@Y0sEwjI3(sO*N>nzexcZdzJc3YB$5OHE#tv1*4zm$Yr}Nnk|s|cg*Q<& zi4P0~i`}G>x^_ekcB><`MluS^4(y7{LU+k56TBZ( zH`V*+znhVo9wCS{Byxm-l+`Fcs@#^b5abOMs^KdtQevVaghhLfdnA@URXk#fQ~fS5 z;-E1s$R8PMG+bKE|0l{tabDz+zHQc5rIsU3A|Iz$$KD}M%(Zu%@cDP!WrjBu$b)X3 zO1znG8@I9#K}SPRSV@sMxuOyo4@v7J=$OzTrLs+yNb(mQ+(y|bj{N9KICZI56m5D{ zhns?&^3-hZ&$`YLqv>g$)v-r_TsN|!8i)yH0$PSpWChZy*)I&#!F-h6K*Yhd%t|I7 zea(w>EoQM@vWZ)cDGI89imRN2k@kUbR1e3yjyZaUL!Z%tfd?|oWOskLUYeG_&=UjT z={O;2l#fx9@w{o4)!txzT+U~h?MzaJ$-D&>rr?~k)=LEiMFNxX7TFXP%Q_U&Z#FP& z2A4bi&IJ50uZ@DYp2=8Vf*o-aK_ow%qZCrsndcErrH}=p4}%l8@e9AyCZu)O3Bfi& zxjy>JN~2()_1Sg+IQP}IyXEI)UfZSH28`|>SFKQ#%|gFY4<9P&*f@#Ehfj8V`w%Ai zLI@@sO#t40dKi+nJD7VY?-+Qp{MKMEq>WJEJL;s&U|eX^sVB9AUlP*>d3_J6w)BbT z=Nw^`waI-X<$l5dGizJi8iC+5=})}yT)COAiAoO415_6uX5Y8-Q%moD4Yb~0V0ee{ z`>a4mjlnoS9q}AmWAUr$g> zO(R@E3K%^+IFn26jj~7H)vZK?}a`UE$t;P55b!YxJ{59CX^>{*e(gnwx0H zeZi!?nji);xf5T($bg5!_cbhZ(2IwsbA#t&BM&jnElXhU)&lLY-SM7tB4H9=K#n|; ziPsmiH0okc9JnOmH67<~nlvFh zyJ$lM5TYeZ?r9{eK^_ZWOm*4e#Nd>JQB4ynABwxWR^tc(okiY+{R|zMG7JCobrj_T|Jik z?1y)oI_swDQ*knbdl*)pDi= zcE}oMEw0ltrzHGwj&zs8q7gmGjweENB5hzkv^y z2Wk@=AZiXT+%!_0lahIhq`ODs0TZYz4i5Vi1Z5ilc5LFkrvVACeAcFzvR`wIh?p~9 zdRHa6oIXdE3!9YU$Z`tTl*8&Yh69A8n}DVjCj%=mZj^6)YMQD@>qX+pTtzF2@^QCB zF{m@wGH84h8ovN1sjhHm!OGVyGInsEO&D2Ml@*WB3*AWAQ@b5tm*G218_!!?W(T6f zV2i^2?MR|jWbR&2O~ErY*r0B=xow@j62P8ctbbYC{(d(nyn-L1s0r|81)E4v3FbvB z*I9B=|6&(XznfZF!pb{3^YUDzYaK=?3{hl6d9^0nFHC+5dP^5C#Mtne8z_2cj7)j2vIt12^DQJA ziyd*w)Gr&9K;;Re@(}LeOFn&rUI~GtazGBZj+<8H>*RQJs;1{su#`)pDH0f7jhgWa zUAt0fZZSE)9^fUJF4Ll86x^Jl4w*DiPue$Wm%S2$h4g+1F(${yf~@V0;M=w;1#?R* z+ti=#p-o>T@h|?}cj{0$DxovxSgs=8Ic9)q30l5MV%fgNz@~G07?=PkN4kSR+y=^7wvNl7GK2E-sJVRX7{sO4&6vMKFEw=jM!%)pzyH zj-`_r?_FXlZDU>Lhm!D4DT(>~PFU`SeFDx5N3&|`%LH|uXr0H3EXn8o3w~^|_D48@ zL~5hp(G9Ovt+i!6Df~wjx zBiPH&Yzi)dg%T>Cr+bk>22mDXXLP2EPvvjuf0B|%JRDa-ZHNU4W(F38eT#pds6a;# z#IUBCP!J>SJKV*8PryDdV^UK*?b*s((*<5$t03;qYZ>ubVZ49hS5gUY*=}%vm&H0L z^Rbpg@XZ=+KWfwg0$PmMRkW|p+>6C-)akQU^7ZhpuYEl0O8%^XLd{6DE3Mnxjo$aH zdVD?}akE>r+W#ab2f9>3f=1`M_a6-1_Z4&HzCXQBjjalN@4IupdL?R*w-jGv!-e2~ zQeFgl;{Su3a7mcj95F=y4sv3->}wxREq#b)R6)?}l1S$0B&`?dIvZ#WJgz*f(vkc3 zsdv{6#V=&hbX|csgVqh$etejKZE%@rgYS?}Y9i_TFwGe1vZNFU6hR6$tLsRs>2SXj z_GU*TWOk0lM1K{~7*jY^dox4gO7A*^ysmd_jvk?yIIzvq*UKP0|F1O;TjR{sV&XWE`Q*$ zf9|%E^9^rl)o=#hMKFH%)VBq$i=0R2i?B^n>fW35@mY}pSMo2TpDk}NKjdzn%tafm zO6ZFws`$gd}rC#|FHlj1vLr*bFi)InMWJxC{o4Hwp64OIAwDsPFndH!U*)Fxpm z1U7G})`>L)=V^p>Kz3xqm!b5h>7U@g3#dSsfKR8o{t>sO_0*21OE6#fgMMpnr$@&k zDVFdr(qKgpDW?}Jtf)j5qhw~^-hYj6y!(5$!){s8muyk1W^TZZ| z^f*mrRr6aeJEl8Ys{YZf^)HPHBTP9Eoj~RTsf!SVpohdj5^0VT#dL;UmP+j1WHdU8 z_YV z_`=barNT^|!zXrnzwl_gC2D?WB31XP4Em-No#1i-Rz0uVVbaFzk);oRo%NO@9A-Io zA+!T{C>y0L_2XTR+jz|*DjnX3Njf(TH-jHr0vHvfCX+aPffbns+eUfJ#@71l<%Jlb z-$U1&mPD#WT~Qo~?T=nGs=N7+q~bqL3WVa(62F zIa%4Ru^g|J{xV}UL`3+x)u%Zj3r48ht3`Yrk)|EQPdD$%lqD#%JkUmX|16$6de6Y|Nl;7#nJ z_T?1hrllYG+aU~hu2VYu03*Td1G`S^?>y>eYPBuIBP%b$+Cncpn}cIcE7G#5`gV{i z&zY17z;n>qR)zDrWVX_6*)#tG*EbZUcT0wZca}fFX@bY$B!?G_6WvWS>Kvrq`g!`{ z=Tlw_CQpSnBzen@S$7H7@4!b<$oR=Lspj-9*z@Zsh>}{b@jYoc@6@CD6}d;YoRANQ zh0QPG3EUa4#QE8e%<6;3>MV6|#;A^@a)!Hg`otbtx z`F`3VUKHm8oATFTppZDSARZW;mj`g+TVgwFOd$&W!mKV7O@i5$@Q0EAIwoWUXLU%*R?GDSa*?uA1T!7qt=iL`VWb z^N9+%9VFX31G4N4A$vJAlORpbJ(?H8<}d@go~LhL$PkU-`_Akcy*xJYayUo`FR+@d zOtM}xiFfhce-9_k5FGjkGl4k*CXjk`bwgy?`{fFGi}&juP9*W5aN@2`M3=ZTB__2{ zQXZ4^7ZcuMfc92{gLNtBRzB>16hRzwCg9nmeoh&7F3Zh1#EZ8pbHf5V_SiGT@hXj} zy%tKg8hO<-)VG=h!?rSp&EjO=jWzJs-Zao&da>pxyJxS92a9(m3Up6|UrUV~mLpJ3 z>l8SviJlsMXnN_gUgB ze`FciO%sylqHt$}TfFT))wt%SBE?MyG@9?_c_gM2EN7bKJS>AzS%KT0uY@i7^}ozq z_yhFQaiu%n>^n;~hNqs(oc<1Y-yD{*i@!KAkQZe>16mr<{ek^%lwV8N;$6GH+1ImJ{W4ti?)sy{X)41!AfcOW$RLp>|b_ z#3|YL4^8#tdNp!7W39>yHAZH%Y6mHNEx*R^)l&;OPdbGcK9dz}%B5{gX@ht#?RRP}@n5UFSv%~LN=?Y*9`TRIEW z2c`i+h9&1AJT9z0nc&;gG1+j~0Km1X!Ax)q05-YYaPyAx02{fJVm4$nVdT;@`ehhMYgix}Ko$OnDO^$m zqSRVL*Qg%3fs`h3#Gv^oNm-pMtJzZ)V$SPki%hWqD!zT@CSA&KrFmuR%Vnq2+$`tW zE9d0pbG!G1gLGrB(gFr5SUBILK?5zK8pi4q{fBc+rkL7>p?Fo}Qsb!F^(s~sArgmi z-exr{UqAMgZ?#(fhFBy-yz{F*cOxu~*cLpbt@(U)%;t8s=gTscR&#SpEo5Zz!Znbf z7I7+b-2?A8e!o}mnySssk}%Z7&G!9gShlK2==jDr$~k~xCHOghr*gHWlD0P#;S`m8 z{A02G0vs*k*)=8t)uMXih_17|u2!eNCQVo|HeK+dLEpz?E)4%rGx~E)FW)}N9CjOh zY#C_XDXeF+C8hkj^}cKsAUqe~wo>0hf(byoSli>!tW^jCp#L!H4tv|z9ttnH=5F`6 zI`_`abrC)%$d7tf6XK6VFI4dr*xj6N!wjL+XK%OY1|qgTocuIbX95UPc1>}V9ZJe} ztW$No21k*7&|0i?O?ZyOb^vywy+R^u_O%+lIpxp`{~=a{?|wcdPzZ?m5`ofo%5r7< zgjBRJ(&KunpEld*+l(k9)@(+57tsn20!WnghG=9-y0!_5Oa-T8G-CZx@$S z#{qY;MVk1_um%uD=}hia4qL)1T8Lh}`-0$w31*7*tc`P}8(^0FSe4P$$t-l4bFc9r z_CQ+LX`&D(P2o>R13?QRG<~SsVrHLMZ6Aj+j!eH=v1p#FL}NmSbo(B!&0wn zWiF2|;s5ZcyKcIghPqHo)h=ciV2C9Xlu(m*YfW}yKV5fw*`os4N+ICD?1+VU z`N;owIYrDorB=4*>P%T`vvqn`Q0o@4*UXnE4bUd66qoJWja`VY-L=E;C{8K6f90w) zWL76^wP$plC(*32%D)zy`FY{!tf3}1QwUUTLKWNwSh}od>DRW<-BahFLeH<-=B1(? zl1%^8p6`r!6BqB!EqY-g>--WYS#!0ldXL zFOo}?5Wt^_#-^CoJWm@jy^)9E%II2@>?60TwyH?8dRZJ^IT3ZOV)O)lz7__i5 zN?7I?p9GaFmimD1jmo!*Tg{-N>EtmPa*bhNCS` z84dmz2J_lQ2GI-0qw@(DU=HXZ;5cWpLM|AKq5@{uVc6L_V6A;H^|9SHxdBJuhet7l zuA!|}R?W919mpHGJf?|sgp?`;Q_Va}so&%FIyPKB{vH=<@Hxu;r!vLu_( zPe%dna|tLWlU3}4MY-R^1Pvy+!3phl`n% z**GcY9aqpyEUem-!k;L^YppYfanfWL3t-6bI1rOetzB}x*)cwFQ`g!1(wa{98?S$Q z?mEe4OPThZSm4Up)5dos+08lGhV-Uuzo`Jt?gE=HKUQjt*150)qXWwE_tq90Af4Wb zUNmO`qw1QN!G0mybxI&e!}UDdHVqa(l6YZy^jQw|VpZ8y+;>WHMVVQ3S?Lehei*m< z#Zz%4i&JxUx{I;d(E;yry8_5j`zlQPUAZtb40^)1A@NxUJ&-y`X%hxGhn6(IrUg`Y z=;~5BL}5``)_yQ_$Z0%0a8*2V+v1i_^hUVa+R~uN9@|lzkFa@YnIG5Q6Fq5{<`<^@ z&whQl?Cl>Ny&OVKv$fwH zG9(hJtlZxCgZAR@7sH?uVo#7y4Cm8Z{Y!+Fc7}y96+o^aMBVJVn zjQDPo>ONj*S@rsA^Y8Dyezbsw@m?bjz`Mu;$dB?W)}gXZO~R81hEvXMLwwE`W8W|2 zpE`lr$I80xz{O*#C&~^d{2lF>QamF)J%_)`w6&bm?dUzx^00m!NQk&|9`G$Lg!@hc z@2k&`$!98tzAqF4S1_IppFR4QQnmD{ELC|kH|n#o;cI)2xie*2nF&JWZ$lbZ0<|-Q z3bQAO^ou7ijZa(htj^xQzMlRf5>zb{tS{@oB%Z)j6MQTB(M90XzpT6?zF*)x_nu)x zY1C?~&VnM)FG@Xs)K%i^we>E4+WPUWt}h@U@nBGs9TW<~yjy9BlvI}?PE+5gFv9== z?o@8@0Lt4=9ht(2|wwUihi$1gVbcQdoFk=ia*2G-X$M!j87%`dcXtA+)X z7~O0%ADUi%7t6G96I|kjuYcnB+GdHgOON@-`HFDO`?GY$I|Gsj9@H%P+wR_Ud#7hS zNz4yRj{2)~`rAL73n0$rIo6K`v_1Q@s>WTZR&>!wUlxBgYt~t|HJ4r+U6k)|k?Z7@ zewXDB9=@bw6FwR+z4@34?Vvw|^Rpc5UzfwiydNe?$o^y(nxXNZ3oI$?zrVH-^2HnZ zE-0ISPCMj!+i&hXFJe2&XXmUa@6azQ?~GrRH#ZK}6wnQg@-=K0Ppo(X9~aMcjoPow zQ4_@4B%<#lhTxEcnx19CcuIz&ROWt~MtTBM!nL|U|++lOG7@D#-E zjPof5_p3~%>*SNE*{P->nTlnFVp*0p23sFxMr?*WU^zT))WcYEJ(a!B_!;oy=O?QP z=6t6!DNMu1c~H`8yv^#v4x|oll%Z@l^SZm3+@Ykig73#n>z(QqQ2 zV)XL&7GD4hpQ^6=t3un}ccz*4;>^^5Ssr2YJK0FrmarNAXro1?xP)A^$CQQ3LTUD4 z4_xr(VL?peyh^6oDXddlxJO1vPw}nh!YV-q~yWyk8rD?^5jmS-F}pajPqmuq-U6>x&!(*?LBlc;hlMXD!(Pg5>B)DqRk&I8aDw& zyDpA~#vZSYu7{u{Nr5c7yhDN;2!*~ozWFgMiE6)&aLnJ487@<0ql2m-IH2IY0GXNib>NuY; z*K-laiWu=o_&;(HUU11*VAMY)_G%`HUr|hJ+$Nq?$TYj*SuyvF5zJJB%tD_%h&qdQ zV*c!Imw(o-Fk z^0c?*vgxKj9`6~*ZT^hZII_$Dgk#TaGZZqX2lhp#hE>_|Zc&%)lu{Nl7n6&?k8N*G zZRZEKo=pQ+H#V`<<<5vq!{N&*R}{4I??h6DJOY|YyqphuMxmB<@6P1LES7hE4*QL_ zD$@h9Wvj>6uaw4pnzxl028|@uD8x0=#>&;#;|gSGM@C+rgtu|$HNJDwH$92lLnK_o zk=vOh#K2Qa+L*mr-nhc90YMvQ7Cp~t%No;IHOX2uXVXP7)W&s{X!-0#5#zTPcD-hG zVwBkyvvgWY`$o--Y{U_ccKH^*9EAn$%0ig(5gBT;+}jXqDc(+CeW@nV3mH@L(S;%p z7LP(e;QXp4pxI3Uo2M*I8JDM$C9o*)t~Fx*ewed`32)q%U}1LIzCoE5VPi-jYN-Rs zQfYb4DcAVvesofo8_94!r7Ri4QqpxL^CqQ0e&a;xRSA#&J)$yKM@2z1kpqZdAWV>p#CdO)bQu0u=tqeBaW8_#)tQm0^9?DFKMQ{Xvk3(4jE z=w-1o80Vh7Sy2+?s8cLqd5n09W-`+AZoXlXn6A7#m0eMH%=3Kje7VQYcqYt922`_W z&BEVOFXl~nR`6xHldCcNo zgPP`s_ERQ)T`o(stewGJ@gjWl3_G+8m4Hi@D{;W}s{LtOt^iVIU0iB?Ur#HPtXZU> z13HrRyIJnFWN=$fKUsMe3G-I-Q=DX+pg^ob+e*3V1M}BaB)L)n7V0gL3nDr^E1$A2 zmV3i^q)~Ttwir4qGbELTKo;_pgqtL=`F)}@{;5Br3v;wTYkRFm&v>LkN2Ea`C9#z@ z)$~T=HYc5gYads=n-Mc79w+5!*ftN!vnt=Mj=fN?09)6GGB;ZMg=(*9A?d*AdY}D` zVj<#rdHp7HpLHm6q0|CD;vt!4v^E5-2E&vmi?z8{Le|4R!#gI#ispa~uAYK~v z=_E5g)Zo5G=iFsqJAzZ^BCUG6U$lFvs28SXc~eNc`io$uV7b=jyE#VDZNw_O5mvo) zrL?Wf%C+Z@kE01XFV|rr-Ra~*F3DSG+EYt?(goaxfyDM0sUM|HpWMEQ$U_PZYzjjP ztfE-(6cumNx9n6HJIXyzCnk6J?>99A?lA0F~k8+FvO1fbrMHWZ?^ z`Jq4!&)0Ob^P6z~+P}p)k^Jzg{8^o<@>$y2;@QL4745MDSf=e_#SE^%&TzX`w%cH9zgM~ls_qAnaS zH73q3dxmBk|6nicQ7jkE_jlR=9hn~zM^v_mU!&7Wmr!UrHCpc|1#d)o6X%*I6vs5J zH-DK2)r@@`C!}R?~M8!LfFkyD_ZV4|W;2$9t%QtpMz^9kxeQB+)mO8E=528_Jszc?6lD z(gYS8K$7qbDi1983J;6Gi607$@YL6y(s_j49vkAPiXLiUhFZA09){sx4pNb8Mk(Dd zA5w&LVOkv$OP63Z99Hl7C*iWB#yrGVuUOM~PUU>cCN?uiIe*J3b2H5-mm=ejjgTgg z9$$L(3Xt5D-dPM8=PzpuO$$ZI=nM%C7SUxCRRdy0bx@nBpV3YI7}46P2)N${kkzGh zM>K?CDhpX%h2`;+>x+Sw`VuzQrPG&G*-^bV_~A`#c+k_|o&6$TATi_%tiA386>feDcZ+Oyz#;SbYZ1R<4x zQpE%-(!}+N#hxbia_4<>rL2thqG$ef&rsAQf&vh~oyAoa*ZA{Cj{UU<$wjr2Ko@VL z`DHmvyP45JJsMjSw&b#Wjl>35C7S3Ky$E+tN@}aaXcaJT79+%P5?Q)N@2NM^WI)&W z%-brCYcGBg#AdP=h%!;M>~`EinN`@HR9vvr<)8S}rdq=h5V0XJ%8jmWtUQRdaM?@i zNW4L4@=-lnqcoCO#b+7|W2VZZ#Pg)1%)2`xayeXLM5X6V!#Kw&Zpm;JN*#xcd!n1F zZYzy1GK)whxa70=qHkJ7T@@7r{=lGrs{OJ>R6F+n()~)D zidPmOf%CFF+JW%#a+2l8c|3&h3gcrG*!gaUP!eY#UhR<%z#uJx-nH4}8cf?g!e!Ja z4BYH_*Qb6b2o@i?ZIlnsy?ZM0AAY;=V!gIce4$+2Mls+E`j2DM5v#{vF@g=tq0_PD zv&c$>GwUk@9?bXs`DzLIv%i~O!H4j_RU&K0w{-q24yC{CjBuX_;B_3mxHXj?xS-)c zF$5pOEIf3;$Oh2gtSQ`jhh?xxT<5Hu__W5>ODFr4<_D^YtB-nNh)tzG?X{kbs%TXb zYoqH52s7ZU9`00i!wow2p_4v;$2ltN6rL?XTh7ns~!#?oWZ6W}rF_D@oW ztPZ(<$KGe@zVcM;RG_;-B_!9-X$E?V#wDV+urZ!;(hJD-+WiD z5GwOCNAr}|f8`iUF5`GKs-RX|WNOmOK0nH*s;hnWkK~p)2u)O_;-+`dNzqpc$&MVlLZ=0(q{ zb2;T+x@5bn1WccziqI5YU|RHU2#%=K4BW0V^FPW6jwCmM8k11{9Xzi?-|D9YzTD|q;ZH500J7cPeWVr=ZGjTci!q1(w_!gQhH8KIT{qE(x8@V zf1(alKJycAIG@6hL|DWgogyC?9q7ag7wF*WPNG5AmVXTwq)e}&(cDEE5(?bn4&mk{6}Pi{6J|mzIQSY#WVg2cN&~?^3EOp<9%3yIv~&Mw$N(t z)1x^T6Qc8xwjMc@tMOhUT1nE+qbb)=Yq+V~GZsN8tYJhj7E42$WItLGNZ6f1Gau0 zS<(n^3SLv9FoF9|(X{1*;`7CNU__+W@bK|d)nx{^0<&@_L5uq=ZwMEJ1{R@a^GPk||%ECh&{3{!i&hlWoiyXRxslPBGiP4B>%U#f{wg-he^ zyi=QV%_@qBK(a9pI(OFRx+I;q+VTR-n3b$nhmO@njMiGzIXZcUGWtDHO=$F-NVGSR zNU!ypUTGL#-^-WV<==?cm+pk$<#R)NxjNj@vdmt=nP3ebRaQg4h7V7TPEm9RpBPtN zn!7v4ZnE$<+9R*P^iIJVoHcuDjU%qFCCAdqQF2Dmk`anF7n4SrmoZ0teYQ39@rWAC zTSa)C1`f3rCu*;bR*3X`q$6aFFLO&vFppr$Jbt=7WBgA2^NY1l=CM;Ysr0f}B3B}; z2Ccr5_nXI<^*-cX`2oGjo0Pq(I%K_E)2TZZQ}H`JSz{ZYSI*f`^NuXdc=(DC*Pw{z2n(5*Zx_1&WaIG%rWC&m}~i@Os8)+DDtwwJ>&C^ znviZ9=8jBZ5*-}3F}BSQ+@lAeiM8Y#g%wmbC|Dl8Du`TYglk?en?$v-U$r~|t_^Qj zF#YMS{weSyj&r-{WH^pJ^EdR2cEPp8R7N>%Kkc3Q7t@kSMSqbQiU)eBf{rQolyjN| z|yvyq@ zUD6HG(vm|-Dm;{g!pzXk&;ty!_ToMEKK9=4@&3Q@VPegFpVxVvziZ9hJk)vp$^MfK zmA%vON`KL-;j36%vFz9LzZ+s5?-(*pI+VmMj}Oilq@HbhS=+d{oc?o11iD=8wVCke z%Gd8)tYsb{Xt+Mey8w8|iIr6c=g!WKN#NDVfk&fL1UxnK5*5cP;?fGFA-u7Z-}LE; z=^#0+sLOrfbBK&xmblwLi}hyrTsz<0R`m1jKZcri_8tB|d|i)f#&WJst`hm>ALB1( zg5{6aO#(Yy%u45YRsZd#X34qlr#=v?-bW(MC2ducLZ&O4fpWz##ow7vKG(yqF6`Ct za(Qjdep8=UN0i(57i5b+Tpa)Yg6?&XYkzkjn!WYs%J%V_^$e$C1LllWi3-?sc}PN8 z8MU0HWjo7Q&cc5~!WtN02H1bkG|UX&gyA!`CTAka0xPv|L~-Y9u->8ovFl`0qb^u7E(b69stC z$N>z_b@nobJzr=4ANZ?t-R!~KySn!;>kLbC3w5*S?`};TjTa_cxw+v}JU#a~ajR)! zajiao+x<~p^&x7pUqyBouY6=7xePOZo3h_G1zt+8iM;&NEbqaC&P)>Un+iCz13IQF zWbx>QHnmHOCLCHRiVnV2IeC(s9{>E}+0&Yuk)4h}rc-$3gvh=J0>U-a+!nkcp)S~G_b`-s#`^ip=|BxPZ8aiKY zRG`=5*~ojkn|a{!^V2AD;OA zmWwqO@xjLtxMyVkbGnl4G|h1`fHpdspN^bNxB393_(n?FC_)Tj6Kqi_A&aruYa{|x_rF#T~` zPNmu8;W`xWfgFawkIf{UjTa*Q_Hz>Yzq~iz?+){NK+m1rD&Zn!H-hR;6Ufx|4IIn9 zT=jm7!DUt$H_k~p{P(jNjduRj`R<_IT(v(Mak}mIZg{p6)oe4(-?fqj%2A!{(6lZ5CK|& z!PT&SQ2;g8zZXUduwfvSfG)Ic_t#>0RaTUFA z0$f}-Fovli03tAPk#JWmoD!hLz-a(K4EVxyn0;Dc83WMabJZHKc$U21Wu%W1ytK0cM{bTvdP+Plkm= z!fCO&AqWU=pbL<|3HQKn;sVhSI=~tWrvrpBqI7^F20;yQV<1F;00v;g3!@P=OZ^CR33MSi zaiYBl5gdINTo`AFMsVZ73lzu2bwSDT>uBUHd>{%!4Y;ELE?jOm_*V20KoHiy8%c+U z^&(hsUT8QW9v%V+f-41_T?@_w1E&V6G48a$eQZqxxTB&W01OR<;73qUBK!~rNd!JF zmk`*(xDx=cF>qR-5OWp@cw&)ZfFYJX3Q)n$L?9mHQm$9R2wU2NB*oW*9~gjkg9|s( z1t-F}_d=QQur4?;&K3ou0e8v22O);M>sq#6T0qogNSYH3lSM;6%VQ22Kv7V)hB(TsS5a zgaD8PO9Xg_-A3<|1JGVjX38kUO*|fxO9gCVU<80F1{8ia21x^qU}|VUp+3NX@|eUx zuS;m82e^at?*Rm`&7p8)INd|zm9^?07e)H3Gfz+2!@m4F1z9PaWmauq3>cKw15+)h8A=KfCh-cKnXyp z)O17H@hK>9i`!75-B3z=FA8}RpNT?3@QN6}U_cm~77BOA&P2gUaLwHSIkvP5!GmM% z0a$SLXizrAXea?b4F%TWV>FZ=pW6#(#7&~%ocL_?J|Vz?$)y2)VkCP&Cp+r`UCW{i zN`?Q8hO**eJxEIYHX1?(DiVjxt&73M4y!G%La!XIGQdjKLF zKm_Pxpftcf8cu;3>Cc!NYWN$hFglkED97kUAgFO~dXWrxcqm-|y4pyv$Vm8I z93mJX!wz&IZsBM#XW{VoSd(Dj#dkEl#&5Z=auoY;~2I$d9 zCeU{g%(#(mI0SS8DCor~usY;X02@xN2f>P4MuVTw1Pvp_KS4uj@zEIiaKIMp9)V!N z&!E9Rz=%N*0hyQ@a-jd(?IbXwL~y_BW?=>TBEXIX81T>@I16sS2Tp^7bOE<<96j)d zI2{a>95l(AP~bK;suv)|Jw}0z#1@U9!{5WYM*$94lQ6JfwDkaQuBV#h$q-?<`po-%dYPo3*gf;Ug; zM;uPTjV}tP)S3{oLNTWkpl&gd<9$b9P~$MX^6tL6)yddGcnxb#ZC zJ9a_`0)|80b;061qC>iM>6Uj>q9aWQy*x8Gd7TVW<@n@>^op2;)J_wa`C`TI1ZvP9 zvaxA=NO(7qV99T!uJb5{FY)Q&R~LSB&+KQ3j4MNaph&44epkmat|ga-JxaaKiUx=QjNI1+%D<%!xC1 zT5F}{`CI}_T;cFHEFhQc{sue>h`L{vlox||c<;Ab#wk7S@634WbnMn6b8?OP2 zwvj5GUt5U&-T(Ug2L@UiI>y&8TUYl_CL(Y*A9hYc+=Kp}rA2Rd&Y@cc75rX5n9dZ@ zSL{{rhdlI|$lHG0YzJpGKlwF?_}Anv$z$VGEc*nQXo2g;{i3Dwmz+MI^t*(cRy)00 zo8zOep&dDUv7qo@cjx69{N0O@lV=mhF}B8b^1>GZ2fKvb16G!Mes0aS37YU@g_PvW zqfXLnCx6i`T!2Q0g+{DcdQIxNoOrV7RZ$u|0ZJc7Gfp#ia<|NL@~%qtZ>#m$V{=sX zC6`2cPmuRctvmL=dKE0w%RtdHKQDz#p}?8*!UtC|NRjsAlWLZ=ljy`+heEep`5%W^ z)Ym^hZCOiY8$Ze)pZB?tis2sSoBmg5e)5M#`0738V+~nHeews$qG0#tk=J%c0Q$&2 ztTQd^lL@}Xf2!=e+Y$SW8wx)%^K)94p67K|&egl+9>}`U#t-QG9>(U14)TV}(+X&^ z=(2gh<(I!_P9mCa@9RIoetI$wCkvWYPR)yN&NZcEBIJH-dAaty(c_(GjXB?rb@qZF z_MZf8=2raeSUmT9c6QZyW$}KXV_TwJRcmuAq+G4QliPLg=y>l>ugSL6e|*P|XxM6L zom(-zHs|`H#GSUG*vaDU4l~Jj9x)BRJ}kxodyVL=-v1z)IqgY@yLnKYx$|DrtBOUk z-}he@yMNdYO!6{Lbx&>FC|Li25t#Hgnh5=?ttmadVX&9jo5YbUCA}CuDUmJCbk(=k3)m*!be^|yb((yNsSetS(3-j9Yk@z0yP7M*enFe=1KsPi zZ`|q|9X|U#sweW>|NGUuuzc4smP@bx^VyRp_|{iu3#~?()5jStxTl@~{|Uz)O)UN# zb0)p5r`xs};1N;1%egu^lLnCxErv>Tj#fZM(ntMnO~1NIN`1v;4C%%y~ z)BFBTQ4%c&y(z|p%elbG+sQ!vzj7T594E)HR=;OXKcU|$78ZpX4~`rZDvIoXENJF# zBg&1A_TAd09`Luj??qgJBZN42DuLJ?f!B78?r&Qv;Yh z<1jVXJsuVeCIv8Fb6~-6D~&;rf;}Eg4+dCBFc{3nLcs_j+6(sW+z^m0nnOYS0Ry=t z20;e=#)y)G-400sXT63KD-3-wpo7&52PxuB512;49K?rp4*_E_7(_^L&etfxg#v@6 zXcUMu?!kaB*qFg=q!$G?WY%8b7H+H?!FbI_1o+P=7(EC^XCZ(SmNf*7${=J>f-w+! z1B`ZHyw1locOkj1Ax#j6hyX;e0zC)@Tum3^$#r;B$3`It!T1LTO=~P73@(L(Mggpt zeQIF%8kzbr04dl*p|l_eg0IDo0W&kS3n2wU9D*ODCIks?rU%Y}qwfJhW*3bh29p@r z`1ixFVWJmgs+t}!1O}quxA5%P%U&>>FJJfc2@He=j00elj>14GLDI^l2AVN7L_i=$ zlpc(0a3Vk)OrKzMq(#Ar@Z6XhI>7!K#}YBQU{LRYi{gG`;=->pQY4spO}fEgcG&|b z#YJ_2L5npE1m3^hV4A<|26NFpEHVn<$3m_tG&c%l78onu3ZoYZ=4gNhIKlWu!Y#0f zNDwJ!Lcmzfg#zOV$2EmgVUScHG@4wec`#B*fDi%~#Q9)EsevI3gc{5vl0ASJZo3y? z04G35W-xm~$?*Ot5Q5yU<2^Zcpcf&8lfTYtyr`N;Fv6@|$I)#}Ec(J(k44iN&PcUu>d5butL-oh86klc7y6sX6lYc2tU5)n?T8_EXm_gE;Phk+9V zIoB^%i`l0FsY&=6-06Fe6o44UoeDr-Z&~B@*7jrEsex9^OgBg)pax{HqM@Lg)VcwA z9C0Z|fY-H#`LFlnA$BGboM^xafH@2pLod-_#P+>b#xACY63nb%F(rZ& z320u&&^H)SD!}=A@UR8K8XR_wU}PZng21AO1{s_3T2~Vouzr}ZGhyJg1Ked+aQp!$ z$HRjG2`qUx80`gm5p3W_fjPPRTK4=HQ9=+4VNt+M?0yKC$MvEBeJpto;y$jq2Y7-5 zr~t}q))hs=$naihP-KB9Q2T{wkkubx0H$jlD&X|GkThUk1##F06Bhxpg-HaUjRix# z?ln|vU}53crV^bcyP+g_HcSmYn5QM9;3{DB2TRkU7a@t8 z2BifiZdey^<9d|BdL4k(L3M+2hJ=A00D?UDL+L0$0W3g}?8>gaO9GQi3Jw;)%WlKy zU9*dOB$)Npy1@9J*$Ykz5WyfggI?l(y((512r0~ z5I8AlE?^n|zJ?GzG=vz035&U@sRYA3VZx&5yPA^Zpff6zAtHgh3LJS%@Eg;a;LzN zI+x9zq>qy6O6G~ic90g`i6I6?)lS~W8uEva=d{Wb@2-eB>b*{2EFyicWuWm;KVjZZ zY*SBekbg;6B3{3U!%S&DzWW(Zsrr*gp>|0oMWW{+&l03p+;_9dz5hPDH6ZF3Tql|Q zphu9GWbV&#JcXNq5{FI34XT^rHZVp8i${rBQX znpvrjxaHnqxDjU}otJL#vxVnN8^*+XA#>JLUx|H5Z(5SalA6Vn{|&y0B@7^NBN+=@ z=qk^n+@TmHR|}r(Rzx{qIDg!_@sPreP%pH&%LGOHknKL18-Yof>UXKH)LUJxC_&7P z|GE$J*#A+AkT-|w=TTMCybiXyK{^o3tVrxYx`0x_h)7WeP;nE-g~oM1LFu4En7aA9 z$Qw})-U{95?nXVq(8hQFwRU|@P(#4+g*-R-Nq3Gl*LR^Gtej+=Z{;^gMnXP!-FnMm zN*zEi6HInD__B*Bk3#A#)jPs}gh3>R-MrS|K>()o?Ia=u3=g^P6Yi1UdCPA~SxMka zWZO+}>*D3+p0)o&T1$#Q1T&$o-F4Q~4>e9)B$Pr7B)euov5=~f>e^)Ri+o87hGP!rOo+BJ@(Tv&pE?3Iic5q^rHa9N=roC z*yda1Luu;bzoN0;ygg$vA7SjU5i9!G9i7M)!VD>eh{Ln;!OrmebY{NcE*2#TQvmYG zRmXltj*`Jo)tM*r-;irH zT|9;O?;Y~}cKNgO%Yb)Id9ov%lRf!ghAyjR+G~pQ%0y?5NoP!;mN#YM0hktQ=PCZ#P zZH9?bbzasV{AV|p&a!nT#a56H{oMpB_buo>ercf@!ogIxdOwO+<#Upd^)dS+wjv#w zruEDwy_>0Zb4@r;ajSnmVi(>0W#XoMuxHG^rsZRH^Po z)P?Z7PkDEnet-TTHOzc&m+FBl*O10N*f4lhh~lnz_3FdJSo_N<{wQOP)o|7M6OH}n z0sY^p)e-(F3Hj7THDwa_8*VOgnpG}I3Ys+zKlHL{RxCAl_&Y&ie=7K{b3CQ?Viu5P zSACS5n>Bi=W1N~IPN5;ArSlgvu8};odaEhDkh}e3v(E9!Z++En)#VRE(dseW)(xfy zfzzrQt*3&#@$ZbjN$DJQj@!(Q#|-<2%J zRKKl*6Dl$jPn_rLlGlcGcx{t(MciAxr5N6S{ZcQd-P^?|V4hvQnYvb@Hm~Li%X1Tp zIPZF$l3k)v8eI3)HMTUUEoIN1$YEpRUU-tr{CrSL-fPnf72YDD84bg+upcR_5A@o7 zh1EFZHsT*a<_b!J`PW3 zz^%aXx_Pgv(^y(KOZeN$qs)WoeOlsQ3`9i8jC!=Ff8D-+F|}OhLRs$!+*OAS?Dn`F z&N1iy=4x|eU%ji3K+R_j-60&H`k8@d(URzuE{(vsw6gLc275Z}q>R)DIyN^eLfZmF}-Tqq0PF(Gr^t0q%x_ zS3#PtB7Lt!QrIOVHn64+oec?|rdr>J75mV5zO+5F@83PVu5M9_%qc_*3)5D-yf^3e z)VjfSQl?D4MY-+OQ%j*5gVDE1+75XE3KWrOlL=Yhra@-8d80vm!D9d6^HlMVBiR@C zcSu86%=Ba*aA&F^2vsH2G&YVrs)yOAD=T8UdoL*nPL=XzS2<2lV`brf!;m5q=J@j=U zG2i4S!M4)hP}MvYM5?H*{Z6eyUD~=v{FUBJZC+rVR(8;#Qm#`lKbTt1w_RRcaQ&Z5Slt7)aCW((pvkK}OvSGQIrSeq7}ry& zeALH`n1YW7)t+kd2p9Fi&)|i3(|x2)h7t|7N8VJX{_%)Wwe@sMjDfzOF)VHMm*L}NRHq>96D^GKYX5m(_mj2!4K>)Wrb%S7=J1qAtG4)7A zdW@)2C!gHkE=e}O3!mHL92Ae2O4i3M1?ZR!z0CeX z^!WyIN|_q3Qn@H+Jl_?m=Gm*epKxj5L~cu$b);@{Omvu!%|s~&NLkiQ)jcNM{mOLv_dHt-qSA}5zS$TMI1j{RvSE6WZG})`rAN8{jE|$bS zp3A*#S8vyC*9y=M&=1hUSz2nFYnbcJTN)Ip3i0pWo10ji@ZNm4d4KcKrs}4`riNpV z_xFIrfY^W(To$esmta{{S^mZ7nZ1R*TExA;VVYHzRku~KRr_L1uBz$+x4c-BW4EBF-x=>rH)pW$V!R_T?-sYcDaH znYTiXjMs}-Pc7(ErC{aVN`bxz)mH@%4Zl9Hy#I?K=VlJ;B7*`;!P1>2jU~3FmL=Dv z`H9H?4o@fShSEfmt3%z8$qLDx@v0-vLydsM%}UoI^i^e&eUh{ht> z;CB`?X77mcC+N;b6aNR;GCpQn=X2AQOMG|lfXMrMWm85|EX$0+yzYO>acd65^NRD{ zuFqx7Wvw!aT>~ns3f(K+^Yz9jFSsu{FZ3^>FE%fjFO+5eN|ih%Pm5rW*p0|0wb)=f z4f{z$RsUZSb+}fzaJc_??s?B;&zl}68%ym^TuU?urU!Nho~GkfOZ7`5O97_(jSb>E z4uNILGKLusIz$3*dmO$#yeTc*c8EU|JB&Uo+n75)WIoh6ls_yyq&^HVosc}V8KxR` z8g3nq)HID2vJhTQdC9CL{X$w(+AO{5A4%H>#dB@8Dv^rn%0CqhMkW^1TvI~jax6od=G@*ZqP^D@4<>!u?|H!`p3JaN}4sX^SkrN;NuY3gaG z1Qq)iR87+IiE$unU`Eilph^WpsB&%Gdi6+4x55aBL6@q5L58~M&Jo&ZGz6K0j2OevAta$)kl(poxx=|XVPnXCBgZw~6un}42(F~UA0KR=mpaAb32c4T`` z`kv;#Glw+kHV<$FS$cDQ$jSeE21y&>Hgil&K(IwlKyc@OJc9%Vb98g`hQYvtNUDr< z;wB&7=vX)TLS;Z$ERT7>M>qGUm}Q|z(;$^uNm$au;%LS$w0R#+HSzm^&qz(73(2o( zl$|v{TAMG+kY?Vksu=DN@==fRjdAlUry80IE1&PRUKL*_s^s3-S7|(2GiUnfz5C>w zezI>wcYXOi&(|G_al`%=U#m+y93?HeZ*!+w+jEs&1RuV%C9GHTTl6ebUg8BOuXMti&oA-N8B$@vC%*N8nkJeiqE&QNCbjQQRYL zFT~KTZ1~8#L)2iIdtnBb?vg_aysS8{Bp$iuX#0EiwH# zx}v?7c1OpK`|%dZcZT1E;%S9H?`t}Cs;_I@ectocLd%9t&){LS7sI;pL)(}>f%fMT zF|X@mMa=V}8Y(=Je~B8Nzsi^tPmfW_AY9eX>)dd;`?cEHP5kr9d-dfFxr^Ja?Icn{ zJ$u6KU#YB!cpnik#(1XpIgsD<$XR;wtl2RrH{i}=27~0`FA?cQloYq`Ka$xE?oO}W zcq=mpKbN7{T4YVfnvI!0dkprlb)BdGBItpnqfo1ww9TGPUyKe!eI`OyJlp<7V-uZ# z*LIX5rul{wnmNv^wYVg-*&G{hE#}@VRlW5e+oOlvIWFEW>r|w32`IFrE%vCsu-wzG zACFCn`bx1zaoXP>QBGXdUPjl@r~iih-OETj!e#evG3%(rTh3s+z)P9PM;+@@HCT8!_G#mt#TqV zZT!+YT54naljWK<2@%D}LMuG?$sr$=(ymFryKbtQeroRhn7B`??h?jTAHJF5h!kGE zwGDD>#-Ys+kMf{aC7tIGL1bjZzsC5^7g8d(3TmwA^LTQT-12M&5|K;KY2Y=xKLcGy z#cxfS%EVk`6(PJ)zf*bNxBQ5=Bdy;>B>OWU**`$ZyebMkSf7; zT|93Ddcb}c-!u}@$g}#K_1>3LQb{9DR{c>*fq@{Al0V)-?gc^2LnBICAr*d#$> z)}++$`nNwTl@E2yR((~`x8KN}>?S{6IiMh+bNJlNn;%pk<0w!Qv$2kKs4 zz*g?~y1ga$LrqHL(k)m&VL*Ku@E19e>OP&f^rnyi4lR@L4+xr!P=lk3D>BC=yaFwqtzRp>{ z)SSvrU_9B>{Pav>aF;@@#A`o7a-^r`?v~%C-&?9*WQo0KzAOJMp7!?{c=k#aO#f+lx!Z}dHj4=3c2yQ`iNYOhI0_0i!GT4!RPh?OBQQ@b=ul8-T= zIsc|S$;TbPfBto&`PQYHH!|;w%b7Wt-rylx{%HKCMFiEeL@K*Fv=DX2>59xPUnXpu z9uaV(`7x))l-ldgxNZ)^V+ObNQ@=MNMsK$KhIr~$dD%68?k1!NQn$p}i+YIom}6s# zFkRwTB74i23IlKIX~&DWHzF@e$8eee!>vd5Bxwwl5qR?_4>;&WUc5Oi))Ld8Ckj!Z z4V005`USzfr#E#*ZZ<_-G5WQI_M=J3#$`)$lY5pKwSdIXh5d+HG}C@hG^3mUuV|CR zp6$|2Nsqt1HCp3}R*1m6)B>G<;G$B5oLSal>^&b-V@Nf+-ZIJSWYLL4{66W6l2;=7 zF9D;dD}W!vef|4bnn8c5R~P%dzXJi|S&yHA3@FyNZ&K&Ik!7Im8jcNq%9;?!N*=e^G$mw zAfhjeM@TD4YNCqvGs}ILn(oIC#oA3tl95ND_FL9$T>0h-x%2Eo$$rqOLzklG=!G>2 z6{?i?$XqXzqUSyuC&%ULuQY3T(W&aM=CAfiV`FZXKn~^yi3%JGrr-AZ{EOYApOrq! zNsEt>iRygRQfiqbeyoBGpgF0tyXk+`%nX7fSoN4+i8oxn4Hy^v$ zw}d`$6uoHOUMYkzD`L-(ZaM@|u~EFyYTD8HEUiV`Q%uaD5V-v?=dak&rc%gG=3@Pg zQ_@7SovS~LfqnvGOrL4JQ8qF&r9_H$3~P(ED+0oLJ7o<5P)F(ffu6TsQ|NC6Z*(93 zx0N%@lBc&>D^;E4@-P?~3$OPEWq1(C~Kg|%^Up)v8Q?+eLZ}{8V1P-1PpJH6m^A~Oz zA8IYFnpN)29IGegCg+M@V(mVe|4Dhy^6q`*+eftyO$XD(H9QnX!An<~o+n1d>E|(n zKT<42v*?6RDcMUu@_aWM7cj|;2#~&MTDfW;lY8c{F8HE$wyze$boLdnb0?|sx z;}2%nZZ8rqm6P{1t_r=fa}8bz+GO5RJ3p@D`DQNKS2`>^3tzG4m{YD6*E%fc!*7Pf zi{D7KY8r=@)4OU&-Me{f4Xt7z{K&838{$>)t>&*>?D++5tgJ68Ir|I*UYL{IznNj` z@lUEuI%oRM;>|ijn{kn>4p@U@$g{-e$E)uG%a@TiC0dOJpCZqx+ybW>IQ)FKG%|BeU#gT_qER8>_fAZ4KFGA;10Dfc8bKTwR=g$M)G-5odccV z_d&>CelfelUE$7bvrF2T;yd-JxJBtdrTr7NO;bzlAJx4LLDuom&hT674`S_=c!q~u zXf7MS{I_iamm>cVb+Cc&&dsA|mY^Zg%`2#1{dP4Im;YjX`QfL*Xt3gJ^n zM?b2Jj4tByUu@>OssEs35tTU5D5AG4N`9+BXY<-ArdZ^wI0b0W?!B$qTAIA;25DI% zqa@1TUpNMxy2dvbZ7OFwl?$F4%LF~C%HEIFwwDmi#2taAktjT|JrXHtcB&@WK-WWwzh`x_x%x~f7m7@ zrXbd|0;6?0Tg)R`Hjtpa!h z5r#(v<=k?>Q`~&-E!j`EWkY9;`_VhEgIEwkrZOTtq0zW@k8jN3D*SnhdOxLnP};7lOxBto2;TGe54D zGDO}0{->PbLGhzVGnMS(NJyv)szCqVd7X1NvG!CHFN=C&s=e3?p-P5Mc}4`gM#=WC zC;C-14aVhn&1r%Z`BS~A9{x9XMJ&dD#L9$D&r7PCOBem7ueL$aIZl4Bj*8M z=P2s)jFx=3>V>A-ufXEM*EZ5^+Eezie<JbXy+hlO@@!p|s zCKrYMEy?$V7dM9e$3yT9dmjH{2{?1dlZQJsv41GeZs>Ly$(!o9ZvMdY+XepW%!m)w zzRAYVOa7Eup6xvo?BiN@jUnaeeS=>_DukaBg!^Q-YX3$N@g~lCzGb#OwPw^eq%Zw3 z#zOn?r_i|juK`L{MkN98n5vm5y7=3YeM$zz1EMTBzUa*!uY%|Flq*TDPtQxKic|0G zc^Z_3h1s+RNa$;bH0NnmZ4qZZdc<(y79RWYJyf@1LCoas&d%@tF1wm%&E-o^QbNN_ zDm@0~m*cGp#AKc(=rK8dw#js?(0q8)x<7);)bPw^bv5ZfXr2+xG9``&dUq)*g`i zxE~2DO>TYM%B!`OsO<D5syVXDiK(V^+JfR(Xwj z`Mp)=6JlA%6JCBP#w70BV^jWvM;o$3k1u@>e<7I1))uGIB1AT&^JPC2|Hp4B;5|@t zqt(!VeBpzU(zoz;dR11u$A{C-<7X-NjB9w0_88jxpD_x4;m5YOe7a#$BXrkqL;js^ ziebKb5An|>*L!?Yv+^_vMjbsEWi;JNRd?=2JqHUDvB%puq z9?}N8hH~H9Z$JLxyy&QofUgEd_a>5tC|hm(DJK^(7`0{XKrI|?42maMs}U=B%dLQziDJ)ltcZVV%s@`cn8zkblM2cTBdLpk;lm5EQY~Cy?X6 zay*c-8Ck!_Q7yNgV!`TiWGCI(dVKHCq_@c%&GnHqp`wJvY#g<4(~n<%Zm^E!2zS{r z3q8-LO}FPV>?~EU&Q(uc^J86>q9b`P-*8B$X+ZgonT`fxS+0KEx_S~U74#O`$sJ(* zRSuH#3`#ZA=NP1-X`IOP4ik9uHe&dqpM&n28hA{Od!?%xVQqvXj%GMFWs zUppv3_l=)PO7Ys#79V~iN$l>1Z_m;}(FL5XD(#@mNYUd7QZ8>4K+aG!L z;uYV;PP*1un??=jGIv$9xEWLA{Ui38VtzKf-Iy~uwQ}}>Z6p28AWBk*6~it1Q?aDS z_N?uebHW1MrcK=6f%$*;Q?#VkTeB)Q%dOE{2tSM&}4$iy&}G%hTA*MCWCRdRBzZ^1C7HV%y#6dt}#RB+PB8guix zywhxI)A;yuaH!Z=AfWqujON!{7Hs#7Y#JNS%`3G_nf}oC{94>PtNru3tv)Q^Q?vQ! zzkk;y8|%HYL<-7SzuslF^|CMvC)D}PUGeu%KejTIznOMCK&1X+;jJg75Aly(%*=yt z`|;+aF0H@Vd$D{E|MfN08%O$8+p2YfnV|BtEz8IC9UWTQw*C2KE_W%mG1`%XBt}Q!;EjR6%a*_b`f`fh0DO@k0YZ>d^I+q>aE0v`Xg z)b10+vP1fJ&?4P4ubUw(ZN$_7@O4#!3lxV*?S!P_9eJRr8cvPPw!LjYqQ#-*w+tagb zcT7?I)c1?w!?5X?l)!%sOR_1ke%u!n9#<@53J=$RE>`>gNirhqFtd@ntQNvktUZ%( zBco{5`4PAwB?@s~F4M>D|Qy&sCqtK^(NcIj-{qZ?!Fmkm3W{haYupeyrr=E%S=!H3zW)ICi7 zdYA9Fd0Z1~>{=xqJlx*Qvo&+oF!Ka5Mn3qo`k^MfV=h-~@VQ2kUl@*UU3THa0u6f& z`PUbHN2&Hg{g*l(KD#unygB~Lsdu$Xr#HOKS{@I&@rHb8S6RFpm1LjsJvu+{u_U=T zyl`aBTVm4ab7j1Wv)i!ilq9>0xoYOf28V|E>Dg=dJ}9dq4U}O!JRqcH(DH@Bqvpe3 z=SQ|-z&hMjSGQsRJIv2XbbRPo{vtwpeKjlBD{%CsH2sQPCe!F#3UBrk|38Uli)Qqr z>|alY?^{&!p7s1oX=z?v%x+US8~Df9n;*GM`=M8w>@(W4w=nV}+OT&fa-T+)ru~(s zmBHex_XBHOxoIhHhJ}9%k5vpi4;`((%=R-}+-i?H{IlATdS+IVx#ay- zri{@+ztx%{Kpfb{WuL!L)a=$EEoDt+6=!)z#Vz=*!P>UFjZ}E-$L^P?v3I*)^v1B@ zjlBKo)Pl#(_cJ0gRAcnKqD%C=a$mQ-ZeDxt8rx**AKRqsJS{SARotQPA9c#Tt33Z? z{!K%T19B$T0XpM09aOB&QkhJ*=-BC(1e1H9dWBT=$c&qQrQnxa zK>ml3^#Av+*9)XOc-Jdv4CZl9J?Xi5w|EdmpYos9sREsHK6`Bn9k(TkKNC`Q*{-WK z>t6G&E=#l*jL13U*}}{HJyKd2ZP|atPEC+9uS_)gKBX0j=*AHO=t?wU#Kk1V)E7yv z+_QHqbkgWizh_@Yg|^esUDh=CTjgx@yv$GO32%XASTAf)RxhOR?U`V4CZdOeD#n-3 zExi0^Yw8`Tl^AjV1$B7KlY)bcP`Adi5euW?cymYdO&R?tyJM>oyiC&nOC?R^?2~_y<(5(r@GcMQPbo1U?{G?iY+x5}9vpRo zY*BnQg-Bl-usIgDB=EZhn7#Q@XO{tcCd8XF{z#|ufHL#H+r!rMO0B5#`(~@*td2L= z(~`A?K8bD$#|bD1od%}Y-7nFd#5nVqHReyv(iSTZQHhO+qPM0 z+qPY4+qP}n>O6gK_w954)2ILavi8ed``Zs=&X^G~Vt6s{-lB4VF~~Ti--Ar^XOQaL zWk)jZ6yvGaI&lRMavVEm>jpC&x?iZ5&dZ19Np{CXyAu5#Moz2(JFo!C(l!*$*QIM9cJQpop?=kXyt6U;oJ&~ zC72<2>vPip%7&Z5A?Qq`y7D7{#|rIdlG4xl31ybh2^wV_!R1ns(96Gx-5P zLJ8?|+PN7`cw~27$bMmSon0yq;q0f?n!z?f+xbF-zaJNTGr9Nb(WOFY>etR@X)iDp!jf4rzU?5)Y}X|NMcWLGi*ypWJAHe^A~W)nAxq-f*YlWelL0Cn;MZRZVE zy%EC+mQfx3O_DwxR$}eChQrDcWB;3Ubrz4Yz21-vxVBmDd|3ic7trbfEJvQ1OYH>{ zdgkq`_=)};1_SG-C&(pP3J>#AR_|@sj$-HMRa$CfZ{4mfwiY-85$$*;AHt73OwG`d z{5~B2)As*n#$B?3Kbotgc_;*vW=*IS0*DR5e`UzMrZ$V5KH*5D#cbGvT)x zlctcN$4k*XeO8yd_fuTgSSMA;@YV@3%A7`B5|VSZfWh$QTc8y^ySK?t|S9!8HYRl(w!V%IB$sh3-gK4Qzm9Ty_fCkKe(!GkhALp8l_Q*l&f>Z1 z!Ft^wlp4s@g{LgkLdyB~R$SU^-Xl`1%F%fJ5g-WW*5joD?ox1U+Ed`N03E?A1oX)7 zC|*x@5ABtadQ_nEY*AHGlYz`qa$dX*cb{QcWN<8O1e17bVEG)+GFU?C9gut~sEkR^ zLBm7%osQ4UF{m_po3+GD*2SAEQr<|_I=^7=SbK#(u#dkY4x;pM(q%#1=Ts^qd0rmF z5{5;uU5Yd>m8BL$%2F8te&?iPIl30G(!Ua~-WkiNR>QP{DP|^UMndv;`~;&>c(T00%Sfar zymv3iK?Ghjwsx%uOxnGDa`hFXLo=CP+>n0aVJJh?Ot&6}X!2B8#vq`&2R!Kb4vm8g z`JR#6WphY|uu*d?0yR8QDl(C@9IOJ7aIhrYqRF7`KFlZ~oPXp23*9}H@God8jg}Ss z;6^Eeko~@|o%0>yW}V~N!5lhB1EKNR4IF}j*S7B*ifQA~M2pHU48?eJs$zh8C7i_~ zRXcmV6=J;-BOo;_K^KGk)na_*K_rt_X`9t3W4DF=Y#a4a*N%but)sua)?Bt$E;3kz z&{5`$cHEfXIomP-zO1aQsM}WPTC5Bmcktv!RR)5qIs7%v9k+J{PN?ygg2!Xb<}OIV ztQS&jG~dxyOl<@hZ4YFwCsx=2L&;n-b6D0^);+ZNlchZ<&GCP~p2V1{`7g-e^J-lsR~y*q>B3n6LYc)>X#SX;$-2!;7*EN$1ovFC z^R`NT_iuaEwl(LLz@Unn5wY+z+>C~55e-$ZRE^J-hOpM50{699nV-!1zY-l`BG^hRIBh<+kAnz%%vAI}B}ZdB+(a62h6UOW9E zl%SEY1)hHS_+z&gd*ZCBM)Yl7O(;?N;F(K)5k@qpCaQW`NYN*#K2=At+7r`p#wUv~ zw}-LMX+Ic`MG_)W886uW<_ib=4MeQ}N2Y2NVI#tT--mzjGDTSbIT@1n zuK~_HM&2uh{3oBv=jWv`Jst3b=YbNuskxH^JTgQEWI31uAw(g!r~TCU6AK{RPbOu4 zBd@mThv3P8&;5i_Vj2 zYzI`P4B4D^K~pi)Pmr!0=hL8b?kpV-;Ba@}z0Uko!!uc(Sw>d|qms;&`qp~287G-5 zHx`F1{gjQ-!4roQnd}*W%!D#gLe~oq_;YD>WBdu{o@X?Hp{b8Oa-9dTtC2??=hM1# zX|*%M(98Ks-sg>oad}^v`tet*Haoq(SnUj%jnRE}CU!&9y~kYi>k;>8+6K2Z+^ER5 zFJiCMpIc;cy{hB$sA5dEjHsY#*Plc`p!c_cxc;+9N7RBY&a1gv-YZ^v=xrp2BRooK zuiJ%P)fsSD@Kas4E2m$sxdwZaw~bJ?$2y}QecEi=XVaS?K=*DuLB9Z?U<0s?=#B^I z9iT6wPX3H|b!)LDaSN94`Zs{AxFZli-fiWScc@slN(~H?38zt|JcLf!wC`Tlt5B|8 zDfvsRT??%dFLVh}ifNt;S>MylwJ*qTB&@m+BaV$;H=)__M)`XfLK+l$j(<#PuDM6t zKn$iQkBf$&xl-)&$Q=>lY2-x6M}!4i<`2?h>N1mqW#@>eNvq$_F%X1KvQv@E1ZIj~4_ zfAw68zN>VgL42M_|G>6jDb!CGzN!D=S3e{JK2SAW1WE~h#tVcQm*p?jnIxp+GMSwR z)F-Hg#~N&C0FL#+e54&Un}B>`qZ~&jiK@)VX*7nM+6?{uibd5u+aQ)6-;sQwz>dcf zi}Ce^BmoZFCi5B_+oW@!HaZO4P1{90LAW?Ac0V&!nRU>)`UjkBPU%v~G0}=nlv9NY z;&)B)lbQbXKCo@Mmy3|_Y-}>Or7{cNHT-rpbsY;~BaFHV^J-|0X~`kblFmn0>*Oho z$Tk~kw-QABJ*C7-WZ^Wym$G9y;n|5?|8fmpRu``_(<%3C9OC^MhuN&~OIS!4B9o(? zyO*+-dwAube5PW^u3?r%L5E1stcvId^IqGl?oa&=%f5;gCWTz|jD4nxyZU5|;n;6H zdW=&!;{{fSJgpi9eBq4Idp)lO!HGSz$z4;8;f=GqNlQ*w!HTGEx;HQQ)Ykcq)jJbs zVl%D6L4MiSES+ByYngl(x#q3yL~o&8n^#Qx5XxNqj=5Px^5XAP6NnCNEXQt4{0Sqk zCU(b~uS`5if=oOozxSu68#1pO(g+4vVx)GYxGKa9Yr>a2DFU>E^3k0nmvNR0v3ST_;4}4dLnctR(ul|r*WY#N_`nGF&3?JtkjEC=Qd;UCxy@hvD@PHnlBZK)%42uk2VipKbR&iFIXmdm11pDgfAEq z;hQeMN#ZtA?K`U(tDl%#elv`y{)bpT9h2+3aL%a85ew|1GOw8zN=feVGpKW>6f9r! zeEv82nu+GvwLOwZvRDZy-B7CaO77&qk&+xXz3mQ>rg9d942G&^7r#m1FF@DBZEn*G9uma?FAFhM+j0`buF4E&g0fA!+@feYGUQjP!pEmvmErtkGE=fE3r=v zSuZu3d;8@t&Jyz?VzXmPr*6r`E^ok}kU1Fin6>0psnro1sR55~K~9gT^9@*=zg39= z&(4lTFV(G5H}yv%cOsxECG(&}RW<*72Vyub&!PCiDMV=hlIi#_c%z`m{{vDw)lQ>- zE&%7Xc3R2)Zmv9>u5BBkef#zdzx~ z#uY&W5XlG}C6`Qw@@s<=bG~3=pUl^-3Y0#QAsVW06s1 z6C78;5#yBRHYs1qZpr7KxywmBJTM_v4jX<4}!`V3Y5g5r02@D-j2S~!4a0eWG zt*KM@K-3(fydn3sVYd;1>xfL@VTw}0*|P)KNP1aIYUxMrnGV*98EIsbJpQn4gPbeL z#a`rfjVSbF_O@{;muu{#6%iM^B1CMDzPJPR=L1QTL;XWE3L9$V^nXyusg|9E*Dw$F;rl95|D*I-Xbi zq>>&CIWkzbfQh285B0dx*gwhju1t-arX2`4V|hA)|1s>%^9F++WOrnWcJVZI<}2LJq0JP@ z2{V-SYXWFb2Nn{x`7FpXg$4~E;nq?-#YcLVDhB_$aEb}tEc|ub+Q?^y)&zvvIG3-YqDR@O`o<3ZH>MGFoQl>h}iZ)j!_}`OMcUjhW>@$&r)+Q z*iR{3qtrv(pW0G<@7x24xuAz4N>OO?`WH5#ZI%Dcr#c=1g-S{d+t@J92tA4n=^-{^ z@>qPVv>=fY-&kDwXq@oG6}B2z+QOTqoIvCzviUA;8Zc^Nm`O{#3s=P z7`c&SEDm;Uz`?XV#QWhgIiOVnlT>59ze#uk}iA(NH*{g9xxLdW_Pt zQtM=dI@L%E{sC=QiZ zvUijs?{-4sVpcXqO_pHh>I9$i9aF;|h*Y87RQ1w&8+%R6)3I~9f&{*uqxuOW-LoqT z2_PwKGH-}bH=SL~KEpwsVl9IJ+;`0^K7N!(zlX7>H)?p6YK8Oi3)Q}kzgcdESt{iE zz0bI{YG;J6FKV5a;y z+Mk}rD42cBe});5ORNqbAOHY&&;S5<|BepP{STZ`rE2{TMdfSjM^T}*#5aNl4h{3~ zORo#9u9}OahcK7;?aEx}a>hovyL`VQo&f_x1iaZc^t90o9T7=|e1bmPbes3%sm$=GWZMo|>*l6N^gzQeB zY$b?0Zj@$ke+W=IVb%n=0T*Hr7Y|%WQMtFXt;-k2M<4eK*hyaT2!z^gh)g9?A^DDI ziHexIiq)Nc+D)KLYf!5NSoV)T?20Rp->@311__pHIRX`U8F^Q`Fj6qdr@a7JxzbutqtK$7g*YjG8nk8}iRdU?83Q1W8L z=wr5VvD*q_ugC}il8v{9T@UjUz`ZMYszQMU${E#G;0e$zo_zf`_455b5YqOx>AbJuW7h z*PN0(-i%qI!W}0L$d5e1-WM|`7U-XTByOhRgiw)Qb9g|ObhHG`+MbXtdOn%Yn-gHn zt#>^nAyimwu-TPd9H6CwGE|Y?+0_v!bB~`Bi4hkmc&Krd4GlM>_8{kNe#sHFvmU5V~8S70iBjj6Unk1H>hbZM{qba88rr~_8$+R;kg{EA}pPuM!-6Lh&DQCYn zelYb!0)BdO_n<&(nn?#bkRRa9>vm0h(x^?)7{liT5=?wF9Cx-J5pkHV20hsMESp7AaSknHD#%ke~Q6 z4N6O)bP9Tpl6tk4y3Ng=o~`v?1Wy)@>{3;?JZP(jCSgnS8-VlufmgXX|E2-zd zntC0}T)Qe~V#cY0vM(3P8kV*Zv_}vr>q;&^8{H_whSX{c2SO`0d_30V8)027ER=wuRv z%8|%huob{+bi3R9QikD~6xkEO!;AAI8ME`AYos<%Sn5P?v78sVqoFp7Q`oH$S6cm4 z&4M`VES9qJ&l?D1_b~1IJlSw;0lr#!H3^OOj^rxcwOCg!ccS4}cw)v69EnL530J+fep z=qIvjVe>KsWz(hfXR33}*dncWTlEwX3JH3$SR%C2vGOPP(n_~^A5U{(v!jXV2(ov= zeb$uhKc5_QS|?fzKQcTu0ssK{=vJYODtKu)e_G8L__*88Gm^ou(;7GXfRSv?dxWozL0tYo08vqE#Xh9V>7z z7l91y)}3;kjh>C3Lj6{E*@rQgakp-n!M79+hsvCzr@)B4W~t*9sfzH#_z`F+)zGz( zB}6r7y`k}HrBzCoQ6)AM$bW*nko*#%n=-Sx-S7NK*qv2vrqG?&7N8DThe)L+Qgc&$ zLJu)NyC>7UsxEauzre_*kOj}Q2%emNyT;BjfupyIO`H1cw8p;@8D=TOOZW8<@-tuX4iUmI!A$$*A3~l zR2Uc*I6487LA194W4x6PS!@M3q-k{-q>e#_-ixqL9$*PP7>K&lj2TSizl!YOG|%+( zD{G!2R+WN_4~wRk3FY7pYd3-jbOLgLlq3qYWU5F% z!zjwk430-lyIxXs2>iT&L|bEOb*B&CY(-@IRVYA_;VtK+bMd;oa3V%<9V^OAFTt7T zLfxcUT%~)y{Y2x_^#LXM(@&85e8U0Y96E6vae_hL6*AUw{whR2&BhPtFi zP8QH|W~LUq!f}?-3PWe5zjs6kTsvtk*Y;7?+Kpj)vTHur^djyR5DFs;y))azR0|JG zb9eh9LgKT_WWcP zJIlsfwOZp?0dKBiRVSzIyX$jnX#cHOFDeDs3qYChiG*QYi^j6h0>l>qP<_tXIDT>o ztuO#(fCaYPk$P|`WsAaI)=0}9dSdd5#SZx2qEex13zLn*h)Dze2^hNxd`cFPag+>Y z!wEGL2|@nTJ?SHH?~jQ=KcTa!KE#wf&tk$U;*q)qy`}sJiv=sBU$qJdcrd;AX1V?q zZD#QT7WI3W>6)_W-{iUo+$8o91q}9V6xb)VI7k)PwmkPr2vD|L{Hi)X34HF5#o@fH ze^hNaWQ1x55Xw-&mHDdkc}Qhb%PM?<`zVymr|t?e^3LDfgjc>;K0H&KuXX}C&^Vf8 z45Ae=N)6jGp!eHHg+k7oq>pm1PpY>Hdn0XUnX55DZOX;k$`5sE<3KApP%lA4o51G1 zJYC>xpPFoSktNIiNRzGgU4T|3KI0_@Qx=h7VZRTr<1JiVruo5JS(l*`J1p}j3OA&w z4-zNv6=!&^JF-ioAQcc%fpP#M@bpR<~y9cyVVjSZmO@*YJL*nAFEU>wxRfok;qA2YgqUNc(gMHG*2i zwVq-cYub3ZE0=-%V|b{4{btJx=g47w%4Dl%RfMhYBBT8s6aFaV4Mx@BjD3U7i$voRb6Rh}r7OMuRxY5~UM&$mKc!*QjXr)TZ^JvDMATU>SJXnh7b$p5Tp+Gn zX#z7j^PhP`LrYD@_L2JoAW*Sr8a1SqA?Supth^_U1fwPRU}o4hB*C>ou*rq=M$#Q| z()e+Z)7<$541>5%B2U%yemZ%yDR#C1qo@L*!f7pD(WJC@QC6x z=JE!bYrT)L9(@$cwQgzd;3=7WHiwkaKHTl{3;^lFx0bu-Y(Kxz*ZsQLJaA!S@6haK z-|Y4&cy+yX@P*ax-k7e>OsT3#vVDB{$YWcBuX}yVvSpdf?-b9_F;G&It=OjUy&(HI z6Jnoybx^4C4*SoC4l`S1JJydgMB(S)A^Nw6&i@g8pfnl1_TvvZCKqX#YpUpJEnf&o zNgcEhi~TL3s@!-N4_FDBu?9G{?rN1>#JjPkg&1@Eo)$J-lk2-45@g+=-Wj6Ze9`?w zVk_T4@_f7tQaxgXZ9AE9z_~zdYIv%hq42W@f?{^cVYAGruL-PNWovZ)8L~-a0s6Cs zD7w;v>*vp->?&ezS>5*sDe{u7;4p zQYpi~UUboA_-jtT2Qlq*KSsFy-Xn%jz>F)NDNUex=Amj0B~z!WOysar`$TP?-}PKC zhOD|-&m5b~k?7sVGVF+N(H*lA7F=<~bZUhn1ZNWma}B~8+p+W~N5eEepj3}yT$W%T z{XtFmTnExoK4x4UCJ|pTmhq*4m(>jA=W8mU{L*%RopM$Ogj z|HcN*jR_zTic5I)MR@RyApw1bp~yw4XN$746kr%Vuu+x3DQv`8qNTVG84FXnW`5MQ zXM(k=ZP1w-#0w0OTx5%CiF3uz>0nI_a|MdU!3*^THZN&0}nO2M{(T_AR%3=yA6Vxj+HMFzPLbk>lOta*fNn?OD%+c}IvyAX& zZf-qr#Fb}@x=wE;_t_%oi)jB6)bOf``SKPeyFTDi(pNw=xHk+tGyNVRCZN&)K1Zs? zsYIhxXKi$f1@z_!5$2ce_tEZU=NkM+qJ*m5gY)SeawwO$F5W5aYe^f~V&MA+#^f8o{o&ov^p4o=QC`v1*~LBd^s)A5sF@`?xm!1#at zz5liLKcD=DhR)W`R{Bo14*xKJse1mHGvL2-Wa;?}a#!qLLR&)-V#=ey3l~%;iqzLY zR3tTBn+b;Ct|yv`s55KGe6cRBI&izw+Cg1yHvRA*ggbb^ihtps6gyWr!|bRNIHT0d z!yBzr8F0j@w1wQ?eHH&gu%t0W0jw~CzSbmfIHE`F$=&t^ALovAwZe65snsKRV8x+r z)pCT0=>w0EozSH`daL_M@O=j>a>I=78Z--4iLK_;FZj4kJ5&Td|)(j>CoUj(QzcPW}peK`VF+})ko+|~uBK1KUNs!cUic#bgUAItL zq$N}qDwFAsX2NAqQ$R=8ry=xpL$eqZH=F03s{PK?&L;r!joAfHxO!8%^sbPUDJLnJ z)$60`PPLv1kmE(Ky_J0&w)u$B^EyUvSlKv7j(fem4hJrz^GPvd@`<{*Yjj9=<91Zq z8-s_1G`6jG94^NWa&hlq15rBM)@;XH4+aPQueGdc6qa;4l4TP`)3*s>=_g9hGxbvR z>mHu~FtrXeX%dmm6Xv%a3`|;+`{(NWk03BwlZ3iU8o4n=%u7t}td+tkHdlId_8Jd5 zoK6hxW|(d0!xk}@+M7$LjA}VThuqlNpyP?+6WH=p4;mcLld5y<)NKx^b}+(abveE4 zRz{^ie!{T7ITQIa71u}T^=*y7!X{oH`>HR{*9#ydH1RmO^F!k|-ej|u@4QF5!Gomt z-su9LoJl*jY<_xkR{MfBN;v9tED`WCPhjSNM_C4!5Z967Kx~i$B@rjB;G@bTdO5tx4D9|)A&liug9CfUZ3uS^bC`CYDC%ug zf!FsjpEhc?h7uHw%?}2 zOvYdgkH^*k%~PvtIk4|pWS5}eaqXGC3A;z~{O!ppXmkdjgM8~2#gMwBK*c!OzHsw^ zXsRis$wB>`P6=cLX8*?o?=Ka5A2U=x5Ece$x`cAFf|*#2aBME8_KJg)zS)e>fa_c+ z2rw!Eibk!N7o(WEIKJ4Fx){tUrF6LyqJ##Ov^$nd8+SmlN^)?hMOL-42nU=f*^-vI zZkR1rurX-Wnl=BB>dw1S!nG?>j7nnNp5X9YT6mkBYz#Nw;zerzb|OpK@{nO#=(=E! zZg4K5_KKHPu+U4&Ex!xDl41YYH?rv}_R(XH&OR$m`m&;`MP0;ewPO;i(7bJ<*qjZa zf0S&R0=D{MSH^m8ZA((I1|!m+sG)8He@-?``-dv`im1FG>@Y7li|A&&(IfSurtYxPUa1Z-PFRzL_PIw;K--KGk`19m#)AD zKPg5Fx3F+pU@Kh^dOzON`6D*K2Ni=?0%Bta{nXi&;zec5z}2MU#%s&3^}u!~rZa%( z!wJ2_-M9klRpjw?)dC?t?98V$i+SWZPGebV77`Sbh8w#h7eY3uxBtu;w4C2B5`BvqL(hliUtu{8$ZXJS<*L}ZY9{qGk!+`pUSnyz4-SS~+* zI3Iqg1!{S~IJ`k38*bbp{UzMG)whU!M&CY^J8)8}FsU}*S4dzp$Pvvr?bn&cq}#y> z3m3yr3S#U#xhT{6igk zDaz@1K5wH}_@cQ4?lO7?x9dtZ)!VFj1~O#fYTgXlBv2oYoq3Phuj6#Bip_R|!!hYs zY4^oRYtXVxv6v8c+xl-h0hrsY->(AbAh9DryXGf2Icv_G-5eI%HqRdmS^h%%V3ln$r(F^R_WGN5d`(kY)wxt*8uxr+t z=?2gmct*4TstSJQyF7vWEYuI@U$S!FdIS7tXurTHs`c~(2H<|eiRl0Tf&o!u8)Jw6 z4F$|={*znkjj|ZrJc&R!G$t&%?$kC>lI{!2j}?&T6{2icd*#IofhuW_R_7 zuGZ<2(8nk{cnB0ip%|oWbZm4Kl2x$26XHq=Tj(onYgL;SZ}cE1OhPOBjW9p1|6Qi+ zUXVo3&|j!n8nKDoEbWX<K$R;i|jf*r$7(-`!RhwsSTVRPau>refcuZ z+_-9gN7~wex@ETjwBWg+>CN5djPIM3 z)btOB#EJ!YSO@mK7UPMNQQzzAVf`H>x%m|Fq&R&B^M^5TWv!oenoGxD*bJa>6a77a zr_V3!%PmwDbryEm@{sjw#IcO~K{PX!v>y-}uWqKc6$sSwi95n@zDp4seDztC&~{&T z+4A`hi$90$uY5$?uaX2+s9)66O2LANzzg|r?z|kjHH*a@S&E`HC?wWh3>2U-spv+1 zPF+2-3ilvnK{U%2hl(anIO&8Q;yhs9N|1R<_OX)-3oUHO1Wf#y*;|#_gw8Gia^@~` znPrxy-32K1FfQwu%2#%_Laf&tRf~OSU{TFWkt<@PIYwrgKTMKp%`!hXGQYxS17gMU z#aAjE{@0z9h~-_R>O{Orf$3_ZtVh{YC9}K;R3`zw=`^FrzGCNy5l)d_GPu1^ANXGc zh_NGp+M3~_&Uy8gv! z2M}^7lHwJrljtLdd=g5x%@+69yQp@iu=yLuqn?mCo%*pP=fV{@hDT|I2x*pPlo!`( zB}(A1<<$ZvCPb>m7W;b~e9kn(-W^2{=W`P5uc^8LKu~`wdW)bLLv%=_GCY|uZflb` z08>cn{D%rjNgP-xrR;MiWwB5-DyKK)$v7b;q(WVRAakts-++5n3V{O~o!TTO2`S|+ z8V32v%#(9kA%E2kxFu7dcTlWw@=?zFj6*tWRV9G6dM=RWgCL^iC8c1Y6T=1$R@tI- zr0s0f@)aogG1Md)nJ5lWT+GS_{X;+lW1;)$^O=lerLUT~9IfY^f!D>>e`)#MD(zI+ zBDecp6q3Z7rrKjo2@p_16_DJPk71A%NWI!z(c#$bj?^>Nd2>RVhAG+M2|g|$kwVrx zS6?8kUM>F`lTmE>la92hqhvtS1sbFVAlu`v>yUg6XEo{kI* zYN-5(>IM}a8qjy$vs67mg~51Gld)hv1pU72kws&hh2OE!<@0TmhdN3Q z;wO;^;V(k6PkyiTy1#6)2vHS|VEsNKyU5xdf~~+cFfXn1v;tEPMC@2b1Vk?w(kc2>rl6)AA7j4ZP_kkvfqVk zV1p?rnG4p6s5%Q;Gb*n*W3Fsssd{CD_M+|6MR3EJYou@&9P<#q5vEC`MFGuLXk=_=9-ivc@$$+rNv_v>g%Qk3zEy^9BqK*5i3yU-G~u}X!Puphf^>KV z@cY?=q(QZAk3$a=l%U$%o&Lmw-;~R#g2c?4b*$-jyZUeX8eH>`vxl4t1RO8B^LrTT z2lY}@mA~Jqd6cI9r*^s`8RENes&`Z4hLk_%g8=stdXLU3gq*-~Ru=3!)ACXAdhJ&W z?;bN&qTr-JNHwNi!Z7yVVQ3grt{afN zWG$O_hvf25gWmm+ZXmkBxRJ+Z3+5Nha`FsKvoyaUk-QI)=4VR%NIg;?KEB~BUV)*L zTR{u;XV%6snpe!XRSp)Ajbi;6k0Tr8ds(tKH^pR>7Swy_4if73F>qN$CQ{$z1-Kzp z+=$C$kDK|t`{76vd@9?mmeWinWges!lN#nJTK1aU=wc~>uX0KhUpsGyOzr%m2nYL( z-KVC@2&?z#`~GuauC2IkxiMVWo$rI!_XO?`UXCeR^H;2_vR4Qhpj`*ojK9R+`=Vd* zfRY&W>}B3y{|q9Q-%`4FfdK%3pa1~K{+}S?C%n+;Khg`URIL9&BmCGJ=*uvAAIfjJ zhZt4J=0+L|kz@;s)z=QysHshID+sXANEJOH2cW({c61DOGCBTB#X{%i{+; z6mOVmk>@1?94UenutbSByIrrzsh^lO>bytIcjkmjZ9BB=+=qy{r=h5H(`}m%&Vp`v zzndc0D|%!JLo29;bx1goTWy(BvIXEjkF44(y(e-tMA5E zK2^%S7Ze?=q3RtXe5WI?Yh*eK;OQ)3{yo;Qz&E_xrRhv2Dymz|H`zU%4nJ5Z2%%$GIlb2TzQ)j#2s=q3afWLJ*?7j)Os z17w;`!VEDJ7(y>WEaal+7p@QCpUjtAy-1jAWjcuXXV@rzqJ>hz9uKC+JtDLTQXQ#z zcdjTC9x~|01~TYA`AD&^FkBKE0>hY(X0;QH94RR_TUeO7UAEBT>;0Wawmf?#^tW4R zvKp_OdmU*n?5R*psg9k2ygb*v&Zj6{;7l|Vu;3CyU0ZwtE`U9lcsxjaF#JBEp*g=b zHg>igP{wV1T38bf`T{lq03s9|64#!Y>^xgLsWsm=Y_zmTuOr1j)#ql{27}@3$ z!$#ZCcNr`$vmhq>{g?6AHk?kJsHPn%=G0xc>p4`G?2R;Q9uGK<*am6YCvvH|& zg>-i(GL|jyMd*>6Uwb@~svqambU$uGXgm}NYAEaxILT))STQQ@7F%_7z~2(&rN$HCNs4OjFJU4Bpkj|esr`qYi$j_LSFe;SvC`RIu zYt7Xj-l}+Y6~Ybk<{DJ*4Nm1uGyX=2)gw=Lv9(Zu?kMTnKmt_deTE(~!)_Wa{JFw! zacO%ID+Wt9bqK|LDylS^#!*>Ah;8h#a+Ou_f6me0peqyO&KO^EL60uD$Z17m0U_}+0$ixM$3LesI znyl%{4Nx%jl?S`L7BL^%KAPV-gE!Vv& zQ$akStqWexE0rqdOqbSz=jOuRSSu!TTeXCLlV;VL5^;1BCd0T!)v&+AJ$MSY2yrE^ zaMvaLn`vq=8NPjTedGt>IrC218-x2*v~x)!8mBA2ZqN5w}kZ{%k~3{ zkU~|>gAfKQB+SucgU`yNmv$9g-a?O(?g_&0w%#1gL6qsr>;EEpQ6r4Fe|EtpDq4WEB-;ME@J}JA!p@LHwiR-27P2NdF%zP4um- z4D<~x|H1YuY1hotL3>}<)Pf@7Qh?y&%pl{nF}FvYtdU=$se((ZpIaknGZ3#1y*#oR z+wp7N{_-x}TRFyB7x$uV1H&t{nY=Pr58Hb?)o|IAV981NM6cHKssm_j4sOb1Ujfy( zrfR9bZ*jC!@PQg423x-u@^jQrdM@QRcl)|nl~l{Z=NzpUK_iZ({6>C+yac80u;66a ze)<+F@SWe+{eBmvdPK>iUsJq;oxu1|VOOhw<<|&A(OeXZp>`9b3H;PwECVeCEpz%M zhq(t1`+-PiM*azx$nYkE7VFP~b0A+XQ_T?>1{7m9En;YAQ!2@?*f+XT&0U6KxKglL zz&k<%YB}}y{+QG<0#MTE4Z_E~EkIEe7*XIdwve2>Au6948$qpcRUvAQeZEvq(U$_B zJHMp@WIIOgjIqe}IoM1_DT@(*F_12()$Xb4@5u~K9kHz0c_6=X^tmtv+6|;hzSlHk zaxY%h2+lz5&SPQbG9Ll~^%*AFa4ZVzO*E=HS-5v9go?5p^pO4bq?to^%%-9QMr|AXw=^*P5+RF;-f8eP?TWBks9$Bi!Fpde|PL4 zN8lrOKt`cQ!~>Vs1)g|{VgahxW|!E$+m;COcXHRPSo5GuIvP}f<75im5^}xD($a<} zOGbzuo+MGF++ct{yLZT9J`H)KlgKwTnSiO- zCR2(x-|wN#r3)04o}N_q=McfsBE(eZgP+Vhgy8$BHUpha?zC47GE=2UPmgt9BSIZt^pmSv+=Rh|8Bz4R~VA+7{JRp$RA^ZbjX`2W;r z{-Z{1oc>W`DwaP`23Vu-F@NkbwV(;cdDb1#_I0cD#VC)1jqRq-_h>4n6o5YD4 zzq1@0s&i=$O@#=V+x_8$U3zIjH>}a%%-Ni5l2zsR664YX1#PX@x{oVz1}pW~V>hp! z__36F8T3U}S!R6NczW?)J;ZeKV=a?DJDK7E1jR)u$TS2k6b0w7IYg|dKiwLT9gy{c zqY9shA~U%Xf(GP9_#`0hJ3GYZ&Sfh&Qw?$|CArFF5njZOE@cMVb>>35@ifc%bmt+8 zlPFLOkFnh*!iwX>zme+7(aZIb&ZYLWkwDDZGx|m4myJm@b5!Ogs@!v5l)+h=Nft1U z&dY%(A-5Kbm>Z#_)NI(-<;<(qY1xOvV9tYN#hJuvexMFso;+43+?!7hhmODVaM3wl zXK1y8ztBa{sc1OpK@je#HvChS;#Y|L1u29uJxEG{{?4;DWZ%|JId0&w6Q~hd5fd~` z08)dwk@D5Z{~+w0f@}-hEzQiG+-cjkZQHhO+qP}nwr$(Cxl^70>5lHI6IEU7YTc|@ zF)!vD-#6azjPVDz4N#2ctIgFP`j!d}^jtI*lpjN51<;He!`&X^sU}26s<6@xiI_*~ zO!N1tz`^L5-cxk%g-74qip=*$xoF<2!g>z=PO_Q3^7TDu%Q@bb{@H zLD(gxg+ahf!mjc4Tp+^h4C9XPAMdoOTEocA}r6cq!patbMamu5>@!NKkP8+pIp9Yp zFKwezD2O{)Z@fN4h z>N2KaW}0i(q-Oo=T4d_9R24M)PE7{a4%fZNc%hUBZ$%|AC#-QgW=Zi&!1^2*y zuteof#}No>7oz28wl)sd5)XHeiR2Wt3I(GM&5Lz%(BsC%(pX(A(n)--MQIZg5D#Y? z#EUyK{n0*8d8R8%?TbViI}G{1m#qGSra+dMzNWbYnU(Hef)lQ$RwIec`~QGf-}mkd zNo8Td{qqXpWFb^YQM_@#0$dDuS4ZTbv6OWzr*JQ6hWfbvtOHxp(*%pwaXJ|*4lzL} z)~a=0mmzRuDsqovw=jN;{+W=hS>_f@rb$KX71h$yz^BxgDq+{Oh4>TLW%DSo@7p&R zE(F66Q7j)^y@d>Fr;HrOeTTIQc~UWT0vD)}(Rf0$5cXc1n8$pfg1u*0t{l8gK8YCX%mwvCD&%Xoq|8$gburbv&(04TcAI9vj z6H+BwkAlZA3f?f7;6Fq5;1Ci048U+gDjO#9?UI|Z@6XLYv8MI9>~zoB_S^I85$l4a zae-_-vME=ZQZ3rH5>?^wW6amhl&vn8f7!miehIYt*$H$*OGPI}DStvD5)c=&Aauge z8N2Wb?S{%VWF_ed*(QUm5RW0yUi^F;;oOW*@`#hV0iG;(NBPlvyqAw@n`v#6v^^`rtgT_&vGF9 z{ASFi$R{W`(PN0{&z6$iz>Id2`H0%)qm!~j7e>or0I4Af)WXI^(p|&U!FNT6 z$bYYw`Xr5_G{dg>iSTELZr{_1nKQ|VilYn!R7ZyPnXV$)TbU~yof zzBFF(ja84TyET=ff(qst%e993v4yq%D4sHtAWqW?N0X#Wl?m=-m$e--V>ni;EG=(N zl)bElAqWmp;WH{$LR1s0Brk;AuwvL0wVem}FDNb2dYNd@VnPon-my!Q2tY8VGg<1) z*zIJ-b)G#0$SxnEw$O_d)tm>X+2RSL%DY9<^OreFWd6Or7YN3y7PT5O~< zdeZ2KKVgro#cbJc+Cwui;5prxVVZ2nlrcXMqrXdRkvhO{%8U zlyn(mC*|UV;jVyoQn~vedR4Rc=KesYxKp~=lzu*O-^oe1z$SG0mgBQI1aN|i=w_C= ze06i7+TmWIo#0-z^eIX|98udjT9O|s84-U&a>e1|d8OP=wvMXAT$X8ZhCQAexeq@+ zRne6_0aK}Y=ZT*m3_`N$+y;s0&CckI?^>DN?*on(OV7GDxl(LYa@api9B9&Dy+7K# z;2SJLK78u|0R8;zK*>Ng1-`pN=Kh!1ZKj8IKyZAcrM`y%^0GC98{;uBegT}C3e&#W z4%!V_db-U9L_&jnUu(+u$*S$p+S09FW%|kXSMPR1$x=`n6GUe-yE9l8^0zGfcwXCr z1CdD6e#zhW$XYwyk!3JO+P*p=wq$rhsIsD|8+1gFF13K_B{#CtIrtl=2)~L{$B1V0092?m(2hB z){>Eym&+lk*x~9+`*`G07b$0e%NCn%B5q(~+_b8g3wupajRTmtz zb^pii{T%hW$OBYJ`eC8&T{PnhT*+CeA3yQIz4^r>paD&MG=9$gGI3}kCO^y((!7Vn zag1?u5-qO=fOV;%))^Luu%cZx?m!&|*237pGNzzrxh%bjun_Yv8bW};BhQvXBild7 z%No!3Uy|ylMGafj2hg{Luv&he&q5VuQ;o@Mtq@gh3IRT`(AccyMNcNcW$nbOU#~@U zbW=^>K*gi=Kg=GfW+F-bf{%^7%POsCF7Ytp{0z9e%|JX;XsW1~P?aTc=ZvrfsB~ew1b-o&k`a(TMZR?^xjFARH*0wfJNW7Z zsI;Thl~sPfy@5&)9X88D!&iitzO=Jqf;6Kt>f4DCqgr_c=H7#|KFl@$>`9hYwZ1r{ zL#vjRl}??OLH&5nHYlZ>Nu-3e3Lzevl9MBJ3>fsy(O8IaUK*P*#=A0w%MSO*0@N^! zT$@EwS{BvWDKd8Rm#pZ<&t;FBK(2O7><^pUDMtT&9vwcdy#aYmsh!eri)A5W z2x0nHZdh#PB%iWQQ-k1qQq>pmV;%N?;LjaQsxNFE{Xon*W|)&$?Z6q--!nH?EoxeK zWY>(&uYJCSC=C|eV#QV}tB;ZN7U?Gft~FQYB{&3+pmT0OKUBn}r%a#}&Kipq!+X`1Oyo=n+gq|+Wn1y=S(vYTDfoLp_RG_ko zbV6P0R5g@4+2lTvVq<%aTr*Z)c1VUrs>M8=NSJeb1g*!>aHm(OQ_gKO>RkBU5gXD9 zc>bDST7#a#=&zpw^tVi3b}vER4;^?O_Yv2KxfUlz3|i7KHuy}Fo`4-_2^D$X+@{TQ z(`^V7X<+Y!mlm5tTBdINA3qFh&8qm=PUsCff)>aPT`=Q3Jo{Tof<*lhPS2FQq6sXE zn(RrBj~%;j2&XFkW=v%8JFd0@R9ew2P;`Q5l`u#+QV3LMI2a>k8{+u3;RF%Z;F|wj^wN9?m6@hxW9CpTN*W*zuK2uj;n0-f;50woM@#l>N8QJmq+-7T z7BRn*)AFFXW(?Fr=N(}B*FNtUq<(?6olK^CJVCIO%A5@A*xa5v>g|YO;5EI);|Mni zYAL`MnAO5g#p;?VOl|)mHDP^dopR6e*fyJ#^YK=ZWigXX&ZJ!i$E~e)aF;$=c5JiT zW$|!%F9-tyyY&+uI&B1guHlc?1H8JpTiPr2n$CyyI{hFU)jA!^sk)+Y{g^|m6q#8Z zV}W6t`E@7rcB)>U6!ooDq#~Pv*Z&x2aB&WElry|GPiQipa5w`1OQ-%`ss$s4ky7Za zMA#(XlM8Ku95D6#2DF|X!H-GcZ-w}lE+%!3(Z_eP)~cjjzaa!>3&H`4tZEjKbiwtw z;{JteoATnFz*4;W`;YgoM!Dn#;w;H14TS?#`HHdRU+k%q#;XPEdzsTVFx!fY#7pZ~ zIM&y5!UZWt+j;oq3)U%5JSSI+Xser{ec>di11^wZ-HK~UH2M5o)n}~leBD`tM|DkH zelxS9fr2Gh<4#!3M7*b%QWQRWSw>)q;GJ7eXI?WweeK+EY{ zlWg;APPG@ynCc$gnE?&ZWen4#VUsO^r=6;-lU}bDwvxDW+pghs-+&rVMWEc{I_i# zU>0p2r|)A44k!sz z8sVbL1uB^uIUe4d@L9B}dxtAo1>MSru8`R5Bd-=w7f4Y`%#_j$D{1E*^*%nJUw0&R zL+Wo+Vx-9}yE4n6{-p*C$`sMBw34$(}Pnq)6CDA<{Ngx9QKYFC@Uo@ z)tW){mB+gxRWxVoElO+Uwe2j%6@XJ? zSG4$T@s6JmRAte_EdI!%AH$blX|11Nb+$W}nN4-bCI000-e0vN<9`8+s%ZQWdF6%y zege?yk?U#qVeRzq0&>B&LD~WCiS^OxvG?Wrii&E3?Ezo{u7E&UL9_d51Nij$``H2x z`XK_E{-FWc0v-d%0h>ET@FHR;`~tc_?;G?}1Q7ib0Y4!f9fihxLXn8zgoU=2ML*y!HbXlHMhF4 zd7?eMUXE9bii3svj_>{m4XQ)f(nbLG3Vw=xQwa+6hgXL`;1QRQI8xi2gSg2_I>7hp z@l-uM#}NOEF1}ok$S6pHsU`WuAO6MS^5HV(yH^z$~S7c@Y z$B}4X{WpZ~Ne-|bByuCD%>)L0(Yck>|F<(I2rGYaQ-J=Z`i3i;5RWW_=%L<5*Ojc~ z0yKfy*ASkhbBz~ai#sE%>2E|@RGc=RySjkBNHYn3m=XhwmtmB-fy|uqH8xCT0?{7g z1#mM7y1b!49X-N46yK9EaS~tALZuwOr~gqwLMm}Vgoq2A19pJ`;lzN10wEo_e(k)8 zd1gWz9Bk>Hw`N{v`J%P)8NQ&LSkS#VXPSfv{eE378Jem7-w@*9DGV?*DA^@j2w;wuTS!62jPBQ?B(Hs3>!V*iLqSalU3uZ&zpXI z7Z@v1CQ}H-A;d9|#X%V2k${ss$l^DXqss;p>HCLs31<{Kl<|@{g(tv8G>Lo^$1yDg z-Axo#wh1B^!S~`p&oRe?8xEH%p*UcoI0+Ae(F5bN%0*_FH4q_5&oLNHH-o74CP6_q zKt1g^Rkhr86xip>i%5ZN5OAV*(qYdFiNQO$2-Lh+Lp4O&=K@C}bs5`7k|6#Yien&D z8M{r$rPLr{z3hLI41mfvqSZC+tX1A6f0!MxMY+|}WsVbeL;hj~U_@FOHJ!I6U&Wsf z8e+-0SP~1G8`9{TQ{5@+p|+1;3P>I#7pEbpgE~PNACifDBHGlVGji_4Wrd3vD8**? zm*F)1?Jj_rUJ0@rTll(yh5cB4AsFFr(wC&`mQIu06$9K#RqRCz~5R5(x7r4ZK z*pO03_#iF~!w>#06Y`Z;Fvb^X7tj~N{?kThT-eK5JY`xTxgP$RfY^bNrAAhnlNGX$i}?Q$4oUnm2V{&x3#3KjbXwGKvdNdm1UQ!!n_i5@5;Wo(r1f8O$sdT{la`S zn+L6|ZL9VHui10huLP{HE1mJ)q*V^6=dQC5x zsgbZ@!}WA+Zr-qI+_+w@k?;sp5KUAlL_#TyfE#HD_Cv10m|OZ*V~S#(q!9|1+2C7S zo_*~UWa&Rac=N$X(ba6+yT9O?yN~RliP;_AJ+rm4(OLOzl>4}d{`vT+l9j#Ov@6T3 zlB~j1Z>>|&)c#d8cq}WK&A4|mT69dkXa3bZ3tp&Ri>}Gm%dY1(_geXGeg}VPe#E)} z^^(}`vmRHzS?mmcymi0p@Jx-q3%(z|DZV+ri+@Xeb9}3O)A&UAX8ET0hWjS^hW>>8 zWc|eCo=V3+V`cs_(<-5x^LuyfFRoA=BUp$rj##N2Hx67!ZqxU{hR~-RGtXI^9M&@) zrkRX;TeI$Uk8r2$GmzP=9Jr1>$63xZ?5ySMJtOLhx`Zo4mPr}$8HJW47Bm&@tta;x z=@>mO?$^uBw97r3AL`eu%_OTRHN`ccs;!h)9YfB+m-MTOHHh1YH<8<~ow<&^2R3D! z-8IcMjWk-RRh$JkT^+C&Jmr)xR)_oCogOcDSJ&&ij!CD$v*$UE+^Fs}uUePwqmMa&wMtX#Kl4LP&iyBmW!r%b^@t8=ah!3&-T0B61QQiO3UgUppm{cqM ze?{dB0Z4xYu;w7()<=p_%n{hhjb)QJr8Fa#Vys%X?=I27P=-Q>03GbCVs||m5AV6c zZ~(x|H66V)Rtnr+ow`*t-k&+n!P-J95`9ds?!yDUt`rWfCg5~WMMeyIPbuY z^-4K_&EYkymQ_5g`Y{>spGu`mTlnlHixK@s;6&;6wDa=HpI*s~pK$g0AU53MOv^di z&*?~DxC*hOM)bBc%L7Y-BI~t1<*7&J3a{sLjZg!b1Ft^sj7;hE!liioJFQ(EE~5AZ z%CHld*n?dv&1gDdsy1-RM9#C;E9griA42zVBKEHWDV5rO>}55^AHKBGc?Ie<4{`f za!}R5BfP7CD=o=D?u3&aQ-=E@&3mTUkmsTCBOCm)Xx#*xq|u3P$Jq$CqQp?7q)waS zckZ%STj{6V6oFUJ=S$>@3-%X{b0Er63Mec^XpHci8uo^z;(q%c3dF_IU;MoDK$aev zW<}eb#OcH4N6po@A--*P`nskVNh}Q7^^bHt5*zVYL0P92d&2M~QO`M94kQlXovu1V zE7>76i^RYQ#7m)RAt8RDUy(V65;NgP?5+dm|2R8f!qdYOfXV8E&>a8E*%5Cl^T z7&`LYV8Z)3u9ktQDSf9$6!CF5?(5+`Z^Teu#ja@0N%8b83oR%wy^+0j@Wt3*I11>^ zVN*tZC104lqlVh9xa$hBIVUu;K;c**aTBO~&fV7U&eah_RA|=S;-(UVbLs(ItN#$! z3Tv*3?P*f|0`2 zZD`JwB$lw_sF6d5vnb|7rx(EW?;zW7XUm3TT`OP^zXv50B+40>VSJn)%;HycGo1rZ_;_Xe1c(y9C`d-XA+b=J2l-l zCUoA+p6d@9cSMf+QQIzm&b(jp%6>Dyb?0gL?K!D$|5bGHmB~lsYu?l2JR0;W>EmX| zl@t-<6)MMWXwAd zP+I3HRIsq-2ZQHrWaRLE+;i9S+dzVLWYGUo*6(2{*!!zgFm)OIG$z#hHd!$6yYky{ zbu8NdFtEDm7phGy&4Wh(ILDRkz6ZbI8#cQzJnPf+)qv=ICaDqh-p#br%Xv2>OXFUh3Sk9PEVoRiA%A6;((0xHk-An_iNPn|4 z!c4a1j29H8%ttq)aUK!$88s!2@Q-5d4Y?EwF=5cOO`RO;0nJ3R#nr4XmSAzR`owD& zM=X9MS;u?Uu|$7XIGmu8VlmHyys@lSLCdEox6vg{_eIFR;W2~H307OMA~7sCZImG? zAok$v@?a9^?ZX64*<@o9L>a?vrxM>%N|QiqG@>^-xzOL+sY-G;Qj>szUj}$Yd11{P zzLfRH%xf>;{S%|gO&lN$&1N~l2gy3f%HM=sqY!@46dRbf->4Mi&|c~u5aR}1L}=J2 z59qse(=w4gd%`gDgcRgCG>Nkm~-aoiq3trlrjl8COkWqxrMBp}il%ypT? z;ncfX4N_E<#f7!{r+Fd+zg&$cFDluErywiwDKHQ>-lvKlwSSTj>Dm@RDX2?#-*qsv zs+=;?q#r6J_yR|S5y5_REwDw{HB-Ke4=di_MgsxcVC$V-gjky!6y>qi7ts9!U}4P> zKTRHVpc+#7ljXVegK75DLHO+~VdD)H1Dko#DfQWgeJNd#GHEnf_!rkMZCXEfxx~M* z`}uEWiy&Qu(==!;JT6V%~*)ryeYiZGf|z(iTQ>HPX|MsU(= zPJ-M7Prh%~INe0=MROJ@7j91Sj%dru*g0sV)?Y9pMJHFrk^ov`qab*pufH}N*Xl## z`r!%_E?x0jvT&tdS8+f&f&X!yvGi6SXThUWfQX)xLOiXqXB1oaxW72?C=yF(Lh=j$ zoGTwtw#lpOOy91s6$SijI^ube_A7V{~tY z#LCcJ`jPaV{KSxNfnGg{0XPt}s{3T-JyQ!M$62p~vXW&bV%==(A~=cO1>rRM(d z{BjvaFk*XS#o~xME`!L1Zi~k9}_GH&dnpxy~HlOw5qTh{ZB(h+1o zihSYJB5wUm1k+b7?H5Wl97`EEPANE>V;&YwqROb`8rB3d`k#;LQ58feu7ozo_0 zbJhwt`=m{o$H%xMVA2#G>b0`{;PD2m#_<&4N@hTNC?QlB?;(1(LzpMn5IP3_yzk#U zfhN^Hb%4`zrK;r-m^W?-CU%jaAe$w31AMOQ^wlU6M8Eh-#9mJIS{|-2NBsF_4c?U1 zYAoKq@;2okN-d@^7(Rz=)a|_=xZXPm366)&v)Cv=tiFrkNUc0 zdVU}QfZCyy5R?dmIH?n7&h#ADZC`_2P#TKV@Zv3tg&tAB2KVFTqCaJ8a}jWVJXx_` zZoz;vt>}4elE9=c$7*>Zjiz@pO#;zcswBvZJwsh=aMYjggi6 zuV4Fj58teQ8S`rd{hn3CnkOS$nXI74WIj-6g7*j5F@Qqf&_}1v=E%N@kiBJHOc9v$ zNKKRGbewUeakNpSU7WsT9Z&TSlZho?p3H=umN;}cWS9>U_Sf3Y=#^=^pzJTi+mZ^I z&2|$UT`ESJWKDhNAeWSq@6fRmF6BCiFfXTC&?Ig;fe#P6+3ER;L&3brZj>H6AIkTi z+jRpjQM}`Z5a{A*_RS8vBu)9b-~B~wHSN_f_~EnTv=Vf}gHi~NhLB4Azy?e+z>0`l z*oMyuka+sZNC-mBNc{C#-c*77MN1%Q@CyU2fd9rX4b7y1uM-?$>)kQdurM5$JR;dJ zGN5NmB7>e1>|sZ=N3_eRui+E3QY~S&rDN*&3A4Vd@=77vkNgdAOR@_KQP6t-GfM>} z9=?cdWh74Et#8eN>S4SDG^CG8RZM_lo!1jVtT&^tO%PoH;}*g&+Ek-}Md~{ObcNR1 zV`t8BF}veJO5?7GAuD3rm9trB;u`U461wBjh+4SH_-D9?GpoB)KDT4=^=Sd~B})FL z^L{8>#+(WNcG+#Oy&J}TFtPtKht*4FwvQca+H9};!Ne~+I%@3ClwALK8BUw z0|9DA&lwD;iqw$E%;lD(9 z;J*63x*njAeXI_Y(GKrhCqAQHUD<7g+?-8p0BZ=B#=l_!TkoRjt7)^yyoi4jjCe{% zm%0u>R5PMS6!LYl%A~7`A2lN3oP}%o4kw+XmJlx0D5O_0qd&z-h7)zjXQaj{P!OsW zbZuLQGfdAcOH@JT7?KpOC8r^@_~|kV+OXGL|E)~hNYVXRfnwv#x4Z_A-F}V^} z8+D~mD7|+Pqvp2NZjM3^(C$fQ%nB1ddF@EJwOzqc!gC~%`NkZWmp$gd}CNA%Ban*mTqweU)+W#DeZDz zwNU*=8Bz1-y0ji8vb#LHc`ob(k@}0ADkrL3^{n#;=ycgY}Z z#ghymi@4*WLit~(oxt|KyU{|R=ZfY?Bp2sUL-H=9C+@qz`Ia8G}&J?xnuZS!RZ z+NesSgDi*WQy>*wy5Wwu(V5)xC%qdJb8X%fukIv$$1Vy&5x*;sBxGy*w%dijAr8p% zaIdJ-i44oqy6eyWYBv?#y1ht@g8wj4O16|CNVlJCqN{8hHG#j4tz4*VTU`0BrT-Wz zC7Ge*D?)KDK^Qw(DCTYR5Sg}wL()?*7-6MS>Gh4#mdkOiAp%U|%wOl8Up9hAsIjh_ zAcBlp>CsNRJ46|*sRO<8bxR#(paQz^b60^$$Ope#NTwovef~cl=1PtjS6S!j|fdi5JHkQP4tIw=Ezj$ z9c#KtKQMq8P1B;L0h9i{ts`JODLM)U2S;N1+TBQ1xl+ZaJY-1D$n^q&7Je*hK=kOj zFQ891jnmR10ivVExWIDQYBV?1b#G@fi6F-t5!`4w<})fU89Y$H>^H^VW|r-7V5SJX z%0eWO{sMdftQ2+-UL6yh6~3u>iywmhqiYtZ!dqA_Ujr_f7RU;FP?CtMsJma&pEzrt zf}beu%p5b3Kr+3`2!e~LD^jKbr+BrIu3INkF>Kcw-0A$jMHP!GURy0s%I?_M^y>NH zQ1?I+f`=!L-aDIwgL5a-VDm2E6Doqt!+*dvYNx)uVs|SY7Ic9Xr#j~Ea(lk_r{&`S zS0>A3Wd-9Ju8oE6^2?r2Ikg5l%%e2NfA|J7fnMDO}hLDd=m(tcGf{ychHX) z=sPQg$=Z*=XhEgv^*%3I2kl;L)3gD+oj3gV=ZC-eL7XM}*GgT-@xb>ByW^5EMyDZ1 zhpUs+BGXJyhM2LX)*@8sbk$N-{2nLAel#VSaxVXGtI=;`&Q*gq@;}$Mm+Fu6J-2j^ z1t!}qeucyDsEIWNjqQBdGTcqm}ayeVT*5JGgaJnSt*1d8BVl-V6WiEYaZqkUBV%t;qT}uF zhPdymXki)DF_^pmEs})iYS}^YSHjf&l`#MJ?9Bf{y!@@Agh0Tx0208G0|}dJ`%e{R zR#JlinM9(w<=962VatEID7ORry7A8N8%7^@x>%pzaH4Qy^B0gu<%@CYWU-zEP)Jgl)<(I=;MskM0JgR9KG`ws3NZ^_(5%=WQ&Q70EVmJ zyjj4tt+1y(gE*_n{35Z+9+)}<8kCA+5R)hWT{_6UA>n|jRxsQ5y>$DDaSYfQT|d&!S3yyy6-nqe)U z-9VbOrrHryonvw}U$2i*E#iqgRtvJGZF&_~VII1fCD{B%!Q4b>d;76edwdT3O#{zq}mI|qQ z#P1fp=;TiQw#*gkjv*>#H1v=X-*aa@rNwS*gAwXQA3&xRq&jt|Z~&k5BDn7{qZLMh z5Fj>SKC>8fB^OSF+Jqgi8UF)N>pmg^2a(f0G9@Gd^2?~*brZsbN~N9NTmKyI<`ebm z8ef&>gay;r8w0zB3fYUpelH$DM-1%AyD$+61J>%f<*vSlA{AF&0O8`2adE#fp^as# zU_zRcBvek8sLdN^qK8-5c%b4gwSoNM^3uxCW(^pP?akV{m^T7=!h{J82pJ_K`jG}WY_}pp#1LaJu;y_v7 z!!_>lQMzw$8m-dV`{*6&2e_S7*p==iMt!5h9eQ)b;}fo{DbaFl!tnNAu*EM~@%#Dj z#OZ%l4gU>XRdzDB`fsEu2RIB?%rBmi_xFF0Eh0GYHF2zuN7GT48Ra(b zOBSStBLilD63ChAqTd`LWIY=aOVuZuzz#tIgzY2>We_r!Dyw;K7Si+#)yDnSQa3hK+yQM&AU6oGNu z>8E@c<+!J|cNWL@Bn z0n><=55Op(My&X8k$BkB;(NT1g>=4${X|oSksSDHxF$Xsp@r^8rF5C4jYN=P18X5E zL;76ebs74R~P?qRmFr&p^nVa~;t+}TCs62;#vEbB%j-Fz0q|e{H7hN*N zN1!4WyJ+jJjX@@1>XP+jM}LSps^>2w;{YQKW~`y{{m!Ru zN%REuz1mgvZ+oDlpv@+fz|*|>i}`3Tpyc4eE-6W6HUn{7Hs(D!2cB+=?Dkjo%lPhiIctx$@wDmU&*L^w@xcmj~4`z?)8Yx?6qrWv0Fv+mGtpnW23 zi-5cHFVAqM>c9Wo0pIvkoqaGSWz0tklBujK11kd^r_%J~y;iqg*f z@QPoyhr>k0qCUQ4Z$fIUC{%fbUUecIzwknOh^x9?r59e;+MYssD6f$3Pn0tr%pM{({B)yvK-&_;5U(_D^e>3}RoUIN1??I;SE_*0~^uwEbfZQ<* zdWg{A+=|suHRcP zE2Q6%6*i`0>?9N8!7GCzAVP3o$|N~xelSUALw4lJDj_xl4(^mo42iy=oK%g#9=o+n zP*|VTkIFkghD*pRE+m#1#gUI1&b+<;B*>u+?8DZ2){QCbxArt2ZQyDhkLf|w&%Q9Q z@$(HvV`#>ajQ=ENP~DEZI0Xyb9*-yM_Prz>BpR+HQoSG!(8%5H^fgC<28;s*hiT%k z$~s=YMopUlPZY#}|2qB*10k_*r)lCQ)fn8kSwOaT1S?U zj!CqBPlX@_X|i9xCKbr^k_*fq2W|*BFDD_ShG-)F6NKbytM5V-703? z^_;gU+l@B&6Q^K@FWL^Qh<2IXbP04;jw54G(T(;h`es}d{l#|}EXKCWKX2liM*z$a ziP6gbui3$!&`tVnn18F=``}tTuKBvB-o29tN%pE=GPg4YmowU@f~xb-eWu_|3WKq& z+BgA1a(?2c7F(EXbYKKo_i(u=RoF3-2eIAqs|7Q4tOlc7P+)KXqX7c%FkER1=M+2> z*UjsI3IBZ1oGHC)Id5AH5TDwgjEpZxqd*_|s}V0L9&VE*#1qug z^{w&eFuSD;dsO<71IBi2aEAaKcfq1ROVFeW5En}!Du)x)Lu{GH3r}ea1x0k@qwx#2*sz8}}+PkAy8Ui_Fef6rMZe(jS^@0c@;TTaq#JG4=86`HLw~oCCnfsHCB8R8xn{SZ5va~0;Xxa&p73X zrmmkWyUo`OtjMlE>EVEkAh5(9vR6RKiX>sH;;{FPpSq>S9hr@kkYY+$0KFI!bV)CP z0V#{yffb(}o`J7| zY~;AbkQJqH-($Eo)7qG^x(wHWA63L+Ua{DkJ;O5V1f#deE@o1qv?&RPdpTJ~Q*V1B zGdn&b#mAk2x#_PN;+#qDq=_+v*+t9ehK%MDb;x6U1PUu8u2WR%psu4GG1~8UC>ua6 z34n3o;av2lcNZa9O`id9)=^kBmjb?H_34%hIvFAeLo$LYX7`?nt65R@+{vL6pZO@VK$NmPZ?rh@BUGjWnHnd$0u z7J>2cs_mlj)-82~W1j7Vd|c5|P5Ai0ho|r#8y5*E=D)NvGr*c78Y;r&dZ+AqwWlY% zSxMTxKVMQ`UqN)B0?H(?BrWm(+N&mpNs+f;<6+ifuMf`Nm#ZDX z$V-{qp5IJ5vq|3>(V?}Ua1HVq?KqGDO{p8Rls#9qQZ2l-uWTq;m8~eLIwhe`{@?y@YpZzVE>xgd2WfYlb4JS~Y^DE+;(|Y7CCoHDA-aKtrf8CsIWrW~7nWSroW&Ooek zC}JnlOr~EmTlTR%NV+Ggt4bj8z~z;fJ}fS$$qNtPp&E|nYs)t>CCg)sGwObK^w=j? z)3#*pBY#8CGX-DUc?iOWCD$@H&_ulwKH3pVo_`Y4DnaOMIa0}hIL4h@F4)z>&QYtB z&;fvX$9qg`NB)h0B7G(+`itWoqy>@@T?t-!@uSlkVYqc^AmvM)LON?8yh-vNg=3wRyyJn^*uxd_Pi(1Q-*Ra?{WuxL0=pL@yHn~xwk?*EH5PHmI z_ylm;QP-xwaxTY~PO*X_^{YU&ZeVrmULKbYu;MUTN!kotvLPEP zZVt8;D}3fg?Tt4141KqR-(vW%+a^15qGW_7Gf9)d<#OhB@z|Z~O0I%ig!8K<$HZq6 zf{^f%!~G{Hcab+?!#0|}JRXU7W;s&P_?3ASiJ?pg8(Jtvg>_Q?J-VQ+h{iN=1lM4V z6=^V6`vRa0x!Vu?tcgPq7xA^uhS-!J@_10w_F}>ZbyQ?l7qPKpXH?<_<(L%{nVN*mf?BZXE$xWla`c}6#Uwcxzo|hoQpQ_!JW3b!yZMnl1?I^6usU- zlLdu}Qojd+J!&W2hi11+5Vf+~pb43RKq+i7*VIU3nl2JPB0(#$$7)yBD^-attsOI*%$$r*h#8#Z>O+x2C);~BS-{UQS72;IqD7;__d(VT?upkz z?+Vl|P&}%cN`vd3P2{5ekC(BUEI)3jUNt-7y+GsJFN9R=yFzz*;ydrj879~)qbj#z zo2MoKKlcnqj~m&Os)}GdHa7B+;P>ij#`#gOJ>|@0jL4E^G~`D@Hr223L47$~4CjIy z+kt9n4H=`x)K^wA;}evUS)S*?@~YxUC}jDJ?m=7~g1u!z)pdaF9CJK6pWc+WrOWiX zMxK|*OWpO=3)05*{K}hWs!HX?QyW(MrUzr!3mUOBo#+-P5Y#?MC`{49@=MS1C@`&) z3?U%8wGRaGE9%U z@JG9EH#&KT^Zv3?62_&L90s7!a|1AQ5dG%9-pFDsNRFiO< z2e(9M?AOCr$`&&o`NV0OX_`U~y*1#*Wh}z&VxiU;CEn^&zCk7<30zynvwdMIftdu7 z`=O8nAGH*!vWu#i|J zO@9f}>7IlqNOnDKg{YLz)IRCtLUT6sZFT7000kMfwA~bbYmMm~$(hhT2OAdX19C+>W3qDuVsTS`+H>1&Z`LhkW^b3J7Gy9Zb$Q@FGtfAHBA86t|{Kt59hK z)ngapj7{TqlhV6%I_az_bt;gS&BX-+e%k)#AIohbA9}g50P|iA|mB2wo9jE@~p4S&|7vQB24lK zcvl%zKL{|9o}^>%`>n2svTz?^&ZJ*@McF_sc(7zJi)S3WE6nU25_Kc%#W+jR(J5w& zm29)dMBWmeqvDl_XE|}b;sO!C5PVR*?-yyx= zO;zIX2Wn?TMond7Mvjr~1ehFVVdl~j>d=M?PL5B3($-I6!-o}NREB|7X2x0+Pn2=v zyvn0ahI_;@es8DI;ZW`tfv01LAz-^T#AYnJ6r2W#R^QOKT0*^(DWQ;!Z3ofXC(d^* z)m7?!hDzRtcTvv9WO@CR%^Pxj!kTi@)grxU+fbsYkm+jXKZIW{Rr%#$b?%bAZ^|L; zX-3FtL1*NelTBmo&Z;&ze~O=`{#^*zw^!kA$vyB=z$dH6&d2@&1+{TL_nriz!)5c; zGCkIVn#xZ3f*@s&8}b$ciyukL9t)mlkA0Fslu&|HUF>=^H;%nnWbR47#Cd(_o5z0p zxX<<&ZU)S&2>qytaOX5n`0=pms3M60w`JuuYWG>=z`3-HGzyTEOB)9!4&f6Phm*O2 z9p>{j+x2`a`Ll_{0bKj$(tD#q_q$EVfwX4^$(u4E-Xd4_y+`1`T1m3lZ-q#{t4>h; zV?f*g*n0u%=zk5q0I>-dHA7*9HNG=|NQ;G>()0&;`8P-c;t)|eAp9FJJAP_3K>+6q z{LX~iv&vNBV9bnpUJuUmnp^jq)XY87g9RC@3{USud70jb(A&pjk1W^Jw#TfK6|1DQ z?|*44;L~rNX~ana$X;cO^(Vpm?~o#y(e>;vqT>vKJ3VKXA4HL8tM(6V=jYoL$@cg2nwDiheB#73%_M$^6G62;6($a; zZ#+jYT9L&Be@ku-BU#(Psv`C+weM4IJrlnwNnN;iWaMDV#Ed>^u1vIm4hGNJI>s`( z_@WnOuYo{)ubu}+L-%MQ6OcdCwAd4ofI{wumSnSW!A?4{^pI5YUD@)o`Uj^89)ke5 z7=n)X`uyynQSzX7GYrP_Mz(a`J7{|j>?WYW&brb9S=PjDJ_?R%+zHps?5y}xnnYHr zBj1e5sXAY@lETcCL-4Y$T4*vq?o{i~3L@5XAX*-<5=I&W<0F_TH0K~XE5^uO%b zl1IZX#y?ZE^-bs&jG67(&RSvxns~v_OgJ@xgTf z(Y?Oty%L2HLc*B5?QP@^;AqnzQx(ofCOsj^{X&ONbQb|!At?1Wre7(#Kv>mCjPo1b z2>WaurORd7M>l+Bg4O(Yue3dCIgk#>sF{o7K6(mfrny2I#&M-*Z;=LA#5pBSiKrG6 z2yM>@ge#c!+kK!F4vLLcCaR54DG9KslPXxnPLs%16fT(&r~`9c;@>YIHjbT$!GJao3;kE%_!n44OzeKByS3~*w?RN z?N9iOqad;PnhqWdkBt!Iy0PHp=?GzLwA34DZ~M@FOCv$;A#l;% zgnlrmDF*z^F}wQ2c9sxSo|L7juCHg!GjkJV%6ImIA^G~wKH5W(OucZCFh$^;$_Dr0 zkYDk?-5Z#ffNXcm5ah2(u#3`9+?p&FQ{hpk>Wm#H-gHz;b*4|~CJ>1nUL|i(cm;i6 zh$f*L`oJ;-ku1MKoaXK5BflqL>*Q? zw45}*tT|=U2lk$t%&ShJaKJ89p}CAsH{ll+>%3-j1fis`WdM$J+cfs*{C7q8%wlc(|%$?*(K(_C8r$x;Ibw)iS|?KtVaV#DB8pgGFD3NIN?Z33P15mt&)X?&}RWQ+C}w^ zqHch2qYih#c|IZJSvBA$VyyBUdkbG6bu}|0o5N!#s<+(`DmOXBJdrKNaPwxG+>yUA zA|kq)BkyTf8J6*<3%HVgy3OBJ~qYt9SS5 zG~fhJP~y#)g>Ls?&-PwTycM=Gy(U*q_p@Sq&`1Rm=ArlkL;G=vW%=qD<|rX5gB3{= z7C0k5GYb<3*za`=V9!%+g`?AZ(F<}tIJC+*C7{J+^>TOrM&Lt%*lxGEe&tpA`pD?-Yos1Jl;w(D~xVRs9v_7 z`WP)dIh~n;A+9H{D;H1uqWfXb24#HZ4OB$-Lt{J2Nw&+}{$yBj&}IO6XL(-$iF-E1 zMbV^tcCz({d5GJnPj?s-)PzJ;%>JYnl1>R7ky$Tf@id4=h zF1EEgNM)*`#}xV&n_xti^iOh_G)iIwTDcwcy9Twz(S{CmeOwEqDh6_XC=%AFneK~tIZ<@BPK!Ek> z+w#o254GhxO4Kr1DC^;=Y%-H7+CZ3koBCRyd(_SG<-HTgYn&Jk zX}RP&knZ9{^^VYbcr~Y%%}NZq;z_q1T!}F*322-4rXOxo)qM<1JKOo?AV20@8?x1Q zi!=3ufs)|r_d%|>TkVT1H=Oq}VIFOrA6MP1+d(m_2t|*i7(nB zT({&#jJPa&{q9jksvgeS!i!XqG(D*n54SK*aUPqTs$}n3%F(fSvp}Awcwm^v--bj- zqmyaY_N~L!(ia@Z9pGT9p*IzAk2mrCkslAiiA21mv?7-YtZ!w@+$r0MAXW6Ml$sN* zka~I({B~0&(hS$a>SwVbYaOIvV|~I@sJmjXi|mpsAy%cj%6Lm_ZH#yws1pjYV+YSA zl?VwZ2?W|Kq@VN~52&G%NvcHL#4i>Vhpz}zU#71n{WZz=jHE>t17#s(vDsZV#?A4%=`vcrW& z@}SIg6jss-hn!Q)!eh$$IJ4H0yo$4aFqDhc1N575vkV4qNL^WX@I9s2knYIZudmHE zA3~Y7DD@8*_Ud?h*|#x**&NW+0*UYI&R5#i0h07YEc}HTS0ai_>Fe(P26H6Aie>HFIM!Ky-y zPk8c>5_8=0{?$YHND>e1lzvq|p{O*e5`T5lb>F&YnNc0434!=WM@rFp**dIcN#Z{6 zebF7czUUCbT7E)mWc~bHhq>vCZ<`C^uAb&a z?;mSJL^*~tZ=^!^lR{KT>&D?6-6c$4CXF(fq%}Topm94x5XoB2+=6}O&(t`17fk3a{5i@%87z?tDj&&sB zgwS16YZOFIx+kcbX;((f<`EVyjY(w0Bu~RC)C^52d}1JC_UOwsc@Z7gdM7iOn`R*k z)|aQkjv%^Zs|xEW{>961Dw{3UpmIu6fnQ~6;Qcv;yF)~_PAO5eLL_zNNN* z(0yq@(EQ7euG%O~Pb9;u5np0o?2dY0bEELvSBI}6fy!T{Lb1WEgN|1tTl47Y^6Bv4 z6Z?wzqICdAyiSE|1hykw_wGPgN9lO*rS2>MH6q@&hE7F1%L|Eec}4r`1XK%@4I1!W zU?yM+Aa`G|O8Uqs@eXvoDf?MChiJ*jh)$YF%l@~tSFP0agTe6R&NYF%@{8r47MrTv zP2HX*(mt5H)&t|MhFobuTv>K?Tz#BqK^PJDmE2t@84E50n`eesmA(aGyXIQ13oL|r zNmFB!-`FcNZPvOz@x5}`MMB)Nh}VZ`3S)CWraH7RXe5ca2IuSt=`B5LOg#Y_)1&Cw z6y4~EtHGfG?6hJW@pSPehj)iJagT(pTBW-KLWDOzG~!C7a)j-Zyenr3a>D6~dDs5R|ltM=C7_QO%Pzg3k@JgbRT~NjaUqy%#qV zC$>YQWO4BpJmp5h`Kr12iQksH`%XaT!oC{%gGsz8U%$uMkgtPplDr$a1632~MY2Z= z23pyNq>DMQCoQl3A#n5~eivF0&`T(Xw)a5W1&;LE=_fiz%*TNkVx_kBDl8f>i2Maz zy&&A*m?KL#x8dz!BxPjnoy1RE+|(k%D3^%W-f|0mbpmxe!^yLAOUgJS|D@%;_ud9g zJn66nJ*M2Qsig~t#w743$+prD|BSxEw$MGK7K+}!z#J}@6e6%i2IW7y}?9OFxdT%|SH^K{`7;ts-^>vbX)z^zhp;2RgxY&sx+9+dij|zG3A!h_mS{;hc?Z?RRLF_PX{kk5*!EXcME_(|v4l*G(s z6MvjXI=WM6<*dxY+MH|wXKq!lHG5?L6o0qyDOt?W>DxR0?2;ikygP7o9HguJl}<0a z)vtrj7k1(oF*`W#mybh8*y+dgx!5^%)OJa2=;ilhkxmxR&nYf^?i7W^ zx5bbxm!j{Z!Pzkgbwyv8ki2%e8yuF^17$c{O>V7?{H9_J6Bj)jZR(>pvoytuF*QE#@n(?>HHQjZ)P+h}=jimw;ggy7(**>T!AC&$<-z*@FqXv0{izAVyb zW+G)hO`T%FXnDR%CAR+6Ds79_A(nHnq!=Kb?7Ei~GWxQ`%bLHy>pNsj+x;A*A(+x> zyT>8~`xTvre%aJ@va(=8Kb1-2g5xq`KocPB;i8>BtE3N=$TRlBl7VccE2oA)!N&&Od-jI`P8~TNptwsCH=19$k!BF7Wl+ddS0`LBwfbO z)~jYR^=8!U@f1V+@jLOKsJ?2@G{C5(H?&%~bzem6cnzVU8lRu^HucW*CZO^vx7N*A zl-03l!q_%zl_?#69FX`zoH&suUxrrygMOf##jM@7G+ z3dg`M_S4I_j9^W^ zK6rO|P#a7SURHmizQ6utlr0lhOE_g1DLO6vs->1;?8{kM080>sV0hN(IvtlaHhsIn z@Brg>(q+)a>`wTu^p3gI?WQedI!muK(M!PNr^~THUe=69-Dld*MUN1FwXp%q71`ec zo>+v#0|62I=81*wkF7|$HpVW1eU&S!mXV0`$bjb+jnzDS>YhFDK_A`)bf)!pnIv9g z2o6fU@5{pB#6j?BE5J!VC>}^o6bqACT5>qyZo92dAKzb51cX@JE)}MV46I~~`!onS zk@sf*sfr2}sr*Y!Me;(jhLWC2BC|9!23D5QN!Xg1K1>1;5x4u2b_~pS)T8t>v@T6JT+yYCbU(mkO*ftn|6w=zop0*1;R9jEU zBR8i{Ary)KN`Xp~A4lhKh>Pb<)2U=`U=Mriln+!R;Mi1M&QfKX$&x5TG2&33z||QV zcRgG%QHj=eE|B5(MmwN;j(_e{VFpWI%X&Noj{{3b1mxp5me8r$JfZDbgbt{GIqaa1 z$D8|{H?V?GqqO($*R18}_O57KI@gKYIz~I`vc2tag?z(<;_abPzs=9R?r(bQJW99G z264}SRnFgrhp9G=tH<4Z)NM!`sawBGFsC+$)4bCg z*!M_XR$n(#7}sRpzu^ShbjsFa<73N27s3yM6~Yo}8L{5m8ChVFP&;&lV-XEI>mHpL>BvKge zP$|e2lrqM-SoSfUP_0y>jURXf6w6SjCk}@T^N+bls;`+SACC{l3eT-Q~z>MKg-UJPHJ{35Xfeq&|5ix)OS zVA%5EM1=w}V=}#*1dFMtfg(V+P6JkcMx*&UIrrge?_@=MWhS2@jM_tK19)UsnLx`B z%zsJ>vKA{3Ujc)JJduG^vSzcAkdpYBsJ={U*0?I21C1)R)&VIQLbHQ`|7`@buH8QB z$g;9yG^XYC_(n*P!^UVg=T1I~=z=EOlH|Ij1J*>}A`YeJrzU-dU6v!vR2#YC?NXiK z%Qa1@2&z({lnj&lkHUvx4;qx(C8!Lv4E@j+XpOKPdQI_jnvRl7zGt#=Hu59VL+%b- z@m8H*wnWU?7RIIz^Yo}hp&1c&)l+cUK8W9itU-b@nM%@};z7HexYivn#vJkUs~aGB z=*5gBR(ZJ&O!|F=bM3s4?QdG_=Hd2|U|X3=%hhW+o`v_LM#=``O;_LYz%oqVeFQI= zER?FUhMSv@gY1ja^GVl!2&*n|@2#r#aVf)Y$7&JHo7w$u)lO{6ZAA~pp^`4Rc;mbMFtqK8`PqXs zn}qZDK2!T2HNcWJIVWk&_*TEgl(V1rb*3SmUe#*+B7dqK-BP<|HL%yWn^}>z{6)K+ zB=SCMXyhKh24F0rp7qMYHa^-Y)9GaNAV)1r-D-+%c&pf6?b9UtOzf`|B&`u=``61x zBBK>O48WZx32^E72T_tAk7jhuZOk2Ybph9mvRK`rDLUl7(_3;l#Y72KIRxRe?D`~V z=VLKWU0ora>KiL)lL4{G5ibwfgM0}0yf*Z^+s9FdQTq#s{IUG;MVX`(ti5jMdyeuj z+;H5^C7+iMlSk3tNHQUDk5IdG+~z65@o)r!(=3cT;QaEa0}MY;6bFvt<}xt)_8}75 ztT%kf%z|N!tKN-d$b{$viy|$mT{e^Y@SfBW&63XMB$bIiKcL2`nX?2Ai7lJcU@uRm zW8vfU2Ez(Rn1){xxwoa$=?vt1;H-18tO4X^l?gQqSefIS*qp1?dW-)3(k`Aw!k!Gt z$~w5*rYJ9$+5mP%=T(ss#>v>5L2QYg@f=QlQO>GTXfP*c+Y^OO-?>V}8PW6_>^^hp z%Xh#ot?EjLV0!^#L%X=e?72JKp6kZApA0fo{AQSyfWO%*+r^W143(;VZS{md6;oG% zMfM!P>S9rbar1vC(#*~uFJ%O+A+~nz$9fAn?4~GkkXlJzsxWb8rJW0`Vp&yeA%c35 zsG)pePeX>NSzVnZZ=~`1CYnT!b}}2iE6;L}9|pI^!io0VgYfH*#r;WzAr}$RpRcq# z4I1&AO2zIN-g9Z^pDtvUd?4JLmkoA-Mol0iAcu%Cfvu2`2o{J9&omcU2;D9C7BNTl zUg?Yj)r5uuiZ773SB}#_$any3RPJW&8Ha;uc#ipDht$-ZzczXM-6w>Gt(uo2*Zsh1#kV2#gJp2^|7gvYoH?F3; zG$Oht%#iN45nCVd)=E=6Ll}ZdcLts_ad>xE46}cYa!JaUz;OzgNcRARAAnc?uU;^J zc1Tm!{vON;5HPKgA88tS)6_u96J0V|#7taMi?z=RjHAOyvLGqR@6lr{HWD=FA=_*I z*faG%w_O(j?zHZ;a)G5PZwsr2Ry`WFxX;tazxeoc#8iNOqoky;6r&y}&&$fA0)0na zh!Ch{M+sF8CF*xzqB97JV$p3pLpq4Uw*3CvKH1seF(k3_wJ17&mO}iu_@S6F$qj!& ztH9L~iN@}@-MFdkTE%86=V}C=8G*Sjmewor5^mb#_J-*$eSVeeo-yGC^d=M#e0hvl z<{-pZ0-I?G#O6&JgrYWK8vQH4(vdZ&Fn6Ph%3~oNg$KY3ei*FY? z?;u9;PRajItPrN8h#b3hMP%@;1-ww+DN?*GqJno!A@<|DA)mOSh4JkKqolf+(DnVj zLi^;s52xq`4Zm=JQ0I_KUXmq-t4mA);*?b*;KOKHh-3G5BTH-$gu~&zXCuE7%nbAIqQm^)im%reoVn2FKW;Bga&mc8(};TSb|`#M~h_rbOKBq&u#l zbbOv#Ba6LqlWQYD`mZpXJP^OBNV1B5$AE7<-m(bO-$Iu>d~p>$QWbPYLmiZ1>bA8s zY0mTAm}-~j8C=&B->hZU{>4C#0Q6D|ng?Q>qD_wLdY&oO@EOj^+jubBjEqK+<d>26 zz&iGzwo^V5X`;sv;!IZO55zcF_e3ZaSBWlti#D6CXhyn%hVJ4Gr};T$zdbCvBy>sS zBeVmqyjQ#lOup%n)%@__MT4Ynr0_U;mDQkPR;~R|zQqvaNnEkUb?E^{$=mDUyZ7%* zeY=)HLl)&`tab|%;tB(706XKB-G}e%1_EMJYav~=ILwB$rywRsfwl*?+X zGM&5>5iCC}Xf)U*x%jYsqi>DRerSHlUxMP{hvn1^&u$`{Iaz1*<~#6i1DE(%#?{Rs zo3m;D#lc_psJ}38r77BGwwN56BCeU#2L3a2HG|3-FwTBG&CH#aweT9Jb-zUs-_uc@ zY=x(LNR)ipGV#U5os%#4wv+GbpIqPcLyfr0-08?>0j_VBfS+jq?>8WKb2}4rSHP9E zPE|c}iVne>@J`@sio_ z;f6kpm*L!u>B}t-W;ruC#AuOx%TWflvkD-u#-NK}COov^Z5i9G`dY=@z^+TCy^&Fd zOAqHz(A5+1lo?1D3#F~Z>Z;#>e)Iw1=R-@d{d!8fIzrB~7u>sf`52n|smAnGnorZc z<3x)03Fza|mO0;=wr5rbZN=Ab_eYRTvN8pxvVM4@iL*pIEtWdNzi8mgO)l z`X?dX2}8p>3zpHb!``Sp9l7^_Hh;9BEFe^>>o8Rd37-cvC<^C{XoTs zPy@D!j7XUxA&guZ@DU}NU)irR->tgliTqtXnqqKI93? znsmJ8uw=Wd%@H#NN{ko6isY&Bb>CUvj|mETEE2T={_b%lz9=2$~*Byvd)i&mnq5k{O`Z%k-U8V-^< z%rw}!l$ep^>sKT9)aTa)j3X@WIL@%DL(B|&O)9hvR!@GnX4CMj1vP1_^$_y|f(u?_ zz*yry)hVh^4)gBF1o?k4^U3%_aqF5nY)}pFg zO3&(w0pcG>M9QZClE>fy}BIsK!DYhnLctdVU zwomu*wdeWGX0iTPhf6yCiZUX%X;R(mltnCT@wJ0FqUvKsE#TWvb1dNTt>Gwhm_Q%r zh=M&K2T6)faS}u49>H20B`?)bAHcl*eOzPeQO-Q!iaDmK~en?;{g6k-RJK0qxk0~imheF zy;6+2j5ye_SJJCyPRZ@IXHA%b`pFP(y)lROV!0M3{NzPkb6aVGEgQw9PcfP$ehnLf zU$v8C{`;=8w&*I`GuNU z>VBoM?$0Zco7=nXVn#u%o!ZQm4eB|py-^0;D!7j?v68m%-a;i4=(i)x=cgR`deWKK zf%T0}`vO0LRbqob4KKgq2!=Q6oUyvquBc5zBzBQ8$5F{??q+$M5ve%`d#UjOQcm&} zFfz~&0aEIwkKAb~Z7`*>4UT{|l$Q*)dD0sh%Z86dp$M?wJP!h}C> z)_xrJpGyH2>_3&V{8K4GdpA2rTfjp9y{-RT81=tpfxaIy@$ZEN&F##L?f+o>=&$dB ztz{ZE7~(>JBA!3|3x8mI0om|x8T`VEfDSPFa~FO`wY=EOUA+bZIsn|Deiu&ok$eG} zoY~JF_@gaTftPeFw9@wawhv@{Q{Ejsffn#QmfEkFikq z8-k)3|Buk{e`}lyF0XVEpmA#eRfz9DV}B%HKqlt@&$anm(|&e(yf|9pJ^ry8iXZ>Rl5;Y!GB=bocKcgjIhvQ-ngObl zh4sU_`?Gza|AqlfiNDXM?}LHiYjFkzfJcP>Ykx7s{!6tK6#4(x#-IHKHOp%M2(TYq z!2H|4?@QH^$Fl_I(B|{+99I@ZY~q zZW8XAvsS>wzC#28V*JrOz^gCdAGPdv_4zOBkDTAo(8=1#O5f4;yXeBN2bg9Q)w%&3 z03LAK>Hl&7!n*&@1Be>i7~B5_KX;$-c>@Fp=rzEXn(Qxlv$p>W4_Fn9ek==r?&0sF z{C^<88}k2s@CCe!?E1f`e_J2^d0_|megBcZpSaoIV*eX({paQIdj)?Dx&8y?3&;?< ze^>ejm$zSan}0&>_I?NbpNjLZHT+fi@h8mV?02w#(1H9F z`>QI_Pi+0&Z?XS>%iH&k_>sPkaIvSq;rQ_VCe`@nT$%S80zxs9kL}A1IGwN3_uV0D3`ZoL|S|I&1@z0(PztVnviu;o` zO7a`pU!Ljy%KO#4|C0ww{Ttq|qvGd8_|?Su6DC9VH`s3`)IZrkesY|cUj4L)$Vq|% VuGimJZgLp{j5_KlV?k0$H_g(@Tncx~Qe5Z%{+t;WTb|$ZeE-+?cm4m@^?bSxGjryg``qU~_v=3Q ze3+!)LkkoSMNxDt4u_(w=20R}`}wbbRPuJ?=4%@(pVZ&gVzpb}T`iKcvI|TT^7F>z zr;j&fr03@5*-WFXru@QOQ+BSY$ACem@p+lnPK_Eh@N*U2?#UnAaxSbGShe(Nw_{)~ zudUCuay_;lI9_`lq`l5x*J@y%w*5x~{k8Sxff?FkOV@TSw8w$j8Cg>1Kb?UkUQznG z)lv3r>Di}hn`4T5i-vCX6(x{03C^`2NAhT7v1qT2+H-eBspEXR`cWxk1&!GIEk)sN zf}Lc)>PP3xhi58EH`e+->MC-vqO5T4z}i}|LQ#_CqWm9X$do@_E9z-*`{$iH*{qXo zyuCeuA5uR#*FPP{q$m$}%Fj%h+eJ;SWqGpVd+ z@!j-N^&53h`Dx>sTloe3te>^@L7!^te`bVI)XBP8Ke2(s zyjwQ$@m%G6S6=>kb9OfGHtS0#7|qx0jnzcGd5?LYeX^H5(Z_D_{nBrWVqBo^mbz{z zuh6T%wbqWNE0&{`UohTLTx&V_EULhfH*+YOh#Gr6>)f`c8k=VwXG6uj!R%K0h|yfH zXp7EXmu58YwI_M0UG?S-_O3o0QeOMcawJj*&*DiAha+vZ$Qij&O)~yd(-~EY`1>n0 z*=yGAGWPc@Zsly&?SF38ziCjdp`EQMXXc=_{>7Q?cAeRFvtG66Xvjn#Y0~X9rD`$A zYm?pL_l2~onrJj9`l%K#S=-KT@mDSWMP)uJm7>qwaka}Y8fX2YwPnjDO-i9T|fgH(&JT+lGP zB}%nK6_uI(moBJYE@=OobST#q^>ba(cCIVxKkIgsc13UB7C4QyE1G658@X|3(jZ2( zOBJneI2@%>#nM9NBlaGChGNI`UZu%j=u7+S2dmvG)$B@p*Gl`?N_Ff_wd+lL_D!{e zz1vOI&E8%etFybSU3KTVLl6AkG)& zs8Z7-!0NBF$GCR;w~tfzAC6Q1UmZtppRW5)57giv4%Fyh9mrsxuK!OD)VS(EcicCs zo0n$1qt%MexY?&0Jd2a0w~QP%bmPvNC^}~tG&n{5Rc)+(TfRd->%^Vpzoo^^KB=^I z_5HDWIJl^48jc9qB5l*ir9Z1JkO;kl0PD&8DaRh*ZU!YirKMaG!&v$aNVj#$%`rG(*r z#`3d1(&1(M;eK8>pZ{HQZt@wHFK58OF7O3vkwJOo{w|A`r|(p!hxy_Ielj#r_Dojv^S-g zYD#gPuk=RFR}L?&&UL9S$Q`e%4uoSB(wjg+Uf2wXBo;*bFoXc_jlFoD2;L1Y%$t%=m6W* zgVl%N@>d2vGP6=T^IYZJ*8IKM2avlU zp=sWzbwefvXX(d&_Kwms|MsZBb1|wp0{xdGNN=lI=RB&b*VQ`e5Z%8x>^Plt<~xro zXY+SQbhZM=mHzqXAP!A?3#Tz zC&Sz2j_Bo_-yP>3=rC`0_8lf5+T32I8-_HsynL&^wbr~nTI!#@n?=E-_>clkD%ILWkcv-a_WE4-V!$@p2-sK4Iv*?^mk zjELOQwF@fGx!2qK`gzG@w`!PW?IX@DTw{FA*w3Ca$V)jBYQ}uZsOp09E;}=@GpqLE zBFK%Qsu*p0Ts7uXM%9=v^{E>3r7VQtO$NT|*|yv!tM8ezJtMAbyp}x}y=&f<%HJ_w zduerIytdpiUbmO=`pzyXm7=S=T2BT^IabvmDMzX`)XH(H$7|O){%O3H_M#9ewrbFq zLR>vq-f|XFJzmorAfnw_Yla1Ouc}Jbs81nzp zHEBn6-FMA~^;%0zW$~{$%!Dubq#K)Xuw~w20Q#5tk-UDI7;oRalbBX!l-Lni+*0o_vdx z%!n*QIzJTiJ{hU$HnN`2kBrp&szz$Vr?S?(&un3&-cUVKSEY+aHr#OMNbQ_so3|BJ z8f~FPl|HtPMU^I7(DLyo8}kd2anq#sz({C9^# z3a^>&-|>DO*}3AKYqdAZ3V2>II=pXMIMr=Mn{->^^pvOA6NC8ROF=2jWb|r6P^#Gx zxy9z~kmuoHg$6Z|gqV-Tv7dd+W%lVo_5?3`f{#7H*PdXqC-~VD+SwEQvrbZ&Jt3ep zAu82U@v;{uXP<85!wDaP9Nv{2v}lttjgPU_QFP8XwX}zy-crgLC6zL{AIQsg^3qq% zGLBX42CB(C>ERb($y!LWX1ynEJ8(-6zbLA%@E9iNz+;f>b$~pY9S-kf+9Cam%WS^k zQ~kUO@6S5QzOHLjb9u~VX+@iSH_C@!xtxA%Z&JOrE9pMgn01qVEDrCJT49EojSZ!V zj-qRIJm;+7_(hc-g}o_3UtCt$aJ8Na@VQ)n*1(79sh-g@c|AkFyq@Rm``Nat>?~QG z753EM6kk+X*RxnMSQM$F$OqI$6&zn}l4WD_fz>_BRhz8$oQ0gz>PQ_tXG_^%O2ed7 z)a8>QZD>$0*;9;CM|(n$v#K_Chhm=|#tWZ8atAD(9#zqfvCH9oiIRp@mE+pDDgA-H zi^7yUdqh!P2P+bEWKvQb`{*JgYZ^&M%l)p^iqr5c&ZBI#k=C?LvNrwQsc@lmp0j(h zUDofsf4V=FH*d4|_bR2!CF<;nTV%k{+1hZSZ7r%=gwB@iJbem$e$C^B ztJjM6+nQ_rIf+51gnjANf7*8tb(&3`)WcjE`P^B2q>%1iCac`DcCrtb$Td(6t2*Fd zhxaDgpufHs{n%IQ<~R9eg~P9OW+w&@2bak>y+zUHC~5vuT~kY`p}D%bVi=jJqAfVr zMY6%v<6IbDsL{My8GmBkU5U6Oi>7qHxjHzpt8VDB4J+^pRA= zo?`NxH<8YGI*=dE%6ZOj!}HQyFV*2Hvxgu3BOxkD-BmGHimbX$<&_?kW8PL=Hod!g zfFaDU<6dU7rn3!8m-%rj(pOEiiC1Y4gP+IVxn2>0;?svpmUwwq7t@t;BDYT6&kAiM zDQuygkHN#QgM>BW6>s`>N-#bkHgX;p7ZKS zbF`8%g-_b6wZak%krgw-&1J>sr*|YbB$t{GKSqzO0m)swO8a*4Vx`Ac&sDrC@$!-V z;v&DAdeAM`aQZuj8?%EJ3M%cTr~u`&#au5>k1YYo0klhi7wbH>%rSq^HVv>i=2{#jNitGW`Q)Z<0miw;k|tFz-2*Icb1iNqNp4kZJOV84b1m*AN$&JT zx*$D|{#N)wb-mPYJ?A}2W2vrMM3s*88bl=qR%B9(ju)kGl-Y9)#pgZeAGpbOeYx~O zp3(xPUSV^+8U%QG%r$tF80xah7}s%6Wck$Nr{8AFs*d=I>_v`*v!g#E)zq`p=GV5S zf3Zd_kvRi5Qon)HK~JA$mt;SGx=;Yc2H6KoFATHC>*zn!i0)(Frf#h9Cl@j>x$Z4N zmh5@Mb@oO#*4-9_$(}c>*4<{^4OYM}x$aH*#1)wA!#&c-y4zD%G6G#NGCDZB(ZkY> zjxt`bx6ypQc)#cT-SX=28m&vwi#BxpDze;jeh}5CYi*kzsWnhkdo{%%Wqa%`?Hfo- zwWEgj1vIJM#p+d+5l55lWn*8hpQ?L1rWow>r!z&eaXK@dns6CCAQn~9yRXlNpY7H=@%Dqj0x|B{f$Tg&;1dUa=8SfNAmE3ZQ9iFqJ zw4HTV?>SovW60a9jdVID7@oxwSmhjGQ{|e`Egaro^S<;_bw|ZLay&%322RQ? zswa2YRGr$*C)Kf+(bY9PA7(uFmG+A~Q-xsOdSsrSeVrnkv!<(BxD3b0PQk0t2UMn|O$npm<{QxuhzTP`R2mvb4?Rxz$* z8PHBKj%=?O4|h1!t= zz%oi!H*zXWL_Vh=#dUvSoNK2|Mr6_mXy=@lq{`^X>SQDLj+?TBo6J&V z_HwK0o!cczGGw;XrYvV=%2M?XH>BHzFEDVPca568Wz z3?zS^k?g3bJVo9AW=0Z6=kt==LdWYI&BsG#CcZKeDfOy1*Q+JA}>c+un@{ik=lRWsuiQN8Cyh-DDFt*D4R0p(MJ?Ds7s=9OWw=zkn)y zN2}DJOOa>(JV}}Em8wlrzC6Js<$LEOWu&3_i06Fy^*QBwl?JtU`kCuhk78)dc5@B) zmKf@B7$z&+KjJzbjNCBw*y&H%!+buR0l;(q+u~+qROxiDqRrm?n$DL|&nrPywdo0S zV@r~{N8MPF$YCj>W`fdG+S$$weEgh}2jIqM`Q z%ktrFaIFt6!$zd>$wh`s1~l#NkfL9r-5m4-vkp7QIT=^k)pc`V57z)of7;zyF?s|j z#v?43yC}wDbIrX$?h$f-$Xc{W8~9gH4Cl>fPPdI(o`wNhXKPk}+gR_h7CF2s{XGyL24Lks&i^@mkv?ZT#Jcpt^RHtm@ zxP~?Do?{r_T$<^p%r!~xpB=Ut)PFmh(=?LwRgVxAMI@5@>CyKI%$d}tAhUL@LsM}$KdKQOBV7n zB{l00Zct0XC7H5*E3y~ zzw=qqrXFMKWQDm_*UjqTdS=YBxSlCl!>cw8aHg`-M$!unSy`-hcrWH~LpM5F+jw-e zo-9>xq-e=Fhxa^rb%~x)A{z}|dh#XedW;|R&^qR_xRD!++9(y>m;+>Oic*XfEqJy? z=XWTQ=iWRYD*Z)u3|7x2C7H{@;|+z4!|S}vVW&qq8p&hPG=rPkXt*4vKHuiCH~N~w zJ&V7lZ)B>Ce58v^(W$}yY+#Q!SUx|>+kDNS?DRHnMUh)8;n&_2RRNg zBK&f;-j;ani?K@%v;A0iIoBJnKPGY=QdeaWWA|4&(C>op8xWsZc1IXlPaoow>9FF^5u})jl~fx zS4R!bp<0eZLuoEaSk7SwN3dKn$04;+jW_Uy(LPPj7o8%f8S;~gVintEhxY_ImwL9- zj!?%TdwivHg}t6*aHX?Y$027S^4=k}pM1It?`JHm6CSU(ePZutwD&XEWlNMgGJqYv>dooyQo3WL(>DYW4MnY~@(i>f0?2gKRq zPm=EJchep`o8DrNzZv;!p)p+RI)$WoPM-dZ^NYM>t5bB_y|B{~`HE#^xlNy%GRU!) zeT$}@$o$a+ExukVv zjbm@|6*-hgVRzZN74Nf?M+@hHY|i7eaqFt%pKYebpHuZ}eS5!SmZXXu+*F1R-KbhC zimWFUx%6A&Z}I`vQNb6{6*c~3#eE!m>Iu)V3N2gNz8P&mtik<8? zbOa5TwTz7`R`BM~jbpvCj!7fV=Rkky4=0N%<>E-U?7`(8dUniMeZ^eaPij(iooS7# z{xX!la;!A|n58uSq(zP#EW-eO%Tm#g-R$v49fcDMYtA~dsj^I>NRxhXWU&xPCwK8&Zfu~xJ)^z7H{uW*2 z?fhT)ZHa8PLbj40|G1U&4y7GP?WbSe?;%AQ9qwl1w>2E6Ym`U%tT6eX0tzph_pfP) zsnOwyKAsCVs2fJq`gP1s=l*o-#3<5rpLO*bl;Zi>BX!OD`7Mp!r})amX6iJ48DxmO zmS0~TqWAbV@=6Zn~<%fK%NX8*A6fc_K+pA&x>XhFoXw&RQNz^Gah@Y~)}};-qhJ3o1Hi z)Y`bnTB+F^l=@}=pW{CN94hkry+*|wZS}A2UAllh&pw<|8ehq6-Ahie@TR$tA<;+9 z=aR$Q*Y#-99;qGM`N?+iznkMPnJ-0NEv)y&07^dFu=sLeJ#};WF=N9^_F$>f)kF4R zIl#!YVcWRpCbOHPwMF~cSNoaB&&WoyX`%b&ji>pnsL=9ptkuq8*12{VTDtlL2E#_5 z$WQMT^7H=p8pQGn_@6{d}ZPFg@U#vaUd0BgCy-0g_a3K#bKUrrh4{E%! zbe;C7TUy3rX}o^vPI+B?jI`>OI(nYFDQ?OVd2{JHD!8T23VzntDP>#ge8MyB-Xt}* z7awMqC32qj;-frucq^R1QiVOox>ba8PD96X)7G&vtM3$=z+2DLqG;JbDb%x#w``Lo zWjnkLyhjrod5|`X;*od%8~bR7Kg%vXA8+YiVyu2ThzxwJa zOF+QG9&T>#Z;u(Xds@eiDfiyK{mZCtzWMa$ci-*z;>3yP;(@Y1Cl=iYz6>zJ><{`l7Gucw{)@Wc2oUw*mO)n&^DJ(r(< za#&f}OB+7>tkCz?t)D)4=9%cRZQAsGC?q7OYi#Uv_p4X`7_f6^(eR+4tl!^wBPr*4nC7!pMyqUuoy#6R_mD=R!T} z)M@bPi!XMrU$0){kh|{kduis(X3@uw|Jdg2*2%+HK@T=-7P2xo_vnR(9{S|Q;>E+R3>>(uUu5LO^h1X}+x_v!(;jQzeqhXr z6W>45x%0^9XV1R-k3oap%-XkajkK@-`Saxun@n-dZ{9qy^`noboF6u9)fZ#Oex0ym zN9ng;d@-g^czFH~y?ZbGx^Le_6+?!s=)Gr8@wmNvKksny;#a5Md1t^qH*TE&s(be* zzUkNR#ldFt=!M0_P4>jc&oy4VcDk;+yKdHu8MiN4EQ@@=A-uu&@cbKmPdj$93y6%2%zLRQTO@A7->@(JjDe zG~MTLoN9de@~!dv_kY=U*REM!27^!V-FLU?eD2)FpVHF4c>Ve3gLn4mQ4-#?X{Xdp zo1XdYt+xh0K7IPlp3%{dzL%M~^_LMN)^@!2-oR%I3VvSv@WW+`X3e^H-+%$H&NzB> z>FAa%dra@pA^F_}3nGh3N*ZoYNSN3D!i6mdR<9lx<>l3G$`3!hb$sN=b@w-Hc+bQm zN8XP-cI-$>U|?qdhzQ#Q4H|eI>DBA$26gKia{T-fPYxfxdc=keujL*%u>RtE?{$B3 z)Tm9%pL!~M*|X1f2|ao8fI4N$Z-Kx3at?JOw(A>|)kN<97X{lT0!Gj;|@8AFB zV{gCR>yw$zaUgk#-eVy15T^wUS)89jRE;l#uRbv!)kx?Q<)^{&Q^eV3-EZ%7Lc9(ye{ z^@F`@)?`2R#1l=2l$XEI_Wt`L*1Y;^+pwR0`u6V1%CjFYTGY|pq)E%qv$OY4`1aek z?epi?du!oB^QxC#da&gK4@5mZXO6e&^yzKAcJH3!7(Do$$?e)%9{ushH=dj~&!ck5 zlA$y0_WDg5HM;M+FTb>Q`T6H>Hh1ebdv#XU-i=+mKEC3G7urvH@WF?gczQmtW5tTc zZYC!$KlJ(M<0J05#~=Q0z<)OUUx0rp{2Rf4J^Vj{e=__n@b`fK+wh+T|9jy-3jROC z|3&!6!~Yfd$H9LN{Jr6S7XI7d-w^)i;6Dcbx8Q#U{$IlXD*T^=|1kJ(fWI&NKY;&O z_&)^yuJCt<{{Z+8hyU;J4}!lQ{?EX_0RDsE9}9m2{0G9{3jdMtZwLP+@b`rOr|_>2 z{}A}U1pjFGw}F2){CC0sHTXA!|Eut~!M_vyAB6u(_+Nnk4ftPye?R!A!+$sYAA^4k z{2zh;^YH%z{xTs|;O`IrhvDBG{#)UH9{yjzKLP&V!oLsve}Mnj@UMV>Z}^Xce+T%V zg8x16{|f%!z<)6O7s7uJ{EhIh3;$X0zXbmt@Lvo66Y#$b|J(2{ga2IkzYqU)@K1!l z4*oyFza0LB@XvsM0Q~QRe`ENMhksxAd%-^#{+;3f6Z~I?|4#Ua!#@@Nzrp`;`1geW zd+`4S{vF}}Ec_S4e-Zrm!G8w)N5g+Q{NIIt5&XBqzdig9z&{H9Q{aCb{`bRwBK#xa zp925>@P7dQN8sN8{yFeJ3I7rB&xQX*_`eDN+r7!|JLyT5dQPwe;WQi@IMIu68PuAKOg>n@c$M5Ti~Ar|5osy3jdek z-va*M!~ZD!pMZZc{1?E#8~iuH{~h=rhJPLSyTSi1_%DTj8vL)pe=q!>g8vZsw}t;2 z_=my&Zuox;e>40)hyMil+u{Ef{8z!hCH$X;zX|@m;O~I{WcWV{|0m&J3ICb!ZwmkK z;NJ!Qo8iA2{u|-H0{)ZW-vs_U;C~bThu|Lp{|xv~h5sb@KL-Eb;6D!jdGP-V{sHiJ zgZ~)#cZC0K_fH=e--{a;U5J5H{gE?{=dTi5%?d5e;4?B!(RvgE%0vz z|BdkXf&X*xuLJ)V;a?B_cfo%q{Ex%`Ed1NTeYDE4)}io|8V&C zhJRo94}t$4`0s`PMfkr1{~Pe{4*!1eH^aXe{_*g?27h<>&w#%L{!#FM4gSmFp9KG< z@Q;K4lkk5U{;$A44E}$>e;xc+!T&q>w}8J9{tozGhW~!}?}EPp{&&Ow9Q@PZ|2+JA zz`rT{H^Kic_)mv_H2gE+KLY;u!oL9i55s>J{0G4QDEwQ(zXSXiz`q3k3GlxF|JCsK zg8vWj9|`}4@IM0oWAG1ze+2v+z`qy#>%!j;{=?zF0saTz{~r8D!T%}vKMVhp@Sg(z zU*NwL{-N+65C2m5AB2B@_`ePR9Qdce|9AMGfxi|0kHY^0`0L@n7XFjr-x~g%;O`6n zH{t&Y{5QkD0{-8_-v*Y{Da}2 z3ja0me**sH@V_7aufqQ)_*cSz5&WCLKO6qv!hb&e7sCG~_&)&uIq*LX|K0E(4F7iU z{}KN4;J*a^cKA1f|CjLp8UEeip9TM}@P7gR55nIQ{wv_04FAvJe-HdK;6D}qli>dt z{C|W0IQZwm|10+MizYPBQ@Gpb^XYjuT|7YOe2L2)NkA?qL`0s>&5d7bO|0($Y3jaso ze;EE<;O`B89sIYzzZLv9!ruq}&%wVA{9lBBJ^0@R|C#VV4*#?8ZwvpG@GpdaefSr_ z-yi<>!M_>&bK(CG{1?N2Ap9fYe+d2`!@oWJPr$!3{Aa^|5d1a&@IMcK6Z~(&|0DPh zga26g?|}ao@DGQ7Z}|6x{}A}^f&X6kUxfcV@V^27?(pvie>41x;U5qGYw&l6{|xwB z;2#D5*WkY#{z>p(3ja9xKMDV*;r|N!!{Gl1{MW&M75u-0e+&2<;qQR|W%%!h|1S6& z;D0y#&%r+p{?Eg|2mG7De-r%Qg8y{*N5el8{v+UjFZ>JO|1kV#!G8e!kHWtt{5!yZ z0sKqgp8)?0@LvsoFZlle|B>)-2>&DSKL-Cm_(#CM0sMQxzb^d!;6EJx8{mHc{_nwm z6#Sop|FiHv3I8eZ{{{YA;U5bB@$fH&|3UcohyUB~&w+mm{C|i48Teb_|0w)FfWIF8 zYvDf`{;lEP3I4wDe-r+nz<)FRE8zb<{B7`W4*x#zUk`s3{&V3!0sb-Y{}leC;hzY9 z5BOh!e`ENk!#^1QsqkL||0m#I4*&b%|0?`{f`29a7s0;?{IlWzE&S)he)vC(4M=h+D)nL>nT6h$XHPlF<$#-XKm9zY>oShlwtPH=!f85Uq%fgb(o? zQHOYus7KsI%p{HzXNk7NN}`acPZSaU#C=3FBA0lGSWFBgB8fx9$3%PL1kst8O$;LT z5zhJl`ST{?Ch-w5j2KJoAif~NiQYtCVhFK^*h^d_-XU%f-HCpLnJ6aWiED&AF@vxW zQN(M+aw3UXO2iRQ5>FGa5Mjh0#5!UX@g32EFcKsu9hZsy#4f@>+)bP#(un7Y9z;`O z6Y&-?oroqfi4nxTL;>+IF^d>L93@&39f$=)36VftAXXDz#1F(sq9K9)Bgcq9B7$f@ z^djmKe#CHM195V!~?_};xw_F7)-PyekA4*O9(sBi1?EDndnAj z5nYKFhzAKzVg->*d`{d$Sl;?QX^^$+^o`4!-uK+dwh=qVy&L&!{434h9diA>XFN{y z8GJp!bY=X+_n(@$v!r!j_djlab85ghJ34$dvqx~7Czp=;wAVu){V=B4+SZF2pNape z?Dh!v!prhP?3oBWv2O8t~H>P2VrMH2OW$wof8<`9$?z?!_?S&on*M?*zPPq40{F8HXepvWfJ$UFosm)6OqG_SF+_=tB?uHm6;{$~V4jwRWtB`|!u_Ip5KD&)la! znex`9-|Agnay+~LuHV129{i$C-R7f$_RYQh=B8H$bqZQM`10$4Kh3REc=pP&@N-2C z-?{j3T;10m8JT3vU4LzEiWtX*NZ!|V`HHUPVZR%T z?tT9B`a?Ur$Jr;n`t6wY-6~d;sP=kc!|wg%$c3#_dN!E4NESFyYR`YPrcM^z*l86UpF01&+aqnp?mJT%eTSWXO5rhu(+)Iv6fNyH*I!T z!$$QRzrRKOZO!sk4{m+?0k7hFe@*RMukgdqzklJvt%qkUeXWh#)pdX55C1B1bdR9v zH-=4Y-(5Yrxz&!Wo99<${CaZr_M=_CF&1ZZi);D(-KHj+XHWC%U0fOc`Tiz>*FG4( zr2UpYonO8Ga=^-?=LSB}Xzz*gNjdj?-0_7q6W+d_xUfmf%+ozL&AYk$zSv8P5BpC` zxwydGa!dbSbISLHeS7=$?ejt!e!XbVtUumt_rs%aw3+|ecgwzfKlbD+5&n&yo@{w( zXWH0N3Dc7|++BL5V)fw#Bd>;c`s2fmkAE?9#A{QZ*_-|Lg9r0IzN__~$QRz*`qnfb zV{XRF6_0%$d8Gd2HoJcJ8Jg?%*^B3vzc`@Cn)~d}(|>lnqu;Zx#m^Pq7r%Y!m$kb? z@_K(=|FtuRrmkrJ;mT!Qy0nVz5U}u#&1Ius4-Q?|-}dJA$8WCKyWp7j;kV4a7wLYz z`rWy%jV-%obiVRb)6zrzCiYu#v3qjAcXs}$d+y|kPxrmrtYmE8)y@6OXCzq@bZ17s zG9q}MTY+uP^-f(I-gxN#F&_`yf8=R%it+T_Jr9kam;TL*j~bSQ&iASuYLB}6?1i>( z?+)IU{@M9czCT5M)br7yKkk1yw&1tHQ+9j#d>Oi>;LNV8gND6xE6pn}`o|}Z^q4&B z@`u}FHf62x5Aq93i(9%Of8+i47+N1+r}m0!*Y(*(jz`>!oL^%$H0FP{C|SKJN)m0|5EsGhW{_{e-{2{;r|`{AB6t___v3D5BQIT|77@& zga7yNUj_fB@E;BTPvGwZ|Ht9~F#O};e+>S!;qMFoh43E&|9jy-2mYVIzZLwC!#@@N z9pGON{vPmu5&mz$|2O!rg#TLj4~Kt8_&*K*OYmO;|6TAu2><5rp9}w2;J+CDf$%Sc ze>nW#fqz~2C&B+3{G;Lj0sIr-|0(?Iz&{WE4*2`Q|9SZDg#RS?uZMpL{KMdX1pYnY ze;WSV#6SFt;GYQp_u$_j{x{&C0{;i#-xmIv@NWVCeejQf|3~omg#Ui{zY6~W@P8ft z+3>#y{te)N3jW>Ue?R;i!vB5vuYvzo_!q;!FZ@4;|1J2x2LE;N{|f#=@Sh0(qwvpy ze+K-w!`}%1IQX03KMnqs@NWYD@$l~h|I6?{2mihB&w>97@V^fKmhj&M|NG#782%UG zzXkr~@V^cJ5cuzbe>?cMf&Vi2pM-xS_`d}IQSjdY{|fkzg#RD#{{sF~;r}-LKZbuK z{NI9qF8m*Ze|`A>4u3cJFNePs{?p;FhyTy;{}%qc;r})K55fOK_;-PS0Q}3~9}53B z;lBd@-tg}Y|EutC4FAsXFNJ?U_$R~vNBEzBe>3>6hW`xs>)<~E{sr*w1pkNNKM?+A z_}>lxdGLP}{`28)hyMlm2gCn7{G;GM6#lXBp923c;eQ7H!{F})|0m!-3;r?i_lJKP z{PW>&fWHd=uJC^Z{y)I~W%w_Ee>(gpz~2V{Zt#B#{#N)ega1hQkAr_a{D;8b1OC_H zKOX)Q;olej-@tzd{CmKEDf}OTe>3ma=_=o=!@IMd#3GmN{zXSeZ@IMIuaQJ@<|2N^E4F68>9|Qki z;Qt)_pMw8a@HfG~5B%?g|62HWfd4W0H-&#A_-}##a`?Xu|9jzI5B}f7|6%yIf&U-y zkAy$}*W$$X@ZSvooACb?{zu_o4F8t!ZvuZm_(#J(5dKTx-x>Y^@E-{O6Y#$W{%hc$ z2>(p@&x3y~{Qcp-0RH{qzYqSe!@nW?XTkpm_|J#`m+*fD{!hbyC;SuOe>ePB!~ZJ$ zKZO5G_&)>x2jPDg{9l0oH27!0|8w|HhQAN|KZE~^@Xv++&+y*^{|flO1pg5D*N6X9 z_^*V2EBG&j|7iHHga3B;?}h(i_%DM0cks8s{|fvM!G8t(`@vra|4-px0{`alPlEp$ z_y@z^2LG<`zaRel;hzHkp72kHzXASU@Q;FjTljB-|0(!?1pgo5UjYBz@DGLmF8IF# z|2+5~f&XRrZ-Rdi{Nv!i5&o^=-wXcF!ru-4AH)A7{LA4#8~&@{KOFw4@c$kDUE$vp z{%zs^F8p7C|8@AEfPVn|C&GUx{N3Sy3jQ779}NFd@c#(@YvF$e{@ z@P88iPs4va{0GAS3;5gMe+>TH;J*R>^Wi@P{%hd>6Z}iyZ-W1B`2Pt1`{17h|3UE2 zg#S4B&w{@m{)zC9hyM@oe+>Qw@b3fv=I|d3|FiJ_6#ieqKNSA$;QuB3J>Y*2{P)0r z3jFKAKO6qv!M_gtgW&%r{5!$_GW_Sl{|fwz;QuiEAAx@^{9C~Pd-%t||7Z9o!+#U} z>%!jx|3&a$5C1s$e+&N#_}k%sFZ{Q{e=7XD!GE^+hyP6YcZ7cv_&)^y#_%tO{|E4Y z5dNO<9}fRv@DG811Nf)H{{sA9f`1wOkHUWv{O^MQGw@#w|CaD?2LJl-SK+@3{tv+a zSNIpg{{{HZfWI63^Wi@l{x{&?9saH0e;)oP;ok-R8SsA|{+r?78~&fe{~G+;!~a$I zuY~^-@Gpn|$MBy3|Ap{B4gZ_)zXbnj@HfN17yQHEza9Qx!~YNXKMMcP;Qv1SBj7(7 z{%P=^4*yd4ABKN8{5QgX1pN2H{~-KZ!~Z?_`@sKY_(#IO4g80~|3&x@fd8}bcffxg z{Jr7-3;gro{~G*Pz<(M1W8wb>{9lKEfA~KR{{`@W3;sIzpM(D{_&){ze(=8t|99a3 z9Q^mee=Pj{;ctciNchi#{~Y)?g#Q@$AA!FS{)gcI4g8nDzY_j;!~bpgr^DYD{ypKp zAO63=-wXa*;C~hVx8NTQ{~qxF5dK;4_k;gZ_}>rz-pTIu_{yX3w z2>%@Tua^9lXmL$g{`3lMPNbX2-fReA0+@a*dB)27b zK*?7~ZcK7alCzNfo#ZkkuO&Gp(n*^n2PC-+$%{!YLh_E1>ySK<7+??bx z&l8gCk(`_4x+G62c`(TVNiI!tRFb2U{GsH@B%dkyRPitQ9Ld>9&P(!Pk_VMsm*fj2 zrzv?f$wNwBQ1WDwKa||1(pGvMra)y#?lDwH4hk_(iau;eNw_ar%8$&E>lN%DV^Yn9xb*bNom=nDx9XP(`BtkE&OY7Kb8^y0VB({0k>EmOMYk4dwn=NDL$ z3n%1QyXI#0u}+zkm!Dan9CPhIXi9<2I^J37L#}lLCR+1H=j2Utu6@YeGR1k+w5|oN z!;h<3Hz@m2tMYwKJ>{gF=dFAu73Q-s`Z1?CswW8=Q?&j z>-fBUX$+q3|atmzfxi%$Cw(OOgZF9aIq$uxl9&(-1x{RK zFR)VIHu5ZE!W2bmC(p*`O|&W}b)%)TD9!4Or&;qd6s6ywlix{L+(Hiauv=QD^^Waz?rGW7lwHRwb!wicSru=$ zwDj=>W74dXv#DD{US*CgEU=}G&dla-I*e7)(z;KWFeGDwEg?Hcjy#Vw89CPU+%%h< zX?E`DytLf(@zw&K@_ueQ=lZipT463{F;01otvP+JmJ~nHJxyEd>yhSKQ$WopXILlL z(z4QXGjpu@L1`IzG)b<~$4yR+^B7e)W{fpIEh{e%IqTiI0@i#f#hM94_8MbVTIdGl zSgjM3wYA^vo;Q9%dcL)KBV~uuBfCHtI=g4z>{0pY`I^lFCD|jX(3(HRf(KERn_=yq zSE#l0X!o90TXJ^BIBkWZyzj>A?!q?L<}9ceJ^h_pYc2VC8PTgS-sk8kgD?^V#l z)p(YCYXQ|&`os_HAK%v;=X4U@m*GlIunDI?lPmxx0gi(&M$Hd=H%C|mJn9YsbG>L0r>YhAMJ1BKZOS5!OPGd#dpu_;Wfrb+qf6DGLYIFH)Ojd4<%tWD3STQce@iZs3J zQkg~<=4QzF$kmaKUef^5+h_#mnK=91-|m;0otfL#=Gq-6u3q@J+x{EJxU+xCA9eam zAC2UK(VYsi@(OdbV`s@J=kot^Sv8vNoK*mC59f-1>jKj*|I=$MZTi1_on5E)XTSeh z`$#)gED z2bpRy)z9T#A=9L);n6w5o6@T$#HO~b3)(8()1}8}T5}lLXogyE%c$|!{pEQ7#%9$c zO4UFv!2i`)E_JWE?`Vg0-DwzotM577wiG@8;Kt%s{ChLhBfxdfsoe$~N1L})t@CGl zlVk>n0QQqdO9=mCYVcp%Pu~0gN_3YSb6%(J+O4gVoE4u42K0zei|^h|>Zm>M-mQDh z^Mso9bp7h}18S{jAd~g~)V|z@=?gNa%TCXcv6~CR#~vA+`CqM_A^+#~NB4f&L(2JY z{NHT>opv}kMg9pAmYG#YuUaqNJm7EE^S@(jxvn9L`FE7r=%jN8B`Uq3z&d^ulZwgX zb8-u!TXNHkD9FgNj!!RmaC~+~eqKS|XxoE)9*amX7~g4PmzE|z8D)>=Gk%ISzkoY! zbjvQC0$Rp2YG5)&@nO8c){9Sr|7K}s=YH&2U?mHZZJVN%BMHwanO<=eYo;YXdmm(1{A6~Op|`JfqBVybJU^pbrWf?eotQVyn%~k?nB6r)K8r=S9G#w1U~L%_ z)w#OtJ9n-wzt$FiIeJv*JL($Mx%#A?ZIEf@=AFqHUv(}~RcmZrU2R=+oT}FE#SS)3 z-z1->qgzhO&NT~yS=+Ucx&mluxPyYM*|6O~?o$6t3`tt+c4A>NKFyKaj zR~Nr7ab5a!nbGA`m#baw3v3;j6gV|-Uf|n-p9KCK*xNkZJi|QKyox^raN6t^)G(-D z(1@T%gNlPz2lWYlD0ob;EqF%oyx>=Y-w9q7ydii`@X_F3f`1RL6LMEb^N@}qVIlD$ zmXHx4xgn2*l!Pn{SrYO=$eNJNAqPT^g%pQAAG$PjW$5A16QLJF-NU@Y+J*&(^$tr7 zvxZF!n;W(+Y-8A-uph$Q!u8=^;jO}ZhW8JDC_F!WO8C6+H^NtjuM6K5el+}Sc*6*v zh&B-+5%CeJ5g8GaB3_7C9PvTK=Ml#uDkBV$evv7Wxsi`Yz8JYX@>t~c$h)HYMI}e& zL_HoA7u_>@P;_?mtmu;H=cC_@-WmN(^oi)}(e+}yW7@<-#H7a*#LS49AM;Vn>X=P2 z2V$U7w+cGvdHYzqDc2Mm2*hgdM#=aE0GIm4k-q;^wFUK-yn)t;5?duV6S3rw^ zpn%>1LjtS;a|2!vSQW54Kr?1kMa>Vs2`l zXWnZ*Xm*&J1l<$VJSZwCKB#ZdqM&6#?*{D*IuP_-(CMH{K@q`E1V11AYVaGuUj+Mx z_|eKqAwxoJA#aDQq-}o=xe)S4h(5GgXv@&{p;4j9p(UYoT_L6`WT zq@ag_a)TxYO{d4q3tG&XEDw4wXhqOhoX@GCb3vDb?g@?x?jD>HJU961;1_~Fq!+CZ z{wDZ`;8XM>_mGD4qZT14A+Loj3po*TKExE-A#`|XPH2AUtk9=Ip9_77GkYs^Md;el zO`*F(kA$A0CtVAz6J`v%C+vYRzp%it$gplE{EyE z8-?E;-YMK19veO&d~o>i@B;eQi{Y<@uL$27ek}aw@ay5tBK#vlBVr@QMm!QRG2*d^ z$0MGkcdd`u9&tP(IC50vJCWZ+o{GE_c_p$zRP(3~QQe}3L|LO=k9sR=Yt*i&lIYUt z*P_=)@1tkM#U#Y^jTsn|L0e9Xc`@dfm~$~6w4j;aPWFr)5IZb(M(mu}r(+kzz8bqM z_MO);^$1Ky*MtK%ao5fMEfd z0eJzB14457wQA9_||sD<9e#{Z4~ I-?YI01C5gb`v3p{ diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Cipher/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Cipher/__init__.py deleted file mode 100644 index d8ceed9..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Cipher/__init__.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Secret-key encryption algorithms. - -Secret-key encryption algorithms transform plaintext in some way that -is dependent on a key, producing ciphertext. This transformation can -easily be reversed, if (and, hopefully, only if) one knows the key. - -The encryption modules here all support the interface described in PEP -272, "API for Block Encryption Algorithms". - -If you don't know which algorithm to choose, use AES because it's -standard and has undergone a fair bit of examination. - -Crypto.Cipher.AES Advanced Encryption Standard -Crypto.Cipher.ARC2 Alleged RC2 -Crypto.Cipher.ARC4 Alleged RC4 -Crypto.Cipher.Blowfish -Crypto.Cipher.CAST -Crypto.Cipher.DES The Data Encryption Standard. Very commonly used - in the past, but today its 56-bit keys are too small. -Crypto.Cipher.DES3 Triple DES. -Crypto.Cipher.XOR The simple XOR cipher. -""" - -__all__ = ['AES', 'ARC2', 'ARC4', - 'Blowfish', 'CAST', 'DES', 'DES3', - 'XOR' - ] - -__revision__ = "$Id$" - - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/SHA256.pyd b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/SHA256.pyd deleted file mode 100644 index 10d91f8c0554cf7ea81b5b4d70d55c13f9c792fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11264 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 VbShnb(x+MoeDi#hfqx(a{{?&G4K4rx diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/__init__.py deleted file mode 100644 index 16dec73..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Hash/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Hashing algorithms - -Hash functions take arbitrary strings as input, and produce an output -of fixed size that is dependent on the input; it should never be -possible to derive the input data given only the hash function's -output. Hash functions can be used simply as a checksum, or, in -association with a public-key algorithm, can be used to implement -digital signatures. - -The hashing modules here all support the interface described in PEP -247, "API for Cryptographic Hash Functions". - -Submodules: -Crypto.Hash.HMAC RFC 2104: Keyed-Hashing for Message Authentication -Crypto.Hash.MD2 -Crypto.Hash.MD4 -Crypto.Hash.MD5 -Crypto.Hash.RIPEMD160 -Crypto.Hash.SHA -""" - -__all__ = ['HMAC', 'MD2', 'MD4', 'MD5', 'RIPEMD', 'RIPEMD160', 'SHA', 'SHA256'] -__revision__ = "$Id$" - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/RSA.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/RSA.py deleted file mode 100644 index fd8678d..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/RSA.py +++ /dev/null @@ -1,184 +0,0 @@ -# -*- coding: utf-8 -*- -# -# PublicKey/RSA.py : RSA public key primitive -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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 public-key cryptography algorithm.""" - -__revision__ = "$Id$" - -__all__ = ['generate', 'construct', 'error'] - -from Crypto.Util.python_compat import * - -from Crypto.PublicKey import _RSA, _slowmath, pubkey -from Crypto import Random - -try: - from Crypto.PublicKey import _fastmath -except ImportError: - _fastmath = None - -class _RSAobj(pubkey.pubkey): - keydata = ['n', 'e', 'd', 'p', 'q', 'u'] - - def __init__(self, implementation, key): - self.implementation = implementation - self.key = key - - def __getattr__(self, attrname): - if attrname in self.keydata: - # For backward compatibility, allow the user to get (not set) the - # RSA key parameters directly from this object. - return getattr(self.key, attrname) - else: - raise AttributeError("%s object has no %r attribute" % (self.__class__.__name__, attrname,)) - - def _encrypt(self, c, K): - return (self.key._encrypt(c),) - - def _decrypt(self, c): - #(ciphertext,) = c - (ciphertext,) = c[:1] # HACK - We should use the previous line - # instead, but this is more compatible and we're - # going to replace the Crypto.PublicKey API soon - # anyway. - return self.key._decrypt(ciphertext) - - def _blind(self, m, r): - return self.key._blind(m, r) - - def _unblind(self, m, r): - return self.key._unblind(m, r) - - def _sign(self, m, K=None): - return (self.key._sign(m),) - - def _verify(self, m, sig): - #(s,) = sig - (s,) = sig[:1] # HACK - We should use the previous line instead, but - # this is more compatible and we're going to replace - # the Crypto.PublicKey API soon anyway. - return self.key._verify(m, s) - - def has_private(self): - return self.key.has_private() - - def size(self): - return self.key.size() - - def can_blind(self): - return True - - def can_encrypt(self): - return True - - def can_sign(self): - return True - - def publickey(self): - return self.implementation.construct((self.key.n, self.key.e)) - - def __getstate__(self): - d = {} - for k in self.keydata: - try: - d[k] = getattr(self.key, k) - except AttributeError: - pass - return d - - def __setstate__(self, d): - if not hasattr(self, 'implementation'): - self.implementation = RSAImplementation() - t = [] - for k in self.keydata: - if not d.has_key(k): - break - t.append(d[k]) - self.key = self.implementation._math.rsa_construct(*tuple(t)) - - def __repr__(self): - attrs = [] - for k in self.keydata: - if k == 'n': - attrs.append("n(%d)" % (self.size()+1,)) - elif hasattr(self.key, k): - attrs.append(k) - if self.has_private(): - attrs.append("private") - return "<%s @0x%x %s>" % (self.__class__.__name__, id(self), ",".join(attrs)) - -class RSAImplementation(object): - def __init__(self, **kwargs): - # 'use_fast_math' parameter: - # None (default) - Use fast math if available; Use slow math if not. - # True - Use fast math, and raise RuntimeError if it's not available. - # False - Use slow math. - use_fast_math = kwargs.get('use_fast_math', None) - if use_fast_math is None: # Automatic - if _fastmath is not None: - self._math = _fastmath - else: - self._math = _slowmath - - elif use_fast_math: # Explicitly select fast math - if _fastmath is not None: - self._math = _fastmath - else: - raise RuntimeError("fast math module not available") - - else: # Explicitly select slow math - self._math = _slowmath - - self.error = self._math.error - - # 'default_randfunc' parameter: - # None (default) - use Random.new().read - # not None - use the specified function - self._default_randfunc = kwargs.get('default_randfunc', None) - self._current_randfunc = None - - def _get_randfunc(self, randfunc): - if randfunc is not None: - return randfunc - elif self._current_randfunc is None: - self._current_randfunc = Random.new().read - return self._current_randfunc - - def generate(self, bits, randfunc=None, progress_func=None): - rf = self._get_randfunc(randfunc) - obj = _RSA.generate_py(bits, rf, progress_func) # TODO: Don't use legacy _RSA module - key = self._math.rsa_construct(obj.n, obj.e, obj.d, obj.p, obj.q, obj.u) - return _RSAobj(self, key) - - def construct(self, tup): - key = self._math.rsa_construct(*tup) - return _RSAobj(self, key) - -_impl = RSAImplementation() -generate = _impl.generate -construct = _impl.construct -error = _impl.error - -# vim:set ts=4 sw=4 sts=4 expandtab: - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_RSA.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_RSA.py deleted file mode 100644 index 236031a..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_RSA.py +++ /dev/null @@ -1,95 +0,0 @@ -# -# RSA.py : RSA encryption/decryption -# -# Part of the Python Cryptography Toolkit -# -# Written by Andrew Kuchling, Paul Swartz, and others -# -# =================================================================== -# 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. -# =================================================================== -# - -__revision__ = "$Id$" - -from Crypto.PublicKey import pubkey -from Crypto.Util import number - -def generate_py(bits, randfunc, progress_func=None): - """generate(bits:int, randfunc:callable, progress_func:callable) - - Generate an RSA key of length 'bits', using 'randfunc' to get - random data and 'progress_func', if present, to display - the progress of the key generation. - """ - obj=RSAobj() - obj.e = 65537L - - # Generate the prime factors of n - if progress_func: - progress_func('p,q\n') - p = q = 1L - while number.size(p*q) < bits: - # Note that q might be one bit longer than p if somebody specifies an odd - # number of bits for the key. (Why would anyone do that? You don't get - # more security.) - # - # Note also that we ensure that e is coprime to (p-1) and (q-1). - # This is needed for encryption to work properly, according to the 1997 - # paper by Robert D. Silverman of RSA Labs, "Fast generation of random, - # strong RSA primes", available at - # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2713&rep=rep1&type=pdf - # Since e=65537 is prime, it is sufficient to check that e divides - # neither (p-1) nor (q-1). - p = 1L - while (p - 1) % obj.e == 0: - if progress_func: - progress_func('p\n') - p = pubkey.getPrime(bits/2, randfunc) - q = 1L - while (q - 1) % obj.e == 0: - if progress_func: - progress_func('q\n') - q = pubkey.getPrime(bits - (bits/2), randfunc) - - # p shall be smaller than q (for calc of u) - if p > q: - (p, q)=(q, p) - obj.p = p - obj.q = q - - if progress_func: - progress_func('u\n') - obj.u = pubkey.inverse(obj.p, obj.q) - obj.n = obj.p*obj.q - - if progress_func: - progress_func('d\n') - obj.d=pubkey.inverse(obj.e, (obj.p-1)*(obj.q-1)) - - assert bits <= 1+obj.size(), "Generated key is too small" - - return obj - -class RSAobj(pubkey.pubkey): - - def size(self): - """size() : int - Return the maximum number of bits that can be handled by this key. - """ - return number.size(self.n) - 1 - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/__init__.py deleted file mode 100644 index 68e1d88..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Public-key encryption and signature algorithms. - -Public-key encryption uses two different keys, one for encryption and -one for decryption. The encryption key can be made public, and the -decryption key is kept private. Many public-key algorithms can also -be used to sign messages, and some can *only* be used for signatures. - -Crypto.PublicKey.DSA Digital Signature Algorithm. (Signature only) -Crypto.PublicKey.ElGamal (Signing and encryption) -Crypto.PublicKey.RSA (Signing, encryption, and blinding) -Crypto.PublicKey.qNEW (Signature only) - -""" - -__all__ = ['RSA', 'DSA', 'ElGamal', 'qNEW'] -__revision__ = "$Id$" - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_slowmath.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_slowmath.py deleted file mode 100644 index 05f1e18..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/_slowmath.py +++ /dev/null @@ -1,134 +0,0 @@ -# -*- coding: utf-8 -*- -# -# PubKey/RSA/_slowmath.py : Pure Python implementation of the RSA portions of _fastmath -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -"""Pure Python implementation of the RSA-related portions of Crypto.PublicKey._fastmath.""" - -__revision__ = "$Id$" - -__all__ = ['rsa_construct'] - -from Crypto.Util.python_compat import * - -from Crypto.Util.number import size, inverse - -class error(Exception): - pass - -class _RSAKey(object): - def _blind(self, m, r): - # compute r**e * m (mod n) - return m * pow(r, self.e, self.n) - - def _unblind(self, m, r): - # compute m / r (mod n) - return inverse(r, self.n) * m % self.n - - def _decrypt(self, c): - # compute c**d (mod n) - if not self.has_private(): - raise TypeError("No private key") - return pow(c, self.d, self.n) # TODO: CRT exponentiation - - def _encrypt(self, m): - # compute m**d (mod n) - return pow(m, self.e, self.n) - - def _sign(self, m): # alias for _decrypt - if not self.has_private(): - raise TypeError("No private key") - return self._decrypt(m) - - def _verify(self, m, sig): - return self._encrypt(sig) == m - - def has_private(self): - return hasattr(self, 'd') - - def size(self): - """Return the maximum number of bits that can be encrypted""" - return size(self.n) - 1 - -def rsa_construct(n, e, d=None, p=None, q=None, u=None): - """Construct an RSAKey object""" - assert isinstance(n, long) - assert isinstance(e, long) - assert isinstance(d, (long, type(None))) - assert isinstance(p, (long, type(None))) - assert isinstance(q, (long, type(None))) - assert isinstance(u, (long, type(None))) - obj = _RSAKey() - obj.n = n - obj.e = e - if d is not None: obj.d = d - if p is not None: obj.p = p - if q is not None: obj.q = q - if u is not None: obj.u = u - return obj - -class _DSAKey(object): - def size(self): - """Return the maximum number of bits that can be encrypted""" - return size(self.p) - 1 - - def has_private(self): - return hasattr(self, 'x') - - def _sign(self, m, k): # alias for _decrypt - # SECURITY TODO - We _should_ be computing SHA1(m), but we don't because that's the API. - if not self.has_private(): - raise TypeError("No private key") - if not (1L < k < self.q): - raise ValueError("k is not between 2 and q-1") - inv_k = inverse(k, self.q) # Compute k**-1 mod q - r = pow(self.g, k, self.p) % self.q # r = (g**k mod p) mod q - s = (inv_k * (m + self.x * r)) % self.q - return (r, s) - - def _verify(self, m, r, s): - # SECURITY TODO - We _should_ be computing SHA1(m), but we don't because that's the API. - if not (0 < r < self.q) or not (0 < s < self.q): - return False - w = inverse(s, self.q) - u1 = (m*w) % self.q - u2 = (r*w) % self.q - v = (pow(self.g, u1, self.p) * pow(self.y, u2, self.p) % self.p) % self.q - return v == r - -def dsa_construct(y, g, p, q, x=None): - assert isinstance(y, long) - assert isinstance(g, long) - assert isinstance(p, long) - assert isinstance(q, long) - assert isinstance(x, (long, type(None))) - obj = _DSAKey() - obj.y = y - obj.g = g - obj.p = p - obj.q = q - if x is not None: obj.x = x - return obj - - -# vim:set ts=4 sw=4 sts=4 expandtab: - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/pubkey.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/pubkey.py deleted file mode 100644 index 90f4603..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/PublicKey/pubkey.py +++ /dev/null @@ -1,192 +0,0 @@ -# -# pubkey.py : Internal functions for public key operations -# -# Part of the Python Cryptography Toolkit -# -# Written by Andrew Kuchling, Paul Swartz, and others -# -# =================================================================== -# 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. -# =================================================================== -# - -__revision__ = "$Id$" - -import types, warnings -from Crypto.Util.number import * - -# Basic public key class -class pubkey: - def __init__(self): - pass - - def __getstate__(self): - """To keep key objects platform-independent, the key data is - converted to standard Python long integers before being - written out. It will then be reconverted as necessary on - restoration.""" - d=self.__dict__ - for key in self.keydata: - if d.has_key(key): d[key]=long(d[key]) - return d - - def __setstate__(self, d): - """On unpickling a key object, the key data is converted to the big -number representation being used, whether that is Python long -integers, MPZ objects, or whatever.""" - for key in self.keydata: - if d.has_key(key): self.__dict__[key]=bignum(d[key]) - - def encrypt(self, plaintext, K): - """encrypt(plaintext:string|long, K:string|long) : tuple - Encrypt the string or integer plaintext. K is a random - parameter required by some algorithms. - """ - wasString=0 - if isinstance(plaintext, types.StringType): - plaintext=bytes_to_long(plaintext) ; wasString=1 - if isinstance(K, types.StringType): - K=bytes_to_long(K) - ciphertext=self._encrypt(plaintext, K) - if wasString: return tuple(map(long_to_bytes, ciphertext)) - else: return ciphertext - - def decrypt(self, ciphertext): - """decrypt(ciphertext:tuple|string|long): string - Decrypt 'ciphertext' using this key. - """ - wasString=0 - if not isinstance(ciphertext, types.TupleType): - ciphertext=(ciphertext,) - if isinstance(ciphertext[0], types.StringType): - ciphertext=tuple(map(bytes_to_long, ciphertext)) ; wasString=1 - plaintext=self._decrypt(ciphertext) - if wasString: return long_to_bytes(plaintext) - else: return plaintext - - def sign(self, M, K): - """sign(M : string|long, K:string|long) : tuple - Return a tuple containing the signature for the message M. - K is a random parameter required by some algorithms. - """ - if (not self.has_private()): - raise TypeError('Private key not available in this object') - if isinstance(M, types.StringType): M=bytes_to_long(M) - if isinstance(K, types.StringType): K=bytes_to_long(K) - return self._sign(M, K) - - def verify (self, M, signature): - """verify(M:string|long, signature:tuple) : bool - Verify that the signature is valid for the message M; - returns true if the signature checks out. - """ - if isinstance(M, types.StringType): M=bytes_to_long(M) - return self._verify(M, signature) - - # alias to compensate for the old validate() name - def validate (self, M, signature): - warnings.warn("validate() method name is obsolete; use verify()", - DeprecationWarning) - - def blind(self, M, B): - """blind(M : string|long, B : string|long) : string|long - Blind message M using blinding factor B. - """ - wasString=0 - if isinstance(M, types.StringType): - M=bytes_to_long(M) ; wasString=1 - if isinstance(B, types.StringType): B=bytes_to_long(B) - blindedmessage=self._blind(M, B) - if wasString: return long_to_bytes(blindedmessage) - else: return blindedmessage - - def unblind(self, M, B): - """unblind(M : string|long, B : string|long) : string|long - Unblind message M using blinding factor B. - """ - wasString=0 - if isinstance(M, types.StringType): - M=bytes_to_long(M) ; wasString=1 - if isinstance(B, types.StringType): B=bytes_to_long(B) - unblindedmessage=self._unblind(M, B) - if wasString: return long_to_bytes(unblindedmessage) - else: return unblindedmessage - - - # The following methods will usually be left alone, except for - # signature-only algorithms. They both return Boolean values - # recording whether this key's algorithm can sign and encrypt. - def can_sign (self): - """can_sign() : bool - Return a Boolean value recording whether this algorithm can - generate signatures. (This does not imply that this - particular key object has the private information required to - to generate a signature.) - """ - return 1 - - def can_encrypt (self): - """can_encrypt() : bool - Return a Boolean value recording whether this algorithm can - encrypt data. (This does not imply that this - particular key object has the private information required to - to decrypt a message.) - """ - return 1 - - def can_blind (self): - """can_blind() : bool - Return a Boolean value recording whether this algorithm can - blind data. (This does not imply that this - particular key object has the private information required to - to blind a message.) - """ - return 0 - - # The following methods will certainly be overridden by - # subclasses. - - def size (self): - """size() : int - Return the maximum number of bits that can be handled by this key. - """ - return 0 - - def has_private (self): - """has_private() : bool - Return a Boolean denoting whether the object contains - private components. - """ - return 0 - - def publickey (self): - """publickey(): object - Return a new key object containing only the public information. - """ - return self - - def __eq__ (self, other): - """__eq__(other): 0, 1 - Compare us to other for equality. - """ - return self.__getstate__() == other.__getstate__() - - def __ne__ (self, other): - """__ne__(other): 0, 1 - Compare us to other for inequality. - """ - return not self.__eq__(other) diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaAccumulator.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaAccumulator.py deleted file mode 100644 index 3d35c23..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaAccumulator.py +++ /dev/null @@ -1,139 +0,0 @@ -# -*- coding: ascii -*- -# -# FortunaAccumulator.py : Fortuna's internal accumulator -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -__revision__ = "$Id$" - -from Crypto.Util.python_compat import * - -from binascii import b2a_hex -import time -import warnings - -from Crypto.pct_warnings import ClockRewindWarning -import SHAd256 - -import FortunaGenerator - -class FortunaPool(object): - """Fortuna pool type - - This object acts like a hash object, with the following differences: - - - It keeps a count (the .length attribute) of the number of bytes that - have been added to the pool - - It supports a .reset() method for in-place reinitialization - - The method to add bytes to the pool is .append(), not .update(). - """ - - digest_size = SHAd256.digest_size - - def __init__(self): - self.reset() - - def append(self, data): - self._h.update(data) - self.length += len(data) - - def digest(self): - return self._h.digest() - - def hexdigest(self): - return b2a_hex(self.digest()) - - def reset(self): - self._h = SHAd256.new() - self.length = 0 - -def which_pools(r): - """Return a list of pools indexes (in range(32)) that are to be included during reseed number r. - - According to _Practical Cryptography_, chapter 10.5.2 "Pools": - - "Pool P_i is included if 2**i is a divisor of r. Thus P_0 is used - every reseed, P_1 every other reseed, P_2 every fourth reseed, etc." - """ - # This is a separate function so that it can be unit-tested. - assert r >= 1 - retval = [] - mask = 0 - for i in range(32): - # "Pool P_i is included if 2**i is a divisor of [reseed_count]" - if (r & mask) == 0: - retval.append(i) - else: - break # optimization. once this fails, it always fails - mask = (mask << 1) | 1L - return retval - -class FortunaAccumulator(object): - - min_pool_size = 64 # TODO: explain why - reseed_interval = 0.100 # 100 ms TODO: explain why - - def __init__(self): - self.reseed_count = 0 - self.generator = FortunaGenerator.AESGenerator() - self.last_reseed = None - - # Initialize 32 FortunaPool instances. - # NB: This is _not_ equivalent to [FortunaPool()]*32, which would give - # us 32 references to the _same_ FortunaPool instance (and cause the - # assertion below to fail). - self.pools = [FortunaPool() for i in range(32)] # 32 pools - assert(self.pools[0] is not self.pools[1]) - - def random_data(self, bytes): - current_time = time.time() - if self.last_reseed > current_time: - warnings.warn("Clock rewind detected. Resetting last_reseed.", ClockRewindWarning) - self.last_reseed = None - if (self.pools[0].length >= self.min_pool_size and - (self.last_reseed is None or - current_time > self.last_reseed + self.reseed_interval)): - self._reseed(current_time) - # The following should fail if we haven't seeded the pool yet. - return self.generator.pseudo_random_data(bytes) - - def _reseed(self, current_time=None): - if current_time is None: - current_time = time.time() - seed = [] - self.reseed_count += 1 - self.last_reseed = current_time - for i in which_pools(self.reseed_count): - seed.append(self.pools[i].digest()) - self.pools[i].reset() - - seed = "".join(seed) - self.generator.reseed(seed) - - def add_random_event(self, source_number, pool_number, data): - assert 1 <= len(data) <= 32 - assert 0 <= source_number <= 255 - assert 0 <= pool_number <= 31 - self.pools[pool_number].append(chr(source_number)) - self.pools[pool_number].append(chr(len(data))) - self.pools[pool_number].append(data) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaGenerator.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaGenerator.py deleted file mode 100644 index 69733da..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/FortunaGenerator.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: ascii -*- -# -# FortunaGenerator.py : Fortuna's internal PRNG -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -__revision__ = "$Id$" - -from Crypto.Util.python_compat import * - -import struct - -from Crypto.Util.number import ceil_shift, exact_log2, exact_div -from Crypto.Util import Counter -from Crypto.Cipher import AES - -import SHAd256 - -class AESGenerator(object): - """The Fortuna "generator" - - This is used internally by the Fortuna PRNG to generate arbitrary amounts - of pseudorandom data from a smaller amount of seed data. - - The output is generated by running AES-256 in counter mode and re-keying - after every mebibyte (2**16 blocks) of output. - """ - - block_size = AES.block_size # output block size in octets (128 bits) - key_size = 32 # key size in octets (256 bits) - - # Because of the birthday paradox, we expect to find approximately one - # collision for every 2**64 blocks of output from a real random source. - # However, this code generates pseudorandom data by running AES in - # counter mode, so there will be no collisions until the counter - # (theoretically) wraps around at 2**128 blocks. Thus, in order to prevent - # Fortuna's pseudorandom output from deviating perceptibly from a true - # random source, Ferguson and Schneier specify a limit of 2**16 blocks - # without rekeying. - max_blocks_per_request = 2**16 # Allow no more than this number of blocks per _pseudo_random_data request - - _four_kiblocks_of_zeros = "\0" * block_size * 4096 - - def __init__(self): - self.counter = Counter.new(nbits=self.block_size*8, initial_value=0, little_endian=True) - self.key = None - - # Set some helper constants - self.block_size_shift = exact_log2(self.block_size) - assert (1 << self.block_size_shift) == self.block_size - - self.blocks_per_key = exact_div(self.key_size, self.block_size) - assert self.key_size == self.blocks_per_key * self.block_size - - self.max_bytes_per_request = self.max_blocks_per_request * self.block_size - - def reseed(self, seed): - if self.key is None: - self.key = "\0" * self.key_size - self._set_key(SHAd256.new(self.key + seed).digest()) - self.counter() # increment counter - assert len(self.key) == self.key_size - - def pseudo_random_data(self, bytes): - assert bytes >= 0 - - num_full_blocks = bytes >> 20 - remainder = bytes & ((1<<20)-1) - - retval = [] - for i in xrange(num_full_blocks): - retval.append(self._pseudo_random_data(1<<20)) - retval.append(self._pseudo_random_data(remainder)) - - return "".join(retval) - - def _set_key(self, key): - self.key = key - self._cipher = AES.new(key, AES.MODE_CTR, counter=self.counter) - - def _pseudo_random_data(self, bytes): - if not (0 <= bytes <= self.max_bytes_per_request): - raise AssertionError("You cannot ask for more than 1 MiB of data per request") - - num_blocks = ceil_shift(bytes, self.block_size_shift) # num_blocks = ceil(bytes / self.block_size) - - # Compute the output - retval = self._generate_blocks(num_blocks)[:bytes] - - # Switch to a new key to avoid later compromises of this output (i.e. - # state compromise extension attacks) - self._set_key(self._generate_blocks(self.blocks_per_key)) - - assert len(retval) == bytes - assert len(self.key) == self.key_size - - return retval - - def _generate_blocks(self, num_blocks): - if self.key is None: - raise AssertionError("generator must be seeded before use") - assert 0 <= num_blocks <= self.max_blocks_per_request - retval = [] - for i in xrange(num_blocks >> 12): # xrange(num_blocks / 4096) - retval.append(self._cipher.encrypt(self._four_kiblocks_of_zeros)) - remaining_bytes = (num_blocks & 4095) << self.block_size_shift # (num_blocks % 4095) * self.block_size - retval.append(self._cipher.encrypt(self._four_kiblocks_of_zeros[:remaining_bytes])) - return "".join(retval) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/SHAd256.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/SHAd256.py deleted file mode 100644 index 288a53e..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/SHAd256.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: ascii -*- -# -# Random/Fortuna/SHAd256.py : SHA_d-256 hash function implementation -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -"""\ -SHA_d-256 hash function implementation. - -This module should comply with PEP 247. -""" - -__revision__ = "$Id$" -__all__ = ['new', 'digest_size'] - -from Crypto.Util.python_compat import * - -from binascii import b2a_hex - -from Crypto.Hash import SHA256 - -assert SHA256.digest_size == 32 - -class _SHAd256(object): - """SHA-256, doubled. - - Returns SHA-256(SHA-256(data)). - """ - - digest_size = SHA256.digest_size - - _internal = object() - - def __init__(self, internal_api_check, sha256_hash_obj): - if internal_api_check is not self._internal: - raise AssertionError("Do not instantiate this class directly. Use %s.new()" % (__name__,)) - self._h = sha256_hash_obj - - # PEP 247 "copy" method - def copy(self): - """Return a copy of this hashing object""" - return _SHAd256(SHAd256._internal, self._h.copy()) - - # PEP 247 "digest" method - def digest(self): - """Return the hash value of this object as a binary string""" - retval = SHA256.new(self._h.digest()).digest() - assert len(retval) == 32 - return retval - - # PEP 247 "hexdigest" method - def hexdigest(self): - """Return the hash value of this object as a (lowercase) hexadecimal string""" - retval = b2a_hex(self.digest()) - assert len(retval) == 64 - return retval - - # PEP 247 "update" method - def update(self, data): - self._h.update(data) - -# PEP 247 module-level "digest_size" variable -digest_size = _SHAd256.digest_size - -# PEP 247 module-level "new" function -def new(data=""): - """Return a new SHAd256 hashing object""" - return _SHAd256(_SHAd256._internal, SHA256.new(data)) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/Fortuna/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/__init__.py deleted file mode 100644 index 2fbbecb..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -# Random/OSRNG/__init__.py : Platform-independent OS RNG API -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -"""Provides a platform-independent interface to the random number generators -supplied by various operating systems.""" - -__revision__ = "$Id$" - -import os - -if os.name == 'posix': - from Crypto.Random.OSRNG.posix import new -elif os.name == 'nt': - from Crypto.Random.OSRNG.nt import new -elif hasattr(os, 'urandom'): - from Crypto.Random.OSRNG.fallback import new -else: - raise ImportError("Not implemented") - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/fallback.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/fallback.py deleted file mode 100644 index 5bb6126..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/fallback.py +++ /dev/null @@ -1,46 +0,0 @@ -# -# Random/OSRNG/fallback.py : Fallback entropy source for systems with os.urandom -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - - -__revision__ = "$Id$" -__all__ = ['PythonOSURandomRNG'] - -import os - -from rng_base import BaseRNG - -class PythonOSURandomRNG(BaseRNG): - - name = "" - - def __init__(self): - self._read = os.urandom - BaseRNG.__init__(self) - - def _close(self): - self._read = None - -def new(*args, **kwargs): - return PythonOSURandomRNG(*args, **kwargs) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/nt.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/nt.py deleted file mode 100644 index c1c2f44..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/nt.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# Random/OSRNG/nt.py : OS entropy source for MS Windows -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - - -__revision__ = "$Id$" -__all__ = ['WindowsRNG'] - -import winrandom -from rng_base import BaseRNG - -class WindowsRNG(BaseRNG): - - name = "" - - def __init__(self): - self.__winrand = winrandom.new() - BaseRNG.__init__(self) - - def flush(self): - """Work around weakness in Windows RNG. - - The CryptGenRandom mechanism in some versions of Windows allows an - attacker to learn 128 KiB of past and future output. As a workaround, - this function reads 128 KiB of 'random' data from Windows and discards - it. - - For more information about the weaknesses in CryptGenRandom, see - _Cryptanalysis of the Random Number Generator of the Windows Operating - System_, by Leo Dorrendorf and Zvi Gutterman and Benny Pinkas - http://eprint.iacr.org/2007/419 - """ - if self.closed: - raise ValueError("I/O operation on closed file") - data = self.__winrand.get_bytes(128*1024) - assert (len(data) == 128*1024) - BaseRNG.flush(self) - - def _close(self): - self.__winrand = None - - def _read(self, N): - # Unfortunately, research shows that CryptGenRandom doesn't provide - # forward secrecy and fails the next-bit test unless we apply a - # workaround, which we do here. See http://eprint.iacr.org/2007/419 - # for information on the vulnerability. - self.flush() - data = self.__winrand.get_bytes(N) - self.flush() - return data - -def new(*args, **kwargs): - return WindowsRNG(*args, **kwargs) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/rng_base.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/rng_base.py deleted file mode 100644 index 2f49019..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/rng_base.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# Random/OSRNG/rng_base.py : Base class for OSRNG -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -__revision__ = "$Id$" - -from Crypto.Util.python_compat import * - -class BaseRNG(object): - - def __init__(self): - self.closed = False - self._selftest() - - def __del__(self): - self.close() - - def _selftest(self): - # Test that urandom can return data - data = self.read(16) - if len(data) != 16: - raise AssertionError("read truncated") - - # Test that we get different data every time (if we don't, the RNG is - # probably malfunctioning) - data2 = self.read(16) - if data == data2: - raise AssertionError("OS RNG returned duplicate data") - - # PEP 343: Support for the "with" statement - def __enter__(self): - pass - def __exit__(self): - """PEP 343 support""" - self.close() - - def close(self): - if not self.closed: - self._close() - self.closed = True - - def flush(self): - pass - - def read(self, N=-1): - """Return N bytes from the RNG.""" - if self.closed: - raise ValueError("I/O operation on closed file") - if not isinstance(N, (long, int)): - raise TypeError("an integer is required") - if N < 0: - raise ValueError("cannot read to end of infinite stream") - elif N == 0: - return "" - data = self._read(N) - if len(data) != N: - raise AssertionError("%s produced truncated output (requested %d, got %d)" % (self.name, N, len(data))) - return data - - def _close(self): - raise NotImplementedError("child class must implement this") - - def _read(self, N): - raise NotImplementedError("child class must implement this") - - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/winrandom.pyd b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/OSRNG/winrandom.pyd deleted file mode 100644 index d877a0c406204980a932ae39ea965f683d5a3210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 zcmeHNeRNajd4FZgL4XWOVl_?zCl}Wc(t#uCO2)QiYR49sVS{WL8z(hFmacu}=qp$E z8oPshDQ>FXxaD-&n$yuPE?Jf}*$&;Zh32awW^vNeb0|wF-C;Xk>a}99#aS|NS2uUR z_q~#BzS?#BXXh*zp7-Nn_w}FA#9z zo*jgMj0c10xcOS|9=Vecu#mHB2nkbi10hHB0kpU9_z3yPu+Y6;s~mC~785y)Tim~* zT_p>{GH~BFqoDdxTWRnYJscr>tE6yH4ifV55)gnOCcsUAMNb2!uF}~^>v9lm0Lph8 zVA0b+NVZB!Ng?2vtw69jD^M?b8mK%;h$g_eh57_OV0`NqF`?N&$UT>1KI#2WJ>4Dm_BZvP%%<1s}vgunQ8ABBoJBd)2v8Vs$wlQ%s6^cDS7=> z$ki3b5R+=9O8eBJ_Ac=)P%uO{vy9K~p>jp)3e9>3T;MmSj~g>BCQ4uyq%W9usnJTy zBL|qvpdDL0sF}s`>VgZ+{9+gK*bmi{E;(|r0*VNSw`;Fj)%c}BDDy0rmZ}f>#T{G&QF3oxZRr)wY78IcV z2L2=^tFr|LvpSidmHDe%-H-fwNYAg^3eK6j!a0En8ZOIs%i((U%`aK%Zd7i2?38@d zmwbl0c7w7aoh?cqD|+mdGRp17)-sV1&RE$-Gk5G6)w|4^QIgm$L#ojKZBzeyifgIXNUcb=e~SM^T% zxJR>Iz%+q9$Ud`p0%*;82#B7E6WUr44OQzBA7+a%NqaL0dz8|94mZ2u$p#d3sqxu{ zJrn75BzF%Mh4@A}vEYO5ci~f ziGHERPH21&PHJB>{F`S~T2UNacTcn$ami>Reb2k*#jEg|H*M>MX1JLWKAvV_tp zV{RQtJw4!C0^t#$#91(iAEC$@DJ|ooyu8*^d%&!iFq5?zwA%U>VC7XJt#YfW$&gX1 zDM%~Dge3;F#w-G;IHS;zX{Xg$)oTX9k~v^Xzi)IOFiY*}&l34V%^Ie* zERoM?o3zszFP1k&WR_^VW_7XJY0X82P}*s=Z5I1UZJR|Ysr8!V7c*^^Oq)65HL0`b z|5Q`VnpMW=9$g4a7nV4D_Aqr}t#?i_`SSil4h8ny_x2lRf;BRXxa8hNJk?*Q|E~68 z?`z0-r}?)tZF3pd4DvMNopXPnSZZ17D5gx?^tqQ{pL<3wNq=0VRE?V;!F^0Nb$9u- zlNg&mFiloI_WR%gCYSn^rU6Oa@^Bv2h}kIL#|EVmnZtGa{JD+5bq^AMt_l21Btm)v z#b_r-FVd-sl_o0h)1YHe@fv+1S)U)wYYX$Azg_iSP)+L6Oxu*NJ@-TG#63L|s*p3viOCXbEYO<1cIYBeN^-TJA*s|hi@M94JArXMy>Ogp z!aBfWKxiU58 zo$`%&r+sv07u^Pc_vLnCSjKx+Q>L}kEV!C7rJYV6FJs}p+^VxVdcB*#WH&P<*?s_V zxgD_Z(wW<{m(KLG^upAxqau`lofh5dtozN>N_7dmS)`pzPa54HOCJR2X3}*uNx5io zU9Q6YgH5HjnU1#IOGtmMK{nzzn@}4)#m640p+5?g_xV%bU5-`NU)xf?^2s;UH+ttU zFA$=SM`E{lir-rKQe&CFYvoH1+`yme9&0w0k6s+QT|Hn{Tg>iXNK4h-rsAKte<>}y zC!JmIJ}u?=EK>V2ak{+0kHsvM7vH^&Si<87Jn`Y4f!%L>7Gbx0XZgQ{$7jNaDJdi5 z;7!^R0hZin;4^yYXXRZu&^JK<85+uq}mS!~| zViD6UJ#j*}S94J%=$$8nd({}=ccvChpM&YJSW~c5&E-|WmNV~-iN#v!hP3NzL{rMJ z>FW6{K6g9ZOP!gUz+~y;vB``(_=);@`0+S*}O`dGOarMr}}Dn%booTI60hO6XLQQK2y&-Y$&nOGx1q=`Zq)_+=>)AHbZ6nBD|~ zKk|8jkp0l8O^E60kkS0yI}*Spq!B_6d^o#NOA-!#U0gpl-8BR zgjgsE>)ZTYO&zs1h8{Eogm?(Av;)aR1Zg0V$BP0n=9WN6lF78OpN5p&U*HP|;tGPk z*ANH`myI(P1tQP|B4VUup&by2)es2AQUd{DI0Ac?qZb}jQgWa_92uhTGy;L9WO8>X zDQ}5HsRmB~6GCRj12VNG67Nq0;=!1ZLKF0O5IOg=;(!uI?CvLj2yUcdBF@AQ6$Kb} zRdFDXNkQ}BkdTxEBC67gkZjm0$gRPYtcQ!d zRs^355|t{1k=BqhAdodie^d~XJR!EkG&PYOyS zO>l3DbQZTOf;8e2q<*?4;vuX!g+-vh2pV)oLiaNSA%9LaYNE*!mvuqgkTu_4g!M^@ zkdR6Ny_1gB7hY#1CN!qtQ-QX~Mq?*J6Nv|9Az<<4!f%m8JRcZh zHDZNam;9rmZK>wGGkubfg1Th8w_}I5wXjnZHsHcHi}$cE(=(<3XV5%Q6ud(}a{Xuvt zynz$we#O~_*A7!oLgK={_4nb6&`=~SNWB|4)~1QsdsiLTA;^jpPjSIGr%UH_*HI-f zaX7IrwTw-cz<$ZeVo;_ZmFO2GB_)I@S1?2)#|60%-I3{cr=%DOLH!XfB}>>rmL*ey z5>9N?UBC?paX|{oP?1T4m=w3uzi}Waivo5N4o;U6$&spM2r^Td!w0P(mBoBRHAp3e zP^3SCff&Q->gDI<{DL$T2?<n!WXK3s@|ZtDCoR<*1k=Q0=Vi^wA4Il=|Q;RsFsU^MU4 zNQk2{b;rXAY&^Fwk`k#a69wz42r1Y}^QYh$+I|wR>z@YD_Wo3atfzY^Y@`p1!{ui$ zhn=AyRpKhvrYdyDt&LnKTNiSDVJ*!251PWVYc7e%{uI4kk-QIM*qv#PCKD-mU`XKN zN~{kXv##U31Fx;b{Ctpi5U;9jH|qDuDZ6erou}|%ZIM^Olf+laVj%b8GfaV2sIOyF zP?n`%V-emhgp!MPj(I6;uPMl0g%{}bGa`GS1FiSobhQpT!~dOfUtvdtN|&vd#eM&_ ztyE)1Z}$7=+go;abb9Z-7Z*F7*5(g*cQ>^(?%3*`=kfbn=i78G`Y9b7d0`CX1)5v* z@!qC@x2c&ju?g9H47a1>Y8>UG3p+peJl`Um-`CTz%O7a%*|D7}&E##{(dlgs_`OZI zy+lG%B9-WuxqEPTy<+?F6*j#gdzFpebOO!ZEdeTG(Ks(X-$K|cFW>sE9_!r!tDC&d zx&Y|1FgKjS`6B~3O%>^SO3csCJh*M^m3lB4P0%GSM6aU@om01AaTKnh5Ay}0@*CyQ z$X(%&`LQ@;x#mbej)sjbLNtm?$@Rq*^wKjSuMxc|MY)!s6yAq>&=rHPJX&Cz9@hB~ z5uA;8;)uZs9|=Zrlc#@dfon0=dHx1~G5DFt9{QH+JGXwX87TG`S!rN@_J9u&59`>% zp9UC65fDg;tMGUo!+tC8ZouzxFiq=%h$omz39&w$!^5#?JXK$TgT5{m5`|bWwJ}ym z!i~5~)&*0ssv&y?2Zu%ag_PVSNGTi~^%Y3Mip{0VIL;$W*i*ORCi~x%#_QuSG9}=5 zLPQ>6ayUF5Nq9iPEJD~PMTT%`84yzQ#KmOqFox0-tW_97SfaG7uL!2L#fK923sMEA zL>k%cqrRd)7)=Qkn>}~W%f5W@y!=HRSIzFZ`!ZcUch4KG`yebNg?Jc0Hww0R3K+RD z@9Twm3f|v_0W!>ICtrO9GJ$tgaP;RueZ~B8tm89!CAZ0jqAYpOw0`l68#epzP{Rp_)FvuQq5G>@@=4N8NIz zHhDcgcVF9r1w6BLVfwt(#mHr4jL?MJqs+RoWNwEfCvwBKyM)$X=;*n8}I?T^|s_HWpqu|IGBf&K68 zM#lnC~$Z^2&Wygf$q~o;XpBx`JE;@ecFz`!w3x6A5$yf1i z-plXgd-xC^<3GSG}vv<#*lddcd{M z^_1%yuD@`->H0_4v}@LNYxQTUUDfr~Vs)Zgt{$m=xO%Mmo7JyWzg0a|&2QSf>A6ks zZu;q_f7|rYCR5Gon)NjeHC;8Knx||2q~^_ywbpgi zh3XP@2kO3F_w%|7b;a&=Zr=S__g42#_kHe%+>g7z>VC@oP4_eIZ@XW1f8Tx5ecFB2 z{hmALe&2o3{VTW8v)pr&=T^@e&s`q7r{1&0v)$9~xz7{!Bs{<8dDwH%^9P`tY9Pljjo;6g==>!JB1e diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/_UserFriendlyRNG.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/_UserFriendlyRNG.py deleted file mode 100644 index fd40e96..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/_UserFriendlyRNG.py +++ /dev/null @@ -1,213 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Random/_UserFriendlyRNG.py : A user-friendly random number generator -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -__revision__ = "$Id$" - -from Crypto.Util.python_compat import * - -import os -import threading -import struct -import time -from math import floor - -from Crypto.Random import OSRNG -from Crypto.Random.Fortuna import FortunaAccumulator - -class _EntropySource(object): - def __init__(self, accumulator, src_num): - self._fortuna = accumulator - self._src_num = src_num - self._pool_num = 0 - - def feed(self, data): - self._fortuna.add_random_event(self._src_num, self._pool_num, data) - self._pool_num = (self._pool_num + 1) & 31 - -class _EntropyCollector(object): - - def __init__(self, accumulator): - self._osrng = OSRNG.new() - self._osrng_es = _EntropySource(accumulator, 255) - self._time_es = _EntropySource(accumulator, 254) - self._clock_es = _EntropySource(accumulator, 253) - - def reinit(self): - # Add 256 bits to each of the 32 pools, twice. (For a total of 16384 - # bits collected from the operating system.) - for i in range(2): - block = self._osrng.read(32*32) - for p in range(32): - self._osrng_es.feed(block[p*32:(p+1)*32]) - block = None - self._osrng.flush() - - def collect(self): - # Collect 64 bits of entropy from the operating system and feed it to Fortuna. - self._osrng_es.feed(self._osrng.read(8)) - - # Add the fractional part of time.time() - t = time.time() - self._time_es.feed(struct.pack("@I", int(2**30 * (t - floor(t))))) - - # Add the fractional part of time.clock() - t = time.clock() - self._clock_es.feed(struct.pack("@I", int(2**30 * (t - floor(t))))) - - -class _UserFriendlyRNG(object): - - def __init__(self): - self.closed = False - self._fa = FortunaAccumulator.FortunaAccumulator() - self._ec = _EntropyCollector(self._fa) - self.reinit() - - def reinit(self): - """Initialize the random number generator and seed it with entropy from - the operating system. - """ - self._pid = os.getpid() - self._ec.reinit() - - def close(self): - self.closed = True - self._osrng = None - self._fa = None - - def flush(self): - pass - - def read(self, N): - """Return N bytes from the RNG.""" - if self.closed: - raise ValueError("I/O operation on closed file") - if not isinstance(N, (long, int)): - raise TypeError("an integer is required") - if N < 0: - raise ValueError("cannot read to end of infinite stream") - - # Collect some entropy and feed it to Fortuna - self._ec.collect() - - # Ask Fortuna to generate some bytes - retval = self._fa.random_data(N) - - # Check that we haven't forked in the meantime. (If we have, we don't - # want to use the data, because it might have been duplicated in the - # parent process. - self._check_pid() - - # Return the random data. - return retval - - def _check_pid(self): - # Lame fork detection to remind developers to invoke Random.atfork() - # after every call to os.fork(). Note that this check is not reliable, - # since process IDs can be reused on most operating systems. - # - # You need to do Random.atfork() in the child process after every call - # to os.fork() to avoid reusing PRNG state. If you want to avoid - # leaking PRNG state to child processes (for example, if you are using - # os.setuid()) then you should also invoke Random.atfork() in the - # *parent* process. - if os.getpid() != self._pid: - raise AssertionError("PID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork()") - - -class _LockingUserFriendlyRNG(_UserFriendlyRNG): - def __init__(self): - self._lock = threading.Lock() - _UserFriendlyRNG.__init__(self) - - def close(self): - self._lock.acquire() - try: - return _UserFriendlyRNG.close(self) - finally: - self._lock.release() - - def reinit(self): - self._lock.acquire() - try: - return _UserFriendlyRNG.reinit(self) - finally: - self._lock.release() - - def read(self, bytes): - self._lock.acquire() - try: - return _UserFriendlyRNG.read(self, bytes) - finally: - self._lock.release() - -class RNGFile(object): - def __init__(self, singleton): - self.closed = False - self._singleton = singleton - - # PEP 343: Support for the "with" statement - def __enter__(self): - """PEP 343 support""" - def __exit__(self): - """PEP 343 support""" - self.close() - - def close(self): - # Don't actually close the singleton, just close this RNGFile instance. - self.closed = True - self._singleton = None - - def read(self, bytes): - if self.closed: - raise ValueError("I/O operation on closed file") - return self._singleton.read(bytes) - - def flush(self): - if self.closed: - raise ValueError("I/O operation on closed file") - -_singleton_lock = threading.Lock() -_singleton = None -def _get_singleton(): - global _singleton - _singleton_lock.acquire() - try: - if _singleton is None: - _singleton = _LockingUserFriendlyRNG() - return _singleton - finally: - _singleton_lock.release() - -def new(): - return RNGFile(_get_singleton()) - -def reinit(): - _get_singleton().reinit() - -def get_random_bytes(n): - """Return the specified number of cryptographically-strong random bytes.""" - return _get_singleton().read(n) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/__init__.py deleted file mode 100644 index 0d0e6f2..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Random/__init__.py : PyCrypto random number generation -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -__revision__ = "$Id$" -__all__ = ['new'] - -import OSRNG -import _UserFriendlyRNG - -def new(*args, **kwargs): - """Return a file-like object that outputs cryptographically random bytes.""" - return _UserFriendlyRNG.new(*args, **kwargs) - -def atfork(): - """Call this whenever you call os.fork()""" - _UserFriendlyRNG.reinit() - -def get_random_bytes(n): - """Return the specified number of cryptographically-strong random bytes.""" - return _UserFriendlyRNG.get_random_bytes(n) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/random.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/random.py deleted file mode 100644 index e45a87b..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Random/random.py +++ /dev/null @@ -1,143 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Random/random.py : Strong alternative for the standard 'random' module -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -"""A cryptographically strong version of Python's standard "random" module.""" - -__revision__ = "$Id$" -__all__ = ['StrongRandom', 'getrandbits', 'randrange', 'randint', 'choice', 'shuffle', 'sample'] - -from Crypto import Random - -from Crypto.Util.python_compat import * - -class StrongRandom(object): - def __init__(self, rng=None, randfunc=None): - if randfunc is None and rng is None: - self._randfunc = None - elif randfunc is not None and rng is None: - self._randfunc = randfunc - elif randfunc is None and rng is not None: - self._randfunc = rng.read - else: - raise ValueError("Cannot specify both 'rng' and 'randfunc'") - - def getrandbits(self, k): - """Return a python long integer with k random bits.""" - if self._randfunc is None: - self._randfunc = Random.new().read - mask = (1L << k) - 1 - return mask & bytes_to_long(self._randfunc(ceil_div(k, 8))) - - def randrange(self, *args): - """randrange([start,] stop[, step]): - Return a randomly-selected element from range(start, stop, step).""" - if len(args) == 3: - (start, stop, step) = args - elif len(args) == 2: - (start, stop) = args - step = 1 - elif len(args) == 1: - (stop,) = args - start = 0 - step = 1 - else: - raise TypeError("randrange expected at most 3 arguments, got %d" % (len(args),)) - if (not isinstance(start, (int, long)) - or not isinstance(stop, (int, long)) - or not isinstance(step, (int, long))): - raise TypeError("randrange requires integer arguments") - if step == 0: - raise ValueError("randrange step argument must not be zero") - - num_choices = ceil_div(stop - start, step) - if num_choices < 0: - num_choices = 0 - if num_choices < 1: - raise ValueError("empty range for randrange(%r, %r, %r)" % (start, stop, step)) - - # Pick a random number in the range of possible numbers - r = num_choices - while r >= num_choices: - r = self.getrandbits(size(num_choices)) - - return start + (step * r) - - def randint(self, a, b): - """Return a random integer N such that a <= N <= b.""" - if not isinstance(a, (int, long)) or not isinstance(b, (int, long)): - raise TypeError("randint requires integer arguments") - N = self.randrange(a, b+1) - assert a <= N <= b - return N - - def choice(self, seq): - """Return a random element from a (non-empty) sequence. - - If the seqence is empty, raises IndexError. - """ - if len(seq) == 0: - raise IndexError("empty sequence") - return seq[self.randrange(len(seq))] - - def shuffle(self, x): - """Shuffle the sequence in place.""" - # Make a (copy) of the list of objects we want to shuffle - items = list(x) - - # Choose a random item (without replacement) until all the items have been - # chosen. - for i in xrange(len(x)): - p = self.randint(len(items)) - x[i] = items[p] - del items[p] - - def sample(self, population, k): - """Return a k-length list of unique elements chosen from the population sequence.""" - - num_choices = len(population) - if k > num_choices: - raise ValueError("sample larger than population") - - retval = [] - selected = {} # we emulate a set using a dict here - for i in xrange(k): - r = None - while r is None or r in selected: - r = self.randrange(num_choices) - retval.append(population[r]) - selected[r] = 1 - return retval - -_r = StrongRandom() -getrandbits = _r.getrandbits -randrange = _r.randrange -randint = _r.randint -choice = _r.choice -shuffle = _r.shuffle -sample = _r.sample - -# These are at the bottom to avoid problems with recursive imports -from Crypto.Util.number import ceil_div, bytes_to_long, long_to_bytes, size - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/Counter.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/Counter.py deleted file mode 100644 index 42dab42..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/Counter.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: ascii -*- -# -# Util/Counter.py : Fast counter for use with CTR-mode ciphers -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -from Crypto.Util.python_compat import * - -from Crypto.Util import _counter -import struct - -# Factory function -def new(nbits, prefix="", suffix="", initial_value=1, overflow=0, little_endian=False, allow_wraparound=False, disable_shortcut=False): - # TODO: Document this - - # Sanity-check the message size - (nbytes, remainder) = divmod(nbits, 8) - if remainder != 0: - # In the future, we might support arbitrary bit lengths, but for now we don't. - raise ValueError("nbits must be a multiple of 8; got %d" % (nbits,)) - if nbytes < 1: - raise ValueError("nbits too small") - elif nbytes > 0xffff: - raise ValueError("nbits too large") - - initval = _encode(initial_value, nbytes, little_endian) - if little_endian: - return _counter._newLE(str(prefix), str(suffix), initval, allow_wraparound=allow_wraparound, disable_shortcut=disable_shortcut) - else: - return _counter._newBE(str(prefix), str(suffix), initval, allow_wraparound=allow_wraparound, disable_shortcut=disable_shortcut) - -def _encode(n, nbytes, little_endian=False): - retval = [] - n = long(n) - for i in range(nbytes): - if little_endian: - retval.append(chr(n & 0xff)) - else: - retval.insert(0, chr(n & 0xff)) - n >>= 8 - return "".join(retval) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/__init__.py deleted file mode 100644 index aecd539..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Miscellaneous modules - -Contains useful modules that don't belong into any of the -other Crypto.* subpackages. - -Crypto.Util.number Number-theoretic functions (primality testing, etc.) -Crypto.Util.randpool Random number generation -Crypto.Util.RFC1751 Converts between 128-bit keys and human-readable - strings of words. - -""" - -__all__ = ['randpool', 'RFC1751', 'number', 'strxor'] - -__revision__ = "$Id$" - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_counter.pyd b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_counter.pyd deleted file mode 100644 index bb7de6c61c94edfbb78a28cd37318691e78f7813..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11264 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 diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_number_new.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_number_new.py deleted file mode 100644 index 2640392..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/_number_new.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: ascii -*- -# -# Util/_number_new.py : utility functions -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -## NOTE: Do not import this module directly. Import these functions from Crypto.Util.number. - -__revision__ = "$Id$" -__all__ = ['ceil_shift', 'ceil_div', 'floor_div', 'exact_log2', 'exact_div'] - -from Crypto.Util.python_compat import * - -def ceil_shift(n, b): - """Return ceil(n / 2**b) without performing any floating-point or division operations. - - This is done by right-shifting n by b bits and incrementing the result by 1 - if any '1' bits were shifted out. - """ - if not isinstance(n, (int, long)) or not isinstance(b, (int, long)): - raise TypeError("unsupported operand type(s): %r and %r" % (type(n).__name__, type(b).__name__)) - - assert n >= 0 and b >= 0 # I haven't tested or even thought about negative values - mask = (1L << b) - 1 - if n & mask: - return (n >> b) + 1 - else: - return n >> b - -def ceil_div(a, b): - """Return ceil(a / b) without performing any floating-point operations.""" - - if not isinstance(a, (int, long)) or not isinstance(b, (int, long)): - raise TypeError("unsupported operand type(s): %r and %r" % (type(a).__name__, type(b).__name__)) - - (q, r) = divmod(a, b) - if r: - return q + 1 - else: - return q - -def floor_div(a, b): - if not isinstance(a, (int, long)) or not isinstance(b, (int, long)): - raise TypeError("unsupported operand type(s): %r and %r" % (type(a).__name__, type(b).__name__)) - - (q, r) = divmod(a, b) - return q - -def exact_log2(num): - """Find and return an integer i >= 0 such that num == 2**i. - - If no such integer exists, this function raises ValueError. - """ - - if not isinstance(num, (int, long)): - raise TypeError("unsupported operand type: %r" % (type(num).__name__,)) - - n = long(num) - if n <= 0: - raise ValueError("cannot compute logarithm of non-positive number") - - i = 0 - while n != 0: - if (n & 1) and n != 1: - raise ValueError("No solution could be found") - i += 1 - n >>= 1 - i -= 1 - - assert num == (1L << i) - return i - -def exact_div(p, d, allow_divzero=False): - """Find and return an integer n such that p == n * d - - If no such integer exists, this function raises ValueError. - - Both operands must be integers. - - If the second operand is zero, this function will raise ZeroDivisionError - unless allow_divzero is true (default: False). - """ - - if not isinstance(p, (int, long)) or not isinstance(d, (int, long)): - raise TypeError("unsupported operand type(s): %r and %r" % (type(p).__name__, type(d).__name__)) - - if d == 0 and allow_divzero: - n = 0 - if p != n * d: - raise ValueError("No solution could be found") - else: - (n, r) = divmod(p, d) - if r != 0: - raise ValueError("No solution could be found") - - assert p == n * d - return n - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/number.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/number.py deleted file mode 100644 index 4a71eae..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/number.py +++ /dev/null @@ -1,250 +0,0 @@ -# -# number.py : Number-theoretic functions -# -# Part of the Python Cryptography Toolkit -# -# Written by Andrew M. Kuchling, Barry A. Warsaw, and others -# -# =================================================================== -# 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. -# =================================================================== -# - -__revision__ = "$Id$" - -bignum = long -try: - from Crypto.PublicKey import _fastmath -except ImportError: - _fastmath = None - -# New functions -from _number_new import * - -# Commented out and replaced with faster versions below -## def long2str(n): -## s='' -## while n>0: -## s=chr(n & 255)+s -## n=n>>8 -## return s - -## import types -## def str2long(s): -## if type(s)!=types.StringType: return s # Integers will be left alone -## return reduce(lambda x,y : x*256+ord(y), s, 0L) - -def size (N): - """size(N:long) : int - Returns the size of the number N in bits. - """ - bits, power = 0,1L - while N >= power: - bits += 1 - power = power << 1 - return bits - -def getRandomNumber(N, randfunc=None): - """getRandomNumber(N:int, randfunc:callable):long - Return a random N-bit number. - - If randfunc is omitted, then Random.new().read is used. - - NOTE: Confusingly, this function does NOT return N random bits; It returns - a random N-bit number, i.e. a random number between 2**(N-1) and (2**N)-1. - - This function is for internal use only and may be renamed or removed in - the future. - """ - if randfunc is None: - _import_Random() - randfunc = Random.new().read - - S = randfunc(N/8) - odd_bits = N % 8 - if odd_bits != 0: - char = ord(randfunc(1)) >> (8-odd_bits) - S = chr(char) + S - value = bytes_to_long(S) - value |= 2L ** (N-1) # Ensure high bit is set - assert size(value) >= N - return value - -def GCD(x,y): - """GCD(x:long, y:long): long - Return the GCD of x and y. - """ - x = abs(x) ; y = abs(y) - while x > 0: - x, y = y % x, x - return y - -def inverse(u, v): - """inverse(u:long, u:long):long - Return the inverse of u mod v. - """ - u3, v3 = long(u), long(v) - u1, v1 = 1L, 0L - while v3 > 0: - q=u3 / v3 - u1, v1 = v1, u1 - v1*q - u3, v3 = v3, u3 - v3*q - while u1<0: - u1 = u1 + v - return u1 - -# Given a number of bits to generate and a random generation function, -# find a prime number of the appropriate size. - -def getPrime(N, randfunc=None): - """getPrime(N:int, randfunc:callable):long - Return a random N-bit prime number. - - If randfunc is omitted, then Random.new().read is used. - """ - if randfunc is None: - _import_Random() - randfunc = Random.new().read - - number=getRandomNumber(N, randfunc) | 1 - while (not isPrime(number, randfunc=randfunc)): - number=number+2 - return number - -def isPrime(N, randfunc=None): - """isPrime(N:long, randfunc:callable):bool - Return true if N is prime. - - If randfunc is omitted, then Random.new().read is used. - """ - _import_Random() - if randfunc is None: - randfunc = Random.new().read - - randint = StrongRandom(randfunc=randfunc).randint - - if N == 1: - return 0 - if N in sieve: - return 1 - for i in sieve: - if (N % i)==0: - return 0 - - # Use the accelerator if available - if _fastmath is not None: - return _fastmath.isPrime(N) - - # Compute the highest bit that's set in N - N1 = N - 1L - n = 1L - while (n> 1L - - # Rabin-Miller test - for c in sieve[:7]: - a=long(c) ; d=1L ; t=n - while (t): # Iterate over the bits in N1 - x=(d*d) % N - if x==1L and d!=1L and d!=N1: - return 0 # Square root of 1 found - if N1 & t: - d=(x*a) % N - else: - d=x - t = t >> 1L - if d!=1L: - return 0 - return 1 - -# Small primes used for checking primality; these are all the primes -# less than 256. This should be enough to eliminate most of the odd -# numbers before needing to do a Rabin-Miller test at all. - -sieve=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, - 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, - 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, - 197, 199, 211, 223, 227, 229, 233, 239, 241, 251] - -# Improved conversion functions contributed by Barry Warsaw, after -# careful benchmarking - -import struct - -def long_to_bytes(n, blocksize=0): - """long_to_bytes(n:long, blocksize:int) : string - Convert a long integer to a byte string. - - If optional blocksize is given and greater than zero, pad the front of the - byte string with binary zeros so that the length is a multiple of - blocksize. - """ - # after much testing, this algorithm was deemed to be the fastest - s = '' - n = long(n) - pack = struct.pack - while n > 0: - s = pack('>I', n & 0xffffffffL) + s - n = n >> 32 - # strip off leading zeros - for i in range(len(s)): - if s[i] != '\000': - break - else: - # only happens when n == 0 - s = '\000' - i = 0 - s = s[i:] - # add back some pad bytes. this could be done more efficiently w.r.t. the - # de-padding being done above, but sigh... - if blocksize > 0 and len(s) % blocksize: - s = (blocksize - len(s) % blocksize) * '\000' + s - return s - -def bytes_to_long(s): - """bytes_to_long(string) : long - Convert a byte string to a long integer. - - This is (essentially) the inverse of long_to_bytes(). - """ - acc = 0L - unpack = struct.unpack - length = len(s) - if length % 4: - extra = (4 - length % 4) - s = '\000' * extra + s - length = length + extra - for i in range(0, length, 4): - acc = (acc << 32) + unpack('>I', s[i:i+4])[0] - return acc - -# For backwards compatibility... -import warnings -def long2str(n, blocksize=0): - warnings.warn("long2str() has been replaced by long_to_bytes()") - return long_to_bytes(n, blocksize) -def str2long(s): - warnings.warn("str2long() has been replaced by bytes_to_long()") - return bytes_to_long(s) - -def _import_Random(): - # This is called in a function instead of at the module level in order to avoid problems with recursive imports - global Random, StrongRandom - from Crypto import Random - from Crypto.Random.random import StrongRandom - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/python_compat.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/python_compat.py deleted file mode 100644 index 7eb2803..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/Util/python_compat.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Util/python_compat.py : Compatibility code for old versions of Python -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -"""Compatibility code for old versions of Python - -Currently, this just defines: - - True and False - - object - - isinstance -""" - -__revision__ = "$Id$" -__all__ = [] - -import sys -import __builtin__ - -# 'True' and 'False' aren't defined in Python 2.1. Define them. -try: - True, False -except NameError: - (True, False) = (1, 0) - __all__ += ['True', 'False'] - -# New-style classes were introduced in Python 2.2. Defining "object" in Python -# 2.1 lets us use new-style classes in versions of Python that support them, -# while still maintaining backward compatibility with old-style classes -try: - object -except NameError: - class object: pass - __all__ += ['object'] - -# Starting with Python 2.2, isinstance allows a tuple for the second argument. -# Also, builtins like "tuple", "list", "str", "unicode", "int", and "long" -# became first-class types, rather than functions. We want to support -# constructs like: -# isinstance(x, (int, long)) -# So we hack it for Python 2.1. -try: - isinstance(5, (int, long)) -except TypeError: - __all__ += ['isinstance'] - _builtin_type_map = { - tuple: type(()), - list: type([]), - str: type(""), - unicode: type(u""), - int: type(0), - long: type(0L), - } - def isinstance(obj, t): - if not __builtin__.isinstance(t, type(())): - # t is not a tuple - return __builtin__.isinstance(obj, _builtin_type_map.get(t, t)) - else: - # t is a tuple - for typ in t: - if __builtin__.isinstance(obj, _builtin_type_map.get(typ, typ)): - return True - return False - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/__init__.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/__init__.py deleted file mode 100644 index d596e4f..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# -# =================================================================== -# 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. -# =================================================================== - -"""Python Cryptography Toolkit - -A collection of cryptographic modules implementing various algorithms -and protocols. - -Subpackages: -Crypto.Cipher Secret-key encryption algorithms (AES, DES, ARC4) -Crypto.Hash Hashing algorithms (MD5, SHA, HMAC) -Crypto.Protocol Cryptographic protocols (Chaffing, all-or-nothing - transform). This package does not contain any - network protocols. -Crypto.PublicKey Public-key encryption and signature algorithms - (RSA, DSA) -Crypto.Util Various useful modules and functions (long-to-string - conversion, random number generation, number - theoretic functions) -""" - -__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util'] - -__version__ = '2.3' # See also below and setup.py -__revision__ = "$Id$" - -# New software should look at this instead of at __version__ above. -version_info = (2, 1, 0, 'final', 0) # See also above and setup.py - diff --git a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/pct_warnings.py b/Calibre_Plugins/ineptepub_plugin/windows/Crypto/pct_warnings.py deleted file mode 100644 index 2a5716c..0000000 --- a/Calibre_Plugins/ineptepub_plugin/windows/Crypto/pct_warnings.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: ascii -*- -# -# pct_warnings.py : PyCrypto warnings file -# -# Written in 2008 by Dwayne C. Litzenberger -# -# =================================================================== -# 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. -# =================================================================== - -# -# Base classes. All our warnings inherit from one of these in order to allow -# the user to specifically filter them. -# - -class CryptoWarning(Warning): - """Base class for PyCrypto warnings""" - -class CryptoDeprecationWarning(DeprecationWarning, CryptoWarning): - """Base PyCrypto DeprecationWarning class""" - -class CryptoRuntimeWarning(RuntimeWarning, CryptoWarning): - """Base PyCrypto RuntimeWarning class""" - -# -# Warnings that we might actually use -# - -class RandomPool_DeprecationWarning(CryptoDeprecationWarning): - """Issued when Crypto.Util.randpool.RandomPool is instantiated.""" - -class ClockRewindWarning(CryptoRuntimeWarning): - """Warning for when the system clock moves backwards.""" - -class GetRandomNumber_DeprecationWarning(CryptoDeprecationWarning): - """Issued when Crypto.Util.number.getRandomNumber is invoked.""" - -# By default, we want this warning to be shown every time we compensate for -# clock rewinding. -import warnings as _warnings -_warnings.filterwarnings('always', category=ClockRewindWarning, append=1) - -# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Calibre_Plugins/ineptpdf_plugin.zip b/Calibre_Plugins/ineptpdf_plugin.zip new file mode 100644 index 0000000000000000000000000000000000000000..df017d7448687e5c1ede2ef9f5273e537b13fe07 GIT binary patch literal 21812 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 literal 0 HcmV?d00001 diff --git a/Calibre_Plugins/ineptpdf_plugin/ade_key.py b/Calibre_Plugins/ineptpdf_plugin/ade_key.py new file mode 100644 index 0000000..eb9ae3d --- /dev/null +++ b/Calibre_Plugins/ineptpdf_plugin/ade_key.py @@ -0,0 +1,346 @@ +#!/usr/bin/env python + +""" +Retrieve Adobe ADEPT user key. +""" + +from __future__ import with_statement + +__license__ = 'GPL v3' + +import sys +import os +import struct +from calibre.constants import iswindows, isosx + +class ADEPTError(Exception): + pass + +if iswindows: + from ctypes import windll, c_char_p, c_wchar_p, c_uint, POINTER, byref, \ + create_unicode_buffer, create_string_buffer, CFUNCTYPE, addressof, \ + string_at, Structure, c_void_p, cast, c_size_t, memmove, CDLL, c_int, \ + c_long, c_ulong + + from ctypes.wintypes import LPVOID, DWORD, BOOL + import _winreg as winreg + + def _load_crypto_libcrypto(): + from ctypes.util import find_library + libcrypto = find_library('libeay32') + if libcrypto is None: + raise ADEPTError('libcrypto not found') + libcrypto = CDLL(libcrypto) + AES_MAXNR = 14 + c_char_pp = POINTER(c_char_p) + c_int_p = POINTER(c_int) + class AES_KEY(Structure): + _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), + ('rounds', c_int)] + AES_KEY_p = POINTER(AES_KEY) + + def F(restype, name, argtypes): + func = getattr(libcrypto, name) + func.restype = restype + func.argtypes = argtypes + return func + + AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', + [c_char_p, c_int, AES_KEY_p]) + AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', + [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, + c_int]) + class AES(object): + def __init__(self, userkey): + self._blocksize = len(userkey) + if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : + raise ADEPTError('AES improper key used') + key = self._key = AES_KEY() + rv = AES_set_decrypt_key(userkey, len(userkey) * 8, key) + if rv < 0: + raise ADEPTError('Failed to initialize AES key') + def decrypt(self, data): + out = create_string_buffer(len(data)) + iv = ("\x00" * self._blocksize) + rv = AES_cbc_encrypt(data, out, len(data), self._key, iv, 0) + if rv == 0: + raise ADEPTError('AES decryption failed') + return out.raw + return AES + + def _load_crypto_pycrypto(): + from Crypto.Cipher import AES as _AES + class AES(object): + def __init__(self, key): + self._aes = _AES.new(key, _AES.MODE_CBC) + def decrypt(self, data): + return self._aes.decrypt(data) + return AES + + def _load_crypto(): + AES = None + for loader in (_load_crypto_libcrypto, _load_crypto_pycrypto): + try: + AES = loader() + break + except (ImportError, ADEPTError): + pass + return AES + + AES = _load_crypto() + + + DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device' + PRIVATE_LICENCE_KEY_PATH = r'Software\Adobe\Adept\Activation' + + MAX_PATH = 255 + + kernel32 = windll.kernel32 + advapi32 = windll.advapi32 + crypt32 = windll.crypt32 + + def GetSystemDirectory(): + GetSystemDirectoryW = kernel32.GetSystemDirectoryW + GetSystemDirectoryW.argtypes = [c_wchar_p, c_uint] + GetSystemDirectoryW.restype = c_uint + def GetSystemDirectory(): + buffer = create_unicode_buffer(MAX_PATH + 1) + GetSystemDirectoryW(buffer, len(buffer)) + return buffer.value + return GetSystemDirectory + GetSystemDirectory = GetSystemDirectory() + + def GetVolumeSerialNumber(): + GetVolumeInformationW = kernel32.GetVolumeInformationW + GetVolumeInformationW.argtypes = [c_wchar_p, c_wchar_p, c_uint, + POINTER(c_uint), POINTER(c_uint), + POINTER(c_uint), c_wchar_p, c_uint] + GetVolumeInformationW.restype = c_uint + def GetVolumeSerialNumber(path): + vsn = c_uint(0) + GetVolumeInformationW( + path, None, 0, byref(vsn), None, None, None, 0) + return vsn.value + return GetVolumeSerialNumber + GetVolumeSerialNumber = GetVolumeSerialNumber() + + def GetUserName(): + GetUserNameW = advapi32.GetUserNameW + GetUserNameW.argtypes = [c_wchar_p, POINTER(c_uint)] + GetUserNameW.restype = c_uint + def GetUserName(): + buffer = create_unicode_buffer(32) + size = c_uint(len(buffer)) + while not GetUserNameW(buffer, byref(size)): + buffer = create_unicode_buffer(len(buffer) * 2) + size.value = len(buffer) + return buffer.value.encode('utf-16-le')[::2] + return GetUserName + GetUserName = GetUserName() + + PAGE_EXECUTE_READWRITE = 0x40 + MEM_COMMIT = 0x1000 + MEM_RESERVE = 0x2000 + + def VirtualAlloc(): + _VirtualAlloc = kernel32.VirtualAlloc + _VirtualAlloc.argtypes = [LPVOID, c_size_t, DWORD, DWORD] + _VirtualAlloc.restype = LPVOID + def VirtualAlloc(addr, size, alloctype=(MEM_COMMIT | MEM_RESERVE), + protect=PAGE_EXECUTE_READWRITE): + return _VirtualAlloc(addr, size, alloctype, protect) + return VirtualAlloc + VirtualAlloc = VirtualAlloc() + + MEM_RELEASE = 0x8000 + + def VirtualFree(): + _VirtualFree = kernel32.VirtualFree + _VirtualFree.argtypes = [LPVOID, c_size_t, DWORD] + _VirtualFree.restype = BOOL + def VirtualFree(addr, size=0, freetype=MEM_RELEASE): + return _VirtualFree(addr, size, freetype) + return VirtualFree + VirtualFree = VirtualFree() + + class NativeFunction(object): + def __init__(self, restype, argtypes, insns): + self._buf = buf = VirtualAlloc(None, len(insns)) + memmove(buf, insns, len(insns)) + ftype = CFUNCTYPE(restype, *argtypes) + self._native = ftype(buf) + + def __call__(self, *args): + return self._native(*args) + + def __del__(self): + if self._buf is not None: + VirtualFree(self._buf) + self._buf = None + + if struct.calcsize("P") == 4: + CPUID0_INSNS = ( + "\x53" # push %ebx + "\x31\xc0" # xor %eax,%eax + "\x0f\xa2" # cpuid + "\x8b\x44\x24\x08" # mov 0x8(%esp),%eax + "\x89\x18" # mov %ebx,0x0(%eax) + "\x89\x50\x04" # mov %edx,0x4(%eax) + "\x89\x48\x08" # mov %ecx,0x8(%eax) + "\x5b" # pop %ebx + "\xc3" # ret + ) + CPUID1_INSNS = ( + "\x53" # push %ebx + "\x31\xc0" # xor %eax,%eax + "\x40" # inc %eax + "\x0f\xa2" # cpuid + "\x5b" # pop %ebx + "\xc3" # ret + ) + else: + CPUID0_INSNS = ( + "\x49\x89\xd8" # mov %rbx,%r8 + "\x49\x89\xc9" # mov %rcx,%r9 + "\x48\x31\xc0" # xor %rax,%rax + "\x0f\xa2" # cpuid + "\x4c\x89\xc8" # mov %r9,%rax + "\x89\x18" # mov %ebx,0x0(%rax) + "\x89\x50\x04" # mov %edx,0x4(%rax) + "\x89\x48\x08" # mov %ecx,0x8(%rax) + "\x4c\x89\xc3" # mov %r8,%rbx + "\xc3" # retq + ) + CPUID1_INSNS = ( + "\x53" # push %rbx + "\x48\x31\xc0" # xor %rax,%rax + "\x48\xff\xc0" # inc %rax + "\x0f\xa2" # cpuid + "\x5b" # pop %rbx + "\xc3" # retq + ) + + def cpuid0(): + _cpuid0 = NativeFunction(None, [c_char_p], CPUID0_INSNS) + buf = create_string_buffer(12) + def cpuid0(): + _cpuid0(buf) + return buf.raw + return cpuid0 + cpuid0 = cpuid0() + + cpuid1 = NativeFunction(c_uint, [], CPUID1_INSNS) + + class DataBlob(Structure): + _fields_ = [('cbData', c_uint), + ('pbData', c_void_p)] + DataBlob_p = POINTER(DataBlob) + + def CryptUnprotectData(): + _CryptUnprotectData = crypt32.CryptUnprotectData + _CryptUnprotectData.argtypes = [DataBlob_p, c_wchar_p, DataBlob_p, + c_void_p, c_void_p, c_uint, DataBlob_p] + _CryptUnprotectData.restype = c_uint + def CryptUnprotectData(indata, entropy): + indatab = create_string_buffer(indata) + indata = DataBlob(len(indata), cast(indatab, c_void_p)) + entropyb = create_string_buffer(entropy) + entropy = DataBlob(len(entropy), cast(entropyb, c_void_p)) + outdata = DataBlob() + if not _CryptUnprotectData(byref(indata), None, byref(entropy), + None, None, 0, byref(outdata)): + raise ADEPTError("Failed to decrypt user key key (sic)") + return string_at(outdata.pbData, outdata.cbData) + return CryptUnprotectData + CryptUnprotectData = CryptUnprotectData() + + def retrieve_key(): + if AES is None: + tkMessageBox.showerror( + "ADEPT Key", + "This script requires PyCrypto or OpenSSL which must be installed " + "separately. Read the top-of-script comment for details.") + return False + root = GetSystemDirectory().split('\\')[0] + '\\' + serial = GetVolumeSerialNumber(root) + vendor = cpuid0() + signature = struct.pack('>I', cpuid1())[1:] + user = GetUserName() + entropy = struct.pack('>I12s3s13s', serial, vendor, signature, user) + cuser = winreg.HKEY_CURRENT_USER + try: + regkey = winreg.OpenKey(cuser, DEVICE_KEY_PATH) + except WindowsError: + raise ADEPTError("Adobe Digital Editions not activated") + device = winreg.QueryValueEx(regkey, 'key')[0] + keykey = CryptUnprotectData(device, entropy) + userkey = None + try: + plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) + except WindowsError: + raise ADEPTError("Could not locate ADE activation") + for i in xrange(0, 16): + try: + plkparent = winreg.OpenKey(plkroot, "%04d" % (i,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkparent, None)[0] + if ktype != 'credentials': + continue + for j in xrange(0, 16): + try: + plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkkey, None)[0] + if ktype != 'privateLicenseKey': + continue + userkey = winreg.QueryValueEx(plkkey, 'value')[0] + break + if userkey is not None: + break + if userkey is None: + raise ADEPTError('Could not locate privateLicenseKey') + userkey = userkey.decode('base64') + aes = AES(keykey) + userkey = aes.decrypt(userkey) + userkey = userkey[26:-ord(userkey[-1])] + return userkey + +else: + + import xml.etree.ElementTree as etree + import subprocess + + NSMAP = {'adept': 'http://ns.adobe.com/adept', + 'enc': 'http://www.w3.org/2001/04/xmlenc#'} + + def findActivationDat(): + home = os.getenv('HOME') + cmdline = 'find "' + home + '/Library/Application Support/Adobe/Digital Editions" -name "activation.dat"' + cmdline = cmdline.encode(sys.getfilesystemencoding()) + p2 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p2.communicate() + reslst = out1.split('\n') + cnt = len(reslst) + for j in xrange(cnt): + resline = reslst[j] + pp = resline.find('activation.dat') + if pp >= 0: + ActDatPath = resline + break + if os.path.exists(ActDatPath): + return ActDatPath + return None + + def retrieve_key(): + actpath = findActivationDat() + if actpath is None: + raise ADEPTError("Could not locate ADE activation") + tree = etree.parse(actpath) + adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) + expr = '//%s/%s' % (adept('credentials'), adept('privateLicenseKey')) + userkey = tree.findtext(expr) + userkey = userkey.decode('base64') + userkey = userkey[26:] + return userkey diff --git a/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py b/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py new file mode 100644 index 0000000..c2092de --- /dev/null +++ b/Calibre_Plugins/ineptpdf_plugin/ineptpdf_plugin.py @@ -0,0 +1,2204 @@ +#! /usr/bin/env python + +# ineptpdf_plugin.py +# Released under the terms of the GNU General Public Licence, version 3 or +# later. + +# PLEASE DO NOT PIRATE EBOOKS! + +# We want all authors and publishers, and eBook stores to live +# long and prosperous lives but at the same time we just want to +# be able to read OUR books on whatever device we want and to keep +# readable for a long, long time + +# Requires Calibre version 0.6.44 or higher. +# +# All credit given to I <3 Cabbages for the original standalone scripts. +# I had the much easier job of converting them to a Calibre plugin. +# +# This plugin is meant to decrypt Adobe Digital Edition PDFs that are protected +# with Adobe's Adept encryption. It is meant to function without having to install +# any dependencies... other than having Calibre installed, of course. It will still +# work if you have Python and PyCrypto already installed, but they aren't necessary. +# +# Configuration: +# When first run, the plugin will attempt to find your Adobe Digital Editions installation +# (on Windows and Mac OS's). If successful, it will create a 'calibre-adeptkey.der' file and +# save it in Calibre's configuration directory. It will use that file on subsequent runs. +# If there are already '*.der' files in the directory, the plugin won't attempt to +# find the ADE installation. So if you have ADE installed on the same machine as Calibre... +# you are ready to go. +# +# If you already have keyfiles generated with I <3 Cabbages' ineptkey.pyw script, +# you can put those keyfiles in Calibre's configuration directory. The easiest +# way to find the correct directory is to go to Calibre's Preferences page... click +# on the 'Miscellaneous' button (looks like a gear), and then click the 'Open Calibre +# configuration directory' button. Paste your keyfiles in there. Just make sure that +# they have different names and are saved with the '.der' extension (like the ineptkey +# script produces). This directory isn't touched when upgrading Calibre, so it's quite +# safe to leave them there. +# +# Since there is no Linux version of Adobe Digital Editions, Linux users will have to +# obtain a keyfile through other methods and put the file in Calibre's configuration directory. +# +# All keyfiles with a '.der' extension found in Calibre's configuration directory will +# be used to attempt to decrypt a book. +# +# ** NOTE ** There is no plugin customization data for the Inept PDF DeDRM plugin. +# +# Revision history: +# 0.1 - Initial release + +""" +Decrypts Adobe ADEPT-encrypted PDF files. +""" + +from __future__ import with_statement + +__license__ = 'GPL v3' + +import sys +import os +import re +import zlib +import struct +import hashlib +from itertools import chain, islice +import xml.etree.ElementTree as etree + +global ARC4, RSA, AES + +class ADEPTError(Exception): + pass + + +import hashlib + +def SHA256(message): + ctx = hashlib.sha256() + ctx.update(message) + return ctx.digest() + + +def _load_crypto_libcrypto(): + from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ + Structure, c_ulong, create_string_buffer, cast + from ctypes.util import find_library + + if sys.platform.startswith('win'): + libcrypto = find_library('libeay32') + else: + libcrypto = find_library('crypto') + + if libcrypto is None: + raise ADEPTError('libcrypto not found') + libcrypto = CDLL(libcrypto) + + AES_MAXNR = 14 + + RSA_NO_PADDING = 3 + + c_char_pp = POINTER(c_char_p) + c_int_p = POINTER(c_int) + + class AES_KEY(Structure): + _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), ('rounds', c_int)] + AES_KEY_p = POINTER(AES_KEY) + + class RC4_KEY(Structure): + _fields_ = [('x', c_int), ('y', c_int), ('box', c_int * 256)] + RC4_KEY_p = POINTER(RC4_KEY) + + class RSA(Structure): + pass + RSA_p = POINTER(RSA) + + def F(restype, name, argtypes): + func = getattr(libcrypto, name) + func.restype = restype + func.argtypes = argtypes + return func + + AES_cbc_encrypt = F(None, 'AES_cbc_encrypt',[c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p,c_int]) + AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key',[c_char_p, c_int, AES_KEY_p]) + + RC4_set_key = F(None,'RC4_set_key',[RC4_KEY_p, c_int, c_char_p]) + RC4_crypt = F(None,'RC4',[RC4_KEY_p, c_int, c_char_p, c_char_p]) + + d2i_RSAPrivateKey = F(RSA_p, 'd2i_RSAPrivateKey', + [RSA_p, c_char_pp, c_long]) + RSA_size = F(c_int, 'RSA_size', [RSA_p]) + RSA_private_decrypt = F(c_int, 'RSA_private_decrypt', + [c_int, c_char_p, c_char_p, RSA_p, c_int]) + RSA_free = F(None, 'RSA_free', [RSA_p]) + + class RSA(object): + def __init__(self, der): + buf = create_string_buffer(der) + pp = c_char_pp(cast(buf, c_char_p)) + rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) + if rsa is None: + raise ADEPTError('Error parsing ADEPT user key DER') + + def decrypt(self, from_): + rsa = self._rsa + to = create_string_buffer(RSA_size(rsa)) + dlen = RSA_private_decrypt(len(from_), from_, to, rsa, + RSA_NO_PADDING) + if dlen < 0: + raise ADEPTError('RSA decryption failed') + return to[1:dlen] + + def __del__(self): + if self._rsa is not None: + RSA_free(self._rsa) + self._rsa = None + + class ARC4(object): + @classmethod + def new(cls, userkey): + self = ARC4() + self._blocksize = len(userkey) + key = self._key = RC4_KEY() + RC4_set_key(key, self._blocksize, userkey) + return self + def __init__(self): + self._blocksize = 0 + self._key = None + def decrypt(self, data): + out = create_string_buffer(len(data)) + RC4_crypt(self._key, len(data), data, out) + return out.raw + + class AES(object): + @classmethod + def new(cls, userkey, mode, iv): + self = AES() + self._blocksize = len(userkey) + # mode is ignored since CBCMODE is only thing supported/used so far + self._mode = mode + if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : + raise ADEPTError('AES improper key used') + return + keyctx = self._keyctx = AES_KEY() + self._iv = iv + rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) + if rv < 0: + raise ADEPTError('Failed to initialize AES key') + return self + def __init__(self): + self._blocksize = 0 + self._keyctx = None + self._iv = 0 + self._mode = 0 + def decrypt(self, data): + out = create_string_buffer(len(data)) + rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self._iv, 0) + if rv == 0: + raise ADEPTError('AES decryption failed') + return out.raw + + return (ARC4, RSA, AES) + + +def _load_crypto_pycrypto(): + from Crypto.PublicKey import RSA as _RSA + from Crypto.Cipher import ARC4 as _ARC4 + from Crypto.Cipher import AES as _AES + + # ASN.1 parsing code from tlslite + class ASN1Error(Exception): + pass + + class ASN1Parser(object): + class Parser(object): + def __init__(self, bytes): + self.bytes = bytes + self.index = 0 + + def get(self, length): + if self.index + length > len(self.bytes): + raise ASN1Error("Error decoding ASN.1") + x = 0 + for count in range(length): + x <<= 8 + x |= self.bytes[self.index] + self.index += 1 + return x + + def getFixBytes(self, lengthBytes): + bytes = self.bytes[self.index : self.index+lengthBytes] + self.index += lengthBytes + return bytes + + def getVarBytes(self, lengthLength): + lengthBytes = self.get(lengthLength) + return self.getFixBytes(lengthBytes) + + def getFixList(self, length, lengthList): + l = [0] * lengthList + for x in range(lengthList): + l[x] = self.get(length) + return l + + def getVarList(self, length, lengthLength): + lengthList = self.get(lengthLength) + if lengthList % length != 0: + raise ASN1Error("Error decoding ASN.1") + lengthList = int(lengthList/length) + l = [0] * lengthList + for x in range(lengthList): + l[x] = self.get(length) + return l + + def startLengthCheck(self, lengthLength): + self.lengthCheck = self.get(lengthLength) + self.indexCheck = self.index + + def setLengthCheck(self, length): + self.lengthCheck = length + self.indexCheck = self.index + + def stopLengthCheck(self): + if (self.index - self.indexCheck) != self.lengthCheck: + raise ASN1Error("Error decoding ASN.1") + + def atLengthCheck(self): + if (self.index - self.indexCheck) < self.lengthCheck: + return False + elif (self.index - self.indexCheck) == self.lengthCheck: + return True + else: + raise ASN1Error("Error decoding ASN.1") + + def __init__(self, bytes): + p = self.Parser(bytes) + p.get(1) + self.length = self._getASN1Length(p) + self.value = p.getFixBytes(self.length) + + def getChild(self, which): + p = self.Parser(self.value) + for x in range(which+1): + markIndex = p.index + p.get(1) + length = self._getASN1Length(p) + p.getFixBytes(length) + return ASN1Parser(p.bytes[markIndex:p.index]) + + def _getASN1Length(self, p): + firstLength = p.get(1) + if firstLength<=127: + return firstLength + else: + lengthLength = firstLength & 0x7F + return p.get(lengthLength) + + class ARC4(object): + @classmethod + def new(cls, userkey): + self = ARC4() + self._arc4 = _ARC4.new(userkey) + return self + def __init__(self): + self._arc4 = None + def decrypt(self, data): + return self._arc4.decrypt(data) + + class AES(object): + @classmethod + def new(cls, userkey, mode, iv): + self = AES() + self._aes = _AES.new(userkey, mode, iv) + return self + def __init__(self): + self._aes = None + def decrypt(self, data): + return self._aes.decrypt(data) + + class RSA(object): + def __init__(self, der): + key = ASN1Parser([ord(x) for x in der]) + key = [key.getChild(x).value for x in xrange(1, 4)] + key = [self.bytesToNumber(v) for v in key] + self._rsa = _RSA.construct(key) + + def bytesToNumber(self, bytes): + total = 0L + for byte in bytes: + total = (total << 8) + byte + return total + + def decrypt(self, data): + return self._rsa.decrypt(data) + + return (ARC4, RSA, AES) + +def _load_crypto(): + ARC4 = RSA = AES = None + for loader in (_load_crypto_libcrypto, _load_crypto_pycrypto): + try: + ARC4, RSA, AES = loader() + break + except (ImportError, ADEPTError): + pass + return (ARC4, RSA, AES) + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + + +# Do we generate cross reference streams on output? +# 0 = never +# 1 = only if present in input +# 2 = always + +GEN_XREF_STM = 1 + +# This is the value for the current document +gen_xref_stm = False # will be set in PDFSerializer + +# PDF parsing routines from pdfminer, with changes for EBX_HANDLER + +# Utilities + +def choplist(n, seq): + '''Groups every n elements of the list.''' + r = [] + for x in seq: + r.append(x) + if len(r) == n: + yield tuple(r) + r = [] + return + +def nunpack(s, default=0): + '''Unpacks up to 4 bytes big endian.''' + l = len(s) + if not l: + return default + elif l == 1: + return ord(s) + elif l == 2: + return struct.unpack('>H', s)[0] + elif l == 3: + return struct.unpack('>L', '\x00'+s)[0] + elif l == 4: + return struct.unpack('>L', s)[0] + else: + return TypeError('invalid length: %d' % l) + + +STRICT = 0 + + +# PS Exceptions + +class PSException(Exception): pass +class PSEOF(PSException): pass +class PSSyntaxError(PSException): pass +class PSTypeError(PSException): pass +class PSValueError(PSException): pass + + +# Basic PostScript Types + + +# PSLiteral +class PSObject(object): pass + +class PSLiteral(PSObject): + ''' + PS literals (e.g. "/Name"). + Caution: Never create these objects directly. + Use PSLiteralTable.intern() instead. + ''' + def __init__(self, name): + self.name = name + return + + def __repr__(self): + name = [] + for char in self.name: + if not char.isalnum(): + char = '#%02x' % ord(char) + name.append(char) + return '/%s' % ''.join(name) + +# PSKeyword +class PSKeyword(PSObject): + ''' + PS keywords (e.g. "showpage"). + Caution: Never create these objects directly. + Use PSKeywordTable.intern() instead. + ''' + def __init__(self, name): + self.name = name + return + + def __repr__(self): + return self.name + +# PSSymbolTable +class PSSymbolTable(object): + + ''' + Symbol table that stores PSLiteral or PSKeyword. + ''' + + def __init__(self, classe): + self.dic = {} + self.classe = classe + return + + def intern(self, name): + if name in self.dic: + lit = self.dic[name] + else: + lit = self.classe(name) + self.dic[name] = lit + return lit + +PSLiteralTable = PSSymbolTable(PSLiteral) +PSKeywordTable = PSSymbolTable(PSKeyword) +LIT = PSLiteralTable.intern +KWD = PSKeywordTable.intern +KEYWORD_BRACE_BEGIN = KWD('{') +KEYWORD_BRACE_END = KWD('}') +KEYWORD_ARRAY_BEGIN = KWD('[') +KEYWORD_ARRAY_END = KWD(']') +KEYWORD_DICT_BEGIN = KWD('<<') +KEYWORD_DICT_END = KWD('>>') + + +def literal_name(x): + if not isinstance(x, PSLiteral): + if STRICT: + raise PSTypeError('Literal required: %r' % x) + else: + return str(x) + return x.name + +def keyword_name(x): + if not isinstance(x, PSKeyword): + if STRICT: + raise PSTypeError('Keyword required: %r' % x) + else: + return str(x) + return x.name + + +## PSBaseParser +## +EOL = re.compile(r'[\r\n]') +SPC = re.compile(r'\s') +NONSPC = re.compile(r'\S') +HEX = re.compile(r'[0-9a-fA-F]') +END_LITERAL = re.compile(r'[#/%\[\]()<>{}\s]') +END_HEX_STRING = re.compile(r'[^\s0-9a-fA-F]') +HEX_PAIR = re.compile(r'[0-9a-fA-F]{2}|.') +END_NUMBER = re.compile(r'[^0-9]') +END_KEYWORD = re.compile(r'[#/%\[\]()<>{}\s]') +END_STRING = re.compile(r'[()\134]') +OCT_STRING = re.compile(r'[0-7]') +ESC_STRING = { 'b':8, 't':9, 'n':10, 'f':12, 'r':13, '(':40, ')':41, '\\':92 } + +class PSBaseParser(object): + + ''' + Most basic PostScript parser that performs only basic tokenization. + ''' + BUFSIZ = 4096 + + def __init__(self, fp): + self.fp = fp + self.seek(0) + return + + def __repr__(self): + return '' % (self.fp, self.bufpos) + + def flush(self): + return + + def close(self): + self.flush() + return + + def tell(self): + return self.bufpos+self.charpos + + def poll(self, pos=None, n=80): + pos0 = self.fp.tell() + if not pos: + pos = self.bufpos+self.charpos + self.fp.seek(pos) + ##print >>sys.stderr, 'poll(%d): %r' % (pos, self.fp.read(n)) + self.fp.seek(pos0) + return + + def seek(self, pos): + ''' + Seeks the parser to the given position. + ''' + self.fp.seek(pos) + # reset the status for nextline() + self.bufpos = pos + self.buf = '' + self.charpos = 0 + # reset the status for nexttoken() + self.parse1 = self.parse_main + self.tokens = [] + return + + def fillbuf(self): + if self.charpos < len(self.buf): return + # fetch next chunk. + self.bufpos = self.fp.tell() + self.buf = self.fp.read(self.BUFSIZ) + if not self.buf: + raise PSEOF('Unexpected EOF') + self.charpos = 0 + return + + def parse_main(self, s, i): + m = NONSPC.search(s, i) + if not m: + return (self.parse_main, len(s)) + j = m.start(0) + c = s[j] + self.tokenstart = self.bufpos+j + if c == '%': + self.token = '%' + return (self.parse_comment, j+1) + if c == '/': + self.token = '' + return (self.parse_literal, j+1) + if c in '-+' or c.isdigit(): + self.token = c + return (self.parse_number, j+1) + if c == '.': + self.token = c + return (self.parse_float, j+1) + if c.isalpha(): + self.token = c + return (self.parse_keyword, j+1) + if c == '(': + self.token = '' + self.paren = 1 + return (self.parse_string, j+1) + if c == '<': + self.token = '' + return (self.parse_wopen, j+1) + if c == '>': + self.token = '' + return (self.parse_wclose, j+1) + self.add_token(KWD(c)) + return (self.parse_main, j+1) + + def add_token(self, obj): + self.tokens.append((self.tokenstart, obj)) + return + + def parse_comment(self, s, i): + m = EOL.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_comment, len(s)) + j = m.start(0) + self.token += s[i:j] + # We ignore comments. + #self.tokens.append(self.token) + return (self.parse_main, j) + + def parse_literal(self, s, i): + m = END_LITERAL.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_literal, len(s)) + j = m.start(0) + self.token += s[i:j] + c = s[j] + if c == '#': + self.hex = '' + return (self.parse_literal_hex, j+1) + self.add_token(LIT(self.token)) + return (self.parse_main, j) + + def parse_literal_hex(self, s, i): + c = s[i] + if HEX.match(c) and len(self.hex) < 2: + self.hex += c + return (self.parse_literal_hex, i+1) + if self.hex: + self.token += chr(int(self.hex, 16)) + return (self.parse_literal, i) + + def parse_number(self, s, i): + m = END_NUMBER.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_number, len(s)) + j = m.start(0) + self.token += s[i:j] + c = s[j] + if c == '.': + self.token += c + return (self.parse_float, j+1) + try: + self.add_token(int(self.token)) + except ValueError: + pass + return (self.parse_main, j) + def parse_float(self, s, i): + m = END_NUMBER.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_float, len(s)) + j = m.start(0) + self.token += s[i:j] + self.add_token(float(self.token)) + return (self.parse_main, j) + + def parse_keyword(self, s, i): + m = END_KEYWORD.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_keyword, len(s)) + j = m.start(0) + self.token += s[i:j] + if self.token == 'true': + token = True + elif self.token == 'false': + token = False + else: + token = KWD(self.token) + self.add_token(token) + return (self.parse_main, j) + + def parse_string(self, s, i): + m = END_STRING.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_string, len(s)) + j = m.start(0) + self.token += s[i:j] + c = s[j] + if c == '\\': + self.oct = '' + return (self.parse_string_1, j+1) + if c == '(': + self.paren += 1 + self.token += c + return (self.parse_string, j+1) + if c == ')': + self.paren -= 1 + if self.paren: + self.token += c + return (self.parse_string, j+1) + self.add_token(self.token) + return (self.parse_main, j+1) + def parse_string_1(self, s, i): + c = s[i] + if OCT_STRING.match(c) and len(self.oct) < 3: + self.oct += c + return (self.parse_string_1, i+1) + if self.oct: + self.token += chr(int(self.oct, 8)) + return (self.parse_string, i) + if c in ESC_STRING: + self.token += chr(ESC_STRING[c]) + return (self.parse_string, i+1) + + def parse_wopen(self, s, i): + c = s[i] + if c.isspace() or HEX.match(c): + return (self.parse_hexstring, i) + if c == '<': + self.add_token(KEYWORD_DICT_BEGIN) + i += 1 + return (self.parse_main, i) + + def parse_wclose(self, s, i): + c = s[i] + if c == '>': + self.add_token(KEYWORD_DICT_END) + i += 1 + return (self.parse_main, i) + + def parse_hexstring(self, s, i): + m = END_HEX_STRING.search(s, i) + if not m: + self.token += s[i:] + return (self.parse_hexstring, len(s)) + j = m.start(0) + self.token += s[i:j] + token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)), + SPC.sub('', self.token)) + self.add_token(token) + return (self.parse_main, j) + + def nexttoken(self): + while not self.tokens: + self.fillbuf() + (self.parse1, self.charpos) = self.parse1(self.buf, self.charpos) + token = self.tokens.pop(0) + return token + + def nextline(self): + ''' + Fetches a next line that ends either with \\r or \\n. + ''' + linebuf = '' + linepos = self.bufpos + self.charpos + eol = False + while 1: + self.fillbuf() + if eol: + c = self.buf[self.charpos] + # handle '\r\n' + if c == '\n': + linebuf += c + self.charpos += 1 + break + m = EOL.search(self.buf, self.charpos) + if m: + linebuf += self.buf[self.charpos:m.end(0)] + self.charpos = m.end(0) + if linebuf[-1] == '\r': + eol = True + else: + break + else: + linebuf += self.buf[self.charpos:] + self.charpos = len(self.buf) + return (linepos, linebuf) + + def revreadlines(self): + ''' + Fetches a next line backword. This is used to locate + the trailers at the end of a file. + ''' + self.fp.seek(0, 2) + pos = self.fp.tell() + buf = '' + while 0 < pos: + prevpos = pos + pos = max(0, pos-self.BUFSIZ) + self.fp.seek(pos) + s = self.fp.read(prevpos-pos) + if not s: break + while 1: + n = max(s.rfind('\r'), s.rfind('\n')) + if n == -1: + buf = s + buf + break + yield s[n:]+buf + s = s[:n] + buf = '' + return + + +## PSStackParser +## +class PSStackParser(PSBaseParser): + + def __init__(self, fp): + PSBaseParser.__init__(self, fp) + self.reset() + return + + def reset(self): + self.context = [] + self.curtype = None + self.curstack = [] + self.results = [] + return + + def seek(self, pos): + PSBaseParser.seek(self, pos) + self.reset() + return + + def push(self, *objs): + self.curstack.extend(objs) + return + def pop(self, n): + objs = self.curstack[-n:] + self.curstack[-n:] = [] + return objs + def popall(self): + objs = self.curstack + self.curstack = [] + return objs + def add_results(self, *objs): + self.results.extend(objs) + return + + def start_type(self, pos, type): + self.context.append((pos, self.curtype, self.curstack)) + (self.curtype, self.curstack) = (type, []) + return + def end_type(self, type): + if self.curtype != type: + raise PSTypeError('Type mismatch: %r != %r' % (self.curtype, type)) + objs = [ obj for (_,obj) in self.curstack ] + (pos, self.curtype, self.curstack) = self.context.pop() + return (pos, objs) + + def do_keyword(self, pos, token): + return + + def nextobject(self, direct=False): + ''' + Yields a list of objects: keywords, literals, strings, + numbers, arrays and dictionaries. Arrays and dictionaries + are represented as Python sequence and dictionaries. + ''' + while not self.results: + (pos, token) = self.nexttoken() + ##print (pos,token), (self.curtype, self.curstack) + if (isinstance(token, int) or + isinstance(token, float) or + isinstance(token, bool) or + isinstance(token, str) or + isinstance(token, PSLiteral)): + # normal token + self.push((pos, token)) + elif token == KEYWORD_ARRAY_BEGIN: + # begin array + self.start_type(pos, 'a') + elif token == KEYWORD_ARRAY_END: + # end array + try: + self.push(self.end_type('a')) + except PSTypeError: + if STRICT: raise + elif token == KEYWORD_DICT_BEGIN: + # begin dictionary + self.start_type(pos, 'd') + elif token == KEYWORD_DICT_END: + # end dictionary + try: + (pos, objs) = self.end_type('d') + if len(objs) % 2 != 0: + raise PSSyntaxError( + 'Invalid dictionary construct: %r' % objs) + d = dict((literal_name(k), v) \ + for (k,v) in choplist(2, objs)) + self.push((pos, d)) + except PSTypeError: + if STRICT: raise + else: + self.do_keyword(pos, token) + if self.context: + continue + else: + if direct: + return self.pop(1)[0] + self.flush() + obj = self.results.pop(0) + return obj + + +LITERAL_CRYPT = PSLiteralTable.intern('Crypt') +LITERALS_FLATE_DECODE = (PSLiteralTable.intern('FlateDecode'), PSLiteralTable.intern('Fl')) +LITERALS_LZW_DECODE = (PSLiteralTable.intern('LZWDecode'), PSLiteralTable.intern('LZW')) +LITERALS_ASCII85_DECODE = (PSLiteralTable.intern('ASCII85Decode'), PSLiteralTable.intern('A85')) + + +## PDF Objects +## +class PDFObject(PSObject): pass + +class PDFException(PSException): pass +class PDFTypeError(PDFException): pass +class PDFValueError(PDFException): pass +class PDFNotImplementedError(PSException): pass + + +## PDFObjRef +## +class PDFObjRef(PDFObject): + + def __init__(self, doc, objid, genno): + if objid == 0: + if STRICT: + raise PDFValueError('PDF object id cannot be 0.') + self.doc = doc + self.objid = objid + self.genno = genno + return + + def __repr__(self): + return '' % (self.objid, self.genno) + + def resolve(self): + return self.doc.getobj(self.objid) + + +# resolve +def resolve1(x): + ''' + Resolve an object. If this is an array or dictionary, + it may still contains some indirect objects inside. + ''' + while isinstance(x, PDFObjRef): + x = x.resolve() + return x + +def resolve_all(x): + ''' + Recursively resolve X and all the internals. + Make sure there is no indirect reference within the nested object. + This procedure might be slow. + ''' + while isinstance(x, PDFObjRef): + x = x.resolve() + if isinstance(x, list): + x = [ resolve_all(v) for v in x ] + elif isinstance(x, dict): + for (k,v) in x.iteritems(): + x[k] = resolve_all(v) + return x + +def decipher_all(decipher, objid, genno, x): + ''' + Recursively decipher X. + ''' + if isinstance(x, str): + return decipher(objid, genno, x) + decf = lambda v: decipher_all(decipher, objid, genno, v) + if isinstance(x, list): + x = [decf(v) for v in x] + elif isinstance(x, dict): + x = dict((k, decf(v)) for (k, v) in x.iteritems()) + return x + + +# Type cheking +def int_value(x): + x = resolve1(x) + if not isinstance(x, int): + if STRICT: + raise PDFTypeError('Integer required: %r' % x) + return 0 + return x + +def float_value(x): + x = resolve1(x) + if not isinstance(x, float): + if STRICT: + raise PDFTypeError('Float required: %r' % x) + return 0.0 + return x + +def num_value(x): + x = resolve1(x) + if not (isinstance(x, int) or isinstance(x, float)): + if STRICT: + raise PDFTypeError('Int or Float required: %r' % x) + return 0 + return x + +def str_value(x): + x = resolve1(x) + if not isinstance(x, str): + if STRICT: + raise PDFTypeError('String required: %r' % x) + return '' + return x + +def list_value(x): + x = resolve1(x) + if not (isinstance(x, list) or isinstance(x, tuple)): + if STRICT: + raise PDFTypeError('List required: %r' % x) + return [] + return x + +def dict_value(x): + x = resolve1(x) + if not isinstance(x, dict): + if STRICT: + raise PDFTypeError('Dict required: %r' % x) + return {} + return x + +def stream_value(x): + x = resolve1(x) + if not isinstance(x, PDFStream): + if STRICT: + raise PDFTypeError('PDFStream required: %r' % x) + return PDFStream({}, '') + return x + +# ascii85decode(data) +def ascii85decode(data): + n = b = 0 + out = '' + for c in data: + if '!' <= c and c <= 'u': + n += 1 + b = b*85+(ord(c)-33) + if n == 5: + out += struct.pack('>L',b) + n = b = 0 + elif c == 'z': + assert n == 0 + out += '\0\0\0\0' + elif c == '~': + if n: + for _ in range(5-n): + b = b*85+84 + out += struct.pack('>L',b)[:n-1] + break + return out + + +## PDFStream type +class PDFStream(PDFObject): + def __init__(self, dic, rawdata, decipher=None): + length = int_value(dic.get('Length', 0)) + eol = rawdata[length:] + # quick and dirty fix for false length attribute, + # might not work if the pdf stream parser has a problem + if decipher != None and decipher.__name__ == 'decrypt_aes': + if (len(rawdata) % 16) != 0: + cutdiv = len(rawdata) // 16 + rawdata = rawdata[:16*cutdiv] + else: + if eol in ('\r', '\n', '\r\n'): + rawdata = rawdata[:length] + + self.dic = dic + self.rawdata = rawdata + self.decipher = decipher + self.data = None + self.decdata = None + self.objid = None + self.genno = None + return + + def set_objid(self, objid, genno): + self.objid = objid + self.genno = genno + return + + def __repr__(self): + if self.rawdata: + return '' % \ + (self.objid, len(self.rawdata), self.dic) + else: + return '' % \ + (self.objid, len(self.data), self.dic) + + def decode(self): + assert self.data is None and self.rawdata is not None + data = self.rawdata + if self.decipher: + # Handle encryption + data = self.decipher(self.objid, self.genno, data) + if gen_xref_stm: + self.decdata = data # keep decrypted data + if 'Filter' not in self.dic: + self.data = data + self.rawdata = None + ##print self.dict + return + filters = self.dic['Filter'] + if not isinstance(filters, list): + filters = [ filters ] + for f in filters: + if f in LITERALS_FLATE_DECODE: + # will get errors if the document is encrypted. + data = zlib.decompress(data) + elif f in LITERALS_LZW_DECODE: + data = ''.join(LZWDecoder(StringIO(data)).run()) + elif f in LITERALS_ASCII85_DECODE: + data = ascii85decode(data) + elif f == LITERAL_CRYPT: + raise PDFNotImplementedError('/Crypt filter is unsupported') + else: + raise PDFNotImplementedError('Unsupported filter: %r' % f) + # apply predictors + if 'DP' in self.dic: + params = self.dic['DP'] + else: + params = self.dic.get('DecodeParms', {}) + if 'Predictor' in params: + pred = int_value(params['Predictor']) + if pred: + if pred != 12: + raise PDFNotImplementedError( + 'Unsupported predictor: %r' % pred) + if 'Columns' not in params: + raise PDFValueError( + 'Columns undefined for predictor=12') + columns = int_value(params['Columns']) + buf = '' + ent0 = '\x00' * columns + for i in xrange(0, len(data), columns+1): + pred = data[i] + ent1 = data[i+1:i+1+columns] + if pred == '\x02': + ent1 = ''.join(chr((ord(a)+ord(b)) & 255) \ + for (a,b) in zip(ent0,ent1)) + buf += ent1 + ent0 = ent1 + data = buf + self.data = data + self.rawdata = None + return + + def get_data(self): + if self.data is None: + self.decode() + return self.data + + def get_rawdata(self): + return self.rawdata + + def get_decdata(self): + if self.decdata is not None: + return self.decdata + data = self.rawdata + if self.decipher and data: + # Handle encryption + data = self.decipher(self.objid, self.genno, data) + return data + + +## PDF Exceptions +## +class PDFSyntaxError(PDFException): pass +class PDFNoValidXRef(PDFSyntaxError): pass +class PDFEncryptionError(PDFException): pass +class PDFPasswordIncorrect(PDFEncryptionError): pass + +# some predefined literals and keywords. +LITERAL_OBJSTM = PSLiteralTable.intern('ObjStm') +LITERAL_XREF = PSLiteralTable.intern('XRef') +LITERAL_PAGE = PSLiteralTable.intern('Page') +LITERAL_PAGES = PSLiteralTable.intern('Pages') +LITERAL_CATALOG = PSLiteralTable.intern('Catalog') + + +## XRefs +## + +## PDFXRef +## +class PDFXRef(object): + + def __init__(self): + self.offsets = None + return + + def __repr__(self): + return '' % len(self.offsets) + + def objids(self): + return self.offsets.iterkeys() + + def load(self, parser): + self.offsets = {} + while 1: + try: + (pos, line) = parser.nextline() + except PSEOF: + raise PDFNoValidXRef('Unexpected EOF - file corrupted?') + if not line: + raise PDFNoValidXRef('Premature eof: %r' % parser) + if line.startswith('trailer'): + parser.seek(pos) + break + f = line.strip().split(' ') + if len(f) != 2: + raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line)) + try: + (start, nobjs) = map(int, f) + except ValueError: + raise PDFNoValidXRef('Invalid line: %r: line=%r' % (parser, line)) + for objid in xrange(start, start+nobjs): + try: + (_, line) = parser.nextline() + except PSEOF: + raise PDFNoValidXRef('Unexpected EOF - file corrupted?') + f = line.strip().split(' ') + if len(f) != 3: + raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line)) + (pos, genno, use) = f + if use != 'n': continue + self.offsets[objid] = (int(genno), int(pos)) + self.load_trailer(parser) + return + + KEYWORD_TRAILER = PSKeywordTable.intern('trailer') + def load_trailer(self, parser): + try: + (_,kwd) = parser.nexttoken() + assert kwd is self.KEYWORD_TRAILER + (_,dic) = parser.nextobject(direct=True) + except PSEOF: + x = parser.pop(1) + if not x: + raise PDFNoValidXRef('Unexpected EOF - file corrupted') + (_,dic) = x[0] + self.trailer = dict_value(dic) + return + + def getpos(self, objid): + try: + (genno, pos) = self.offsets[objid] + except KeyError: + raise + return (None, pos) + + +## PDFXRefStream +## +class PDFXRefStream(object): + + def __init__(self): + self.index = None + self.data = None + self.entlen = None + self.fl1 = self.fl2 = self.fl3 = None + return + + def __repr__(self): + return '' % self.index + + def objids(self): + for first, size in self.index: + for objid in xrange(first, first + size): + yield objid + + def load(self, parser, debug=0): + (_,objid) = parser.nexttoken() # ignored + (_,genno) = parser.nexttoken() # ignored + (_,kwd) = parser.nexttoken() + (_,stream) = parser.nextobject() + if not isinstance(stream, PDFStream) or \ + stream.dic['Type'] is not LITERAL_XREF: + raise PDFNoValidXRef('Invalid PDF stream spec.') + size = stream.dic['Size'] + index = stream.dic.get('Index', (0,size)) + self.index = zip(islice(index, 0, None, 2), + islice(index, 1, None, 2)) + (self.fl1, self.fl2, self.fl3) = stream.dic['W'] + self.data = stream.get_data() + self.entlen = self.fl1+self.fl2+self.fl3 + self.trailer = stream.dic + return + + def getpos(self, objid): + offset = 0 + for first, size in self.index: + if first <= objid and objid < (first + size): + break + offset += size + else: + raise KeyError(objid) + i = self.entlen * ((objid - first) + offset) + ent = self.data[i:i+self.entlen] + f1 = nunpack(ent[:self.fl1], 1) + if f1 == 1: + pos = nunpack(ent[self.fl1:self.fl1+self.fl2]) + genno = nunpack(ent[self.fl1+self.fl2:]) + return (None, pos) + elif f1 == 2: + objid = nunpack(ent[self.fl1:self.fl1+self.fl2]) + index = nunpack(ent[self.fl1+self.fl2:]) + return (objid, index) + # this is a free object + raise KeyError(objid) + + +## PDFDocument +## +## A PDFDocument object represents a PDF document. +## Since a PDF file is usually pretty big, normally it is not loaded +## at once. Rather it is parsed dynamically as processing goes. +## A PDF parser is associated with the document. +## +class PDFDocument(object): + + def __init__(self): + self.xrefs = [] + self.objs = {} + self.parsed_objs = {} + self.root = None + self.catalog = None + self.parser = None + self.encryption = None + self.decipher = None + return + + # set_parser(parser) + # Associates the document with an (already initialized) parser object. + def set_parser(self, parser): + if self.parser: return + self.parser = parser + # The document is set to be temporarily ready during collecting + # all the basic information about the document, e.g. + # the header, the encryption information, and the access rights + # for the document. + self.ready = True + # Retrieve the information of each header that was appended + # (maybe multiple times) at the end of the document. + self.xrefs = parser.read_xref() + for xref in self.xrefs: + trailer = xref.trailer + if not trailer: continue + + # If there's an encryption info, remember it. + if 'Encrypt' in trailer: + #assert not self.encryption + try: + self.encryption = (list_value(trailer['ID']), + dict_value(trailer['Encrypt'])) + # fix for bad files + except: + self.encryption = ('ffffffffffffffffffffffffffffffffffff', + dict_value(trailer['Encrypt'])) + if 'Root' in trailer: + self.set_root(dict_value(trailer['Root'])) + break + else: + raise PDFSyntaxError('No /Root object! - Is this really a PDF?') + # The document is set to be non-ready again, until all the + # proper initialization (asking the password key and + # verifying the access permission, so on) is finished. + self.ready = False + return + + # set_root(root) + # Set the Root dictionary of the document. + # Each PDF file must have exactly one /Root dictionary. + def set_root(self, root): + self.root = root + self.catalog = dict_value(self.root) + if self.catalog.get('Type') is not LITERAL_CATALOG: + if STRICT: + raise PDFSyntaxError('Catalog not found!') + return + # initialize(password='') + # Perform the initialization with a given password. + # This step is mandatory even if there's no password associated + # with the document. + def initialize(self, password=''): + if not self.encryption: + self.is_printable = self.is_modifiable = self.is_extractable = True + self.ready = True + return + (docid, param) = self.encryption + type = literal_name(param['Filter']) + if type == 'Adobe.APS': + return self.initialize_adobe_ps(password, docid, param) + if type == 'Standard': + return self.initialize_standard(password, docid, param) + if type == 'EBX_HANDLER': + return self.initialize_ebx(password, docid, param) + raise PDFEncryptionError('Unknown filter: param=%r' % param) + + def initialize_adobe_ps(self, password, docid, param): + global KEYFILEPATH + self.decrypt_key = self.genkey_adobe_ps(param) + self.genkey = self.genkey_v4 + self.decipher = self.decrypt_aes + self.ready = True + return + + def genkey_adobe_ps(self, param): + # nice little offline principal keys dictionary + # global static principal key for German Onleihe / Bibliothek Digital + principalkeys = { 'bibliothek-digital.de': 'rRwGv2tbpKov1krvv7PO0ws9S436/lArPlfipz5Pqhw='.decode('base64')} + self.is_printable = self.is_modifiable = self.is_extractable = True + length = int_value(param.get('Length', 0)) / 8 + edcdata = str_value(param.get('EDCData')).decode('base64') + pdrllic = str_value(param.get('PDRLLic')).decode('base64') + pdrlpol = str_value(param.get('PDRLPol')).decode('base64') + edclist = [] + for pair in edcdata.split('\n'): + edclist.append(pair) + # principal key request + for key in principalkeys: + if key in pdrllic: + principalkey = principalkeys[key] + else: + raise ADEPTError('Cannot find principal key for this pdf') + shakey = SHA256(principalkey) + ivector = 16 * chr(0) + plaintext = AES.new(shakey,AES.MODE_CBC,ivector).decrypt(edclist[9].decode('base64')) + if plaintext[-16:] != 16 * chr(16): + raise ADEPTError('Offlinekey cannot be decrypted, aborting ...') + pdrlpol = AES.new(plaintext[16:32],AES.MODE_CBC,edclist[2].decode('base64')).decrypt(pdrlpol) + if ord(pdrlpol[-1]) < 1 or ord(pdrlpol[-1]) > 16: + raise ADEPTError('Could not decrypt PDRLPol, aborting ...') + else: + cutter = -1 * ord(pdrlpol[-1]) + pdrlpol = pdrlpol[:cutter] + return plaintext[:16] + + PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ + '\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' + # experimental aes pw support + def initialize_standard(self, password, docid, param): + # copy from a global variable + V = int_value(param.get('V', 0)) + if (V <=0 or V > 4): + raise PDFEncryptionError('Unknown algorithm: param=%r' % param) + length = int_value(param.get('Length', 40)) # Key length (bits) + O = str_value(param['O']) + R = int_value(param['R']) # Revision + if 5 <= R: + raise PDFEncryptionError('Unknown revision: %r' % R) + U = str_value(param['U']) + P = int_value(param['P']) + try: + EncMetadata = str_value(param['EncryptMetadata']) + except: + EncMetadata = 'True' + self.is_printable = bool(P & 4) + self.is_modifiable = bool(P & 8) + self.is_extractable = bool(P & 16) + self.is_annotationable = bool(P & 32) + self.is_formsenabled = bool(P & 256) + self.is_textextractable = bool(P & 512) + self.is_assemblable = bool(P & 1024) + self.is_formprintable = bool(P & 2048) + # Algorithm 3.2 + password = (password+self.PASSWORD_PADDING)[:32] # 1 + hash = hashlib.md5(password) # 2 + hash.update(O) # 3 + hash.update(struct.pack('= 3: + # Algorithm 3.5 + hash = hashlib.md5(self.PASSWORD_PADDING) # 2 + hash.update(docid[0]) # 3 + x = ARC4.new(key).decrypt(hash.digest()[:16]) # 4 + for i in xrange(1,19+1): + k = ''.join( chr(ord(c) ^ i) for c in key ) + x = ARC4.new(k).decrypt(x) + u1 = x+x # 32bytes total + if R == 2: + is_authenticated = (u1 == U) + else: + is_authenticated = (u1[:16] == U[:16]) + if not is_authenticated: + raise ADEPTError('Password is not correct.') + self.decrypt_key = key + # genkey method + if V == 1 or V == 2: + self.genkey = self.genkey_v2 + elif V == 3: + self.genkey = self.genkey_v3 + elif V == 4: + self.genkey = self.genkey_v2 + #self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 + # rc4 + if V != 4: + self.decipher = self.decipher_rc4 # XXX may be AES + # aes + elif V == 4 and Length == 128: + elf.decipher = self.decipher_aes + elif V == 4 and Length == 256: + raise PDFNotImplementedError('AES256 encryption is currently unsupported') + self.ready = True + return + + def initialize_ebx(self, password, docid, param): + self.is_printable = self.is_modifiable = self.is_extractable = True + with open(password, 'rb') as f: + keyder = f.read() + rsa = RSA(keyder) + length = int_value(param.get('Length', 0)) / 8 + rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') + rights = zlib.decompress(rights, -15) + rights = etree.fromstring(rights) + expr = './/{http://ns.adobe.com/adept}encryptedKey' + bookkey = ''.join(rights.findtext(expr)).decode('base64') + bookkey = rsa.decrypt(bookkey) + if bookkey[0] != '\x02': + raise ADEPTError('error decrypting book session key') + index = bookkey.index('\0') + 1 + bookkey = bookkey[index:] + ebx_V = int_value(param.get('V', 4)) + ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) + # added because of the booktype / decryption book session key error + if ebx_V == 3: + V = 3 + elif ebx_V < 4 or ebx_type < 6: + V = ord(bookkey[0]) + bookkey = bookkey[1:] + else: + V = 2 + if length and len(bookkey) != length: + raise ADEPTError('error decrypting book session key') + self.decrypt_key = bookkey + self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 + self.decipher = self.decrypt_rc4 + self.ready = True + return + + # genkey functions + def genkey_v2(self, objid, genno): + objid = struct.pack(' PDFObjStmRef.maxindex: + PDFObjStmRef.maxindex = index + + +## PDFParser +## +class PDFParser(PSStackParser): + + def __init__(self, doc, fp): + PSStackParser.__init__(self, fp) + self.doc = doc + self.doc.set_parser(self) + return + + def __repr__(self): + return '' + + KEYWORD_R = PSKeywordTable.intern('R') + KEYWORD_ENDOBJ = PSKeywordTable.intern('endobj') + KEYWORD_STREAM = PSKeywordTable.intern('stream') + KEYWORD_XREF = PSKeywordTable.intern('xref') + KEYWORD_STARTXREF = PSKeywordTable.intern('startxref') + def do_keyword(self, pos, token): + if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): + self.add_results(*self.pop(1)) + return + if token is self.KEYWORD_ENDOBJ: + self.add_results(*self.pop(4)) + return + + if token is self.KEYWORD_R: + # reference to indirect object + try: + ((_,objid), (_,genno)) = self.pop(2) + (objid, genno) = (int(objid), int(genno)) + obj = PDFObjRef(self.doc, objid, genno) + self.push((pos, obj)) + except PSSyntaxError: + pass + return + + if token is self.KEYWORD_STREAM: + # stream object + ((_,dic),) = self.pop(1) + dic = dict_value(dic) + try: + objlen = int_value(dic['Length']) + except KeyError: + if STRICT: + raise PDFSyntaxError('/Length is undefined: %r' % dic) + objlen = 0 + self.seek(pos) + try: + (_, line) = self.nextline() # 'stream' + except PSEOF: + if STRICT: + raise PDFSyntaxError('Unexpected EOF') + return + pos += len(line) + self.fp.seek(pos) + data = self.fp.read(objlen) + self.seek(pos+objlen) + while 1: + try: + (linepos, line) = self.nextline() + except PSEOF: + if STRICT: + raise PDFSyntaxError('Unexpected EOF') + break + if 'endstream' in line: + i = line.index('endstream') + objlen += i + data += line[:i] + break + objlen += len(line) + data += line + self.seek(pos+objlen) + obj = PDFStream(dic, data, self.doc.decipher) + self.push((pos, obj)) + return + + # others + self.push((pos, token)) + return + + def find_xref(self): + # search the last xref table by scanning the file backwards. + prev = None + for line in self.revreadlines(): + line = line.strip() + if line == 'startxref': break + if line: + prev = line + else: + raise PDFNoValidXRef('Unexpected EOF') + return int(prev) + + # read xref table + def read_xref_from(self, start, xrefs): + self.seek(start) + self.reset() + try: + (pos, token) = self.nexttoken() + except PSEOF: + raise PDFNoValidXRef('Unexpected EOF') + if isinstance(token, int): + # XRefStream: PDF-1.5 + if GEN_XREF_STM == 1: + global gen_xref_stm + gen_xref_stm = True + self.seek(pos) + self.reset() + xref = PDFXRefStream() + xref.load(self) + else: + if token is not self.KEYWORD_XREF: + raise PDFNoValidXRef('xref not found: pos=%d, token=%r' % + (pos, token)) + self.nextline() + xref = PDFXRef() + xref.load(self) + xrefs.append(xref) + trailer = xref.trailer + if 'XRefStm' in trailer: + pos = int_value(trailer['XRefStm']) + self.read_xref_from(pos, xrefs) + if 'Prev' in trailer: + # find previous xref + pos = int_value(trailer['Prev']) + self.read_xref_from(pos, xrefs) + return + + # read xref tables and trailers + def read_xref(self): + xrefs = [] + trailerpos = None + try: + pos = self.find_xref() + self.read_xref_from(pos, xrefs) + except PDFNoValidXRef: + # fallback + self.seek(0) + pat = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') + offsets = {} + xref = PDFXRef() + while 1: + try: + (pos, line) = self.nextline() + except PSEOF: + break + if line.startswith('trailer'): + trailerpos = pos # remember last trailer + m = pat.match(line) + if not m: continue + (objid, genno) = m.groups() + offsets[int(objid)] = (0, pos) + if not offsets: raise + xref.offsets = offsets + if trailerpos: + self.seek(trailerpos) + xref.load_trailer(self) + xrefs.append(xref) + return xrefs + +## PDFObjStrmParser +## +class PDFObjStrmParser(PDFParser): + + def __init__(self, data, doc): + PSStackParser.__init__(self, StringIO(data)) + self.doc = doc + return + + def flush(self): + self.add_results(*self.popall()) + return + + KEYWORD_R = KWD('R') + def do_keyword(self, pos, token): + if token is self.KEYWORD_R: + # reference to indirect object + try: + ((_,objid), (_,genno)) = self.pop(2) + (objid, genno) = (int(objid), int(genno)) + obj = PDFObjRef(self.doc, objid, genno) + self.push((pos, obj)) + except PSSyntaxError: + pass + return + # others + self.push((pos, token)) + return + +### +### My own code, for which there is none else to blame + +class PDFSerializer(object): + def __init__(self, inf, keypath): + global GEN_XREF_STM, gen_xref_stm + gen_xref_stm = GEN_XREF_STM > 1 + self.version = inf.read(8) + inf.seek(0) + self.doc = doc = PDFDocument() + parser = PDFParser(doc, inf) + doc.initialize(keypath) + self.objids = objids = set() + for xref in reversed(doc.xrefs): + trailer = xref.trailer + for objid in xref.objids(): + objids.add(objid) + trailer = dict(trailer) + trailer.pop('Prev', None) + trailer.pop('XRefStm', None) + if 'Encrypt' in trailer: + objids.remove(trailer.pop('Encrypt').objid) + self.trailer = trailer + + def dump(self, outf): + self.outf = outf + self.write(self.version) + self.write('\n%\xe2\xe3\xcf\xd3\n') + doc = self.doc + objids = self.objids + xrefs = {} + maxobj = max(objids) + trailer = dict(self.trailer) + trailer['Size'] = maxobj + 1 + for objid in objids: + obj = doc.getobj(objid) + if isinstance(obj, PDFObjStmRef): + xrefs[objid] = obj + continue + if obj is not None: + try: + genno = obj.genno + except AttributeError: + genno = 0 + xrefs[objid] = (self.tell(), genno) + self.serialize_indirect(objid, obj) + startxref = self.tell() + + if not gen_xref_stm: + self.write('xref\n') + self.write('0 %d\n' % (maxobj + 1,)) + for objid in xrange(0, maxobj + 1): + if objid in xrefs: + # force the genno to be 0 + self.write("%010d 00000 n \n" % xrefs[objid][0]) + else: + self.write("%010d %05d f \n" % (0, 65535)) + + self.write('trailer\n') + self.serialize_object(trailer) + self.write('\nstartxref\n%d\n%%%%EOF' % startxref) + + else: # Generate crossref stream. + + # Calculate size of entries + maxoffset = max(startxref, maxobj) + maxindex = PDFObjStmRef.maxindex + fl2 = 2 + power = 65536 + while maxoffset >= power: + fl2 += 1 + power *= 256 + fl3 = 1 + power = 256 + while maxindex >= power: + fl3 += 1 + power *= 256 + + index = [] + first = None + prev = None + data = [] + # Put the xrefstream's reference in itself + startxref = self.tell() + maxobj += 1 + xrefs[maxobj] = (startxref, 0) + for objid in sorted(xrefs): + if first is None: + first = objid + elif objid != prev + 1: + index.extend((first, prev - first + 1)) + first = objid + prev = objid + objref = xrefs[objid] + if isinstance(objref, PDFObjStmRef): + f1 = 2 + f2 = objref.stmid + f3 = objref.index + else: + f1 = 1 + f2 = objref[0] + # we force all generation numbers to be 0 + # f3 = objref[1] + f3 = 0 + + data.append(struct.pack('>B', f1)) + data.append(struct.pack('>L', f2)[-fl2:]) + data.append(struct.pack('>L', f3)[-fl3:]) + index.extend((first, prev - first + 1)) + data = zlib.compress(''.join(data)) + dic = {'Type': LITERAL_XREF, 'Size': prev + 1, 'Index': index, + 'W': [1, fl2, fl3], 'Length': len(data), + 'Filter': LITERALS_FLATE_DECODE[0], + 'Root': trailer['Root'],} + if 'Info' in trailer: + dic['Info'] = trailer['Info'] + xrefstm = PDFStream(dic, data) + self.serialize_indirect(maxobj, xrefstm) + self.write('startxref\n%d\n%%%%EOF' % startxref) + def write(self, data): + self.outf.write(data) + self.last = data[-1:] + + def tell(self): + return self.outf.tell() + + def escape_string(self, string): + string = string.replace('\\', '\\\\') + string = string.replace('\n', r'\n') + string = string.replace('(', r'\(') + string = string.replace(')', r'\)') + # get rid of ciando id + regularexp = re.compile(r'http://www.ciando.com/index.cfm/intRefererID/\d{5}') + if regularexp.match(string): return ('http://www.ciando.com') + return string + + def serialize_object(self, obj): + if isinstance(obj, dict): + # Correct malformed Mac OS resource forks for Stanza + if 'ResFork' in obj and 'Type' in obj and 'Subtype' not in obj \ + and isinstance(obj['Type'], int): + obj['Subtype'] = obj['Type'] + del obj['Type'] + # end - hope this doesn't have bad effects + self.write('<<') + for key, val in obj.items(): + self.write('/%s' % key) + self.serialize_object(val) + self.write('>>') + elif isinstance(obj, list): + self.write('[') + for val in obj: + self.serialize_object(val) + self.write(']') + elif isinstance(obj, str): + self.write('(%s)' % self.escape_string(obj)) + elif isinstance(obj, bool): + if self.last.isalnum(): + self.write(' ') + self.write(str(obj).lower()) + elif isinstance(obj, (int, long, float)): + if self.last.isalnum(): + self.write(' ') + self.write(str(obj)) + elif isinstance(obj, PDFObjRef): + if self.last.isalnum(): + self.write(' ') + self.write('%d %d R' % (obj.objid, 0)) + elif isinstance(obj, PDFStream): + ### If we don't generate cross ref streams the object streams + ### are no longer useful, as we have extracted all objects from + ### them. Therefore leave them out from the output. + if obj.dic.get('Type') == LITERAL_OBJSTM and not gen_xref_stm: + self.write('(deleted)') + else: + data = obj.get_decdata() + self.serialize_object(obj.dic) + self.write('stream\n') + self.write(data) + self.write('\nendstream') + else: + data = str(obj) + if data[0].isalnum() and self.last.isalnum(): + self.write(' ') + self.write(data) + + def serialize_indirect(self, objid, obj): + self.write('%d 0 obj' % (objid,)) + self.serialize_object(obj) + if self.last.isalnum(): + self.write('\n') + self.write('endobj\n') + +def plugin_main(keypath, inpath, outpath): + with open(inpath, 'rb') as inf: + try: + serializer = PDFSerializer(inf, keypath) + except: + print "Error serializing pdf. Probably wrong key." + return 1 + # hope this will fix the 'bad file descriptor' problem + with open(outpath, 'wb') as outf: + # help construct to make sure the method runs to the end + try: + serializer.dump(outf) + except: + print "error writing pdf." + return 1 + return 0 + + +from calibre.customize import FileTypePlugin + +class IneptPDFDeDRM(FileTypePlugin): + name = 'Inept PDF DeDRM' + description = 'Removes DRM from secure Adobe pdf files. \ + Credit given to I <3 Cabbages for the original stand-alone scripts.' + supported_platforms = ['linux', 'osx', 'windows'] + author = 'DiapDealer' + version = (0, 1, 1) + minimum_calibre_version = (0, 6, 44) # Compiled python libraries cannot be imported in earlier versions. + file_types = set(['pdf']) + on_import = True + + def run(self, path_to_ebook): + global ARC4, RSA, AES + + from calibre.gui2 import is_ok_to_use_qt + from PyQt4.Qt import QMessageBox + from calibre.constants import iswindows, isosx + + ARC4, RSA, AES = _load_crypto() + + if AES == None or RSA == None or ARC4 == None: + # Failed to load libcrypto or PyCrypto... Adobe PDFs can\'t be decrypted.' + raise ADEPTError('IneptPDF: Failed to load crypto libs... Adobe PDFs can\'t be decrypted.') + return + + # Load any keyfiles (*.der) included Calibre's config directory. + userkeys = [] + + # Find Calibre's configuration directory. + confpath = os.path.split(os.path.split(self.plugin_path)[0])[0] + print 'IneptPDF: Calibre configuration directory = %s' % confpath + files = os.listdir(confpath) + filefilter = re.compile("\.der$", re.IGNORECASE) + files = filter(filefilter.search, files) + + if files: + try: + for filename in files: + fpath = os.path.join(confpath, filename) + with open(fpath, 'rb') as f: + userkeys.append(f.read()) + print 'IneptPDF: Keyfile %s found in config folder.' % filename + except IOError: + print 'IneptPDF: Error reading keyfiles from config directory.' + pass + else: + # Try to find key from ADE install and save the key in + # Calibre's configuration directory for future use. + if iswindows or isosx: + # ADE key retrieval script. + from ade_key import retrieve_key + try: + keydata = retrieve_key() + userkeys.append(keydata) + keypath = os.path.join(confpath, 'calibre-adeptkey.der') + with open(keypath, 'wb') as f: + f.write(keydata) + print 'IneptPDF: Created keyfile from ADE install.' + except: + print 'IneptPDF: Couldn\'t Retrieve key from ADE install.' + pass + + if not userkeys: + # No user keys found... bail out. + raise ADEPTError('IneptPDF - No keys found. Check keyfile(s)/ADE install') + return None + + # Attempt to decrypt pdf with each encryption key found. + for userkey in userkeys: + # Create a TemporaryPersistent file to work with. + of = self.temporary_file('.pdf') + kf = self.temporary_file('.der') + with open(kf.name, 'wb') as f: + f.write(userkey) + + # Give the user keyfile, ebook and TemporaryPersistent file to the plugin_main function. + print "Ready to start decrypting." + result = plugin_main(kf.name, path_to_ebook, of.name) + + # Decryption was successful return the modified PersistentTemporary + # file to Calibre's import process. + if result == 0: + print 'IneptPDF: Encryption successfully removed.' + of.close + return of.name + break + else: + print 'IneptPDF: Encryption key invalid... trying others.' + of.close() + + # Something went wrong with decryption. + # Import the original unmolested pdf. + of.close + raise ADEPTError('IneptPDF - Ultimately failed to decrypt') + return None diff --git a/Calibre_Plugins/k4mobidedrm_plugin.zip b/Calibre_Plugins/k4mobidedrm_plugin.zip index fe8263ae3d7a3b777be7d5519356553cbf04b420..2a4dcee9618b6676d916ca4088c56152ffb0c557 100644 GIT binary patch literal 42817 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 literal 16172 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 diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py b/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py index 2b91046..c23b897 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4mobidedrm_plugin.py @@ -28,7 +28,7 @@ from __future__ import with_statement -__version__ = '1.2' +__version__ = '1.4' class Unbuffered: def __init__(self, stream): @@ -44,344 +44,60 @@ import os, csv, getopt import binascii import zlib import re +import zlib, zipfile, tempfile, shutil from struct import pack, unpack, unpack_from - -#Exception Handling class DrmException(Exception): pass -# -# crypto digestroutines -# - -import hashlib - -def MD5(message): - ctx = hashlib.md5() - ctx.update(message) - return ctx.digest() - -def SHA1(message): - ctx = hashlib.sha1() - ctx.update(message) - return ctx.digest() - -# determine if we are running as a calibre plugin if 'calibre' in sys.modules: inCalibre = True - global openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 else: inCalibre = False -# -# start of Kindle specific routines -# - -if not inCalibre: - import mobidedrm - if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - -global kindleDatabase - -# Encode the bytes in data with the characters in map -def encode(data, map): - result = "" - for char in data: - value = ord(char) - Q = (value ^ 0x80) // len(map) - R = value % len(map) - result += map[Q] - result += map[R] - return result - -# Hash the bytes in data and then encode the digest with the characters in map -def encodeHash(data,map): - return encode(MD5(data),map) - -# Decode the string in data with the characters in map. Returns the decoded bytes -def decode(data,map): - result = "" - for i in range (0,len(data)-1,2): - high = map.find(data[i]) - low = map.find(data[i+1]) - if (high == -1) or (low == -1) : - break - value = (((high * len(map)) ^ 0x80) & 0xFF) + low - result += pack("B",value) - return result - - -# Parse the Kindle.info file and return the records as a list of key-values -def parseKindleInfo(kInfoFile): - DB = {} - infoReader = openKindleInfo(kInfoFile) - infoReader.read(1) - data = infoReader.read() - if sys.platform.startswith('win'): - items = data.split('{') - else : - items = data.split('[') - for item in items: - splito = item.split(':') - DB[splito[0]] =splito[1] - return DB - -# Get a record from the Kindle.info file for the key "hashedKey" (already hashed and encoded). Return the decoded and decrypted record -def getKindleInfoValueForHash(hashedKey): - global kindleDatabase - encryptedValue = decode(kindleDatabase[hashedKey],charMap2) - if sys.platform.startswith('win'): - return CryptUnprotectData(encryptedValue,"") - else: - cleartext = CryptUnprotectData(encryptedValue) - return decode(cleartext, charMap1) - -# Get a record from the Kindle.info file for the string in "key" (plaintext). Return the decoded and decrypted record -def getKindleInfoValueForKey(key): - return getKindleInfoValueForHash(encodeHash(key,charMap2)) - -# Find if the original string for a hashed/encoded string is known. If so return the original string othwise return an empty string. -def findNameForHash(hash): - names = ["kindle.account.tokens","kindle.cookie.item","eulaVersionAccepted","login_date","kindle.token.item","login","kindle.key.item","kindle.name.info","kindle.device.info", "MazamaRandomNumber"] - result = "" - for name in names: - if hash == encodeHash(name, charMap2): - result = name - break - return result - -# Print all the records from the kindle.info file (option -i) -def printKindleInfo(): - for record in kindleDatabase: - name = findNameForHash(record) - if name != "" : - print (name) - print ("--------------------------") - else : - print ("Unknown Record") - print getKindleInfoValueForHash(record) - print "\n" - -# -# PID generation routines -# - -# Returns two bit at offset from a bit field -def getTwoBitsFromBitField(bitField,offset): - byteNumber = offset // 4 - bitPosition = 6 - 2*(offset % 4) - return ord(bitField[byteNumber]) >> bitPosition & 3 - -# Returns the six bits at offset from a bit field -def getSixBitsFromBitField(bitField,offset): - offset *= 3 - value = (getTwoBitsFromBitField(bitField,offset) <<4) + (getTwoBitsFromBitField(bitField,offset+1) << 2) +getTwoBitsFromBitField(bitField,offset+2) - return value - -# 8 bits to six bits encoding from hash to generate PID string -def encodePID(hash): - global charMap3 - PID = "" - for position in range (0,8): - PID += charMap3[getSixBitsFromBitField(hash,position)] - return PID - -# Encryption table used to generate the device PID -def generatePidEncryptionTable() : - table = [] - for counter1 in range (0,0x100): - value = counter1 - for counter2 in range (0,8): - if (value & 1 == 0) : - value = value >> 1 - else : - value = value >> 1 - value = value ^ 0xEDB88320 - table.append(value) - return table - -# Seed value used to generate the device PID -def generatePidSeed(table,dsn) : - value = 0 - for counter in range (0,4) : - index = (ord(dsn[counter]) ^ value) &0xFF - value = (value >> 8) ^ table[index] - return value - -# Generate the device PID -def generateDevicePID(table,dsn,nbRoll): - seed = generatePidSeed(table,dsn) - pidAscii = "" - pid = [(seed >>24) &0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF,(seed>>24) & 0xFF,(seed >> 16) &0xff,(seed >> 8) &0xFF,(seed) & 0xFF] - index = 0 - for counter in range (0,nbRoll): - pid[index] = pid[index] ^ ord(dsn[counter]) - index = (index+1) %8 - for counter in range (0,8): - index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) - pidAscii += charMap4[index] - return pidAscii - -# convert from 8 digit PID to 10 digit PID with checksum -def checksumPid(s): - letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" - crc = (~binascii.crc32(s,-1))&0xFFFFFFFF - crc = crc ^ (crc >> 16) - res = s - l = len(letters) - for i in (0,1): - b = crc & 0xff - pos = (b // l) ^ (b % l) - res += letters[pos%l] - crc >>= 8 - return res - - -class MobiPeek: - def loadSection(self, section): - before, after = self.sections[section:section+2] - self.f.seek(before) - return self.f.read(after - before) - def __init__(self, filename): - self.f = file(filename, 'rb') - self.header = self.f.read(78) - self.ident = self.header[0x3C:0x3C+8] - if self.ident != 'BOOKMOBI' and self.ident != 'TEXtREAd': - raise DrmException('invalid file format') - self.num_sections, = unpack_from('>H', self.header, 76) - sections = self.f.read(self.num_sections*8) - self.sections = unpack_from('>%dL' % (self.num_sections*2), sections, 0)[::2] + (0xfffffff, ) - self.sect0 = self.loadSection(0) - self.f.close() - def getBookTitle(self): - # get book title - toff, tlen = unpack('>II', self.sect0[0x54:0x5c]) - tend = toff + tlen - title = self.sect0[toff:tend] - return title - def getexthData(self): - # if exth region exists then grab it - # get length of this header - length, type, codepage, unique_id, version = unpack('>LLLLL', self.sect0[20:40]) - exth_flag, = unpack('>L', self.sect0[0x80:0x84]) - exth = '' - if exth_flag & 0x40: - exth = self.sect0[16 + length:] - return exth - def isNotEncrypted(self): - lock_type, = unpack('>H', self.sect0[0xC:0xC+2]) - if lock_type == 0: - return True - return False - -# DiapDealer's stuff: Parse the EXTH header records and parse the Kindleinfo -# file to calculate the book pid. -def getK4Pids(exth, title, kInfoFile=None): - global kindleDatabase - try: - kindleDatabase = parseKindleInfo(kInfoFile) - except Exception, message: - print(message) - - if kindleDatabase != None : - # Get the Mazama Random number - MazamaRandomNumber = getKindleInfoValueForKey("MazamaRandomNumber") - - # Get the HDD serial - encodedSystemVolumeSerialNumber = encodeHash(GetVolumeSerialNumber(),charMap1) - - # Get the current user name - encodedUsername = encodeHash(GetUserName(),charMap1) - - # concat, hash and encode to calculate the DSN - DSN = encode(SHA1(MazamaRandomNumber+encodedSystemVolumeSerialNumber+encodedUsername),charMap1) - - print("\nDSN: " + DSN) - - # Compute the device PID (for which I can tell, is used for nothing). - # But hey, stuff being printed out is apparently cool. - table = generatePidEncryptionTable() - devicePID = generateDevicePID(table,DSN,4) - - print("Device PID: " + checksumPid(devicePID)) - - # Compute book PID - exth_records = {} - nitems, = unpack('>I', exth[8:12]) - pos = 12 - - exth_records[209] = None - # Parse the exth records, storing data indexed by type - for i in xrange(nitems): - type, size = unpack('>II', exth[pos: pos + 8]) - content = exth[pos + 8: pos + size] - - exth_records[type] = content - pos += size - - # Grab the contents of the type 209 exth record - if exth_records[209] != None: - data = exth_records[209] - else: - raise DrmException("\nNo EXTH record type 209 - Perhaps not a K4 file?") - - # Parse the 209 data to find the the exth record with the token data. - # The last character of the 209 data points to the record with the token. - # Always 208 from my experience, but I'll leave the logic in case that changes. - for i in xrange(len(data)): - if ord(data[i]) != 0: - if exth_records[ord(data[i])] != None: - token = exth_records[ord(data[i])] - - # Get the kindle account token - kindleAccountToken = getKindleInfoValueForKey("kindle.account.tokens") - - print("Account Token: " + kindleAccountToken) - - pidHash = SHA1(DSN+kindleAccountToken+exth_records[209]+token) - - bookPID = encodePID(pidHash) - bookPID = checksumPid(bookPID) - - if exth_records[503] != None: - print "Pid for " + exth_records[503] + ": " + bookPID - else: - print "Pid for " + title + ":" + bookPID - return bookPID - - raise DrmException("\nCould not access K4 data - Perhaps K4 is not installed/configured?") - return null +def zipUpDir(myzip, tempdir,localname): + currentdir = tempdir + if localname != "": + currentdir = os.path.join(currentdir,localname) + list = os.listdir(currentdir) + for file in list: + afilename = file + localfilePath = os.path.join(localname, afilename) + realfilePath = os.path.join(currentdir,file) + if os.path.isfile(realfilePath): + myzip.write(realfilePath, localfilePath) + elif os.path.isdir(realfilePath): + zipUpDir(myzip, tempdir, localfilePath) def usage(progname): - print "Removes DRM protection from K4PC, K4M, and Mobi ebooks" + print "Removes DRM protection from K4PC/M, Kindle, Mobi and Topaz ebooks" print "Usage:" - print " %s [-k ] [-p ] " % progname + print " %s [-k ] [-p ] [-s ] " % progname # # Main # def main(argv=sys.argv): - global kindleDatabase import mobidedrm - + import topazextract + import kgenpids progname = os.path.basename(argv[0]) + + k4 = False kInfoFiles = [] - pidnums = "" + serials = [] + pids = [] print ('K4MobiDeDrm v%(__version__)s ' 'provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc .' % globals()) + print ' ' try: - opts, args = getopt.getopt(sys.argv[1:], "k:p:") + opts, args = getopt.getopt(sys.argv[1:], "k:p:s:") except getopt.GetoptError, err: print str(err) usage(progname) sys.exit(2) - if len(args)<2: usage(progname) sys.exit(2) @@ -394,126 +110,145 @@ def main(argv=sys.argv): if o == "-p": if a == None : raise DrmException("Invalid parameter for -p") - pidnums = a + pids = a.split(',') + if o == "-s": + if a == None : + raise DrmException("Invalid parameter for -s") + serials = a.split(',') + + # try with built in Kindle Info files + k4 = True - kindleDatabase = None infile = args[0] - outfile = args[1] - DecodeErrorString = "" - try: - # first try with K4PC/K4M - ex = MobiPeek(infile) - if ex.isNotEncrypted(): - print "File was Not Encrypted" - return 2 - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title) - unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except DrmException, e: - DecodeErrorString += "Error trying default K4 info: " + str(e) + "\n" - pass - except mobidedrm.DrmException, e: - DecodeErrorString += "Error trying default K4 info: " + str(e) + "\n" - pass + outdir = args[1] + + # handle the obvious cases at the beginning + if not os.path.isfile(infile): + print "Error: Input file does not exist" + return 1 + + mobi = True + magic3 = file(infile,'rb').read(3) + if magic3 == 'TPZ': + mobi = False + + bookname = os.path.splitext(os.path.basename(infile))[0] + + if mobi: + mb = mobidedrm.MobiBook(infile) else: - file(outfile, 'wb').write(unlocked_file) - return 0 - - # now try alternate kindle.info files - if kInfoFiles: - for infoFile in kInfoFiles: - kindleDatabase = None - try: - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title, infoFile) - unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except DrmException, e: - DecodeErrorString += "Error trying " + infoFile + " K4 info: " + str(e) + "\n" - pass - except mobidedrm.DrmException, e: - DecodeErrorString += "Error trying " + infoFile + " K4 info: " + str(e) + "\n" - pass - else: - file(outfile, 'wb').write(unlocked_file) - return 0 - - # Lastly, try from the pid list - pids = pidnums.split(',') - for pid in pids: - try: - print 'Trying: "'+ pid + '"' - unlocked_file = mobidedrm.getUnencryptedBook(infile, pid) - except mobidedrm.DrmException: - pass - else: - file(outfile, 'wb').write(unlocked_file) - return 0 + tempdir = tempfile.mkdtemp() + mb = topazextract.TopazBook(infile, tempdir) - # we could not unencrypt book - print DecodeErrorString - print "Error: Could Not Unencrypt Book" - return 1 + title = mb.getBookTitle() + print "Processing Book: ", title + # build pid list + md1, md2 = mb.getPIDMetaInfo() + pidlst = kgenpids.getPidList(md1, md2, k4, pids, serials, kInfoFiles) + + try: + if mobi: + unlocked_file = mb.processBook(pidlst) + else: + mb.processBook(pidlst) + + except mobidedrm.DrmException, e: + print " ... not suceessful " + str(e) + "\n" + return 1 + except topazextract.TpzDRMError, e: + print str(e) + print " Creating DeBug Full Zip Archive of Book" + zipname = os.path.join(outdir, bookname + '_debug' + '.zip') + myzip = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + zipUpDir(myzip, tempdir, '') + myzip.close() + return 1 + + if mobi: + outfile = os.path.join(outdir,bookname + '_nodrm' + '.azw') + file(outfile, 'wb').write(unlocked_file) + return 0 + + # topaz: build up zip archives of results + print " Creating HTML ZIP Archive" + zipname = os.path.join(outdir, bookname + '_nodrm' + '.zip') + myzip1 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + myzip1.write(os.path.join(tempdir,'book.html'),'book.html') + myzip1.write(os.path.join(tempdir,'book.opf'),'book.opf') + if os.path.isfile(os.path.join(tempdir,'cover.jpg')): + myzip1.write(os.path.join(tempdir,'cover.jpg'),'cover.jpg') + myzip1.write(os.path.join(tempdir,'style.css'),'style.css') + zipUpDir(myzip1, tempdir, 'img') + myzip1.close() + + print " Creating SVG ZIP Archive" + zipname = os.path.join(outdir, bookname + '_SVG' + '.zip') + myzip2 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + myzip2.write(os.path.join(tempdir,'index_svg.xhtml'),'index_svg.xhtml') + zipUpDir(myzip2, tempdir, 'svg') + zipUpDir(myzip2, tempdir, 'img') + myzip2.close() + + print " Creating XML ZIP Archive" + zipname = os.path.join(outdir, bookname + '_XML' + '.zip') + myzip3 = zipfile.ZipFile(zipname,'w',zipfile.ZIP_DEFLATED, False) + targetdir = os.path.join(tempdir,'xml') + zipUpDir(myzip3, targetdir, '') + zipUpDir(myzip3, tempdir, 'img') + myzip3.close() + + shutil.rmtree(tempdir) + return 0 if __name__ == '__main__': sys.stdout=Unbuffered(sys.stdout) sys.exit(main()) - if not __name__ == "__main__" and inCalibre: from calibre.customize import FileTypePlugin class K4DeDRM(FileTypePlugin): name = 'K4PC, K4Mac, Mobi DeDRM' # Name of the plugin - description = 'Removes DRM from K4PC, K4Mac, and Mobi files. \ + description = 'Removes DRM from K4PC and Mac, Kindle Mobi and Topaz files. \ Provided by the work of many including DiapDealer, SomeUpdates, IHeartCabbages, CMBDTC, Skindle, DarkReverser, ApprenticeAlf, etc.' supported_platforms = ['osx', 'windows', 'linux'] # Platforms this plugin will run on author = 'DiapDealer, SomeUpdates' # The author of this plugin - version = (0, 1, 4) # The version number of this plugin - file_types = set(['prc','mobi','azw']) # The file types that this plugin will be applied to + version = (0, 1, 7) # The version number of this plugin + file_types = set(['prc','mobi','azw','azw1','tpz']) # The file types that this plugin will be applied to on_import = True # Run this plugin during the import - priority = 200 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm + priority = 210 # run this plugin before mobidedrm, k4pcdedrm, k4dedrm def run(self, path_to_ebook): from calibre.gui2 import is_ok_to_use_qt from PyQt4.Qt import QMessageBox - - # Head Topaz files off at the pass and warn the user that they will NOT - # be decrypted. Changes the file extension from .azw or .prc to .tpz so - # Calibre can at least read the metadata properly and the user can find - # them by sorting on 'format'. - with open(path_to_ebook, 'rb') as f: - raw = f.read() - if raw.startswith('TPZ'): - tf = self.temporary_file('.tpz') - if is_ok_to_use_qt(): - d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "%s is a Topaz book. It will NOT be decrypted!" % path_to_ebook) - d.show() - d.raise_() - d.exec_() - tf.write(raw) - tf.close - return tf.name - - global kindleDatabase - global openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - if sys.platform.startswith('win'): - from k4pcutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 - if sys.platform.startswith('darwin'): - from k4mutils import openKindleInfo, CryptUnprotectData, GetUserName, GetVolumeSerialNumber, charMap1, charMap2, charMap3, charMap4 + from calibre.ptempfile import PersistentTemporaryDirectory + + import kgenpids + import zlib + import zipfile + import topazextract import mobidedrm + k4 = True + pids = [] + serials = [] + kInfoFiles = [] + # Get supplied list of PIDs to try from plugin customization. - pidnums = self.site_customization - + customvalues = self.site_customization.split(',') + for customvalue in customvalues: + customvalue = str(customvalue) + customvalue = customvalue.strip() + if len(customvalue) == 10 or len(customvalue) == 8: + pids.append(customvalue) + else : + if len(customvalue) == 16 and customvalue[0] == 'B': + serials.append(customvalue) + else: + print "%s is not a valid Kindle serial number or PID." % str(customvalue) + # Load any kindle info files (*.info) included Calibre's config directory. - kInfoFiles = [] try: # Find Calibre's configuration directory. confpath = os.path.split(os.path.split(self.plugin_path)[0])[0] @@ -531,70 +266,68 @@ if not __name__ == "__main__" and inCalibre: print 'K4MobiDeDRM: Error reading kindle info files from config directory.' pass - # first try with book specifc pid from K4PC or K4M + + mobi = True + magic3 = file(path_to_ebook,'rb').read(3) + if magic3 == 'TPZ': + mobi = False + + bookname = os.path.splitext(os.path.basename(path_to_ebook))[0] + + if mobi: + mb = mobidedrm.MobiBook(path_to_ebook) + else: + tempdir = PersistentTemporaryDirectory() + mb = topazextract.TopazBook(path_to_ebook, tempdir) + + title = mb.getBookTitle() + md1, md2 = mb.getPIDMetaInfo() + pidlst = kgenpids.getPidList(md1, md2, k4, pids, serials, kInfoFiles) + try: - kindleDatabase = None - ex = MobiPeek(path_to_ebook) - if ex.isNotEncrypted(): - return path_to_ebook - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title) - unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook,pid) - except DrmException: - pass + if mobi: + unlocked_file = mb.processBook(pidlst) + else: + mb.processBook(pidlst) + except mobidedrm.DrmException: - pass - else: - of = self.temporary_file('.mobi') + #if you reached here then no luck raise and exception + if is_ok_to_use_qt(): + d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "Error decoding: %s\n" % path_to_ebook) + d.show() + d.raise_() + d.exec_() + raise Exception("K4MobiDeDRM plugin could not decode the file") + return "" + except topazextract.TpzDRMError: + #if you reached here then no luck raise and exception + if is_ok_to_use_qt(): + d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "Error decoding: %s\n" % path_to_ebook) + d.show() + d.raise_() + d.exec_() + raise Exception("K4MobiDeDRM plugin could not decode the file") + return "" + + print "Success!" + if mobi: + of = self.temporary_file(bookname+'.mobi') of.write(unlocked_file) of.close() return of.name - - # Now try alternate kindle info files - if kInfoFiles: - for infoFile in kInfoFiles: - kindleDatabase = None - try: - title = ex.getBookTitle() - exth = ex.getexthData() - if exth=='': - raise DrmException("Not a Kindle Mobipocket file") - pid = getK4Pids(exth, title, infoFile) - unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook,pid) - except DrmException: - pass - except mobidedrm.DrmException: - pass - else: - of = self.temporary_file('.mobi') - of.write(unlocked_file) - of.close() - return of.name - - # now try from the pid list - pids = pidnums.split(',') - for pid in pids: - try: - unlocked_file = mobidedrm.getUnencryptedBook(path_to_ebook, pid) - except mobidedrm.DrmException: - pass - else: - of = self.temporary_file('.mobi') - of.write(unlocked_file) - of.close() - return of.name - - #if you reached here then no luck raise and exception - if is_ok_to_use_qt(): - d = QMessageBox(QMessageBox.Warning, "K4MobiDeDRM Plugin", "Error decoding: %s\n" % path_to_ebook) - d.show() - d.raise_() - d.exec_() - raise Exception("K4MobiDeDRM plugin could not decode the file") - return "" + + # topaz: build up zip archives of results + print " Creating HTML ZIP Archive" + of = self.temporary_file(bookname + '.zip') + myzip = zipfile.ZipFile(of.name,'w',zipfile.ZIP_DEFLATED, False) + myzip.write(os.path.join(tempdir,'book.html'),'book.html') + myzip.write(os.path.join(tempdir,'book.opf'),'book.opf') + if os.path.isfile(os.path.join(tempdir,'cover.jpg')): + myzip.write(os.path.join(tempdir,'cover.jpg'),'cover.jpg') + myzip.write(os.path.join(tempdir,'style.css'),'style.css') + zipUpDir(myzip, tempdir, 'img') + myzip.close() + return of.name def customization_help(self, gui=False): - return 'Enter each 10 character PID separated by a comma (no spaces).' + return 'Enter 10 character PIDs and/or Kindle serial numbers, separated by commas.' diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py b/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py index 33771eb..4aa14dd 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4mutils.py @@ -1,158 +1,13 @@ # standlone set of Mac OSX specific routines needed for K4DeDRM from __future__ import with_statement - import sys import os - -#Exception Handling -class K4MDrmException(Exception): - pass - -import signal -import threading import subprocess -from subprocess import Popen, PIPE, STDOUT - -# **heavily** chopped up and modfied version of asyncproc.py -# to make it actually work on Windows as well as Mac/Linux -# For the original see: -# "http://www.lysator.liu.se/~bellman/download/" -# author is "Thomas Bellman " -# available under GPL version 3 or Later - -# create an asynchronous subprocess whose output can be collected in -# a non-blocking manner - -# What a mess! Have to use threads just to get non-blocking io -# in a cross-platform manner - -# luckily all thread use is hidden within this class - -class Process(object): - def __init__(self, *params, **kwparams): - if len(params) <= 3: - kwparams.setdefault('stdin', subprocess.PIPE) - if len(params) <= 4: - kwparams.setdefault('stdout', subprocess.PIPE) - if len(params) <= 5: - kwparams.setdefault('stderr', subprocess.PIPE) - self.__pending_input = [] - self.__collected_outdata = [] - self.__collected_errdata = [] - self.__exitstatus = None - self.__lock = threading.Lock() - self.__inputsem = threading.Semaphore(0) - self.__quit = False - - self.__process = subprocess.Popen(*params, **kwparams) - if self.__process.stdin: - self.__stdin_thread = threading.Thread( - name="stdin-thread", - target=self.__feeder, args=(self.__pending_input, - self.__process.stdin)) - self.__stdin_thread.setDaemon(True) - self.__stdin_thread.start() - - if self.__process.stdout: - self.__stdout_thread = threading.Thread( - name="stdout-thread", - target=self.__reader, args=(self.__collected_outdata, - self.__process.stdout)) - self.__stdout_thread.setDaemon(True) - self.__stdout_thread.start() - - if self.__process.stderr: - self.__stderr_thread = threading.Thread( - name="stderr-thread", - target=self.__reader, args=(self.__collected_errdata, - self.__process.stderr)) - self.__stderr_thread.setDaemon(True) - self.__stderr_thread.start() - - def pid(self): - return self.__process.pid - - def kill(self, signal): - self.__process.send_signal(signal) - - # check on subprocess (pass in 'nowait') to act like poll - def wait(self, flag): - if flag.lower() == 'nowait': - rc = self.__process.poll() - else: - rc = self.__process.wait() - if rc != None: - if self.__process.stdin: - self.closeinput() - if self.__process.stdout: - self.__stdout_thread.join() - if self.__process.stderr: - self.__stderr_thread.join() - return self.__process.returncode - - def terminate(self): - if self.__process.stdin: - self.closeinput() - self.__process.terminate() - - # thread gets data from subprocess stdout - def __reader(self, collector, source): - while True: - data = os.read(source.fileno(), 65536) - self.__lock.acquire() - collector.append(data) - self.__lock.release() - if data == "": - source.close() - break - return - - # thread feeds data to subprocess stdin - def __feeder(self, pending, drain): - while True: - self.__inputsem.acquire() - self.__lock.acquire() - if not pending and self.__quit: - drain.close() - self.__lock.release() - break - data = pending.pop(0) - self.__lock.release() - drain.write(data) - # non-blocking read of data from subprocess stdout - def read(self): - self.__lock.acquire() - outdata = "".join(self.__collected_outdata) - del self.__collected_outdata[:] - self.__lock.release() - return outdata - - # non-blocking read of data from subprocess stderr - def readerr(self): - self.__lock.acquire() - errdata = "".join(self.__collected_errdata) - del self.__collected_errdata[:] - self.__lock.release() - return errdata - - # non-blocking write to stdin of subprocess - def write(self, data): - if self.__process.stdin is None: - raise ValueError("Writing to process with stdin not a pipe") - self.__lock.acquire() - self.__pending_input.append(data) - self.__inputsem.release() - self.__lock.release() - - # close stdinput of subprocess - def closeinput(self): - self.__lock.acquire() - self.__quit = True - self.__inputsem.release() - self.__lock.release() +class K4MDrmException(Exception): + pass # interface to needed routines in openssl's libcrypto @@ -236,6 +91,15 @@ LibCrypto = _load_crypto() # Utility Routines # + +# Various character maps used to decrypt books. Probably supposed to act as obfuscation +charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" +charMap2 = "ZB0bYyc1xDdW2wEV3Ff7KkPpL8UuGA4gz-Tme9Nn_tHh5SvXCsIiR6rJjQaqlOoM" +charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" + + + # uses a sub process to get the Hard Drive Serial Number using ioreg # returns with the serial number of drive whose BSD Name is "disk0" def GetVolumeSerialNumber(): @@ -244,10 +108,9 @@ def GetVolumeSerialNumber(): return sernum cmdline = '/usr/sbin/ioreg -l -S -w 0 -r -c AppleAHCIDiskDriver' cmdline = cmdline.encode(sys.getfilesystemencoding()) - p = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=False) - poll = p.wait('wait') - results = p.read() - reslst = results.split('\n') + p = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p.communicate() + reslst = out1.split('\n') cnt = len(reslst) bsdname = None sernum = None @@ -274,11 +137,6 @@ def GetUserName(): username = os.getenv('USER') return username -# Various character maps used to decrypt books. Probably supposed to act as obfuscation -charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" -charMap2 = "ZB0bYyc1xDdW2wEV3Ff7KkPpL8UuGA4gz-Tme9Nn_tHh5SvXCsIiR6rJjQaqlOoM" -charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" def encode(data, map): result = "" @@ -309,16 +167,16 @@ def CryptUnprotectData(encryptedData): cleartext = crp.decrypt(encryptedData) return cleartext + # Locate and open the .kindle-info file def openKindleInfo(kInfoFile=None): if kInfoFile == None: home = os.getenv('HOME') cmdline = 'find "' + home + '/Library/Application Support" -name ".kindle-info"' cmdline = cmdline.encode(sys.getfilesystemencoding()) - p1 = Process(cmdline, shell=True, bufsize=1, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=False) - poll = p1.wait('wait') - results = p1.read() - reslst = results.split('\n') + p1 = subprocess.Popen(cmdline, shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) + out1, out2 = p1.communicate() + reslst = out1.split('\n') kinfopath = 'NONE' cnt = len(reslst) for j in xrange(cnt): diff --git a/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py b/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py index 337b992..3f95660 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/k4pcutils.py @@ -19,17 +19,12 @@ advapi32 = windll.advapi32 crypt32 = windll.crypt32 -# # Various character maps used to decrypt books. Probably supposed to act as obfuscation -# charMap1 = "n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M" charMap2 = "AaZzB0bYyCc1XxDdW2wEeVv3FfUuG4g-TtHh5SsIiR6rJjQq7KkPpL8lOoMm9Nn_" charMap3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" charMap4 = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789" -# -# Exceptions for all the problems that might happen during the script -# class DrmException(Exception): pass diff --git a/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py b/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py index 183432c..cc83224 100644 --- a/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py +++ b/Calibre_Plugins/k4mobidedrm_plugin/mobidedrm.py @@ -24,7 +24,7 @@ # 0.14 - Working out when the extra data flags are present has been problematic # Versions 7 through 9 have tried to tweak the conditions, but have been # only partially successful. Closer examination of lots of sample -# files reveals that a confusin has arisen because trailing data entries +# files reveals that a confusion has arisen because trailing data entries # are not encrypted, but it turns out that the multibyte entries # in utf8 file are encrypted. (Although neither kind gets compressed.) # This knowledge leads to a simplification of the test for the @@ -39,13 +39,13 @@ # Removed the disabled Calibre plug-in code # Permit use of 8-digit PIDs # 0.19 - It seems that multibyte entries aren't encrypted in a v6 file either. -# 0.20 - Corretion: It seems that multibyte entries are encrypted in a v6 file. +# 0.20 - Correction: It seems that multibyte entries are encrypted in a v6 file. +# 0.21 - Added support for multiple pids +# 0.22 - revised structure to hold MobiBook as a class to allow an extended interface -__version__ = '0.20' +__version__ = '0.22' import sys -import struct -import binascii class Unbuffered: def __init__(self, stream): @@ -55,10 +55,19 @@ class Unbuffered: self.stream.flush() def __getattr__(self, attr): return getattr(self.stream, attr) +sys.stdout=Unbuffered(sys.stdout) + +import struct +import binascii class DrmException(Exception): pass + +# +# MobiBook Utility Routines +# + # Implementation of Pukall Cipher 1 def PC1(key, src, decryption=True): sum1 = 0; @@ -70,7 +79,6 @@ def PC1(key, src, decryption=True): wkey = [] for i in xrange(8): wkey.append(ord(key[i*2])<<8 | ord(key[i*2+1])) - dst = "" for i in xrange(len(src)): temp1 = 0; @@ -131,7 +139,9 @@ def getSizeOfTrailingDataEntries(ptr, size, flags): num += (ord(ptr[size - num - 1]) & 0x3) + 1 return num -class DrmStripper: + + +class MobiBook: def loadSection(self, section): if (section + 1 == self.num_sections): endoff = len(self.data_file) @@ -140,6 +150,78 @@ class DrmStripper: off = self.sections[section][0] return self.data_file[off:endoff] + def __init__(self, infile): + # initial sanity check on file + self.data_file = file(infile, 'rb').read() + self.header = self.data_file[0:78] + if self.header[0x3C:0x3C+8] != 'BOOKMOBI': + raise DrmException("invalid file format") + + # build up section offset and flag info + self.num_sections, = struct.unpack('>H', self.header[76:78]) + self.sections = [] + for i in xrange(self.num_sections): + offset, a1,a2,a3,a4 = struct.unpack('>LBBBB', self.data_file[78+i*8:78+i*8+8]) + flags, val = a1, a2<<16|a3<<8|a4 + self.sections.append( (offset, flags, val) ) + + # parse information from section 0 + self.sect = self.loadSection(0) + self.records, = struct.unpack('>H', self.sect[0x8:0x8+2]) + self.mobi_length, = struct.unpack('>L',self.sect[0x14:0x18]) + self.mobi_version, = struct.unpack('>L',self.sect[0x68:0x6C]) + print "MOBI header version = %d, length = %d" %(self.mobi_version, self.mobi_length) + self.extra_data_flags = 0 + if (self.mobi_length >= 0xE4) and (self.mobi_version >= 5): + self.extra_data_flags, = struct.unpack('>H', self.sect[0xF2:0xF4]) + print "Extra Data Flags = %d" % self.extra_data_flags + if self.mobi_version < 7: + # multibyte utf8 data is included in the encryption for mobi_version 6 and below + # so clear that byte so that we leave it to be decrypted. + self.extra_data_flags &= 0xFFFE + + # if exth region exists parse it for metadata array + self.meta_array = {} + exth_flag, = struct.unpack('>L', self.sect[0x80:0x84]) + exth = '' + if exth_flag & 0x40: + exth = self.sect[16 + self.mobi_length:] + nitems, = struct.unpack('>I', exth[8:12]) + pos = 12 + for i in xrange(nitems): + type, size = struct.unpack('>II', exth[pos: pos + 8]) + content = exth[pos + 8: pos + size] + self.meta_array[type] = content + pos += size + + def getBookTitle(self): + title = '' + if 503 in self.meta_array: + title = self.meta_array[503] + else : + toff, tlen = struct.unpack('>II', self.sect[0x54:0x5c]) + tend = toff + tlen + title = self.sect[toff:tend] + if title == '': + title = self.header[:32] + title = title.split("\0")[0] + return title + + def getPIDMetaInfo(self): + rec209 = None + token = None + if 209 in self.meta_array: + rec209 = self.meta_array[209] + data = rec209 + # Parse the 209 data to find the the exth record with the token data. + # The last character of the 209 data points to the record with the token. + # Always 208 from my experience, but I'll leave the logic in case that changes. + for i in xrange(len(data)): + if ord(data[i]) != 0: + if self.meta_array[ord(data[i])] != None: + token = self.meta_array[ord(data[i])] + return rec209, token + def patch(self, off, new): self.data_file = self.data_file[:off] + new + self.data_file[off+len(new):] @@ -152,134 +234,122 @@ class DrmStripper: assert off + in_off + len(new) <= endoff self.patch(off + in_off, new) - def parseDRM(self, data, count, pid): - pid = pid.ljust(16,'\0') - keyvec1 = "\x72\x38\x33\xB0\xB4\xF2\xE3\xCA\xDF\x09\x01\xD6\xE2\xE0\x3F\x96" - temp_key = PC1(keyvec1, pid, False) - temp_key_sum = sum(map(ord,temp_key)) & 0xff + def parseDRM(self, data, count, pidlist): found_key = None - for i in xrange(count): - verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) - cookie = PC1(temp_key, cookie) - ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) - if verification == ver and cksum == temp_key_sum and (flags & 0x1F) == 1: - found_key = finalkey + keyvec1 = "\x72\x38\x33\xB0\xB4\xF2\xE3\xCA\xDF\x09\x01\xD6\xE2\xE0\x3F\x96" + for pid in pidlist: + bigpid = pid.ljust(16,'\0') + temp_key = PC1(keyvec1, bigpid, False) + temp_key_sum = sum(map(ord,temp_key)) & 0xff + found_key = None + for i in xrange(count): + verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) + if cksum == temp_key_sum: + cookie = PC1(temp_key, cookie) + ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) + if verification == ver and (flags & 0x1F) == 1: + found_key = finalkey + break + if found_key != None: break if not found_key: # Then try the default encoding that doesn't require a PID + pid = "00000000" temp_key = keyvec1 temp_key_sum = sum(map(ord,temp_key)) & 0xff for i in xrange(count): verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) - cookie = PC1(temp_key, cookie) - ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) - if verification == ver and cksum == temp_key_sum: - found_key = finalkey - break - return found_key - - def __init__(self, data_file, pid): - if len(pid)==10: - if checksumPid(pid[0:-2]) != pid: - raise DrmException("invalid PID checksum") - pid = pid[0:-2] - elif len(pid)==8: - print "PID without checksum given. With checksum PID is "+checksumPid(pid) - else: - raise DrmException("Invalid PID length") - - self.data_file = data_file - header = data_file[0:72] - if header[0x3C:0x3C+8] != 'BOOKMOBI': - raise DrmException("invalid file format") - self.num_sections, = struct.unpack('>H', data_file[76:78]) + if cksum == temp_key_sum: + cookie = PC1(temp_key, cookie) + ver,flags,finalkey,expiry,expiry2 = struct.unpack('>LL16sLL', cookie) + if verification == ver: + found_key = finalkey + break + return [found_key,pid] - self.sections = [] - for i in xrange(self.num_sections): - offset, a1,a2,a3,a4 = struct.unpack('>LBBBB', data_file[78+i*8:78+i*8+8]) - flags, val = a1, a2<<16|a3<<8|a4 - self.sections.append( (offset, flags, val) ) - - sect = self.loadSection(0) - records, = struct.unpack('>H', sect[0x8:0x8+2]) - mobi_length, = struct.unpack('>L',sect[0x14:0x18]) - mobi_version, = struct.unpack('>L',sect[0x68:0x6C]) - extra_data_flags = 0 - print "MOBI header version = %d, length = %d" %(mobi_version, mobi_length) - if (mobi_length >= 0xE4) and (mobi_version >= 5): - extra_data_flags, = struct.unpack('>H', sect[0xF2:0xF4]) - print "Extra Data Flags = %d" %extra_data_flags - if mobi_version < 7: - # multibyte utf8 data is included in the encryption for mobi_version 6 and below - # so clear that byte so that we leave it to be decrypted. - extra_data_flags &= 0xFFFE - - crypto_type, = struct.unpack('>H', sect[0xC:0xC+2]) + def processBook(self, pidlist): + crypto_type, = struct.unpack('>H', self.sect[0xC:0xC+2]) if crypto_type == 0: print "This book is not encrypted." + return self.data_file + if crypto_type == 1: + raise DrmException("Cannot decode Mobipocket encryption type 1") + if crypto_type != 2: + raise DrmException("Cannot decode unknown Mobipocket encryption type %d" % crypto_type) + + goodpids = [] + for pid in pidlist: + if len(pid)==10: + if checksumPid(pid[0:-2]) != pid: + print "Warning: PID " + pid + " has incorrect checksum, should have been "+checksumPid(pid[0:-2]) + goodpids.append(pid[0:-2]) + elif len(pid)==8: + goodpids.append(pid) + + # calculate the keys + drm_ptr, drm_count, drm_size, drm_flags = struct.unpack('>LLLL', self.sect[0xA8:0xA8+16]) + if drm_count == 0: + raise DrmException("Not yet initialised with PID. Must be opened with Mobipocket Reader first.") + found_key, pid = self.parseDRM(self.sect[drm_ptr:drm_ptr+drm_size], drm_count, goodpids) + if not found_key: + raise DrmException("No key found. Most likely the correct PID has not been given.") + + if pid=="00000000": + print "File has default encryption, no specific PID." else: - if crypto_type == 1: - raise DrmException("cannot decode Mobipocket encryption type 1") - if crypto_type != 2: - raise DrmException("unknown encryption type: %d" % crypto_type) - - # calculate the keys - drm_ptr, drm_count, drm_size, drm_flags = struct.unpack('>LLLL', sect[0xA8:0xA8+16]) - if drm_count == 0: - raise DrmException("no PIDs found in this file") - found_key = self.parseDRM(sect[drm_ptr:drm_ptr+drm_size], drm_count, pid) - if not found_key: - raise DrmException("no key found. maybe the PID is incorrect") - - # kill the drm keys - self.patchSection(0, "\0" * drm_size, drm_ptr) - # kill the drm pointers - self.patchSection(0, "\xff" * 4 + "\0" * 12, 0xA8) - # clear the crypto type - self.patchSection(0, "\0" * 2, 0xC) - - # decrypt sections - print "Decrypting. Please wait . . .", - new_data = self.data_file[:self.sections[1][0]] - for i in xrange(1, records+1): - data = self.loadSection(i) - extra_size = getSizeOfTrailingDataEntries(data, len(data), extra_data_flags) - if i%100 == 0: - print ".", - # print "record %d, extra_size %d" %(i,extra_size) - new_data += PC1(found_key, data[0:len(data) - extra_size]) - if extra_size > 0: - new_data += data[-extra_size:] - #self.patchSection(i, PC1(found_key, data[0:len(data) - extra_size])) - if self.num_sections > records+1: - new_data += self.data_file[self.sections[records+1][0]:] - self.data_file = new_data - print "done" - - def getResult(self): + print "File is encoded with PID "+checksumPid(pid)+"." + + # kill the drm keys + self.patchSection(0, "\0" * drm_size, drm_ptr) + # kill the drm pointers + self.patchSection(0, "\xff" * 4 + "\0" * 12, 0xA8) + # clear the crypto type + self.patchSection(0, "\0" * 2, 0xC) + + # decrypt sections + print "Decrypting. Please wait . . .", + new_data = self.data_file[:self.sections[1][0]] + for i in xrange(1, self.records+1): + data = self.loadSection(i) + extra_size = getSizeOfTrailingDataEntries(data, len(data), self.extra_data_flags) + if i%100 == 0: + print ".", + # print "record %d, extra_size %d" %(i,extra_size) + new_data += PC1(found_key, data[0:len(data) - extra_size]) + if extra_size > 0: + new_data += data[-extra_size:] + if self.num_sections > self.records+1: + new_data += self.data_file[self.sections[self.records+1][0]:] + self.data_file = new_data + print "done" return self.data_file def getUnencryptedBook(infile,pid): - sys.stdout=Unbuffered(sys.stdout) - data_file = file(infile, 'rb').read() - strippedFile = DrmStripper(data_file, pid) - return strippedFile.getResult() + if not os.path.isfile(infile): + raise DrmException('Input File Not Found') + book = MobiBook(infile) + return book.processBook([pid]) + +def getUnencryptedBookWithList(infile,pidlist): + if not os.path.isfile(infile): + raise DrmException('Input File Not Found') + book = MobiBook(infile) + return book.processBook(pidlist) def main(argv=sys.argv): - sys.stdout=Unbuffered(sys.stdout) print ('MobiDeDrm v%(__version__)s. ' 'Copyright 2008-2010 The Dark Reverser.' % globals()) if len(argv)<4: print "Removes protection from Mobipocket books" print "Usage:" - print " %s " % sys.argv[0] + print " %s " % sys.argv[0] return 1 else: infile = argv[1] outfile = argv[2] - pid = argv[3] + pidlist = argv[3].split(',') try: - stripped_file = getUnencryptedBook(infile, pid) + stripped_file = getUnencryptedBookWithList(infile, pidlist) file(outfile, 'wb').write(stripped_file) except DrmException, e: print "Error: %s" % e diff --git a/DeDRM_Macintosh_Application/DeDRM.app.txt b/DeDRM_Macintosh_Application/DeDRM.app.txt index 63a9790..60d2f86 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app.txt +++ b/DeDRM_Macintosh_Application/DeDRM.app.txt @@ -1,6 +1,6 @@ property prefsFileName : "com.apprenticealf.dedrm.plist" property prefsFolderName : "com.apprenticealf.dedrm" -property handledExtensions : {"epub", "pdf", "prc", "azw", "mobi", "pdb", "der", "b64"} +property handledExtensions : {"epub", "pdf", "prc", "azw", "azw1", "mobi", "pdb", "der", "b64"} global eReaderTool global MobipocketTool @@ -15,6 +15,7 @@ global ProgressApp global PIDs global bnKeys global KindleInfoList +global KindleSerialList global AdeptKeyList global ErrorList @@ -73,16 +74,12 @@ on unlockmobifile(encryptedFile) set TOPAZ to read file encryptedFile from 1 for 4 end try set ErrorCount to ErrorCount + 1 - if TOPAZ is "TPZ0" then - set ErrorList to ErrorList & encryptedFile & " is a TOPAZ file. - -" - else - set ErrorList to ErrorList & encryptedFile & " is not a Mobipocket file. + if TOPAZ is not "TPZ0" then + set ErrorList to ErrorList & encryptedFile & " is neither a Mobipocket nor a TOPAZ file. " + return end if - return end if set encryptedFilePath to POSIX path of file encryptedFile tell application "Finder" @@ -95,14 +92,16 @@ on unlockmobifile(encryptedFile) set fileExtension to "." & the last text item of fileName set fileName to (text items 1 through -2 of fileName) as string end if - set unlockedFilePath to POSIX path of file (parent_folder & fileName & "_dedrmed" & fileExtension) + set unlockedFileParentFolderPath to POSIX path of file parent_folder set shellcommand to "python " & (quoted form of MobipocketTool) repeat with KindleInfoPath in KindleInfoList set shellcommand to shellcommand & " -k " & quoted form of KindleInfoPath end repeat + set Serialstring to GetSerialstring() + if Serialstring is not "" then set shellcommand to shellcommand & " -s " & Serialstring set PIDstring to GetPIDstring() if PIDstring is not "" then set shellcommand to shellcommand & " -p " & PIDstring - set shellcommand to shellcommand & " " & (quoted form of encryptedFilePath) & " " & (quoted form of unlockedFilePath) + set shellcommand to shellcommand & " " & (quoted form of encryptedFilePath) & " " & (quoted form of unlockedFileParentFolderPath) --display dialog "shellcommand: " default answer shellcommand buttons {"OK"} default button 1 giving up after 10 try set shellresult to do shell script shellcommand @@ -450,7 +449,7 @@ on handlefile(droppedFile) set fileExtension to the last text item of fileName set fileName to (text items 1 through -2 of fileName) as string end if - if fileExtension is "prc" or fileExtension is "mobi" or fileExtension is "azw" then + if fileExtension is "prc" or fileExtension is "mobi" or fileExtension is "azw" or fileExtension is "azw1" then set completedebooks to completedebooks + 1 IncProgress(fileName, completedebooks) unlockmobifile(droppedFile as text) @@ -505,6 +504,18 @@ on countfile(droppedFile) end if end countfile +on GetSerialstring() + set Serialstring to "" + repeat with Serial in KindleSerialList + if Serialstring is "" then + set Serialstring to Serial + else + set Serialstring to Serialstring & "," & Serial + end if + end repeat + return Serialstring +end GetSerialstring + on GetPIDstring() set PIDstring to "" repeat with PID in PIDs @@ -580,7 +591,7 @@ on GetPIDs() Enter any additional Mobipocket PIDs for your Mobipocket books one at a time:" set FinishedButton to "No More" end if - set dialogresult to (display dialog DialogPrompt default answer "" buttons {"Delete All", "Add", FinishedButton} with title "DeDRM Applescript 2/5" default button 2) + set dialogresult to (display dialog DialogPrompt default answer "" buttons {"Delete All", "Add", FinishedButton} with title "DeDRM Applescript 2/6" default button 2) if button returned of dialogresult is "Add" then set PID to text returned of dialogresult set PIDlength to length of PID @@ -604,6 +615,42 @@ Enter any additional Mobipocket PIDs for your Mobipocket books one at a time:" end repeat end GetPIDs +on GetSerials() + repeat + set Serialstring to GetSerialstring() + if Serialstring is "" then + set DialogPrompt to "Enter any Kindle Serial Numbers one at a time:" + set FinishedButton to "None" + else + set DialogPrompt to "Current Kindle Serial Numbers: " & Serialstring & ". + +Enter any additional Kindle Serial Numbers one at a time:" + set FinishedButton to "No More" + end if + set dialogresult to (display dialog DialogPrompt default answer "" buttons {"Delete All", "Add", FinishedButton} with title "DeDRM Applescript 3/6" default button 2) + if button returned of dialogresult is "Add" then + set Serial to text returned of dialogresult + set Seriallength to length of Serial + if Seriallength is 16 and (first character of Serial) is "B" then + set KindleSerialList to KindleSerialList & Serial + else + display dialog "Kindle Serial Numbers are 16 characters long and start with B." buttons {"OK"} default button 1 with title "DeDRM Applescript" with icon caution + end if + else if button returned of dialogresult is "Delete All" then + if Serialstring is not "" then + try + set dialogresult to (display dialog "Are you sure you want to delete all stored Kindle Serial Numbers?" buttons {"Cancel", "Delete"} default button 1 with title "DeDRM Applescript") + end try + if button returned of dialogresult is "Delete" then + set Serialstring to {} + end if + end if + else + exit repeat + end if + end repeat +end GetSerials + on GetKindleInfoFiles() repeat set KInfostring to GetKindleInfostring() @@ -647,7 +694,7 @@ on GetIneptPDF(always) try tell me to activate if (always) then - set promptstring to "DeDRM Applescript 5/5 + set promptstring to "DeDRM Applescript 6/6 " else set promptstring to "DeDRM Applescript @@ -688,7 +735,7 @@ Please enter any additional " set DialogPrompt to DialogPrompt & "eReader/Barnes & Noble Name,Number key pairs one at a time. If you're only decoding eReader files, the last 8 digits of the Number will do. The full 15 or 16 are only needed for Barnes & Noble ePubs. Only the last eight will be stored or displayed. Please separate the name and number with a comma and click \"Add\". Or to add a an already generated .b64 file, just click \"Add\" with nothing in the text field." set dialogtitle to "DeDRM Applescript" if (running) then - set dialogtitle to dialogtitle & " 3/5" + set dialogtitle to dialogtitle & " 4/6" end if set dialogresult to (display dialog DialogPrompt default answer bnKeyText buttons {"Delete All", "Add", FinishedButton} with title dialogtitle default button 2) if button returned of dialogresult is "Add" then @@ -776,7 +823,7 @@ on GetAdeptKeyFiles() To add extra key files (.der), click the Add button." set FinishedButton to "No More" end if - set dialogresult to (display dialog DialogPrompt buttons {"Forget All", "Add", FinishedButton} with title "DeDRM Applescript 4/5" default button 2) + set dialogresult to (display dialog DialogPrompt buttons {"Forget All", "Add", FinishedButton} with title "DeDRM Applescript 5/6" default button 2) if button returned of dialogresult is "Add" then try set newFile to (choose file with prompt "Please select an Adept key file") as text @@ -957,12 +1004,19 @@ on ReadPrefs() set PIDs to {} set bnKeys to {} set KindleInfoList to {} + set KindleSerialList to {} set AdeptKeyList to {} if fileexists(POSIX path of file preferencesFilePath) then tell application "System Events" try set PIDs to value of property list item "PIDs" of property list file preferencesFilePath end try + try + set KindleSerialList to value of property list item "KindleSerials" of property list file preferencesFilePath + end try + try + set KindleInfoList to value of property list item "KindleInfoFiles" of property list file preferencesFilePath + end try try set bnKeys to value of property list item "bnKeys" of property list file preferencesFilePath end try @@ -995,6 +1049,8 @@ on WritePrefs() set the base_dict to make new property list item with properties {kind:record} set myPrefs to make new property list file with properties {contents:base_dict, name:preferencesFilePath} make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"PIDs", value:PIDs} + make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"KindleSerials", value:KindleSerialList} + make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"KindleInfoFiles", value:KindleInfoList} make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"bnKeys", value:bnKeys} make new property list item at end of property list items of contents of myPrefs with properties {kind:list, name:"AdeptKeys", value:AdeptKeyList} make new property list item at end of property list items of contents of myPrefs with properties {kind:string, name:"IneptPDF", value:AdobePDFTool} @@ -1047,13 +1103,13 @@ on run if GetTools() then display dialog "Drag&Drop encrypted ebooks onto this AppleScript's icon in the Finder to decode them after you have finished configuring it and it has quit. -Click the Continue button to enter any PIDs for Mobipocket/Kindle ebooks, to enter name/number key pairs for Barnes & Noble/eReader ebooks, and to select Barnes & Noble .b64 key files and Adobe Adept .der key files. +Click the Continue button to enter any PIDs for Mobipocket ebooks; serial numbers for Kindle ebooks; name,number key pairs for Barnes & Noble/eReader ebooks; to select extra Barnes & Noble .b64 key files; to select extra Adobe Adept .der key files; and to find th optional ineptpdf.pyw script. -***You do not need to enter any extra info if decoding ebooks downloaded to your installation of Kindle for Mac, or Adobe Digital Editions. If you do not have any PIDS, name/number keys or .b64 or .der files to add, just click the Cancel button.*** +***You do not need to enter any extra info if decoding ebooks downloaded to your installation of Kindle for Mac, or Adobe Digital Editions. If you do not have any PIDS; serial numbers; name,number keys, .b64 or .der files to add or want to decode PDF files, just click the Cancel button.*** Please only use to get access to your own books. Authors, publishers and ebook stores need to make money to produce more ebooks. Don't cheat them. -This AppleScript is by Apprentice Alf and uses python scripts produced by CMBDTC, IHeartCabbages, DarkReverser, DiapDealer, some_updates, ApprenticeAlf and others. +This AppleScript is by Apprentice Alf and uses python scripts produced by CMBDTC, IHeartCabbages, DarkReverser, DiapDealer, some_updates, Apprentice Alf and others. This AppleScript (but not necessarily the enclosed python scripts) is free and unencumbered software released into the public domain. @@ -1061,11 +1117,13 @@ Anyone is free to copy, modify, publish, use, compile, sell, or distribute this For more information, please refer to -" with title "DeDRM Applescript 1/5" buttons {"Cancel", "Continue"} default button 2 +" with title "DeDRM Applescript 1/6" buttons {"Cancel", "Continue"} default button 2 ReadPrefs() + GetAdeptKey(true) + GetPIDs() + GetSerials() GetKeys(true) - GetAdeptKey(true) GetAdeptKeyFiles() GetIneptPDF(true) --GetKindleInfoFiles() diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index 31358b6..46ca744 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist @@ -24,7 +24,7 @@ CFBundleExecutable droplet CFBundleGetInfoString - DeDRM 1.3, Copyright © 2010 by Apprentice Alf. + DeDRM 1.4, Copyright © 2010 by Apprentice Alf. CFBundleIconFile droplet CFBundleInfoDictionaryVersion @@ -34,11 +34,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3 - CFBundleSignature - dplt + 1.4 LSMinimumSystemVersion 10.5.0 + CFBundleSignature + dplt LSRequiresCarbon WindowState diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt index 86a117320cd2b056ddd0b2bcc7e7bd2ef7723616..1224e93d3708a1d602f7f90de3262fadb4f9fa7e 100644 GIT binary patch literal 203536 zcmeEv2b5Gr^KZum?xhFDfQkwuB1u3H6h%}r0+PXq;_kA*!m_*UE>TnzF-J^@0Zf1q zQH-dV6$1uTR4}2asF*QM_kF**y*mTSF8u%Ro%7E5&WGOK>7KsT)m7Eq)m7C!y>rV) zkLWfm)xK@}cJw3|W2#;hG0p^&93Pm$XFdVt^iK(<@Qr3U28kFS7mCQSS|O4~?U*So zD;QHgrm(1>ICo+}Wwtl61CceX7UL7+cQ~t^V6_=v#_A+l9oCuUvl2FuwPm@i6#td6 z0#?i_SRu*_P*%jo;JeZIJR09oy;77FvT{}-SPn1>SZI*M7)hoh%j$+mnzUo}JVqr& zqYKJnoP0s=xWHpo*JCBoH0fCM{$YBo!1 z16gZ>B(7T*9BPwbZK!VBB$(uTh5olj&4XAwgCwqLz{B?VpK2bQWCx=riBOqf?NGBr z^tWLhe9Z(n)-l04Qq4n>>=4w9piqb)4ejwL3RglCbvH;d zV0sAF17LoNehj0Z*q-fJkXKw#Iyo-}5_BI}FnDsF2k|3;=#Hl+>t&E+K=c-@H$eOl zeIG_Y#Dg_=bV**pR>;)rMg?2r^F0CUg{KcY#vsW6>nm7a0NWgW7e<@oxhMvfLCM6R zvRHjbfR4e_kM%c5GJuX1>{tN$Hu@%vzK!V<11cRo#?vQ;Gq`7O-??uHOn*EB*g%6M z17?t5g8*hz^mQ0*is>_>uyjn}G*6$C3QKzzPV*qXCJ+Ph3}!b7I5v~YAeQ-k~VEEmyd^xAQFPGBb*B$?Mv66_?r z_G$D<7=6m>w_`c6JeAX5a1O72La&~P=VUh0Aj!OXieRVU)sLf(!sz2zswWiE99dXA zrlhE_yn-eA$N9dmJOL6sMj73LPj z!0LNo!{QPTZXJOeg(sKg86+8SnELVo?!)MVF#51k2ntFoAeu3#y4^-2hu(QG9}t*4 zJeXe$k__?RkJd)-@#uY``&vrgqnZVH#;~ylNv6SZf{jCi??&&0(YvfcJ65NltgNIg zZmmu)`skZ_hX9PlQ^>{}BpCn`1e*W=YofQqXiY3EQ*+CT3ya6bAj0E)#shhqfQ-je z#3mXf86d?1>#m62irx&Px8gyRUox?@sGy=?bPUGysLFakZxW!1cuH8QL6QM9Nw7%( z^hUHgjNXW)KkiO`$>ib+7R3GOL7zpmnn0A|DP!dZNd^R#_6mS_J$fySUXNK&*&z?4 zZe@=u!MsLb%JEEQQw)*}7%WXw0p``{l`wiWma$BiJfK9TPnDovAy8BBOk>jxk_@OB z0!y8URz)v|(JEFCGkHZxMQ%|+UP;M>a=aA1Om9xdb2^)8kYwIGL$EXO{Y%k{Ve}H) z6>3QaiR{}i(%UofoXO5INHS9NLiBv}9FJZg0eYU2=cwjccxJJ)4H8ipuQd(WIc&B; zBKy)Bg;nZVc5d`ch(8#Xbup%}>J&`FKq73}xp?M8Pa8Ie@si3HR)*2aSa=GHOD9+O zH&_^Fyvih^r}1v|3~7e5t2D!X*?EGU2XN=J3k(uDBnH=zUC1tqo-+6otB?{p&BcOU zjEa}AOAQhr3PqD8q9@s9(Gvmw?Af+_dU;8~w1WKMy-pY&MYCc^^x3e>n8-s`LI=5= zU15-LQYT4qyE4J9q}6+FlFh|>U4bzM%9u1;L@n&iHGzkB7 zo`?$C=ObbCNR33~(c{F%$B2?o5GyXlGcS7Buz8Fh3%u%qQr8=Hz3(7&%IKjWdWh8y zA!<`9$|e_x=waf(MNAGwb^ME#M-N611krL(Ft9OSyU`=KHwvyk0lki_D=2Nc#@ z*=+_%Mx5_tw?|9D=uVb^x*YAiH8+J!lm=}f7qIfFx!i@T?ju&No6wzWd z8!aI+-j)^QMS?8?sKsoFL6Q;VJK0^)9fsYR738}GyBihnVfPv&89~0C-51>!M7P%{ z$oFLhc`3W!u%%f+UY20XNRS^$vIqVl$YV&5@2?WaI_yEV+#tya@~uI1YetZlX9fA8 z=$2@qVGmWkS&Kc)9x+HVg1jJz7GwnZk*px!97Z=+OF$moLd;u8RJ@HicrTtuBS^)g zSs}&%dMqo%HwMv-+X(SZME$$6LVQCsKe|4MZm3a+=TnQh?vrF(i&Q=&C86ln* zT^C);qj^;6I!dmknk(=;5nW^06ImgC(y%A9LVR@)UA>JEUqkQRg6Ao=(jdtQ@m0~> z=t>@4MZo7$awXMViRWqdj6o6$@!r@=JIC**qZ_V?Af*;x2$~3n9*gq&<^}elVZ8Z8&rXILnM(o>`f-43)oxH`2qf@psZp# z=F7J{)oH#wFNn@Vd49#Tik#?tBId=ETtp;z#aE+U-`ffHHVut6Nwx+%n;y_N$VlK# z1?AZF4UK3060H8%yT+dnLRy9upbWdeQYb1#*e{mSs{V3zmY5SpbK=>$+HDzo5&d|F zy=#!fluu#<{2p6tki?WvVtf2P`@kTHDWAmb_#s!SX9Uq18OonYL_dd;vx)K__-gw?gg;BL&xrCHl57KZayv))3D{3p?&3)= zj=A7XH=zI8Ed6JO(afFM(Xw~Jh0oa+21(3?CSdAD_N74*bD;_L^>Gn5=0a=MHab0sPS0@R8_$I%taUVleH$RD;=;F{3r%5k_%50rO*8B}&jpl3Q`u(r zeSkkTabdIPLQ{4?4*MQln8JRDCI|Ra#f2X{d7H83QAH3{WVkSy7%-iZX~c!EeYLg_ z?;jKFN8-XyN%j+Vt~<53aKMj(Y4@a`2qp~0>%kbe(&xa1| z$Y>J#D?n1khrc`@4#9B$J1UJz4Ex*j0VPo}OEVkbPfdJCdp;b(4$WZ}e3-~wR21M( z6(5`@a3^+HG$Dv4WcW}-EPxG%N6?K8``uSN8n%-t!C)a>##xdxm^1!2e5kb9WqGhA z%Y*S@G`=Q#3j2i#&bcrgR$5vIda~hMa%H&m^zX@ra?NuL*Pi}8*_=5yNwQHJC_vBEb_x z|9VMY4~DIsrGGJ`z7*?)9|Kj=&sCQ4xnY#Mb7m+mz=QfcX*g_y#DfuREZ>FiYB&tG zv_~1i^7(Fjcf)t{JQ%@pc>}(O;SD?wMzP%Jv>-Yy!-G9M4@R(2(I~!W5RJ<4U{BA3 z;t zr0B#TIx)k8lZgDMQgRCM09I#W6>KGZ-vlRXF>jRQjW8tsr#$$l{BxMMG0f;+bV3-N zuw(ljPl5xDdCKs{o&)39Ouip)V)%ZZ1LN2aKQI~+L_;$is5EZF9uo}?qQMys3?br=pkz34psD9T1)IuSCwOb(K$|3Q z^S>Acu_qui|L`VR`VR`DK|3;g@)W4wmLFtzTTlHn*p<8;Z*O=zPyI94rTk#t!SI7U z_0M1z@{arv15Gxj{`u^}XkZWx%uxRjPyI94`OyG=Xb=s^P(L=hYnVIE z^3+F3)Q=y=4-cY#HB$dDPyMsltQ>wgsNa`&j*bbUz8UIw_GCSqofGv5qCOewA47!4 zew;`BiTah^f(zLt{D=gHb$%J|lH^@r?B6;0p8LUp@6Tlm zqn^A+5cSN^xQCbUtJwnHGwKlmMo%U%1H&G&fcN6P4ewP|;|AU*>K38ZKAsC#vm2tL z`7zN^L3A{@K-QbG(u#4}9RXvp^@bngiF`G?j`vOQzC^u#N%*>&VgW0_Gn5U0y=E{5 zW(hPDasig(ze<;&h>jvQbfcsz@uIhfb_2UPIx>ikL{F#{9`&Fa-Kj>`ENQ!hQI}Z7 zuhxFfj{aZC@xs`Bsi5&SsAM^xos;m7k642PNB*MEYa$WJo-Ll=s;?+H8nZhH@S{& z;A0IR>ziE1K8srNaZ!sfYPp>z;RoP_QFFr!eUt046Kobn&2~;TiJDX6EvWIKzVS`$ zXFlHW@xJj*?5F4eJ|SuvMh9%Carh8;QMA9|@Cs0WzhRrBCSlZM$18HQKQ-Kx8io&x za3w6`Q<8iN=2M!e$e>Iy2q{cX`S?UrdIdhGFm08^rIS%o8t2FWP18MXy{JYm zY82q_M3m9wR)}rb*tiZ&dIYlqULg7|1qiu-KLIIi*V>|_5B?IwTs&i9Nad)VLM?b- zu&ryG!z-}5?ZcqdT);Wv6KzhaH}&3r*r%kZ0h z>xi`B3;8XEFN`M;R*UT#Eu%n=te1twUKYb|^?Ft<7Dk%i9z^gb zdAlmV-6Mx6nn;BanncJ{hB4dWQx3lk@-O)vd{Gd=&lQx79)lSbJ`N%WjG~c{5kf<9 z_#)Kfd~pQG+}Fd%TkPv0yv0S*MXYuXBD%oxTQW3qE_ALM8X3NT$)QAb#+-F&_jlkd zI$o`N$-&qn+}|YOwMaZ~!n1_mY4{SaQ#HoM@h*P1`^)`l_+3mK1@R)OzlYyz_&pvc z1RJ?OLib0tINj^}lw$kw`x5*<5{0Enz7(R+9U?FYu^1UqxZ6wi0oXa;FZlhyW*L9L zz=9U5&j+v;{6W6laJW#2ng_6E{GkMYh#)?kAcmmuJcKd+2_rRZ~}#l;+N0 zdibEh-A)qx0lxcklU$9!w8S!ce2KVkR^FHEi3VQve5l0Ox= zEj0?$lU|rwvv%%RzA|vXW`t>_M+>Gw_eSo*nFd zlI|y(#-BmGANjNHhrs=q5vFH-y$-CS`(C>5naXiLkTAiSQaSgy&7s@;FX|W$$4r$N zedoS)-vsWv8pY^a5~FV*M(#Hfqet;P$DcR+IZw)-tS^6ozi2r8ASZ)yJy{?A5`Wq7 zmpmp2Gjf|k=YwvxA9i3k900`hUaYtKS~^%+4SzA)k*`AcRZUR~9KIO7%6)10Dlgjo zAY-raSKUVUh2gJw(e4MU*=ziD!(a1&5oqK-58db6q0s9doBr%rzB<8IlL)?%q8y!+)@hf0*PS zB3OuKf13Hp21n~atXm*Ys?31Om4H+xS}DAeLpEztr>Mqo4C}#|<4?lpDs`$YY_i7i zcd|VDG<2U<+a1B*2F2F7PYhq@oqs2=libJLeN3`O0ZMKo3EUU-=}SufqU@je#P7tj zo_}QcdQaYPx*6jq1Kgo9Z!_a*g2bONLf|TY~jAO}65v}%vQ6%_B=*H(9;tBW3 zAc#aUo69$Hi10=)SrzO`{*~Zxp75{vCd0q>y{%y9@Nf9HhQnJzDpm!X#lPd54TndB zLM19-cl+Lb;2>MydwNjG5Bx{ND_tDZ*i5%JaBI=){EA{MOFw#gRIq98J^oYR-pkMf zvk%QBQ`l7ZZs^|KAw9VJfY|gt%|n~L^vz^vxpxBhPTblwsHxv(DYhnbYgm%Plyl1v z?l`J4z6Cwrgy(06@$|Fr^=uI17yhf^Ft$^#XS2)s7LMtBi|_Spb}|3mz2)9C{CD4L zD*1zBVXO3VoX;+HZv^fQ;8BXeW5X-G9JAT^ZZ-caaH})D{>x)Hhn?qM58dlK(d)OU z*Kbmresv-8&dNFaVYKnN^t z1Ia^LR%Pu%{7*w@cLOl{<;UMvU^eudy<@Q4?ZTS*CJw4>;-IaYIB2UTU{*hfQBMVj z*N&&TH9YMl{3>TH0R;-7B$RlIUbY*qNbh zCVX9R%LM*OBXClH%xKrMH9`sPR=JmrP)ziS%Wf7qqLvXk9{lxezI!QjFI6L>M%41+ zIiKAmY9~Z(!mv(K)B)Yw8lnB{bqjk#1VRL8KNNM12z@VaVfP3l5=Iyg;}&+isFx7+ z2uA&+sPADUXb4M^0g)8D7?Jc7`C@jrdoge?Vo+5~8(n0?F24MBw%EN8xED}Py08#+ z(dw>ZHzRiSt=`KX6T6EBM(pla-+S33Vh^#W5qo$n?q&Cjy%GXj=4GN`QZ)2fkfR4= zzn?uU_IA&^=Zx6fPc2lkkJ#6UeQ4t32oQSMJu4ao?pYe{g%uNxXygGeXAik&qxc@FFr@J&^*du8ZW?wH*I-YwDCJ!M3t6XtPnAtm-R zBIT#e$Jy(miP+zWCVtv{oUIZ~-IMMKBbxfYQONODTA)1R8fupEA z-@E3%ch9ir+~d+c4rNWW@I}wFm)&F1Jr+45ntAjQ3*;UR-J{iZ_(|$8!tRXN-ve32 zUUQEG?h&*XTY$uVSwcJU5eB_3e`y&afla# z4Q!J*%q?^G8*!K?4V4@&Iva7gC(TB-$t?}sQV<{x%oLq{-!`y~?!M67w-W|u?v@c} z?k7gWb5kYR_lEA?*!);NuArz0VYm};Q~neQ%+boYp(j5spx zKb-9K#nGax5pcLbsYX5_x{2;abgRnO7Cl5yBYMQmkyGB?9lE=>)0`1KW14ZrYl&V7 z%!{B|@1*FBWrl)QVK6ZQ{+ePmQyb#mM;wDBrVR{}#@!XTyE3#n#y3}+*Kv1-?#`Gt zKKh*k>0?fB6-ZCKHKJ>lB1=NIWIHH^?w*~3bd-nmBm2cI4&CB^yc36wZ`FDnH!iw> z)_p}kBl>#EHsJe;{^D38`qS>1!BxJuTjcI=w});~Z1zT+oR8#(G$5v()kCTg8Vvrc@Zgsa9Xv$=! zK-vCch!|?b5Krqyys=vtx`jIcZUk)b7#i?YHxa`UVi>V`cv1`}JO}%}H{%D15#l%_ z;3XodYR21$(_ zF-n|f#3;|%j{I*IZ1 z_O&|Mcf_ecAXnrWk?XnHg%1(=Vzis*t}{^OV{Ufg-9&*HV?=?cMHhagyEb&!RtwgM zF`lqT@~&cRLX0KCj!TMhgxhG})1G{QC=}xjjJYx2dh-5af`HZlmkRN*C+{mJiee)s z`bK;5UhbOEU9%m68jSmxkG=RYq9h?osJYUlD6QmUDel3im76n5mT%3 zr-rV(&4kl+pF!`$4^Axs}<61JU$jhN~CJ&YeG&PWJ&7?z1M zlj2M$Na*p5c=dn_b)-1UUFohc;w(QyQpqfFwh^=Z40!?{=`Ii4<(U~0P6uil&R2I? z=q}soT{CxA;x%^#v3Z(D?G%2RI42>_A=G9k#cYq-6pvaiA0y6nm%2-gIM<^_C3D1i zM$GZ368e2F8^Lc7=X)1S21zv6sT?1YO zaS_q?;-t8kt;gPotVeX@Hy7$eD$diPV2Tq+u_p1(r~vsQ?3T!lHWBq`N7Xt0mg>X6 zg0jh|;T>qjcxP(7<03a6S)=~_b_yrDCZj&>y{LW)2YQ+?GB7v6VV-|O-MV&)wMUJy zz}STFfRUgpjhSGn^7cRuW>)t;9TS9#Hz$cx>a(9PMN0J!r=Qs!nQ<=oJn8y{_o zxrnodU@TR+oMmjdv&Gf!oWRYl!G>$Z)me~dhwf|^;9MYVu@lS3(wu${fxNw z0&bvX;*O-a1Ka;z5C!u7mgNZedfZg8$V~~{)cDOptQLzrRW9Y1xyhlM{O^9}xG6N` zXHs%H(RG1uYc9XaRY(_e?}m7j%&+4Qh{ZxI2A!6OJB?W4IdC1nQQRf&HsY?>ppI(u z#XaI)Bku8SU&rUU^3avnU=cUsUf(L*b*@ahGTNiT|5BxOPYT_n8eSLTPT+K(D>dRi zkJC*+b*aDxVX0q5Zh{MEnRvj6Wu8kn@q5IBuEc>t55{{j|<(nYRM%WOm{-ui04@WO9!1&(5kX};V3@WVDPN4$hVlrLTus{)sw8GbMO zE6oQyejc48Rsm9;c+KSoj>3{l%V{{i z<|(?8KkZHn-D&@(XpYMz%3)^UZVZv{1>g4b`~^2kx=}=f=kUDlpd`QU$K@)%L97;H zHHzO5ZyNE29|NoS+u|+pwh?ghoD6uY_-e66yko=~kHjkenmZ+Qr^I@6^@n4Pc*mmv zXOtT$-AEdnZ)dr7a_COp0SF=91a9v->_XsBDg!QSfbx4{tr7kR4Dug~_r(WB;0O$j zt~LBa@u65}#D`V+_r-egkrC@X?rZpa?!?fY7zg)M;vVl6w?3(C#7DmNdwi`sA#^8H zJHpoadhhcO-0`71ekVrQ2c9M$@{h#F3Gp$B#3xDd2`-<=I;*M?4VY=^wvoVyN^cq# z0e4*Jj;paV!oeUa+^HlJH+jBq#B%hh5TAm!pNS1dz)?iB-N?TepNlVy_}ue-BmYKh z6ki&#(f4vA|JscR-H3RrojFLn-P6oQeChiMmyR1Q-EiXl7cm%Gy4q9d7v)8{wwt@zFe?{Y!@XE!)>gJW)F@Qk^4;IW}Qc89nK2NlqW zZ{jYCTA=Y3@tYA_;w~b;i}+pqVFX-G7-PuS7k`SsjDTy&=M&;@kv8J*xLJH3xc;H* zzr$vYNXPVt1>Fdn5SHlglEPt*$BJXbUmhR~=dNGq`c+FI_`c9zpp|reL)UjFDD+#F zLdS&em>r@j96||lL^@HK?Q9^`@Z*=L2_V(5Ewz@QWeR2&yq6qLoL) zkjFU6)wQN{h=zBa9FyWCsr%I(qQnvT`94XmMA$n~}T5iaw;Y zk=$K2a7P%qyT<{sTXGM%r;&TaIt0aTxz2Jg*)VXOAt=?xZppp82_CUq?r^zx;10*i zPi!%AZ;u>ex7=Z&J8XxX%aIMCKy;G($bAFX31H&bExC^;3Szh1q0$|S*e$s)>K!5* zxsHK5#Mdh`veKhNv0ELa>wwrT2j75^duC~LaOe)MhDJs<$c~WquAPH7p?!@bq#cRb zK_v1=kif#TBOA+-2x)jD*otHr6Q z?>l0*tKk)Pzcvx{6`mo$R=La4`2t$=0Y|HHZ5dJBU^a(9>7}5 zR`Nh2;iACIhuE!Fvb6+et*i1aWLtTVk!?L@i0yI*hVH;>l~W@tJuEnn=~{)Z)ehNf zWE+MJ&wKpQ-dILL=8hI)}!TtS;n>uUCU}w6|yC$aj9X#PWvM%xvd8m(FvhZ)()`&|xW zon5oQHH-CKTx%iWpMlt+Plve!~^ zT#B~M+!wnlvPCrik+(v~j_5{biQ(PZ$F3a7PLW;Ykw$j$V$zL`lt&496sjF9yBY}x z4HPL%ECXaW+1*GuX!7HHf7wI!G_vx%OE=a>_Hs?!en$54^q`X7vX7CyJ#%}pJ}wow z6nY)UuE;)~9^DXQ)>s}BI1G=<`N4Z(SP$0IH40s$9nyolCd8)wXi)d`t@UC3943o> zCOTooh*7^7|vIV5m|h=<)7ZJPNKQ1Q64TN;jh!QlWr>mAC58OyvNRz}35!Wd2`3Tt zqy$q7XRwf;Ez6v7b&Z5)0oJ3qq+DVugZHQ-wA7jGY!}MOfeUH4Q|yYI?7N5KnJ$nn zKQqBr?hMT(bc#Vv%+49LLsxqz*bTRwoZ@O3ImLH;4!AH?PBRjI zESfgwuz7O2oMGg2KW)xoSIg5~j?+e-?)ye1GvygZ&h)V>=dr7ul4r`Z0;e*)JJa{> z5(MZ;=_K~w@+@C;IlIaU>2QClk!N`HDFl#*j#t~^9O|&94$tsFaGcUXBgNHLK6XXI zO;x$b+91@*w~Lg144Bu~OKOP+1yEKiLE>^^ypoNeSeUJMqnd*r!tj*;+d zkytEXOXPX-d?U}R$}f@^$P0~xKf`~2tGq~FY$O~xgwF!D(7MpN?JZ$OUhFI3{wHfg zYpX%p$P0a^Z)JDLOA_)DlEF)p@=_>}qj2Y8_U4z)MxO6ME@F#qI<)C(LBcObo0KK& zZh2WkUPd4TX{95&xH87b*;$hQ9ooO?Fix$~iA6M<#2-jc5%O$M@CtdQk>0O? zOP!vQbLCY=&h->o%ASx{%WI6hx+?#uyjEUkBo4a}#g?*%>+t$Lf%N-y(uZ-)&DmIuk#>rS(N=F zwEjc}^?BP6QX}EFAqqaqR>+$Z@@4|LASoAAQgAeGR+Qcog-Xo+9@^hy-8R1nw+F>E ztP_9qRJ;;YTqtiba-o;Qm29=VRo-Ugt)40?*=zE4d54j=SLI)pi{xS>7ggn7luP8D zM#8s2R9(rQm3PUzjl9eEW+i*t{ubKbwok>oeWj<_Gj>a8w^U2TJAId*WiQBk67nAE z^1VrkxT1ekaj^&aB74dH8rom01$l=D`7(P|-j|T~5y+)UxfFNxj*2(k{?s8^_DL>d zs@~>76IFi+t-s4PL)GGfsjO~>umcOG3V91?d%s*}oT#PHW`D3HdPL{76zhQWMS(W^w*0v_Hi+b#9GwEL`=s z#(N;eDa&QR{ZaXtk?`J-lDn2|l#k05MtbiJ@}J8m;K+iJ=Aq!$5%(aGl%@_8cX3rYFH zzoZKL+7($ceiPbnV%J)E$>g&9f_M)V_|Jax^cYC@qI}877d`2|WWUOndk&r2IsF zYUC##P+eY6ewL7*5wSNUi*NTaS)E;(NSkQ?L%=B&G1mYJg|fu zl>_nZM11OuPm}S9+?Qli^f&X+8|87dgumq7PkAY9tjUbx9iHUk%zEpfe}0-}^SaQk z`?p(8NSxM@pUW?d{5+2D z-^g!`{3d2MZ^7Hj@8o79zl&8`-2c+nejqV*d;o^$m*kB%@_SFc*1U~KikCs+KX}0lj<45qL?drhN zc^W_5oF{c>euRBJw6E_3A&pFXD&Rg9`?#XkV!DRugU! ze$VYopqSd#qlPFwwRb|nX1`4BlT? zk($h>*vCTq*iMcCZgDJw+ZBXZtr$W)!#o<=N4FQerr=dmt<-@=;Z7~M!1yda%RZu7 zt2W#|!dP9^8XTb(i3&$n)IqA9Q3v_C zW)`2L+N*<&YVQSR7N4y;Bvc3Lb;qRYh(l=a311s&nki;}`NP>_e)HT^`tnD&v8+ zdtbQf;)U=+eu;fBv=44igzR#XwIi}L`E~;emc7wj`9SHhTI5uK$SI4RWfxR7bP#klqj`fmyJ725@Ce%Rc*Px^t zv`x&V8h|%%Q-kfTfxRt$6G2{Tu;&Ess<5|&_LhIsI>+8h6V(z*785V~`nHzx`|Uz$ z7gA9lzjiMd@2ep~4FOe#s$oVA^}Jcmm)iwuxEjIj0^-eZxId3gRg_InRg|R4CKsnh zmz9*#y(NgM9*sLzrWB+of(HAP(W$r?)ylCmPWj_psoe5ZrM6XB0W&zbIf8n9Tv8p! z=7ISY7@ZVAO(D%RQYXiLNwO@^4MKTHOX%cLtZ0wMU%I4a3dXaKIh=?({;C%GE?e6} zE3Z`QDKwxYj!yJSeQvx3_*Zyc7J^W)>Z{|`2}T|7r-0?6K%J;gQYRaAq9@`b;xIK* zsFA36iaOP(Q+&lo_@`==I!)yoHHsXAoIlRrR(UGls60Qop5kw*(W=0x(XmmNKgC~H zW7Jrq#(2Sdimy`R?9KKjqsB2fMHyZxQWDItbY};dUk$b=L2MX#!wYx$Mf}} zy*}RcR`HzG?g{R92ltK2_wPT>SE!hk^Pwh2oqP;q>*VOQ)QE-#c9%DWKL=`7gF$r=>Qk6i2dtlUV8&ymp zK6H#CMFNg*OR=rb&Jc9R8T|%ZKE^%$QX39Q2zxaUQ#gU8N)>eYQa{yw#y_)HsWMg0 zEw0P2tIA-iACM|8nVQ1yM3hubYpJ~4{0VdpgsuZfA#^H^Qc6um)a}?*)o@4^j`7z{ zl@zBc#ub*Q5Dbi?_I|D_r`}W~RRx<5oJkv*iobMFq#U3BIfu~<=5JW5I+{Vf^>bNl zU&R|$K~7X7dt2MTsZofU6!TGa!Bu?P6}hUr+{!WQ($A3;u!%xV0(mB@DMn59Q`TpE zi<+vY88y|feBbe3?OZk8UK!ZA#LI#y6(yrf^67*DW3!-u)Q|5_Flst&=@~BL_|aaW zW(4*M%q_8fQo%PwTY~TT5BBoVUcP;Yg}sslXqpG|8Q)|tQ>O>^G62cPq-WIW9teU> z?WLi;w3-P@D7eqmOm&7)@Pd&N{u}>WovF@Jvy3{^_Xs8S5_Pt{IIx#guH~Z(igKw( zbao;>KQS?{%&4=ybpFPFw--qZ&ylbflf<0G4rZ-WxV$qjH?IiikV=Z1SEPyyu+otb zw5CHwsqvG`Dyj)#j z)aCK|iQ>lUN;TK0D}Bqj)xgdU?d+Yj+ZzSv7rBA)PhF+1HtMQ)!zdbxM)sV*o`asn z5he;wF$gmPUK`r8)ir@VJ0r|+FF}~ao?BQu-h{>16vQGC+sQLBO{Qs`&|AFiJMcH+I zx}9dH26j440oDCHlbuG=F_om_;`mM6ws4r8qHeI013RULH;uZ%OH)VDN!^%GtIWzMbwK?w`Gwl z32n&^KnMl5t6F5Stz6`B>j#tXWrD3tO$$=?U)+rC@dC0p-#Z_xPl4w z@mNg~W5gI+pq@}qa$7(;&J(!aZg`aefVTQLdkg(G_UTq_^7BiI>9>O`%E?HOnQQay!87aHDM8v?2*>&-ac z|5p95r`lD&yF@w>)%W!G(?INaMOjvPCW8R^_vripslud1kuiZvt8^+4fqZP4eo@I$OnoU2|^FB=7S zZXT##C}ycu>J_6_Rpn=@SJi7qy;_x@qFz_4je5N*U#8wrZyNQ6mxDr4q~1y>@;R%w zlj?1j0~HV=Xw;jrej|#+B(+ApW7Hb2-%J#f?C8MK&zyJ%!aH6di^N2mAKLsH9QH=R z&rZTuCMK(Q6Y5=R^u45d4<^mlz-gg9ZF{y= z^&+^kPOUd;ofr8zVvZf9K2jfZJBmd9BZdb zk)a*AyX#V&-OP-TMdvbh#Gk*VfYilcT`V7xT^`%i8J%O$iSK5=*SL$nSVL7d< zzGC~ceg8qAe?W;z^fi%aQ&Me$OTA_idEu$Xa{DFF`Np1T6dc`yAS+j5aDA)3GYXz* z_{VWde~H>G)MixsUj1Mce%A^cJ``VLPf$OqpSVTjZC&*vIsCoJa@*+(b5g~)0?cu_ z<>UOU^b;Zeb5i}xx}uurzdVNr4>^+7a8+?2Y=866!A^z~4#rH+-ktgfQkP+%##2sk9v$*kPGX2He!}Ig172b~_}n zLr`8(Rz5Dr!U!bn@g#ZQdHA?6LfLxC{&!#TAGfa%_C#Xzvn=D08mych6xhKv>eMbf zB@GPiz-?3_VKLr~dd`pYWmsk-p%Cw&;hQlUvW3_ZT)*(R7Frq&`@_j`{$Z`OHd=Yn zUnZ8@0ihkR1BKXV?L`!qHP~aNJr+8(mRaQbhqnI?KnTr&TaN8#bdJYug?LZb(zT7Q z<;U&{@wTp`1EakQTdWYPb!hwAV~h^HPE93swK3WUL!ibhI-%q5hffWrL@Y>HltvfCzm`D8X4s_hyTTQ5aZyQ0skbKTeF?QjN!=*6CerOe%`2T_ zqd{M?A7;1B+s3ESMwxB^@@D7)9HAgnake(yWJKomwnFa>+#B1jMmJ`#k~6Uumnzt< z_+arP$=u#apYEpQP0GGOpWb3Dv>$FKMhhqZ!5O|g-_sr)+M`KX`A5{DkYAv^ls(Gm zl-IDolo#s#bQ61|(fh^jTd_&b();VC`T*U`=>6l6D6vWWrJL&(MmHx4YvljXEo~Qj zgwZYi+KUp~*&eQ21(wd+R(ofMJsj>^jqnY7m_AUq4(wqNk=T8!5A=euS^TKmBy=01 ze%qvO%MJte=&lahJ&<(f$F%(C`DAii;vgyNdSg89TFTL_(M~6QkUcc8bRajr(L*2P z1sHb+*h4~l$o8DQhZ3>7P;vx`YzvRsAL38jQCgTSjc)2^PAePec0#uURom->jc)H} zCo6Mw2i?)=4u0meQs_hUp++C#+qRO~4x#O^gK5v`L*tfl>YUqyrA2gw(H*k`qZa}PWN zY!jmg#PTlN$Yb?Dp$DRPkRELGpjh5fe5f9xhZ;R3mUrY2*2DC0qlbAU+Q@cxztHYi z!;Mfz5BJTtlkIIv+7!w9&@7i4hqiGIuM0gGIE}E4j2_`}>I77e)5jZqoR{NHvY$Rd zpJ?<6o?V?}Z+(*8*Y0C9&O+sbR8(@Z9%=N+Rd00Hr|46S#?_WIGCIkwdXzrRXv7}) zd>5Uo^Nh}|%6HcJdbH8`zSlTsZTAlC-qoJ$HhQ$Ld6+!hHVkdUYDY<)uZJVicCXOx zwG*S{G*8Vg@@QR<&tP_2W-mnu*5&eD@~nN8|)qbJ2-QYbr3 zSLn$`S9m;6lp}5Z(AJOnUE_s1da}oIq#UKEB=i)b@zkUy--0glM9G)MdYYbYG+e+W zzWH*zo}o`SdPY@#oSv!AFnXqMJYSBn^+H>3CmKJ)zcEIRwTaLssug4JVy1Je)`ZsV zgcwiHQo3$v>+TR2VUyHl96rSkMot2a&(vobjSEGo%ai0xJxiZ$^sK7<41JECZS*-+ z`DyxGJ;&&CeTOE=3LAzt++nju&++uHkW=+}34I>X|NNvrA2LoC>gd@X;50ei2B8hA zr4T&gB%m|o>9$U2>+A%D&dO4#c4+-U*qTH|*j?XOzK~!O} zGvxM2`g9Z$iG88IKwoGyyv`VD@d#E{TKp`4qMDKt6blU}w7y7RZ1hDezEGz*Yo#yI zml};rFtIg=-{kr-3(c0twzJA>%u6R%-Ke841BlDhkf6##jqo@;dWx6jg6U!||+X;iPPuVRhZp8vQ}XYgbn zs8YE}xSAM!O;TUO+Ced;i$(wa<7fUZkiqb)0e|Trz3OHzY@=H$x`U&F#Yp(DP(l^ zr_a(qrGHHS5Tt*qX*{HH+E1i^0Eg0llYrlZXNkVk=p{51IIhNNoc>br@__ayZ_m@jHJ=~l8H+r>f#*4~Mh@74DieQ&(3pydvFslGqG zIsKi{OEVYu=wfTv`N?WZ41Xn6aU>E%hi96K@kAxk>R zRROO~DgNdn{a08RI|$#D#^QdU_g)x%zaMzG-bX(q^h3b;Vf~2F4}0Om^*;Jh{g}~@ z#`7@4^*;J>y~60ntMV=M6Z%P`pYZtOdY|++VfveDRRyEr|DvAadY|;BFuiGq!e{gf z-)mg&qn}FXr>NH}lX@js;JyyiUssEy(2sx)Pp7{! z`svKYKIt!c`b(0nuPE6}0`?sV*nN1O(a#$Fj3*f`_R-Jj=Z${O2i)LdAN_)U(dZXq zi!pfBIlVDRZ^ZD3e``X+IYZ+V7yG2Y&@Tn)FEZowC66yI_DO#pra#{aQazvT;f651 zVW&^W2>mR&@v>fJG|r+90y?^Hp9JYo(CheO zAC0q}L=Rl-lm1x07ox}-;_Zrvu z==JFj((fA$j~9hqQOQU8W1~OvQhTv5(%E&>Ly;{W7UB5gPqP zR*2pX({IPakra$-FZR(J(8^c(YoovNOCm1z(VO%)>9^9DK{jPB_R-&JERpba(n0|X zZu*Td{YEu1YP9#WVPzYqHz)LF!tnc~{vNA$Tcf}6vllM*(LV?c$E5yI|77%!zL&Vz zNB^vUG5TlUOW1$)uL=Dt!Pt`2TReeI!KZJ3yPkMEbrqizR#XcGi zMYsgX9QuFQdk-ipiY9)vXBIlutqWI@VgN-XN5KF{&PhNp2S73i2&kA91DM5}K@>5f zYruqp0TfJ_bHtppPWPz)s_6~#vAgizJLmn+`Odd;uRF6d-Bs1q-PQH0>P}y<=?io} z+t{c2PgLul)f24#XQ-7n_NnfwlZEHPBuX3mR8On_h1CgDBnKLA>{I>ke073}imU%q zs7~k)bMhArEm5|Oj}+2t`2KMyUm)sKv1jFO<34rJlb#y;tKS!C1oJjn6JK9WEk zE|@mu6&i8FFLk<&)B9A$_(I=|<`EJeEAi&F#yZ`x!`|*^1_-v|(8-U5m0> zV4ODgk=3O{N$G;**WrzQq>>t?3d1IC<0DPFCVd*E3B2(gD*>e~+t??4O6DZm^rd@gF1A3Qy0RWh+L4k?;iY0}`mo$qZWpBw3z3uCiteHl zg)z;d`0eAyH#~~txF<}WOL4%fHKCbB8YCP8(UiCfeAA-%sMYXc>r8a(jbDsD^fgY>>i z^a~}q+E_nt7k9~Kc}a=B#j<%pHWxVxUgt0VN?cEV>n9jqE7*K-sbM`U$zG+zaKNf%_HWVYzo+ z?#U6nHms5LZp<*&X zAoS+S^e#y6%Dmj9|HSc}88fB{d+_9$eJ9TyNxw(wJuI`kS!Mwm5>JSyW!Jpy%7k?* z$ZpgF{w zwP_!vcQR>&RibPkWcHkRQTEEqUQAl=g6thgYa2+Ty@zC<^wxA4%07WKzSCFsL)kZw zwn4m>k|W@jGCB1Nq|q)#=~76SZc$63l=C&yWlU1*at*r~(wi#^a4k(@l`xw7JJTmIJ7wp^`?@p&1A( zJ`jJ%VRE<}fs!&&c^UMv_)_i{%l+uVk#ZEuku0=`ZhxFEk^9R7qI8L%p>%&5m;P^@ z)+5PfUn~zS$OFZH_h~(H6t%!X>5V843Od0JbFe%FB}KSXGg6Cuo-US$ri*O4xCG*> zFgINu8r0%r@kx3Eq&HNgfaxOE)I-Yk=Xyx5uRwp&8~M56qG$wZ3jL(l$-~lXZF*f5 z4l9(0m6v-Bq}OZ`w-Kk;a*-nfk3W(+9xjhSNr`2CVK>-924sLMf{px4e8aJ)P?eha!Rg(^r{Ltl>3s{$I0<1$Fbtaw8PS$ z>6Pgf>E%&MxsXvxxsXwMIa?d!=`%r2L^&bY`hQ04;dy)3;HB}E-}BL@DAjGQ8; zqMQ=Oob5b>y+~ zIF!d`fEaK4ByU}%Hd3t(gdIrkVGt)l1Gf&d>yi8T;dS`j2q!P|7y>1}Smh(}b zU3$H}Tp-UuxuEoVJ9(}=59PT*4t1k?={!j1RqC@td0u$3UbJm`I;5vpYBrq{p4%>} zpPmNkXycIuNv24MH#KvH!{@Y4DnC#V= zlvKeMF9&N$LZ!&YqthrGrl&$$!68~G37I0jjdqT9O;54uDWsJde4Cz0H`6m%wN499 zG>)3e3-j_qrt6}Dq{H^u-5I54^MhycgC}RTQ6~`T$&j90sSsm%BI&}#=}9Or&K#dn z%cymFVw9dpJvu#!zb@lKDSJ4U6X~;1UV<_MY2s-2X!rDl^!Rjcl%Bv39nW8!NF@nQ zk(bKLP+l4oZ1<>_yj)&^^772Upf`KSE9F%vugnaLs9V${Jpd>(m#!h-; zFS$rAM!6`o1ns(&&W3b$#U}aU@X#L7p6M(|XH}|OH-r}1E9xw7%u50|ish1mTtfMc z|FJV3%IiXrbmC=tG^9swQ4OP%vbdsj4!7qOEv`$Ix$KoGxwADYa)w)a2ENXd66pj)G(G3hu+ z$88>xC?6?r$0H#h-fnLwo0x}$E2fCuF58G zx;IlkA)iF~L?Cx^G+jO=$$#@y=*d%}>FE(RJ%WhMc7&4wprH4rq=!R#_~!MZd@}Ge zJ(`goR+Jvb`o20ycXsrrTocPRMA%yS3`#;ySZ1@M8|1Tc9m;1z*Pb0+C)dm8P_8e% zzCu1PUqJbM>GdV@Mfnm+a_jR@FgrS5Zjdjd+)#SGK)xbhMfpnU^*s5Sd>!R$rPrs( zH{_cr-w2e>j*gXY<>gzfdT$rx+nX;z-wdPFvC+x$o%GO@tkidcy!g($@;#K~s3+fH zbbNGjdaz9oCV7P==zF0hkByE`4}$cdY#tvwo!u>A3EFcggOyVgXOeOAR zr$ndA_w(|7ChUWPB#42RpsxmE=0)@6hv|Xo0VqEV#PFSuHcNJ zd>n|G7oCxgf^^j8jTfbqcM_$X{vatui)mO8ohLuZ%TJhwjRm2OGgZ^c@3B$GrTyeMA?BwZ3+ zF2BgjFPNk+3-ZfA(sO~NE23-VSLv{n7J=lD<^hZEd@a90Nxozz>B{KZbf`^-mXY*L zAnA(e%5(^%L$-1>j?!UF*uG5Ix~zn3ejW_z;EL8Dk`n0TxAHrb-!h?5v?yAX4wB!? zAEI=SpuzI{|NpjFlRvQNek{lz|0}jwlaxm#f093=Bu_mLD2t+-Yk6+TW%Fs$9krTEGV7tEQaf70GI?Nj9n_Mh@1dqLW3lT~G$_U2lBVDG``aV1oQiY6EydLN8ds#q1F zii4ydj2=YJ@#6+s!yC+)(N_Jp+OCUv2T$|>mqX^+jBizR_DN-Bj) zhG}h8^nudKq}|hQsC3vBZB?{ESp}#Fc3|^zRrI3DrCrl~P~}3q(4DkP+F210(WT0D zX=hrODx}qACzV$Ii(3^X!ZPLALx_9;_ ztxFZb04#%b(fV{xNcY^FOPTIPe@`hEEK2tw@hb>*y%@ce?opId6g?^v=2SW!Qq_u8 zEs{!YRR>k=&`_^NZ>hSf9;&+GO*$n~ZJSq|6{5B)sO>24_8@XD?1!pexyU<0+VMX? z2UUj(uAg>5RX@w4h~B2-C{seZDPN8m4X2HmDkgCZRiN>$H_3mwoFho1_&t3HkEVmTDK( z$fhmJnq-&2?8fMGwQF9HBCSw#&*f!$HsmcQC?YY-U0vn6d5lr}9&oARw4gTQ`?evQ-i{2)y}ak@Ky zjp57D{2O&5NT*a_;8Ac8lQ1M2mNtR336BT=nR6nGN$yQlQ&d^@NX$R!ZfWCm*C^eM zYiP`0yK)OPrB5@}996Tdh3LV{R14KIZIteUiah<)LUd25R;o3sR$0|_U6k$&>CT&K z1gh2p0NwxHUUfLN+!rk8X8;>D_6tOylQ?G>p;`)t;u+cs^eI;f6O z+K^^F)j@10YGqqk@s52x#?2Tzz9CygG^dNaqO6W$wMRki!HKZhQieC8Dz*N5(88Vf zA>tK4N$ggvcBcyWOi9o7%xwIOj=j>I)ZVD}3Y0aB&r_XZ)rlVLth%7;ob{NvVLV9f zqq?HnCmY)6dVuPtx}ze`KeZBF_fkDnPgFfhue+&UsyC`$rPq6_KB_M&^16rTJF0%F zKdOGE*KO1QH4qhfH^bjss6lElszE`X4dX^?NL~$LmWLM9(9Nt+H8|@zaih4o+Be-X z-2oMO^T@)`}TM6S6H6Lg)o`vAAQr zmpUM?*io(yET{tmAt6;H-aGE94od5!wNa5@nPtOw4pxVtIyey0DejuqvT3a{LV{bE zp6iru1L-zfVUX5gl4>(aJp)PI;-2czydqC@u{x}v4htl853=bM_g9Cfg|sFra{Dq# zeCG%?8Ws6#c}(aX_fKhN;S+|kMS~h0WYa6|o#r9UZ?!>MV8UuLVT4-I=)pfJLW&hx z6N=K1)EG4u6>WV-25CGv9-QXXk!oC&<^*+3P6zwHfq|%TEXVN$HU7UG15q@}sR?Q# zstI8T8XON-lhkBXlY(9ij`vkl@@fjpV`@Q7tT^$wgpK3^T zMVgixR>|Ou&s0)Dsx~JR6*=)s?N+Jgq}6RItFl|woN~^qL0WASTQW|obFDK2d*g`V zW7M&z$XCvT@3?rfI!?_+MSgZ3RK~><)$w^nj`(7ALP4Fdx!oH4`SHYfQd$IQ(I$1F zI<}mW7}9ui=3;dewZVxgna(GMDR>%9Lno<|Q{n$XbyApur^P3$Q`D)bXum(QTWK?t z6V++{Z~qsn(?Yw@9iMuyPPaa-%1H8_jil2>k#}mII>UNLqf4+`=LME$#n^u{oF0|4BoT|C_)5V)36E>N+t# z$^TyDf9G4|%O>Ywd|EtT&5zZ5lF9;g4ypyAp-zj>Qs=7kP!Vpx4Rcz2hB`m5&Sxqw zD5wj{?bZMnus-?U!2hR5D;b4~vX_;4yv=@gZny`3warUp-*Jts~ZaG8yG4Bmx)Q_bmfk-8YwMckM% z@9yD$_CNU_BmXm#@DqRi$WLBOpM~lYR11S@TwYXDU8*iqm#ZsKk(uqA zt_$+NKE6fWpcbLJAtcydA1_gh)s3hYhib2n7yIwQf4>!(S*XZ=&TY6jzR`bIO(77zW z-G2o>gr`@PwS$VhVZ(;+V~m25&XtVB@`A+@w4$d{|Wd{wn9QBIU78Jd<_2MEs`4hZ-`SxpqF|?J&Nj) zpn5OIZ>W{(F;u~8AHN*G;y(ia(dNS=s^II7Ux{B=kLT6n%Cj!@jz3Uq)ibEp2C2Orzvn*y z|3MY_F{)=m1H2c%@82)- zJyDUjntR@-@n`-`@NZVCB`<~NK99ffZ-9SeE41W=Ae}GcZ`3P!^$IuHs|EF{=uWFn z-aDb9JwL*(6*Fjk%Da7Zq9-?LUeP)Oc>Oy(1H8?>Zhg7DUkCqsrHsb@UEeXgjFB=7d`39$5~(kJz>=+Y9p#oO5c#`Q}r1t0w6*O)zs(e z3sj$%UJLc5`U=&TCD(Ld=huoRldppue4P5{!9QQA$WeV0o=oGv{Bz)+t5mnX3eV9w zq<%g4^;@A^1YywBL%UEEsc-Y@Th^`b3hFx^__kWN5EWr9r2IwIimLl{;MY|&@N5h< z$s*&Qwf9Sx1|01j43#?8bg(oaIbHC54@0pe#3hD#oLQ%o5^=tgok*5Ib$gknAr};_p-m9NI4Q}LS z-R09-cb^ zRT|{JW6@6jQSgtJG=23gHdtYYK+cQU~rR)6`2 ztf$E^?2WAc%3KCTO^RCj2d(GO=4{(C{}7i+2nMTDp=cZRcMbLT{}O%v`x1TpQ`A$c zpGQ6AA5AU(Pu8chzPQ3a;O~z-$9{W?{f_+o^rYrbq+`^Ph$(bIv=FUzk*PMYNjoG|J z^%vRKTfxtiEX*U@$TU8w7XdMPzr*VEggu9q$DDb>4{zf*6g>sx;( z4RDpFhU@LJA&H&`e}~@Q`a5VG$l|H=_JJ@;4fnT$zkQ31BsJ~rIOlHC^6hG);sH6 zBEOiGh;~F3b^aqUJTwitXGLBUR#dDT6?7xo->B-m@T|>Cvch#ks&-f181=5%Vw5tz z_tv}VCVr8>0rhTWS>d{=Zic#P5Cdg}`|H8e+0X>y{HGY21ratBJL~3o-JGdvQP3@f zrey6BZEF&GPh-(hw~Td5qM(&-jk;CPBFgF3ZFF1Il#xM}9=+C7x6|!Ww+ppXPPe}f zJOwdV8bgY@eV~G}y8X39{#vs1bldVayaxO=RlFYS)Hbz8ls-V61frPrew%0-MxWzw=sRX>TamJ261%~J#}~819kTdA)pmQcimI>LQMce zI}&GC(cNEW{bkhevK%K(m=j^J^jueesqSt4rDX#^??7)Cv5&t5{3Tl>p1$sa0IR-ooi2DWZ28ew+zwG9zN{dv}(m(@l&=XyxF z#LfkOZbc!du^vQRkM!rD9vQeELBbfN_eVV{a6LjCst?cyqCOySJwhC;5AqBAeAEHD z5`5=ieF*9RU5Wk0!TxOP&n7yuoO69h;F@yL{aN}@>(46VnxH72pGJyN{!H*^ZUxs1 znCtn>^?`xwgT*19{KjXLalL;z*Ym*7t7I7z`*XOE{-F>`_1A~h(1-oc6#efrMRi}& z@Wb^Hs0r8PL4ULuuSe@Ks7Hs!A1#j5WAl0}54=YfG%d4Gk11E8)4`vfDJFN+N^{Qj z5md`KJsve}0Z(D9G(IoZ6ZAxXnm-lwgphMSK}^+?^kmeNLh%#CM1KnSQ!3F>)P$MQ zN{J%wrsyeoJ%uTpTF_I;GN5^NVi>)qi|h2XSWlz+kJ8go6M(~9QnIU_p=Y9=5z3e@ zj@C!#_0e3$tb(2u${^fnIxXz!N6*$YWDrco1Nj^=*Pm?t$<(Q`oO4YO7T-Tw%<(5# z&u8FdIp>;SIem;i7WFZq))U0p`Zzro^>JYWJwcqQkJl%lK0Z)!f;d^9nAayV6(iHq(e1W*a&(i1U zbFH6M#@#uAy9>p|{^%l4jfeW&aBHEs+|MlXGb!g>F9_t%7YqCh@G~l9cn&i>n;AYU z6mo^Q+E2HBI@OouoNG!3VbRf#KMMR&m6Q~F$`OeDXw6n^r2`dpwdM14V!+l}HDeUZKx^+kcA8^z6fVO}p}1-Yc4 zFDVJv(HEB!HW~cnP2r?iUr5DXsxL!*DH9M;X7n;YNnft7i2Ni$R`%tzCsDJq5dV;K z9ya!(4D?B3Xk*|p4aw?mNGJ77o;im&Aj_K^m&N+Zg1(YwxXoky|D9s~?~T7g`Z=fT zgo89WVJBGTydN;1Vb3W#b7FlNk$jcD8Z{j*#Y@~};x0c?U*ji$pO|e&I&u7*$rOS; zhb(ac{l?E3z!yYhtSR?IU+ZbCAp@Al2TI}g@?)8U*KRnxuHVfDxnzO)hf*vV+hlu9T@z@{1G>v8jB!G=q z+K-6m^-ZxRbWGo@m!b|x7TsQ@Z_&$8-xAgekBG8NFQJ zje2?M^;7yDO%8~ALM5xk6aHZE2Ulu}qb?3lJ|Uj;2Z29mi{=mNy8};8iM9IPyuOz; z^uB_=kM{g7T`T-s-%8gAVeF4l|Z{r-{PpBtXy^DvEDX=Diud&6ewZig{_)V9d}ozjje1q- z^*j0r{UquqO0VD0PwA&oQwjiE3&dtKOG)=O}y@hfFDxHxQhD8(7tbo zxAmI5CU~n@uPx}c6(n}))uG6D#Jhel_`zG8vm!r?1-dWyzDL5l+@6EL58BGetyoj8 zj($czi~5<+Cq5CM>2-QN>UDwcPsBz)(E5S@8i-J@FRyF>_yPYpbQ2t>pVQByrp$-~ ziK5S=Df$K9U%!Z&FfAS=(rCPXDb_F1gB$eAs5gYl)2NAlMZb#rmCzz-)L6f!Uq}5~ z>2(ABhJF(@;X9;oRLu7JE&Vp?w@R<;=y&wHs3}P%{Jo&x)9<5xuk;%92l_+QACz7z z{gM6{^+$nO%JkKr?aNL3VMZLK23!3_ zUVp*FeOb_iDiKJn-_Hn&AgZaq^1Xad)L&%;Wp}>T-=O|F5R{8*`X1KzC?hC^GhI&@BFHNLrwSvH(JAJSHHLQdzX<$i5oN$aI&r6 z3;bSN*{dSonF;H}gb{SfV+sBEJ;Co;QIwi~nYzL6`VZ6uypX9AHI173J@lVCiToad zOr1YT1OIQtL+XU(=nC5Xm&ZfuKd1$~PEix&MwS7!Kr8*1COe!^FEYpIx`qBHum2%= z7*Q~y!gxsicX?ZP1Yf~11hGy!_b8GSy6VG)1B6cF|r&8iht?uKB24 zw1@9twBOzO4kdAS6>djibkNmyQG4GWeEW(t%~K8l8dXkaJMir)0Bub*Q8c1NYug&* z+gRVW3J*CNQ(k0i@U1tAQH*^XuC;n#uRAep4WO~v5FB-n`k0(SG`S$@?olt3&l^f{ zDK<3g`*BZ?#EXXb7Gu?Qbo?x7?h$*u>NZHGK;-H8bNm>K~0a z1+$HB?wg@0WT7>5?;uml)J8)P3g_|kj}9<(d{f^9O`Xs#bjR=J8=Jb;?^e<-749$L z8xy2z2y*bdntEni>&bl|;vr4F!1CZ|U$b4_Y{x9uFPQq9#6y~G>CHxFd%uhIjj}f> zkH>5uWH2Jy&+iO==gqm4eit5sn(|i@7Juzf*8$OizG0DX$hWr1=HlqkXpGq*Han11 zb~HPo*)cTKq0tehfoX`QL3s1f=rG^F`UWM2z?@mfj7QV3T-rN<-|0UL0kad8xwGF9 z&CVesh0=;+PXYe1=Oh;2jDKrEp^(0RC9@Ce7eftSiEsT5;CCpQHbb<21)-4od8%?3 z(+CaihE40%XlgXoZ}02-?IOQD*IA#xD6~H|jp(zh-xf{4Q|QUJOk=Z~X=0k9X&eMR zHJaw@fv>kIV`z2@qMH#dHqBzwj7n;5NTHes(anhFnwF*&nwHsGCz=t>F|AD-G_6Ca zGoo3(F8I1z5rc@PO%VUAXtu9Y+PW`dVlxUFKkt!SO_T zJJa58V|GVFxiS>#N%u}O9ZW|wUjSdo4ACm12~Ed9}B>wvsdW&XGG_kPNp*&N{1m^EjlAwV7i!n&~yovpAntyYl7d3 zjq(k_9!&1p(R^P6e2vOXanm_Gw;(#l=fUTF&H`)!!zfJH?M zNyc4GH#A)XiwmRcOn1`*P5094YfMkm3r)|`>#Iy}(+5p}Qt185d=C7Ux5!7+C&>S@ z=t|Q!Z~C(Q`xQ*Tl2As|D{y{QbhQWYP^p9hA`@K`UF$7)Lc`ngHf@zVNzru6O6Ix3 z8}MOw`>G{Wi#uNv`t&yg(DV&?+JGdOPs zGp|DmW(ds`o5Z@shTtDF)YDWtG<4THqLpUf*ii108D@r~A&iG7`#Yk0%m}j|nh~M9 z-VrS~Bh4r@BLgjWM0a`#o-zU|hcV5lK-8VlUA}seug=}H1OQ^uR0ChFiq~T^oM_tL z7opid&{RyM9$*ec6EK>nIC{h!GcY8s5uPHp{3XNo5Rf! zXbult6i4@Z8fitPD}6LageUKf?sNZu`=?SZIV?PPfAoO+8(i3~ziKTxBuHmP^spJ7 zH>0`9#uUsL(Vbiq{~tpcW0HlBxYrSUR5JCuzrg)fDWeq0#}f}_5~FDvG-DNw{bOS@ zmRjLRGY-v>p%qp|Pn+>(0vhs$9zyl3ik>tR%_KDBsOJ%9RkYfr;3yxW3eA`lcwZeo z;e3(vtQix^DRtmzGyY0nkIguuX|hYuOb#@yAyTK9sc6E^SJ9g24KvOC>Ha`N^Brpj z-#N;Vl|Y+XvF)-Zdd19ezq{Yi%*b5X*`1l@Xfy;Cgf}*rS!OnxS*6!6nmOheG~_o8 ze_wBoHOHYLA9=Wb*331>qX}MiDsQd(72L0tiX0801uU_((KGHBaKBWlTgQdxo{iSI zpTYgS6(i6wLB8vw7t9HHa{}wui3M}w|HDv5LpTW&NQutwCvZPiH1LqKo)-ffqLIUUVuB8$ChBifsJ z<_t9Rf-{)k{KlN=z6SSA<_w-RX8O2k>u1vEEcX?fv&yOb65N-W4}09K88c^w zZ9D~(T=b%M002yxHOc&N1hrIVaO-5>DQn zXU<1+UI1FEiJZB>T!`j^On>R`)?DPiaG#^OC^%dA&c$XS8p045#L~jL&*&f9$J56g zg=S&!4ptM|eQGYT?o;{;bBE@Vz>*ZoZ3MTmN|qw`1&j1^X6eGLWyv%L_lb3%l(apX z^UFo_F}RN_)$0LSdiSCG0L^s) zmaZ-8nH$U^G=v55oLF1baqokBzf$#F6ez4C>YBxQvzRHov0w-lA~4rnAG&jWv4>d_ zn?oC3P zO$mTQL2>R4aBoy1u*ki`Bg5O=g3HTW@O5zEl!dCSq1fC>yxiwrLvvr?r3nf4e)9mD z`@;a(M07AK%!6oFgaNP#4c`yBSKTXU$X(CgX1?>Vc?8YF0cmb3+Pjy{qh_UbFPCxm zXyC4;Xzex>xeaW1tPHo>h<5I!BKHy@&87r6Xd;@r7s0()DZ{Ta!>=&I4~9b8i{0G| z*70uj8PaSXC>O-@;GVCfq}aX2^TdZ-+y^|{TuYzF+;eCi3;NudW{t|SV|4ct)}n^~7Pgn|^C^#!w@(inM@#v{?J4OR3Iz0Gsxc{I<3Dtd^X?pbipZbcQ( zhbnrCUgm|oAxNayyjUpwE4iU$hH)HcAHT7GDx+vi_+=&knN^KN*P3Ug0^ zd#d6$WAipq@`3pf%?H6E8ZV~1C(TFh32;wlHo@fSN6wrzW8$pwvu6t!F#X73B^R;z zh+h5Je1hiVP!)yzxYgh)I~O1}pU?{%-6}L2!wVGq;~oe1cqO#CRop+G;I8o@eLi)M zq4_jWIYS)hR+`V;qu^Hl>rAzyW{jO&YP)?#uYB%kWcWOcB{Rir^M&~m%@?8anc`^o zFt~@SGjHQ#W>xFl~?W7v++~W;K1jGGC+lDk#$l;#BjE`4-JL zp|%smiS9vg4{n7reH&^#QJiAF%bV|5nZ7TW@3Ve4PSE1)YpUx9^CKFQ64S_wZQ}e`m=2t^&onM1a%@gy@@8%CQzXy`$iL=}aa4Ra7KAJxQ9dz1* zd!WeCn1<%J@Fwfj{owAe_|4c5sAT>$v{L&swAT6Ja(AC`?p|>BZ9%6Tz3NShhL(ps zUtb_Dbj9F`D;q-%;|PDbd(iw9Ubs*!ba#WhyAs;mJ=|pXa+4+W`PT)wi?=^pi&f0WUE^`w}X5tESej|5_c=OTeqxIR)!jv zh^1ELts<4Ox?nYpPo-x**lJXpu@)^M7_3yci8U5t3v@eY5p6Cg)otQlo3}O4=7Un* zCYIZpwt%)~AnG=8r&|VYS;gWexubKdUETD42T?ou*PO^7X_ z9=4I)6>X!SQyav$wsCA5)9u}C6STVpo!TJYwoPp_v`vFfZ4j^9=C%de=7FRQ;#GGQ zxT`9bKH3(64vJE7R~9*1N1$yM-ejG+0^Ai9zZqL{zS@?y721}ewcZgM-Q~8myA0gr zThOW2^lBU17A?UN+#BB&@3~9CU0SJ5wWSx@xl7Qt3opDUK6DGgEv$q#cL_JyW!z+~ z=+oX^jFvX=Vx9U_eCsZi$f8 z?#>5y{uWe<&38C2>A@vGh2c0yYM z8vG!BbmxLQcPmt?Q>c-4;kTXhwlk|#mxAp=D#dx+vtmn_iQUI`MN7KNviL*%geZ&u4ioV0jS8VSCx$XnSSypa>Xc``Er{`()DR&G6ls;6h43RSP7v zgkMk#L`9Lb{qnXS%cFn6_9uCa6?=#dvF%ND4RB|mrE}6r9+8cFZzu(^os33dTEe54eg*z5)}E8w}b5vv;-lLE^{P|I~CliTad(%KwK_DcZzkT zyQ|0UG?v8a{B;Hu=GOCX&(W7To$4KG_eGm!nFPPx$?ha~V&qQdCr{$96X{7y$b=nc zhoc=P;>py^yNf;S2)iHJ5uw@XmOH_YbjO1`A;b4e{B|>@jT=w4Pi#lhXOx?Zc2v-K ze&IN9$7MQL>bVO~W2x^hyNumjruTTVsx9FbJQWIYjNL!B1W4Ee?15+xVDDW-x6vMC z52mj$jFGp_9%2tgdq|nL&K~BDb;qDRj25f(0(tA~;r0l$ghaHb_t{%FhyIZcu^ON~ zqTE|I+m5zwHfz^}8Pm{?4s5WuZWg#%TVx}0$FeXfmKp7#@6U&u&D!8c`Qbaw2x_hR^HvAqGd3;c0N{O}8=->Yo`M*$+k0eDt z%1%d1*dB-0?jZWx8E%T5iFQU9wp)r`_UPCiO%Kkpv(ZxK3B`L58rI3qvB$W{ZW7u# zAw!_0Xm5{2du*6oT9Q+6qMP8xgPWLzl$82E#vD0k^0DJZzSITMBfE|rXCgQPjL_0} zyC2ojQS1>rnztf1i6^7k^f}IrLwj7PptI=Zj#Sa5W}5J8@spiXu!J$}3!gZB7f zsB{tC>-flkV4I9# z0tv5--8c#|a#J>cb7m--(xlzt;0~{3j)?7aqU|Ji7+N~mhQ&UB=EjrVq4pHCCkL?~ zBxc%EV|yw+c$z&O?P)>m2Z@Pxo;|}I;%LU47sP&$IKrNZmePpGbfL|V4|fN-1Kk1O z4%#ZQQ~j~yjq)wo87%g(;>g%BJng8VW6S2oS#E!{XN3wTiJ5McJ=={0H>yIT;cR+g zz9TDx@Ht-JQx>vaV9!CjAV_C2`Kv~N8?m|g&Iy8_BBr|G)^P}a5Ij*8I|}xX9c2lC zJ9P6mPYFd27DL=HaKow?*J5`Vb439X_FQ`&+H-k?4o1|zZm1g)xqX@Sq5L(3pClB~ zo^NRtaK6Zls69#ZFSHk-y)ejwICO*U#cmL|!5LxMxk#nU(u?Wsg>E3)g@HnTdH}cq zRT_n{8_3KK;zqfs)Os3fFNy6XRNSTZGPIYLVW0MLdj(oTamZq0?9*OpuR?oekUd*d zSKDjQhT~~6+v!@@-}OUFe)8$r8`fTDuSa`bIriDty1pd*4EwZ{gwY{;PP;z#2J1Kk zJ=j?#U=UkVy}|XalBLM?XNi)t9ql!tnHl@+WnHh5W=2au7I#egaXrEHEbBc4!HyT1 zg*B9ZLt6rWQF(Sz4ZG-n6Vrd;#B>=c`eIAIqs2k73H!85>`iEw1mz*@)83r7H}hI< zX~8aKy}GGfe|muHvBiaQYzdIGx7cN9ZxN-~r@htQ=DNFXXbEZTL%K-Vr@h^hyON+p zR!_FOx`OLkse0ZKC?xFD-kG;|GKF^)>|GgdX>SYNnXpg0JhscJ{=4lxXbEHF?n~IG zEw=ZfEe>T6_G$0S+xxhT`wRB|P{zI7bBpM4VIQz7&^}O(eePo&CqiV{r(IEweRi>~ z3*FDKPkRs5`k;LX?Sr9K!anW8_7Sv%{*_>#_EFc_bwc}S7$gY$v@7jnXjhhFpL^TK zt>e^&4EwZ?2Z|Z{+^fj#McAi(EC`IT&ppBIS&6_R*O^C#PTYczl(*m>;P%*x7JP_! zS>-yST@`pC?9;BcPoP~L20+3-?UVK?v`+?0oRCiYwCmt@NBeZ(jqj|nYtgPL$3ENJ zXY8}qwJ+oDnZO-mpY4hq`JT|00DFvmwk>jP3H!8b1Nn@7wgK0sQif?fjoj|c@Kd2& z#y(qH*P80fuuuC$xgc7BYgI`}vFph5M0YN(8~tXN(Py1&iFRGk=gwlNU2mUrEnIW7 z>sg;8!ZLf>=j{t<2{vSX?ku{yX5gA-c{0I-8dsLYPN$HS-0CxT&iLuGC(oEpHXuQa z{APF2!!-rhbc@Y|_PNkHeZ)ZfqJ0VNi@`_Phs@0l_GPq$E^>)|L|@kgT$3zXYR-%~ zW2TjXbN1yRs=lJ1+pWm$#!c{2xs)1%YrOeev1`GyY0gq=$pX57KCjqU(Y{hX?eFRu zxm_Yh#|uQR5r6H%Prgc@*X-+PUklSdLBRG6`zG2q%BTIET|?IZ+|FVb!V@VOclP*M zlPR-y&aBDPCyE-Bkh|Z%Zp5x3lhJ^i{ms%zy^Vbz{_9V3* zyB+N(Xg?0RQd=~!8||lV2m2Y?jll=WW8dfY3$&jHN%PpZJvfS{Xe)A+SBLhCKsk?r zU*;{Lf5rBzg8hmq|1>aJU+ieVw%?%rIuuPqovRP7KAV&>6fI=n0c{EV$J}lQZo4g1 zAG;m6B7!b?Ol?SfeQUo%`)w9%NY{<+_x1<0-6>>$OBr84rxVqr#ZlOYOJ62fAC!rKY zv1xU{)yZ$5p z5}|roR{{mvSuhBytSf;9K(L`A?n(xnsk9;lDC&aJ`~EG zNP{DfD4n5A)Qcjb8=*!yZwj2Mw942KCW~OoIu6u?0z%Ewj?x&mfm#ULlwLQ2+E53f zb|{`ZjszzwEgqpxS(kyjd8o@A)hj@~tjj>HPz-mO>foyX2M>jE9;$(>R%s>R;6L7! z;Z5!!Mc|4=j#5^*Wkoe^)EKH!dv5Dugl)?@0&Iss`BSVA+z}#hQKc2ej`SzC36)YG zwnw0C=t>uqBKarzJ91P?l>EbAf76q&J$-h79T9d2U7(lf3p+srgq_N|K=N0TCLWT% zMDw z&G>HVCalWz;E>KOp&|%E}Phly{7_d1%X2 zw<`d}{~@$2?HCQ9J?xG^U?1mmn+ZRj^MU_F-9dEdYUQ zboeiH3eusC_MltxWAXz6!F%kp;XB=-2SWEy8Ew6nd=JU@RZ52tKvpK&dN29TCf}7w z=SP;#56tRb<ek6OkbIN*y2{%voAvVLZI{h?K+rh!Ouj}S z_;E0i+D_~ay%2f@vf7FE$ybnkRV7(*@-=s2!u_E)^g-xd*4>jYlP{9bqvT6w_Y3}_ zNbeZ>(5El-L+Bg2dp|J{`ojPOI&!FF#!Eg+K20`4@>#|Nb@vQ=E$Qib>ggH$S~BY; zpK>SP$l@FzN;-Le7#IWLkuV4bBM=_R3Poll41u8t0b!);2=>jxzN`Yn3NVaI7+T&S zpFr|S#`(W1C+wGUBTH(A!BoR=7=b`1%ZEx%8*kmSSU1B63@D)OB};V^^} z0Isg6m%In(P1h~Lzo)IxK^T7@@n!*@^X~C$_n!e zf4$6O92q=tRI&kqP)bIJTG22t9cCmi!At}KJ2*tDm1qk`!z_fOgNl)1mAnYai&c&} z2(yBs(cY&pI}fvY@S0PAIjpNQLZ73k1~>+eMK~rDyu0X-ya34ymFn)X#D3WPBsvbl6<_yF?3`o zlqcC|A$fL_=d&rcY|IT4>10jvbn;Y`tYN*QjrODDDSmPuea?V05zYt`>>x1|&VsWMN&qWrhvdoR ziDWe-PnJ%wSuoGPCfJ@sDWs=#f_;KYO;&TWpDjuz*rQ;64D+d?1#k|+g7OLWTsRNm z+|YhR5uBfg^SS*lD8L0=!g=MbvI>$_8R!459R6K1PzD=Z2p1s`wiG7VDR6P}I4nfC zIFM3XjE75NARGuTh073Vzg+HcwMlg@hbxlD;7SC-g1Ezx^9HVhs}V|Y6*jI{Lb9?- z8W64y%#iB_uE_&oHN|jk0j_0ct_XbB7fs+gxE|rUp!M}dW4HkpA>2@U-4GVTjR=dw zBuK|J!V9J~^P)1(H7tW$5tfyCu9Ju0Hk)KI=vm$5lIObF zo_??>c~H43c?m)ObNUOQn z8}5X=5bi9!?f}c-ZUh1ccuZ+7+QU6ij6iPtaNP>-h5HaF+la@Q=AuP%KP2~8Ndm%s zflJz-8t%`-{Vc2p3h+P}V~T^YT8VbB0v<$I5roxRv`g-Thir0RSwlS(ifJR-CifO4 zL;}Ktfes$eiyH3Cz3l8YOvKJ?ndQw5xwC_cnaakKzSF@6P|`O2u}waue<1(+-{TG ziSB9Rr%yy!Q~F$YSPL{Zt_>XSBf2NI!Lv5WV%IZOEWs4Iif+lRMaiwA2!W6Xrk|n} zl4X!AtAN9&f>k-xk)#0VbbMQREbD_|FqJOd!lBHD& z1%ZG9?jZfe0C*t}A zko0gG*fzk+$&!QyjtxQ5!^J`H3cQN&N|4}iaR9squOqw`Bt1$TkSw;z;xb8-ACh%x zxEKX*09nj$1W8jyQL+f$vdN+{U3x37n8Xco*J7AQwItdZ;)oxfYTTeO{S(5Z((F z93~Ej_w(>ROZtNXd?4b64H4ccm-ID|TvKJE#mN$u^o=}|-NaM<;}x*8Fcip>`_+(K zoq3l7ZG1vAPlz#GM9uVJauvddVM3oOj)IR6J_@f+71NR{A-Qr3v|PmvekOfBhEEW( zJ?~-?ib$?VE>A9tk}H_j%lYdve)1FgY=ln{HkMEQmnN4a3!~&xe&`bZTF6flmH?l@ z=LqEMpG*brD@MQ<@Fl_*w{jmNd`krU06!woIYvC;BROb(f}fLf;1`6S!h}z!M@{wM%%DF6g$um`c0s1JX}K<;`-z#)*Ilbs8- z$UN|LATR9zl9fDQ+ir1t@)75&*VIg0Jj+vDYWb; z+LSlfJG-L5GP;U^vY_Cfgbcxd0?qYA{hXjU>m2D1b4{LsT%6CvM02jFkSn4{;-P^8 z%n>%g{g!@`vmiMuvl}N&o<4c@r19g%9y4dojOilZx8%BKb{!{YbGx3yvil{-Zb#8H zS1rzwgE?0{Coxw&(6OV~HK%eKb1DoLJBnR$hSGy_P5S+&Z7S)&u|k7(g|&tBcy<7C%Y&)6OuD4Z~h!%5iAI@b8?Sd6+ANMj#JoZkt>!%xx27KpxIq?R>5_%b-pnSBLrpD?^}@ z1dX{`?U?jHxr$5^^?<*Q!z*2 z!2p_9=}vM=Zu{I0HaVqaGq`c2=3{104URo(vn);^w|$_gnP{Gz49Uq`kb=zZAc~Tc zay#aBvdKv_7mg$EHRg5<5+Kts*C3xG?VQ`iCUn}b9Xp5M z|J=?Z8b}nh676%1;#?!*Zr5C6%n@L~%0zZxZnu1n0Q%xwlR~ZutwVZ~p7Kc~JQ_3< zJ?Qsoajr4F*EH7*b4|m0w8GCd&*#XkTbyfA$hDyCj2^6NajqFX*)ll+b1eh6Y9G!kgLP%_1@CdU*d$B0-a zoJWwH#$Tt>0Ff&Jmq=X697yKy)SC-K8D$6`GmYFEajqVH+9xD$3Pa%`e;@H}ZueY= zT*urVnA<%J`TK~zxjl1xVQ$Z0`RpTl=Jw8Y!rb1$Lh4Gk=q#I1(5@XjX)=-4DTt6_ zTa%+9Il6+1F}GJBzo+Pv>zvPZX2EnRr!i@Bkp4G$8B=7!~lV{TZe<{)u!G6|ANl~#kf;h}}- zWRqlKQ8H1`T(WN{>FfmOPGjsdr4#3?0q423D3}#Vi-06qqKaY`6J`+;<{VZ9bIv(p00ZWnwY#s0_to@X zc7bK#cg}nNJv{e%XLhE$y1Kf$`m5?{$~ z1Wh}A9FwV+90iU6{u9}cfL!4+kHFo$x@Bdf+!IwF)fQ=DA{zYj)g&Z>zc*&PT41`QMyN3mYo5ucGMWPD^0 zxeLV==~3xuN{r%&=SsjSc;Op}44cU{XA=-tj&< zkTP3bo{p30IBwi{la626WHJgg9bG(t(xbz;yIOpcPDrbY`xggLIw2fpcD1-ZotRFd zbYiIgYB9IiKPmPv4UHN&ur}0#QXtCA;<@6wbh1o=8&{`OOge?-vnuGoo5UCC)F_>b z`lqFsqNar-@@^8ZrpKno75Ag`*f5rE70;y8)8i?f9wz-;#Z&1C#eIwYC_N#FI_?zv zrZdtL<6_?iMSVt~>Q-?_dXh{}VyaFy>B(Xc^fQ};B`b@Q_Oq>3_s$ducQ6?z=GF~w z2(6u(*_LB#jt2=33_kR?);#ZAo&t<5_DN4kPmPOxxIgm&a7q{eI1(Z~ElN)VD^5?( zp!D=W=AEKCohj3qOy-#;JyWExUYUrYTy>NJOij-!LOlX1WoB24`_i*zdNx0Qj!DnK z^L6ZpsJIUg96-Cp-s!pNthm^l#W$aJ&kY6KFCHlNDl7KlfrAt4i+iW%6??`-XylrK z11Oa%dQd!)o-b3Zf~(UDOnSj;4V)rewuR!p{KXE`v}WT0iYxX=iaqL;Wo+`;4-fD& zdlkDEyT!%5(7zmuTRCAu#g_ON{(7F^--Tj#9%=|ZE)?-vlpcf6g~dH7t-*ROxxI3i)tQhNkO}v+0l3q$FAX=XAUK4Mpv(w8cogK#D>*DQV*SN^p+QS$G%F7ep zYvT1{m!#OGUb-(0e0p2Fo6eEx9Ol#ICcS*w4x#koAm9td;`EC2N=mN?;;>MBSnM1X zftXQxWv#~FEh+A{g2vy28@oFQYh^mFA zAbmil4{!+&n)E?HW%U6Ey|CKk<3?ClRbZPE!wMszMp#?*ftDMCZA*M_mFvbDw3@lN zZBpEJ6)UDFod^0KDsDq5;A&ocF^KSR`Us^D2l^RAcvPm3GX0O4^s%}i!Xvdk)-EZw zTdnoVHr(GF8=l@7_{bo_<53E{G<_m{lF}yv9SkBol|D@=Q0M>}G*6#NpQZGf(sf1p zT>3nv&jmUeM0i1_FEE`in)F2+#kf3(u=+gCVTKxHnqh{vNwMuJMdsN+2!jnT$rQM8 zb^5YNUlvpUXRu-Q32hirN&%ghhSb(caqCqI190{9m0}x8UkRPSAi}HZYm~kk+QuNl z>oR?v+xCV@-&heuc&)a^t&-wat0fX`AQI_q_`I3EMQIJ<%pk(s={uCZT?-;CC~jHA zf*R*jlt6@5>AUHBaj{i{_Qbn^CI%5&CdHPk;6i!&9wyZm>HFyiaj^wYzWE~V{lEbR z5f;i6Sao%}$fS#Svi<0(L&GxOZcAi}3I z{gjLO%%q>K%*D5=ejQrNAi`!z zakJIx0qhMZPd`F4ny25S-^Rt}OKpj7LcI(kd?(ZIxZdwg`u%Ex2-^n`;ailvY5GI4 zA}(&q49%^XA416tB5YDt+=OlL3ZB{0Qrw`PiYWyI${oodf|aRd#yFF@Qio9bb5L(R#igl_QsB#JG5w3u8hn{Sgul~& zDE&Lo#2~`I>3@{|8)#w>p;=sP2ATqh@L!;bL4@^_;`;T{^iM6r)=P@(@iWV9HHcDx z#_19Qcb9}A4k&>N6cH5yA;@n>WwZuSSs;X=gr;$^DG14-1X?3h!cfAxNpanJDj@>o zT+%!1B*k^=sLmQpp=K(tffWb}fYvNFA*u;5KUiE!<+N6@F;4!bauLB|1gtQQ8WECA zH443ojlh&piYU)e8N&)$Qp{FS837*8d+rdptV~(a2u&1+A_t43h)CiSbk1OLB&nh< zDk2rQ!*?_pA{{($L&T9qNm*Q!;Lp$zgDZ$?@YYH(yhvq5f(MyQpm4AlQcRO#S`W(# zMa^QbAoe5!eMoypjU@q=fFSbtI$oSe8%P2UTumDq+E5%P{+HR2(GE7KwnZMCRpB4CXTuIB)>ybK-Hi-zTj4F!dL=~Y4$e>4?N&>1} zP0bBKw~8DgDTmS}2B6oZ&1mzu2-y#+kv0o2o*`xy*C;Duz?IYHc&?1LpcZkl4A12V z2_c@Hd32^YhgwQ%$rZFR)M~XBdej0XM%21kh>H=|%m@j!4kex^E-b>7NA8(A2uT5> zwAh5_Y5@MUC2d8tWf(Ve#C6n$wkB#5M#&s;HMOO7L~Vl(xm;ZBm&ASvs>u~BwF{Co zM_lgzOZ0tw^9d59hjD#4DoV_ zYOvxv#kbTkqK=@V6YWfd$a5^Baj4`wvi}&6U zbqPZRcf6&pw0rDrgF^(EF?T-z1=>T>9!%AqhW12C$Nx7t$?6Zh&gHbbDD!_(H|iey zKe^xYfzmAulzHM&+AE^Hz^oqBlL)9aHw5|fXm3e-b3=L=>a`q_LeL-7+y6n-J3Rk@ zc$oH)v=2Yu$55YT7w(b&g9li5(D6I!p$Bu-RBPsqzj7I+hSAnq_(a!h`@ZS>+2*%I?2<85Cfd9^aOSFF&s|&=( zbRZo>bYK{(3&cV?m<}O2IE>YI#X|p0?7vw$Rsl8hT)sfO>%UI?*Y(nUP~hi6@ev&= z=}_j=VTKM{wnK;x2t(jg@g*Hj1Bng~;_#{X+=LvmPIr?qT#6iNE$(OWZ)T)78*&Th(?C$fwcIK z{YU=8#DDz1ZKCoYF##Vk0i$Y}y(saE@+cRyq5dsUGy)_YMWcz1T8g*O7#iyr(m0|q zLArpq(0DqUXnZIdc#Hoa@gFo;G||x_R{%g;Xo92(EI(C-fQ1o_U5d8Q#E2$>hDkJ; zXi{Jc&=#6PQ;DX85`ebQG)dFAgkuaHQ`lS#$Z_D{)vtgtFcs4}yFeG=olK_? zAy&EuHKJ4LG@?^W*A;X+ok3Is-UBtFnUWa1r!x(mi8#bwd9O{u_x~m>oj@F&5!wdK z$S+9zf>nq;!moMW17bvHNrHc%n$9+KcA*t;O8WnTyE=k=-kj3K)C2UNpPW5)A@$ZUjgBwS+zC3mH4+-OMKsk_|j;6E}#pE zE(ld42!<}Ai-|5OAzVArCH_tS2GJ$K5^ODY@~_jSG&}aMH)si78fXH-|J*b5<@63wM+h~|d(+K8>`T1nUPd)FDd4w|4wdq%{w@%8={qU!_wK*jva ziGO*uc=`%kcXQB?m*@t%G4?Mlwc2h7HDkLY-6ZKIuK8v|H?Nk}MmM6w7wH!NLhO-b zq{d!^Yk~(VP%!^|nSUNwm4AUPg*W-@4OUAR*Gk26iN|r(E39ZDx)9C1)jvyAT<;=w^UuWonWg60J)vTp z*x;W|{L}SROjP5{*iCe$dnMh=47tzHeYIUdbbC;%-LO`j7ZIESG@tG#nje-i-NecC z06j<#5j_wd>>)|u-9rqa$LMjQ#{&61#2|Wto+NrAkbjsMxb3jE1=v;OtUSTdT z_YbnrJjP#-vgAA)YJz>~ABcVF=zxNMf}ePtpLo1hw(d{-{du78*vcu)Cb1TNuwfa| zqv(p4{d}UALs!6Vp;zctB4GJE6(ab9UZdBEUJJzy6~q0!#LvqITdn1q?|NEpV=>X| z;T@da;O|TPef5$+1TR4i?C0-I{JpDDa^&Z83z3+qwC=fw-tg72zo&t9578U772Tcq zyE*=*9KPl;RY$U&P|Za?6hvX7IN9GtZ_-<_zpFtN`erC{qL}3GO#Ge86j@G4r{nLS zx9OeO-@!vKU(LQ96y{`LaSI|^0RF%0ZzqDgfkkJsm`3kOdXGiteM9eKF|>Pb4zdY3 zA@aAg?7f3>Z=(af-jm z-{@~B_?uW*Zse~Um;*QS^fA##VQiiu&Z19fF%f(ctXgJ@ zv;6h3zn}XNK6HQSa>VA!z#CUrY3P zSVLSO-lH$*OMi`@O9U4Nqcj%){QZi)Ci*JWe}TBrU!C}?S7A)S@4;-pP+UUaNP^#@ zn!YuJr6JLmL1)boZ_{@XA=aI~ryq#E56W$hc#M9epZrxsKZc=mrI<%Q(=S9n2Mu$j zxR-wQSNbc6ehp%UJN|O|jed{)xIkOYTAHT`MmPpm@zcZ?=j^`-f? z6w6ZIiiUMk1>zT1T+slT`5iJhhb+0+&si$VaA5G{e~q|>d_?e8P?7#3DhBee5!ch- zlKy7$|1tE>^2iLF3iPkPj0oNfZtnHsCi+j(fBgIsLrd^{9dU^KWi0y+bj+4Q7GgiU zB>NH~%mv&kZu6IxdDu1O5=VdgOJw9Pj{PNgE=Oi0JPiEY?cy$3CMA3o)p89Z*I2DN z-t$%re1b5^Pg%p)P?>6e}3#QY(PU5`~^G=&*v(x;<5OHh~%37 zJd!mIj>pB@vRtm^XZdqU!ok5)|Ks90xwdRXa_ula9~V!_SSBRnFg~9UPx*6Ve@`A9aA>yT{1<1_!~Pm}BVQxhLD^#h$5 zITooN#t$1V62LM&`J&&R-6M&hb=lOPLb7RX15Zx;$@vU0c=VLP(_l12{uKT?l^L;4 zP+d56My@B<_b2%iNv;<{U-{3?^vPi<4(E~KDAriSENyMx($w>R| zPmmk=;}d@ZZ)VEPpvtMpWyST&jqusnPbax?D0)p%?vG3Sak;HOc-Xihm1x?;apOh{ zY+1$?+BN`Jk)O_lAJ3GnAJm{0Gvy|cgquQE$W2LB1f_=zl(Moo%+xhYC+AzPA!i(y~1tce&YTgle`7?Q052~EWyxn(5b zK9F0!4*f5EXu!pX#T?ei}yGn2}XO2M?V%nQb?=;g&2p zuf~p>%5CJZMcGyW4#~H^L=xTz*-malvR&x0=Axb4R&M7f%k4>S8&o@X#mXK0BtMZP zkbG_&?)a+2BR&d7MXCP_eiF;xM6P1Hz^@jfwcJs*CkbZ)t0JU@ksYM$!2H_D$eoZv zn&bLb6=&a`UE~-H5xVOgSFUZ)nvSv)$&R6ZEVSg# zQtr(4?_%UG$bzxz`cZGE+Io*pe2AD|u3kuEBzKj&kwo%M_Ofpy_K}@s7e8KhCD}R1 z?>3^nA18PBV-r8F9{JrJMeO0nkc6Lt+lkegAD#HotCU~xHu7V+;ax(*JBn^{PuYzm zg5lY)?I`w;-Q`{+yO*wakv(Kjl08CANK)XBO8imvaFk@vz&xZTkb6tXt_Ru6$X=Mi zmbLST=U5p>iZktTXrKw2*9q3BGw5H&EMyDN~Mm+%7TA$ zDI;Jm1{^A&c8vLjO;NnsV7y806{HwjbY*Wp%8w-3J1mm;&OWjaNyM4+9-Li77una3 z@JEtFBt0*=aK{gqaElDbgp%i|k^KV0uszpTCcbhNT~qKQcuc_LCfO&j5g9Z6u-Fen ziFqy>KZ>6i$xn2v6|lazB#$hF$h8`M& z-~BN7y5s*WHvvnAT7v_rG{grdesDdcM-rP%i!{p&44=X)!h#cq#dfXWp^k^TfEf4dD$|GWbSdFz>|9bdP*kux~ z5r2prBnQX-5Eczy56eM;^nPMre{kXtu7~t;IT$YDX;`d*Lw3YhSPixP2ei%lk01kHIh55}z@?H_0(!iWmhe zW2_wKd-=UdBAqjvIHSaP-&2nFJrduuo+)BHia6Rsk;5It;{>~}efPw7ufOB`UQ7V& zD3arXRZ%5Ql@lU40mW2FOz2gCvtYXKCMU_s1>cQ1I|=LXT`H<7Csx!olqx2UtLWFa zf6s#|#t)u2qGH_e3dUC|_82#Q+JJHWCR7fuYE=WZv=03~nK?hj$SGLM1ssSGAjUTN zOw!644KM&#o9nnwpMRadZaS-m*>iXcrDd~y|M6L$!4!_+GvV>qF^lPhprkMi0 z5_C%INWvc`r^;z0rv`0NB~FmX$YV(&s2+1BUYahCldu}$m*F-3G++vQ#(vK*2r;gw zhv8WzrujYO@v-M@^*R0~j}M)I=K0+dzk9u%K=Rn|6pHp;6W?_egE*4YK=28^3(0&_ zh!8WxslKz{&F`A{&Ut|PlnFSdVm$L(#0T>4ocEF6jeC1n{_4VCy;$(DVvT%n{yK>- zPsA_T7@rvuCix8ReT-00wu|4{cPjW@_@SNos}nzYB0eX{lS#rSfGG+Ce~3Iqo=WnR zAg%mnM|qmxDe)ci*0YBfNdp9LuFtav$kR~7>AnL=xRaQ@{7U=Sw`cZFm^3!>9hf+d z6OpF|85Lz)$ulB}O(AloJd@FcrwlDQ}Syh+wt6)yP}xcva=iwRLTk_^t9DTgBdC--dgv9dlz&;Krt4 z{cVwiFGAif?;v@5pkq_fO5Q2&B3YBNXH(Ha-Yu(1-W_Z+92G9_k@u2>GlJH}VJiiBxUQ(Iy^!!y)=_^@|8aI)sF6&1nSh3A6j1zw?T znfNVN(fRP0Ffm95DCbK#pNYBO$osJ|fW52nsyi?zWQ9}!B=4$ab?d~p&UIb`&TkaNdEE<=h8hWEX+MX5dW zwO7c$&@!Jh!{&(5HI@+jXvXCh5^r{0QPxVcZ&fadrS%wFQejIiZ>D8oI1-s?Z`lPDRLx4j|2pmLs1*z zDcc^Cz~QRA-o8uATCq))d3#2nJt5FF&=poU%kGg3*6gzOCDX($TUHaYM~p2Sj| z5lZ!PE)DMM+CbZ}%k+6|s4Yk5aBq#lfBc)bQ}Wuo?kc)@@FPPTFb#cCU&+QQMc0(x zJ8#UxRQoh4&USQ+`%!?K1NdRjkYy5h6 z%5RkTjaDor@|!V9&AE-Q;PbA0kL0_7w(jC^`M&&s>&;{$7lqa!MWkOp@!^Pvl}{Sw@@iCi4}b@6)cu#|B0v6E+S(N}&N$xqSP&*bMMKMP#k8wkr6 zQhvc){L;uTR}yJ0KgWAt$*)PmKgZnfC3?$mr2K~8`_{;BOIu(f`8A&W&I6VIF3^qR z%Y2i>H(9OuYaPZS7NZ%B<@XYiu#M4-;QRSLl*U*@miTPNE-jZo;5{RM^g8y2xyL(> zZ^4(94WaisiR{z3BhunZe0hRQ#sCHZF<6-S7nK8=0KJ;Sb63HKXYHUoh@ zB#BSzshH#+fqeMwrIXSzyU|8pVmC?nv5rC^qoPT&7)fk2l7Gp+Ny0hD<7|{TTK*&d zCHYUFX_Ocz|C38d!b`_%m!rfuALHx_(3I~ul1lxn5MXhbr+UQIb1@FT#;x5%l#VR2MXBabRy0}=SkxD@kDM^X~gQkmf zl~S4%Bx7j)*xAacjFbt3f4VqBHTG+I(Azi+e%$e8K2l9$U)CV5hGl5Ef@{hb)H)u1 zo&uPh<7#T1K>vy26t%8Y>oWaKjcSS+e#KdJ**KGu1zkID1#5Zf{8f(Fa|rgD{Iv!% zBnx%H@9&nxj(1})NJ~mD?L_xq;{L05r5`B?cCDw@CzWS)Du`KPmit#VQyUcAze1#{ z8T5s$7z(_Ep_H(KN4urkfE%@;Q5zz!SD4mA;A#L($LA9>;EhPFj~X^||B%`!tUzap zi{0O9WA|6${?5|^*K+88fw;);6pKp8|(7tW`n-QKscGlOW(%Lhd$I&D|gFcT(8=1EdOJ0N1I_ zNFk*ZkSJVTt2S3#kb;kmN70qyD)(FBep|LwQd@+6yGmT6T1eG`+1b*lmLi2cv^3EK zspdf_vB|~#s#>{UV)tu9Gm>f*YQ-iP_jBTYUbfcA{lZN81H$8e$1hcePiwU$sn($> z_lO77R;0EHW8)riziQ)tazB!46B@^NwpMLPZ5^t)N8IavNZb!ARS~4xhIZa7=Bsv6 zwc~bfV-$Q(qD{g5#FYHVl)!7Kwsqf=f(wtQ;D^Qg?mM-e+CFyQHQ3UYiL+rj~ zwa*bms(qM{9~aN4og%dp8rIQ$L#oE3hX4T8Nh&z#s@2X$?F<(&Zya;qur}#{^1fEP zs9j_CHOk9pIJHY?;q&4J_f?t0{9LXOS>V1@yQ$8x`x4LPGpO1vJoln_MRk#?3s=z9 zsIIGHE0!zx``j05clUYhzTld9I$LJTBDUsuwBv z?0EXZrV{sQ>^=oW`RRbFSGfPN_|z?q-C}M#GLl598*1&X_94|f)cUpfS@ltUN%es! z7lim){HXf5Pu$0(`h}U2@9eAgBL!C!q(*!resmwH{;~TAh32ONDmbOs6haCQ_hFg) z5T^sG{X{;fzZT!PMTuLqQn@cUYz8T~kC{Jx!#gO+Elk|P{2f4!V<(Lnf&=Rt;b))x zXQcK)D+Z|jNeu|C_@%I>IzSyr3VUpL^7^GvrVdgElR792&|kz7b%^`Gy-(_p&?>%j zs5*=k4x;Z+D2QLh68D}uTn&ufdrR9@<79E7=-w@J?_x8n8W@`Tm-x>uD02&NE}%Lr zkd19N?w!QF(?C-{;HJLMO+7div!oEYw`2Diy43) zk-}ysb%Yv33eKw0A}W*@%H5mp4flG%y~$O)!C$YlwitxZVD}oS!MR#4ltcE0sG;sv zHH;LTQ{C}od0|&osfLq6)+j7vaNSNF>0WU!lR7dF?8xtoP$NlU6Ab(gxZXsKQb&;* z#g+?SD>Yh;AvL;GLZZgHm)wh_#^&tC6Nwt9FjB_la#>ibkhm9O_W~N8@2ghh^M>QO zwcPWGdw!*TUvMvR<6dMYj>(x=z+qqRxiW{SV^T*2g0jK}>S#5A)X{;Utk6_dxo6!o zq^bfzd}pGXL~3FnsBxjGdpdScFC}PFASf#|c26blsRjsomI-=>37QZHYFcRKo-A`u zVn2@>83<}#*h)=SQ%Fq?1T`+IEEwYPx&aJwyub5hjiA9Is9w1*ZsGR+@UZ|3tgi9)r?5Z5Rp1jokR*=3h2f{mqIsn zvO0y-$>Gf|g+0`%Qo*ZGtxhxQG%n$koCpkl;pQi9e!eb3KG)Hsmo8ouTpj9kbq1-^ zL$Tcpz0^!~CaIaB*zSd%>MW_?g{W3%8+A4pduDC1^Aa~NFBSuly+rIP<3R>@hB`-` zOA5hhfba{wqqWp5b)LJ=-Aig#7&5&JmFj$T0Vy~hc*yiF?5{3V7m>O!aJ_e7Uv;s& z$5oTMIB=csT%s-|bxGj*K81bV-Ld0@>0!uRnp1|7_HlP5?yd#|;vQ7!s<|~6g@*21 z7~t+Kb9eHPfdhmII;b#M%~qF@!tMyx0tXciS99DQ?sigh0zrJ|a&-kMcp+E}4lW$- zZi^j9?goP3Z-60(HxG8VChpb-2)cs_x}6ESED&^fVUW9}%-zC6COB#eBcd{OWu&eI zbFWfYle&uODilT(M!1{RTy;&s-7H{u&&4K|O)B7>shBvTvSRlZeJap96~mDv7&k^% z!Jj!2E>X6`ui$b;iwWoRa#KgE+g29&A|-(LQo(Uit!_5zW|095;~)tJI5}JF*y;EL`v>Q2~Oy-)?Ce0$;ljKKAW zoy^&kI7Ww8N8AKnOELbYZm%Wb#>Cy2`xIa&j2u5Pcle7WTy$gaf23{&HFv4IN!=Bw znOL}3RjYeQRp;PUVPfGzb+5XQ)V-zaS!$k|PikI}sfmS|>V9{F1LN+`tyjD;(_N~5dlh(h*kD|f!o~|$850Xr+_ka078VxY=XF-OLj1hDMm?k+ zj@>m7M(%r3a2oIn#}uZ!xv`sz7lw}>HU^(bNSK>ZT$>k3IvVyyTzpiJ2ou6~8Ftc#3yCQK{dAcFi0f)MM?LK>OWd6N%qxtINn=MIJ*hIMjo`T4KfesN#M3D58TBlw zXF|g+EzEYa6E`~-g_TnQ{8c^Ypq&7W4gnRj3wNmJ)eEGaFJ0fFUQ{oU0u;+iVRqp% zcS+(dsdsK5^->U!%L+HEm)*qQz#&u$?9fa|$=R3)O4t_1Ga{Ud<97 zdpfwU=N7Ja7nHdRmUvPCVENV!g`3>@W$t`7NnZ_=TvnLl&P&{R4X7uMkaibwZvz?T zVs0tiuHKO94eqx$jd~LhYYp%axl1txID~YQf>($aviRp_C2m&E!J4TeXMIw05g7jj zIQW)&o77vOAMYzXs@_oxNWBwUeqZ5X^{#r46zon`xAzwwcIU?KT(mmhJfx7Qi52yI zh5Oa}?i_bEsrLi#`OXJwA*l~Si|;GUb7v*)tOmQ3)WY!eyuy5UX5!9lkohk2CG zkPB*?Ju`7L>zg6pMq3v-OuUP7RI2b8bo+I?NHDQv3o?R7>PJ#Pl&)V ziTKs1U*WZ6T!-h1JPe9d*ga8rrtq@*&7JCCy!;kAmhb$o{vh>x=-B5AFT0atcQQH_ zv93px`XhA2Gll2fNr^itcZ%fr-;tGLLyU7Cd9YXISdMWnxKp_+PGJfBF%b7k;dS+= zRDfHnl{Lyj%~X)Wh7XpPHwp`sb0@kPq+B3~?|20e$p?boEG%#*#O{Qp1Qi28Zxr5i z$0zRiddG0VoycUMYe;qGGF*xHa%b?@ecYw@ z;+HxX6-zgcG_p>?+>X|c_SZ^lH&z?cK(Dcj3in87x-q`;>Tuo2jY-^?6&pgjan6{i zQIzT?Qa547tYh>#^)p82%#L)lyh(xB&3S;^TkG|8GtvNap>=TGT5q5? zBn=c8qKoUsZgk>Cvo`^UuwXu@Djmi`dczzJiyB9*^hS~12v2Y9jv~Er>2?dfNu)Qy z?Fzjq>55Qd$-GipQJl%}4_t#i)y#M4Rc&-AFfr^yazn=XbWyEl6*X zPq5KC(Pr*Q-BP!T-H{joIYzEq1{Q4)ZQ_QPx#5^#HSkl2Q&bT(ca>$X5)-TjHp`7{ z60PHgC2m*);}ZdA1;=YAy%|2O-B8l4!^@jRo4X;28&cmG1F{o2tP)8#%OB21(cr}8 zp~TCvGt%p!ub3 zpXViVgP0a9j!DBm0&Fg7AMNi3>UMgY*bQt5ht=(ZXta-Z*4ygsNN*d+X&-ge+e^JY zle2@-J77BL2D`l!NxQ7io_*`=V{d4&!q0HTM2IY^EoqtPSCqjyqpJ{MR6%;X&<7o( zPVVr;9p2#BEQbh}xx@61x_#_8ZF!FA>K%i$?h9tuoXw?}!0=$-X0vE#_=9Mjc1hZpyZy19eP+`+(_^e%YrAib;JEp{Ae zonyLs*YI5TsHg5Mb!V=ii_u-gYWV-lHIh-e19ew-K;^O_0s$_@^M~p^rQVZ??Phd0@yyc2TiwtQ z4*pplg6D9Y5R|fF7)`@@?kn;@T3(BCs5B=?;T36XT$jR3N-N@$aMcE`)KXDO?NYlH zfSm%Idc1A9-UICHuewRLk?^40&9bOz3Rl0sdOwGn`z#fV{X)&7qj9cx?0PRF82hkHyoN8o7QW=K zXl8#sfOLNbS<0fR(TRG0eE?}7xKJLro~{qn2ayKu3(FEO1(Vu$7j&$vD)jL50c zG`Dx+_O8zhtq%zFOpj*hgQdn0sn&-WeaK1z7&IVreW>e6`p__yof0k3hei4@+&)|n zBz<_8RZodt*GK3_}dW;?$yWJZcgku6#v!V<1IH`e4SL^Xc zkN$J*Pzs}_vJ|5RqAFU_Et}6=z`^z*o2JjHNFuGhq&Tis_Q~}YIy#V=rTP`>S_G^F-9MQ=Q&i0p& zKAtN&!RQlKYv?%+S9g2z*B&e=N7c^EJ11`EdItjbl0aYZKiA21bUVckS>IP`TNhkM zFw-GCz2M-Fjx?MddWP#jdPW!l^B|Nb>XTf1wrb@Fj01 z(F5^0%WXsYtWeP#Pz-15b4Z^Z=zAl2Tc0cSxlG?Iqi1o2=hSvfyTr9?z+l>jD??;G z$=|}5f4{7SJ}=Veq1N;D1*8FtbMxMhKG7HIi%4G>IQ)L}k-k`8Li*ys;SZvZT-(^S z1&8xM9eqjQ@cYpRZtKKtT`z|(swJ~c;@Yg7Obs+#U+T6ZeQ6Ma#h`MwzRYc@=a8Nq z)ZpUiOMSV%g7oE~>c!Egu65#Cue4awfX2CtKaIZ7S4w>)v+ydTITT-C7TEDkS#y1L zq=78!x%wK?bAt-}rcCQ=^>wZl>1zXnzAsx#U$1WrzBzVVG^hfBPcv2DM?dLXq`rlzy47f$RI)UYTWw%}2*Is_)e(YNO97p1UWPPq zAwYN-tbmp|)Lb`Yls5*2aM`Xo2L8VsVlpPTbV`B2jK{O}QnFGwkTnFB*4^#}6^cU{ z+~)c=eS7RS=i!*EP{8J_LVu2&z9Z5IP1kqoyGY*|81ZxTo4#A>yO|NyMpt759+(3< zydMcF7qGX!$6+;fPk8>f=udsG)c5l9_ZfYkSPzV2bBdY5hapbJRUXeAxy@Le-VU0Y z>v?*9>^RAIP^a@kVShz`yG_g7rmRkpc*s@g``sq7tH5)?#JxW}_fND$KOpr3TG zKe&48bQ2!tE%~bj3myCvFkf?3xpCs^OD<0OI^S{)9x14w$mzy&nOiq;dHU_;Q|Ic(az2%B)XF=D^dosL zhO&*yHjdo-+=BJEEzS6AOJ>)c@b@jsT10Lu-1Wp?JK#%VBG6CkXGlNI!!gQPx{hn& z8W-F;Tv8MMYK$lKGx$8KpCb+I91CDr-oy3t`UTQR!34#aznMAXfU0D9c4+|jgNGqe zLk(8 zfvQ8v;&!TE)vu98d&~%pBw#ooxN51)7rY$O59qj6Ta-$X8A~%_iqQ@BV(ohBGN$P^_Ti9(q9HT zkg-yKt-m4tb&iVQaMb4dTm2pBZ%fw|`g{EY>F)!b$XKa=l=?@e^CzQ!0=JjnTlIgt zcR164{vq%HnJry;;>uScir)odk=auJEcMS!>@PF|ENifKd;=e=9cg$gxN78w)Ls`!``paI^-lUP7r6rIzgTJUF{(Q` zq5szZ#7;D5=KLLK!bUT@B(Y0Y!G&`Dk0`VM>3{WqvHfqUy|s+N zVcog57*^3DG63+++V)>EHDEk;r`dlJ`_Jm|)c(un#(!wY-=>j?WBYf>j4+Kt&B#Dv z5@`~yIW;C-%`;7Q%+EA2h#a&55NqE}9Ah>#8<~yC0LuqZjl_Ypyqkh5ZHn zZd#&uem1S_PqD>;;vv@F1i)VO7JW@?XH}tXDBCru>vDqJE`y=YleF$c=+P?oGu|MPvixu)X8aOP>R;CS^JhZxi1Q&BCZ_M60hTcg*9 z4&RsC(TUqi3iZ}{swX3R#SWKY{K z&Gz<-*nZi7JxvC#fEpX!exBIRmy1xhUvQZlhcPk&lDC7|(SBw>C9^{aQ6C}3n)YPc zhk*1EVvOlvb|TXul!}lhyEw6nmo1e{0O~nJ$aIvZBQv#=F`cjysvB)@b_`;9w3uu^ zF+1CjWBW-%D%k8CYCT#^upcG%qh)K2EW&>y`x%SSr}$+yz-JfxAsImZY*QaAj9?Y0MjoEW$iheiH)Xlz2rd#Nt znPP$IZuYVZ>^o$-hg6R<#kr=3=}D$XsDGw7)4rY9w;Q%DOwT|G&OI@EOT&=4>19kW z7Kgop+BsjmX?jPdH)z<$^dSRad|$Nhd@;}THT~>cWcmh0bdk8->}&QTvu{v57l~U< zfBU9=gG~R>!?$<5P|2HGA0rdrHI+vUMp)g-F2bqIo`x;9HV+97-JFo&VTg)|w zLh!IjJvsGk(r<)_}t7MJ{&tERCGJ~WU#Lo{l zW-y+wVM=ZagDgvzFcNs20mbL3WI&g46`rBc4^{g zGb~heow(6dN>j-d4L4@^YT*O+MIKUb^4A+INc#neMDy(niG88o5rH#9_QM1G%=7j+ z`)q8VZ$O_F>~lO|Iau1h#iO}!qh1g%+6QC%Ae>S|#*Ledq|a56eTW(VFn>MDUr%!vJjK7B;jaaJ z`40bjmx<3pTFUpu2a&b7tDi#^Q_VCoQ-d<*{(ivTZ|4{61N`d!{52m>nrZkPV~!H3of!9woCy@bcKOwI;F(;c-$ebLs8uGi?YICYNEwIz z?%^ih9oxIX)}>*m<}?h#yUgk4jM&}<0nEcr4bXdj0lP2low2Dq^RQFP(a{E;fszSuYhrKB!#OA6RMx}zU;>d zgZd#FJu+|-m@~~;WX=pNPeoI6wmFB)*Ml(F_5hsc3A@Gv|{zFI1HZ zvbQAmmQ_|o=KSymiOk-dSR|O=MufoEh9Y6jtk7P7Ean1fF5uC3p)mma5eaK*-3j)l z#NH&@ZX?#=wpLE496PkKDioZzyYB4}XdBuO--WrzTukPopjFlroy{fYQhTGlfec&) zaCZO*+{DZ#gFttd%Jsy?_Ih)fy)LoW=lUYlvNZRoxeP_lvDcEB6B@j}XlAcT>^1*8 zb@p18*Xy`vFXfz{0=ju;bGf;K%;llGT8K{ON^=#ND}$i65Ifnq_G)u=Z0AByhmM<2 ziF2h#*F9A_&*g5f=IP^V2-sC-uDK?*S3!`D8aH$_nYn@Ctwd{kWo$XFc_>;~Zmz+@ zSD0(fb+NqyH%E@G8bRjT(8MjpR`&A5UcO2xC^tZf?HqHxy)3qKP|WxV!=Mze7X{cO zz$AFXMC=F2xWG_I+i$c23;GrWC z!dW$wbGx))`$=kN0Dev>Op&o9A0 zsJx2ObXzB5Zabt{7iovOV`;(JOc>B=3)5~q{!^kE^iVjhhyThB9?t(+ zfo1QW2*Ya;s%TeJMZ3CHw5wA^V^L^_w75LRZe)#p1AZCorZG30TgcoTMpzfo%iL;i zBXesoDY}TB=5})jncIU&(M|NU7sVFpBZOI-JA!H4MRYTF+6(OkWbO>AlkePR?k00r z5XCN{t35xl=l{=ofebuOJZp3ndzxx#s#z)CW6V9s7t|ZP;FT8}z;(^oUf|%g5;Rz_ z7jk?zAw6=dL$I|_dtB)%|@Mh31a^O$*@40da< zEip(`nkUSYWS$5$3=%`lQ_?)eo%XabPuCkaYT$+{&EzL1_T&}gP$Tm=Dtg8|O9qZ2 zt_ThS^PG8}%yXe496w=CitR}?w%x=DlPbwPUt8{pi9Io2SXWINiUD24(hpaYdBMC$ z=7q2X9EIiCOXg+s3K{r>xRx>E4D+gajZE$eig10Jonc*`VI3Y834F!P>caK_Lg~@%v+`FspcKCfXq9g6=TGB^R6`PpE2(l^WF-9^JYO1 zo$+FddEXvyVL!rS1MeU-#T4^_SxDxCFjT9=6nk83kHb*S1H{e3zzq0m?XihHHlI`S znDG?tBB5;0%otD^Xt2+Sg2~0t)H_c8>?9|*!URiWBnU_V` zejow=>=g5fogCXK=(3dtlbcU!g=JD=CoL119oflDz$-!a&x4#Sj?7|+&!^@yGM@%v z!O5uRbMpn6&jY8BZo*EC?Zi6E4KiQU)>4(&s^vuzGl==pVkK4M0%FAAD+5sNtMJ}M z;$nMrVwZ~>H(%G5IzF+hh#R+%?8v-`&o_1)864-xE6mv#(BGQx>{#-=Hns- z-L={K*x4DFG#K_G=NRGaBFno-IW(FBmnY>m5@!u;D=NwjT!i+ptSnn2wo7Bvv$6oy zJS$$x){HW^*RpbZC}nWIaeqE5UdYyx*;>rBwN18mO$f5(*z{}-ly^whD1#^M5NP@w zn9CZ47he^x*@MgM!2sqm_KO{qC0QEVrLpN5d~967o8p}eM|QwVR-H+cNvuFP;IhFZ z63Vj_B_5b5dq8ZL#-?W~l=z-lXaUSF6Ps=i;9)eBr5{ooSy&yBJ(n-f;a{`xWsXJD zb!I55J!!-au>I|R1&a`pg5{-)#mo|AfY!4tYfM=tB4`+}e{9wyTZgjRlSb^m*}Ar0 zV)xDcl31sY8&)~EYRKTK%Jw@58Lqol?Vevp*}5pOsqIS{{A(qHs83@1|=4J;q`iS0fm>pt69L_6fqtzmm-o5Z#^{=zg+wn-q6k(^$M?bRTGl)>Rw zYR=w?-CMxBMB~R*jhwo)L7=o5J{8%flvM<38;SL^=GkVH!4JsPHWE#<&9f~i+dNRa zj%aFo# zrR`?-q-@Ke7!v?Edt_T>ZDP9z%!ieNVcAw}lM2+4mS=6imff?hZP(cD4kB_aE89AV zB?5MAm)Lf}eRlno+pa86-S`WuUdmdB$B>seYb!H$+-2=d)(#_qGk^2?FN7WPt`yFQ z%Rz_iG6-80I^};2*-R@DdKk{4O~bb~nnlK}rU+tr^5>Tgqy3D>VaVvTL@T-6giWHe?HD+XY@X6I*24XFE`~ed&7B zY{#rUWjmIxH_19=J5dHF9BYJTVuP%s%-GA8buw9}6>Q;bryv+eg`Dl2?Lry+Xl!(D z2+V5d*dixVuza&!g7_gtvh9>u6oeCW>b8`!_Mys6L`Al%%y#7}cQYB>RG4M59YQt8 zWSn)*x=_|RRMT8+Zac=d|W*gRPM5o%Nz@ z?~+O>%X(+~P}Vze5Hx3fWY&i{*w^3=U#`Pc{dF9xuk>e2f!RWwe-vOrL14Db=DBgvi-9Dww-ND*?z&0Ttlpt4aoMV48Ap1E{qXxo!G6HZ3$)j z2f}bBQg(pM*!7kjXtD#raFo?QG%gnFW(P&tL8$iN>=4Qh4vmY2$_~vAqpZfO6^kT0 zTxN%J83Ro=Fq8pbR!!2W?1*d-Wk&?@NHNZ#G}=Hs@}yJQpl}}w!fqAYt#F^$B2fn4 zSvJ^iN!j2~s|GPcvZ0g>fm{>>probIB{I=MG(mzwTC=J8FqZ*hA4BLmEV@}@o2_CIK^d$Xo69H8q_GXcrq++``VgEvZ$dUb zl#7rpyIx|~TLr5duo-^5* z*;%pW1h;v7e1^?0JgFjMa(1@-KkU7CoD{|LKisni2h7k5yPej2qM!s3F^ecjP>hIR z4&)%=kUNqQa}Jnu&KYygSqzwS&e`d1%<_BJ^e#&VpV#x(_w_lQWoNdhy1S~ny1J^m zx_AmzaB87=>WZn^Cj(;Z;%ReR#dBLz&9nuycv^tigY}x5kLTuL$XNFl0d0UHT70>2HB!Q~T za&hsTxh;~p@zPR$7GcmXo;$ZWFP>ZF%Vx>kW{ZwcSo3ppTM!$bU76pmE}oYw!t+!- zzjy&Jo*%{^Tn@zxix=@C+*^b{w6=J0zIZX=?~+3C5`u71wW``=ZtZdcvWZ^&2Lxdi|{SY zDqd44UK8e~E2{I`wYlQ8sP?+z^}Kjp=p4;&HxzH=#Tx<)n%{297hxoyRlK=Syg9(g zTmd!I_2MnXTY2%8>im|A=jOl&iCrKgT``?Id4n5vKT!GDuzhPsLYb{}Y&qre0orH8j2p+ra;r_#cO?(L9T{=U)U#<9?#D9~`vNTjO-fd3b zcBT}o#dlHN2gMJ0@q-`$w_yhsKPrCgzxH48;zwcr+J^Nhep39D7e5I=w_&~fmx=#! zIb-6}fRaMOb@7`L97j(UY`jc`*&s z*)D8=|D@<*{|U*BF^!N>F0>fO7Wj{A{Kqt%mAwQzvt9g0iT`MsXp8)3B$_@Y<|+GC z(0~77;y+vg=J^Rd^8N!}^Z}29fZn;q-*|Cukimo4@Z#@9On2qYCWF}E;-CI~{~j;? z8G1-h{wn^>i+_cD!Mn4;{@vm~#eZY}?)*Of6Z*I}+tk+kXU5@HhK6WB(><%`%`Bf2*?e8;O5oX)Nt2 zR@x&bJ@Q}C6#pTvc^<=dUckv%HbXEGae*IUIfkkCP>~ZgT;u|Ln120hiGPh^q!!s! z&PCa@K7kz~n&dUDW18Egm-$&AEV$ou*VI5%I4k{?(6}?OznF zMIrVtE^F~8S_kqT&5jc|+Z)TASwa+qVAn3^yrV@uBFkO^(r!gc-V#or3h##8LMyTu zteg=PLa`TK3<@Md@-GM}RO~4zISZl|GH?Jw-G$BxSpS9b&vOCmKMji$*(suw7bWWK zN(F&6I-?x#{&_40g#x_i#L8lo*gpq&*Dmz%T z745h{BChgc&_62H@sA|_(M-f43V7*xJO#}CVqMXmi*>79`f%bO&W@D~A&r^QI}YD7 zw~AA}Q5xU>=Ju~9nbAECj}uCl0{COYOsM*!+1*5jg65GGhuiq2wv zE;?5LNB)7tKd=tQdwP27G1@L z{yu*%7hMDXny{As9s-2^e*S`BDCF2XxlKLtra^+Y?c$7p%I&lEx6d6xFtd)Tq{3I zbQ4=feimabMK`t++ZIQ$PHJex=Y-*Pz(O721G$ZdG_KQ77Z`$$90_EtTen>uqVXoy zQ!HK`&JP{mQ2qs^MiOMPC5?pc1<{?I2J;T>L8jB?XqyFnr^viIe1@~VtBIdzM>3sf zwoYbXnv4=-*g^2gPSo#{n!eY9znPP!vM4#Iu#3!OAJDa%Ssd!y+oNvQ?j zX`d5Y02y0}t+{|xf>wF0SW)y4J-O%+MqVq{+TUK|Z)Z6!dRE!xw#47Yco)`!@G`7^ z@`OejU0dVYM)cwWo&^GiP2Qrn=)* zlJ0`LoWP7Cb`(2t0Y4>~RaRj=#m-_Ef0MtF3+$+XlMT;S7yZSqT=WmXXQO*t;NL_=gWd>^WZ{75j*Nxq!1_12l9k*4AGi`|BZMGlf*_8=lje{JPj* zN5Y)!D`I!lx}Vsei~T~a>#+620b(#0bpAoaz?L1w5Pz+|h6{KY$OueNhKgZa3=InD zx~!wWS`3f<)c~3)q+)nzF?I#}t7`mJP)J4DEwBz-*I$|VE0=<>$WwHwzlK<5aFu>n zB>svOU>Uen#0Y;m7w~KlV|HfU#Yi!Vi;)#`KsPa3jNxK5i3BnSY%UJ;m-$P%I56~$ zo{SaaxPWgrZSF4-TpSu2zb)I&pPTq|m(zGI z;6W&_zQo~q0jvEiaYR8J0cNk`;*dbM?b%LZhCj!j&BcsBS$cA$IEsrSLv=WD&YzX| zvlbOzTpShP<7hd5X6(--mWAyl^5+n~&L%RzCqXU1(n%bh7e`YIjwuM(+G)5=4e)8H zH8b%um&=q~Os-PzjKrU@oY}VlbU0QV$HlQh2w^oPju$8R)BR~&93O(@2C@CciCn-? zPrA$?wx2&$oa9eQ{HaTri%$Z;ll{qDVD|T$~cxwL9CxpOpBMmN^%n z8p`g$_Vgzv{={YX!Jkb0cM75M1cns(3=`DQoIjlqd>S$2akx(NCvbs%GBiv_fdx+& zXK-;k%ON6&_BM%`;!G}PhH6K#(f;_vAHO&;vBiZ*g$=j@<5~}P;jmkS8;J=7;#Vm#nl3{LP(W`)kQ3>^@sR_xwtmSQhIWo zxSosa!qn58#eO>e$B@gmsR)?%H$weQSaUy3+z|U|_=ToqF5pq1evs}rHSrc=&K3E+P4Q(`}*JfgXPYomgU$%&tw;c%(OD{)1D0;uA~R^rD0SyTV- zSyRPj;PIQp&0O3Rc)B%PN!%iC<>HpWiLIIOjpDZ0HxiFFOdH9?ZDGbKLdCt^H~2|h zKu0Dmh@Q+6cW?oJ5Gh=ODSuGx4+?K$e!U~GANiOjCLTL+y0FS21r;7{ARdMUPQ#m!I^kJjn?-*~Fa!D=qlCNR%QU z=5NLn58#CZ#e;rK><`2XSpb_T`=yZP$B&LZVmrcSOb^+|#XZ&jk4pTgY+7CBW=wGx zdj61jn2U!(&)cyL#3SNSE*=RzZwI|=qCX>~{ji04{v=))DxUH~Vn1|#&*2WE7vQMzgJVBFFiABAI7As!L ziiq`s_34!lcS!MggZ@=Q3P{rE;A#mV`&svGk{x_BX-MnlBi679wAH`2x{7C9ZL`i#mFY&YZCGx!(6!D+21R6U3gk+jJ7B^CMs>4QqnDIK* z4S}%}I{+rsO&w7;Y{-Q09?k0XbQ0{J_4Fk>Xt|smpls))^-Ny;LL&Xwg7_6V^(ki_ zC2*xf(JHxPSKKg3+fXQfO~n{W_X}srrvzD3QG)8BUly!yB;Ku_B1gv2s>!sH=CN`H zbog~bIm~?_^Jq@MgDFyBxk#(n-9|X!Bfkw{*FlYvOR^LPe0ajg+=7@3m0$(UzByr0 z=WpV7E`AI10;&%Z1OZ?5nUjf(= z>=^NnfDNkbG)0moF)uIXp`nr$B>0gFI8Q4x@z#modbx&-ocJ5Zk3=%ZWfW>TmYpDL zWD_oH0;przaek}BZ?#Mw=dww);_iv>p3MsjEXy*>Y^(Bvox!h}aaQI~c~e=-Wz#Uq zPh=0vX0o~8(s$#sSuoDR5hh#6m`k`csc*>n~FcU-_&oy<;r1kg44j|DsojWu~lay$cszaReoa$C*H;YnweV5+*R}Ve97U*3= z)^WK;FfLrn?v-oGHe6<&zNYZg-YwViUHtl7!lOsaFM6`JY|ACm`jMgbI(E13EZfO- zV&8dwAK^zM&FB_(n_sWSuLtvxTqiubo!#X-)%Z>@)XKJ@`8ciIcT9Z8<#f9Xb$fm4 zcAEeSdnA2_*mpp!nYmWhRngHt@$FZP!96%4=dryb^4;)F*5X=Mw&xNqN2q@6ktmWK zxa<(v@k#c#?3k1A49ZS&JuW*1G(O4Rkewxv)H%#!PqNo!7YQ_XsocLRyUGo@>{_{> zEjN-IbGcFF{yDjc+?30*pYBQalwUXT>#k52xZE@#|0r{O8#Ve(l&(;_+a* zU5BvNjz|IzAQ5~vdqsB7%kI>ItqKx8FB-}l1o*GAIex9gueDq@<#GYXX`95i$u{A^ zOSpivV)^Pl39Foh`&4c%dvJ*}9Y`H{lg*Vqhrx94*Epm}}DzV$219sEj(UwH|g z*#Vu|(U-W~F?8lL_NClO?#$&*p(&rS&%H@}*ch<%WigjKhw`7ZFT75?UZJL!sOc+F z(=pAHo%&aXtn+IUH`UP??15_+4}rZ)7+$|&)b*FUa@jxFsefaC$^mjWF5%Xr`Q|tF zyO)WVi*xR7fiHh&e|S;j1qq^E!#jA*7ZYDx^qrhn)P(l92FgKP4$M@OC>P~?LGCX1 zhtwIBC2zIEbTFUM}d<^G|3P1MAxH%2+33AXqr=za42f+Tgn4t z-x7i-Gh538Lm%@|E1x7jSwSmat;FFfK9*zUxY)-4maWv~*iem#R`M+*Y;r9~-XRi! z%kiNa6P0}P#5Z3K>TBgVfNv%z_}bVv1CSx(CQalrcr2q;qt$%V*dszCOKL}nPilQF zjfn-kj!hEZB(t2*%7VIDK|TDevR(pOeZcA3QG0oioW$ipp^0lpZGBDRYgS-5atY5P z&FuJ-4YHBThD;rb+C}U7TF%%C{f$=xDW`{5H;B5rKNI)of0oR(?k^HmXepONGf@I2Zy^tEB@h0e zapV7+jCy$Grn?FY30VaI(jka|*adw3T z@Ua-RsXShu5W95#s69SZvqQA2`&FJ8yI=835WpvfYIceGyI&Ib%YR0Dtwg#?_p?07 z{S-UeY7#{9NnvOYj0U+MWB22NBH8^!WB=$X;(tiolGA*1i4X`V!BLN>r#!ipJo$eT z;{Tq65MMw-oFY%<@)XhwbJ2d$e(rnso%=R&--GtooTbm#1Z+4JbK8 zp3WsgEwK2)-C%i!oXKSfo5214?(4*Ty~Hui<;=iZ`$q@3uVVKV4G09!Ne#I`UdSaPDacxi zKlib`NM0Pdk4b612u?Dxh7K7HQ|R=%EF0;V38U(;u0up;*$%p(`7>zK2(FkVFDb}N zklQZUEh%|Uuvn7)lLEKLWC5QP>{&fRHiTm?Y^$t;&6M=^*gF#qKRU&+_lOx2evL=;K48-c>=YwP1PoX5!w= z7UmhXN%6{720Xj%TaHoY62Tg@;KHAKBXMuA4qcd_B9&aW6%}>ChxB&lLX`*ukT=Sk zxV$mo7_NMIv%H1Nn?pc-kxBP@&b>};yQNywYl(Y}wM10(#4*DgSd;$!dN<@GA_?TJ z@-{AS4X_MbMcyuFad~@yW!Oq?PR`9CShK3IUQOJqOWNZgZv(tLf~MW zZZ7W%@Q|Ivy^?dU5WKsq@Lo>b%h}vL7Lm;3MvR$&g#z+lv-}R(eLvi1`LHG81mr#P zUM}wm@YiH*<$dygF7FHQ*JNwCmvZhUf`5M%{_Mof4zpGWZMU^Og?+ z_9OC9E*}Zzm5x!3d`v#>o_Ei2`B)Gi9oZ)CS^0!}CUMU$!RGJ;Ks@Q5=JLs~;ONA< z%BLjm;irccj&)&O-BYo93hbKgYLW1?L*GEg-7fA)`AqDdq!9sb;_{i$dc=6TCldF> zf8#^K=>TV`%u4A>(%Ba!#e(PVzPRI+yTP zQy2TPo!q1Hjo3X(ogX)543}?&G2D;sDBsLWc*tkTw+iwtB(d$!`XQ}Q1DCIdmwT|j z?hy$A0MgLQBe{epmd0ss*2g`ZxQG7}ez<(4${P46rOMWN6=kmLN*coi5{6YT6{NG){3Ujj8$R&$FM$BqB_)5&%U_8AX+frJ^@Rw~4>LJ! zrJ&TxL=X_+=KyjBJI>uKZR~EIPXrs#cnmw%-ITbS{v#2}o?_zW8xwcq3P^JeWE%I;q50`Knl3=-(-Qup6|Hh8?2m}Ja z0ZGci4eVw)FE7bAsaOF<&z9IfHvvST9LzxXKLNny>{@q~ieh(F1>GtN=)Rg=E?^MKpK}Q1kKDC{UTla}IaR|I zG$s--53>(c6V=pR!c~)i-pAPMs#Z1Q3ho|4?_+F^YOY#v1-B!i_a!#RT^zfME9g}% zD&<~Mu}Zj#19qNaFS(0U%h+91L9c2V(EB`_t$1E>LT|pHU_;IF-Gm%B6(p-9fWg5V z?n2cnc3HN0lHjUUK+{v~X?H>5F8FUqR?VtNK0k3`=fcuwcdnXN5q_RK*PRo)^OlM5 za|z++5Wu6iv8$js+D3lb3Vf11tos|mi?es&MWMt zoTXMNs8wKDBq0(I-XBw8U#?04$S3S8cZOOuc4q`2K=-NvVPCK>-RX%t{Xe2xR?&T0 z;!Z0oQ}shfOdLM4vA%vBgEED?{=NGS#2r_~D!NZ~r?``2cj_|HjhOzNJDJdZ7JWOL zRF~&Mw-N5AR%@kJi+*ShB>eyU*DzvA18S{i{67tgkZ46S{ue@u`?@|;MoegI`0t7T zYcA;6_NkHIY+LEn|F?|)PmO#J9&>bJ(Tx9FtZ>Hv#ru(GYqJ8h1V~C2_Wsc+sg!k= zGCel16+H!Dy#RX2rvNNoErOjZrvbRs%y}52ClcKg!XVqD)&sFEpn6^;3yA|4gpbhWXAYh^lQ zO&0IEq$3K{#-Vl|<=xc8OY=t$TXVHl7$93lTe*XB?jYigt*fn=n7D~cY->(+2gDw#Cs#ef z0O=W>q_%POs+a2RCUAx9u{1z-iH=o$R9`pVLFV_#j+?-<$!c4*9ao4Vz-eH(-(U4p z+jG?~vn%0#Z?%IP>%jRtWK&@FWJk3VS8&x6TMml$c4O4eu^Tg=E#ZVGvhN8){^%Nq zO_p5k6nJ`fF4%ew~Z>=q4lBNI2W%1r&k4`gj0k+=~{ z(9|L~mXLfPA#VH7hP|Wx)PTH#XMUF2t)OAP%I%-H{j2>3>F9@{(J;4P;`UoYzjJOV2@@D{ zxk6Y7m@JwW9jW$J`*F2zXu!1SaJ9cWfUEsO1ExoZyM5K**iq{4AlU|odJc^abNeK2 zpK1dR2tQ1Vrn|ipxAzhnz}0?PHJJbzqJXp^L4X_)&EN{IO6tJj(GhO1#O<|Y9(Ker zZX5}a`fAm^0!DjBecYZk4*2D&cMu?bqV3%tYM9$Sc6%&SfD8+@_lf$tL5Ul*gx2TW z?o>C3oKuL*QNz^;uFBB?Cr78Lk!loIBLkR|qf^|##0^|xC%CFQ%iV5?+igjeDLBj3 zXg7c>3=9$!r$?u|U0r{-OXQ%eMy@}7>_P;^q9Z5ILGdvP;}6jRD4q$Vo!w4u$H?tW zC3m6^gv;mDfw;yhjP0>3hbakZQI1pN6~_PgjN!94cW~Rgeu>*5+vYiS60#R$CRG;i zLErmR3elX~o+`)m$rYjlFr-jJJ5`@k^{8N?I*6-@)RZU#xSg7$8X~tHV=dJrs3EJ@ zWl)0=eenol>Ofw>r9VqG7E~iLNm5|%BrK~*Z>i*-CsTPPjCgeRe92~Vbr4!KSxw<; za>n*(Q9(^r)3};C-%PHitAn|kPA$&Nd=f82^X$+?0PR~CRc~S>fK8nu8xRZFN~+mOs?RR1y7@j8n;dCwpq|ju8`Ez^;9!l zkJ$CZ3z?Z*%?K}$nSATmA#SW}ChtLYLhX!PU!n=7Q4A*}GS9oM61Uaz&E#rYcmprF z?uqOEpH>q&H3c|6(rwArk-<7y1T!3^j^^s9z#KYitB%Pjcw^PE>Nu{B4W!U)ZFRgl zfve*KqBU#dy16YBJgD6&19nNrthp_)^+TNq1Z}QPQdo;nU~IO-MFqzwPLo^7Z5BHU zj3pC7twLf^x2ZbCZ4$dp=^>qurcMc4Q&wiHt5a*$sVK6sI?ZhqJBocJ^Eg*=C2`0=kE|G!1^j^FV}@n( zd{-jW1~eXz!*zz5$<-MFBW>BH>P&@2C>&$NdTrUpZhhBTogKUNmx+fG3^M?Ii}=hQi&2gs)2I>oLNbso$0S_KE1>!{9i9b!i*q60?Y9oqrjZO=AP=hv$9 zQKY@PKwTKS_Ecop1R(8#&^v5VbL%E<-9>v>t1iS_>!^!dyV$KmZ^13Y)kWbgGJm&C zT-*P|U$w3sVY>ri`>ZN%*G}BpnT#DjJqV~~{^nv0D=z2xz=4pb=U0TwUzysACypU5>(Qs4LW!v0DQVvnU>Q zMWzqnOz+<6Ds?qiS7lQj^6K~I>gvjGz0@`8TCU(*gN_bUOE0&2>{c%W=IYu?xt{7e zbv;*bsextK)~u&nEq1F>xr`py2aF)`o?A6>t1b~EwF*8!w~D&KtsJ{m=+%t>;dCQv z_hEaf8*9~#D6*2eN!=W~l~5$`|4pIWeOW(Oid_lMY2j6?Zbo6FZc#9)8iJP*86Gei zEI2Dn-IiCkkp#cJpm1Dg#Q{*OZpC|A&2lPs8t(9ZhTByg>6S1Snz(Cl?L$@cuFVQ@9&G9@C_6Zbjrk+%A zYf%JXAncQ&a3hzc-{7LWp|;jW^Y>0ox4Ym&Go zE9gI{b(oiHT}&(hx1@SbJW|=I2iM&?9FXkfkqM9AMh;Wgy zz>A@KC$W5hWjE55>>BG5>sG*nQENTuXa6J?cpleB>SM03;gn{{+u7UJ+EjfKTe~b4 zuqm;?Cuq>G>QnVuY$;AFu)wFGdv~xq?Ju$Yg}R-I_s>xHXZ5-IBDNHL6Ra_4SKkH} zz){-v$JqWz^HIf2G0Wv{Di_^tDhBc@ioEASm5VS7@IcKuX*(= zu|Qf-DO<=5Q>%W#yI(15zl<$~{RD#B(2W<^OZJPzezAmAPpt(SYwdSLU^qvWQ=Th$ zn~1>guzB`#`>+s~It;LnJ_bJ2iL)o%(+{VDY{8{@x)#=pnjw_uY`s8bn%e@Eeu z)gKCj=VLq!1pXrs=Ogxo`b+)I6=G^h%wx*{S8!7i;XY!YtAEtLT>TRW{3-j~eiYk} z%7D50w^Hs?HBUoxnHLEBG5geh7~2o291&PU7o;)%5&PJFkk}8FGRFTzGvC*d#h84b zUZpXv;npGof64yPxmt}?gnd`n=q9m!7ez7x>zdH*uh_R1W1r$}G6L%+DEzi=s%vBW zHo+qT>!zXb5A0{%EU%k^z`A)sH(!z?s8-hk!dtq9eKWQcu9J~jw+Nj{nYV8w_KoFO z#A@xEMDq8D)_X- zeFyfH*uFyDB$8{6!Y}K*ZWY^?@h~H~&S&I`YNM9AwJvboIwN_ML@l|7M+hXxZ;38y z!F4esIc&^{eJQptl>u`dJVhwiLQAcM(VqaV` z$#p9<^98N#^RcBwo`K{#BROoNYiLue4T?OcOM0c)K8GTK{7AJHDLQNI^B}l=oz(fG1IHoriC&|XUgLi*p``?%{$F(o(IHg| zCM#X1*W|j6EHGqmVfG38xP2_LPhj}i$LZrSl+yE+OjBpjbp6+b#;~ER~y#cR=P1Wn`F7{q~57%(DY@I!;)f?!pTyGGntzk{< z-HE+B%Ma98-#BF4h@tiMW8pR68cRshdaR%*KDMFi%*@%F zh#_vJk6Q>!TLfr0xx?NV+Z)TGF|rhBWN#zl-9gN=F|Muc4P0*>%vmL%u!ru+b&r73 zwrrB#Ca1SSv0l12*S$igVAZhK+w1JLvArIh8b79C*pOk3QzlFvH*Vg%88{OC3`XB0 zdmYtuE!ET;S0CM%Yxr6wq1zqV7J6H~9oO)+49)Jl=ze;8uAv2m`_6g?y(8BQ9h@Ny1{%Ff zUhhHx`xkV7Oav6JJQV1y$1)dwVy?Ffnhlz#chv*9-Zf}8o3hRA)v?XOcCu-1Kq%LR zZK`+E1G(NUaMDI>Q+t&j6kCeVX&f;Py&n{MvoYI5@1EDYQ{{UU^d6|3juoXCX)^sz zW6*ivb0K!@!Zxy3>OEt7C9&hwF%!5Bt`&x?MS8Ei-iv_jUC?{O`cMXv)9`%gee}Lu z?-S77jcu>@)BAJ1UuZx#wxvEGui?#@r3V-EU~Gn5B0A^eqYe$B17bCNCZrYOPY=;U zxgHX5vMuXpuZZmxXk?iBhlX-nvTgM+J)G-dp*!2KZSCcHL~JjgkCPFhNxfKKJuCv&hY(7Rt2M{=;L66DnF$Chkfj)m&?j)R%UDHlkAyxCf6qgk%lMs41KaaJ+@~oQ%;{8I*6oj`joteVSSc9 zwV+R3Q8|4&3E(s7Vb zKYOY@#hx77WrinN3Qw{p)9VyosypF2&7Q>dX@rOzJCYq~PqZi4<0E?_6*_@FC}O~# zM8(_UI$fW^b@iw*dz?Mi9urxLaj?hI2j%$GFzf4?`b@52ktQ|dWOkZ9OP|ek^{6p> zv^~lmnb@NyQRKJU(7Yk@??9ASxXCkosseDWQ_ic12f?ldxXY# zK4LyIT@qL&$6Dx1?co-qSYK(U$M)c5 zGSiiT{8-THtMd9PVy3GL`sx*Brs;(KL+RrXLe%8}S~J$%PK)id`OI`Ul{kz_To_8U zWZX`T?NqqopjS|MOP(HjBjs_;z z>{O(gs?T6jBKskjg2{DDd!DF0%hKK2u=Y6(=ZC&g-^4YX5*4gZ);H^0B0HI|elx0X zGiKz12;Hi#OGs5U2?sPxnovjN3)q5NVwS$Opl?OJV_=_OS|7K+hH+jS#HM2A>$g#?U+UFxTByE z`MwC`k-!kb_5s^AlGr#C*PZ$yj4USU$R0!=6RG4~xbD_iGu#~n z%<1e*eXqv4;$9ka*`KY~_uC1Htg4~tFTs1-w#j^=m)uept{N# zpV;xi!-s`Nvt#UNt{)A}uEAg(Wk=c(iG}uxTn?2sFHJ6vq{*->2>!*SmP-5-%Gx}Msp9uO) z%MJ;6o%O4E{VD;UQ_yp;yvvl$=L3M%*y?szVuvkCAg-UShLTZ6UJZ|FCgP{`Iv>~rxc(qervr%g zq5g>LvcCXMXS;u5_g{?Bxc;cx<&X6zTz?!Ij6?eDezDz;T9N5&pM-K9Sy%n3{*3ES zLwna}UG2X5^Vm|b6POM9=;r|f4(-!lmup`Yk2~5O?DmP>F%yp?CSdn)MLgnWzIe2-wCC*h)Oz?Af+Xvxf78EPunOE{ zdqX#<0c-!E|FqlLZMpuVD#`lVKDKva`>v2A>qGVQrh5J)Nfv=SR@Z;&zq$S^(6_`^ zv%Ty#wr6a65!OabX*_81n8wA;4BHT-o&*U#iwd9h(Er4?$9z8fr@}>2|7*9lTXFqw zmCxoGygRQ_qG%%9-EPSZI!aC%;3~nv>`ouB7IK3x1daG?^Vm}4PvA3H%p$uLbs2$Xkwq{R*KqDs_-r$~sof;D zn=O;iHl^1$q1Q2Y=Coru)6~>*gUu$DX?SD1k=-z|8&e_RG_o6_q^ZT#%rxhwS+!(W zyMgTz*{)P*1N!JfC7a`FVPbAtuxv$e9=p&arX@FUVGvgFXV%SiJG$(M&=E?AhV1r7?lhF!RZX5QJGzZ)Xa&PFKGut)nGLu+bF-F#i-X4Sd%E?Hi00-5VOh@4@Qa@>H9-Xa3N-I4jh;&D#>EBAp@%T0b ziXs`EsN{6~J{kYg=}SQ!4yQCxODOh`w)Te_>G`NkVWgU9V?RYL60~rpQ@A5IqzKd5 zP4uKQ7GN!K^(rgxWAR%hEorZ;C&7>xPI?-Ow;J(Z=wawZ*u@cAOLb9_f%2wXe4}lN z)Q_F;?@-i8XF&~vH7_Xq3*x#PO3^}q@JT8uDesdpKg0TfXVm5jtOfU;E^Hwr7!{Sj z(?ajpWpz^9CIWgm^QsDQ8$6qY@?^rT%hHhToVAxWQ?8F|04_?S5PG?2s{eOb`!K!M7cdf_ZSYE^j~Cp^CuURgSHIt+eE2g6qnZeKFo3SWfQ2d*M+ zBI*<02NNz)I#7eSD(nxNh#E(t-IP#wD#|vX&y`U?{1hXJJpH#9pb+m;`-m>}8D