pax_global_header00006660000000000000000000000064124666312000014512gustar00rootroot0000000000000052 comment=17a6e915481fbc2318c9107ec9c6a19c5f1a2577 AlignmentTools-1.2.0/000077500000000000000000000000001246663120000144515ustar00rootroot00000000000000AlignmentTools-1.2.0/.gitignore000066400000000000000000000000621246663120000164370ustar00rootroot00000000000000.svn build *.so *.dylib dist *~ #*# lib/ private/ AlignmentTools-1.2.0/LICENSE000066400000000000000000000772461246663120000154760ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. AlignmentTools-1.2.0/README000066400000000000000000000005271246663120000153350ustar00rootroot00000000000000Alignment tools package from Ribosomal Database Project. Code for pairwise and hidden markov model (HMMER3 models, no training). QUICKSTART =========== This project depends on https://github.com/rdpstaff/ReadSeq. Please clone ReadSeq in to the same parent directory that contains AlignmentTools. ant jar java -jar dist/AlignmentTools.jar AlignmentTools-1.2.0/README.md000066400000000000000000000056331246663120000157370ustar00rootroot00000000000000##RDP Alignment tools package ### Intro The Alignment tools package contains commands to do defined community analysis (Fish et al., 2013. FunGene: the functional gene pipeline and repository. Frontiers, Accepted), pairwise alignment and hidden markov model (HMMER3 models, no training). ### Setup This project depends on https://github.com/rdpstaff/ReadSeq and https://github.com/rdpstaff/fungene_pipeline. See RDPTools (https://github.com/rdpstaff/RDPTools) to install. ### Usage * Defined Community Analysis This command compares input nucleotide reads to the set of known sequences for amplification targets in the sequenced DNA. It computes a global alignment between the read and each of the reference sequences. The pairwise alignment producing the highest alignment score is used to identify the source organism, substitutions, indels and associated quality scores. These output files can be processed by the parseErrorAnalysis.py script (https://github.com/rdpstaff/fungene_pipeline) to summarize the types of errors found in the input reads. The tab-delimited summary file can be imported to Excel programs to make graphs. java -jar /path/to/AlignmentTools.jar compare-error-type usage: CompareErrorType [options] ( | ) -s,--stem Output stem (default ) The sample input and output files can be downloaded from RDP tutorial http://rdp.cme.msu.edu/tutorials/defined_community/RDPtutorial_DEFINED-COM.html. Example commands: java -jar /path/to/AlignmentTools.jar compare-error-type -s mid01 /path/to/nifH_control_refseq_nucl_slice.fa /path/to/mid01_trimmed.fasta /path/to/mid01_trimmed.qual /path/to/fungene_pipeline/parseErrorAnalysis.py -i chimera_contaminant.id -q mid01_qual.txt mid01_alignments.txt mid01_mismatches.txt mid01_indels.txt /path/to/nifH_control_refseq_nucl_slice.fa> mid01_erroranalysis_summary.txt * Merge Alignment This command merges multiple alignment files into one file. The input files can be in fasta or stockholm format, each with a reference sequence named "#=GC_RF" to mark model positions. java -jar /path/to/AlignmentTools.jar alignment-merger alignment merged_aligned.fasta * Compute k-nearest-neighbors by pairwise alignment This command computes pairwise alignment between the read and each reference sequences. It returns the alignments with the top k highest scores. It reports the following for each alignment: seqname k ref_seqid ref_desc orientation score ident query_start query_end query_length ref_start ref_end java -jar /path/to/AlignmentTools.jar pairwise-knn usage: PairwiseKNN -k K-nearest neighbors to return -m,--mode Alignment mode {global, glocal, local, overlap, overlap_trimmed} (default= glocal) -o,--out Redirect output to file instead of stdout AlignmentTools-1.2.0/build.xml000066400000000000000000000163401246663120000162760ustar00rootroot00000000000000 Builds, tests, and runs the project AlignmentTools. To run this application from the command line without Ant, try: java -jar "${dist.jar.resolved}" AlignmentTools-1.2.0/ivy.xml000066400000000000000000000004161246663120000160030ustar00rootroot00000000000000 AlignmentTools-1.2.0/jni/000077500000000000000000000000001246663120000152315ustar00rootroot00000000000000AlignmentTools-1.2.0/jni/Makefile000066400000000000000000000024371246663120000166770ustar00rootroot00000000000000hmm_dir = /scratch/fishjord/apps/hmmer_svn/ #hmm_dir = /scratch/fishjord/apps/hmmer_svn_linux/ jvm_home = /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/ #jvm_home = /usr/java/latest inc_dirs = -I$(hmm_dir)/easel/ -I$(hmm_dir)/src/ -I$(jvm_home)/include -I$(jvm_home)/include/linux lib_dirs = -L$(hmm_dir)/easel/ -L$(hmm_dir)/src/ libs = -lhmmer -leasel -lm gcc_opts = -std=gnu99 -O3 -fomit-frame-pointer -fstrict-aliasing -mpentiumpro -msse2 #-ggdb libhmmerwrapper.dylib: hmmer_wrapper.c edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.c gcc -dynamiclib -o libhmmerwrapper.dylib \ $(gcc_opts) \ edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.c hmmer_wrapper.c \ $(inc_dirs) $(lib_dirs) $(libs) libhmmerwrapper.so: libhmmer.so libeasel.so hmmer_wrapper.c edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.c gcc -shared -Wl,-soname,libhmmerwrapper.so -o libhmmerwrapper.so \ $(gcc_opts) -fPIC \ edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.c hmmer_wrapper.c \ $(inc_dirs) -L. $(libs) -lc libhmmer.so: gcc -shared -Wl,-soname,libhmmer.so -o libhmmer.so $(hmm_dir)/src/*.o $(hmm_dir)/src/impl/*.o libeasel.so: gcc -Wl,-soname,libeasel.so -o libeasel.so -shared $(hmm_dir)/easel/*.o wrapper: hmmer_wrapper.c hmmer_wrapper.h gcc -o wrapper $(gcc_opts) \ hmmer_wrapper.c \ $(inc_dirs) $(lib_dirs) $(libs) AlignmentTools-1.2.0/jni/edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.c000066400000000000000000000143611246663120000253060ustar00rootroot00000000000000/* * Copyright (C) 2012 Michigan State University * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.h" #include "hmmer_wrapper.h" #include "easel.h" static jclass hitClass; static jfieldID nameFieldId; static jfieldID bitsFieldId; static jfieldID alignedSeqFieldId; static jfieldID hmmStartFieldId; static jfieldID hmmEndFieldId; static jfieldID seqStartFieldId; static jfieldID seqEndFieldId; static jmethodID hitConstructor; void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) { jclass cls = (*env)->FindClass(env, name); /* if cls is NULL, an exception has already been thrown */ if (cls != NULL) { (*env)->ThrowNew(env, cls, msg); } /* free the local ref */ (*env)->DeleteLocalRef(env, cls); } JNIEXPORT jint JNICALL Java_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3_initHmmer(JNIEnv *env, jobject jobj, jstring f_name) { jboolean iscopy; const char *hmmfile = (*env)->GetStringUTFChars(env, f_name, &iscopy); int result = init_hmmer_wrapper(hmmfile); (*env)->ReleaseStringUTFChars(env, f_name, hmmfile); if(result <= 0) { if(result == MODELS_NOT_PRESSED) { JNU_ThrowByName(env, "java.io.IOException", "HMM file not pressed!"); } else if(result == -eslENOTFOUND) { JNU_ThrowByName(env, "java.io.IOException", "HMM file not found!"); } else if(result == -eslEFORMAT) { JNU_ThrowByName(env, "java.io.IOException", "HMM file is not a recognized format!"); } else if(result == 0) { JNU_ThrowByName(env, "java.io.IOException", "Didn't read any models from the file"); } else { JNU_ThrowByName(env, "java.io.IOException", "Unknown error encountered when reading hmm file"); } return 0; } jclass cls = (*env)->FindClass(env, "edu/msu/cme/rdp/alignment/hmm/jni/HMMER3Hit"); if(cls == NULL) { JNU_ThrowByName(env, "java/lang/ClassNotFoundException", "edu/msu/cme/rdp/alignment/hmm/jni/HMMER3Hit"); return 0; } hitClass = (*env)->NewGlobalRef(env, cls); (*env)->DeleteLocalRef(env, cls); hitConstructor = (*env)->GetMethodID(env, hitClass, "", "()V"); if(hitConstructor == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchMethodException", " ()V on class HMMER3$HMMER3Hit"); return 0; } nameFieldId = (*env)->GetFieldID(env, hitClass, "modelName", "Ljava/lang/String;"); if(nameFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'modelName' (type String) does not exist in class HMMER3Hit"); return 0; } bitsFieldId = (*env)->GetFieldID(env, hitClass, "bits", "D"); if(bitsFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'bits' (type double) does not exist in class HMMER3Hit"); return 0; } alignedSeqFieldId = (*env)->GetFieldID(env, hitClass, "alignedSeq", "Ljava/lang/String;"); if(alignedSeqFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'alignedSeq' (type String) does not exist in class HMMER3Hit"); return 0; } hmmStartFieldId = (*env)->GetFieldID(env, hitClass, "hmmStart", "I"); if(hmmStartFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'hmmStart' (type int) does not exist in class HMMER3Hit"); return 0; } hmmEndFieldId = (*env)->GetFieldID(env, hitClass, "hmmEnd", "I"); if(hmmEndFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'hmmEnd' (type int) does not exist in class HMMER3Hit"); return 0; } seqStartFieldId = (*env)->GetFieldID(env, hitClass, "seqStart", "I"); if(seqStartFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'seqStart' (type int) does not exist in class HMMER3Hit"); return 0; } seqEndFieldId = (*env)->GetFieldID(env, hitClass, "seqEnd", "I"); if(seqEndFieldId == NULL) { JNU_ThrowByName(env, "java/lang/NoSuchFieldException", "Field 'seqEnd' (type int) does not exist in class HMMER3Hit"); return 0; } return result; } /* * Class: edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 * Method: destroyHmmer * Signature: ()V */ JNIEXPORT void JNICALL Java_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3_destroyHmmer(JNIEnv *env, jobject jobj) { destroy_hmmer_wrapper(); if(hitClass != NULL) { (*env)->DeleteGlobalRef(env, hitClass); } } /* * Class: edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 * Method: hmmer3 * Signature: (Ljava/lang/String;)Ledu/msu/cme/rdp/alignment/hmm/jni/HMMER3/HMMER3Hit; */ JNIEXPORT jobjectArray JNICALL Java_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3_hmmer3(JNIEnv *env, jobject jobj, jstring jseq) { jboolean iscopy; const char* seq = (*env)->GetStringUTFChars(env, jseq, &iscopy); run_hmmer_pipeline(seq); int index; jobjectArray ret = (jobjectArray)(*env)->NewObjectArray(env, num_results, hitClass, NULL); for(index = 0;index < num_results;index++) { WRAPPER_RESULT* r = wrapper_results[index]; jobject hit = (*env)->NewObject(env, hitClass, hitConstructor); jstring name = (*env)->NewStringUTF(env, r->model_name); jstring alignedSeq = (*env)->NewStringUTF(env, r->aligned_seq); (*env)->SetObjectField(env, hit, nameFieldId, name); (*env)->SetObjectField(env, hit, alignedSeqFieldId, alignedSeq); (*env)->SetDoubleField(env, hit, bitsFieldId, r->bits); (*env)->SetIntField(env, hit, hmmStartFieldId, r->hmm_start); (*env)->SetIntField(env, hit, hmmEndFieldId, r->hmm_stop); (*env)->SetIntField(env, hit, seqStartFieldId, r->seq_start); (*env)->SetIntField(env, hit, seqEndFieldId, r->seq_stop); (*env)->SetObjectArrayElement(env, ret, index, hit); } (*env)->ReleaseStringUTFChars(env, jseq, seq); return ret; } AlignmentTools-1.2.0/jni/edu_msu_cme_rdp_alignment_hmm_jni_HMMER3.h000066400000000000000000000020401246663120000253020ustar00rootroot00000000000000/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 */ #ifndef _Included_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 #define _Included_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 #ifdef __cplusplus extern "C" { #endif /* * Class: edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 * Method: initHmmer * Signature: (Ljava/lang/String;)I */ JNIEXPORT int JNICALL Java_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3_initHmmer (JNIEnv *, jobject, jstring); /* * Class: edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 * Method: destroyHmmer * Signature: ()V */ JNIEXPORT void JNICALL Java_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3_destroyHmmer (JNIEnv *, jobject); /* * Class: edu_msu_cme_rdp_alignment_hmm_jni_HMMER3 * Method: hmmer3 * Signature: (Ljava/lang/String;, [Ledu/msu/cme/rdp/alignment/hmm/jni/HMMER3Hit;)I */ JNIEXPORT jobjectArray JNICALL Java_edu_msu_cme_rdp_alignment_hmm_jni_HMMER3_hmmer3 (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif AlignmentTools-1.2.0/jni/hmmer_wrapper.c000066400000000000000000000275701246663120000202600ustar00rootroot00000000000000/* * Copyright (C) 2012 Michigan State University * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "hmmer_wrapper.h" static P7_OPROFILE** models = NULL; static P7_PROFILE** gmodels = NULL; static P7_BG* bg = NULL; static P7_HMMFILE* hmm_fp = NULL; static ESL_ALPHABET* abc = NULL; static P7_OMX* oxf = NULL; static P7_OMX* oxb = NULL; static P7_GMX* gxf = NULL; static P7_GMX* gxb = NULL; static P7_TRACE* tr = NULL; const double f1 = 0.02; const double f2 = 1e-3; const double f3 = 1e-5; static int num_models = 0; static int models_capacity = 0; static int hmmer_error = 0; void hmmer_error_handler(int errcode, int use_errno, char *sourcefile, int sourceline, char *format, va_list argp) { vfprintf(stderr, format, argp); fprintf(stderr, "\n"); hmmer_error = 1; return; } WRAPPER_RESULT* new_result() { WRAPPER_RESULT* ret = (WRAPPER_RESULT*)malloc(sizeof(WRAPPER_RESULT)); ret->model_name = (char*)malloc(sizeof(char) * 40); ret->name_alloc = 40; ret->aligned_seq = (char*)malloc(sizeof(char) * 200); ret->seq_alloc = 200; ret->matches = 0; ret->deletes = 0; ret->inserts = 0; ret->n = 0; ret->c = 0; return ret; } void reuse_result(WRAPPER_RESULT* result, int N, const char* model_name) { if(result->seq_alloc < N + 1) { result->aligned_seq = (char*)realloc(result->aligned_seq, sizeof(char) * (N + 1)); result->seq_alloc = N + 1; } if(model_name != NULL) { int name_len = strlen(model_name); if(name_len > result->name_alloc) { result->model_name = (char*)realloc(result->model_name, sizeof(char) * name_len); result->name_alloc = name_len; } strcpy(result->model_name, model_name); } result->matches = 0; result->deletes = 0; result->inserts = 0; result->n = 0; result->c = 0; } void destroy_result(WRAPPER_RESULT* result) { if(result && result->aligned_seq) { free(result->aligned_seq); } if(result && result->model_name) { free(result->model_name); } if(result) { free(result); } } int init_hmmer_wrapper(const char* hmmfile) { p7_FLogsumInit(); impl_Init(); esl_exception_SetHandler(hmmer_error_handler); int status, index; P7_HMM* model = NULL; P7_PROFILE* gm = NULL; P7_OPROFILE* om = NULL; status = p7_hmmfile_Open(hmmfile, p7_HMMDBENV, &hmm_fp); if(status != eslOK) { if(hmm_fp) { p7_hmmfile_Close(hmm_fp); } if(!hmm_fp->is_pressed) { return MODELS_NOT_PRESSED; } return -status; } model = NULL; while((status = p7_hmmfile_Read(hmm_fp, &abc, &model)) == eslOK) { if(bg == NULL) { bg = p7_bg_Create(abc); p7_bg_SetLength(bg, 400); } gm = p7_profile_Create(model->M, abc); om = p7_oprofile_Create(model->M, abc); p7_ProfileConfig(model, bg, gm, 400, p7_UNILOCAL); p7_oprofile_Convert(gm, om); /*while((status = p7_oprofile_ReadMSV(hmm_fp, &abc, &om)) == eslOK) { p7_oprofile_ReadRest(hmm_fp, om);*/ if(num_models >= models_capacity) { models_capacity += INC_NUM_MODELS; models = (P7_OPROFILE**)realloc(models, sizeof(P7_OPROFILE*) * models_capacity); gmodels = (P7_PROFILE**)realloc(gmodels, sizeof(P7_PROFILE*) * models_capacity); } models[num_models] = om; gmodels[num_models] = gm; p7_hmm_Destroy(model); model = NULL; om = NULL; gm = NULL; num_models++; } if(models == 0) { return 0; } tr = p7_trace_CreateWithPP(); oxf = p7_omx_Create(400, 400, 400); oxb = p7_omx_Create(400, 400, 400); wrapper_results = (WRAPPER_RESULT**)malloc(sizeof(WRAPPER_RESULT*) * num_models); for(index = 0;index < num_models;index++) { wrapper_results[index] = new_result(); } num_results = 0; return num_models; } void trace_into(P7_TRACE* tr, WRAPPER_RESULT* result, ESL_SQ* sq, ESL_ALPHABET* abc, int M) { int k = 0, i = 0; int z1, z2, z; for (z1 = 0;z1 < tr->N; z1++) if (tr->st[z1] == p7T_M) break; result->seq_start = tr->i[z1]; result->hmm_start = tr->k[z1]; for (z=z1; z < tr->N; z++) if (tr->st[z] == p7T_M) z2 = z; result->seq_stop = tr->i[z2]; result->hmm_stop = tr->k[z2]; /*for(i = 1;i <= result->seq_start;i++) { result->aligned_seq[k++] = (char)tolower((int)abc->sym[sq->dsq[i]]); } for(i = 1;i <= result->hmm_start;i++) { result->aligned_seq[k++] = '-'; }*/ int numB = 0, numE = 0; for(z = 2;z < tr->N;z++) { int xi = sq->dsq[tr->i[z]]; char sym = abc->sym[xi]; switch(tr->st[z]) { case p7T_M: if(xi == eslDSQ_SENTINEL) { continue; } result->matches++; result->aligned_seq[k++] = sym; break; case p7T_D: result->deletes++; result->aligned_seq[k++] = '-'; break; case p7T_I: if(xi == eslDSQ_SENTINEL) { continue; } result->inserts++; result->aligned_seq[k++] = (char)tolower((int)sym); break; case p7T_N: if(xi == eslDSQ_SENTINEL) { continue; } result->n++; result->aligned_seq[k++] = (char)tolower((int)sym); break; case p7T_C: if(xi == eslDSQ_SENTINEL) { continue; } result->c++; result->aligned_seq[k++] = (char)tolower((int)sym); break; case p7T_B: if(!numB) { for(i = 1;i < result->hmm_start;i++) { result->aligned_seq[k++] = '-'; } } numB++; break; case p7T_E: if(!numE) { for(i = result->hmm_stop;i < M;i++) { result->aligned_seq[k++] = '-'; } } numE++; break; } } /*for(i = result->hmm_stop;i < M;i++) { result->aligned_seq[k++] = '-'; } for(i = result->seq_stop + 1;i <= sq->n;i++) { result->aligned_seq[k++] = (char)tolower((int)abc->sym[sq->dsq[i]]); }*/ result->aligned_seq[k] = '\0'; } void run_hmmer_pipeline(const char* seq) { int index, i, status; ESL_SQ* sq = esl_sq_CreateFrom(NULL, seq, NULL, NULL, NULL); P7_OPROFILE *om = NULL; P7_PROFILE *gm = NULL; float usc, vfsc, fwdsc; /* filter scores */ float filtersc; /* HMM null filter score */ float nullsc; /* null model score */ float seqbias; float seq_score; /* the corrected per-seq bit score */ double P; WRAPPER_RESULT* result; num_results = 0; if(sq->n == 0) { esl_sq_Destroy(sq); return; } esl_sq_Digitize(abc, sq); int n = 0; float oasc; for(index = 0;index < num_models;index++) { om = models[index]; p7_omx_Reuse(oxf); p7_omx_Reuse(oxb); p7_omx_GrowTo(oxf, om->M, sq->n, sq->n); p7_omx_GrowTo(oxb, om->M, sq->n, sq->n); p7_oprofile_ReconfigLength(om, sq->n); p7_bg_SetFilter(bg, om->M, om->compo); p7_bg_SetLength(bg, sq->n); //Calibrate null model p7_bg_NullOne(bg, sq->dsq, sq->n, &nullsc); //MSV Filter p7_MSVFilter(sq->dsq, sq->n, om, oxf, &usc); seq_score = (usc - nullsc) / eslCONST_LOG2; P = esl_gumbel_surv(seq_score, om->evparam[p7_MMU], om->evparam[p7_MLAMBDA]); if (P > f1) continue; //Bias filter (model compo) p7_bg_FilterScore(bg, sq->dsq, sq->n, &filtersc); seq_score = (usc - filtersc) / eslCONST_LOG2; P = esl_gumbel_surv(seq_score, om->evparam[p7_MMU], om->evparam[p7_MLAMBDA]); if (P > f1) continue; //Viterbi filter (Only do if P value from Bias is high) if(P > f2) { p7_ViterbiFilter(sq->dsq, sq->n, om, oxf, &vfsc); seq_score = (vfsc - filtersc) / eslCONST_LOG2; P = esl_gumbel_surv(seq_score, om->evparam[p7_VMU], om->evparam[p7_VLAMBDA]); if (P > f2) continue; } //Get the real probability (forward) p7_Forward(sq->dsq, sq->n, om, oxf, &fwdsc); seq_score = (fwdsc - filtersc) / eslCONST_LOG2; P = esl_exp_surv(seq_score, om->evparam[p7_FTAU], om->evparam[p7_FLAMBDA]); if(hmmer_error) { fprintf(stderr, "HMM: %s, seq: %s", om->name, seq); hmmer_error = 0; continue; } if (P > f3) continue; //Real hit, go in to posterior decoding and alignment p7_omx_Reuse(oxb); p7_trace_Reuse(tr); p7_Backward(sq->dsq, sq->n, om, oxf, oxb, NULL); status = p7_Decoding(om, oxf, oxb, oxb); if(status == eslOK) { //And then trace the result p7_OptimalAccuracy(om, oxb, oxf, &oasc); p7_OATrace(om, oxb, oxf, tr); } else if(status == eslERANGE) { fprintf(stderr, "Decoding overflow on model %s\n", om->name); gm = gmodels[index]; if(gxf == NULL) { gxf = p7_gmx_Create(gm->M, sq->n); gxb = p7_gmx_Create(gm->M, sq->n); } else { p7_gmx_GrowTo(gxf, gm->M, sq->n); p7_gmx_GrowTo(gxb, gm->M, sq->n); } p7_ReconfigLength(gm, sq->n); p7_GForward (sq->dsq, sq->n, gm, gxf, &fwdsc); p7_GBackward(sq->dsq, sq->n, gm, gxb, NULL); p7_GDecoding(gm, gxf, gxb, gxb); p7_GOptimalAccuracy(gm, gxb, gxf, &oasc); p7_GOATrace (gm, gxb, gxf, tr); p7_gmx_Reuse(gxf); p7_gmx_Reuse(gxb); } if(hmmer_error) { fprintf(stderr, "HMM: %s, seq: %s", om->name, seq); hmmer_error = 0; continue; } result = wrapper_results[num_results]; reuse_result(result, tr->N + om->M, om->name); //We're way overallocating here, but it's hard to know at this point how much space we'll need for the alignment (plus leading and trailing gaps) trace_into(tr, result, sq, abc, om->M); result->bits = seq_score; num_results++; } esl_sq_Destroy(sq); } void destroy_hmmer_wrapper() { int index; if(models != NULL) { for(index = 0;index < num_models;index++) { p7_oprofile_Destroy(models[index]); p7_profile_Destroy(gmodels[index]); } free(models); free(gmodels); } if(wrapper_results != NULL) { for(index = 0;index < num_models;index++) { destroy_result(wrapper_results[index]); } free(wrapper_results); } if(bg != NULL) { p7_bg_Destroy(bg); } if(hmm_fp != NULL) { p7_hmmfile_Close(hmm_fp); } if(oxf) { p7_omx_Destroy(oxf); } if(oxb) { p7_omx_Destroy(oxb); } if(gxf) { p7_gmx_Destroy(gxf); } if(gxb) { p7_gmx_Destroy(gxb); } if(abc) { esl_alphabet_Destroy(abc); } if(tr) { p7_trace_Destroy(tr); } } int main(int argc, char** argv) { if(argc != 3) { fprintf(stderr, "USAGE: wrapper \n"); exit(1); } const char* hmm_file = argv[1]; char* line = malloc(sizeof(char) * 4096); FILE* seqfile = fopen(argv[2], "r"); int index; if(seqfile == NULL) { perror("Failed to open seq file"); free(line); exit(1); } else { int n_models = init_hmmer_wrapper(hmm_file); if(n_models < 1) { fprintf(stderr, "Couldn't open file %s", hmm_file); exit(1); } printf("Created %d models\n", n_models); int lineno = 0; while(fgets(line, 4096, seqfile) != NULL ) { line[strlen(line) - 1] = '\0'; lineno++; printf("%d\t%s\n", lineno, line); run_hmmer_pipeline(line); for(index = 0;index < num_results;index++) { WRAPPER_RESULT* r = wrapper_results[index]; printf("Model %s, score=%f, matches=%d, inserts=%d, deletes=%d, n=%d, s=%d\n", r->model_name, r->bits, r->matches, r->inserts, r->deletes, r->n, r->c); printf("hmm: %d - %d, seq: %d - %d\n", r->hmm_start, r->hmm_stop, r->seq_start, r->seq_stop); printf("Alignment: %s\n", r->aligned_seq); } printf("Pipeline finished\n"); } destroy_hmmer_wrapper(); fclose(seqfile); free(line); } } AlignmentTools-1.2.0/jni/hmmer_wrapper.h000066400000000000000000000034161246663120000202560ustar00rootroot00000000000000/* * Copyright (C) 2012 Michigan State University * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __HMMER3_WRAPPER__ #define __HMMER3_WRAPPER__ #include "p7_config.h" #include #include #include #include "hmmer.h" #include "easel.h" #include "esl_alphabet.h" #include "esl_getopts.h" #include "esl_sq.h" #include "esl_sqio.h" #include "esl_gumbel.h" #include "esl_exponential.h" #define INIT_NUM_MODELS 1 #define INC_NUM_MODELS 10 #define MODELS_NOT_PRESSED -100 typedef struct { char* model_name; double bits; char* aligned_seq; int matches; int inserts; int deletes; int n; int c; int seq_start, seq_stop; int hmm_start, hmm_stop; size_t seq_alloc; size_t name_alloc; } WRAPPER_RESULT; WRAPPER_RESULT** wrapper_results; int num_results; //Setup hmmer3, loads ALL models in to memory //Must be called before using hmmscan_seq int init_hmmer_wrapper(const char* hmmfile); //Scan the models to see which this seq may belong to, top hits //will contain the results of the scan void run_hmmer_pipeline(const char* seq); //Free all hmmer components, be kind, rewind void destroy_hmmer_wrapper(); #endif AlignmentTools-1.2.0/jni/tmp_amoa.txt000066400000000000000000000004211246663120000175640ustar00rootroot00000000000000msrtdeilkaakmppeavkmsrmidavyfpilcillvgtyhmhfmllagdwdfwldwkdrqwwpvvtpivgitycatimyylwvnyrlpfgatlcivcllagewltrfwgfywwshypinfvlpstmipgalvmdtvmlltrnwmitalvgggafgllfypgnwpifgpthlplvaegvllsladytgflyvrtgtpeyvrlieqgslrtfgghttviaaffsafvsmlmfcvwwyfgklyctafyyvkgprgrvtmkndvtaygeegfpeg AlignmentTools-1.2.0/jni/wrapper000077500000000000000000016622401246663120000166520ustar00rootroot00000000000000Ïúíþ€ ð…H__PAGEZEROx__TEXTÀÀ__text__TEXT°î®°€__symbol_stub1__TEXTžÄæžÄ€__cstring__TEXTˆÆW^ˆÆ__const__TEXTà$H à$__stub_helper__TEXT(.:(.€__unwind_info__TEXTp1p1__eh_frame__TEXTˆ9h†ˆ9 `(__DATAÀÀ__program_vars__DATAÀ(À__nl_symbol_ptr__DATA(À8(ÀQ__la_symbol_ptr__DATA`Àˆ`ÀX__data__DATAèÂ<èÂ__bss__DATA@Ãhú__common__DATA¨½H__LINKEDITÀ Ð ”"€0ÐhhÐèPÕÀ*÷(2x2 PAA_ W€/© /usr/lib/dyldö°³„”'"¯À ¢Æ~¸*° 8 }/usr/lib/libSystem.B.dylibjH‰åHƒäðH‹}Hu‰úƒÂÁâHòH‰ÑëHƒÁHƒ9uöHƒÁèl‰Çè¯ôS¿P虯H‰Ã¿(茯H‰HÇCH(¿Èèw¯H‰CHÇC@ÈÇCÇC ÇCÇC$ÇC(H‰Ø[À„SH‰ûH…ÿt'H‹H…ÿtèÏ®H‹;H…ÿtè®H‰ß[é¹®[À€AWAVAUATUSHƒì(I‰üH‰õH‰T$H‰L$E‰Ç‹?…ÿŽCI‹t$1ɸ€>u!é-€„HP€<0t H‰ÐÿÁ9ùuíHcÁH…I‹t$‹‰E,M‹D$A‹‰E4A‹<$9ù}"HcÑIT$‰Èf„€:DÈÿÀHÿÂ9øuñHcÁ‹†‰U0A‹€‰E81ÒAƒ<$ŽþE1öÇD$ÇD$A½DfDJc®H‹L$H‹A(¶ ¶ÑH‹\$H‹C¶4I‹D$B€<(wcB¶(H Hc‚HÐÿàfL­ulLcÿÄ$þÁt$ÿE(IcÞH]@¾þ觬ˆAÿÆfDfDAEIÿÅA9$~:I‹t$éYÿÿÿþÁtåÿE$ë¿þÁtÜÿEë¶ÿE IcÖH‹EÆ-AÿÆAEIÿÅA9$ÆIcÖH‹EÆHƒÄ([]A\A]A^A_ÃþÁt›ÿEIcÖH‹E@ˆ4AÿÆëˆ‹D$…Àu*‹u8D9þ}"IcΉòH‹EÆ-ÿÂHÿÁD9úuîD‰ø)ðAÆÿD$éMÿÿÿ‹T$…Òu*ƒ}4~$IcÖ¹€H‹EÆ-AÿÆÿÁHÿÂ9M4ëÿD$éÿÿÿ1É1Òé÷ýÿÿf„H‰\$èH‰l$ðL‰d$øHƒìH‰ûI‰ÔÿÆHcîH9o@r\M…ätL‰çèå¬HcèH;kHwfL‰æH‹;èŬÇCÇC ÇCÇC$ÇC(H‹$H‹l$L‹d$HƒÄÃDH‹H‰îèB¬H‰CH‰k@ëŽf.„H‰îH‹;è#¬H‰H‰kHë†fDfDAWAVAUATUSHƒìhI‰ÿE1À1É1ÒH‰þ1ÿèî#I‰ÄHœ£ÇIƒ|$8„¢H‹=c©L‰æèS‹=©…ÿŽ…E1öE1íHD$LH‰D$0HD$\H‰D$(HD$PH‰D$ HD$TH‰D$HD$HH‰D$HD$XH‰D$ëAÿÆIƒÅD95¨Ž,H‹¥¨J‹,(H‹=¨èõ#H‹=¾¨èé#I‹T$8‹µœH‹=Ÿ¨‰Ñè:I‹T$8‹µœH‹=ލ‰Ñèw:I‹t$8H‰ï誜H•@‹µœH‹=N¨èoI‹t$8H‹==¨èàmI‹T$8I‹t$(H‹='¨H‹L$0èµoH‹ &¨I‹t$8I‹|$(L‹D$(H‰êè§óD$\ó\D$LóZÀò^‡ òZÀóZ•óZóZÀèÂf.j ‡äþÿÿI‹T$8I‹t$(H‹=«§H‹L$ è‰móD$\ó\D$PóZÀò^) òZÀóZ•óZóZÀèdf. ‡†þÿÿf. vaH‹ ]§I‹t$8I‹|$(L‹D$H‰êè^óD$Xó\D$PóZÀò^¾òZÀóZ•óZóZÀèùŒf.©‡þÿÿH‹ ü¦I‹t$8I‹|$(L‹D$H‰êè °óD$Tó\D$PóZÀò^]òZÀóZÀòD$8óZ•$óZ è"C‹5Ô¦…ö… f.<‡¦ýÿÿH‹=¦èº!H‹=£¦èþOH‹ o¦I‹t$8I‹|$(E1ÉL‹c¦H‰êèk©H‹T¦H‹5E¦H‰ÑH‰ïè’…À„Òƒø„‹ S¦…É…ŠHT HcHR H‹H‹ÐH‹•ØH‹¦‹0µœH‰ßèûÿÿH‹ þ¥H‹=ÿ¥D‹…œL‰âH‰ÞèýøÿÿòD$8òCHóŸÿéÄüÿÿ@L‰çè˜HƒÄh[]A\A]A^A_ÃH‹•ØL‰ùH5 ¨H‹I¢H‹81Àè5§Ç•¥éxüÿÿH‹Y¥H‹5Z¥H‹L$H‰ïè} H‹ f¥H‹7¥H‹58¥H‰ïè@éúþÿÿH‹•ØH5M¨H‹Þ¡H‹81ÀèʦH‹ݤJ‹(H‹=¥H…ÿ„ÖI‹T$8‹s<褀I‹T$8‹sH‰ÃH‹5É¢H‹D$‹8è•oH‰ÅH‹5ƒ¢H‹|$A¸¹H‰Úè³PH‰îH‰ßèHx‹ž¢9L¢Œ6ÿÿÿp ‰5‰¢HcöHÁæH‹=¢èȤH‰¢Hc5h¢HÁæH‹= ¢誤H‰ý¡éðþÿÿ1ÒHƒ=æ¡„ôèËjH‰$¢º¾¿è0H‰á¡º¾¿èu0H‰ΡHc=§¡HÁçèâ£L5÷›I‰‹Ž¡…ÒŽ}E1í1íI‰ìM&¿Pè´£H‰Ã¿(è§£H‰HÇCH(¿Èè’£H‰CHÇC@ÈÇCÇC ÇCÇC$ÇC(I‰$AÿÅ‹¡HƒÅD9ê‰HZ›ljÐHƒÄ []A\A]A^ÃH‹=¡èÑqH‰ÇH‰ß ¾è}féþÿÿH‹=Ñ H…ÿt è÷åH‹=À ÷ÛºœÿÿÿD‹G$E…ÀEÓë¡fD€AUATUSHƒìHƒ=n tbD‹u E…Ò~>1í1ÛfDfDH‹I H‹<èÀkH‹A H‹<è€9ÿÅHƒÃ9-4 ÒH‹= è¢H‹= è¢L-sšIƒ}teD‹  E…É~PE1ä1íDfDI‹EH‹(H…Ût#H‹{H…ÿtèË¡H‹;H…ÿt辡H‰ßè¶¡AÿÄHƒÅD9%²ŸÀI‹}è¡H‹=¨ŸH…ÿtè¦mH‹=ŸŸH…ÿtèÅäH‹=–ŸH…ÿtèÄ-H‹=ŸH…ÿtè³-H‹=„ŸH…ÿtèâzH‹={ŸH…ÿtèÑzH‹=rŸH…ÿtè@ïH‹=iŸH…ÿtHƒÄ[]A\A]éÕbHƒÄ[]A\A]Ãf.„AWAVAUATUSHƒì(H‰óƒÿ…|H‹n¿è¡I‰ÅH‹{H5]¢è H‰D$H…À„œH‰ïèûÿÿ‰Æ…ÀŽeH=a¢1Àè¡ÇD$€„H‹T$¾L‰ïè4 H…À„ÓL‰ïèC¡AÆDÿÿD$L‰ê‹t$H=¢1Àè¾ L‰ïèÆôÿÿL=‡˜E‹E…ÛŽ€E1ä1íL5w˜€I‹H‹(D‹K$D‹C ‹K‹SòC‹C(‰$H‹3H=Æ¡¸è\ ‹K,‹S8‹s4D‹C0H=ì¡1ÀèA H‹sH=ö¡1Àè/ AÿÄHƒÅE9'“H=ë¡è) éÿÿÿèýüÿÿH‹|$è1ŸL‰ïèqŸ1ÀHƒÄ([]A\A]A^A_ÃH‹KšH‹º¾H=Å èRŸ¿èÜžH‰êH5ã H‹šH‹81À蟿跞H=© è}ŸL‰ïèýž¿虞H‰\$àH‰l$èL‰d$ðL‰l$øHƒì(H‰ýH‰óH‰÷èº÷…Àu=L'¡¹4HQ¡1ö¿ èçÀ¸ H‹\$H‹l$L‹d$L‹l$ HƒÄ(ÃHcuH‰ßèþ…Àu׋E…À~EA½A¼fDH‹…‹pH‹EJ‹< è©…¶ðH‰ßè~…Àu˜AÿÅIƒÄD9m};ÿH‰ßH‹\$H‹l$L‹d$L‹l$ HƒÄ(éH„H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìHH‰<$I‰ôI‰ÕH‰ËH…ÒtH‰×èäõH…ÛtOH‰ßèWE…Àt#H‹\$H‹l$ L‹d$(L‹l$0L‹t$8L‹|$@HƒÄHÃ1É1Ò¾H‰ßè/n…ÀuÈDfDÇD$ÇD$ ½@€ý„¡?@þÍtFLûŸ¹rHÕŸ1ö¿ 1Àèi¿¸ élÿÿÿ€„@€ýti@€ýuºHcD$I‹T$H‹4ºH‹<$較ø„”ƒø„'…ÀtYLpŸ¹^fDHWŸ1ö¿1Àè뾸éîþÿÿHcD$I‹T$H‹4ÂHƒÆ ºH‹<$è±»…À…ÿD$º½ÿD$ A‹$ÿÀ;D$„'„Ò…;A¾ÿ@€ý„UH…Ût@¾õ‹L$ ‹T$H‰ßèÖl…À…kþÿÿM…íA•Çt%AþÿtA¶öL‰ïè@þ…À…Eþÿÿ„@€ý…‹þÿÿH…ÛtA‹$‰C(‹D$ ‰C,1ÀE„ÿ„þÿÿ¾ÿL‰ïèûýéþÿÿfDHcD$I‹T$H‹4ÂHƒÆºH‹<$èÀº…À„ÿÿÿÿÈ„ÑLž¹né¯þÿÿ€„ÿÈtLú¹fé‹þÿÿ1Ò½éÔþÿÿ€„„ÒtlA¾ÿÇD$½éÕþÿÿI‹„$‹PHcL$I‹D$H‹4ÈH‹<$è"ºA‰Æé«þÿÿI‹„$‹PHcL$I‹D$H‹4ÈH‹<$èø¹A‰ÆéþÿÿL¡¹|éqýÿÿÿD$1Ò½é8þÿÿ€„AWAVAUATUSHìˆH‰|$HH‰t$@I‰ÕH‰L$8L‰D$0L‰L$(D‹&óBèþ™óD$`óAEèí™óD$d»HD$`H‰D$ óADÝèÌ™H‹t$ óÞóADÝè¶™H‹D$ óDØHÿÃHƒûuÊHƒ|$0t H‹|$0èòHƒ|$(tTH‹|$(èvA…ÀtHĈ[]A\A]A^A_ù1Ò¾H‹|$(èZj…ÀuÔ¹1Ò¾H‹|$(è@j…ÀuºÆD$S1íÇD$TH‹T$ HƒÂH‰T$H‹L$ HƒÁH‰L$H‹t$ HƒÆH‰4$@€|$S v+Lú›¹HÔ›1ö¿ 1Àèh»¸ éLÿÿÿ¶D$SH Hc‚HÐÿà¿ÿÿÿ—Yè¿ÿÿÿÝëö¿ÿÿÿ,ºH‹t$H‹|$Hèø·»ÿÈt¶\$S€û„΀û”À€|$S„ÿ„À„÷ÿÅ€û„´€û„ó€û„s€û„j€û „a„Hƒ|$(t¾ó‹L$T‰êH‹|$(èõh…À…kþÿÿ€û „Ûˆ\$SéÛþÿÿºH‹4$éKÿÿÿºH‹t$ H‹|$Hè9·ÿÈ•ÀD‰ÃéIÿÿÿL‰ïè¡-…À„ÐA‹}<ÿÇHcÿHÁçè˜H‰D$XH…À„]A‹U—1ö¿1ÀèÒ¶¸é¶úÿÿ»1í1ÀéÐûÿÿL—¹åëÅA‹U„€H…ítkHƒ}tdM…ätOIƒ<$tH‹D$LH‹\$xH‹¬$€L‹¤$ˆL‹¬$L‹´$˜L‹¼$ HĨÀ„L‰ÿèxOë®fDH‹|$è6ë@H‹<$è÷QérÿÿÿfH‹|$èæœéNÿÿÿH‹|$è6›‰ÆH‹|$èÚœé}þÿÿDLL$`òD$@D‹D$,‹L$(H‹$L‰þH‹|$è‹÷ÿÿ‰D$L…À„ÔHƒ|$„ÜþÿÿHމ¾€H‹|$1Àè †é¿þÿÿfDM…ät Iƒ<$…'þÿÿH‹³‹;è¢H‰D$H…ÀtNH‰ÂA¸‹L$(H‹4$H‰ßè_1‰D$L…À„êýÿÿHƒ|$„`þÿÿH’‹¾€H‹|$1Àè…éCþÿÿHƒ|$„qH]ˆ¾€H‹|$èh…ÇD$LéþÿÿLL$XòL$8òD$@D‹D$4‹L$0H‹$L‰þH‹|$è óÿÿ‰D$L…À…€òZD$@óA‡óƒóA‡óƒ˜óA‡$óƒ òZ\$hóAŸó›ŒòZT$`óA—ó“”òZL$XóA 󋜋 €Hƒ|$t5H‹D$ó€„ó€Œó€”ó˜€óˆóˆM…í„øH‹D$I‰EM…ö„ØH‹$I‰H…턹H‹D$H‰EM…ä„býÿÿM‰<$éýÿÿHƒ|$…DÇD$Lé¹üÿÿò ãòD$8HÇD$ÇD$ ÈÇD$$ÈÇD$(ÈÇD$,ÈÇD$0dÇD$4Èé°ûÿÿ@H‹³‹;èNI‰ÇH…ÀtH‰ÆH‹|$èÍV‰D$L…À„ÁûÿÿHƒ|$„.üÿÿHž†¾€H‹|$1Àè]ƒéüÿÿ¿*èþ›H‰D$H…À…XûÿÿHƒ|$„'ÿÿÿHà…¾€H‹|$èƒÇD$LéÊûÿÿH‹»èEQH‰$H…À…ûÿÿHƒ|$„ßþÿÿH­…¾€H‹|$èÖ‚ÇD$Lé‚ûÿÿHÊ…¾€H‹|$1À豂ÇD$Lé]ûÿÿHƒ|$„QûÿÿH†¾€H‹|$1À耂é4ûÿÿH‹|$èéAþÿÿH‹<$èÃMé!þÿÿH‹|$è´˜éþÿÿAWAVAUATUSHƒìHI‰þH‰L$(‹F‰D$4L‹n(H˜H€óAD…óXG,óD$8‹D$4…ÀŽWL‹b(E1ÿ½1ÛH‹AH‰$H‹QH‰T$H‹H‰D$@H‹$óZDüòD$ óBD+ óBXD# ó\D$8óZÀè•€òXD$ òZÀH‹$ó(H‹D$óZD(üòD$óBD+óBXD#ó\D$8óZÀèT€òXD$òZÀH‹D$ó(óBD+óBXD#óAXFó\D$8è'€óD$<óBD+óBXD#óAXF ó\D$8è€óXD$<óD$<óBD+óBXD#$óAXF(ó\D$8è×óXD$<óD$<ó;àó\D$‰ØH Hc‚HÐÿà,ë,Ï,,,œ,³WÀ¾ó‰éD‰úH‹<$èœ:…À…=þÿÿƒû„ëƒû „âƒû„ÙA‰Ýƒû…]þÿÿA‹FIc×H‰ÑHÁáóD9ò ‡É.Êztò ¼ÉHcÅH‹tÆøHRHÁàóóD9òQÉ.ÊÉztò†ÉóZÃòYÈòZÉóZDòYÐòZÂ.ÈÛƒãÿÃÿ̓ûÿ…ýÿÿLº£¹äéøûÿÿóANó oÉóÉTÁóÔÈUÊVÈóAF$óÂGÉó÷ÈTÐó¬ÈUÃVÂI‹T$(HcÅH€HÁàóYLóYD1Û.È–Ã\›éyüÿÿI‹t$ I‹>Ic×H‰ÑHÁáóD9ðò aÈ.ÚÈztò –ÈHcÅH‹4ÆHRHÁàó\ôóD9ôò+È.¤Èztò`ÈóZÃòYÈòZÉóZDüòYÐòZÂ.ÈÛ÷ÓƒÃAÿÏéÔþÿÿM‹D$ M‹L$(I‹>ÇD$ÇD$ÇD$ÇD$IcÇH‰ÁHÁáóD9à.(È…Šò ”ÇHcõH@H…I‹DðøóZDôòYÈòZÉóL$ óD9ä.ßÇ…ÀŠºò KÇóZDøòYÈòZÉóL$$óD9èò )Ç.¢Çztò ^ÇóZDüòYÈòZÉóL$(óD9ìò ôÆ.mÇztò )ÇH¶óAZDøòYÈòZÉóL$,H|$ ¾è1NH˜‹\„AÿÏÿÍé‘ýÿÿ1ÀD9ë”À)Åéûÿÿò ÙÆéAÿÿÿò ÌÆéëþÿÿE‹~\H‰ß1ÀèZWHE\H5²œH‰ß1ÀèBWHe\H5šœH‰ß1Àè*WH‰ÙºJ¾H=Èœè;WH‹|$H…ÿtèWHƒÄ[A\A]Ãf.„H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8A‰ö‰ÓI‰ÌM‰ÇM‰Íè;.H‰ÅL‰â‰ÞH‰ÇèË(…Àu H‰ïèo…ÀtKHuPH=\1Àè)WM…ítL‰êI‹4$H‹ŽQH‹8èÞ“I‹4$H=û[1ÀèüV¿èVfH5\H‰ïèÿÈt7H‰ïè…ÿD9ð…€H‰èH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃM…ÿtfH‹QL‰úI‹4$H‹;èþÿÿM…ítL‰êI‹4$H‹;èG“H=ž[è}VA¸P¹1ÒH‰îH‹;èCÿ1ÿèhUH=}[èRVéÿÿÿH‹¬Pë§(Ðó_Ñó]Á.¶zt-(Êó\È(Á. yµsóYsµó,ÀH˜HÂSóX‚(ÂÃf„USHƒì‹ S…ÀteÇþRò6µèqUòZÀó}SH-zS»ÿÿÿÿò*Ãò^µè±TòX7µè:UòZÀóEÿËHƒÅû€ÁÿÿuË1ÀHƒÄ[]ÃfHƒì(óD$óL$ó_ÁóL$ó]L$. !µzt-(Ðó\Ñ(Ê.”´sóY Ž´ó,ÁH˜HÝRóX‚óZÀè!TòD$óZD$èTòD$óZD$èÿSòXD$èŠTòZÀóZÀèçSòL$ò\ÈòZÁHƒÄ(ÃATSHƒìH‰ûA‰ôóODó´(ÙóXÚó*ÆóXÂóXÈó^Ùó´ó\Ãó$è'TóC óC(óCó$(Ãè TóC$óC,óCD‰c41ÀHƒÄ[A\ÃH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHì(I‰ÿH‰t$@H‰Õ‰L$¸r1¿‰E‰EÇED€?ƒ}<ްA¾A½I‹WH‰T$(J­H]H‹D$(N‹$(óA$èUPóóAD$èEPóCóAD$è4PóCóAD$ è#PóCóAD$èPóCóAD$èPóCóAD$èðOóCAÿÆIƒÅD9u<eÿÿÿM‹‡Ic@ÇD„p€ÿIc@ÇD„h€ÿÇD„l€ÿE‹E…ÉŽÇD$lHÇD$`HT$pH‰T$0A‹H…É~QE1ä1ÛM‹wH‹D$@L‹(DH‹T$`I‹óóA^DL‰D$èOOH‹D$0óAÿÄHƒÃL‹D$E9`ÅH‹\$@H‹H‹t$0L‰ÇèP¨I‹¿‹w…ö~11ÉH‹ufDfDH‹ÎH‹\$0‹‹H‹\$`‰AHÿÁ9GáÿD$lE‹HƒD$`D;L$l|>I‰øé7ÿÿÿDL”T¹<éûÿÿ€„L™T¹=éóúÿÿL‹…(A‹P…Ò~QE1Ò1ÿH‹uMcÙ¹ºAƒùŽ9H‹>ÇDÿÁHƒÂA9ÉéBÇDØ€ÿABIÿÂHƒÇA9@»E…É޹ºH‹uIc@H‹ÆÇD€ÿÿÁHƒÂA9}åA‹…À~Q¹ºIc@H‹DÆðÇD€ÿÿÁHƒÂA9É}äE…É~&¹ºIc@H‹DÆøÇD€ÿÿÁHƒÂA9}äÇE4óMDóY­(ÙóXÚó*D$<óXÂóXÈó^ÙóP­ó\Ãó\$è_MóE óE(óEó\$(ÃèBMóE$óE,óE‹T$<‰U41Ûé§ùÿÿH‹>éÕþÿÿI‹GH‰D$(H‹ó@óD$LL‹uóZÈòç¬ò\ÁèæLòZÀóAF Aƒ?Ž"üÿÿóD$LèÍLA½A¼óZÀòD$PH‹D$(J‹ óZCèžLòXD$PòZÀóCD¦ óZCèƒLòXD$PòD$PòZÀAÿÅIƒÄE9/¬é²ûÿÿ1À‰EÇE€ÿ‰EDéÀûÿÿI‹wPH‹}pèãLé úÿÿI‹wHH‹}xèÑLA‹‡ éêùÿÿI‹w@H‹}hè¸LA‹‡ éÆùÿÿI‹w8H‹}`èŸLA‹‡ é¢ùÿÿM…í„pøÿÿL‰ïèžKécøÿÿA‹ÿÀH˜HÁàH…À„”úÿÿI‰ÁL­w¹\H†Q1ö¿1Àè«m»é!øÿÿATSHƒìH‰ûA‰ôWÉóOÇG€ÿóODó*Æó;«óXÂóXÁó^ÐóT$ ó9«ó\ÂèNKóC óC(óCóD$ è4KóC$óC,óCD‰c41ÀHƒÄ[A\Ãf„ATSHƒìH‰ûA‰ô¸r1¿‰G‰GóЪóGDó*ÎóX §ªóXÈóŸªó^Ñó\Âó$è¿JóC óC(óCó$(Âè£JóC$óC,óCD‰c41ÀHƒÄ[A\ÃAWAVAUATUSHìÈH‰|$`‰t$\‰T$X‰L$TóD$PL‰D$HH‰øH‹¿D‹9}1ÀHÄÈ[]A\A]A^A_ÃèØH‰D$xH…À„™ƒ|$\~ÒIcÇHÁàH‰„$€‹T$XÒ‰”$¬ÇD$tHÇ„$°‰ÑD‹d$X9L$T~‹T$T‰ÐÁú÷|$tò*ÀòD,àH‹¼$°è·IH‰D$hH…À„7‹t$t…ö~\Hƒ¼$€…S1ÿè‹IH‰ÇH‹D$hH‰81ÒD‰þè2)H‹\$hHƒÃ½1ÿèaIH‰ÇH‰1ÒD‰þè )ÿÅHƒÃ;l$tuÝH‹T$`‹ …ÉŽ!‹L$tA¯Ì‰Œ$Œ¸)ÈH˜HÁàH‰„$ Ç„$¸Ç„$¼HÇ„$˜ó*D$tóD$4óA*ÄóD$0H‹T$`H‹‚‹pH‹BH‹Œ$˜H‹<èÑ/Hc”$¼H˜HÁàH‹L$hHÑÿ‹„$¼ÿÀ‰ÂÁú÷|$t‰T$D‰”$¼‹Œ$Œ9Œ$¸Œ)WÒ‹T$t…ÒŽËL‹t$hÇD$pE…ÿŽŸM‹.H‹T$xL‹"òç§óT$èHò„$1í1ÛóT$óA*Ló^L$0óZÒòT$8óZÁòX½§óAZœò^ÂóL$ èÐGòZÀóL$ óYÈóZÉò^Œ$òXL$8òL$8òZÑÿÅHÿÃD9ýu“ÿD$pIƒÆ‹D$t9D$p…Bÿÿÿ(Âó^D$4.D$P‡ÌH‹L$`H‹‹pH‹AH‹”$ H‹|èt.HcT$DH˜HÁàH‹L$hHÑÿÿ„$¸Hƒ„$˜Hƒ„$ ‹”$¸H‹D$`9<þÿÿ‹D$t…À~ H‹\$h1íH‹;H…ÿtè«FÿÅHƒÃ;l$tuçH‹|$hè•FÿD$t‹L$XŒ$¬Hƒ„$°‹D$t9D$\Œxüÿÿ‹Œ$¬éÌüÿÿÇ$D‹Œ$ŒE1À1É‹”$¸1öH‹|$HèF5éÿÿÿH=²L1Àè³géTüÿÿL‹Œ$°LGr¹HH¨L1ö¿1ÀèEh¸éüûÿÿH‹\$h1íH‹¼$€è+FH‰ÇH‰H…Àt1ÒD‰þèÒ%ÿÅHƒÃ;l$tuÒéÀüÿÿL‹Œ$€LÙq¹LH:L1ö@·1ÀèÙg1ÛH‹T$hH‹<ÚH…ÿtèzEHÿÃ9\$täH‹|$hègE¸éhûÿÿ€AWAVAUATUSHƒì(I‰üH‰t$H‰T$H‰ $H‹‡D‹p‹?ÿÇHcÿHÁçèjEI‰ÇH…À„üIcÆH…H‰ßèKEI‰ÅH…À„L1ÒL‰þL‰çè~#WÀD‰öL‰ïèÀ$A‹<$…ÿ~31Û½I‹D$H‹4(D‰òóADŸL‰ïè%'CHÿÃHƒÅA9$}ÕD‰öL‰ïè /D‰òH‹D$H‹0L‰ïè6óD$D‰òL‰îH‹D$H‹8èî5óXD$óD$óZÀò^n¤òZÈH‹D$óHƒ<$„ËH‹$L‰(L‰ÿè%D1ÀHƒÄ([]A\A]A^A_ÃA‹$ÿÀH˜HÁàH…À„ïþÿÿI‰ÁL'p¹ëHˆJ1ö¿1Àè%fH‹D$ǸHƒ<$t¡H‹$HǸHƒÄ([]A\A]A^A_ÃH…Û„«þÿÿI‰ÙLÄo¹ìH%J1ö¿1ÀèÂeM…ÿt˜L‰ÿèkCëŽL‰ïèaCé/ÿÿÿfDAUATUSHƒìH‰ûI‰õ‹fWÉ…À~QA¼fWɽ€H‹ƒ‹PH‹CH‹<(I‹uò $è4óZÀò $òXÈAÿÄ‹HƒÅD9à}Åò*Àò^Èf(ÁHƒÄ[]A\A]À€AWAVAUATUSHƒìxH‰ûI‰÷H‰T$@‹?ÿÇHcÿHÁçèëBI‰ÅH…À„q1ÒL‰îH‰ßè!‰D$T…Àt,M…ítL‰ïèoBH‹D$@HÇ‹D$THƒÄx[]A\A]A^A_Ë3…öŽjfWÉòL$X1íA¼€€óAL­H‹ƒ‹PH‹CJ‹< I‹7óL$0è‰3óL$0óYÈóZÉòXL$XòL$XE‹3HÿÅIƒÄ9Æ}¯I}è6#óD$L‹‰D$lHÇD$`ƒøŽ3L‹sóAGóD$h1íƒèL`€„I‹\îó(Âó^D$hóZÀóT$ è§Af(ØócóT$ óAYT­óZÒòYÐóAL­óYKóZÉóC ó^D$hóZÀòL$0òT$ ò\$ó$$èNAò\$òXØòL$0òYËòT$ òXÑóAZL­ò¡ò\Áf(Èó$$óZÄòYÈó^d$hóZÄòL$0òT$ èñ@òL$0òYÈòT$ òXÑò^E òXT$`òT$`HÿÅL9å…õþÿÿ‹t$lÿÎI}èÖ!óD$PL‰ïè^@óZD$LòL$Xò^ÈòL$XóZD$PòL$`ò^ÈòD$XòXÁH‹D$@òé½ýÿÿ‹ÿÀH˜HÁàH…À„|ýÿÿI‰ÁL5l¹¬H–F1ö¿1Àè3bÇD$TémýÿÿfWÀòD$Xéøýÿÿ€AWAVAUATUSHƒì8I‰ÿI‰öH‹·‹?èÙH‰Å‹x<¾^èÎI‰ÄI‹¿èϱH‰Ã1ÿèåXH‰D$A¸¹^H‰êL‰öL‰ÿè·ëÿÿ…À…ÑfWÀòD$E1íHD$,H‰$HD$(H‰D$é¿f.„E1ÉI‰ØL‰ñH‰êL‰þH‹|$臤ÿÿ…À…/H‹s8H‰ïèÓêÿÿ…À…ûH‹S8‹uêÿÿ…À„6ÿÿÿH=E1À蘬ÿÿé#ÿÿÿH=sE1À肬ÿÿë”H=ME1Àèr¬ÿÿéhÿÿÿfD€H=E1ÀèR¬ÿÿé)ÿÿÿfD€H=¹D1Àè2¬ÿÿéòþÿÿfD€H=»D1Àè¬ÿÿé¾þÿÿH‹|$èÓTH‰ßèËœL‰çèCH‰ïèëÔòD$ò^•ŸHƒÄ8[]A\A]A^A_ÃH=)D1ÀèÀ«ÿÿéþÿÿDfDATUSHƒìH‰û‹fWÉ…À~RA¼fWɽfDfDH‹ƒ‹pH‹CH‹<(ò $è”,óZÀò $òXÈAÿÄ‹HƒÅD9à}Éò*Àò^Èf(ÁHƒÄ[]A\Ã@ATUSHƒì H‰ûH‰ðH‹—‹rH‹8è@,óD$‹fWÒ…À~GA¼fWÒ½H‹ƒ‹pH‹CH‹<(ò$è,óZÀò$òXÐAÿÄ‹HƒÅD9à}ÉóZD$ò*Èò^Ñò\ÂHƒÄ []A\Ãó*ÎÿÆó*Æó^ÈóOH‹GH‹@H‹óóFœó\Gó@1ÀÃf„H‰\$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìHI‰üI‰ö‰ÓI‰ÏH‹G‹0‰×è{@I‰ÅI‹T$LD$H‰Á‰ÞL‰÷èA3óAD$óD$ ó*ÃóD$óD$ èÝ;óYD$óXD$óD$ó¥›ó\D$ è¸;óXD$óAL‰ïè×:1ÀH‹\$ L‹d$(L‹l$0L‹t$8L‹|$@HƒÄHÀATSHƒì(H‰ûI‰Ôó*ÎóY K›H‹WH‹BH‹Ç’\?Ç@rn#;ó'›óPH‹RH‹G(‹pH‹H‹?óL$ó$èáóL$ó$(ÙóXÚH‹SH‹BH‹@(Âó^Ãóó^ËóHóPH‹BH‹PH‹C(‹pL‰çè“H‹{H‹GÇw¾?Ç@oƒ:H‹3è&,1ÀHƒÄ([A\ÃfDfDSHƒìH‰ËóZGòD$ó*ÂóZÀò$òD$èm:òY$ò$òSšò\D$èP:òX$òZÀó1ÀHƒÄ[ÃATUSI‰üH‰õH‹F(‹8èk…H‰ÂH5)AL‰ç1Àèµ9LA¹M…Ày"H"A¾¿1Àèï[¸[]A\ÃH‹U(1Û‹B…ÀëLfDCH‹U(HÿÃ9B~7H‹MH‹B¾óZ™H5Ó@L‰ç¸è:9…ÀyÈL@¹Oëƒ1À[]A\ÃH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHìˆI‰üI‰õH‰ÕHÇD$@H…ÒtÆHT$@1öL‰çèBà‰Ãƒø„Ç…ÀtCH‹|$@H…ÿtèä݉ØH‹\$XH‹l$`L‹d$hL‹l$pL‹t$xL‹¼$€HĈÃf„H‹|$@¾#èñÕL|$LLt$8H‹|$@L‰úL‰öè܉Ãøtw…Àu‰H‹|$8è²……À…˜H…í„…H‹L$8M‰áH‹D$@D‹@@H @¾€H‰ï1ÀèÚ8³é@ÿÿÿH…í„4ÿÿÿL‰áH…?¾€H‰ï1Àè®8éÿÿÿH…ít(H‹D$@‹H@M‰àH‚?¾€H‰ï1Àèƒ8³ééþÿÿ»éßþÿÿI‹U(‹:9øtAH…ítçH‹D$@‹X@è&ƒH‹L$8L‰$$A‰ÙI‰ÀH ?¾€H‰ï1Àè18»é”þÿÿHczHÁçè®7H‰D$H…À„yI‹U(‹róy—H‹|$è#ÇD$,H‹|$@è!؉ÅÀ…èH‹|$@L‰úL‰öègՉÃø„¬…À…ƒ|$L…YI‹M(H‹D$8H¾¶T¶Â;A;¶ÒH‹D$HH‰D$ ó.ë–Šï…éH‹|$@L‰úL‰öèóԉÃø„±…À…’H‹|$8è¦h…À„dH‹|$8èì5òZÈH‹D$ óH‹|$@L‰úL‰öè§Ô‰Ã…À„ƒøuJÿD$,éÿÿÿƒøuëÑH…ít«H‹L$8M‰áH‹D$@D‹@@H=>¾€H‰ï1Àèž5³ééþÿÿH…í„tÿÿÿH‹D$@‹H@M‰àHÄ=ëH…í„WÿÿÿH‹A¾ M‰áH‹D$@D‹@@Hf=¾€H‰ï1ÀèG5»éþÿÿH‹|$èãó£”ó “”èÎ`…Àt,H…í„÷þÿÿL‰áHG>¾€H‰ï1Àèø4»é@þÿÿI‹E(‹pH‹|$èI‹E(‹pI‹UH‹|$èH‹|$è4H‹|$@èÙ1Ûé)ûÿÿfD€SH‰ûH…ÿt'H‹?H…ÿtèÐ3H‹{H…ÿtèŒ3H‰ß[é¹3[À€HƒìH‹F(H‹H‹PH‹6è¹(1ÀHƒÄÃfATUSH‰û¿0èÃ3H‰ÅH…À„äI‰ÄHÇHÇ@H‹C(H‰E(H‹C(HcxHÁçèŒ3H‰ÁI‰$H…ÀtLH‹S(HcRHÁâH‹3H‰Ïèu3H‹{èÌ6H‰EH…ÀtU‹C‰E‹C‰EL‰à[]A\À„H‹S(HcBHÁàH…Àt§I‰ÁLý^±ˆH.:1ö¿1ÀèþTH‹}H…ÿtè¦2H‹}H…ÿtèb2H‰ïè2E1äL‰à[]A\ÃA¹0Lª^¹ƒHØ91ö¿1Àè¨TE1äéYÿÿÿH‰\$èH‰l$ðL‰d$øHƒìH‰ý¿0è„2H‰ÃH…À„ìI‰ÄHÇHÇ@Hc}HÁçèY2H‰H…Àt]¾H‰ïè`2H‰CH…À„ƒ‹uó*Îó’ó^ÁH‹;è¸ÇCJE?ÇC€;H‰k(L‰àH‹$H‹l$L‹d$HƒÄÃHcEHÁàH…Àt–I‰ÁLÁ]¹eHï81ö¿1Àè¿S€„H‹;H…ÿtèY1H‹{H…ÿtè1H‰ßèC1E1äë‚A¹0Lc]¹aH‘81ö¿1ÀèaSE1äéSÿÿÿf„ATUSH‰ý¿0èC1H‰ÃH…À„I‰ÄHÇHÇ@Hc}HÁçè1H‰H…Àt\¾H‰ïè1H‰CH…À„‚ƒ}„¨‹uó*Îó¹ó^ÁH‹;èmÇCJE?ÇC€;H‰k(L‰à[]A\ÃHcEHÁàH…Àt—I‰ÁL\¹@H¯71ö¿1ÀèR€„H‹;H…ÿtè0H‹{H…ÿtèÕ/H‰ßè0E1äL‰à[]A\ÃfH‹;èx×ÿÿ…ÀuÄébÿÿÿA¹0L \¹<H871ö¿1ÀèRE1äéEÿÿÿHcGH‹WHRH ÅHT‘8H€H‚À€ÇÇG1ÀÃAWAVAUATUSHƒìhI‰ýH‰t$@‰Õ‰L$H‰E@H…À„Í‹… é=þÿÿAGHcØH‰ßèH‰EHH…À„Æ‹… é!þÿÿAGHcØH‰ßèðH‰EPH…À„¿‹… éþÿÿAGHcØH‰ßèÉH‰EXH…À„¸‹… éäýÿÿE¯nIcÅHÁàI‰ÁL,¹—H…À…yþÿÿé}üÿÿI‰ÙLb,¹¦Aƒÿþ…[þÿÿéÿÿÿfDI‰ÙL>,¹§Aƒÿþ…7þÿÿéÿÿÿfI‰ÙL,¹¨Aƒÿþ…þÿÿéÿÿÿfI‰ÙLþ+¹©Aƒÿþ…÷ýÿÿé#ÿÿÿfI‰ÙLÞ+¹ªAƒÿþ…×ýÿÿé*ÿÿÿfATUSA‰üH‰õ¿(èÐÿH‰ÁH…À„JH‰ÃÇHÇ@HÇ@HÇ@HÇ@ HÇ@(HÇ@0HÇ@8HÇ@@HÇ@HHÇ@PHÇ@XHÇ@`Ç@hÿÿÿÿº€¿‰PlÇ@pÿÿÿÿHÇ@xHÇ€€Ç€ˆ¸€OÃlj¤‰¨‰¬‰°‰´‰¸‰Œ‰‰”‰˜‰œ‰ ‰‘¼¸fDfDÇ„¼€¿HÿÀHƒøuìHÇÇ HÇH‰êD‰æH‰ÏènùÿÿH‰Ø[]A\ÃA¹(LQ*±THF 1ö¿1ÀèR 1ÛëЀ€AWAVAUATUSHƒìH‰û‹?ÿÇHcÿHÁçè#þI‰ÆH…À„à‹;ÿÇHcÿHÁçèþI‰ÇH…À„AÇH‹sH‹ó@óXóAFƒ;~h1Ò¹ò¶]fDóAL–H‹D1øóóX@óYÁóZÀóZÉf(Óò\Ñf(ÊóZPòYÊòXÁòZÀóAD–BHÿÂHƒÁ9}­M…ÿtRH‹ó@ó^@ óA‹…À~:1Ò¹f„H‹1óAD–óY@ó^@ óAD—BHÿÂHƒÁ9}ÖL«¼H‹ƒ‹pWÀL‰ïèšÜH‹ƒ‹PH‹CóAH‹0L‰ïè ß‹…À~f1íA¼€€H‹ƒ‹PH‹CJ‹4 óAD®L‰ïèÏÞH‹ƒ‹PH‹CJ‹4 óAD¯L‰ïè®ÞEHÿÅIƒÄ9}°H‹ƒ‹pL‰ïèŽæ‹ @L‰÷èüL‰ÿèúû1ÀHƒÄ[]A\A]A^A_ËÿÀH˜HÁàH…À„ þÿÿI‰ÁLþ'¹zHð 1ö¿1Àèü¸HƒÄ[]A\A]A^A_ËÿÀH˜HÁàH…À„ÞýÿÿI‰ÁL³'¹{H¥ 1ö¿1À豸M…ö„aÿÿÿL‰÷èQû¸éOÿÿÿAWAVAUATUSHƒì8I‰ý‰t$I‰×H‰L$H\ H‰D$(¿(èaûH‰ÅH…ÀuGA¹(L0'¹TH" 1ö¿1Àè.H‹D$HǸHƒÄ8[]A\A]A^A_ÃÇHÇ@HÇ@HÇ@HÇ@ HÇ@(HÇ@0HÇ@8HÇ@@HÇ@HHÇ@PHÇ@XHÇ@`Ç@hÿÿÿÿº€¿‰PlÇ@pÿÿÿÿHÇ@xHÇ€€Ç€ˆ¸€OÃlj…¤‰…¨‰…¬‰…°‰…´‰…¸‰…Œ‰…‰…”‰…˜‰…œ‰… ‰•¼¸fD€Ç„…¼€¿HÿÀHƒøuìHÇ…Ç… HÇ…L‰ú‹t$H‰ïè½ôÿÿ‹D$…ÀˆŸE1ö1Û‹D$HÿÀH‰D$E‰ôE…ö~H‹EH‹A‹wL‰ïèÄnH‹EH‹A‹wL‰ïè°nH‹EH‹¾L‰ïè›nH‹EH‹HƒÂ ¾L‰ïè‚nE…ä~H‹EH‹HƒÂ¾L‰ïèdnIÿÆHƒÃL;t$…rÿÿÿHc\$H‹EH‹ؾL‰ïè8nH‹EH‹Ø1Ò‰PÇ@€?‰PH5ûH‰ïè"ðÿÿHT$(¾H‰ïè@òÿÿH‰ïè8ìÿÿ1öH‰ïèžéÿÿH‹D$H‰(1ÀHƒÄ8[]A\A]A^A_ÃDATUSHƒì‰óI‰ÌHÇD$HL$èðüÿÿ‰Å…ÀuK…ÛxiL‹D$1É1ÒI‹xsfDH‹Ç€?Ç@Ç@ÿÁHƒÂ9ñuÞM‰$‰èHƒÄ[]A\ÃH‹|$H…ÿtèÐçÿÿIÇ$‰èHƒÄ[]A\ÃL‹D$ëÈfDAVAUATUSI‰üL‹¯‹¿(èæ÷H‰ÅH…À„ÆI‰ÆÇHÇ@HÇ@HÇ@HÇ@ HÇ@(HÇ@0HÇ@8HÇ@@HÇ@HHÇ@PHÇ@XHÇ@`Ç@hÿÿÿÿº€¿‰PlÇ@pÿÿÿÿHÇ@xHÇ€€Ç€ˆ¸€OÃlj…¤‰…¨‰…¬‰…°‰…´‰…¸‰…Œ‰…‰…”‰…˜‰…œ‰… ‰•¼¸fÇ„…¼€¿HÿÀHƒøuìHÇ…Ç… HÇ…L‰ê‰ÞH‰ïèñÿÿA‹$…ÀxqE1í1ÛfH‹EH‹I‹D$H‹<¾è5ÙH‹EH‹I‹„$‹pI‹D$H‹<èÙH‹EH‹I‹„$‹pI‹D$H‹<èóØAÿÅHƒÃE9,$}–HU I‹|$ HÇÆÿÿÿÿè±+…ÀuHU(I‹|$(HÇÆÿÿÿÿè˜+…ÀtH‰ïèœåÿÿE1öL‰ð[]A\A]A^ÃHU0I‹|$0HÇÆÿÿÿÿèh+…ÀuÐA‹„$ ¨…©…>©…]¨…µöÄ …ÖI‹|$`H…ÿtHU`HÇÆÿÿÿÿè+…À…wÿÿÿI‹|$xH…ÿtHUxHÇÆÿÿÿÿèñ*…À…UÿÿÿAö„$!…#A‹D$h‰EhA‹D$l‰ElA‹D$p‰EpA‹„$ˆ‰…ˆA‹„$Œ‰…ŒA‹„$‰…A‹„$”‰…”A‹„$˜‰…˜A‹„$œ‰…œA‹„$ ‰… A‹„$¤‰…¤A‹„$¨‰…¨A‹„$¬‰…¬A‹„$°‰…°A‹„$´‰…´A‹„$¸‰…¸A‹„$¼‰…¼ºA‹„”¼‰„•¼HÿÂHƒúuèI‹„$H‰…A‹„$ ‰… I‹„$H‰…é'þÿÿA¹(Lë¹THÝ1ö¿1ÀèéE1öéøýÿÿHUPI‹|$PHÇÆÿÿÿÿèl)…À…ÐýÿÿA‹„$ é!þÿÿHUXI‹|$XHÇÆÿÿÿÿèB)…À…¦ýÿÿéþÿÿHU8I‹|$8HÇÆÿÿÿÿè )…À…„ýÿÿA‹„$ é·ýÿÿHU@I‹|$@HÇÆÿÿÿÿèö(…À…ZýÿÿA‹„$ é˜ýÿÿHUHI‹|$HHÇÆÿÿÿÿèÌ(…À…0ýÿÿA‹„$ éyýÿÿA‹<$ÿÇHcÿHÁçè óH‰ÂH‰…€H…ÀtA‹4$ÿÆI‹¼$€èÓÕé¤ýÿÿA‹$ÿÀH˜HÁàH…Àt×I‰ÁL«¹H1ö¿1Àè©é°üÿÿ@AWAVAUATUSHƒìHI‰ÿA‰öI‰ÕóD$ óL$óT$ó\$H‰L$H…H‰D$8¿(èZòH‰ÃH…ÀuGA¹(L)¹TH1ö¿1Àè'H‹D$HǸHƒÄH[]A\A]A^A_ÃÇHÇ@HÇ@HÇ@HÇ@ HÇ@(HÇ@0HÇ@8HÇ@@HÇ@HHÇ@PHÇ@XHÇ@`Ç@hÿÿÿÿº€¿‰PlÇ@pÿÿÿÿHÇ@xHÇ€€Ç€ˆ¸€OÃljƒ¤‰ƒ¨‰ƒ¬‰ƒ°‰ƒ´‰ƒ¸‰ƒŒ‰ƒ‰ƒ”‰ƒ˜‰ƒœ‰ƒ ‰“¼¸fDÇ„ƒ¼€¿HÿÀHƒøuìHǃǃ HǃL‰êD‰öH‰ßè¾ëÿÿE…öˆeóZD$ ò §Pò\ÈóZD$ò\ÈòZÉóL$$ówPóD$ó\D$óD$(óD$ó\D$óD$,E1ä1퀀H‹CH‹(A‹uL‰ÿè|eH‹KH‹)óD$$óóD$ ó@óD$ó@óD$(ó@ óD$ó@óD$,ó@óD$ó@AÿÄE9æ|H‹CH‹T(A‹uL‰ÿè eHƒÅérÿÿÿóD$IcÖH‹Ñó\D$ ó1Ò‰PÇ@€?‰PH5¶þH‰ßèÝæÿÿHT$8¾H‰ßèûèÿÿH‰ßèóâÿÿ1öH‰ßèYàÿÿH‹D$H‰1ÀHƒÄH[]A\A]A^A_Ãó8OóD$H‹Kë€fDfDAWAVAUATUSHƒì8I‰þ‰t$I‰×H‰L$HtþH‰D$(¿(èïH‰ÃH…ÀuGA¹(Là¹THÒý1ö¿1ÀèÞH‹D$HǸHƒÄ8[]A\A]A^A_ÃÇHÇ@HÇ@HÇ@HÇ@ HÇ@(HÇ@0HÇ@8HÇ@@HÇ@HHÇ@PHÇ@XHÇ@`Ç@hÿÿÿÿº€¿‰PlÇ@pÿÿÿÿHÇ@xHÇ€€Ç€ˆ¸€OÃljƒ¤‰ƒ¨‰ƒ¬‰ƒ°‰ƒ´‰ƒ¸‰ƒŒ‰ƒ‰ƒ”‰ƒ˜‰ƒœ‰ƒ ‰“¼¸fD€Ç„ƒ¼€¿HÿÀHƒøuìHǃǃ HǃL‰ú‹t$H‰ßèmèÿÿ‹D$…Àˆ´E1í1íHD$ H‰D$‹D$HÿÀH‰$€E‰ìE…í~H‹CH‹(A‹wL‰÷èdbH‹CH‹(A‹wL‰÷èPbH‹T$¾L‰÷è>bH‹CH‹(‹D$ ‰ÇB‹D$$‰BÇB €?ÇBE…ä~HƒÂ¾L‰÷èþaIÿÅHƒÅL;,$…mÿÿÿHcT$H‹CH‹ÐÇ€?Ç@Ç@€?Ç@H5ŸûH‰ßèÆãÿÿHT$(¾H‰ßèäåÿÿH‰ßèÜßÿÿ1öH‰ßèBÝÿÿóVL1öH‰ßè€ËÿÿH‹D$H‰1ÀHƒÄ8[]A\A]A^A_ÃH‰øL‹X0AÿãfDSH‰û1ÒH‹?èÎë…Àt(Lû¹ÖHû1ö¿ 1Àèí ¸ [ÃÇC 1À[ÃDfDH‰\$ðH‰l$øHƒì(H‰ûH‹H…ÿu6LWû¹½H8û1ö@· 1Àè— ½ ‰èH‹\$H‹l$ HƒÄ(ÃH‰áHT$E1ÉE1À誉ŅÀuÕH‹4$1ÒH‹;èë…Àt&LÖú¹¿H×ú1ö¿ 1Àè4 @µ ëÇC ë”fDUSHƒìH‰ýH‰óH…öt_H‰÷è­ëÿÀ‰D$ H|$ H‰éº¾è²êHÿÈtgLÀú¹zHgú¾¿1ÀèÁ ¸HƒÄ[]ÃDÇD$ H|$ H‰éº¾èYêHÿÈt=Lgú¹€ë¥HcT$ H‰é¾H‰ßè1êHcT$ L?ú¹{H9Ð…vÿÿÿ1ÀëDfDH‰\$ØH‰l$àL‰d$èL‰l$ðL‰t$øHƒì8I‰ü‰õH‰Óƒþÿ¸DèHƒz0„僊 Hƒ{(„ó‹ ƒý„ƒý„7ƒý„^ƒý„„ƒýtQƒý„ÔLªù¹$H9ù1ö¿ 1Àè– A½ D‰èH‹\$H‹l$L‹d$ L‹l$(L‹t$0HƒÄ8ÃL‰áº¾H=çæèéHÿÈ„;L(ù¹"HÎø¾¿1Àè( A½냢 ýHƒ{(…ÿÿÿ€€£ ÿýÿÿƒý… ÿÿÿfD€L‰áº¾H=HæèèHÿÈ„¬L™ø¹émÿÿÿfD€L‰áº¾H= æèOèHÿÈtpL]ø¹é1ÿÿÿL‰áº¾H=àåèèHÿÈt@L-ø¹ éÿÿÿL‰áº¾H=µåèðçHÿÈtLþ÷¹!éÒþÿÿH» L‰áº¾èÁçHÿÈt@LÏ÷¹(é£þÿÿL‰áº¾H=_åè’çHÿÈt³L ÷¹#étþÿÿL‰áº¾H‰ßègçHÿÈtLu÷¹)éIþÿÿH‹»L‰áº¾è8çHÿÈtLF÷¹*éþÿÿ‹…À~NA¾A½H‹‹HcQH‹CJ‹<(L‰á¾èðæH‹‹HcQH9Ð…‰AÿÆ‹IƒÅD9ð}Å…Àˆ‚E1öE1íH‹‹HcQH‹CJ‹<(L‰á¾è æH‹‹HcQH9Ð…JAÿÆIƒÅD93}Ç‹…Àx6E1íE1öH‹CJ‹<0L‰áº¾èZæHƒø…®AÿÅIƒÆD9+}ÐH‹s L‰çèPûÿÿA‰Å…À…Õüÿÿ‹ƒ öÄ…Z¨……¨… ©…„©…8¨…¿öÄ t6‹ƒÂHcÒH‹{XL‰á¾èÒ勃ÂHcÒLÝõ¹>H9Ð…­üÿÿH‹s`L‰çèÁúÿÿA‰Å…À…FüÿÿH{hL‰áº¾èˆåHÿÈ„L’õ¹@H9õ¾¿1Àè“AµéûûÿÿLfõ¹/é:üÿÿLUõ¹1é)üÿÿ‹ƒÂHcÒH‹{PL‰á¾è勃ÂHcÒL#õ¹=H9Ð…óûÿÿ‹ƒ éÿÿÿH{lL‰áº¾èÚäHÿÈ„“Läô¹Aé¸ûÿÿ‹ƒÂHcÒH‹{HL‰á¾è§ä‹ƒÂHcÒL²ô¹<H9Ð…‚ûÿÿ‹ƒ é‡þÿÿ‹ƒÂHcÒH‹{@L‰á¾èf䋃ÂHcÒLqô¹;H9Ð…Aûÿÿ‹ƒ é;þÿÿƒýŽÆH{pL‰áº¾èäHÿÈ„§L)ô¹Béýúÿÿ‹ƒÂHcÒH‹{8L‰á¾èì㋃ÂHcÒL÷ó¹:H9Ð…Çúÿÿ‹ƒ é¶ýÿÿH‹s(L‰çèÐøÿÿA‰Å…À…Uúÿÿ‹ƒ é„ýÿÿLµó¹3é‰úÿÿH‹s0L‰çèøÿÿA‰Å…À…"úÿÿ‹ƒ éYýÿÿH‹sxL‰çè{øÿÿA‰Å…À…úÿÿöƒ!t8‹ÿÂHcÒH‹»€L‰á¾è4ã‹ÿÂHcÒH9ÐtL;ó¹Dé¤ýÿÿH»ˆL‰áº¾èþâHÿÈtL ó¹EéàùÿÿÿÍ„¯H»ŒL‰áº¾èÇâLÚò¹RHƒø…©ùÿÿH»¤L‰áº¾è˜âL«ò¹THƒø…zùÿÿöƒ!@„ùÿÿH‹ƒHcPH»¼L‰á¾èVâH‹“HcRH9ЄêøÿÿLUò¹Ué)ùÿÿ‹ƒ‰$‹ƒŒ‰D$‹ƒœ‰D$H‰çL‰áº¾èÿáLò¹NHƒø…áøÿÿé3ÿÿÿfDfDH‰\$èH‰l$ðL‰d$øHƒìH‰ýA‰ô‰Ó.îAtl.ÅAuCzAHcûH}fWÀD‰âH5êñ¸è8â…Àyn¸H‹$H‹l$L‹d$HƒÄÃfDè™áW¤AHcûH}óZÀë±€z’HcúH}H ‡ñ‰òH5€ñ1ÀèÖá…ÀxžfDfD1Àë“fDfDAWAVAUATUSHìèH‰|$0H‰ÕH‹ÀÛH‹H‰”$Ø1Òƒþÿ¸EƉD$,H‹} è¡áH‰ÃH‹}(E1äH…ÿt èáD`H‹}01ÀH…ÿtèyáƒÀA\IÃL|$pD‹EH Þðºd1öL‰ÿ1ÀèÂßDdƒ|$,Žç‹Ep1Û…À…ýH‹…‹8è½+H‰ÇèáB#DdA½ ƒ|$,ŽÅ» ƒ|$,¸LØH‹}x1ÒH…ÿtèßàPCD,ØD$D‰d$TH‹}`H…ÿt[fD€ÿþ è’àH…Àt Hx€?uæA‰ØH ðºd1öL‰ÿ1ÀèõÞƒÀ¯ÃB H‹}`ènàÉ\$T‹EhÇD$8…Àx"A‰ÀH Îïºd1öL‰ÿ1Àè²ÞƒÀ‰D$8óElÇD$<WÉ.Ár&óZÀH ™ïºd1öL‰ÿ¸èwÞƒÀ‰D$<‹• ÇD$@f…Òˆ/ÇD$DöÆ…[ÇD$HöÆ…±ÇD$LöÆ…¡E1À„Ò‰ƒ|$,„åóZ…ŒH ïºd1öL‰ÿ¸èíÝA‰ÆóZ…H úîºd1öL‰ÿ¸èÇ݉D$PóZ…”H Íîºd1öL‰ÿ¸è ÝA‰ÅóZ…˜H ­îºd1öL‰ÿ¸èzÝA‰ÄóZ…œH îºd1öL‰ÿ¸èT݉ÃóZ… H bîºd1öL‰ÿ¸è/Ý‹L$PBT1KDêDâÚD‹• H‹…‹@ÿÀÀ1ö€æ@Eð‹M<ɼø’lj¯Ñ׃À¯ÁÇ|$T|$8|$<|$@|$D|$H|$LDÇ÷Hcÿè ÝH‰ÇH‰D$hH óáHÈíH5Èíƒ|$,…ß1Àèã݉ÅÀˆƒH‹U HcøH|$hH5 î1Àè¿Ý…ÀˆaH‹U(H…Òt HcûH|$hH5€î1Àè•Ý…Àˆ7ÃH‹U0H…Òt HcûH|$hH5aî1ÀèlÝ…ÀˆÃHcûH|$h‹UH5Hî1ÀèIÝ…Àˆëƒ|$, H‹…‹8èï'HcûH|$hH‰ÂH5î1Àè Ý…Àˆ®L-îL% îö… L‰âIDÕHcûH|$hH5óí1ÀèÏÜ…Àˆqƒ|$,~.ö…"L‰âIDÕHcûH|$hH5Çí1Àè™Ü…Àˆ;Ã|$,~.ö…"L‰âIDÕHcûH|$hH5œí1ÀèdÜ…ÀˆÃö… L‰âIDÕHcûH|$hH5xí1Àè6Ü…ÀˆØö…!MDåHcûH|$hL‰âH5Sí1ÀèÜ…Àˆ©H‹UxH…Òt HcûH|$hH53í1ÀèÝÛ…ÀˆÃL‹u`M…ö„pA¿LcãëDAÿǾ L‰÷è¾ÛI‰ÅH…À„´ Ld$hD‰ùHäìH5ãìL‰ç1ÀèzÛ…ÀˆE‰ìE)ôMcìHcûH|$hL‰êL‰öèÛDãHcûI‰üH‰øHD$hfÇ Ot5A€>…xÿÿÿ‹Uh…Òx H|$hH5ì1ÀèÛ…Àˆ¶ÃHcûóElWÉ.Ár'H|$hóZÀH5hì¸èàÚ…Àˆ‚ÃHcû‹… f…Ày,‹•ˆH|$hH5>ì1Àè¯Ú…ÀˆQË… HcûöÄt9H|$hóZ¨óZ…¤H5 ì¸èqÚ…ÀˆË… HcûöÄt9H|$hóZ°óZ…¬H5àë¸è3Ú…ÀˆÕË… HcûöÄt9H|$hóZ¸óZ…´H5³ë¸èõÙ…Àˆ—Ë… Hcû„Àˆ. H‰øHD$hI¿HMM L‰8Æ@ƒÃH‹•D‹rE…öŽ\E1äë)€„ÃAD$H‹•IÿÄ9BŽ.H‹BB¾ HcûH|$hH5ðë1Àè]Ù…ÀyøH‹ tÓH‹”$ØH3…ˆ HÄè[]A\A]A^A_ÃH‹…‹8èã#H‰ÇèAÙEdE1íé3øÿÿA‰ÀH ©èºd1öL‰ÿ1Àè×Xéà÷ÿÿóZ…´H Šèºd1öL‰ÿ¸èb׉ÃóZ…¸H eèºd1öL‰ÿ¸è=×D‰D$L‹• éùÿÿD‹…ˆH -èºd1öL‰ÿ1Àè ׃À‰D$@‹• ÇD$DöÆ„¥øÿÿóZ…¤H òçºd1öL‰ÿ¸èÊÖ‰ÃóZ…¨H Íçºd1öL‰ÿ¸è¥ÖD‰D$D‹• ÇD$HöÆ„OøÿÿóZ…¬H ‹çºd1öL‰ÿ¸ècÖ‰ÃóZ…°H fçºd1öL‰ÿ¸è>ÖD‰D$H‹• éô÷ÿÿóZ…H *çºd1öL‰ÿ¸èÖ‰ÃóZ…ŒH çºd1öL‰ÿ¸èãÕA‰ÄóZ…œH ßæºd1öL‰ÿ¸è½ÕATKD镸ÿÿH ôÚHÉæH5àæƒ|$,„ùÿÿH ÔÚH©æH5ðæƒ|$,„áøÿÿH ´ÚH‰æH5çƒ|$,„ÁøÿÿH ”ÚHiæH5çƒ|$,„¡øÿÿ¸ ƒ|$,…*ýÿÿH dÚH9æH5çéwøÿÿDfDHcûé ûÿÿHcÃHD$hfÇ ÿÃHcûH|$hHéH‰D$HéH‰T$H ùèH‰ $L ¤èL¢èH  èHžèH5£è1ÀèêÕ…ÀˆŒüÿÿL|$hö…!@t{HcÂHD$hI½ COMPO L‰(Æ@ZH‹…D‹`E…äŽ[E1ä‰ÚóB„¥¼¾L‰ÿèÿòÿÿ…À…,üÿÿƒÃ AT$IÿÄH‹…9PÈHcÃHD$hfÇ SHcÂHD$hI» L‰Æ@ZH‹…D‹PE…Ò~AE1íE1äH‹EH‹‰ÚóB ¾L‰ÿè‚òÿÿ…À…¯ûÿÿƒÃ AÿÅIƒÄH‹…D9hÅHcÃHD$hfÇ CH˜HD$hI¹ L‰Æ@S H‹EH‹ó¾L‰ÿè òÿÿ…À…MûÿÿSH‹EH‹ó@¾L‰ÿèüñÿÿ…À…)ûÿÿSH‹EH‹ó@¾L‰ÿèØñÿÿ…À…ûÿÿS$H‹EH‹ó@ ¾L‰ÿè´ñÿÿ…À…áúÿÿS-H‹EH‹ó@¾L‰ÿèñÿÿ…À…½úÿÿS6H‹EH‹ó@¾L‰ÿèlñÿÿ…À…™úÿÿS?H‹EH‹ó@¾L‰ÿèHñÿÿ…À…uúÿÿCHH˜HD$hfÇ ƒÃID‹EE…ÀŽoA¾HÇD$XHcûH|$h‹T$XH5kæ1Àè~Ó…Àˆ úÿÿH‹…‹x…ÿ~BE1íE1äH‹EJ‹0‰ÚóB ¾L‰ÿè¼ðÿÿ…À…éùÿÿƒÃ AÿÅIƒÄH‹…D9hÄö…!„™H‹…€H‹L$X‹ˆHcûH|$hH5äå1ÀèñÒ…Àˆ“ùÿÿƒ|$,~;º-ö…"t H‹EHH‹L$X¾HcûH|$hH51Àè®Ò…ÀˆPùÿÿú-ö… t H‹E8H‹L$X¾HcûH|$hH5Ì1ÀèsÒ…Àˆùÿÿƒ|$,~;º.ö…"t H‹E@H‹L$X¾HcûH|$hH5‰1Àè0Ò…ÀˆÒøÿÿú-ö… t H‹EPH‹L$X¾HcûH|$hH5øä1ÀèõÑ…Àˆ—øÿÿØHcÐHT$hH¾ H‰2ÆBXH‹…‹H…É~BE1íE1äH‹EJ‹0‰ÚóB ¾L‰ÿèïÿÿ…À…EøÿÿƒÃ AÿÅIƒÄH‹…D9hÄHcÃHD$hHº H‰fÇ@ S H‹EI‹ó¾L‰ÿèÂîÿÿ…À…ï÷ÿÿSH‹EI‹ó@¾L‰ÿèîÿÿ…À…Ê÷ÿÿSH‹EI‹ó@¾L‰ÿèxîÿÿ…À…¥÷ÿÿS$H‹EI‹ó@ ¾L‰ÿèSîÿÿ…À…€÷ÿÿS-H‹EI‹ó@¾L‰ÿè.îÿÿ…À…[÷ÿÿS6H‹EI‹ó@¾L‰ÿè îÿÿ…À…6÷ÿÿS?H‹EJ‹0ó@¾L‰ÿèäíÿÿ…À…÷ÿÿCHH˜HD$hfÇ ƒÃI‹D$XÿÀIƒÆHÿD$X9E üÿÿHcÃHD$hÇ// H‹D$hH‹T$0H‰1ÀéÅöÿÿ‹Up…ÒŽØòÿÿHcûH|$hH5þà1ÀèõÏ…Àˆ—öÿÿÃé³òÿÿLd$hM‰ðD‰ùH-áH55áL‰ç1ÀèÃÏ…ÀˆeöÿÿÃHcûéƒôÿÿèV΃|$,„¡H|$hóZóZ…ŒH5Ÿá¸è{Ï…ÀˆöÿÿHcûH|$hóZ˜óZ…”H5“á¸èGÏ…ÀˆéõÿÿHcûH|$hóZ óZ…œH5‡á¸èÏ…ÀˆµõÿÿHcûé&õÿÿH|$hóZ…H5±à¸èâÎ…Àˆ„õÿÿHcûH|$hóZ…ŒH5¡à¸è¶Î…ÀˆXõÿÿHcûH|$hóZ…œH5‘à¸èŠÎ…À‰wÿÿÿé'õÿÿHcûH|$hHÉH5Zá1Àè`Î…À‰oûÿÿéýôÿÿfD€L|$héÖøÿÿfDUSHƒìH‰ý‰ó.®-„¨.-u_z]fWÀ‰ÚH5®ÝH‰ï¸è!ÍLóà¹G…À‰¯Hýܾ¿1ÀèWï¸HƒÄ[]ÃDfDè9ÍWD-óZÀ‰ÚH5EÝH‰ï¸è¸Ì…ÀyVL†à¹H뙄ŠRÿÿÿH ݉òH5Ý1ÀèÌLSà¹F…Àˆ`ÿÿÿ€„1ÀHƒÄ[]ÀH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìhH‰ý‰óI‰Ôƒþÿ„ƒþ„‰ƒþ„;ƒþ„Ƀþ„^ƒþ„Šƒþ„¶L:ܹBHÉÛ1ö¿ 1Àè&îA½ D‰èH‹\$8H‹l$@L‹d$HL‹l$PL‹t$XL‹|$`HƒÄhÃf.„»H JÐHÜH5ÜH‰ï1ÀèjËL<ß¹<…Ày\HJÛ¾¿1Àè¤íA½éyÿÿÿH øÏHÍÛH5Ü1ÀèËLíÞ¹>…Àx±fD€I‹T$ H5¤ÜH‰ï1ÀèèÊLºÞ¹D…ÀˆzÿÿÿI‹T$(H…Òt%H5ÜH‰ï1Àè¹ÊL‹Þ¹E…ÀˆKÿÿÿI‹T$0H…Òt%H5ZÜH‰ï1ÀèŠÊL\Þ¹F…ÀˆÿÿÿA‹$H5;ÜH‰ï1ÀèaÊL3Þ¹G…Àˆóþÿÿƒû~.A‹T$p…Ò~%H5ÜH‰ï1Àè.ÊLÞ¹H…ÀˆÀþÿÿI‹„$‹8è­H‰ÂH5åÛH‰ï1Àè÷ÉLÉݹI…Àˆ‰þÿÿL5ÎÛL-ÃÛAö„$ L‰êIDÖH5³ÛH‰ï1Àè´ÉL†Ý¹J…ÀˆFþÿÿƒûŽAö„$"MDîL‰êH5ÛH‰ï1ÀèvÉLHݹK…ÀˆþÿÿHIÛAö„$"H=ÛHDÐH5IÛH‰ï1Àè6ÉLݹL…ÀˆÈýÿÿL5 ÛL-ÛAö„$ L‰êIDÖH5ÛH‰ï1ÀèóÈLÅܹM…Àˆ…ýÿÿAö„$!MDîL‰êH5åÚH‰ï1Àè¾ÈLܹN…ÀˆPýÿÿI‹T$xH…Òt%H5ÀÚH‰ï1ÀèÈLaܹP…Àˆ!ýÿÿM‹l$`M…í„ãA¿¾ L‰ïèJÉI‰ÆH…À„’D‰ùHuÚH5tÚH‰ï1Àè3È…Àˆ^D‰ðD)èLcðH‰éL‰ò¾L‰ïè9ÈI9Æ…(H5éÛH‰ï1ÀèõÇ…ÀˆþOl.A€}„SAÿÇénÿÿÿ€H ÌHdØH5{Ø1Àè²ÇL„Û¹=…ÀˆDüÿÿé›üÿÿH ZÌH/ØH5¦Ø1Àè}ÇLOÛ¹?…ÀˆüÿÿéfüÿÿH %ÌHú×H5¡Ø1ÀèHÇLÛ¹@…ÀˆÚûÿÿé1üÿÿH ðËHÅ×H5œØ1ÀèÇLåÚ¹A…Àˆ¥ûÿÿéüûÿÿ…ÒýÿÿéýÿÿLÁÚ¹é„ûÿÿL°Ú¹ésûÿÿLŸÚ¹ébûÿÿM‰èD‰ùHàØH5èØH‰ï1ÀèžÆLpÚ¹…Àˆ0ûÿÿA‹T$h…Òx%H5ÆØH‰ï1ÀèpÆLBÚ¹R…ÀˆûÿÿóAD$l.°&r,óZÀH5—ØH‰ï¸è4ÆLÚ¹S…ÀˆÆúÿÿA‹„$ f…ÀˆLöÄ…úöÄ…¨öÄ…E„À‰½ƒû„ZóAZŒ$óAZ„$ŒH5ºØH‰ï¸è»ÅLÙ¹`…ÀˆMúÿÿóAZŒ$˜óAZ„$”H5¦ØH‰ï¸èÅLQÙ¹a…ÀˆúÿÿóAZŒ$ óAZ„$œH5’ØH‰ï¸èCÅLÙ¹b…ÀˆÕùÿÿH5ÙH‰ï1ÀèÅLðعf…Àˆ°ùÿÿI‹”$E1í‹B…À~6H‹BB¾(H5LØH‰ï1ÀèÞÄ…ÀˆpAEI‹”$IÿÅ9BÊH‰î¿ è»ÄL‡Ø¹i…ÀˆGùÿÿHIØH‰D$HBØH‰T$H ;ØH‰ $L æ×Lä×H â×Hà×H5å×H‰ï1ÀèQÄL#عk…ÀˆãøÿÿAö„$!@„ŽH5ØH‰ï1ÀèÄLï×¹n…Àˆ¯øÿÿI‹„$E1ö‹@…À~6óC„´¼¾H‰ïè‚öÿÿA‰Å…À…øÿÿAVIÿÆI‹„$9PÊH‰î¿ èºÃL†×¹q…ÀˆFøÿÿH‰îH=”×èÃLc×¹u…Àˆ#øÿÿI‹„$E1öE1ÿ‹@…À~;I‹D$H‹óB8¾H‰ïèïõÿÿA‰Å…À…„÷ÿÿAÿÆIƒÇI‹„$D9pÅH‰î¿ è&ÃLòÖ¹x…Àˆ²÷ÿÿH‰îH=×è ÃLÏÖ¹z…Àˆ÷ÿÿE1öI‹D$H‹óB0¾H‰ïèmõÿÿA‰Å…À…÷ÿÿIƒÆIƒþuÐH‰î¿ è¯ÂL{Ö¹}…Àˆ;÷ÿÿHÇD$ HÇD$(A‹$…ÀŽ ‹T$(H5*ÖH‰ï1ÀèbÂ…Àˆ…I‹„$E1öE1ÿ‹@…À~>I‹D$H‹t$ H‹0óB8¾H‰ïèÆôÿÿ…À….AÿÆIƒÇI‹„$D9pÂAö„$!„I‹„$€H‹L$(‹ˆH5¥ÕH‰ï1Àè×Á…Àˆéƒû~bI‹D$HH‹t$(¾0ƒû„ A‹Œ$ ÷ÁtI‹D$@H‹t$(€<0m„Ëá¸-DÐH5¤÷H‰ï1ÀèpÁ…ÀˆÍº-Aö„$ tI‹D$8H‹L$(¾H5m÷H‰ï1Àè9Á…Àˆ§ƒû~7º-Aö„$"tI‹D$@H‹t$(¾0H51÷H‰ï1ÀèýÀ…Àˆ|º-Aö„$ tI‹D$PH‹L$(¾H5¤ÔH‰ï1ÀèÆÀ…Àˆ˜H‰îH=²Ôè»À…ÀˆpI‹„$E1öE1ÿ‹@…À~>I‹D$H‹t$ H‹0óB8¾H‰ïèóÿÿ…À…{AÿÆIƒÇI‹„$D9pÂH‰îH=QÔèQÀ…Àˆ(E1öI‹D$H‹T$ H‹óB0¾H‰ïè»òÿÿ…À…#IƒÆIƒþuÍH‰î¿ èÀ…Àˆî‹D$(ÿÀHƒD$ HÿD$(A9$`ýÿÿH‰îH=áÎèÔ¿…À‰ôÿÿL’Ó¹éUôÿÿóAZŒ$¸óAZ„$´H5 ÒH‰ï¸臿LYÓ¹X…ÀˆôÿÿA‹„$ érùÿÿL8Ó¹héûóÿÿóAZŒ$°óAZ„$¬H5µÑH‰ï¸è-¿LÿÒ¹W…Àˆ¿óÿÿA‹„$ éùÿÿóAZŒ$¨óAZ„$¤H5[ÑH‰ï¸èä¾L¶Ò¹V…ÀˆvóÿÿA‹„$ é½øÿÿA‹”$ˆH5ÑH‰ï1À誾L|Ò¹T…Àˆ<óÿÿA‹„$ ézøÿÿóAZ„$H5ÑH‰ï¸èk¾L=Ò¹\…ÀˆýòÿÿóAZ„$ŒH5ÿÐH‰ï¸è9¾L Ò¹]…ÀˆËòÿÿóAZ„$œH5éÐH‰ï¸è¾LÙѹ^…Àˆ™òÿÿé¿øÿÿA‰Åé(òÿÿL¸Ñ¹…é{òÿÿL§Ñ¹éjòÿÿI‹„$HcPH‹@¾|ýè2½‰ÂA‹Œ$ é üÿÿLmѹŒé0òÿÿL\ѹŽéòÿÿLKѹéòÿÿH”óH5%ÑH‰ï1ÀèP½…À‰yûÿÿLѹ†éÝñÿÿL ѹ“éÌñÿÿLøÐ¹é»ñÿÿLçй˜éªñÿÿLÖй›é™ñÿÿDSH‰û¸ H…ÿt ‹WP…Òt 1À[ÀÇGPHX1öèj½…ÀtßÇCP¸[ÃfDfDSH‰ûH…ÿ„³‹w…ötH‹?H…ÿtè½€„Hƒ{tYH‹{@H…ÿtè)¼H‹{HH…ÿtè¼H‹{H…ÿtèU¼H‹{8H…ÿtèÁYH‹{H…ÿtèƒI‹KP…ÉuH‰ß[é)¼H‹;H…ÿtŸèÑ»ë˜H{Xè¼H‰ß[é¼€€[À€H‰\$àH‰l$èL‰d$ðL‰l$øHƒì8I‰ü‰õI‰Õ¿è ¼H‰ÃH…Àu^A¹LÙç¹ÜHzË1ö¿1Àè×ÝIÇE½‰èH‹\$H‹l$ L‹d$(L‹l$0HƒÄ8À„HÇHÇ@Ç@Ç@Ç@ Ç@$Ç@PHÇ@0HÇ@8HÇ@@HÇ@HHÇ@Æ€˜‰îL‰çèEaH‰C8H…À„ˆ¾#H‰Çè;X‰Å…Àt,H‰ßè þÿÿIÇEƒý„2ÿÿÿƒý„)ÿÿÿ½éÿÿÿHT$ H‰æH‹{8è(^‰Å…Àu½L‹$$L‰æH=xÎèS»…Àu5ÇC(H=H‰C0I‰]éÖþÿÿH‰ßè˜ýÿÿIÇE½é¼þÿÿL‰æH=9Îè »…ÀuÇC(HõH‰C0ë¶L‰æH=Îè亅ÀuÇC(HÎH‰C0ëL‰æH=ýÍ轺…ÀuÇC(H§H‰C0éeÿÿÿL‰æH=ÜÍ蓺…ÀuÇC(H}H‰C0é;ÿÿÿL‰æH=»Íèiº…ÀuÇC(HSH‰C0éÿÿÿL‰æH=šÍè?º…ÀuÇC(H©8H‰C0éçþÿÿHƒ{0…ÜþÿÿH‰ßè}üÿÿIÇEé}þÿÿAWAVAUATUSHì¨H‰ýH‰t$8H‰T$0HÇ„$˜HÇ„$HÇ„$ˆHÇ„$€HÇD$xƇ˜D‹g E…ä„ùÇG E1íè&§ÿÿI‰ÄH…À„±L‰¨HÇD$PÇD$\L¼$˜L¬$H„$ˆH‰D$ H”$€H‰T$HL$xH‰L$ID$`H‰D$IT$xH‰$DfDH‹}8è'Y‰Ã…À…ñH‹}81ÒL‰þèoV‰Ã…À…GH‹œ$˜H5fÎH‰ßèÒ¸…À…æH‹}81ÒL‰îè8V‰Ã…À…H‹´$L‰çèN¯ÿÿëŒE1íHƒtlH‹}8è©X‰Ã…À„€„ƒû”ƒû ”ÀHƒ|$0t H‹L$0HÇ„Àu„Òuƒût ƒû …š‰ØHĨ[]A\A]A^A_ÃH‹?èP·I‰ÅH…Ày„Lr˹#HÇ1ö¿ 1ÀèeÙ» 1Ҹ냀H5‰ÍH‰ßèÕ·…Àu-H‹}81ÒL‰îè?U‰Ã…À…H‹´$L‰çèU«ÿÿéþÿÿH5pÍH‰ßè•·…Àu-H‹}8L‰îèAT‰Ã…À…÷H‹´$L‰çè¯ÿÿéRþÿÿfH5[ÍH‰ßèU·…À„gD‹u(Aƒþ~H5ÍH‰ßè4·…À„&H5ÌÍH‰ßè·…À…‘H‹}81ÒL‰îèƒT‰Ã…À…8H‹¼$èl…À„“H‹L$8H‹9H…ÿ„Í‹9Ð…'H‰|$Pé¯ýÿÿH5¤ÏH‰ßè´¶…À…}H‹}81ÒL‰îèT‰Ã…À…° H‹}8L‰îèDS‰Ã…À…{ Iƒ|$`„ HÇÁÿÿÿÿHXÉH‰ÎH‹|$èß…Àu$H‹”$HÇÁÿÿÿÿH‰ÎH‹|$èãÞ…À„ýÿÿH½˜HVϾ€1Àèñµ»H‹L$8Hƒ9uHƒ|$Pt H‹|$Pè/L‰çè¥ÿÿérýÿÿH‹}81ÒL‰îèTS‰Ã…À…êH‹¼$èk´A‰$…À…¡üÿÿH‹Œ$H½˜HË˾€èqµëƒ€„H5¹ÌH‰ßèuµ…Àt_H5íÌH‰ßèbµ…À…ßH‹}81ÒL‰îèÈR‰Ã…À…ÎH‹œ$H5+ÆH‰ßèµ…À…_AŒ$ éþûÿÿH‹}81ÒL‰îè€R‰Ã…À…H‹œ$H5ãÅH‰ßèÑ´…À…GAƒŒ$ é¹ûÿÿH½˜Hʾ€1Àè´»º1Àé:üÿÿH½˜H ʾ€1Àèd´ésþÿÿH´$˜H‹}81ÒèìQ‰Ã…À…‹E(ƒø„Tƒø„©ƒø„σø„»ƒø„rÿÈ„WH½˜HDɾ€1Àèð³»1Ò1ÀéžûÿÿH‹}81ÒL‰îètQ‰Ã…À… H‹¼$苲A‰D$p…À…ÀúÿÿH‹Œ$H½˜HBʾ€è³éŸýÿÿDfD»é\ûÿÿH½˜Hɾ€1Àè\³ékýÿÿH5?ËH‰ßèl³…Àt\H5~ËH‰ßèY³…À…ìH‹}81ÒL‰îè¿P‰Ã…À…t H‹œ$H5"ÄH‰ßè³…À…êAƒŒ$ éøùÿÿH‹}81ÒL‰îèzP‰Ã…À…ðH‹œ$H5ÝÃH‰ßè˲…À…‹AŒ$ é°ùÿÿH‹¼$˜H5ùÅè°²H½˜HFÇ…À„ ùÿÿéuþÿÿH5‰ÃH‰ßès²…À„iùÿÿH½˜H‰ÙHÈɾ€1Àè<²»éFüÿÿfH½˜HºÅ¾€1À貃û”ƒû ”ÀéÁùÿÿH½˜HÏǾ€1Àèë±éúûÿÿ‰ÇèŸH‰D$PH…À…áøÿÿH½˜HÐȾ€è¹±»éàûÿÿ€„H5¹ÂH‰ß裱…À„™øÿÿH½˜H‰ÙH@ɾ€1Àèl±»évûÿÿfH½˜HRǾ€1ÀèF±éUûÿÿH5ÁÉH‰ßèV±…À…JH‹}81ÒL‰îè¼N‰Ã…À…[H‹œ$H5ÂH‰ßè ±…À…cAŒ$ éò÷ÿÿH‹¼$˜H5Äèò°H½˜HˆÄ…À„M÷ÿÿé·üÿÿH‹¼$˜H5ÄèðH½˜H™Å…À„÷ÿÿéˆüÿÿH‹¼$˜H5ÂÃè”°H½˜HjÄ…À„ïöÿÿéYüÿÿH‹¼$˜H5œÃèe°H½˜H{Ä…À„Àöÿÿé*üÿÿH5?ÁH‰ßè)°…À„÷ÿÿH½˜H‰ÙHȾ€1Àèò¯»éüùÿÿ„H5©ÈH‰ßèõ¯…À…*ùÿÿH‹}8L‰îèL‰Ã…À…µH‹¼$H‹$HÇÆÿÿÿÿèËä…À„£öÿÿH½˜HuȾ€1Àèy¯»éƒùÿÿ€„H‹¼$˜H5°Âèp¯H½˜HÆÃ…À„Ëõÿÿé5ûÿÿH‹Œ$H½˜H ƾ€è¯é ùÿÿH5%ÀH‰ß诅À„öÿÿH½˜H‰ÙHDǾ€1ÀèØ®»éâøÿÿ€€H½˜HÚľ€1À覮éµøÿÿH½˜Hcž€1À臮é–øÿÿH‹œ$‰×èCùH‰ÁH½˜I‰ØH‡Å¾€1ÀèS®» é]øÿÿH½˜HžÅ¾€1Àè/®é>øÿÿH½˜HœÄ¾€1Àè®éøÿÿH5qÇH‰ßè ®…À…3H‹}81ÒL‰îè†K‰Ã…À…DH‹¼$è¬A‰D$h…À…ÒôÿÿH‹Œ$H½˜H<Ǿ€è¢­»é¬÷ÿÿ„H5©¾H‰ßè“­…À„‰ôÿÿH½˜H‰ÙHƾ€1Àè\­»éf÷ÿÿfH½˜Hìľ€1Àè6­éE÷ÿÿH‹¼$H‹T$HÇÆÿÿÿÿèHâ…À„ ôÿÿH½˜HGƾ€1Àèö¬»é÷ÿÿfDfDH½˜HÆÄ¾€1ÀèÆ¬éÕöÿÿH5ÆH‰ßèÖ¬…ÀunH‹}81ÒL‰îè@J‰Ã…À…£H‹¼$èQ«òZÀóAD$lWÉ.È‚‚óÿÿH‹Œ$H½˜HDƾ€1ÀèP¬»éZöÿÿfDH5`ÆH‰ßèU¬…ÀuxH‹}81ÒL‰îè¿I‰Ã…ÀuEH‹¼$èàªA‰„$ˆAŒ$ €éóÿÿH½˜H¯Å¾€1ÀèÙ«éèõÿÿH½˜Hóž€1À身éÉõÿÿH5õÅH‰ßèÊ«…À…åAƒþŽH‹}81ÒL‰îè&I‰Ã…À…¸H‹}81ÒH‹t$ è I‰Ã…À…žH‹}81ÒH‹t$èòH‰Ã…À…„H‹}81ÒH‹t$èØH‰Ã…À…jH‹œ$H5‰ÅH‰ßè)«…À…êH‹œ$ˆH5pÅH‰ßè «…Àu{H‹¼$€è¯©òZÀóA„$ŒH‹|$xè—©òZÀóA„$ƒL$\éÇñÿÿH½˜H4þ€1Àèªé¬ôÿÿH½˜Hüþ€1Àè~ªéôÿÿH5æÄH‰ßè|ª…À…½H‹¼$€è©òZÀóA„$”H‹|$xè©òZÀóA„$˜ƒL$\é5ñÿÿH½˜H‰ÙHÔľ€1À誻éôÿÿH½˜Hž€1Àèä©éóóÿÿH½˜Hÿ¾€1ÀèÅ©éÔóÿÿH½˜H¾€1À覩éµóÿÿH½˜H×Á¾€1À臩é–óÿÿ…ŒðÿÿH‹}81ÒL‰îèG‰Ã…À… H‹}81ÒH‹t$ èôF‰Ã…À…†H‹}81ÒH‹t$èÚF‰Ã…À…lH‹œ$H5‹ÃH‰ßè+©…À…ìþÿÿH‹œ$ˆH5ôÃH‰ßè ©…À…ÉH‹¼$€è­§òZÀóA„$ óA„$˜óA„$ƒL$\éÉïÿÿH5µÃH‰ßèΨ…À…QH‹}81ÒL‰îè4F‰Ã…À…§H‹}81ÒH‹t$ èF‰Ã…À…H‹¼$è+§òZÀóA„$¤H‹¼$ˆè§òZÀóA„$¨AŒ$ é9ïÿÿH5ÃH‰ßè,¨…À…QH‹¼$€èͦòZÀóA„$”óA„$ŒƒL$\éóîÿÿH½˜HÛ¾€1ÀèɧéØñÿÿH½˜H¾€1À誧é¹ñÿÿH5ÂH‰ß訧…À…H‹¼$€èI¦òZÀóA„$œH‹|$xè1¦òZÀóA„$ ƒL$\éaîÿÿH5jÂH‰ßèf§…À…÷H‹}81ÒL‰îèÌD‰Ã…À…ÀH‹}81ÒH‹t$ è²D‰Ã…À…¦H‹¼$èÃ¥òZÀóA„$¬H‹¼$ˆè¨¥òZÀóA„$°AŒ$ éÑíÿÿH5¸ÁH‰ßèĦ…Àu%H‹¼$€èi¥òZÀóA„$œƒL$\é™íÿÿH½˜H‰ÙHÁ¾€1Àèl¦»évðÿÿH½˜HwÁ¾€1ÀèH¦éWðÿÿH5yÁH‰ßèX¦…ÀuyH‹}81ÒL‰îèÂC‰Ã…À…çH‹}81ÒH‹t$ è¨C‰Ã…À…ÍH‹¼$蹤òZÀóA„$´H‹¼$ˆèž¤òZÀóA„$¸AŒ$ éÇìÿÿH5 ÁH‰ßèÌ¥…À…°ìÿÿƒ|$\t‹\$\…Û…„H‹}8èÄE‰Ã…ÀuEH‹}8èµE‰Ã…Àu6H‹T$PA‹4$L‰çèÞŸÿÿ‰Ã…ÀtsH½˜H Á¾€1Àè>¥éMïÿÿH½˜H»À¾€1Àè¥é.ïÿÿAŒ$ €é|ÿÿÿH½˜H[À¾€1Àè碌éùîÿÿH„$H‰D$(H‹}81ÒH‰ÆèjB‰Ã…Àu‹H‹œ$H5œÀH‰ßèѤ…À…ÙH‹T$PD‹ZE…ÛŽˆE1íëN€€H‹¼$WÀ€?*tè3£òZÀWèS£óC„¬¼AEIÿÅH‹L$P9A~5H‹}81ÒH‹t$(èÐA‰Ã…ÀtªH½˜H À¾€1Àè¤éîÿÿAŒ$ @H‹}8è6D‰Ã…À…œH‹}81ÒH‹t$(è|A…À…„H‹œ$I‹D$L‹(WÀ€;*tH‰ßè|¢òZÀWI蜢óAEH‹D$PƒxŽ“A½A¾ëEI‹D$H‹H‹¼$WÀ€?*tè,¢òZÀWùèL¢óAAÿÅIƒÆH‹L$PD9i~@H‹}81ÒH‹t$(èÌ@‰Ã…Àt¥H‹T$P‹JH½˜E‰èHE¿¾€1Àè£éíÿÿH‹}8è3C‰Ã…ÀtH½˜HW¿¾€1ÀèÓ¢éâìÿÿE1íH‹}81ÒH‹t$(è[@‰Ã…À…ðI‹D$H‹H‹¼$WÀ€?*tè\¡òZÀW)è|¡óB+IƒÅIƒýu©E‹$E…ÒŽbAµH‹}8è›B‰Ã…À…H‹}81ÒH‹t$(èá?‰Ã…À…H‹¼$èø ‰D$DD9è…´H‹D$PD‹HE…ÉŽŸIcÅHÁàH‰D$HE1öE1ÿëV€I‹D$H‹L$HH‹H‹¼$WÀ€?*tè• òZÀWbèµ óB;AÿÆIƒÇH‹D$PD9pŽ5H‹}81ÒH‹t$(è1?‰Ã…Àt›H½˜E‰ñH‹T$PD‹B‹L$DHÕ¾¾€1Àèa¡épëÿÿfDfDH½˜HR½¾€1Àè6¡éEëÿÿH½˜Hc¼¾€1Àè¡é&ëÿÿAÿÅE9,$¡þÿÿH‹}8è‰Ã…Àt>H½˜HÁ¾€1ÀèÆ éÕêÿÿH½˜Hk½¾€1Àè§ é¶êÿÿL‹¬$H5þÀL‰ï诠…À…ƒ}(ŽA‹„$ ¨tI‹D$8Æ Ic$I‹D$8ÆDA‹„$ ©tI‹D$@Æ Ic$I‹D$@ÆDA‹„$ ©tI‹D$HÆ Ic$I‹D$HÆDA‹„$ ¨tI‹D$PÆ Ic$I‹D$PÆDA‹„$ öÄtI‹„$€ÇIƒ|$ „*A‹<$…ÿ~,H‹L$8Hƒ9uH‹D$PH‰Hƒ|$0„'H‹T$0L‰"évçÿÿH½˜HbÀ¾€1ÀèvŸ»é€éÿÿH‹}81ÒH‹t$(èü<‰Ã…À…BAö„$!tIcÝHÁãIœ$€H‹¼$èù‰ƒ}(~;H‹}81ÒH‹t$(è³<‰Ã…À…Aö„$"tIcÍI‹T$HH‹„$¶ˆ H‹}81ÒH‹t$(èx<‰Ã…À…’Aö„$ tIcÍI‹T$8H‹„$¶ˆ ƒ}(~;H‹}81ÒH‹t$(è7<‰Ã…À…sAö„$"tIcÍI‹T$@H‹„$¶ˆ H‹}81ÒH‹t$(èü;‰Ã…À…ôAö„$ tIcÍI‹T$PH‹„$¶ˆ H‹}8èh>‰Ã…À…žH‹T$PD‹BE…ÀŽ«IcÅHÁàH‰D$`E1öE1ÿëS„I‹D$H‹T$`H‹H‹¼$WÀ€?*t蕜òZÀWbý赜óB;AÿÆIƒÇH‹L$PD9q~DH‹}81ÒH‹t$(è5;‰Ã…ÀtŸH½˜E‰ñH‹L$PD‹AD‰éHÒ¼¾€1ÀèféuçÿÿH‹}8è˜=‰Ã…À…¬IcÅHÁàH‰D$hE1öE1ÿëTf.„I‹D$H‹T$hH‹H‹¼$WÀ€?*tèÕ›òZÀW¢üèõ›óB;AÿÆIƒÇAƒþ„ÔûÿÿH‹}81ÒH‹t$(èv:‰Ã…Àt H½˜E‰ñH‹D$PD‹@D‰éH«¼¾€1Àè§œé¶æÿÿH½˜D‰éHA¼¾€1Àè…œ锿ÿÿH½˜D‰éH‡»¾€1ÀècœéræÿÿH½˜D‰éH»¾€1ÀèAœéPæÿÿH½˜D‰éHkº¾€1Àèœé.æÿÿH½˜D‰éH‘º¾€1Àèý›é æÿÿ1öL‰çè^ŒÿÿA‰Å…À„jûÿÿH½˜Hm¼¾€1ÀèÉ›D‰ëéÕåÿÿH½˜L‰éH ¼¾€1À褛»é®åÿÿH½˜HQ¼¾€1À耛»éŠåÿÿL‰ç變ÿÿéOãÿÿH½˜L‹Œ$E‹$D‰éH|¸¾€1Àè@›»éJåÿÿH½˜E‹$D‰éH ¸¾€1Àè›é$åÿÿH½˜D‰éH¯¸¾€1ÀèóšéåÿÿH½˜D‰éHÕ¸¾€1ÀèÑšéàäÿÿfDfDH‰\$àH‰l$èL‰d$ðL‰l$øHƒì8H‰ýI‰ôH|$ H‰éº¾èË™H…ÀtV‹D$ E1í…À~{HcøèšH‰ÃI‰ÅH…Àtx‹D$ HcÐH‰é¾H‰ßè‘™H…ÀuLH…ÛtH‰ßè…™¸ë „¸IÇ$H‹\$H‹l$ L‹d$(L‹l$0HƒÄ8Ãf.„M‰,$1ÀëÕ„‹D$ …Àt„LcÈLVŹ¢H÷¨1ö¿1ÀèT»¸ë’fD€H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHì˜I‰ýI‰÷H‰T$‰L$M‰ÆHÇD$@HÇD$8HÇD$0è™H‰Ã¿èà˜H‰ÅH…À…ÀA¹L«Ä¹"HL¨1ö¿1À詺»H‹|$0H…ÿtèK˜H‹|$8H…ÿtè<˜H‹|$@H…ÿtè-˜H…ítH‰ïèjÛÿÿH‹D$Hǃût ƒû¸E؉ØH‹\$hH‹l$pL‹d$xL‹¬$€L‹´$ˆL‹¼$HĘÃfD€A‰ÜHÇHÇ@Ç@Ç@Ç@ Ç@$Ç@PHÇ@0HÇ@8HÇ@@HÇ@HHÇ@Æ€˜H5vÍL‰ïè1˜…À„¦ƒû÷Hƒ}„ÿ‹D$…Àu Hƒ}„5Hƒ}„%D‹}$E…ÿ„ØH‹]H‰ßèð—HT$8LcàL‰æH‰ßè×ÌH‹D$8AÆDÿfH‹|$8H5¿¹è³–H‰E@H…À„H‹D$8AÆDÿpH‹|$8H5–¹芖H‰EHH…À„¼H‹D$8AÆDÿiHuH‹|$8è Z‰Ãƒø„9ƒø„âƒø„m…À„GM…ötH‹MH/»¾€L‰÷1Àèø–»éÚýÿÿH‹UH|$8H5F»1Àè·¼‰Ã…À„„M…ö„°ýÿÿH,»¾€L‰÷1Àè®–é•ýÿÿH‹UH|$8H5—¸1Àèr¼1Û…À•Ã…Û„M…ö„fýÿÿH{¸¾€L‰÷1Àèd–éKýÿÿH‹˜H‹H‰EÇEHUHÇÆÿÿÿÿH==·ècˉÅÀ„-þÿÿM…ö„ ýÿÿH)·¾€L‰÷1Àè –éñüÿÿHcÃH‰D$I|ýH5%·è–…À…èýÿÿL‰ï謵…À…ÞM…ötUL‰éHý¶¾€L‰÷踕»éšüÿÿM…ÿ„3M…öt&M‰øL‰éHó·¾€L‰÷1Àè„•»éfüÿÿ»é\üÿÿM…ötñH‹MH@¸¾€L‰÷èS•»é5üÿÿHuH‹|$8è X‰Ãƒø„ƒø„Ÿ…À„Oƒø„FM…ö„ùûÿÿH,º¾€L‰÷1Àè÷”éÞûÿÿH5ΕL‰ïè ”H‰EH…À„vHUIcôL‰ïè÷ɉÅÀ„ÌüÿÿM…ö„ ûÿÿH…¶¾€L‰÷1Àèž”é…ûÿÿM…ö„ÿÿÿH‹MH·¾€L‰÷èx”»éZûÿÿH‹|$8H5‘¶è…“H‰ÃH…À„ÓH‹}H…ÿtèA“H‰]ÇE$H‹}èu“HUH‹|$8HÇÆÿÿÿÿèJɉÅÀ…SÿÿÿH‹|$8èL“HÇD$8éüÿÿM…ö„ÛúÿÿH‹MH4·¾€L‰÷1ÀèÕ“é¼úÿÿH‹|$8è “HÇD$8Ld$PH‹Mº¾L‰çèâ’H…À…•M…ö„˜üÿÿHɸ¾€L‰÷è|“»é^úÿÿM…ö„ïýÿÿL‰éH¶¾€L‰÷1ÀèP“»é2úÿÿM…ö„)úÿÿH‹MHº¶¾€L‰÷1Àè#“é úÿÿM…ö„úÿÿH‹MH’·¾€L‰÷1Àèû’éâùÿÿH|$0L‰êH5E´1ÀèÀ¸‰Ã…À„ÖM…ö„¹ùÿÿH6´¾€L‰÷1Àè·’éžùÿÿM…ö„±ûÿÿH‹MHn¶¾€L‰÷1Àè’³étùÿÿM…ö„kùÿÿH‹MHL·¾€L‰÷1Àèe’éLùÿÿHL$@H‰êL‰þL‰ïè}È…À…oýÿÿL‹d$@H]L‰çèj’HcðH‰ÚL‰çèVljÅÀ…_ýÿÿH‹|$@èX‘HÇD$@éúÿÿ‹D$P;„H; „];úŽ„;ꎄ—;ÚŽ„¶;ÊŽ„“D‹m$E…í„´M…ö„ªúÿÿH‹MHÿ¶¾€L‰÷1À舑»éjøÿÿHƒ}…cýÿÿHL$@H‹|$8H‰êL‰þèŽÇ…À…FýÿÿH‹}è“HUH‹|$@HÇÆÿÿÿÿèhƉÅÀ„“M…ö„øÿÿHV³¾€L‰÷1Àè‘éö÷ÿÿf.„H‹|$0H5בè³H‰EH…ÀtoHUH‹t$L‰ïèÆ‰Ã…À…üÿÿÇEH‹|$0èHÇD$0é°øÿÿÇE(H^H‰E0H‹D$H‰(1ÛéÍ÷ÿÿÇE(H=H‰E0ëÝM…ö„ôúÿÿL‰éH²¾€L‰÷èW»é9÷ÿÿÇE(HÿH‰E0ëŸÇE(HëH‰E0ë‹ÇE(H×H‰E0étÿÿÿÇE(HÀH‰E0é]ÿÿÿHƒ}0…Rÿÿÿ…Àˆ¹H‹}è›4H‰ÇH‰E8H…Àt{¾#èu,‰Ã…Àt0M…ö„¢öÿÿH/¶¾€L‰÷1Àè é‡öÿÿÇE$éûÿÿH‹}8ºL‰æè¾0‰Ã…ÀtvM…ö„[öÿÿH ¶¾€L‰÷1ÀèYé@öÿÿ»M…ö„2öÿÿHµ¾€L‰÷1Àè0éöÿÿM…ö„*øÿÿHó´¾€L‰÷1Àè »éîõÿÿHT$LHt$(H‹}8èÏ1‰Ã…Àt$M…ö„ÌõÿÿHɵ¾€L‰÷1ÀèÊŽé±õÿÿH‹\$(H‰ÞH=ú¡èÕŽ…ÀuÇE(H¿ÔÿÿH‰E0éüýÿÿH‰ÞH=Ù¡諎…ÀuÇE(H•ÔÿÿH‰E0éÒýÿÿH‰ÞH=¸¡èŽ…ÀuÇE(HkÔÿÿH‰E0é¨ýÿÿH‰ÞH=—¡èWŽ…ÀuÇE(HAÔÿÿH‰E0é~ýÿÿH‰ÞH=v¡è-Ž…ÀuÇE(HÔÿÿH‰E0éTýÿÿH‰ÞH=U¡èŽ…ÀuÇE(HíÓÿÿH‰E0é*ýÿÿH‰ÞH=4¡èÙ…ÀuÇE(HC H‰E0éýÿÿM…ö„™öÿÿH‰ÙH§´é{öÿÿfE1À¹éÃóÿÿI‰È¹é³óÿÿE1À1Éé¦óÿÿfDI‰È1Éé–óÿÿfDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìXH‰ýH‰4$I‰×Ƈ˜H‹?茅ÀtQA¾DfDM…ÿtIÇD‰ðH‹\$(H‹l$0L‹d$8L‹l$@L‹t$HL‹|$PHƒÄXÀ€‹E …À„¥ÇE 1ÛèWzÿÿI‰ÄH…À„ðH‰˜H¸ H‹Mº¾誋H…À„H‹Mº¾L‰çè‹‹H…À…H½˜H4´¾€è*Œf.„»L‰çèS{ÿÿA‰ÞéÿÿÿDfD1ÛHƒ}uH‹}è@‹H‰ÃH…ÀˆžH|$H‹Mº¾è ‹H…À„Àþÿÿ‹E(ƒø„ƒø„©ƒø„Jƒø„Kƒø„|ÿÈ…O‹D$;Ÿˆ„ÝþÿÿH½˜Hû²¾€1Àè_‹A¾édþÿÿ@H½˜H-³¾€è8‹éÿÿÿH|$H‹Mº¾è[ŠH…À„œH‹$H‹H‰D$H…À„Ž‹|$98„è¼ÕH‰ÃH‹D$‹8è­ÕH‰ÁH½˜I‰ØHñ¡¾€1À轊» H‹$Hƒ:…þÿÿH‹|$èØé€þÿÿH½˜H[²¾€1ÀèŠA¾é†ýÿÿH½˜H„²¾€è^Šé9þÿÿ‹D$;c‡…Ðþÿÿé¨ýÿÿLÀ¹fHV™1ö¿ 1À賫A¾ é(ýÿÿ‹D$;‡…þÿÿégýÿÿ‹D$; ‡…zþÿÿéRýÿÿH‹T$A‹4$L‰çè]„ÿÿA‰Æ…À…?A‹$A½»…À#éºf.„AÿÅA‹$HƒÃD9茜I‹„$HcPI‹D$H‹<H‹M¾蹈H…ÀuÄH½˜D‰éHÔ±¾€èY‰»é—þÿÿ‹D$;]†…ÆýÿÿéžüÿÿH½˜Hݰ¾€1Àè ‰A¾é%üÿÿ‹D$;'†…Œýÿÿédüÿÿ…Àˆ+E1í1ÛëAÿÅHƒÃE9,$ŒªI‹„$HcPI‹D$H‹<H‹M¾èý‡H…ÀuÇH½˜D‰éH/±¾€èˆ»éÛýÿÿH½˜HÚ°¾€1Àèyˆ»é·ýÿÿ‹|$è&çH‰D$H…À…jþÿÿH½˜Hƒ°¾€è@ˆ»éüÿÿA‹$…ÀxaE1í1Ûë€AÿÅHƒÃE9,$|FI‹D$H‹<H‹Mº¾è7‡H…ÀuÒH½˜D‰éH€°¾€èׇ»éýÿÿIt$ H‹}èÿìÿÿ…À…¤A‹„$ öÄ…P¨…⨅§©…X©…³¨…xöÄ t&A‹$ƒÂHcÒI‹|$XH‹M¾è–†H…À„It$`H‹}èìÿÿ…À„žH½˜Hy°¾€1À臻é[üÿÿH½˜H¹¯¾€1Àèù†»é7üÿÿA‹$ƒÂHcÒI‹|$8H‹M¾è†H…À„áA‹„$ é&ÿÿÿIt$0H‹}èîëÿÿ…À…šA‹„$ éûþÿÿI|$hH‹Mº¾èÁ…H…À…ÞH½˜HЯ¾€è`†»éžûÿÿIt$(H‹}èˆëÿÿ…À…èA‹„$ éþÿÿA‹$ƒÂHcÒI‹|$@H‹M¾èV…H…À„mA‹„$ éuþÿÿA‹$ƒÂHcÒI‹|$PH‹M¾è#…H…À„^A‹„$ éUþÿÿA‹$ƒÂHcÒI‹|$HH‹M¾èð„H…À„ãA‹„$ éþÿÿI|$lH‹Mº¾è„H…À„)ƒ}(~!I|$pH‹Mº¾蛄H…À„QIt$xH‹}è„êÿÿ…À…ƒAö„$!t(A‹$ÿÂHcÒI‹¼$€H‹M¾èR„H…À„tI¼$ˆH‹Mº¾è.„H…À„ ƒ}(ŽI¼$ŒH‹Mº¾è„H…À„GI¼$¤H‹Mº¾è܃H…À„Aö„$!@…¥ƒ}(ŽFH‹$Hƒ:uH‹D$H‰M…ÿ„ìM‰'és÷ÿÿ€H½˜H¼­¾€è8„»évùÿÿH½˜H^­¾€è„»éTùÿÿH½˜HÙ¬¾€1Àèòƒ»é0ùÿÿH½˜Hɬ¾€1Àè΃»é ùÿÿH½˜Hɬ¾€1À誃»éèøÿÿH½˜H“¬¾€1À膃»éÄøÿÿH½˜H𬾀1Àèbƒ»é øÿÿH½˜H¬¾€1Àè>ƒ»é|øÿÿ1öL‰çèšsÿÿ‰Ã…À„¦þÿÿH½˜Hª£¾€1ÀèƒéIøÿÿH½˜H…¬¾€èé‚»é'øÿÿI‹„$HcPI¼$¼H‹M¾èýH…À…0þÿÿH½˜H款€èœ‚»éÚ÷ÿÿH½˜Hœ¬¾€èz‚»é¸÷ÿÿH½˜HR¬¾€èX‚»é–÷ÿÿ…‘ýÿÿI¼$ŒH‹Mº¾èmH…Àt¸A‹„$ŒA‰„$ A‹”$”A‰”$œA‰„$˜A‹”$A‰”$”A‰„$A‰”$Œé$ýÿÿH½˜H¡«¾€èûé÷ÿÿH½˜HW«¾€1À蟻éÝöÿÿH½˜HH«¾€è}»é»öÿÿL‰çè«pÿÿé‚ôÿÿfDAWAVAUATUSHìI‰üH‰t$PH‰T$HHÇ„$øHÇ„$ðHÇ„$èHÇ„$àHÇ„$ØÆ‡˜‹ …ÿ„AÇD$ 1íè¤nÿÿI‰ÅH…À„ˆH‰¨HÇD$`L¼$ðL´$èH„$€H‰D$0H”$àH‰T$(IE`H‰D$ IUxH‰T$fDfDI‹|$8è¶ ‰Ã…À…oI‹|$81ÒL‰þèý‰Ã…À…H‹œ$ðH5ô•H‰ßè`€…Àu8I‹|$81ÒL‰öèɉÅÀ…ÛH‹´$èL‰ïèßvÿÿëfD€H5É•H‰ß者Àu=I‹|$81ÒL‰öè~‰Ã…À…DH‹´$èL‰ïè”sÿÿé?ÿÿÿ€„H5 •H‰ßèÅ…Àu-I‹|$8L‰öèp‰Ã…À…–H‹´$èL‰ïèFwÿÿéñþÿÿH5‹•H‰ßè……À„ H5–H‰ßèn…À…·I‹|$81ÒL‰öèӉÅÀ…ùH‹¬$èH5³©H‰ïè$º…À….H‹D$PH‹8H…ÿ„Ä‹9Ð…ÚH‰|$`é`þÿÿ1íIƒ|$„ÿI‹|$8è‰Ã…À„(€€ƒûA”ăû @”ÅH‹¼$øH…ÿtèðIÿÿHƒ|$Ht H‹T$HHÇ@„íuE„äuƒût ƒû …‰ØHÄ[]A\A]A^A_ÃI‹|$81ÒL‰öèá‰Ã…À…H‹¼$èèø|A‰E…À…žýÿÿH‹Œ$èI¼$˜HW”¾€èý}H‹D$PHƒ8uHƒ|$`t H‹|$`è@ËL‰ïèmÿÿé#ÿÿÿI‹<$è}H‰ÅH…À‰ìþÿÿL:‘¹ãHÐŒ1ö¿ 1Àè-Ÿ» E1ä½ééþÿÿH5ä”H‰ßè }…ÀuEI‹|$81ÒL‰öè ‰Ã…À…H‹œ$èH5lŽH‰ßèZ}…À…ÐAƒ é³üÿÿH5m•H‰ßèH}…À…>I‹|$81ÒL‰ö證ÅÀ…CH‹œ$èH5ŽH‰ßèþ|…À… Aƒ éWüÿÿH5bÂH‰ïèÚ|…À…‘ºé±ýÿÿI¼$˜HA’¾€1Àè›|é™þÿÿH´$ðI‹|$81Òè"‰Ã…ÀtXI¼$˜H¾€1Àèa|ƒûA”ăû @”Åé¬ýÿÿ»éàýÿÿI¼$˜Hꑾ€1Àè)|é'þÿÿH‹¼$ðH5è4|…À„ûÿÿI¼$˜Ha¦¾€1Àèí{»E1ä1íé<ýÿÿH5^”H‰ßèó{…À„¤H5”H‰ßèÜ{…À…àI‹|$8L‰ö胉ÅÀ…òH‹¼$èH‹T$HÇÆÿÿÿÿè°°…À„øúÿÿI¼$˜HY”¾€1Àè]{»éVýÿÿI¼$˜H½¾€1Àè5{»A¼1íéüÿÿI‹|$81ÒL‰ö贉ÅÀ…ùH‹œ$èH5ŒH‰ßè{…À…ëA é[úÿÿH5ô‹H‰ßèÞz…À„DúÿÿI¼$˜H‰ÙH“¾€1Àè¦z»éŸüÿÿfDfDI¼$˜HY¾€1ÀèuzésüÿÿH5‰‹H‰ßèsz…À„ÙùÿÿI¼$˜H‰ÙHÇ‘¾€1Àè;z»é4üÿÿ‰×èéØH‰D$`H…À…›ùÿÿI¼$˜H‘¾€èz»éüÿÿ„I¼$˜Há¾€1ÀèÕyéÓûÿÿH5Õ’H‰ßèåy…À…ùI‹|$8L‰ö茉ÅÀ…Iƒ}`„‹HÇÁÿÿÿÿH¡ŒH‰ÎH‹|$ èL¢…Àu$H‹”$èHÇÁÿÿÿÿH‰ÎH‹|$ è,¢…À„ÔøÿÿI¼$˜Hž’¾€1Àè9y»é2ûÿÿ€„I¼$˜H9¾€1ÀèyéûÿÿH5ŠH‰ßèy…À„iøÿÿI¼$˜H‰ÙH‘¾€1ÀèËx»éÄúÿÿH5&’H‰ßèÕx…À…ËI‹|$81ÒL‰öè:‰Ã…À…) H‹¼$èèQwA‰Eh…À…÷÷ÿÿH‹œ$èH5£H‰ßè„x…À„Ø÷ÿÿI¼$˜H‰ÙHÖ‘¾€1Àè:x»é3úÿÿI¼$˜Hñ޾€1Àèxéúÿÿ‰ÇèÙÂH‰ÁI¼$˜I‰èH¾€1Àèèw» éáùÿÿH5Ú’H‰ßèów…À…'I‹|$81ÒL‰öèX‰Ã…À…ç I‹|$81ÒH‹t$(è=‰Ã…À…Ì H‹¼$èèNvòZÀóA…¤H‹¼$àè4vòZÀóA…¨A éÏöÿÿI¼$˜H£Ž¾€1Àè4wé2ùÿÿI¼$˜H‰éH ޾€1ÀèwéùÿÿH‹¼$èH‹T$ HÇÆÿÿÿÿè#¬…À„köÿÿI¼$˜H!¾€1ÀèÐv»éÉøÿÿfDI¼$˜Hõ޾€1Àè¥v飸ÿÿH5¹‘H‰ßèµv…À…˜I‹|$81ÒL‰öè‰Ã…À…i I‹|$81ÒH‹t$(èÿ‰Ã…À…N H‹¼$èèuòZÀóA…¬H‹¼$àèötòZÀóA…°A é‘õÿÿI¼$˜H޾€1Àèöuéô÷ÿÿH5'‘H‰ßèv…ÀuxI‹|$81ÒL‰öèo‰Ã…À…Þ I‹|$81ÒH‹t$(èT‰Ã…À…à H‹¼$èèetòZÀóA…´H‹¼$àèKtòZÀóA…¸A éæôÿÿH5 H‰ßè{u…À…ñH‹T$`‹2…ö„½1í‹J…É{é²ôÿÿfH‹D$`‹XH‹¼$èWÀ€?*tDèásó*Ãó wÔó^ÈóZÉò*ÀòY£Ôò $èÛsò $òYÈòZÁH‹T$`‹ZH‹D$0ó¨EHÿÅ9ÃŽ<ôÿÿI‹|$81ÒL‰öèM‰Ã…À„sÿÿÿI¼$˜HpŸ¾€1Àèˆté†öÿÿI¼$˜H$Ÿ¾€1Àèht»éaöÿÿH5±H‰ßèst…À…ÇóÿÿI‹|$8è}‰Ã…ÀuGI‹|$8èm‰Ã…Àu7H‹T$`A‹uL‰ïè–nÿÿ‰Ã…Àt@I¼$˜HÁ¾€1ÀèõséóõÿÿI¼$˜Hq¾€1ÀèÕséÓõÿÿH‹|$`èBÿÿH‰„$øH…À„tH¬$èI‹|$81ÒH‰îè>‰Ã…Àu¨H´$àI‹|$81Òè$‰Ã…ÀuŽH´$ØI‹|$81Òè ‰Ã…À…pÿÿÿI‹uH‹H‹¼$èWÀ€?*tèrò*ÀòYèÒè%ròZÀI‹uóH‹ÇCH‹¼$ØWÀ€?*tèÖqò*ÀòY¬ÒèéqòZÀI‹uóCH‹º€?‰P Ç@‰PÇ@H‹T$`‹R…Ò~/E1É1ÿM‹EH‹Œ$øI‹H‹‹‰AÿÁHƒÇH‹D$`D9HâA‹E…ÀޝÇD$tH”$€H‰T$8I‹|$8訉ÅÀ…/I‹|$81ÒH‰îèï‰Ã…À…H‹¼$èèq‰D$l‹T$t9Ð…ÄH‹D$`‹@…ÀŽüHcD$tHÁàH‰D$XE1öE1ÿëxI‹EH‹T$XH‹H‹D$8óAóD$pH‹¼$èWÀ€?*t2èpóZD$pòD$@ò*ÀòYgÑè¤pòYD$@òD$@òZÀóAAÿÆIƒÇH‹D$`D9p~nI‹|$81ÒH‰îè‰Ã…À„oÿÿÿI¼$˜E‰ñH‹T$`D‹B‹L$lHºŽ¾€1ÀèFqéDóÿÿI¼$˜H*œ¾€1Àè&q»éóÿÿAö…!t8I‹|$81ÒH‰î裉ÅÀ…ØHc\$tHÁãI€H‹¼$èèªo‰I‹|$8è‰Ã…À…öI‹|$81ÒH‰îèW‰Ã…À…¹Aö… tHcL$tI‹U8H‹„$趈 H‹T$`‹B…À~:HcD$tL Å1ÿ1öM‹EH‹Œ$øK‹H‹‹‰ÿÇHƒÆH‹D$`9xãI‹|$8è|‰Ã…À…ªI‹|$81ÒH‰îèà ‰Ã…À…mAö… tHcL$tI‹UPH‹„$趈 A‹E;D$t"ÿD$t;D$tjýÿÿI‹uH˜H‹ÆÇ€?Ç@Ç@Ç@ €?Ç@Ç@€?Ç@I‹|$8èØ‰Ã…ÀuI‹|$81ÒH‰îè# ‰Ã…Àt I¼$˜H¶¾€1Àèboé`ñÿÿH‹œ$èH5¹H‰ßèjo…À……A‹… ¨tI‹E8Æ IcUI‹E8ÆDA‹… ¨tI‹EPÆ IcUI‹EPÆDIƒ} „A‹E…ÀŽ×1öL‰ïèO_ÿÿ‰Ã…ÀtHI¼$˜H꙾€1Àè¾né¼ðÿÿI¼$˜H‰ÙH¾€1Àè›n»é”ðÿÿHŒ$øE1ÉE1À1Ò1öL‰ïè§åþÿ‰Ã…Àu5H‹T$PHƒ:uH‹D$`H‰Hƒ|$Ht:H‹T$HL‰*H‹¼$øè¡9ÿÿéØïÿÿI¼$˜Hm™¾€1Àè!néðÿÿL‰ïèT]ÿÿëÄI¼$˜H㎾€1Àè÷m»éðïÿÿI¼$˜H£Ž¾€1ÀèÒm»éËïÿÿHcD$lHÁàH‰D$xE1öE1ÿëLfI‹uH‹D$xH‹H‹¼$èWÀ€?*tè\lò*ÀòY2ÍèolòZÀóAAÿÆIƒÇAƒþtiI‹|$81ÒH‰îè÷ ‰Ã…Àt¡I¼$˜E‰ñH‹T$`D‹B‹L$lH*¾€1Àè&mé$ïÿÿI¼$˜‹L$lH¾Š¾€1ÀèméïÿÿA‹Eé ýÿÿI¼$˜‹L$lH!‹¾€1ÀèÕléÓîÿÿI¼$˜‹L$lHÕ‹¾€1Àè±lé¯îÿÿI¼$˜‹L$lHi‹¾€1Àèlé‹îÿÿI¼$˜‹L$lH%Œ¾€1ÀèilégîÿÿI¼$˜L‹Œ$èE‹E‹L$tHu‰¾€1Àè9l»é2îÿÿI¼$˜E‹E‹L$tH‰¾€1Àè lé îÿÿI¼$˜H‡¾€1ÀèìkéêíÿÿI¼$˜H‡¾€1ÀèÌkéÊíÿÿI¼$˜H¾†¾€1Àè¬kéªíÿÿI¼$˜Hm„¾€1ÀèŒkéŠíÿÿI¼$˜H¦„¾€1ÀèlkéjíÿÿI¼$˜HÊ„¾€1ÀèLkéJíÿÿ‹O8H‹‡(HcpHÁæAH˜HcÑHÁâH”0H‚ÿÁHcÉH¯ÎHÈÃf„‹W0ƒú”ÀÿÊ” Ð¶ÀÃfDfD‹G0ÿȃø–À¶ÀÃH‰\$àH‰l$èL‰d$ðL‰l$øHƒì8H‰ûI‰ôóD$ ‹G0;F0t$¸H‹\$H‹l$ L‹d$(L‹l$0HƒÄ8ÃfD‹G<;FH‹ƒ(‹p…ö~6E1íE1äH‹EJ‹ ‹s<ÿÆöH‹CJ‹< è>AÿÅIƒÄH‹ƒ(D9hÐHUH{¾èÞ=HUH{¾èÌ=HU H{ ¾èº=HU(H{(¾è¨=‹C0‰E0‹C4‰E4‹C8‰E8‹C<‰E<‹C@‰E@‹CD‰EDH‹ƒH‰…H‹ƒ H‰… H‹ƒH‰…H‹ƒH‰…H‹ƒH‰…H‹}HH…ÿtè&ZH‹}PH…ÿtèZH‹}XH…ÿtè ZHUHH‹{HHÇÆÿÿÿÿèàA‰Ä…À…’þÿÿHUPH‹{PHÇÆÿÿÿÿèÁA‰Ä…À…sþÿÿHUXH‹{XHÇÆÿÿÿÿè¢A‰Ä…À…TþÿÿH‹s`H‹}`è„ZH‹shH‹}hèwZH‹spH‹}pèjZH‹sxH‹}xè]Z‹ƒ€‰…€‹ƒ„‰…„‹ƒˆ‰…ˆ‹ƒŒ‰…Œ‹ƒ‰…‹ƒ”‰…”‹ƒ˜‰…˜‹ƒœ‰…œ‹ƒ ‰… ‹ƒ¤‰…¤‹ƒ¨‰…¨‹ƒ¬‰…¬‹ƒ°‰…°º‹„“°‰„•°HÿÂHƒúuéécýÿÿfDH‰\$ðH‰l$øHƒìH‰ûH‹·(‹8èòÿÿH‰ÅH…ÀtH‰ÆH‰ßèÝüÿÿ…ÀuH‰èH‹\$H‹l$HƒÄÃH‰ïè¯ïÿÿ1íëâÇÇG(ÇG,ÇG01ÀÃf‹O0…É~‰1ÀÃD‹1ÉE…À~ñH‹W1ÿ@1À€:”ÀÁÿÇHÿÂD9Çuì‰1ÀÀ‹…É~H‹G WÀ1ÒóXÿÂHƒÀ9ÊuòóÃWÀÃfDfDI‰ø‹7‰ò…öŽ“1ÉE1ÉH‹E1Ûë#<„H< „0A‰ÖHÿÁIƒÁ9Â~b¶<uØ€|9uáI‹@J4D‹E…ÒuÑMTA‹…À~ʼnAÇI‹p H…ö„ÿIT1‹B‰D‰A‹A‰ÖHÿÁIƒÁ9ž‰ÐÁèÐÑø…ÀŽ¡E1ÉE1Ò€I‹HD)ÎHcÆHTÿ¶2A¶ ˆI‹@Aˆ4I‹PA‹D)ÈH˜H<…HLü‹1I‹‰‰2I‹@HL8ü‹1I‹‰‰0I‹@ H…ÀtHL8ü‹1I‹‰‰2AQA‹0IÿÁIƒÂ‰ðÁèðÑø9ÂŒlÿÿÿ1ÀÃf„€|9 …Åþÿÿéßþÿÿ€|9…µþÿÿéÏþÿÿA‹é¨þÿÿ„USH‰óH‰ÕE1ÉE1Û1öE1ÒE1Àë0„<tlBˆH‹W‹ŠB‰H‹W‹ŠB‰AÿÁIÿÂIƒÀD;}nH‹WIcɶ <uÄ€|uÁBÆH‹WHÁá‹ B‰H‹W‹D B‰AƒÁAÿÃëµ@€|uBÆH‹W‹DŠB‰H‹W‹ŠB‰AƒÁÿÆë†D‰H…ÛtD‰H…ít‰u1À[]ÃfD€AWAVAUATUSHƒì8I‰øH‰t$((ÈI‰Ö‹ÿÈ…ÀŽWE1ÿë7€û„÷€û„Ž€û„ÏDAWIÿÇA‹ÿÈ9ÐŽI‹FB¶8€û tÞA¶lI‹FJ½D‹,D‹dI‹F‹€ûtW€û„î@€ý t¨€ûuƒ@€ý„á@€ý„Þ@€ý„±@þÍ„çL‚¹Õé DfDH˜H‹L$(¶IcÍI‹@H‹4ÈI‹¸(ÁóL$L‰D$èÐóL$L‹D$érÿÿÿ@€ý„Ž@€ý„@€ý…úIcÕI‹@H‹ÐóóXÁóAWIÿÇA‹ÿÈ9Ðåþÿÿ1ÀHƒÄ8[]A\A]A^A_ÃH˜H‹L$(¶IcÍI‹@H‹4ÈI‹¸(ÁóL$L‰D$è0L‹D$óL$éÒþÿÿ@€ý„¥@€ýt|@þÍtwL¹çH1ö¿ 1Àèšu¸ HƒÄ8[]A\A]A^A_Ã@€ý„¯@€ý„ñ@þÍ„èL²€¹ïë¬@þÍ„ÿÿÿL›€¹ßë•IcÕI‹@H‹ÐHƒÀ óóXÁóéÔýÿÿI‹@H‹HƒÀóóXÁóé¸ýÿÿAƒüŽþÿÿI‹pH‹HƒÀóóXÁóA|$ÿ¸ƒÿ~>¹º€€H‹HƒÀóóXÁóÿÁHƒÂD9áuáHcÇHÁàH‹HƒÀóóXÁóé1ýÿÿIcÕI‹@H‹ÐHƒÀóóXÁóéýÿÿIcÕI‹@H‹ÐHƒÀóóXÁóéñüÿÿIcÕI‹@H‹ÐHƒÀóóXÁóéÑüÿÿIcÕI‹@H‹ÐHƒÀóóXÁóé±üÿÿI‹@H‹HƒÀóóXÁóé•üÿÿI‹@H‹óóXÁóé}üÿÿIcÕI‹@H‹ÐHƒÀóóXÁóé]üÿÿfD€AUATUSHƒìH‰ÓI‰ÌL‰ÅM‰Í…öˆc‹G0…ÀtK9ƳHcÖH‹GH‹‰H‹GP‹‰H‹GX‹A‰H‹G`‹A‰1ÀHƒÄ[]A\A]ÃfD€D‹1ÉDfD‰ÊA9È~H‹G€<”À¶ÀQHÿÁ)ÆyáD9Âtt¾€L‰Ï1Àè'@éßöÿÿHlsM…É…ÀöÿÿéÊöÿÿHTpM…É…«öÿÿéµöÿÿHqM…É…–öÿÿé öÿÿHtqM…É…öÿÿé‹öÿÿ‹O,EÿÇ$9ÈŽ}öÿÿM…É„möÿÿA‰èHÆsékÿÿÿH=oM…É…?öÿÿéIöÿÿHrM…É…*öÿÿé4öÿÿHXoM…É…öÿÿéöÿÿHSrM…É…öÿÿé öÿÿH>nM…É…ëõÿÿéõõÿÿ½ÇD$¸éµøÿÿH¦nM…É…¿õÿÿéÉõÿÿHvnM…É…ªõÿÿé´õÿÿ€SH‰ûH…ÿ„£H‹H…ÿtè>H‹{H…ÿtè >H‹{H…ÿtèÿ=H‹{ H…ÿtèñ=H‹{8H…ÿtèã=H‹{@H…ÿtèÕ=H‹{HH…ÿtèÇ=H‹{PH…ÿtè¹=H‹{XH…ÿtè«=H‹{`H…ÿtè=H‰ß[é”=€€[À€AUATUSHƒìI‰ýA‰ôH…ÿt5…ö~H‰û1ífH‹;H…ÿtèÿÿÿÿÅHƒÃD9åuèL‰ïHƒÄ[]A\A]é,=HƒÄ[]A\A]ÃDfDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8A‰ýA‰÷A‰Ö¿pè/=I‰ÄH…À„H‰ÅHÇ@HÇ@HÇ@HÇ@ Ç@(Ç@,HÇ@@HÇ@8HÇ@PHÇ@HHÇ@`HÇ@XIcÝH‰ßè·<I‰D$H…À„µHÁãH‰ßè<I‰D$H…À„ËH‰ßè‡<I‰D$H…À„…E…ötH‰ßèl<I‰D$ H…À„ AÇ$E‰l$IcÇH…H‰ßè><I‰D$8H…À„¬H‰ßè(<I‰D$@H…À„ÆH‰ßè<I‰D$HH…À„àH‰ßèü;I‰D$PH…À„ZH‰ßèæ;I‰D$XH…À„´H‰ßèÐ;I‰D$`H…À„þAÇD$0E‰|$hH‰èH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8Ãf.„H…Û„KÿÿÿI‰ÙLUg¹fHÉh1ö¿èU]éðH…Û„1ÿÿÿI‰ÙL%g¹gH™h1ö¿è%]éÀH…Û„ÿÿÿI‰ÙLõf¹hHih1ö¿èõ\éE…í„BþÿÿI‰ÙLÅf¹]H9h1ö¿èÅ\ëcH…Û„,þÿÿI‰ÙL•f¹^H h1ö¿è•\ë3H…Û„þÿÿI‰ÙLef¹iHÙg1ö¿èe\DL‰çèØûÿÿ1íé¡þÿÿH…Û„îýÿÿI‰ÙL&f¹aHšg1ö¿è&\ëÄ@H…Û„CþÿÿI‰ÙLõe¹jHig1ö¿èõ[ë“H…Û„rýÿÿI‰ÙLÅe¹_H9g1ö¿èÅ[é`ÿÿÿH…Û„ùýÿÿI‰ÙL•e¹kH g1ö¿è•[é0ÿÿÿA¹pLke¹QHßf1ö¿1Àèi[1íé²ýÿÿfº¾¿éìûÿÿfDfD1Ò¾¿éÏûÿÿ€„H‰\$èH‰l$ðL‰d$øHƒìH‰ýA‰ô1À9whNH‹8H…ÿ„cHcÆH…H‰Þè>9I‰ÙL~m¹H…Àu@8Åw¶ÀA9Â}‹”$ôA9”$œDMÂDMж„$?@8Åw¶ÀD9Ð~‹”$ðA9”$œDMÂDMÐfÿÇHƒÆÿ„$ðÿ„$ôÿ„$øÿ„$üÿ„$ÿ„$ÿ„$ÿÁAÿÇAÿÆAÿÅÿÃAÿÃAÿÁ;|$d…ýÿÿD‰„$ E‰ÖA¶L$ˆŒ$E¶l$D‰¬$äD¶ÉE)éA¶D$A)Á‹”$E9Ê~ZA¶L$H‹D$pH‹XI‹„$‹@H‹¼$€H¼$èA‰ÃA÷ÛD‰Æ¯ð¶ðH˜¶A‰ÍA)ÅE)êAÿÈÿÊHÿÏDÞE9ÊÜAÿÀD‰„$Ô‹Œ$ ÿÁ‹œ$ÿÃE‹¼$œD9ù|1öé¢fD€9\$||æE¶l$H‹D$pL‹@I‹„$D‹œ$ÔD¯XHcÃH‹¼$€HÇD‹”$D‰T$D‰öE1ɶAH˜B¶E‰êA)ÂDÖD9öšAÿÁAƒùtÿÁÿÃHÿÇD9ùŒ›‹t$+´$‹\$ÿÃD‹¬$ F.D+´$äóA*ƶ„$ó*Èó\ÁóA^D$E‰ÁD+Œ$Ô ÿÂÇ$ó\ÈAÿÁE·À1öH‹|$hè©—þÿ‰œ$‰Øélúÿÿ‰\$A‰öE1ÉÿÁÿÃHÿÇD9ùeÿÿÿ9\$|"ÿÿÿéVÿÿÿA¸ÿÿÿÿE‰ÂE‰ÆD‰„$ éêýÿÿè´§@H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰ÿA‰õH‰ÓM‰Æ‹’œ½ƒú~ BÿÁøhH‹AL‹ ;i8~IL®â¹eH?â1ö¿ 1Àèʸ H‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÉL‰ñH‰ÚD‰îL‰ÿèÁ°þÿƒøužCfnàf`äf`äfpäL‰à1ÒfïÀfÿÂHƒÀ9ÕîfDoÌfDt̾Cfnèf`íf`ífpí¶CC¾Àfnðf`öf`öfpö¾Cfnøf`ÿf`ÿfpÿfDoÄfDØÄfoÝfØÞE…íŽÛHcÅHÁàJ| ð1öfDoÐB¶T>H‹H‹ÐfofoÐfsúL‰àfAoÊ1ÉfDfDfoÂfÞÃfÜÄfØHƒÂfÞÈfofÿÁHƒÀ9ÍÖfoÁfÜÄfAtÁf×ÀfpÁ±fÞÈfpÁfÞÁòpȱfÞÈfoÁfsØfÞÈfpÉ…ÀuffØÏfAÞÈfDoÁfoÝfÞÙfØÞHÿÆFA9Å;ÿÿÿfAÅÀ¶À¶S)Ðó*À¶Có*Èó\ÁóAó^Có\óA1ÀéþÿÿAÇ€¸éþÿÿH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHìHI‰ÿI‰öH‰ÕI‰ÌD‹j‹Lúß¹ë…ÀtRHà1ö¿ 1Àè´Ç¸ H‹œ$H‹¬$ L‹¤$(L‹¬$0L‹´$8L‹¼$@HÄHÃWÀD‰é1Ò¾ L‰çètþÿ…Àu¯WÀD‰é1Ò¾L‰çèésþÿ…Àu–Ic$I‹D$¶Dÿ<„KD¾ÈE1ÛWäóEH„$àH‰D$0Aƒù vL©¹üé0ÿÿÿD‰ÈH Hc‚HÐÿàfÚÿÿÿÿý:Úÿÿÿïß„,Úÿÿÿ,óØWíA.otztIcÅH@H‹UHI‹NHóDÂðóXDÁó ©WÒA.WdztIcÅH‹UHH@ó ÂD‰Ë.Á‡:»A‹¾ƒú~ BÿÁøpAKÿ‰Ê‰ÈÁú÷þ‰Ö‰Çƒû w@‰ØH Hc‚HÐÿàf, ,ß,9,,ž,¼WÀ¾óD‰éD‰ÚL‰çó\$ ód$D‰L$D‰$è_rþÿ…Àó\$ ód$D‹L$D‹$…óýÿÿƒû„ƒû „†ƒû„}ƒû„šA‰ÙéfþÿÿA9Ùu‰IcÅH@HÁàIFHó@ésÿÿÿAƒù …fÿÿÿIcÅH@HÁàIFHó@éPÿÿÿIcÍI‹VHcÆH@HÁàHÊ(H )L$@HcÇóD„@é#ÿÿÿIcÍI‹VHcÆH‹ÊH@HÁà()D$@HcÇóD„@éöþÿÿAƒù…[ÿÿÿIcÅH@HÁàIFHó@éÓþÿÿóØWíA.o|ztIcÅH@H‹UHI‹NHóDÂøóXDÁó ©WÒA.W`‹üýÿÿéùýÿÿ€€‹EƒøŽZÿÈÁøD@IcÕH‹EH‹ ÐE…ÀŽCA|ÿÀAp(úëHƒÁ0ÿÂ())l$PóL$P.Èr‰T$8(ÁÇD$<óL$T.Èr‰t$8(ÁÇD$<óL$X.Èr‰D$8(ÁÇD$<óL$\.Èr‰|$8(ÁÇD$<(I)L$PóL$P.Èv‰T$8(ÁÇD$<óL$T.Èv‰t$8(ÁÇD$<óL$X.Èv‰D$8(ÁÇD$<óL$\.Èv‰|$8(ÁÇD$<ÿÇÿÀÿÆA9Ð ÿÿÿD‹\$8‹\$<ƒûÿ…ÂüÿÿLiÛ¹þé<ûÿÿó %A.ghztIcÅH@HÁàHEHóHóA.gpztIcÅH@HÁàHEHó@1Û.È–Ã\›éVüÿÿ‹U¹ƒú~ BÿÁøHASÿ‰ÐÁú÷ù‰ÇHcÒHkÊpIOXLAPIcõH‹EH‹tðøHRHÁà()D$p(IP)Œ$€Hc×ó lWÒ.””€ztóL”p(l )l$`A(@)„$€ó8WÒ.””€ztóD”`».ÈABÙAÿÍéÈþÿÿ‹EA¸ƒø~ ÿÈÁøD@AÿËD‰ÚD‰ØÁúA÷ø‰ÖA‰Â…ÒŽ7IcÕH‹EH‹ ÐHcÖHRHÁà(DÐ)„$À(Là)Œ$°I‹OXHkÒp(TÐ)”$ BÅD)ÀDÿH˜HÁà(,)¬$IcÂó kÿWÀ.„„ zt óŒ„ÀóKÿWÒ.”„zt ó„„°».ȃ©úÿÿD‰ËéÖýÿÿ»E…í„“úÿÿëè‹EAºƒø~ ÿÈÁøDPAÿËD‰ÚD‰ØÁúA÷ú‰ÃHcòLkÆpMGXIcÍHIHÁàHEH‹xôÇ„$ÐÇ„$ÔÇ„$ØÇ„$Ü…ÒŽ©H‹EH‹TÈøHvHÁà(LÐ(Tà(Dð‰¼$‰¼$‰¼$‰¼$ A(()¬$ðHcú€ÿWí.¬„ðzt‹”„‰”$ìIH)Œ$A(H)Œ$ðº€ÿWí.¬„ðzt‹”„‰”$àHq)„$(A)„$ðº€ÿWÉ.Œ„ðzt‹”„‰”$ä)”$(V)”$ðº€ÿWí.¬„ðzt‹”„‰”$è¾H‹|$0ó\$ ód$D‰L$D‰$èP„H˜‹œ„ÐAÿÍó\$ ód$D‹L$D‹$éëûÿÿ1ÀD9Ë”ÀA)ÅésùÿÿIcÕH‹EH‹ ÐA¸é­úÿÿA‹‡œA‰D$(‹EA‰D$,L‰çè¸Dþÿé÷ÿÿIcÂH@HÁàH‹UH‹TÊø(LÐÆÉWÀóÈ(TàÆÒóÐ(DðÆÀWíóÅé1þÿÿIcýIcÐH RHÁáH‹uH‹þ(DÐÆÀWÉóÁ)„$ÀH‹þ(DàÆÀóÁ)„$°I‹OXH‰ÐHÁàHÁâH‰ÓH)Ã(DÐÆÀóÁ)„$ (DðÆÀóÁ)„$é¤üÿÿfAWAVAUATUSH‰õI‰ÖH‰L$èL‹bHH‹BL‹D(HüD‹‡œºAƒø~ A@ÿÁøPE‰‹EA‰FL‰ÐE1ÀD)PD)P D)AÿÀHƒÀ0D9Â渀ÿA‰$EWÛóE\$A‰D$óE\$ A‰D$‹E…ÀŽHcÂL,@IÁåHkÀpH‰D$àÇD$ôA¿¾WÿI‹FJ‹ 8H‹EN‹ 8H‹GXóBD&ôÆÀC(lÐÆíóAêC(tàÆöóAòC(dðÆäóAâHYE(ÊE(ÂE1ÛE1Àf.„(ÏÂTÈ(×ÂPTê_Í(×ÂP Tâ_Ì(×ÂP0Tò_ÎAX D_ÉC(,C(tC(d A) E)DD(ÇDÂ@@DTÁ(ÏÂHPTÍ(×ÂP`TÔ_ÊHƒÀpAXI A)L IƒÁ0AÿÃIƒÀ0D9Ú^ÿÿÿA(ØAÆØóAÚL‹D$àLGXI‰ÚH‰ØE1É€€(Ã_)(ßAÂTØIƒÀAÿÁHƒÀ0D9ÊÜA»ÆÛóAÚL‹D$àLGXH‰ØE1É€€(Ã_)(ÇAÂTØIƒÀAÿÁHƒÀ0D9ÊÜAÿÃAƒûu­1ÀE_ ÿÀIƒÂ09ÂòA(ÁAÆÁ9A(Ù_Ø(ÃÆÃN_ØóB&D._t…ÝŠ×M‹FHA(ËA(ÃD._dztóA0ó_ÈóAL0A(ÃD._|ztH‹EHóAD0øóXDA(ËD._`ztóA 0ó_ÁóAD0A(ÃD._lztH‹EHóAD0ìóXDóAD0A(ÃD._hztóAD0A(ËD._pztóAL0ó_ÁóAD0 ÿD$ô‹EIƒÇHƒÆ;D$ô|&I‰Êé2ýÿÿM‹FHH‹EHóAL0ðóXLéÿÿÿM‹FHH˜H@A‹DÀH‹T$è‰1À[]A\A]A^A_ÃH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHìˆH‰ý‰óI‰Ñ‹’œAºƒú~ BÿÁøDPH‹AL‹D;Q4~OL,Ò¹hH>Ò1ö¿ 1Àèš¹¸ H‹\$XH‹l$`L‹d$hL‹l$pL‹t$xL‹¼$€HĈÃA‹´ƒøtƒøtLüѹi랉HÇ$€HÇD$fDo$$Mc I{L‰Ø1Òfo%¯÷fpÌfHfH fÿÂHƒÀ0A9ÒçE·qDA·A4…ÛŽdA IcÒHRHÁàItÐH‰t$8ItàH‰t$@IDðH‰D$HLkúpfÇD$€¸€ÿÿf‰D$ HÇD$0D¿éfDpìH‹t$0¶T.I‹A H‹ ÐI‹A(fEoÕfEoÍfEoÝfEnÅfEaÀfEpÀH‹T$8fofoÈfsùfAëÌH‹t$@fofoØfsûfAëÜH‹T$HfofoÐfsúfAëÔ1ö1ÒfDfDfofAíÀfíHfîÁfíP fîÂfíX0fîÃfíHƒÁfAoáfîàfDoÌfBo fo:fBo"fBfD:foh@fíèfDoÕfoõfAîófDoÞfo@PfíÁfox`fíúfîÇfB"HƒÀpÿÆHƒÂ0A9ò^ÿÿÿfoÄfsØfîàfoÄfsØfîÄfoÈfsÙfîÁfÅÀf=ÿ„œ¿ðfEq6A¿I0 ¿D$A¿Q>Ð9ÁMÁf‰D$A¿A2Æ¿D$ A¿Q:Ð9ÆMÆf‰D$ ¿ÈA¿A8ÁA¿ÆA¿Q4Ð9ÁLÈfoÆfsØfoæfîàfoÄfsØfîÄfoÈfsÙfîÁfÅÀ˜A¿QFÐD¿éD9èŽæfoÅfsøfAëÄL‰úIQ(H‰ø1ÉfîffíHƒÂÿÁHƒÀ0A9ÊåfsøfAëÄI‹A(1öE…Ò~7I H‰úëfîffíÿÆHƒÂ0D9ÖtÈHƒÁfoÈfe f×Á…ÀuÕD9Öt¯HÿD$0‹D$0ÿÀ9Ãcýÿÿf|$€ti¿D$ó*ÀA¿A<ó*ÈóXÁA¿ADó*Èó\ÁóAóA^A@ó\ŠóóA1ÀéüÿÿffoÅfsøfAëÄfëŒAÇ€¸éöûÿÿAÇ€ÿ1ÀéèûÿÿfD€H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHìXH‰|$h‰t$dH‰ÕH‰ËóD$`f(ÁM‰Å‹‚œA¼ƒø~ ÿÈÁøD`H‹CL‹0AÇEóZ•óZè€óZL$`òZÀóZÀòYCòòXÈòX ?óóZE@òYÈ¿E0ò*Àò\È¿E<ò*Àò\È¿EDò*ÀòXÁèç‘ò,Àf‰„$L͹TD;c4~RHÍ1ö¿ 1Àèj´¸ H‹œ$(H‹¬$0L‹¤$8L‹¬$@L‹´$HL‹¼$PHÄXË…´ƒøtƒøtL¾Ì¹Uë‹…œ‰HÇD$P€HÇD$XIV H‰”$INH‰Œ$¨L‰ð1Òfo%`òfpÌfHfH fÿÂHƒÀ0A9Ôç·]Df‰œ$Ž·E4‹T$d…ÒŽš‰ÙÁIcÔHRHÁàI\ÐH‰œ$ðI\àH‰œ$øIDðH‰„$HkÒpH‰T$HfÇD$p€HÇ„$è¿É‰L$DBåD)àP‰T$8ÿÀf‰D$6C $‰L$0Dá‰L$,‰ÈÀX‰\$(ÿÀf‰D$&B¥B J‰L$ ÿÂf‰T$X‰\$ÿÀf‰D$‹D$,ÿÀ‰D$H‹Œ$èH‹\$h¶TH‹E H‹ ÐH‹E(fDoZñfEoÊfEoÚfDnD$DfEaÀfEpÀH‹”$ðfofoÈfsùfë ñH‹œ$øfofoØfsûfëôðH‹”$fofoÐfsúfë×ð1ö1ÒfofAíÀfíHfîÁfíP fîÂfíX0fîÃfíHƒÁfAoáfîàfDoÌfBo 2H‹œ$¨foH‹œ$fofB2H‹œ$¨fDfoh@fíèfDoÕfoõfAîófDoÞfo@PfíÁfox`fíúfîÇH‹œ$fHƒÀpÿÆHƒÂ0A9ô@ÿÿÿfoÄfsØfîàfoÄfsØfîÄfoÈfsÙfîÁfÅØf9œ$AE…䎋D$8‰„$¸·T$6f‰”$¾‹L$(‰Œ$À·D$&f‰„$Æ‹T$ ‰”$È·L$f‰Œ$΋D$‰„$зT$f‰”$Ö‹L$‰Œ$Ø·D$,ÿÀf‰„$Þ‹T$0ÿ‰”$à·L$0ÿÁf‰Œ$æÇ„$´E1ÿ‹„$èÿÀ‰D$@AT$‰T$<退f;œ$„Óf;œ$„„f;œ$„5f;œ$„æf;œ$„—f;œ$„Hf;œ$„ùfo¦îH‹„$¨fAH‹„$fAfC7ÿ„$´IƒÇ0ÿ„$¸fÿ„$¾ÿ„$Àfÿ„$Æÿ„$Èfÿ„$Îÿ„$Ðfÿ„$Öÿ„$Øfÿ„$Þÿ„$àfÿ„$æ‹D$<9„$´„GfCo7f„$f;œ$…áþÿÿ‹Œ$´9œŒÎþÿÿÇ$WÀA¹D·Á1É‹T$@1öL‰ïèÊ{þÿé¥þÿÿ‹Œ$¸9œŒôþÿÿÇ$WÀA¹D·„$¾1É‹T$@1öL‰ïè‰{þÿéÆþÿÿ‹”$À;•œ¥þÿÿÇ$WÀA¹D·„$Æ1É‹T$@1öL‰ïèH{þÿéwþÿÿ‹„$È9…œŒVþÿÿÇ$WÀA¹D·„$Î1É‹T$@1öL‰ïè{þÿé(þÿÿ‹Œ$Ð9œŒþÿÿÇ$WÀA¹D·„$Ö1É‹T$@1öL‰ïèÆzþÿéÙýÿÿ‹”$Ø9•œŒ¸ýÿÿÇ$WÀA¹D·„$Þ1É‹T$@1öL‰ïè…zþÿéŠýÿÿ‹„$à9…œŒiýÿÿÇ$WÀA¹D·„$æ1É‹T$@1öL‰ïèDzþÿé;ýÿÿ‹„$´Dà9…œŒýÿÿD·„$´EàÇ$WÀA¹E·À1É‹T$@1öL‰ïèùyþÿéâüÿÿfoÅfsøfëÃëH‹Œ$¨fHÿ„$è‹„$èÿÀ9D$d+úÿÿ1Àéøÿÿ·U6f”$Ž¿Ë¿E2Á¿D$p¿U:Ð9ÁMÁf‰D$p¿È¿E8Á¿„$Ž¿U4Ð9ÁLÈfoÆfsØfoæfîàfoÄfsØfîÄfoÈfsÙfîÁfÅÀ˜¿UFпɉL$D9ÈŽ5ÿÿÿfoÅfsøfëøêH‹T$HHU(H‹„$¨1ÉfîffíHƒÂÿÁHƒÀ0A9Ìåfsøfë½êH‹E(1öE…ä~=H‹L$HHÁH‹”$¨ëfîffíÿÆHƒÂ0D9æt¿HƒÁfoÈfe f×Á…ÀuÕD9æt¦é´þÿÿAWAVAUATUSHƒìH‰|$ÐH‰t$ÈD‹ÇD$ÜAƒø~ A@ÿÁøÿÀ‰D$ÜH‹T$ÈH‹B H‹J(H‹T$ЋR‰T$¼…ÒˆKI‰ÁI‰ÏHÇD$èHÇD$ðH‹L$ÐH‹IHH‰L$À‹L$ÜÉ‹D$ÜD‰D$¸HcD$ÜHÀH• H‰T$°ÿÁ‰L$¬H@HÅ H‰D$ ‹T$Üÿ‰T$œHcÂH@HÁàH‰D$I‹Ç@€ÿÇ@€ÿÇ€ÿ‹D$Ü…ÀŽSH‹L$èHÁáH‰L$à‹t$¸H‹l$°‹L$¬H‹\$ D‹\$œH‹|$E1äE1íA¾ L‹T$àH‹D$ÐLPI‹B(()D$øAÿÄE9à| I‹‹D$øB‰2E9Ø| I‹‹D$ü‰:A9È| I‹‹$‰A9ð| I‹‹D$‰*I‹A(D)D$øE9à| I‹‹D$øA‰DE9Ø| I‹‹D$ü‰DA9È| I‹‹$‰DA9ð| I‹‹D$‰DI‹A(D )D$øE9à| I‹‹D$øA‰DE9Ø| I‹‹D$ü‰DA9È| I‹‹$‰DA9ð| I‹‹D$‰DIƒÅ0ÿÆHƒÅ ÿÁHƒÃ AÿÃHƒÇ IƒÆ D;d$Ü…äþÿÿH‹T$ÀH‹L$ð‹ A‰‹DA‰G‹DA‰G‹D A‰G ‹DA‰G‹D$èÿÀHÿD$èIƒÁHƒÁH‰L$ðIƒÇ9D$¼4þÿÿ‹T$¼H‹D$ȉPH‹L$ЋH‹T$ȉ1ÀHƒÄ[]A\A]A^A_ÃÇÇGÇG\ÇG`1ÀÃf1ÀÃfD€AWAVAUATUSHì¨H‰ý‰t$X‰T$TA‰ÍE‰ÆóD$PóL$LóT$Hó\$Dód$@D‹?Ç„$Œ»$Aƒÿ~AGÿÁøÿÀ‰„$ŒH˜HÁàHXƒ}(„§HcT$TH‹EH‹ÐH‰”$€H‰ßè*†I‰ÄH…ÀuBI‰ÙLü±¹1HáÀ1ö¿1Àèú§1ÿè©…¸HĨ[]A\A]A^A_ÃÇD‹T$TE…Ò„¦D‹Œ$ŒE…ÉŽ|L‹„$€L‰çHc„$ŒI4„I ÄH@I„E1ÉA()„$‹„$‰G‹„$”‰F‹„$˜‰A‹„$œ‰BAÿÁIƒÀ0HƒÇHƒÆHƒÁHƒÂD;Œ$Œu«H‹}h‹T$TH5GÀ1ÀèÄD‹D$XE…À„E…ÿˆð1ÛD‰øHÿÀH‰D$0ë<€„H‹}hf(ÁD‰ñD‰êH5ý¿¸èo„HÿÃH;\$0„¥óAœò uåWÒ.Âzt»óZÀèš„f(Èë¬H‹EH‹H‰„$€éZþÿÿ1ÛE…ÿx*H‹}hóAZœD‰ñD‰êH5‹¿¸èýƒHÿÃA9ß}×H‹}hD‰t$(D‰l$ D‰t$D‰l$D‰t$D‰,$óZd$@óZ\$DóZT$HóZL$LE‰ñE‰èóZD$PD‰ñD‰êH55¿¸虃‹¼$Œ…ÿŽ‚L‹„$€L‰çHc„$ŒI4„I ÄH@I„E1ÉfDA(P )”$‹„$‰G‹„$”‰F‹„$˜‰A‹„$œ‰BAÿÁIƒÀ0HƒÇHƒÆHƒÁHƒÂD;Œ$ŒuªH‹}h‹T$TH5ª¾1Àèò‚‹t$X…ötlE…ÿˆœ1ÛD‰øHÿÀH‰D$8ë-@H‹}hf(ÁD‰ñD‰êH5=¾¸诂HÿÃH;\$8t`óAœò ¹ãWÒ.Âzt¿óZÀèÞ‚f(Èë°1ÛE…ÿx2f„H‹}hóAZœD‰ñD‰êH5Û½¸èM‚HÿÃA9ß}×H‹uh¿ è=‚‹Œ$Œ…ÉŽ€L‹„$€L‰çHc„$ŒI4„I ÄH@I„E1É@A(@)„$‹„$‰G‹„$”‰F‹„$˜‰A‹„$œ‰BAÿÁIƒÀ0HƒÇHƒÆHƒÁHƒÂD;Œ$ŒuªH‹}h‹T$TH5Q½1Àè’‹T$X…ÒtjE…ÿˆœ1ÛD‰øLxë/„H‹}hf(ÁD‰ñD‰êH5ݼ¸èOHÿÃL9ûtbóAœò [âWÒ.ÂztÁóZÀè€f(Èë²1ÛE…ÿx4DfDH‹}hóAZœD‰ñD‰êH5{¼¸èí€HÿÃA9ß}×H‹Mhº¾H=4Áèõ€L‰çèÛ€1Àé0ûÿÿóD$@WÉ.Á…àŠÚò¾áòT$`óD$DWÉ.Á… Šò˜áòT$hóD$HWÉ.Á…ЊÊòráòT$póD$LWÉ.Á…”ŠŽòLáòT$xóD$PWÉ.Á…^ŠXò&áH‹}hD‰t$(D‰l$ D‰t$D‰l$D‰t$D‰,$òd$`ò\$hòT$pòL$xE‰ñE‰èéüÿÿH‹Mhº¾H=)ßèÐE…ÿx 1ÛH‹}h‰ÙD‰êH5Úº1ÀèˆÿÃA9ß}âH‹}hH ŽH‰D$(D‰l$ H‹ŽH‰D$D‰l$HlŽH‰D$D‰,$L ”ºE‰èH ŒºD‰êH5„º1Àè)H‹Mhº¾H=’Þè9D‰øƒÀ‰D$\x&1ÛH‹}hH eºD‰êH5dº1Àèå~ÿÃ;\$\~ÜH‹uh¿ èÕ~édùÿÿóZD$@èòD$`éþÿÿóZD$Pèé þÿÿóZD$Lèó~òD$xéjþÿÿóZD$HèÝ~òD$pé.þÿÿóZD$DèÇ~òD$héòýÿÿ@AWAVAUATUSHƒìHI‰ý‰t$$f‰T$"f‰L$ fD‰D$fD‰L$·„$€f‰D$H‹GH‹H‰D$(D‹7A¿»"Aƒþ~AFÿÁøDxIcÇHÁàHXH‰ßèN~I‰ÄH…Àu?I‰ÙL ª¹ÕH¹1ö¿1Àè 1ÿèÍ}¸HƒÄH[]A\A]A^A_ÃfÇD‹\$$E…Û„ÒE…ÿŽÍH‹l$(L‰ãIcÇH M H…MH4M tMÄHÂIf‰BÿÁHƒÅ0HƒÃIƒÃIƒÂIƒÁIƒÀHƒÇHƒÆHƒÂD9ù…zÿÿÿI‹}h‹T$$H5™¸1Àè¢|E…öx.1ÛfD€A¿\I‹}hH5H¸1Àèw|HÿÃA9Þ}á¿L$ ¿T$"I‹}h¿D$‰$D¿L$D¿D$H5=¸1Àè?|E…ÿŽÎH‹l$(L‰ãIcÇH M H…MH4M tMÄHÂIf‰BÿÁHƒÅ0HƒÃIƒÃIƒÂIƒÁIƒÀHƒÇHƒÆHƒÂD9ù…zÿÿÿI‹}h‹T$$H5e·1ÀèR{E…öx.1ÛfD€A¿\I‹}hH5ø¶1Àè'{HÿÃA9Þ}áI‹uh¿ è{E…ÿŽÐH‹l$(L‰ãIcÇH M H…MH4M tMÄHÂIf‰BÿÁHƒÅ0HƒÃIƒÃIƒÂIƒÁIƒÀHƒÇHƒÆHƒÂD9ù…zÿÿÿI‹}h‹T$$H5<¶1Àè"zE…öx.1ÛfD€A¿\I‹}hH5ȵ1Àè÷yHÿÃA9Þ}áI‹Mhº¾H=>ºèÿyL‰çèåy1ÀHƒÄH[]A\A]A^A_ÃI‹Mhº¾H=iµèÌyE…öx1ÛI‹}h‰ÚH5Xµ1Àè‡yÿÃA9Þ}åI‹}hHŸˆH‰$L ˆL{ˆH ¬´H§´H5µ1ÀèGyI‹Mhº¾H=ô´èWyD‰õƒÅx!1ÛI‹}hHü´H5{º1Àè yÿÃ9ë~áI‹uh¿ èüxécûÿÿAWAVAUATUSHì˜I‰ý‰t$4ˆT$3ˆL$2DˆD$1DˆL$0¶„$ЈD$/H‹³sH‹ H‰Œ$ˆ1ÉH‹GL‹ ‹‰D$@ÇD$D»!ƒø~ÿÈÁøÿÀ‰D$DÁàÿÀHcØH‰ßèÐxH‰D$8H…ÀuZI‰ÙL ¤¹ŒH…³1ö¿1Àèžš1ÿèMx¸H‹+sH‹Œ$ˆH3 …„HĘ[]A\A]A^A_ÃÆD‹|$4E…ÿ„"D‹t$DE…öŽûL‰d$HH‹L$8H‰L$PHcD$DHÈH‰D$X‹|$DÿHcÇHÈH‰D$`‹D$D4HcÆHÈH‰D$h‹L$DÁáHcÁL‹|$8IÇL$DHcÁL‹t$8IÆ6H˜L‹d$8IÄ‹T$DÁâ‰Ð+D$DH˜H‹l$8HÅHcÂH‹\$8HÃT$DHcÒL‹\$8IÓÉHcÁL‹T$8IÂL$DHcÉL‹L$8IÉÁæHcÆL‹D$8IÀt$DHcöHt$8‹T$DÁâ‰Ð)øH˜H‹L$8HÁ+T$DHcÒHT$8H‰T$1ÿH‹T$HfofD$p¶D$pH‹T$PˆB¶D$qH‹T$XˆB¶D$rH‹T$`ˆB¶D$sH‹T$hˆB¶D$tAˆG¶D$uAˆF¶D$vAˆD$¶D$wˆE¶D$xˆC¶D$yAˆC¶D$zAˆB¶D${AˆA¶D$|Aˆ@¶D$}ˆF¶D$~ˆA¶D$H‹T$ˆBÿÇHƒD$HHÿD$PHÿD$XHÿD$`HÿD$hIÿÇIÿÆIÿÄHÿÅHÿÃIÿÃIÿÂIÿÁIÿÀHÿÆHÿÁHÿÂH‰T$;|$D…ÿÿÿI‹}h‹T$4H5ͱ1ÀèÖu‹\$@…ÛˆÇ1ÛH‹L$8¶ I‹}hH5α1Àè­uHÿÃ9\$@}ܶL$2¶T$3I‹}h¶D$/‰$D¶L$0D¶D$1H5¸±1ÀètuI‹}h‹T$4H5q±1Àè^u1ÛI‹}h1ÒH5i±1ÀèHuÿÃ9\$@}äI‹uh¿ è8uI‹}h‹T$4H56±1Àèu1ÛI‹}h1ÒH5'±1ÀèuÿÃ9\$@}äI‹Mhº¾H=MµèuH‹|$8èòt1Àé£üÿÿI‹Mhº¾H=€°èãt‹l$@…íx1ÛI‹}h‰ÚH5¼°1Àè›tÿÃ9\$@}äI‹}hH²ƒH‰$L £ƒLŽƒH ¿¯Hº¯H5€°1ÀèZtI‹Mhº¾H=°èjt‹l$@ƒÅx!1ÛI‹}hH^°H5[°1ÀètÿÃ9ë~áI‹uh¿ ètéüÿÿ¶L$2¶T$3I‹}h¶D$/‰$D¶L$0D¶D$1H5°1ÀèÓsI‹}h‹T$4H5Я1Àè½sI‹uh¿ èµsI‹}h‹T$4H5³¯1Àè™sé–þÿÿèsSH‰ûH…ÿtWH‹PH…ÿtèsH‹{ H…ÿtèsH‹{H…ÿtèssH‹{H…ÿtèesH‹{H…ÿtèWsH‰ß[éNs„[À€AWAVAUATUSHƒì‰ýA‰÷‰T$ ¿pècsH‰ÃA¹pL7Ÿ¹FH…À„?HÇ@ HÇ@HÇ@HÇ@HÇ@HHÇ@PAO‰H(‰H,ƒýÇ@0ÇC4¸‰C8Hc{(‹C0¯ÇÁàH˜H‰C@HcC0H¯øH<HÁçHƒÇèÀrH‰C H…À„Ñ‹K(HcùHÁçè¤rH‰CH…À„ç‹K(HcùHÁçèˆrH‰CH…À„ï‹K(HcùHÁçèlrH‰ÅH‰CH…À„÷L‹[H‹C HƒÀHƒàðI‰L‹KI‰H‰ÂH‰EE…ÿ~oD‹s0D‹k4D‹c8D‰÷D‰îD‰áE1ÒE1Àë DH‹UHcÇH@HÁàHÐJ‰DÅHcÆH@HÁàIK‰DÁHcÁHÁàIK‰DÃAÿÂIÿÀD÷DîDáE9úu³‹|$ ÿlj{XHcÿH<H<ýèªqH‰ÂH‰CPH…ÀtrHBHƒàðH‰CHÇÇCÇC\ÇC`H‰ØHƒÄ[]A\A]A^A_ÃUÿ‰ÐÁøÿÀ‰C0ƒýŽTþÿÿ‰ÐÁøÿÀ‰C4¸ƒýŽHþÿÿÁúBé=þÿÿHcCXH@HÁàHƒøñ„xÿÿÿLHLfHÔ«1ö¿1Àèí’H‰ßèõüÿÿ1Ûékÿÿÿ‹K(HcÁHcS0H¯ÂH@HÁàHƒøñ„þÿÿLHL›œ¹V몋K(HcÁHÁàH…À„ þÿÿI‰ÁLwœ¹W놋K(HcÁHÁàH…À„þÿÿI‰ÁLSœ¹Xé_ÿÿÿHcC(HÁàI‰ÁL7œ¹YH…À„éýÿÿé:ÿÿÿfDfDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìXH‰ûA‰õA‰×‰L$ ÇD$ƒþ~AUÿ‰ÐÁøÿÀ‰D$ƒþ,ÇD$ÇD$‹C0ÁàA9Å!D;{,}‹D$ ÿÀ1Ò9CX‹f.„EwBµ¯D$LcàÇD$L;c@†šH‹{ H…ÿ„çHcT$IcÆH@HÁàH¯ÐHjH‰îè«oI‰éL룹ŸH…Àu?H ª1ö¿1Àè$‘º‰ÐH‹\$(H‹l$0L‹d$8L‹l$@L‹t$HL‹|$PHƒÄXÃH‰C L‰c@ÇD$f.„‹l$ ÿÅ;kX|UH‹{PH…ÿ„gHcÅH@L$ÅL‰æèoM‰áLO£¹§H…À„`ÿÿÿH‰CP‰kXHƒÀHƒàðH‰CHfDD;{(Œ¶H‹{H…ÿ„1IcÆH,ÅH‰îè´nI‰éLô¢¹±H…À„ÿÿÿH‰CH‹{H…ÿ„èH‰îèƒnI‰éLâ¹²H…À„ÔþÿÿH‰CH‹{H…ÿ„ÜH‰îèRnI‰éL’¢¹³H…À„£þÿÿH‰CD‰s(ÇD$fDfD‹C0ÁàA9ŸND$‰D$D;{,}…À„ËL‹[H‹C HƒÀHƒàðI‰L‹SI‰L‹KI‰‹T$ÁâHcÒH‹C@H‰Ñ1ÒH÷ñHcS(H9ÐHG‰C,ÿÈ~m‹t$‹L$‹T$A¸¿DfDHcÆHÁàII‰;HcÁH@HÁàII‰:HcÂH@HÁàII‰9AÿÀHƒÇt$L$T$D9C,µ‹D$‰C0‹L$‰K4‹D$‰C8ÇÇC1ÒéýÿÿfDfD‰ÐÁøÿÀ‰D$ÇD$ƒþŽÈüÿÿÁúÿ‰T$éºüÿÿHcT$IcÆH@HÁàH¯ÐHjH‰ïèjléýÿÿHcÅH@L$ÅL‰çèNlé”ýÿÿH‰ïèAléþÿÿIcÆH,ÅH‰ïè)léÊýÿÿH‰ïèléþÿÿ‹—´ƒú”Àƒú” Ð¶ÀÄD‹‡°H‹‡HcpLc¬Lc—¨H õ‹‡¤ƒÀH˜K HÁâHŒŠHIcÐH¯ÖHÁâHÐH‰òHÁâAƒÀMcÀI¯ÐHÐL¯ÎIÁáLÈI¯òHÁæHðÀ„ATUSI‰Ô‹—œƒú®½DBHcöHÁæHwXL-| HcÅH@M”QM ÄEH˜I „1ÛA»DfD()D$ðE9Ø~ ‹D$ðA‰DœA+A9À~‹D$ô‰A9Ð~‹D$øA‰AA9ø~‹D$üA‰BHÿÃAÿÃHƒÆpÿÇIƒÂÿÂIƒÁHƒÁ9Ý£1À[]A\ÃBÿÁøh…íFÿÿÿ1À[]A\Ã@AWAVAUATUSHì¸H‰|$I‰òH‹eH‹H‰”$¨1Ò‹—œH‹‡D‹@ÇD$ƒú~ BÿÁøÿÀ‰D$DJE¯ÈE…ÀŽÄ‹D$ÿÀA¯À‰D$H‹|$ÿWA¯Ð‰”$Œ‹L$4FA¯À‰„$ˆ‰ÊÁâJA¯È‰Œ$„T$BA¯À‰„$€L6A¯È‰L$|‹L$Áá‰È+D$ÿÀA¯À‰D$xAA¯À‰D$t‹D$LA¯È‰L$pÒJA¯È‰L$lTA¯Ð‰T$hÁæFA¯À‰D$d‹T$t2‰ñA¯È‰L$`‰ÐÁà‰Â)úÿÂA¯Ð‰T$\+D$ÿÀA¯À‰D$XD‰D$LHÇD$PD‰ÀÀ‰D$ ‹D$…ÀŽMH‹D$PH‹L$HH‰D$ ‹T$X‰T$4‹L$\‰L$8‹D$`‰D$<‹T$d‰T$@‹L$h‰L$DD‹|$lD‹t$pD‹l$tD‹d$x‹l$|‹œ$€D‹œ$„‹¼$ˆ‹´$ŒÇD$HÇD$(1ÉH‹T$ H‹H‹T$(fof„$‹T$LA9Á~Hcж„$Bˆ‹D$HÈA9Á~Hcж„$‘BˆA9ñ~HcÖ¶„$’BˆA9ù~Hc×¶„$“BˆE9Ù~IcÓ¶„$”BˆA9Ù~HcÓ¶„$•BˆA9é~HcÕ¶„$–BˆE9á~IcÔ¶„$—BˆE9é~IcÕ¶„$˜BˆE9ñ~IcÖ¶„$™BˆE9ù~Ic×¶„$šBˆD;L$D~HcT$D¶„$›BˆD;L$@~HcT$@¶„$œBˆD;L$<~HcT$<¶„$BˆD;L$8~HcT$8¶„$žBˆD;L$4~HcT$4¶„$ŸBˆÿD$HƒD$(DÁDD$4DD$8DD$f„$°1ÒH‹D$`·PfA;WuuHÿÂHƒúuçÿÁHƒÆD9Áu½H‰Ú1ö‰ñ·B0f;Dµ0…··B2f;Dµ2…‹HÿÆHƒÂHƒþuÓóC@.E@ztRM…ä„;úÿÿHW™@¶€L‰ç1Àè"\é"úÿÿA‰ÐHû˜M…ä…/ýÿÿé úÿÿA‰ÐH»˜M…ä…ýÿÿéòùÿÿ·CDf;EDt6H™M…ä…ÉùÿÿéÓùÿÿ¸M…ä„ÅùÿÿA‰ÀHÀ˜éÖüÿÿ1Àëä·CFf;EFtHõ˜M…ä…‰ùÿÿé“ùÿÿE…ÉŽçÇ„$ŒE1ÛH”$H‰T$XH„$ H‰D$PE1ÉE1ÿE…펔H‹CPJ‹B(8)„$ H‹EPJ‹B(8)„$E1ÀóT$lH‹D$XóB €H‹T$PóB‚L‰D$8D‰L$0L‰\$(衆…ÀL‹D$8D‹L$0L‹\$(…qIÿÀIƒøu°AÿÁIƒÇE9é…sÿÿÿL‹“ÿ„$ŒIƒÃ‹„$ŒA9BAÿÿÿBí…À~aL‹CXH‹}X1É1öLŒ$L”$ B()„$ (>)„$1ÒóA’A.‘Šº…´HÿÂHƒúuàÿÁHƒÆ9Áu»E1íJ<í`Ht=H<;óD$lºèQ…À…°IÿÅIƒýuÎ1ÉL‹°L9›°…æ±H‹…¸H9ƒ¸…ÐH‹•ÀH9“À…ºH‹µØH‹»Øè)v…ÀtwH£—M…ä…‹÷ÿÿé•÷ÿÿM…䄌÷ÿÿA‰ÐH—¾€L‰ç1ÀènYén÷ÿÿD‰ÉH×–M…äuÝéZ÷ÿÿD‰éH—M…ä„G÷ÿÿ¾€L‰ç1Àè3Yé3÷ÿÿH‹µàH‹»àè›u…Àt)H-—M…ä…ýöÿÿé÷ÿÿ±M…ä„üöÿÿHÙ–ë¬H‹µèH‹»èè[u…ÀtH—M…ä…½öÿÿéÇöÿÿH‹µðH‹»ðè/u…ÀtHð–M…ä…‘öÿÿé›öÿÿH‹µøH‹»øèu…ÀtHÛ–M…ä…eöÿÿéoöÿÿH‹µH‹»è×t…ÀtHÅ–M…ä…9öÿÿéCöÿÿH‹µH‹»è«t…ÀtH¯–M…ä… öÿÿéöÿÿHµH»óD$lºè„O…ÀtH™–M…ä…ÖõÿÿéàõÿÿHµ(H»(óD$lºèMO…ÀtHŠ–M…ä…Ÿõÿÿé©õÿÿHµ@H»@óD$lºèOÇD$p…À„ƒõÿÿHo–M…ä…\õÿÿéfõÿÿAWAVAUATUSHìH‰ýH‰t$XH‹pQH‹H‰”$ø1ÒH‰ù²¾H=B–èuVH‰éº4¾H=I–è\VH‹L$XD‹¹œÇD$`Aƒÿ~ AGÿÁøÿÀ‰D$`H‹\$XH‹“D‹bE…äŽ#HÇ„$¨‹D$`À‹L$`L‰L$ÿÀ‰D$‹\$`ÿÉ\$ H‹BH‹Œ$¨¾H5ô•H‰ï1Àè£U‹\$`…ÛŽpD‹l$D‹d$‹\$ A¾é®H È•ºH5ãH‰ï1ÀèaUA9ßÌH ¢•ºH5½H‰ï1Àè;UE9çÇH |•ºH5—H‰ï1ÀèUE9ïŒÃD‰éºH5HH‰ï1ÀèóTH‰î¿]èìTAÿÅAÿÄÿÃD;t$`„ñAÿÆH‰éº¾H= •èáTE9÷Œ0ÿÿÿD‰ñºH5êH‰ï1Àè•TA9ߌ4ÿÿÿ‰ÙºH5ÉH‰ï1ÀètTE9çŒ9ÿÿÿD‰áºH5§H‰ï1ÀèRTE9ï=ÿÿÿH “”ºH5®H‰ï1Àè,Té4ÿÿÿH‰éº¾H=i”è8TH‰éº¾H=^”èT‹„$¨ÿÀH‹L$XH‹‘Hÿ„$¨9B þÿÿE1öHÇ„$°‹\$`Û‰\$\$`‰\$AƒþwKD‰ðH Hc‚HÐÿàL.ˆjH‰éº¾H=ó“è‡SD‹\$`E…ÛŽô1ÛA¼L‰àD‰ñHÓàH‰ÂƒâqH‰T$(ƒàH‰D$ é¼H p“ºH5‹ŽH‰ï1Àè S‹D$`ALA9ÏH A“ºH5\ŽH‰ï1ÀèÚR‹T$ALA9ÏüH “ºH5-ŽH‰ï1Àè«R‹D$ALA9ÏŒõºH5ØH‰ï1ÀèƒRH‰î¿]è|RÿÃ;\$`„¤SAƒþw"Hƒ|$(uHƒ|$ t‹D$`؉ÂÁú÷|$`A‰ÕH‰éºL‰æH={’èRRE9ýùþÿÿD‰éºH5[H‰ï1ÀèR‹D$`ALA9ÏŒýþÿÿºH53H‰ï1ÀèÞQ‹T$ALA9ÏŒÿÿÿºH5 H‰ï1Àè¶Q‹D$ALA9Ï ÿÿÿH H5 H‰ï1Àè‡QéÿþÿÿH‰éº¾H=ø‘è“QD‹\$`E…Û þÿÿH‰éº¾H=ß‘èlQH‰î¿ è;QAÿÆHƒ„$°Aƒþ…qýÿÿH‰éº¾H=ª‘è0QD‹T$`E…ÒŽ ‹D$`À‹T$`DlD`‰ÓÿÃA¶é®H #‘ºH5>ŒH‰ï1Àè¼PA9ßÌH ýºH5ŒH‰ï1Àè–PE9çÇH ׺H5ò‹H‰ï1ÀèpPE9ïŒÃD‰éºH5£‹H‰ï1ÀèNPH‰î¿]èGPAÿÅAÿÄÿÃD;t$`„0AÿÆH‰éº¾H=eèŽH‰ï1ÀèÊLE9ýrH H5ŽH‰ï1Àè©LD;¬$¤nHåŒH5÷H‰ï1ÀèƒLD;¬$ nH¿ŒH5ÑH‰ï1Àè]LD;¬$œnH™ŒH5«H‰ï1Àè7LD;¬$˜nHsŒH5…H‰ï1ÀèLD;¬$”Œn‹”$”H5¿‡H‰ï1ÀèëKH‰î¿]èäKÿ„$”ÿ„$˜ÿ„$œÿ„$ ÿ„$¤AÿÇAÿÄD9ó4ÿÃH‰éº¾H=ä‹è»KA9ÝŒ…þÿÿ‰ÚH5I‡H‰ï1ÀèuKE9匊þÿÿD‰âH5,‡H‰ï1ÀèXKE9ýŒŽþÿÿD‰úH5‡H‰ï1Àè;KD;¬$¤Œ’þÿÿ‹”$¤H5é†H‰ï1ÀèKD;¬$ Œ’þÿÿ‹”$ H5ÆH‰ï1ÀèïJD;¬$œŒ’þÿÿ‹”$œH5†H‰ï1ÀèÉJD;¬$˜Œ’þÿÿ‹”$˜H5w†H‰ï1Àè£JD;¬$”’þÿÿHߊH5ñ‹H‰ï1Àè}JéþÿÿH‰î¿ èqJH‹D$XH‹D‹JE…ÉŽ“HÇ„$ˆH‹BH‹Œ$ˆ¾H5vŠH‰ï1Àè%JE…öŽ*L‹¼$ˆIÁçE1ä1ÛH‰éº¾H=EŠèJH‹T$XH‹B J‹8fof„$À¿”$ÀH5’…H‰ï1Àè¾I¿”$ÂH5y…H‰ï1Àè¥I¿”$ÄH5`…H‰ï1ÀèŒI¿”$ÆH5G…H‰ï1ÀèsI¿”$ÈH5.…H‰ï1ÀèZI¿”$ÊH5…H‰ï1ÀèAI¿”$ÌH5ü„H‰ï1Àè(I¿”$ÎH5ã„H‰ï1ÀèIH‰î¿]èIAÿÄHƒÃE9ô…çþÿÿH‰î¿ èëH‹„$ˆÿÀH‹L$XH‹‘Hÿ„$ˆ9ByþÿÿH‰î¿ è¸HÇD$dHÇ„$€C6‰\$DDó‰\$@Bµ‰D$H‹T$HH Hc‘HÈÿà————‰Ú‰ØÁúA÷þA‰×H‰éº¾H=ï‡èÆGE9H݇H5ïˆH‰ï1Àè{GC7A9ÕnH¸‡H5ʈH‰ï1ÀèVG‹L$DAA9Õ/H‡H5¡ˆH‰ï1Àè-G‹D$@AA9ÕðHf‡H5xˆH‰ï1ÀèG‹L$Hc„H5u…H‰ï1ÀèDA9ÝeHB„H5T…H‰ï1ÀèàCE9å`H!„H53…H‰ï1Àè¿CE9ý\H„H5…H‰ï1ÀèžCD;l$|XH݃H5ï„H‰ï1Àè{CD;l$xUHºƒH5Ì„H‰ï1ÀèXCD;l$tRH—ƒH5©„H‰ï1Àè5CD;l$pŒO‹T$pH5é~H‰ï1ÀèCH‰î¿]èCÿD$pÿD$tÿD$xÿD$|AÿÇAÿÄÿÃD9´$¼„3 ÿ„$¼H‰éº¾H=ƒèìBD;¬$¼Œ›þÿÿ‹”$¼H5p~H‰ï1ÀèœBA9ÝŒ›þÿÿ‰ÚH5T~H‰ï1Àè€BE9匠þÿÿD‰âH57~H‰ï1ÀècBE9ýŒ¤þÿÿD‰úH5~H‰ï1ÀèFBD;l$|Œ¨þÿÿ‹T$|H5ú}H‰ï1Àè&BD;l$xŒ«þÿÿ‹T$xH5Ú}H‰ï1ÀèBD;l$tŒ®þÿÿ‹T$tH5º}H‰ï1ÀèæAD;l$p±þÿÿH%‚H57ƒH‰ï1ÀèÃAé©þÿÿH‰éº¾H=ƒèÏAA¾é8ôÿÿH‰éº¾H=‚è«AH‰î¿ èzAH‹\$X¿K2¿S0H5Ô‚H‰ï1ÀèVA¿K6¿S4H5Ó‚H‰ï1Àè=A¿K:¿S8H5Ò‚H‰ï1Àè$A¿K>¿S¶”$âH5+H‰ï1Àèá>¶”$ãH5H‰ï1ÀèÈ>¶”$äH5ù€H‰ï1Àè¯>¶”$åH5à€H‰ï1Àè–>¶”$æH5Ç€H‰ï1Àè}>¶”$çH5®€H‰ï1Àèd>¶”$èH5•€H‰ï1ÀèK>¶”$éH5|€H‰ï1Àè2>¶”$êH5c€H‰ï1Àè>¶”$ëH5J€H‰ï1Àè>¶”$ìH51€H‰ï1Àèç=¶”$íH5€H‰ï1ÀèÎ=¶”$îH5ÿH‰ï1Àèµ=¶”$ïH5æH‰ï1Àèœ=H‰î¿]è•=AÿÄHƒÃE9ì… þÿÿH‰î¿ èx=‹D$hÿÀH‹L$XH‹‘HÿD$h9B¾ýÿÿH‰î¿ èK=H‹D$X¶PH5H‰ï1Àè+=H‹L$X¶QH5vH‰ï1Àè=H‹\$X¶SH5mH‰ï1Àè÷<óZCH5hH‰ï¸èÞ<¶SH5bH‰ï1ÀèÉ<¶SH5^H‰ï1Àè´<D‰êH5[H‰ï1Àè <D‰úH5XH‰ï1ÀèŒ<1ÀH‹…7H‹Œ$øH3 …¾HÄ[]A\A]A^A_ÃH‰éº¾H=°}èq<A½éóûÿÿH‰éº¾H=À|èM<H‹œ$€E1äH‰éº¾H=R|è)<H‹T$XH‹B(fof„$À¿”$ÀH5£wH‰ï1ÀèÏ;¿”$ÂH5ŠwH‰ï1Àè¶;¿”$ÄH5qwH‰ï1Àè;¿”$ÆH5XwH‰ï1Àè„;¿”$ÈH5?wH‰ï1Àèk;¿”$ÊH5&wH‰ï1ÀèR;¿”$ÌH5 wH‰ï1Àè9;¿”$ÎH5ôvH‰ï1Àè ;H‰î¿]è;AÿÄHƒÃpE9ô…ëþÿÿéFöÿÿH‰éº¾H=‚{è;‹D$`Áà+D$`HcØHÁãE1äH‰éº¾H= {èá:H‹L$XH‹AX()„$ÐóZ„$йºH5 vH‰ï¸è{:óZ„$Ô¹ºH5åuH‰ï¸èT:óZ„$عºH5¾uH‰ï¸è-:óZ„$ܹºH5—uH‰ï¸è:H‰î¿]èÿ9AÿÄHƒÃD;d$`…ÿÿÿéëÿÿH‰éº¾H=$zèó9L‹¬$¨IÁåE1ä1ÛH‰éº¾H=òyèÉ9H‹T$XH‹BPJ‹(()„$ÐóZ„$йºH5ðtH‰ï¸è_9óZ„$Ô¹ºH5ÉtH‰ï¸è89óZ„$عºH5¢tH‰ï¸è9óZ„$ܹºH5{tH‰ï¸èê8H‰î¿]èã8AÿÄHƒÃD;d$`…ÿÿÿé¸äÿÿH‰éº¾H=Jyè×8H‹œ$°E1äH‰éº¾H=Üxè³8H‹T$XH‹BX()„$ÐóZ„$йºH5ÞsH‰ï¸èM8óZ„$Ô¹ºH5·sH‰ï¸è&8óZ„$عºH5sH‰ï¸èÿ7óZ„$ܹºH5isH‰ï¸èØ7H‰î¿]èÑ7AÿÄHƒÃpD;d$`…ÿÿÿéræÿÿè17H‰éº¾H=3xèÀ7Hc\$THÁãE1äH‰éº¾H=Äwè›7H‹T$XH‹B(fof„$À¿”$ÀH5sH‰ï1ÀèA7¿”$ÂH5ürH‰ï1Àè(7¿”$ÄH5ãrH‰ï1Àè7¿”$ÆH5ÊrH‰ï1Àèö6¿”$ÈH5±rH‰ï1ÀèÝ6¿”$ÊH5˜rH‰ï1ÀèÄ6¿”$ÌH5rH‰ï1Àè«6¿”$ÎH5frH‰ï1Àè’6H‰î¿]è‹6AÿÄHƒÃE9ô…ëþÿÿéïôÿÿfSH‰ûH…ÿ„3‹‡¼…À…H‹¿€H…ÿtèZ6H‹»ˆH…ÿtèI6H‹»H…ÿtè86H‹»˜H…ÿtè'6H‹»¨H…ÿtè6H‹» H…ÿtè6H‹;H…ÿtèø5H‹{H…ÿtèê5H‹{ H…ÿtèÜ5H‹{PH…ÿtèÎ5H‹»ØH…ÿtè½5H‹»àH…ÿtè¬5H‹»èH…ÿtè›5H‹»ðH…ÿtèŠ5H‹»øH…ÿtèy5H‹»H…ÿtèh5H‹»H…ÿtèW5H‰ß[éM5€[À€SH‰ûƒÆó*Îó9•ó^Áèb5óYCèÄ5Wc•ºÿÿÿÿó,À. –GˆC1À[Ãf„AWAVAUATUSHƒìA‰ÿI‰õƒÿŽƒAWÿ‰ÐÁøDp‰ÐÁøÿÀ‰D$Áúÿ‰T$AF‰D$ ¿Àèä4H‰ÃA¹ÀL¸`¹8H…À„òHÇ€€HÇ€ˆHÇ€HÇ€˜HÇ€¨HÇ€ HÇHÇ@HÇ@ HÇ@(HÇ@PHÇ@XÇ€¼IcîIc}HÁçH¯ýHƒÇè34H‰ƒ€H…À„!A‹UHcl$ HcúHÁçH¯ýHƒÇè4H‰ƒˆH…À„½A‹UHcl$HcúHÁçH¯ýHƒÇèÙ3H‰ƒH…À„eHÁåHƒÅH‰ïè¹3H‰ƒ˜H…À„ÁHcl$Ic}HÁçH¯ýHƒÇè3H‰ƒ¨H…À„æHÁåHƒÅH‰ïèo3H‰ƒ H…À„rIc}HÁçèR3H‰H…À„…A‹UHcúHÁçè63H‰CH…À„»A‹UHcúHÁçè3H‰C H…À„ÆA‹UHcúHÁçèü2H‰CPH…À„‹L‹#H‹ƒ€HƒÀHƒàðI‰$H‹kH‹ƒˆHƒÀHƒàðH‰EL‹[ H‹ƒHƒÀHƒàðI‰H‹ƒ˜HƒÀHƒàðH‰C(L‹KPH‹ƒ¨HƒÀHƒàðI‰H‹ƒ HƒÀHƒàðH‰CXAƒ}~{E‰ð‹|$ ‹t$‹L$AººDfDIcÀHÁàI$J‰"HcÇHÁàHEH‰*HcÆHÁàIJ‰HcÁHÁàII‰AÿÂHƒÂEð|$ t$L$E9UªD‰³°‹D$‰ƒ¬‹D$‰ƒ¨ÆCÆCÆC1À‰CÆCÆC‰C@fÇCDfÇCF‰CHHǃ°ÿÿÿÿHǃ¸ÿÿÿÿHǃÀÿÿÿÿ¸€OÃljƒ‰ƒ‰ƒ‰ƒ‰ƒ ‰ƒ$‰ƒ(‰ƒ,‰ƒ0‰ƒ4‰ƒ8‰ƒ<ǃ@€¿¸€Ç„ƒ@€¿HÿÀHƒøuìHǃØHǃàHǃèAGHcèH‰ïèà0H‰ƒðH…À„²H‰ïèÈ0H‰ƒøH…À„òH‰ïè°0H‰ƒH…À„ H‰ïè˜0H‰ƒH…À„IH‹»ðH‰ê1öè0H‹»øH‰ê1öè~0H‹»H‰ê1öèm0H‹»H‰ê1öè\0L‰«ǃ˜ǃœǃ ÿÿÿÿD‰»¤ǃ´ǃ¸ëMA‹UHcÂHÁàH¯ÅHƒøñ„ÊûÿÿLHLÂ[¹HDH;r1ö¿1Àè»QH‰ßèãøÿÿ1ÛH‰ØHƒÄ[]A\A]A^A_À„ƒÿ~AWÿA¾évúÿÿƒÿ~pAWÿA¾ÇD$éeúÿÿIcEHÁàH¯ÅLHL1[¹JHƒøñ…jÿÿÿépûÿÿA‹UHcÂHÁàH¯ÅLHL[¹IHƒøñ…<ÿÿÿéûÿÿÇD$A¾ÇD$ÇD$ éúùÿÿI‰éLÂZ¹KH@q1ö¿èÂPéÿÿÿA‹UHcÂHÁàI‰ÁLZ¹OH…À„\ûÿÿéÅþÿÿIcEHÁàH¯ÅLHLfZ¹LHƒøñ…ŸþÿÿéïúÿÿA‹UHcÂHÁàI‰ÁL=Z¹PH…À„&ûÿÿérþÿÿA‹UHcÂHÁàI‰ÁLZ¹QH…À„ûÿÿéJþÿÿAƒÿþ„DýÿÿI‰éLîY¹‚Hlp1ö¿èîOé.þÿÿI‰éLÇY¹MHEp1ö¿èÇOéþÿÿAƒÿþ„ýÿÿI‰éL–Y¹ƒHp1ö¿è–OéÖýÿÿAƒÿþ„ëüÿÿI‰éLeY¹„Hão1ö¿èeOé¥ýÿÿIcEHÁàI‰ÁL6Y¹RH…À„UúÿÿékýÿÿAƒÿþ„­üÿÿI‰éLY¹…Ho1ö¿èOéOýÿÿf.„USHƒìH‰û‰õó—¸ó­Œ(ÂóXÃó*ÎóXËóXÑó^Âó ¦Œó\ÈóOtóO|óOlóGpóGxóGhè,óYC@èÿ,¸ÿ.Us¸€ÿÿ.Kzvó,Àf‰C8f‰CV4DfAÇD$Dà.I‹•(‹B…ÀŽÅÇ„$ÌHÇ„$Ðí)èÿÀ‰D$dL-‰L$`é‰L$\\ ‰\$XHcÅH‰D$PH @H‰L$HH‰ÈHÁàHƒÀH‰D$@­‰\$„.ÈC‰Âé˜þÿÿI‹EH‹”$ÐH‹H‹Œ$póóAYD$@è¢#ºÿ.øƒƒEþÿÿ‰Úó,Àó èƒ.ÈC‰Âé*þÿÿI‹EH‹”$ÐH‹H‹Œ$ˆóóAYD$@èL#ºÿ.¢ƒƒ×ýÿÿ‰Úó,Àó ’ƒ.ÈC‰Âé¼ýÿÿI‹EH‹”$ÐH‹H‹Œ$˜óóAYD$@èö"ºÿ.Lƒƒiýÿÿ‰Úó,Àó <ƒ.ÈC‰ÂéNýÿÿI‹EH‹”$ÐH‹H‹Œ$¨óóAYD$@è "ºÿ.ö‚ƒûüÿÿ‰Úó,Àó æ‚.ÈC‰ÂéàüÿÿI‹EH‹”$ÐH‹H‹Œ$¸óóAYD$@èJ"ºÿ. ‚ƒüÿÿ‰Úó,Àó ‚.ÈC‰ÂérüÿÿI‹EH‹”$ÐH‹H‹Œ$ÀóóAYD$@èô!ºÿ.J‚ƒüÿÿ‰Úó,Àó :‚.ÈC‰ÂéüÿÿI‹•(ÿ„$ÌHƒ„$Ћœ$Ì9ZÞúÿÿ…íŽ Ç„$àHÇ„$`A¾€ÿÿ\-‰\$|ë‰\$x­‰D$tè‰D$pÛ‰\$lí)ê‰T$h‹Œ$àÿÁ‰Œ$äH‹„$`H‰„$èÇ„$ă¼$ÄwT‹„$ÄH Hc‚HÐÿààÀ @ ‹Œ$䉌$ÈÇ„$À»ÿÿÿÿD‰ðD9¼$ÈŒèf‰„$‹„$ÈèD‰òA9ÇKf‰”$‹D$|‰„$<‹„$È„$<D‰òA9Ç^f‰”$‹D$x‰„$´‹„$È„$´D‰òA9Çqf‰”$‹D$t‰„$‹„$È„$D‰òA9Ç„f‰”$‹D$p‰„$°‹„$È„$°D‰òA9Ç×f‰”$‹D$l‰„$¬‹„$È„$¬D‰òA9Çjf‰”$‹D$h‰„$¨‹”$ÈÂD‰ðA9×ïf‰„$I‹D$(fo„$H‹”$èfÿ„$ÄHƒÂH‰”$胼$Ä…'þÿÿÿ„$àHƒ„$`p9¬$à…ßýÿÿí)èH˜HÁàH‰„$ð‹Œ$¨ÿÁ‰Œ$ø‹œ$¬ÿÉœ$üHcÕH RH‰ÈHÁàHƒÀ H‰„$‹„$°ÿÀ‰„$ H’HÁàHƒÀ H‰„$‹œ$ÿÉœ$H‰ÐHÁàHƒÀ H‰„$ ‹„$´ÿÀ‰„$,HÁáHƒÁ H‰Œ$0‹Œ$<ÿÁ‰Œ$8H‰ÐHÁàHƒÀ H‰„$@EH˜HÁàH‰„$HHiÒàHƒÂ H‰”$XA¾HÇ„$P »€ÿÿéUf‰”$BD5‰ÚA9Ç>f‰”$‰ÚD;¼$8Ãf‰”$‰ÚD;¼$,[f‰”$‰ÚD;¼$Óf‰”$‰ÚD;¼$ kf‰”$‰ÚD;¼$üf‰”$‰ÚD;¼$ø›f‰”$I‹D$(fo„$H‹”$ðfHƒÂH‰”$ðÿ„$øÿ„$üHƒ„$ ÿ„$ Hƒ„$ ÿ„$Hƒ„$  ÿ„$,Hƒ„$0 ÿ„$8Hƒ„$@ Hƒ„$H Hƒ„$P Hƒ„$X A9î„9AÿƉÚE9÷Ž þÿÿI‹EH‹”$PóDóAYD$@èºÿ.å|ƒpþÿÿ‰Úó,Àó Õ|.ÈC‰ÂéUþÿÿ„‹Œ$à‰Œ$ÈÇ„$À1Ûézûÿÿ‹”$à‰”$ÈÇ„$À1ÛéZûÿÿ‹„$à‰„$ÈÇ„$À1Ûé:ûÿÿ‹œ$à‰œ$ÈÇ„$À1Ûéûÿÿ‹„$䉄$ÈÇ„$À1Ûéúúÿÿ‹œ$䉜$ÈÇ„$À1ÛéÚúÿÿ‹Œ$ÀÑH˜I‹Uó‚óAYD$@èyºÿ.Ï{sD‰òó,Àó Â{.ÈC‰Âf9Ú‰ØNÂé¾ûÿÿ‹”$ÀÂH˜I‹Uó‚óAYD$@è&.{‚—¸ÿf9؉ÚNÐéVûÿÿ‹”$ÀÂH˜I‹Uó‚óAYD$@èæ.A{‚t¸ÿf9؉ÚNÐééúÿÿ‹”$ÀÂH˜I‹Uó‚óAYD$@è¦.{‚¨¸ÿf9؉ÚNÐéOúÿÿ‹”$ÀÂH˜I‹Uó‚óAYD$@èf.Áz‚.¸ÿf9؉ÚNÐé<úÿÿ‹”$ÀÂH˜I‹Uó‚óAYD$@è&.z‚Ѹÿf9؉ÚNÐéuùÿÿ‹”$ÀÂH˜I‹Uó‚óAYD$@èæ.Az‚˸ÿf9؉ÚNÐébùÿÿ‹”$È‹Œ$ÀÑH˜I‹Uó‚óAYD$@èŸ.úy‚¾¸ÿf9ØOÃéÓøÿÿD‰ðó Ýy.ȃZþÿÿó,ÀéQþÿÿD‰ðó Ày.ȃ}þÿÿó,ÀétþÿÿD‰ðó £y.ȃ ÿÿÿó,ÀéÿÿÿD‰ðó †y.ȃÃþÿÿó,ÀéºþÿÿD‰ðó iy.ȃ&ÿÿÿó,ÀéÿÿÿD‰ðó Ly.ȃIþÿÿó,Àé@þÿÿD‰ðó /y.ȃ3ÿÿÿó,Àé*ÿÿÿI‹EH‹”$HóDóAYD$@虺ÿ.ïxƒ’úÿÿ‰Úó,Àó ßx.ÈC‰ÂéwúÿÿfI‹EH‹”$0óDóAYD$@èLºÿ.¢xƒuúÿÿ‰Úó,Àó ’x.ÈC‰ÂéZúÿÿDI‹EH‹”$@óDóAYD$@èüºÿ.Rxƒ úÿÿ‰Úó,Àó Bx.ÈC‰ÂéòùÿÿDI‹EH‹”$XóDóAYD$@謺ÿ.xƒ5úÿÿ‰Úó,Àó òw.ÈC‰ÂéúÿÿDI‹EH‹”$óDóAYD$@è\ºÿ.²wƒÍùÿÿ‰Úó,Àó ¢w.ÈC‰Âé²ùÿÿDI‹EH‹”$óDóAYD$@è ºÿ.bwƒeùÿÿ‰Úó,Àó Rw.ÈC‰ÂéJùÿÿDI‹EH‹”$ óDóAYD$@輺ÿ.wƒýøÿÿ‰Úó,Àó w.ÈC‰ÂéâøÿÿóñvéŸëÿÿóAEóAYD$@èp¸ÿ.Ævs¸€ÿÿ.¼vzvó,ÀfA‰D$2óAEóAYD$@è6¸ÿ.Œvs¸€ÿÿ.‚vzvó,ÀfA‰D$0óAEóAYD$@èü¸ÿ.Rvs¸€ÿÿ.Hvzvó,ÀfA‰D$4fAÇD$6óAE,óAYD$@躸ÿ.vs¸€ÿÿ.vzvó,ÀfA‰D$óAE$óAYD$@èx¸ÿ.Îus¸€ÿÿ.Äuzvó,ÀfA‰D$8fAÇD$:AÇD$HfAÇD$F€AGÿƒøŽ+Ç„$ì»@I‹MH‰Œ$˜óAD$@ó„$”ó„$”H‹„$˜óYDèâA¾ÿ.7usA¾€ÿÿó +u.Èsó,ÀD¿ðHk ó„$”H‹„$˜óYD蘻ÿ.îts»€ÿÿó ãt.Èsó,À¿Øó„$”H‹„$˜óYD èUºÿ.«tsº€ÿÿó  t.Èsó,À¿ÐB3)ÐA¿T$F9ÐLÂfA‰D$Fÿ„$ìH‰ëD9¼$ì…ÿÿÿA‹E<‰„$ÜA¿ƒø~‹„$ÜÿÈÁøDxL(V¹ÂE;¼$¨‘çÿÿI‹•(‹B…ÀŽÈÇ„$ØE1ÀH„$H‰„$€E…ÿކ½E1öÇ„$Œ€ÿ‰é1ö‹„$Œ9Œ$Ü|I‹EHcÑI‹‹ÐH‹”$€‰²HÿÆDùHƒþuËI‹D$PL‰óJ(„$L‰D$èâ›)IƒÆD9ýL‹D$tÿÅë”I‹•(ÿ„$ØIƒÀ‹Œ$Ø9JVÿÿÿE…ÿŽ1íHÇ„$ðHœ$H‰œ$ Bý‰„$DuH‹”$ðH‰”$àE1ÀAƒøwCD‰ÀH HcHÈÿà óÜÅ­•D‰´$ÔÇ„$ЋŒ$Ô‹œ$Ð4Ë1ÿ¸€ÿ9Œ$Ü~ HcÖI‹E‹H‹”$ ‰ºHÿÇDù´$HƒÿuÊH‹œ$àI\$X(„$D‰D$è­š)D‹D$AÿÀHƒ„$àAƒø…1ÿÿÿÿÅHƒ„$ðpD9ý…ÿÿÿBýD)øHcèHÁåA¾D‰ò1ɸ€ÿ9”$Ü~HcÂHÁàIE‹@H‹œ$ ‰‹HÿÁDúHƒùuÍH‰ëI\$X(„$èš)HƒÅE9þtAÿÆë¢óAEè2óAD$dóAEè óAD$`óAEèóAD$lóAEèüóAD$hóAE(èêóAD$|óAE,èØóAD$xóAE èÆóAD$tóAE$è´óAD$pI‹¼$ØH…ÿtèéI‹¼$àH…ÿtè×I‹¼$èH…ÿtèÅI”$ØI‹}HHÇÆÿÿÿÿè—E‰Ã…À…CäÿÿI”$àI‹}PHÇÆÿÿÿÿèuE‰Ã…À…!äÿÿI”$èI‹}XHÇÆÿÿÿÿèSE‰Ã…À…ÿãÿÿI‹u`I‹¼$ðè2I‹uhI‹¼$øè!I‹upI‹¼$èI‹uxI‹¼$èÿA‹…€A‰„$A‹…„A‰„$A‹…ˆA‰„$A‹…ŒA‰„$A‹…A‰„$ A‹…”A‰„$$A‹…˜A‰„$(A‹…œA‰„$,A‹… A‰„$0A‹…¤A‰„$4A‹…¨A‰„$8A‹…¬A‰„$<A‹…°A‰„$@ºA‹„•°A‰„”@HÿÂHƒúuçéÕâÿÿD‰´$ÔÇ„$Ðé‚üÿÿD‰´$ÔÇ„$Ðéjüÿÿ‰¬$ÔÇ„$ÐéSüÿÿ‰¬$ÔÇ„$Ðé<üÿÿ‰¬$ÔÇ„$Ðé%üÿÿ‰¬$ÔÇ„$ÐéüÿÿUSHƒìH‰û‰õEó*Èó¢mó^ÁèË óYCè-WÌmºÿÿÿÿó,À.tnGˆCó“¸ó^m(ÂóXÃó*ÍóXËóXÑó^Âó Wmó\ÈóKtóK|óKlóCpóCxóChèN óYC@è° ¸ÿ.ns¸€ÿÿ.ümzvó,Àf‰C8f‰C9…À…{D‹l$AƒÅIcíH‰ïè†H‰ƒðH…À„UH‰ïènH‰ƒøH…À„H‰ïèVH‰ƒH…À„UH‰ïè>H‰ƒH…À„H‹»ðI‹´$ðH‰êè#H‹»øI‹´$øH‰êè H‹»I‹´$H‰êèõH‹»I‹´$H‰êèÞI‹„$H‰ƒA‹„$˜‰ƒ˜A‹„$œ‰ƒœA‹„$¤‰ƒ¤A‹„$´‰ƒ´A‹„$¸‰ƒ¸A‹„$¼‰ƒ¼ëXf„A‹vHcÆHÁàI¯ÅHƒøñ„QùÿÿLHL$.¹€H›D1ö¿1Àè$H‰ßèCËÿÿ1ÛH‰ØHƒÄ8[]A\A]A^A_À„ƒ|$~‹T$ÿÊA¿éù÷ÿÿƒ|$~v‹T$ÿÊA¿ÇD$$éä÷ÿÿIcFHÁàH¯D$LHL‡-¹ Hƒøñ…`ÿÿÿéõøÿÿA‹vHcÆHÁàH¯D$LHLW-¹Hƒøñ…0ÿÿÿé—øÿÿÇD$(A¿ÇD$$ÇD$,éu÷ÿÿA‹vHcÆHÁàI‰ÁL -¹%H…À„ùÿÿéàþÿÿI‰éLî,¹!HlC1ö¿èî"éÎþÿÿIcFHÁàH¯D$LHL¸,¹"Hƒøñ…‘þÿÿézøÿÿA‹vHcÆHÁàI‰ÁL,¹&H…À„¶øÿÿédþÿÿA‹vHcÆHÁàI‰ÁLg,¹'H…À„«øÿÿé<þÿÿA‹vHcÆHÁàI‰ÁL?,¹(H…À„ øÿÿéþÿÿI‰éL",¹#H B1ö¿è""éþÿÿE…í„¢üÿÿI‰éLò+¹hHpB1ö¿èò!éÒýÿÿE…í„¢üÿÿI‰éLÂ+¹jH@B1ö¿èÂ!é¢ýÿÿE…í„ZüÿÿI‰éL’+¹iHB1ö¿è’!érýÿÿE…í„ZüÿÿI‰éLb+¹kHàA1ö¿èb!éBýÿÿUSHƒì(H‹ãùH‹H‰D$1Àf$H‰ýE1ÀI‰áDfDC¶…ö…³‰ÐƒàƒøÀƒÀ1ˆE‰ÐƒàƒøÀƒÀ1ˆE‰ÐƒàƒøÀƒÀ1ˆE‰ÐƒàƒøÀƒÀ1ˆE‰ÐƒàƒøÀƒÀ1ˆE‰Ðƒà ƒøÀƒÀ1ˆE‰Ðƒà@ƒøÀƒÀ1ˆE‰Ðƒà€<ÀƒÀ1ˆEÆE IÿÀHƒÅ Iƒø…_ÿÿÿƇ1ÀH‹T$H3uHƒÄ([]Ãè€ýI‰êE1Û‰ÐD‰ÙÓøƒàƒøÀƒÀ1AˆAÿÃIÿÂAƒûuß룀SH‰ûH…ÿt)H‹ H…ÿtèÏýH‹;H…ÿtèÂýH‹{H…ÿtè´ý1À[Ãf.„AWAVAUATUSHƒìHH‰|$8H‰ó‰T$4ˆL$3L‹ž¸A‰ÕAÿÅA¶sE‰ê‰ñAÓúL‹wHE¶KE‰èD‰ÉAÓøE‹c AÿÌE!ìNÿAÓüC‰ñÓàhÿE¶{D‰|$ ¶|$3D‰øA¯ÀøH˜H‹L$8H‹Q@D‹<‚E…ä„ÛAB¯D$ øH˜A·FAÇH‹t$8;.r=ƒýÿt8€|$3u‹T$4H‹D$8;PrAÿÏD‰øHƒÄH[]A\A]A^A_À€H‹D$8L‹p(¶D$3H‹S(HÁàfo4focPA¶C„À…ƒE…ä„iE…íHèÁýUñ‹D$4ƒÀ‹L$4…É‹L$4HÈÁù9Ê~tHcÂLðfokpfDfofïÆfoÈfqÑfëÁfÛCpfoÍfèÈfoÁfqÐfýÁfoÐfqÒfÛƒ€fÛ“€foÌfýÈfýÊfoáƒêHƒè9Ê•D)èH@…É~lHcÂfBo0fïÆfoÈfqÑfëÁfÛCpfoKpfèÈHcÁH‹SHÁàfÛ foÁfqÐfýÁfoÈfqÑfÛƒ€fo«€fÛéfýàfýåffïcPföc@fpÄVfýà1ÒAƒü•ÂTÿfÅįÂAÇéHþÿÿA)ñD‰ÉAÓàE9Є(þÿÿD¯T$ A:H˜A·FAÇéþÿÿDþÈtH=11Àfd$ èxfod$ ë€E…ä„(‰èÁèèÑøPñ‹D$4Áè‹t$4 0Ñù9Ñ}AHcÂLðfofoÈfqÑfÛC`fÛK`ftÎftÆfoÔfèÑfèÐfoâƒêHƒè9Ñ|ÆD)èH …ÉŽÿÿÿHcÂfBo0foÈfqÑfÛC`fÛK`ftÎftƉÈÑøH˜H‹SHÁàfÛ AÑøH˜HÁàfÛfèáfèàé±þÿÿò*ÅòYE[fd$ ft$èÐùòX,Zò,ÐAEE…íD‰îHðÁþB9Æfod$ fot$~HcÂJ 0fokpf„fofïÆfoÈfqÑfëÁfÛCpfoÍfèÈfoÁfqÐfýÁfoÈfqÑfÛƒ€fo›€fÛÙfoÔfýÐfýÓfoâƒÂHƒÁB9Æ–•D‰é)Á…É~jHcÂfBo0fïÆfoÈfqÑfëÁfÛCpfoKpfèÈHcÁH‹SHÁàfÛ foÁfqÐfýÁfoÈfqÑfÛƒ€fo«€fÛéfýàfýåfïcPföc@fpÄVfýàºéoýÿÿò*ÅòY³Zfd$ ft$ènøòXÊXò,ÈD‰èÁèB4(ÑþA9Æfod$ fot$~DHcÁJ0fofoÈfqÑfÛC`fÛK`ftÎftÆfoÜfèÙfèØfoãƒÁHƒÂA9ÆÃ D‰î)Æ…öŽGÿÿÿHcÁfBo0foÈfqÑfÛC`fÛK`ftÎftÆFÑøH˜H‹SHÁàfÛ ÑþHcÆHÁàfÛfèáfèàéôþÿÿAWAVAUATUSHƒìXH‰|$HH‰ó‰T$DL‰D$8M‰ÌA‰Í„Éu ;WƒAÇ$H‹³¸D‹|$DAÿǶVE‰ú‰ÑAÓúH‹D$HL‹HHL‹@@¶ND‰ÿÓÿD‹v AÿÎE!þJÿAÓþC‰ÑÓàDXÿA¶í¶F¯ÇèH˜A‹€H‹T$8‰E„ít$A‹$1É@¶F¯ÇH˜A€A‰$ÿÁ9ÍuæE…ö„ôAz¶F¯ÇèH˜A·AH‹L$8E„ít*A‹$1É€¶F¯ÇH˜A·AÂA‰$ÿÁ9ÍuãH‹L$HD;r1Aƒûÿt+E„íu‹t$DH‹L$H;qrH‹D$8ÿ1ÀHƒÄX[]A\A]A^A_ÃH‹D$HL‹P(fDoCP¶F„À…ÌE…ö„ACE…ÛDHØAÁûA{ñ‹D$DƒÀ‹t$D…öD‹L$DDHÈAÁùfEoÐA9ùúE¶ÅIÁàHcÇLÐH‹s(fo{pfoE„ítn1É1ÒDfoÃfïfoÈfqÑfëÁfÛCpfoÏfèÈfoÁfqÐfýÁfoÐfqÒfÛƒ€fÛ“€fAoÈfýÈfýÊfDoÁÿÁHƒÂ9Íu›fBïfoÃfqÐfëØfÛ[pfoÏfèËfoÁfqÐfýÁfoÈfqÑfÛƒ€fo›€fÛÙfAoâfýàfýãfDoÔƒïHƒèA9ùŒÿÿÿ½D)øP@…ÒŽ¢HcÇfBoE„턼HcÊHÁá1Ò1ÀH‹s(fo{pH‹{foÈfï foÑfqÒfëÊfÛKpfo×fèÑfÛfoÊfqÑfýÊfoÑfqÒfÛ‹€fo›€fÛÚfAoèfýéfýëfDoÅÿÂHƒÀ9Õu’A¶ÅHÁàfï0foÈfqÑfëÁfÛCpfèøfÛ<foÇfqÐfýÇfoÈfqÑfÛƒ€fo›€fÛÙfAoâfýàfýãfDoÔé¡¶N¶F)ÁÓçD9ׄAýÿÿ¶FA¯ÂèH˜A·AH‹T$8E„í„ ýÿÿA‹$1ÉfD€¶FA¯ÂH˜A·AÂA‰$ÿÁ9ÍuâéêüÿÿAÇéûûÿÿþÈ„€H= *1ÀfDD$èôfDoD$fEoÐfDïCPfAoðfös@fpÆV1ÒAƒþ•ÂTÿfýðfÅÆ¯ÂA$fDïSPfAoâföc@fpÄVfýàfÅįÂH‹T$8éfüÿÿA¶ÅH‹S(HÁàfDo E…ö„GD‰ØÁèDØÑøHñ‹D$DÁè‹t$D0ÑúfEoÐ9Ê}hHcÁLÐfo0foÆfqÐfÛs`fÛC`fAoÉfdÈfAoÙfdÞfAoèfèéfèëfDoÅfAtÁfAtñfAoâfèàfèæfDoÔƒéHƒè9Ê|ž D)øp …öŽæþÿÿHcÁfBofoÈfqÑfÛC`fo{`fÛùfAoÑfd×fAoÙfd؉òÑúHcÒHÁâH‹KfÛFÑøH˜HÁàfÛfAoðfèòfèófDoÆfoÏfAtÉfAtÁfÛ fÛfAoâfèáfèàfDoÔéOþÿÿòA*ÃòYÚRL‰T$(fDD$èeñòXÁQò,ÈAGE…ÿE‰ùDHÈAÁùAfDoD$fEoÐA9ÁL‹T$(ŽE¶ÅIÁàHcÁJ<H‹s(fo{pfo/E„ítv1Ò1Àf„foÅfïfoÈfqÑfëÁfÛCpfoÏfèÈfoÁfqÐfýÁfoÈfqÑfÛƒ€fo›€fÛÙfAoÐfýÐfýÓfDoÂÿÂHƒÀ9Õu—fBï,foÅfqÐfëèfÛkpfoÏfèÍfoÁfqÐfýÁfoÈfqÑfÛƒ€fo›€fÛÙfAoâfýàfýãfDoÔƒÁHƒÇAA9ÁÿÿÿD‰ú)Â…ÒŽÜüÿÿHcÁfBoE„í„HcÊHÁá1Ò1ÀH‹s(fo{pH‹{foÈfï foÑfqÒfëÊfÛKpfo×fèÑfÛfoÊfqÑfýÊfoÑfqÒfÛ‹€fo›€fÛÚfAoðfýñfýófDoÆÿÂHƒÀ9Õu’é5ûÿÿòA*ÃòYšQL‰T$(fDD$fD $èOïòX«Oò,ÈD‰øÁèB48ÑþAfDoD$fEoÐ9ÆL‹T$(fDo $~lHcÁJfo:foÇfqÐfÛ{`fÛC`fAoÉfdÈfAoÙfdßfAoðfèñfèófDoÆfAtÁfAtùfAoâfèàfèçfDoÔƒÁHƒÂA9Æ› D‰ú)Â…ÒŽiûÿÿHcÁfBofoÈfqÑfÛC`fo{`fÛùfAoÑfd×fAoÙfdØBÑøH˜HÁàH‹KfÛÑúHcÒHÁâfÛfAoðfèòfèófDoÆfoÏfAtÉfAtÁfÛ fÛ fAoâfèáfèàfDoÔéÔúÿÿHcÊHÁáH‹s(fo{pH‹{é±ùÿÿHcÊHÁáH‹s(fo{pH‹{é˜ùÿÿf.„AVAUATUSHƒì H‰ûL‹5ÊèI‹H‰D$1Àè+ÙýÿfvÀfC0foZNf`Àf`ÀfpÀfCPfïÀfC@foçNfC`H‹ƒ¸€x„ÛHÇC(¶xHÁçHƒÇè¼íH‰C H…À„HƒÀHƒàðH‰C(H‹“¸€zte1ö1ÿ€€‰ñ€zuµ Á‰ðÁà Á‰ðÁà ÁH‰úHS(¾ÁfnÀf`Àf`ÀfpÀfÿÆH‹“¸HƒÇ¶B9ð­€zEäAƒä0AƒÄ€zMíAåIÅ€zHíåHÅHÇCHÇCH‰ïèáìH‰H…À„nHƒÀHƒàðH‰CH‰ïèÁìH‰CH…À„ÜHƒÀHƒàðH‰CfoC0At$ÿ…öŽßf$AD$E…äE‰áDHÈAÁùHcþHÁçAºA»ÿÿÿÿ½ðÿÿÿA¼üÿÿÿA½ÀÿÿÿNÿ‰Ê‰ÈÁúA÷ùA‰ÀH‹ƒ¸€xu‰ðƒà‰êƒøtD‰âƒøtÿÈtiD‰ÚIcÀˆAPƒú€„HcÂÆÿƒúuòH‹Cfo$f8L‰ÒHSH‹Cfo8fßC0fHƒïIƒÂ…Ét ‰ÎébÿÿÿD‰êë•H‹ƒ¸1Ò€xt‰ÐH‹T$I3…+HƒÄ []A\A]A^ÃH‹CfoC0f€H‹CfoC0f€ë¿Iƒýñ„ˆþÿÿI‰éL7¹_H;.1ö¿è7 H‹{ H…ÿtèßêH‹;H…ÿtèÒêH‹{H…ÿtèÄêH=.1Àè@ ºéRÿÿÿfoþKfCpfoLfƒ€éýÿÿIƒýñ„þÿÿI‰éL¨¹bH¬-1ö¿è¨ élÿÿÿH‹ƒ¸D¶HIÁáIƒÁLp¹BHt-1ö¿1Àèn é2ÿÿÿè„é@SHì°H‹ñäH‹H‰„$¨1Àf„$H‰á1öH¼$€€¶>‰ÐƒàƒøÀƒÀ1ˆA‰ÐƒàƒøÀƒÀ1ˆA‰ÐƒàƒøÀƒÀ1ˆA‰ÐƒàƒøÀƒÀ1ˆA‰ÐƒàƒøÀƒÀ1ˆA‰Ðƒà ƒøÀƒÀ1ˆA‰Ðƒà@ƒøÀƒÀ1ˆA¸1„Òx¸0ˆÆA HÿÆHƒÁ Hƒþ…gÿÿÿÆ„$H‰âH5}ðH‹äH‹81Àèé1ÀH‹”$¨H3u Hİ[Ãègè€SHì°H‹ÑãH‹H‰„$¨1Àf„$HL$1öH¼$fDfD¶>‰ÐƒàƒøÀƒÀ1ˆAù‰ÐƒàƒøÀƒÀ1ˆAú‰ÐƒàƒøÀƒÀ1ˆAû‰ÐƒàƒøÀƒÀ1ˆAü‰ÐƒàƒøÀƒÀ1ˆAý‰Ðƒà ƒøÀƒÀ1ˆAþ‰Ðƒà@ƒøÀƒÀ1ˆAÿ¸1„Òx¸0ˆÆA HÿÆHƒÁ Hƒþ…gÿÿÿÆ„$H‰âH5]ïH‹öâH‹81Àèâç1ÀH‹”$¨H3u Hİ[ÃèGçH‰=)àÄHÇàÃ@óÀ€Hº‹lçû©ñ²?H‰H¹š™™™™™™?H‰OH¸ÙÎ÷S㥫?H‰GH‰GH¸ªñÒMb¨?H‰G H‰W(H¸9´Èv¾Ÿš?H‰G0H¸œÄ °rh±?H‰G8H¸V-²­?H‰G@H¸òÒMbX¹?H‰GHH‰OPH¸ ×£p= §?H‰GXI»+‡ÙÎ÷£?L‰_`IºœÄ °rh¡?L‰WhI¹9´Èv¾Ÿª?L‰OpI¸Év¾Ÿ/­?L‰GxH¾é&1¬ª?H‰·€H¹ã¥›Ä °²?H‰ˆHº9´Èv¾ŸŠ?H‰—H¸ü©ñÒMb ?H‰‡˜1ÀÄI»µúêª@-¶?L‰Iºbe4òyÅ“?L‰WI¹¾öÌ’5­?L‰OI¸ôzÄè¹­?L‰GH¾Ý_=î[­£?H‰w H¹‰›SÉPµ?H‰O(Hº&Ȩp™?H‰W0H¸O•ï‰Ð¨?H‰G8H¸¢ÎÜC¯?H‰G@H¸ñðžË¶?H‰GHH¸²²,˜ø“?H‰GPH¸ªED1y¤?H‰GXH¸€Ó»x?n§?H‰G`I»òé±-΢?L‰_hIºî!á{ƒ¦?L‰WpI¹b»{€î˱?L‰OxI¸‚þB=¯?L‰‡€H¾«Îj=&²?H‰·ˆH¹ú{)1ÀH…ÿtèÇ×H‰Eé.ÿÿÿH‹}HÿÇHßè ×épÿÿÿL‹MIÿÁIÙL› ¹ÌHQ1ö¿1ÀèÙøÿÿ¸éõþÿÿ€„H‰\$ØH‰l$àL‰d$èL‰l$ðL‰t$øHƒì(I‰ýI‰ÖH‰ËI‰ôH…öˆÎH…Ûˆ¥H…Û„ŒI‹}H…ÿ„ÏJl#H‰îèÀÖH…ÀuMI‰éLû ¹eH±1ö¿1Àè9øÿÿ¸H‹$H‹l$L‹d$L‹l$L‹t$ HƒÄ(ÀI‰EJ< H‰ÚL‰öè ÖI]BÆ#@1Àë¸fDfDM…ötëL‰÷èyÖH‰ÃéFÿÿÿDfDH‹?E1äH…ÿ„#ÿÿÿèRÖI‰Äéÿÿÿ@Jl#H‰ïè—Õé,ÿÿÿ€€AVAUATUSI‰üI‰õI‰Ö‹6…ö„2L‰òI‹<$èßÔºH…ÀtL‰÷èÁÔ…Àt1Ò‰Ð[]A\A]A^ÃfDI‹$H‰ßèÊÕH˜€|ÿ tØA‹UBÿHcèëj€„²€HcöH‰ßèMÕH…Àt]I‰$Aƒm€H‰ëHÃL‰ò¾H‰ßèQÔH…ÀtƒHƒí€H‰ßè`ÕH˜€|ÿ „jÿÿÿI‹$A‹UH…Ûu º€Hcÿè–ÔH…Àu£E‹MAƒé€McÉL# ¹úHÙ1ö¿1ÀèaöÿÿI‹<$H…ÿtè ÔIÇ$AÇEº‰Ð[]A\A]A^ÿ€è-ÔI‰$H…ÀtAÇE€¾€é©þÿÿA¹€Léÿ¹ÝH_1ö¿èéõÿÿ놀(Øó-4(àTå.%ø3uz(ÁTÅ.ç3z„Ÿ.Ûzzux.%Ñ3z„y.Éutzr(ÁTÅ.µ3zta.ÙztjWö.Þuz.Ðs[.Îuz.ÔsO(Ãó\ÁTÅóZÀòXÀóXÙTÝóZËò^ÁóZÊ1Àf.È’ÀÃ1À.É›ÀÀ¸Ãf.„1ÀÃfD€(Øó%53(èTì.-3uz(ÁTÄ1À.3ztF.ÛzLuJ.-ó2zt/.Éu*z((ÁTÄ.Û2ztó\ÙTÜ1À.Ó’ÀÀ¸óÃf„1À.É›ÀÀf(Øò5Ô3f(èfTîò%„3f.ìuzf(ÁfTÆf.Äz„˜f.Ûzrupf.ìztxf.Éurzpf(ÁfTÆf.Äzt`f.ÙzthfWäf.Üuzf.ÐsVf.Ìuzf.ÕsHf(Ãò\ÁfTÆòXÀòXÙfTÞò^Ã1Àf.Ð’ÀÃf1Àf.É›ÀÃfD¸Ãf.„1ÀÃfD€f(Øò%ô2f(ðfTôò-¤2f.õuzf(ÁfTÄ1Àf.Åzt?f.ÛzDuBf.õzt*f.Éu$z"f(ÁfTÄf.Åztò\ÙfTÜ1Àf.Ó’ÀøóÃf„1Àf.É›ÀÃfDSH‰ûH…ÿu#éBfHc×H‹~Ë‹Du,éfD€¾À=ÿ‡‚HÿÇH˜öD>tv¶G„ÀuÞ¸[úH5>H‰ßè¯Ð…ÀtS¶<0tp„ÀtÖ¾Ðúÿw9H‹ zÊHcÂH‰ßöD=uë#¾À=ÿwHÿÇH˜öD=t ¶G„Àuâë’1À[ÃH‰ßèJЃø ÿÿÿ¶<0uœë fHÿÃéèþÿÿH‰ßè&к0ÿÈ~ŽHÿöétÿÿÿfDfDS¶„ÀtOH‰ûë'Hc×H‹ÞÉ‹DÉ‹D¿°è„­H‰ÅA¹°LXÙ¹tH…À„ÏHÇ@HÇ€˜HÇ€ HÇ€¨AD$LcðL‰÷è-­H‰ÁH‰EH…À„ HÝH‰D$H‰Çè­H‰…˜H…À„åHÁãH‰\$H‰ßèç¬H‰… H…À„öH‹˜HÇE‰æE¯õMcþL‰ÿè·¬H‰H…À„üAƒü~*H‹˜H‰ÏD‰ê¾HcÂHH‰AÿÆDêHƒÁD9æuèÇED‰mD‰eH‹}H‹t$èô¬ÆEþ¸ÆD(þHÿÀH=€uð‹U…ÒŽÓ1ÒH‹M‹uH¾ˆTBHÿÂ9Æí…öޝ‹ME1À1ÿH‹… Ç8…É~*H4?1ÒH‹…˜H‹0ÆB‹MHÿÂ9ÁäH‹… AÿÀHƒÇD9E¾1Ò…ÉébDH‹… ÇH‹…˜H‹ÐÆBHÿÂ9EØH‹… H‹T$D‰lô‹E…À~O1ÒH‹…˜H‹L$H‹DèÆBHÿÂ9Eàë+L ó¹pHhñ1ö¿ 1Àè+ÍÿÿH‰ïèóøÿÿ1íH‰èHƒÄ([]A\A]A^A_ÃHƒ|$„þÿÿL‹L$LßÖ¹}Hñ1ö¿èßÌÿÿë²Hƒ|$„þýÿÿL‹L$L­Ö¹~Hèð1ö¿è­Ìÿÿë€E…ö„ûýÿÿM‰ùL€Ö¹ƒH»ð1ö¿1Àè~ÌÿÿéNÿÿÿM‰ñLWÖ±|AƒüÿuÔéIýÿÿ‹MH‹… é“þÿÿH‹T$D‰lôé#ÿÿÿ@H‰\$ØH‰l$àL‰d$èL‰l$ðL‰t$øHƒì(I‰üI‰ÖH…Ò„¤HÇH…ÿ„”LnL‰íH…öˆˆH‰ïèð©H‰ÃH…Àt4H‰êL‰æH‰Çèæ©I‰1ÀH‹$H‹l$L‹d$L‹l$L‹t$ HƒÄ(Ã@M‰éLŽÕ¹8HÉï1ö¿1ÀèŒËÿÿIǸ뭀€1Àë›A½½€ÿ„cÿÿÿ1ÀDHÿÀB€| ÿuõLhL‰íéEÿÿÿf„AVAUATUSI‰ýH‰óI‰ÖH‰÷轩H‰ÅL`L‰çè ©H‰ÇH…Àt}Æÿ¶1íº„ÀtUH‰Þ¹E‹EEHýëfD€ˆHÿÁ¶FHÿÆ„Àt"H¾ÀA¶T¶ÂD9À|Ý€úýtÞDˆ ½ ëÐH‰ÊÆÿM…öt[I‰>‰è[]A\A]A^ÃHƒýþ„yÿÿÿM‰áLWÔ¹zH’î1ö@·1ÀèWÊÿÿ½M…öt¿Iǽ‰è[]A\A]A^Ãèç§ë¡€„SD‹GEHA¶Á‹OQý9ЀWÒYþA‰Óë}9Ã&(ÂóA2AÿÁA¶ÁD9ØZA¶ÑL•A9À~Ô(ÊE…À~+H‹‡˜H‹ Ð(Ê1Ò1À@€<tóX †ÿÂHÿÀD9ÂuëH‹‡ óB*ó^È(Áë”1À[ÃUSD‹GEHA¶Á‹OQý9ÐfWÒiþ‰Óë}9Å&f(ÂòA3AÿÁA¶Á9ØiE¶ÑNÕA9À~Ôf(ÊE…À~)H‹‡˜I‹ f(Ê1Ò1À€<tòX ÆÿÂHÿÀD9ÂuëH‹‡ òB*ò^Èf(ÁòA3AÿÁA¶Á9Ø~—1À[]ÃUSD‹OEQA¶ÂD‹GAHý9È Wäó-ß(ôAhþ‰Ëë~9è|(ÆóBžAÿÂA¶Â9ØpE¶ÚD9È}Ý(ÅE…É~ÞH‹‡˜N‹Ø(Ô1É(Ü1ÀfDfDB€<tó ‚(ÁóY†óXØóXÑÿÁHÿÀD9ÉuÚ(Ãó^ÂóBžAÿÂA¶Â9Ø~1À[]ÃfD€USD‹OEQA¶Ê‹GXý9ËŒ¤fWäò-€f(ôhþë}9é|&f(ÆòA3AÿÂA¶Ê9ÙtA¶ÂLÅA9É~Ôf(ÅE…É~ÕH‹‡˜M‹f(Ôf(Ü1É1ÀB€<tò Âf(ÁòYÆòXÐòXÙÿÁHÿÀD9ÉuÙf(Âò^ÃòA3AÿÂA¶Ê9Ù~Œ1À[]ÃDfDSD‹GEHA¶Á‹WDZýA9ÃŒ²ò-Ëf(õWÛ(ãZþ€€A¶ÑL•A9À |9Ø}x(Ô(ÌE…À~3H‹‡˜H‹ Ð(Ó(Ë1Ò1ÀD€<t ó*†óXÈÿÂHÿÀD9ÂuçH‹‡ óA*ó^È.Ñw(óZÁòXÅò,ÀA‰2AÿÁA¶ÁD9ØŽqÿÿÿ1À[Ã1ÀëäóZÁò\Æò,ÀëÖDfDUSD‹OEQA¶Â‹OYý9ÃŒ’Wäò5Ùf(îiþfE¶ÚA9Á}x9è}tE…É~oH‹‡˜N‹Ø(Ü(Ô1É1À€B€<tó ‚ó*†óYÁóXØóXÑÿÁHÿÀD9ÉuÙ(Ãó^Â.àw$óZÀòXÅò,ÀB‰žAÿÂA¶Â9Ø~‚1À[]Ã1ÀëèóZÀò\Æò,ÀëÚDfDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰þI‰ôI‰ÕH‰ÍL‰ÃHƒ:ˆ%H…Ûˆ¸H…Û„ÃI‹<$H…ÿ„II‹uHƒÆHÞèd£H…À„´H‰ÆI‰$I‹UHÿÂ1ÿH…ÛŽŠ1ÉL·ëf„ˆ2HÿÂHÿÁH9Ù„dH¾)A¶„ÀyàƒÀ<vyL²æ¹ÏfD€H¸è1ö¿1Àè{Äÿÿ¿ëH…í…ŽDfD1ÿ‰øH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8Ãf„¶ÀIc€LÀÿಡZÿÿÿ|H‹H…Ò„£€zÿ„™1À„HÿÀ€|ÿuöI‰Eé¨þÿÿH‰ïè{¢H‰Ãé¡þÿÿL{L‰ÿèÅ¡I‰$H…À„¡ÆÿI‹4$é²þÿÿLIå¹ÊéÿÿÿA¶ˆ2Hÿ¿ é¹þÿÿLLå¹ÍéâþÿÿL[å¹ÎéÑþÿÿ1ÀétÿÿÿÆ2ÿHBÿI‰EéëþÿÿM‹MIƒÁIÙLßÕ¹ HZç1ö¿1ÀèÃÿÿ¿éµþÿÿHƒûþ„UÿÿÿM‰ùLç̹H"ç1ö¿èçÂÿÿ¿éþÿÿfD€ATUSHƒì ƒÿv3Llé¹@Hßæ1ö¿ 1Àè¢Âÿÿ1íH‰èHƒÄ []A\Ã@‰øH Hc‚HÐÿàf¹ÿÿÿÜ¬Ü º ¾H=÷èè~òÿÿH‰ÅH…Àt¦ÇH‹X¾_H‰ßè½ H…À„˜A¹_L!繘H<æ1ö¿ 1ÀèÿÁÿÿH‹]¾.H‰ßè| H…À„× A¹.Làæ¹˜Hûå1ö¿ 1Àè¾ÁÿÿH‰ëA¼aëc¶{y‹M@¶Ç9È}kE1É÷Æ€ÿÿÿA”ÁHcÖE…É„H D¶DA¶À9ÁŽ6 ‰ú@¶ÿ9ùrDˆCy„AÿÄHÿÃAƒü{„°þÿÿD‰çètž‰Æ1ÒA÷Ä€ÿÿÿ”Â…Òu†E1É÷Æ€ÿÿÿA”ÁE…ÉtHcÆD¶D‹MA¶À9ÈŒÜ …Òt¨¶Sy¶ú‹M9Ï}šE…Ét•HcƶDD¶ÀD9Á~„8Ât€D‰D$‰|$‰4$E‰áLBæ¹ÀHíä1ö¿ 1Àè°Àÿÿé þÿÿDfDº¾H=pæèºðÿÿH‰ÅH…À„ÞýÿÿÇH‹X¾TH‰ßèõžH…À„0 A¹TLY幘Htä1ö¿ 1Àè7ÀÿÿH‹]¾XH‰ßè´žH…À„¯ A¹XL幘H3ä1ö¿ 1Àèö¿ÿÿH‹]¾_H‰ßèsžH…À„Ž A¹_L×乘Hòã1ö¿ 1À赿ÿÿH‹]¾.H‰ßè2žH…À„ A¹.L–乘H±ã1ö¿ 1Àèt¿ÿÿH‰ëA¼aëif„¶{y‹M@¶Ç9È}kE1É÷Æ€ÿÿÿA”ÁHcÖE…É„èD¶DA¶À9ÁŽÖ‰Ê‰ù@¶ÿ9×|pDˆCyfDAÿÄHÿÃAƒü{„ D‰çè$œ‰Æ1ÒA÷Ä€ÿÿÿ”Â…Òu†E1É÷Æ€ÿÿÿA”ÁE…ÉtHcÆD¶D‹MA¶À9ÈŒì…Òt¨¶Ky¶ù‹U9×}šE…Ét•HcƶDD¶ÀA9Ð}„8Át€D‰D$‰|$‰4$E‰áLòã¹ÀHâ1ö¿ 1Àè`¾ÿÿHMä¾RH‰ïèœêÿÿH<ä¾YH‰ïèˆêÿÿH+ä¾MH‰ïètêÿÿHä¾KH‰ïè`êÿÿH ä¾SH‰ïèLêÿÿHøã¾WH‰ïè8êÿÿHçã¾HH‰ïè$êÿÿH×ã¾BH‰ïèêÿÿHcá¾VH‰ïèüéÿÿH³ãé˺¾H=äèºíÿÿH‰ÅH…À„ÞúÿÿÇH‹X¾_H‰ßèõ›H…À„A¹_LY⹘Htá1ö¿ 1Àè7½ÿÿH‹]¾.H‰ßè´›H…À„oA¹.L⹘H3á1ö¿ 1Àèö¼ÿÿH‰ëA¼aëkDfD¶{y‹M@¶Ç9È}kE1É÷Æ€ÿÿÿA”ÁHcÖE…É„XD¶DA¶À9ÁŽF‰Ê‰ù@¶ÿ9×|pDˆCyfDAÿÄHÿÃAƒü{„ D‰ç褙‰Æ1ÒA÷Ä€ÿÿÿ”Â…Òu†E1É÷Æ€ÿÿÿA”ÁE…ÉtHcÆD¶D‹MA¶À9ÈŒ,…Òt¨¶Ky¶ù‹U9×}šE…Ét•HcƶDD¶ÀA9Ð}„8Át€D‰D$‰|$‰4$E‰áLrá¹ÀHà1ö¿ 1Àèà»ÿÿHiâ¾BH‰ïèèÿÿHXâ¾JH‰ïèèÿÿHGâ¾ZH‰ïèôçÿÿHe¨¾UH‰ïèàçÿÿH$â¾OH‰ïèÌçÿÿH‰èHƒÄ []A\ú¾H=üáèŠëÿÿH‰ÅH…À„®øÿÿÇH‹X¾_H‰ßèÅ™H…À„A¹_L)๘HDß1ö¿ 1Àè»ÿÿH‹]¾.H‰ßè„™H…À„?A¹.Lèß¹˜Hß1ö¿ 1ÀèÆºÿÿH‰ëA¼aëkDfD¶{y‹M@¶Ç9È}kE1É÷Æ€ÿÿÿA”ÁHcÖE…É„D¶DA¶À9ÁŽ‰Ê‰ù@¶ÿ9úpDˆCyfDAÿÄHÿÃAƒü{„°÷ÿÿD‰çèt—‰Æ1ÒA÷Ä€ÿÿÿ”Â…Òu†E1É÷Æ€ÿÿÿA”ÁE…ÉtHcÆD¶D‹MA¶À9ÈŒ\…Òt¨¶Ky¶ù‹U9×}šE…Ét•HcƶDD¶ÀD9Â~„8Át€éûøÿÿDfDº¾H= àèêéÿÿH‰ÅH…À„÷ÿÿÇH‹X¾UH‰ßè%˜H…À„ A¹UL‰Þ¹˜H¤Ý1ö¿ 1Àèg¹ÿÿH‹]¾XH‰ßèä—H…À„_A¹XLHÞ¹˜HcÝ1ö¿ 1Àè&¹ÿÿH‹]¾_H‰ß裗H…À„¾A¹_LÞ¹˜H"Ý1ö¿ 1Àèå¸ÿÿH‹]¾.H‰ßèb—H…À„ýA¹.LÆÝ¹˜HáÜ1ö¿ 1À褸ÿÿH‰ëA¼aëif„¶{y‹M@¶Ç9È}kE1É÷Æ€ÿÿÿA”ÁHcÖE…É„èD¶DA¶À9ÁŽÖ‰Ê‰ù@¶ÿ9×|pDˆCyfDAÿÄHÿÃAƒü{„ D‰çèT•‰Æ1ÒA÷Ä€ÿÿÿ”Â…Òu†E1É÷Æ€ÿÿÿA”ÁE…ÉtHcÆD¶D‹MA¶À9ÈŒü…Òt¨¶Ky¶ù‹U9×}šE…Ét•HcƶDD¶ÀA9Ð}„8Át€D‰D$‰|$‰4$E‰áL"ݹÀHÍÛ1ö¿ 1Àè·ÿÿH}ݾRH‰ïèÌãÿÿHÒݾYH‰ïè¸ãÿÿH[ݾMH‰ïè¤ãÿÿH­Ý¾KH‰ïèãÿÿH9ݾSH‰ïè|ãÿÿHˆÝ¾WH‰ïèhãÿÿHwݾHH‰ïèTãÿÿHgݾBH‰ïè@ãÿÿH“Ú¾VH‰ïè,ãÿÿHCݾDH‰ïèãÿÿ‹Eÿȃø†LËܹfHÖÚ1ö¿ 1Àè™¶ÿÿH‰ïèaâÿÿ1íH‰èHƒÄ []A\Ã@ˆ|é6þÿÿfD@ˆ|éüÿÿfD@ˆ|éÆùÿÿfD@ˆ|é6÷ÿÿfD@ˆ|éÖôÿÿfD…Ò„¼ôÿÿ¶{yé©ôÿÿ€„…Ò„nùÿÿ¶{yéYùÿÿ€„…Ò„žýÿÿ¶{yé‰ýÿÿ€„…Ò„®öÿÿ¶{yé™öÿÿ€„…Ò„>ûÿÿ¶{yé)ûÿÿHc}èš“H‰…¨H…À„tÆH‹…¨Æ@H‹…¨Æ@H‹…¨Æ@H‹…¨Æ@H‹…¨Æ@H‹…¨Æ@H‹…¨Æ@H‹…¨Æ@H‹…¨Æ@ H‹…¨Æ@ H‹…¨Æ@ H‹…¨Æ@ H‹…¨Æ@ H‹…¨Æ@ H‹…¨Æ@H‹…¨Æ@é.òÿÿ¾-H‰ßèO“H…À„Ø(؈Ewé{÷ÿÿ¾-H‰ßè/“H…À„(؈EFé˜÷ÿÿ¾-H‰ßè“H…À„L(؈EFéúôÿÿ¾NH‰ßèï’H…À„þ(؈Epé\ôÿÿ¾-H‰ßèÏ’H…À„6(؈Ewé}ôÿÿ¾UH‰ß诒H…À„D(؈EléÛóÿÿ¾-H‰ßè’H…À„Ø(؈EFé0òÿÿ¾NH‰ßèo’H…À„\(؈Epé¬úÿÿ¾-H‰ßèO’H…À„ð(؈EFé ûÿÿ¾-H‰ßè/’H…À„ò(؈EFéÈøÿÿ¾-H‰ßè’H…À„‚(؈Ewésñÿÿ¾TH‰ßèï‘H…À„ (؈Eméëùÿÿ¾-H‰ßèÏ‘H…À„š(؈EwéMúÿÿ¾-H‰ß译H…Àtj(؈Ewéøÿÿ‹U…Ò„ýÿÿLcÊLå¼¹hH ×1ö¿èå²ÿÿéGüÿÿA¹-LعšHöÖ1ö¿ 軲ÿÿH‹]éõÿÿA¹-Lí×¹šHÈÖ1ö¿ è²ÿÿH‹]é÷ÿÿA¹-L¿×¹šHšÖ1ö¿ è_²ÿÿédõÿÿA¹NL•×¹šHpÖ1ö¿ è5²ÿÿH‹]é:òÿÿA¹-Lg×¹šHBÖ1ö¿ è²ÿÿéŽòÿÿA¹-L=×¹šHÖ1ö¿ èݱÿÿH‹]é#òÿÿA¹UL×¹šHêÕ1ö¿ 诱ÿÿH‹]ésñÿÿA¹-LáÖ¹šH¼Õ1ö¿ è±ÿÿé¶öÿÿA¹NL·Ö¹šH’Õ1ö¿ èW±ÿÿH‹]é,øÿÿA¹TL‰Ö¹šHdÕ1ö¿ è)±ÿÿH‹]é½÷ÿÿA¹-L[Ö¹šH6Õ1ö¿ èû°ÿÿé8ïÿÿA¹-L1Ö¹šH Õ1ö¿ èѰÿÿH‹]éÍîÿÿA¹-LÖ¹šHÞÔ1ö¿ 裰ÿÿéú÷ÿÿA¹-LÙÕ¹šH´Ô1ö¿ èy°ÿÿH‹]é÷ÿÿAWAVAUATUSHƒìI‰ýI‰ô‹N‹VH5×1ÀèæA‹T$…ÒŽ}E1öE1ÿI‹$òB8D‰òH5×L‰ï¸è²A‹D$…À~?1Û1í€I‹D$J‹8ò(‰ÙD‰òH5ÞÖL‰ï¸èwÿÃHƒÅA9\$ÌAÿÆIƒÇE9t$‰1ÀHƒÄ[]A\A]A^A_ÃfD€H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰ýH‰õ‹N‹VH5uÖ1ÀèLuÖ¹E…Ày@H„Ö¾¿1Àè<¯ÿÿ¸H‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃE1ÿE1ö‹u…öެH‹EòB0H59ÖL‰ï¸背…ÀˆE1ä1Û‹M…ÉëR€„AÿÄHƒÃD9e~6H‹EJ‹0òH5æÕL‰ï¸è0Œ…ÀyÎLŸÕ¹Jé)ÿÿÿH5þŸL‰ï1Àè Œ…Àx)AÿÇIƒÆD9}Tÿÿÿ1ÀéÿÿÿLaÕ¹HéëþÿÿLPÕ¹KéÚþÿÿ€€H‰\$ðL‰d$øHƒì8H‰ûòL$I‰ôèA¿f(ÈòD$H‰ßò $è*¿ò $òXÁò^ÈòA $1ÀH‹\$(L‹d$0HƒÄ8ÃfDAVAUATUSI‰ýA‰ôI‰Ö…ö~*H‰Ó1ífDòˆëL‰ïèоòÿÅHƒÃD9åuáD‰æL‰÷è&u1À[]A\A]A^ÃDfDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰ÿI‰öA‰ÔI‰Í…Ò~-1í1Ûf.„òAÞL‰ÿèR¾òADÝÿÅHÿÃD9åuáD‰æL‰ïè¦t1ÀH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃAVAUATUSI‰ýA‰ôI‰Ö…ö~.H‰Ó1ífDò˜êL‰ïèà½òZÀóÿÅHƒÃD9åuÝD‰æL‰÷è²t1À[]A\A]A^ÀH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰ÿI‰öA‰ÔI‰Í…Ò~11í1Ûf.„óAZžL‰ÿèb½òZÀóADÿÅHÿÃD9åuÝD‰æL‰ïè2t1ÀH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃfD€SH‰ûH…ÿtGH‹?H…ÿtèp‰H‹{H…ÿtH‹H…Àt H‰ÇèW‰H‹{èN‰H‰ß[éE‰€„[À€AWAVAUATUSHƒìHI‰üI‰õA‰ÖH‰L$…ÒŽÔfWÉòL$ 1í1ÛL|$8f„òAÜfWÒf.ÂvfL‰ÿòADÝò $èLXò $ò\L$8òL$(òALÝò\ ÜèòAÜò $èÔˆò $òYÈòXL$(òD$ òAXDÝòD$ ÿÅHÿÃD9õu€L‰ÿòD$ ò $èÝWò $òXL$8H‹D$ò1ÀHƒÄH[]A\A]A^A_ÃfWÉòL$ L|$8ë·€AWAVAUATUSHƒìhI‰ýI‰ôA‰ÖH‰L$…ÒŽUfWÀòD$òD$ òD$(òD$01í1ÛL|$XHD$PH‰D$HD$HH‰$@òATÝòA Üf(ÂòXÁò\$ òXØò\$ òXL$(òL$(òXT$0òT$0L‰ÿèûVH‹|$òžçòAXDÝèâVH‹<$òAÜèÓVòD$Xò\D$Pò\D$HòXD$òD$ÿÅHÿÃD9õ…gÿÿÿH¿ð?H‰|$8òD$0òXD$8òD$8òD$ L‰ÿèxVH‹|$òD$(èhVH‹<$òD$8èYVòD$PòXD$Hò\D$XòXD$H‹D$ò1ÀHƒÄh[]A\A]A^A_ÃfWÀòD$òD$ òD$(ò¹æò\$8L|$XHD$PH‰D$HD$HH‰$éfÿÿÿfDAWAVAUATUSHƒì(I‰ÿH‰óH‰$Hc~HÁçè†I‰ÅH…À„“‹s…ö~WE1ä1íLt$€€‹SH‹CH‹4(L‰ñL‰ÿèÚýÿÿH‹ò(è%†òXD$òBD-AÿÄ‹sHƒÅD9æÁL‰ïèYvòD$L‰ïè±…òD$H‹$ò1ÀHƒÄ([]A\A]A^A_ËsHcÆHÁàH…À„]ÿÿÿI‰ÁL§±¹—HêÎ1ö¿1À襧ÿÿ1ÿèT…¸HƒÄ([]A\A]A^A_Ãf.„H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìxH‰|$A‰ôI‰ÕH‰L$M‰ÇD‹rA9ötIL‹Î¹/HfÎ1ö¿ 1Àè!§ÿÿ¸ H‹\$HH‹l$PL‹d$XL‹l$`L‹t$hL‹|$pHƒÄxËr…öމÇD$ 1ÛH‹*HD$8H‰D$ëKI‹EH‹4H‹L$D‰âH‹|$è[üÿÿI‹mòD褄òXD$8H‹D$òA‹uÿD$ HƒÃ;t$ ~%òDfWÉf.Áw¥H‹L$I¹ðÿL‰ ëÍH‹|$è‹D‰öH‹|$è>eòD$(fWÀD‰öL‰ÿè¹cÇD$$E1äE…ö~yE‹EE…À~a1í1ÛI‹U„H‹<D‰öèôdI‹UH‹H‹L$òA òBX H‹D$òY òXD$(ò^ÈòCX <òC <ÿÅHƒÃA9m¯ÿD$$IƒÄD9t$$u‡D‰öL‰ÿèUm1Àé‚þÿÿ€€H‰\$àH‰l$èL‰d$ðL‰l$øHƒì(H‰ûI‰ô‹wA;t$t(¸H‹\$H‹l$L‹d$L‹l$ HƒÄ(Ãf.„‹GA;D$uÎI‹$H‹?èºeD‹SE…Ò~7E1í1ífDfDI‹D$H‹(‹sH‹CH‹<(è‡eAÿÅHƒÅD9kÚ1ÀëƒfDUH‰åAWAVAUATSHƒì(I‰ý‰óH‹c}H‹H‰UÈ1ÒH‰e¸HcÆH…HƒàðH)ÄI‰æH)ÄI‰äL‰÷èSb1Ò‰ÞH‰çèGbA‰ßAº…ÛŽIE1ÉE1Û1ÿ€€Aƒú„|Bƒ<'”À„Àu?Aƒú„L‰ê1É1öA¸ÿÿÿÿH‹‹8…ÀuÿÆA‰ÈÿÁHƒÂ9Ùuç…ö„ºÿÎt>AÿÁHƒÇA9ÙuŸE…Û„ÉE)ßE…ÿ޽¸D)ÐA‰ÂédÿÿÿBƒ<7”ÀéÿÿÿAÿÃAƒút6IcÀAdžBÇ'I‹DÅ1Òf.„ÇÿÂHƒÀ9ÚuðëƒIcÀAÇ„BÇ7H4…L‰ê1ÉH‹Ç0ÿÁHƒÂ9ÙuìéJÿÿÿ¸H‹e¸H‹ å{H‹UÈH3uHeØ[A\A]A^A_ÉÃ1ÀëÙèD€1Ò1öA¸ÿÿÿÿ1ÀI‹L}ƒ<uÿÆA‰ÐÿÂHƒÀ9Úuëéâþÿÿf„AWAVAUATUSHƒì(I‰þH‰t$ò$‹W;Vt½‰èHƒÄ([]A\A]A^A_ËG;FuâHcúHÁçè§€H‰D$H…À„uA‹v1Û…öé~fDA‹v‰òCHÿÃ9ÆŽ¥HcþHÁçèd€H‹T$H‰ÚH…ÀuÒA‹v‰òHcÆHÁàH…ÀtÆI‰ÁL¬¹·HaÉ1ö¿1Àè¢ÿÿ½ëD…öH‹|$èýÿÿ‰ÅA‹V…Ò~1ÛfH‹D$H‹<Øè˜CHÿÃA9FæH‹|$è‚éÿþÿÿ…Ò~»ÇD$E1ÿE1í1íE1äë&€€AÿÅA‹vHƒÅIƒÄD9îŽxÿÿÿH‰ëH‹L$IH‹T$H‹I‹ò$òB òB:èë¬ÿÿ‰H‰ëH‹L$I‹ …Éu§A‹VH‹L$H‹AJ‹4 I‹FJ‹<8ò$è¤w‰ë€A‹vHcÆHÁàI‰ÁL󪹵H…À„lþÿÿéÇþÿÿ;t$ŽæþÿÿÿD$IƒÇé)ÿÿÿAWAVAUATUSHƒìHH‰|$H‰T$H‹H‰D$D‹`1ÛAƒü~DL‹(òè ~òAE½»H‹T$òÚèë}òADÝÿÅHÿÃD9åuàD‰ãH‹D$D‰æH‹8èhH‹T$‹R‰T$(…Ò~yH‹D$D‹hA‰ÞÇD$,E1ÿE…í~HIcÆH‹T$L$ÂH‹T$H‹BJ‹,81Û€€òA$èg}òEÿÃIƒÄHƒÅD9ëuáÿD$,IƒÇEî‹T$(9T$,užH‹D$‹p…öŽŒfWÀòD$ 1í1ÛLd$8H‹T$H‹BH‹<L‰âH‹t$èÿöÿÿòD$ òXD$8òD$ ÿÅHƒÃH‹D$9hÄf.Àt+H=âÆ1À詞ÿÿòD$ fW»ÞHƒÄH[]A\A]A^A_Ã{çëÑ„òÈåHƒÄH[]A\A]A^A_Ãf„AWAVAUATUSHƒìxI‰üA‰õH‰T$ ‹J1Ûƒù„‹B1ÒƒøOЯÁ‰T$DHcêHíH‰ßèÖ|H‰D$(H…À„5H‰ßèÀ|H‰D$0H…À„áH‰ëHÁãH‰ßè£|H‰D$8H…À„7H‹D$ H‰D$PL‰d$XD‰l$`D‹hÇD$LAƒý~JH‹D$ L‹ òA$èP|H‹T$(ò½»òAè2|H‹T$(òÿÅHƒÃD9íuà‰l$LE…í~zE1ÀE1ÿH‹D$ D‹`E…ä~T1íH‹T$ L‹jE‰æE¯ðfD‰ëK‹D=òèD‰D$èÒ{‹T$LAH˜H‹T$(òÂHÿÅÿÃA9ÜD‹D$ÄAÿÀIƒÇH‹D$ D9@•D‹L$DE…É~ H‹D$01ÒI¸š™™™™™¹?L‰ÿÂHƒÀ;T$DuçHD$hH‰D$H‹D$8H‰$òÜLL$PLAH jüÿÿ‹T$DH‹t$0H‹|$(èljÅÀtLƒøtGHƒ|$(t H‹|$(èÐzHƒ|$0t H‹|$0è¾zHƒ|$8t H‹|$8è¬z‰ØHƒÄx[]A\A]A^A_ÃH‹T$ ‹R‰T$HA‰ÕÿÊŽ©H‹D$(òè"zH‹T$ L‹"òA$½»H‹D$(òèûyòAÿÅHƒÃ;l$HußD‰îH‹T$ H‹:è'dH‹D$ ‹x…ÿ~yE1ÀE1ÿD‹`E…ä~X1íH‹T$ L‹jE‰æE¯ðf.„‰ë‹T$HAH˜H‹T$(òÂD‰D$èyK‹D=òèHÿÅÿÃA9ÜD‹D$ÄAÿÀIƒÇH‹D$ D9@‘H‹|$(èžyH‹|$0è”yH‹|$8èŠy1Ûé×þÿÿH…Û„ýÿÿI‰ÙL¢¥¹òHåÂ1ö¿袛ÿÿHÇD$8»écþÿÿH…Û„ÂüÿÿI‰ÙLd¥¹ñH§Â1ö¿èd›ÿÿ»édþÿÿH…Û„ÀüÿÿI‰ÙL/¥¹óHrÂ1ö¿è/›ÿÿ»éùýÿÿÇD$Hé‘þÿÿ„AWAVAUATUSHìÈH‰|$H‰t$DI‰ÖH‰L$8L‹"E‹l$1ÛÇ„$„Aƒý~FM‹<$òè(xòA½»H‹D$HòØè xòAßÿÅHÿÃD9íuáD‰¬$„D‰ëD‰îI‹<$è1bA‹T$‰T$t…ÒއE‹|$‰œ$€Ç„$ŒHÇD$xE…ÿ~@Hc„$€H‹T$HL,ÂI‹D$H‹L$xH‹,1ÛòAEèwòEÿÃIƒÅHƒÅD9ûuáÿ„$ŒHƒD$xD¼$€‹L$t9Œ$Œu™Ic~HÁçèàwH‰D$PfWÀ‹t$DH‹|$8èEWA‹F…À~(1í1ÛH‹T$PHÚI‹FH‹<L‰æèñÿÿÿÅHƒÃA9nÜA‹D$…ÀŽ1ÇD$pE1íH„$°H‰D$(H”$¨H‰T$ HŒ$¸H‰L$H„$ H‰D$H”$˜H‰T$A‹t$I‹D$J‹<(èXòD$`H‹|$(èùDE‹~E…ÿŽžÇ„$ˆE1ÿA‹t$I‹FJ‹<8èÜWH‹|$ òXD$`è¼DA‹T$I‹D$J‹4(I‹FJ‹<8H‹L$è\îÿÿI‹$òB(òD$Xò„$¸H‹D$PòA\òD$0òD$XèvòXD$0èÞuòD$h‹¬$„…í~ò\D$XH‹T$8òAXDòADA‹\$…ÛŽ»1í1ÛI‹L$J‹)„I‹FJ‹8òH‹|$òXèôCI‹D$J‹(H‹|$òèÜCA‹t$‹D$p¯Æ„$„èH˜H‹L$8HÁI‹L$J‹)òL$hòY ò„$°ò\„$¨òX„$ ò\„$˜òYÈòXòÿÅHƒÃ9îZÿÿÿÿ„$ˆIƒÇ‹„$ˆA9FpþÿÿÿD$pIƒÅ‹T$pA9T$þÿÿD‹œ$„E…Û~FH‹\$81íëfW™ÖòÿÅHƒÃ;¬$„t"òf.ÀztÙ‰îH=¾1ÀèJ–ÿÿòëÃE‹T$E…Ò~v1íA‹t$1Û…ö"ë^‰è¯Æ„$„ØH˜H‹L$8€tÁ€ÿÃ9Þ~>‰ð¯Å‹Œ$„ ÐH˜H‹T$8òÂf.Àzt»‰Ú‰îH=.¾1ÀèÔ•ÿÿA‹t$ë¢ÿÅA9l$‘H‹|$Pè0tHÄÈ[]A\A]A^A_ÄAWAVAUATUSHƒìA‰ýA‰ö¿èFtI‰ÇH…À„‡H‰D$HÇHÇ@IcÅH,ÅH‰ïètH‹T$H‰H…À„–H‰ïèúsH‰ÃI‰GH…À„îHÇMcæL¯åL‰çèÔsH‰H…À„ûAƒý~:I‹OH‰ÏD‰ò¾€„HcÂHÁàHH‰AÿÆDòHƒÁD9îuäE‰oE‰wH‹D$HƒÄ[]A\A]A^A_ÃH…í„aÿÿÿI‰éL=Ÿ¹<H€¼1ö¿è=•ÿÿI‹?H…ÿtèærI‹_H…ÛtH‹;H…ÿt èÐrI‹_H‰ßèÄrL‰ÿè¼rHÇD$é|ÿÿÿI‰éLÖž¹=H…í„úþÿÿH¼1ö¿1ÀèË”ÿÿëŒM…ä„üþÿÿM‰áLžž¹@ëÏA¹LŠž¹8HÍ»1ö¿1À舔ÿÿHÇD$éþþÿÿf.„H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìxH‰ýI‰÷HÇLl$èJX1ÉL‰ò‹t$$H‹|$(ègñÿÿ‰D$D…À„ÿD$\‹T$\9T$H…ÿtèímI‹~H…ÿtH‹H…Àt H‰ÇèÔmI‹~èËmL‰÷èÃm‹D$DHƒÄx[]A\A]A^A_ÃHÇD$PD‹d$$E…ä~5H‹\$(1íH‹T$L‰öH‹;è0çÿÿòD$PòXD$hòD$PÿÅHƒÃ;l$$uÒ‹l$…íuCòD$Pf.D$H†/ÿÿÿD‹T$E…Ò…sA‹vH‹D$;p„òD$PòD$Héþþÿÿ‹T$@H5‰·H‹ýgH‹81ÀèélH‹ìgL‹"A‹NA‹VH5¶L‰ç1ÀèÆlA‹^…ÛŽ|E1íE1ÿI‹òB8D‰êH5ñµL‰ç¸è”lE‹^E…Û~@1Û1íf„I‹FJ‹8òD‰ÙD‰êH5¾µL‰ç¸èWlÿÃHƒÅA9^ÍAÿÅIƒÇE9nŠòL$HòD$PH5ضH‹.gH‹8¸èléÊþÿÿA‹FH‹T$;B…êþÿÿH‹I‹>èçNE‹NE…ÉŽÒþÿÿ1í1ÛH‹T$H‹BH‹A‹vI‹FH‹<è¸NÿÅHƒÃA9nÖéŸþÿÿH‹¸fH‹º¾H=e¶è¿kéhþÿÿH‹£fH‹º!¾H=_¶èškH‹ƒfL‹"H‹D$‹H‹PH5†´L‰ç1ÀèJkH‹T$‹z…ÿމE1ÿE1íH‹T$H‹òB(D‰úH5l´L‰ç¸èkH‹D$‹p…ö~@1Û1íH‹T$H‹BJ‹(òD‰ÙD‰úH5:´L‰ç¸èÓjÿÃHƒÅH‹D$9XÄAÿÇIƒÅH‹T$D9z‚òD$HH5°µH‹·eH‹8¸èjé¤üÿÿò¥ËòD$Héƒüÿÿf.ÈwfW"Ìò\ÁòYÐf(ÂÃDfWÒf(ÂÀf(ÈfWÒ…ö~*fWÒ1À€€òò\ÁòXÐÿÀHƒÇ9ðuêò*Æò^ÐòJÊò^Âò1ÀÀ„Hƒì…öu)Lé´¹,H µ¿ 1ÀèŒÿÿ¸ HƒÄÃòƒþ~lH‰øA¸fD€ò@ò]Áf(ÈAÿÀHƒÀA9ðuçfWÒ1Àòò\ÁòXÐÿÀHƒÇ9ðuêò ò*Æò^Ðò–Éò^Âò1Àë†fWÒ…ö~Øë¹SHƒì H‰Ó‹‡´…À…½‹‡°…À…íò_0òwfWÀ‹W`D‹_,f(àf(èD9ÚãHcÂLÅLJëHòH*ÊòA*ÁòYÆòXÂò\ÃòYÁòXàò*ÁòYÆòXÐò\ÓòYÊòXéIƒÀÿÁE9ÓŒˆDIÿI‹A‰ÊHƒútáòW}¤H‰ÐHÑèƒâH ÐòH*ÈòXÉë’ƒø„©ƒø…³L¤³¹—H³1ö¿ 1À芊ÿÿ¸ HƒÄ [Ãòwò*_(òYÞòX_fWÀéÿÿÿòòGÈò^ÆòD$f(Åò$$è7hòD$ò$$f(Äè#hòL$ò\ÈòD$òYÁò1ÀHƒÄ [Ãò_XòwfWÀéšþÿÿòwfWÛf(ÃéˆþÿÿfDHƒì(òL$ò nÉò^Êò²Çò\Ðf(Âò $è¨gò $òYÈòD$òXÁHƒÄ(ÄHƒì(f(ØòL$òT$f.Èwvf(Âò šÈf.Ñu4z2f(ÃòÂD$f(ÐfTÑò ÈfUÁfVÂHƒÄ(Ãf.„ò$ègò$ò\\$òY\$ò\ÃHƒÄ(ÃfDfDò¸ÇHƒÄ(ÃHƒì(òD$òL$è{”ò sÈò^L$ò $è»fò $òYÈòD$òXÁHƒÄ(ÃDfDUSHƒì8H‰ýòD$ òL$H‰óf(Âò\$òd$f.Ú‚ŽòT$(ë$fDòD$(òXD$òD$(òL$f.ÈrbòT$òL$ ÿÓf(ÈòD$(H5C±H‰ï¸è´e…Ày²L2±¹íHæ°¾¿1Àèî‡ÿÿº‰ÐHƒÄ8[]ÃH5k»H‰ï1Àème1Ò…ÀyàLé°¹îëµDfDf.Èv ò’ÅÃfWøÆò\ÁòYÂéídDfDHƒìf.ÈwXò\ÁòYÂf.¶ÆtDf. ÇrJfW²Æè¯df(ÈòñÆf.Áv6f(ÁfWÆHƒÄÃf.„zºòÖÅHƒÄÃz´HƒÄéýdòíÄò\ÁHƒÄéèdHƒìf.ÈwVò\Áf(ÈòYÊf. ‚Æzsf(ÁHƒÄÃDf(ÁfWÆèdò —Äò\Èf(ÁHƒÄÃf.„fWÉf(ÁHƒÄÃHƒìf(ØòT$fWÀf.Ëwf(ÂfW¼Åò\ÙòYÃè±còYD$HƒÄÃ@òOòf.ÐvòÄÄfW xÅò\ÂòYÁémcDfDHƒìf(ÈòGòD$òf.ÑvfWÀHƒÄÃf.„fW(Åò\ÊòYÁècòYD$HƒÄÃHƒìf(ÈòWòf.ÁwYò\ÈòYÊf. 9Åzsf(ÁHƒÄÃfDfDf(ÁfWÄÄèÁbò GÃò\Èf(ÁHƒÄÃf.„fWÉf(ÁHƒÄÃSHƒìH‰ûò ÀÄò^OòÃò\Ðf(Âò $èùbò $òYÈf(ÁòXHƒÄ[Ã@ˆw 1ÀÃf„SH‰ûH‹H…ÿtètbH‰ß[ékbDUSHƒìH‰ûH‰õHƒuHǸHƒÄ[]ÃHƒ(tPH‹G¶W4ˆPÿH‹G(H‰GHÇG(ÇG0ÆG4ë(DfDHc×H‹Þ\‹D;]~*M…ä„­LcëL‰îL‰çèî]H…À„¦I‰ÄH‰E‰]IcÞIc×I<L‰æè]H‹}H‰ÚH‹t$èj]H‹EH‰EHL$HT$H}LD$H5€¨è£}ÿÿ‰Â…Àu-H‹L$¶:E t H‰M(‹D$‰E0¶D$ˆE4éÿÿÿ„H‰ïè¨ýÿÿ‰ÂéÿÿÿLcëL‰ïèê\éQÿÿÿM‰éL‘¹fH¨1ö¿1Àè½~ÿÿºé±þÿÿH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìHH‰ûH‰õI‰ÔHÇ$ÇD$ H…ötHÇM…ätAÇ$H‹C(H…ÀtSH…ítH‰EM…ät‹C0A‰$HÇC(ÇC0ÆC41ÀH‹\$H‹l$ L‹d$(L‹l$0L‹t$8L‹|$@HƒÄHÃfDHƒ{„¡L|$ Lkë"f.„H‹$¶:C u]H‰ßèÜúÿÿ…ÀuŸE1ÀL‰ùH‰âH5§L‰ïè |ÿÿ‰ÂƒøtÕ…ÀtÅHCDI¹esl_strtL‰KDI¸ok() faiL‰@Ç@led‰ÐéNÿÿÿH…ítH‰U1ÀM…ä„:ÿÿÿ‹D$ A‰$1Àé+ÿÿÿH‰ßè\úÿÿ…À„Oÿÿÿéÿÿÿ€„SH‰ûH…ÿtGH‹?H…ÿtH‹ÈUH;8tè|ZH‹{8H…ÿtè¶ZH‹{H…ÿtè¨ZH‰ß[éŸZf„[À€USHƒìH‰ý¿ØèÁZH‰ÃH…ÀtwH‰(HÇ@Ç@HÇ@Æ@ HÇ@(Ç@0Æ@4HÇ@8Ç@@Æ@DÇ€ÄHÇ€ÈÇ€ÐÇ€ÔH‰ØHƒÄ[]ÃA¹ØL†¹jHr¥1ö¿1Àè|ÿÿH‹<%H…ÿtè»Y1ÿè´Yë´fDfDH‰\$èH‰l$ðL‰d$øHƒìH‰ýA‰ô¿ØèÑYH‰ÃH…À„€HÇHÇ@Ç@HÇ@Æ@ HÇ@(Ç@0Æ@4HÇ@8Ç@@Æ@DÇ€ÔÇ€ÄH‰¨ÈD‰ ÐH‰ØH‹$H‹l$L‹d$HƒÄÃA¹ØL…¹jHu¤1ö¿1Àè{ÿÿH‹<%H…ÿtè¾X1ÿè·X먀„H‰\$àH‰l$èL‰d$ðL‰l$øHƒì(H‰ýI‰ôI‰Õ¿ØèÉXH‰ÃH…À„7HÇHÇ@Ç@HÇ@Æ@ HÇ@(Ç@0Æ@4HÇ@8Ç@@Æ@DÇ€ÄHÇ€ÈÇ€ÐÇ€ÔH5ŽH‰ïèÍX…Àu5H‹ÞRH‹H‰I‰]1í‰èH‹\$H‹l$L‹d$L‹l$ HƒÄ(ÀH5LYH‰ïè‰WH‰H…À„ªHS8HÇÆÿÿÿÿH‰ïèrÿÿ‰Å…Àt¤H‹;H…ÿtH‹mRH;8tè!WH‹{8H…ÿtè[WH‹{H…ÿtèMWH‰ßèEWIÇEé`ÿÿÿA¹ØL]ƒ¹jH¶¢1ö¿1Àè[yÿÿH‹<%H…ÿtèÿV1ÿèøV½ë¬HK8H‰ÚL‰æH‰ïèÉÿÿ½…À…Pÿÿÿéïþÿÿ‹G +GÃf„…ö 1ÀÃf„‰òWBÿ;G }çHcÒH‹GH‹DÐøÃfDAWAVAUATUSHƒì8I‰þI‰õ‰T$‰L$D‰D$ ‹F‰D$,…ÀŽYH‹ÇD$E1äÇD$$ÇD$(E1ÿ‹D$…ÀuéÂfAÿÄHƒÃPD;d$,„™‹L$9KHuåH‹;èóVP‹K…ÉEÂ9D$MD$‰D$H‹{@H…ÿ„ÆèÉVh9l$$‹D$$LʼnD$$H‹{H…ÿt è©Vl9l$(‹T$(LÕ‰T$(H‹{ H…ÿt èˆVlA9ïDLýAÿÄHƒÃPD;d$,…gÿÿÿ‹T$T$B:ÇD$ÇD$ ;D$ ~‹L$( ÇD$ 9D$ ŒÚD‹L$,E…ÉŽ$E1ÿE1äë$@I‹E‹T$B9T HtAÿÇIƒÄPE9}ŽøD‹D$E…ÀuÖH KV‹T$H5Þ L‰÷1ÀèÈT…ÀˆûI‹EJ‹ H5Æ L‰÷1Àè§T…ÀˆëL‰ãI]H‹;è˜U‰Åƒ{‡ù‹CH HcHÈÿàãðÀ`0¸@H‹;èNUPD‹SE…ÒEÂ9D$MD$‰D$H‹{@½H…ÿtè!Uh9l$$‹T$$LÕ‰T$$H‹{H…ÿt èUl9l$(‹L$(L͉L$(H‹{ H…ÿt èàTlA9ïDLýAÿÄHƒÃPD;d$,…mÿÿÿéSþÿÿH5ÛŸL‰÷1Àè¥S…Àˆ>€„ƒÅ‹T$)êH ìTH5ƒŸL‰÷1ÀèmS…ÀˆÂH5ŸL‰÷1ÀèTS…ÀˆºI‹EJ‹T @H…ÒtH5kŸL‰÷1Àè-S…Àˆ¤‹|$…ÿt/L‰àIEH‹PH…Òtƒx…•€:…ŒfDfD‹t$ …öt'I‹EJ‹T H…ÒtH5ŸL‰÷1ÀèÇR…ÀˆOH5¢fL‰÷1Àè®R…À‰§ýÿÿL¡—¹iHž¾¿1Àèätÿÿ¸HƒÄ8[]A\A]A^A_ÃH5ŸžL‰÷1Àè]R…À‰gÿÿÿLP—¹dë­f„H5cžL‰÷1Àè-R…À‰—þÿÿL —¹XézÿÿÿfDH5.žL‰÷1ÀèýQ…À‰gþÿÿLð–¹WéJÿÿÿfDH5ùL‰÷1ÀèÍQ…À‰7þÿÿLÀ–¹VéÿÿÿfDH5ÄL‰÷1ÀèQ…À‰þÿÿL–¹UéêþÿÿfDH5L‰÷1ÀèmQ…À‰×ýÿÿL`–¹TéºþÿÿfD‹L$$ ÇD$9D$  üÿÿL¹GH1ö¿ 1Àèvsÿÿ¸ HƒÄ8[]A\A]A^A_ýé8ûÿÿ1ÀHƒÄ8[]A\A]A^A_ÃÇD$ÇD$$ÇD$(E1ÿébûÿÿLÀ•¹MéþÿÿL¯•¹Oé þÿÿLž•¹\éøýÿÿL•¹]éçýÿÿL|•¹`éÖýÿÿLk•¹géÅýÿÿLZ•¹Yé´ýÿÿAWAVAUATUSHƒì8H‰ýH‰t$H‹GH‹8è4QDhƒÀHcØH‰ßè€PH‰D$H…À„¥H‹EH‹H5GœH‹|$1ÀèÊPD‹uE…öŽaÇD$HÇD$ HÇD$(E1ÿé“DH‹8è¾PDpHƒ|$„ÈCD.HcØH‰ÞH‹|$èQPI‰ÄM…ä„ÃL‰úHUD‹ZE…Û…ÃIcýI<HvPD:@t0ÿÁD9ÉuèA¾ H}PHY—¾€1ÀèýJ¸éÿÿÿ1É1ÒA‰H‰ÑHM‹A…ÀtLH‹E8HÿÀ€8un‹u;u }lHcÖH‹EH‹ÐI‰UF‰E‹Aƒèƒøw €:-„HÇE81Àé±þÿÿIÇEH‹E8HÿÀ€8t H‰E81Àé’þÿÿHÇE81ÀéƒþÿÿI‰Eë½H}PH‹ Hø–¾€1ÀèDJ¸éYþÿÿ…AÿÿÿL‹U8éÿÿÿDfDH}PI‰ÐH‹ Hw–¾€1ÀèJ¸éþÿÿ¾=L‰çè JH‰D$H…À„ý‹D$D)àHÿD$…À„é‹U‰T$…ÒŽHH˜H‰D$ H‹EH‰D$(ÇD$ÇD$<HÇD$0ëÿD$¸HĨ[]A\A]A^A_ÃM‰áL깄H‘‰1ö¿ 1Àèè_ÿÿ¸ ëÃÿD$4Hƒ„$˜HƒD$`HƒD$hPD9|$4…€þÿÿE1öHÇD$HHÇD$PH‹D$X‹‰„$Œ…À„FH‹T$H‹R H‰”$€H‹D$HHƒ<„%H‹T$H‹H‰T$xH‹D$PHÐH‰„$L‹`8L‰d$pM…ä„öA€<$„ëH5L‰çèÈ=LcèH‹\$x1íëfDfDÿÅHƒÃPD9ý„¡L‰êL‰æH‹;èŸ=…ÀußKD%E1ä€8,uL`A9îtŽHcÅH‹T$@D‹ ‚E…É„yÿÿÿH‹”$€Hƒ<„fÿÿÿƒ¼$ŒŽïH‹|$HƒÇPL‹L$pD‹„$ŒAƒèH‹„$H‹HŒ¾€1ÀèÛ<¸éCþÿÿM‰áL>Œ¹ éOþÿÿAÿÆHƒD$XHƒD$HHƒD$PPE9þ…†þÿÿ1Àé þÿÿ€t3H‹|$HƒÇPL‹D$8H‹T$(H‹ H¡‹¾€1Àèe<¸éÍýÿÿH‹|$HƒÇPL‹L$8H‹D$(L‹@H‹H‹¾€1Àè.<¸é–ýÿÿt6H‹|$HƒÇPL‹D$pH‹„$H‹H:Œ¾€1Àèö;¸é^ýÿÿH‹|$HƒÇPL‹L$pH‹”$L‹BH‹ H¸‹¾€1Àè¼;¸é$ýÿÿfAWAVAUATUSHƒìH‰|$I‰öD‹oE…íŽçH‹/E1ÿ1ÛëAÿÇHƒÃPE9ï„ÊH‹4+L‰÷èˆ;…ÀuàE1ä1Ûëf„AÿÄHƒÃPE9ìÇH‹4+L‰÷èX;…ÀuàIcÔH‹L$H‹A(D‹E…ÒtdH‹A H‹4ÐH…öt?H’HÁàH‹)H‹|èyWÿÿ…Àt>IcÇH‹L$H‹Q Hƒ<•À¶ÀHƒÄ[]A\A]A^A_ÃH’HÁàH‹T$H‹*Hƒ|u´1ÀHƒÄ[]A\A]A^A_ÃL‰öH=iˆ1Àèe[ÿÿH‹L$D‹iE…í~ H‹)A‰ßéÿÿÿA‰ßL‰öH=<ˆ1Àè8[ÿÿA‰Üé0ÿÿÿH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìhI‰üI‰Õ…Ét$ƒù„‹ƒù„‚~ L5BŒë€H…Ò„÷L5|ŠHcÆH,€HÁåH‰ëI$ƒ{†L6‹¹\Hü„1ö¿ 1ÀèS[ÿÿ¸ é¹H9Äp€x<…²L@ÇD$ €x=u L@ÇD$ HPÿ¶@ÿE1É<=u¶BÿA±<<…vH‰ßL‰D$D‰L$è&8D‹L$E…ÉL‹D$„CA9ÇŒHM…Àt'L‰Çèý7‹\$ …Û…A9Ç&f.„1À€€H‹\$8H‹l$@L‹d$HL‹l$PL‹t$XL‹|$`HƒÄhÃfD€‹CH Hc‚HÐÿà¬ÿÿÿÛža(((L5‰é”þÿÿHƒ{ „yÿÿÿL‹ LŸ‰¹XHžƒ1ö¿ 1ÀèõYÿÿ¸ é[ÿÿÿL‰ïè‰8Hƒø†ŒI|$PM‰ñM‰èH‹ H$‰¾€1Àè(8¸éÿÿÿL‰ïè†iÿÿ…Àu~I‹$H‹LI|$PM‰ñM‰èH¯ˆ¾€1Àèë7¸éáþÿÿL‰ïèifÿÿ…À…ªI‹$H‹LI|$PM‰ñM‰èH>ˆ¾€1Àèª7¸é þÿÿL5ˆé”ýÿÿI‹$H‹\ H…Û„rþÿÿL‰ïèB6òD$(¾xH‰ßè…7H…À…øH‰èI$L‹@ I|$PL‰4$M‰éH‹H툾€1Àè17¸é'þÿÿI‹$H‹\ H…Û„þÿÿL‰ïèÛ5A‰Ç¾nH‰ßè7H…À…;ýÿÿH‰èI$L‹@ I|$PL‰4$M‰éH‹HCˆ¾€1ÀèÇ6¸é½ýÿÿH‹k H…í„ ýÿÿE¶}¾cH‰ïè¼6H…À…åI|$PL‰4$M‰éI‰èH‹ Hlˆ¾€1Àèp6¸éfýÿÿH9Ä]€x<…õþÿÿLxÇD$$€x=u LxÇD$$HPÿ¶@ÿE1À<=u¶BÿA°<<…¹þÿÿH‰ßD‰D$èÒ4D‹D$E…À„òL$(f.È‚ŽþÿÿM…ÿ„ÓüÿÿL‰ÿè£4D‹\$$E…Û„f.D$(‚cþÿÿé¬üÿÿfDfDH9Å„D€x<…ÿÿÿHP1ÿ€x=„ HHÿ¶@ÿ1ö<=„ì<<…ÞþÿÿH‰è…ö„ËD:8ŒÊþÿÿH…Ò„Füÿÿ…ÿ„”D::°þÿÿé0üÿÿ¶C<>tx<<…<þÿÿLCÇD$ €{=…ÞûÿÿLCÇD$ éÍûÿÿf„¶C<>th<<…’ýÿÿL{ÇD$$€{=…îþÿÿL{ÇD$$éÝþÿÿf„H{€{=„H‰ûE1ÉE1ÀÇD$ H…Û….ûÿÿéƒûÿÿH{E1À€{=„H…ÿ„fûÿÿH‰ûE1ÿÇD$$éLþÿÿ¶E<>t|<<…¾ýÿÿHU1ÿ€}=…äþÿÿHU@·éØþÿÿ€f.D$(†Æüÿÿéûÿÿ€„A9ÇýÿÿéòúÿÿA9ÇŽýÿÿé¸úÿÿòL$(f.Ȇ†üÿÿéóýÿÿHE1ö€}=uHE@¶1Ò1ÿH…À…OþÿÿéªúÿÿD::ýÿÿéœúÿÿHƒÃA¹éñþÿÿD:8Žÿüÿÿé0þÿÿ¶Aÿ@¶éþÿÿHP@·éêýÿÿH{A°éìþÿÿDfDAWAVAUATUSHƒì(H‰|$‰t$ I‰Ô‰L$E‰Å…É…«L¬ƒHc\$ H,H‹T$H‹B(‹L$9 („¬H‰×L‰â‹t$ èžøÿÿº…À…TH‹T$H‹B(‹L$‰ ˜HtHÁæH‰4$H‰ðHD‹pE…ö…”H‹PH…Ò„yH‹L$H‹A H‰ØH‰ÊH‹H‹ $L‹l(M…í„ðA€}„åH5îL‰ïè¥2H‹T$D‹zAƒÿŽKHcèL‹2E1ä1ÛëDAÿÄHƒÃPE9ü„ƒJ‹<3H‰êL‰îèm2…ÀuÝJD-E1í€8,„üD9d$ „yÿÿÿIcÜH‹t$H‹N Hƒ<Ù„bÿÿÿHH‰ÂHV(‹t$92„á‰2H‹T$H‹B0‹,˜…í~H‹<Ùè 1H‹L$H‹A0ǘH‹I HÇÙM…í…ÿÿÿ1Ò‰ÐHƒÄ([]A\A]A^A_Ã|$„¤ƒ|$„lƒ|$H“ƒLMÀé1þÿÿH‰ÖH‹HDHÁàH‹ H‰÷HƒÇPHxƒ¾€1Àè41ºëE…íuWH‹T$H‹B0D‹,˜E…펃H,ÝH‹B H‹<(èC0H‹t$H‹F0ǘH‰òH‹B L‰$(é9þÿÿL@é¡ýÿÿM…ät¤L‰çèú0‰D$H‹L$H‹A0‹˜D‹|$AÿÇD9øz…À„L,ÝH‹T$H‹B J‹<(H…ÿ„rIcßH‰Þè`0H…À…NI‰ÙL—d¹ÃH~{1ö¿1ÀèÕQÿÿºéžþÿÿH‹t$H‹F HÇØH‰òé~ýÿÿfLhéûýÿÿtXHcèE1äéÝýÿÿLx€éÎüÿÿH‹L$H‹HØHÁàH‹ H‹|$HƒÇPH‹4$L‹H3‚¾€1ÀèÇ/ºé þÿÿM‰éL+¹ÏHÒz1ö¿ 1Àè)Qÿÿº éòýÿÿH,ÝH‹T$é“þÿÿL,ÝL‰ëH‹D$HX Mc÷L‰÷èò.H‰H…Àt[H‹D$H‹H H‹t$H‹F0D‰|J‹<)L‰æè]/H‹T$é…üÿÿL,ÝH‹I ëÜH‹t$H‹N I‰D ë¾IcßH‰ßè”.é‰þÿÿƒ|$ÿt,M‰ñLbZ¹ÂH z1ö¿èbPÿÿºé+ýÿÿH‹T$H‹J émÿÿÿf.„ATUSHƒìH‰û‰w H‰WÇGHÇG8Hl$ f.„H‰âH‰îH‰ßè"âÿÿ…Àu)H‹$‹t$ E1À¹H‰ßèöúÿÿ‰Â…ÀtЉÐHƒÄ[]A\Ã1ÒƒøEЉÐHƒÄ[]A\ÃfATUSH‰û‹G…À~M1íE1äfD€H‹J‹| H…ÿt#èh-H…ÀtE1À¹H‰Â‰îH‰ßè„úÿÿ…Àu ÿÅIƒÄP9kÅ1À[]A\À€AWAVAUATUSHìˆI‰ÿH‰t$@H‰T$8HÇD$pÇD$|ÇD$LHD$|H‰D$0HD$pH‰D$(HD$`H‰D$ HD$hH‰D$HD$PH‰D$HD$XH‰D$H‹T$8H‹t$0H‹|$(èIWÿÿƒø„`…À…÷ÿD$LHÇD$`HÇD$XH‹D$pH‰D$hH‹T$ H5“H‹|$èB`ÿÿH‹T$`H…Òt›¶<#t”<-… H‹D$h€8"„àH‹T$H5VH‹|$è`ÿÿH‹T$H5@H‹|$èï_ÿÿH‹D$PH…Àt €8#…L‹t$`E‹oE…í~_M‹'1í1ÛëDÿÅHƒÃPD9ítFJ‹4#L‰÷è},…ÀuåA‹OƒÁH‹T$XA¸‰îL‰ÿèÙøÿÿ…À„äþÿÿHĈ[]A\A]A^A_ÃL‰ÿHƒÇP„½D‹L$LL‹D$@L‰ñH.¾€1Àèò+¸ëºH‹T$H5Å~H‹|$è%_ÿÿéÿÿÿH‹|$pH…ÿtè+AÿG1ÀëˆL‰ÿHƒÇPt[I‰ÑL‹D$@‹L$LH=~¾€1Àè‘+¸éVÿÿÿL‰ÿHƒÇPt)I‰ÁL‹D$@‹L$LHS~¾€1Àè_+¸é$ÿÿÿ¸éÿÿÿDfDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìXH‰ûH‰ðHÇD$Hƒ@txH{PHm~¾€1Àèñ*½ H‹{@H…ÿt è$*HÇC@H‹{HH…ÿt è*HÇCH‰èH‹\$(H‹l$0L‹d$8L‹l$@L‹t$HL‹|$PHƒÄXÃDfDHƒHuHW@HÇÆÿÿÿÿH‰Çè¦_ÿÿ‰Å…Àu„H‹C@H‰D$½A½L|$Lt$ë)H‰îè6*H‰ÂIÿÅH…Ò„›H‰SHH‹D$H‰D*øHƒÅEeÿL‰úH5°|L‰÷èa]ÿÿ…ÀuH‹{HH…ÿu´H‰ïè)H‰Âë²H‹CHD‰c H‰CÇCHÇC8Hl$H‰âH‰îH‰ßèyÝÿÿ‰Â…ÀuSH‹$‹t$E1À¹H‰ßèKöÿÿ‰Â…ÀtΉÕéÞþÿÿI‰éLÌ]¹MH³t1ö¿1Àè Kÿÿ½é„þÿÿƒø¸DЉÕéžþÿÿ€€ATUSH‰ý¿ÐèÓ(H‰ÃA¹ÐL§T¹DH…À„7H‰ïH‰+Ç@ HÇ@Ç@Ç@HÇ@ HÇ@(HÇ@0HÇ@8HÇ@@HÇ@HÆ@PÇ@H‹E1ÒH…Àt?E1É€8-…6¸ºPëHÿÀHƒÂP€9-…A‰Á‰CH‹ H…ÉuáHÅH‰×è(H‰ÆH‰C H…À„‹SHcúHÁçèæ'H‰C(H…À„9‹SHcúHÁçèÊ'I‰ÂH‰C0H…À„VD‹CE…ÀŽ›H‹s L‹K(H‹1ÿ1Éf.„H‹BH‰ÎAljAÇŠÿÇHÿÁHƒÂPD9ÇuÚ1íE1äëÿÅIƒÄ9k~GH‹s J‹&1ɉîH‰ßèQíÿÿ…ÀtÝLKPL:.¹}HÁr1ö¿ 1ÀèIÿÿH‰ßè Ùÿÿ1ÛH‰Ø[]A\ÃL{¹cHŽr1ö¿ 1ÀèåHÿÿH‰ßèmÙÿÿ1ÛH‰Ø[]A\ËSHcÂHÁàH…À„ÒþÿÿI‰ÁLžR¹mHEr¿1ÀèžHÿÿë·‹SHcÂHÁàI‰ÁLpR¹nH…À„¨þÿÿHr1ö¿1ÀèeHÿÿé{ÿÿÿD‹CIcÀHÁàH…À„šþÿÿI‰ÁL*R¹oëÁDfDAWAVAUATUSHƒì(‰t$‰ÓI‰ÍL‰$M‰Îè-ýÿÿH‰Å‰X L‰hÇ@HÇ@8Ld$H\$f.„L‰âH‰ÞH‰ïèòÙÿÿ…ÀufH‹T$‹t$E1À¹H‰ïèÅòÿÿ…ÀtÑHuPH=¶*1Àèß%M…ötL‰òI‹uH‹D H‹8è”bÿÿI‹uH=±*1Àè²%¿èÄ$ƒøu²H‰ïèËåÿÿ…Àu¦‹E‰D$ …À~jL‹}E1ä1ÛëAÿÄHƒÃPD;d$ tQJ‹4;H=“*è·%…ÀuÞIcÜH›HÁàB‹D8…ÀuGH‹E Hƒ<Øud‹E +E;D$uGH‰èHƒÄ([]A\A]A^A_ÃH5F*H=s1Àè FÿÿL‹}A‰Üë¥H5(*H=…s1ÀèïEÿÿë¢H=*èó$éÿÿÿHƒ<$tVH‹FH‹$I‹uH‹;èNbÿÿM…ötL‰òI‹uH‹;èzaÿÿH=Ñ)è°$A¸P¹1ÒH‰îH‹;èvÍÿÿ1ÿè›#H‹ðë¸HƒìòL$ò$è$fWt…è$ò^$òL$ò\Èf(ÁHƒÄÀAUATSHì°I‰ÔI‰ÍH‰|$P‰t$XòD$`HŒ$ H”$¨èðò 2…òYŒ$ òQÉò%…ò^Áò !…ò^ÈòXŒ$¨òŒ$€èn#ò„$ˆHº@H‰T$pH¸š™™™™™¹?H‰D$xHt$pH¼$€H„$˜H‰D$HD$H‰$ò¼„LL$PL(H ±ºè—)‰ÃH‹„$€I‰$ò„$ˆèM"òAE‰ØHİ[A\A]ÃfDAVAUATUSHƒì0A‰ôA‰ÕòD$òL$I‰Î…öŽ«f(ÁfWûƒòD$(H‰ûfWÀòD$ 1ífDòD$(òYèÓ!òXD$ òD$ ÿÅHƒÃD9åuÚòA*ÍòD$òYD$(ò $è¡!ò $òYÈòXL$ òA*Äò^Èf(Áè"fWvƒò^D$òA1ÀHƒÄ0[]A\A]A^Ãf(ÁfWPƒòD$(fWÀòD$ ë„€€AWAVAUATUSHƒìhA‰ôA‰ÕòD$8òL$0I‰ÎM‰Ç…öŽtf(ÑfWö‚òT$XH‰ûfWÛò\$@ò\$Hò\$P1íDò òt$PòXñòt$PòD$XòYÁòL$ ò\$è£ òT$@òXÐòT$@òL$ f(ÑòYÐò\$òXÚòYÉòYÈòXL$HòL$HÿÅHƒÃD9åuŠòA*åòD$XòYD$8ò\$ò$$è; ò$$f(ìòYèòXl$@òYd$8f(ÐòYÔò\$òXÓò^Õò ’€ò^L$0òA*Üòt$Pò^óò\ÎòXÊòAòYÒòYd$8òYÄòXD$Hò^Åò\ÐòD$0òYÀòD$0òìò^D$0òXÐòAHƒÄh[]A\A]A^A_Ãf(ÁfW‚òD$XfWÛò\$@ò\$Hò\$PéÿÿÿAUATUSHƒì(A‰ôòD$I‰ÕfWÉ…ö~JfW:òD$H‰ûfWÉ1íDfDòD$òYò $èò $òXÈÿÅHƒÃD9åuØòA*Äò^Èf(Áè~fWÞ€ò^D$òAE1ÀHƒÄ([]A\A]ÃDAVAUATUSHƒì`A‰ôf(øI‰ÕI‰Î…öŽfW—€òD$XH‰ûfWÛò\$Pf(ãf(ó1íf.„ò òXñòD$XòYÁòL$@ò\$0òd$ òt$ò<$è>òL$@f(ÑòYÐòXT$PòT$PòYÉòYÈòd$ òXáò\$0òXØÿÅHƒÃD9åòt$ò<$u€f(êò^ëf(ÕòYÕò^ãò\Ôò`~ò^ÇòA*Ìò^ñò\ÆòXèòAmòYÿòéò^ÇòXÐòAHƒÄ`[]A\A]A^ÃfWöòËf(êë¥fD€Hƒìò\Áf(ÈòYÊfW Xf(Áò $èLf(ÐfW>f(ÂfTBò $f.uzsf(ÁHƒÄÄf(Âè f(ÈòKf.ÁvfW í~f(ÁHƒÄÃ@òh}ò\ÁHƒÄécDfDATUSHƒì0H‰ÓòòD$òGè£òD$H‹+D‹còKòL$òA*Äò$òD$è òY$òD$ E…䎀H‰ëH‰è1ÒòL$ fòò\D$òYD$ò\ÈòL$ ÿÂHƒÀD9âuÛòD$fW~òD$(1íDòò\D$òYD$(èýòL$ ò\ÈòL$ ÿÅHƒÃD9åuÐòT$òL$òD$èYþÿÿòY$òL$ ò\Èf(ÁfW®}HƒÄ0[]A\ÃDHƒìò\ÁòYÂfWŒ}è‰f(Èf(ÐfWw}f(ÂfT{}f.³}zsf(ÁHƒÄÃfDf(ÂèIò Ï{ò\Èf(ÁHƒÄÃfHƒìò\ÁòYÂfW}èfW}HƒÄÃf.„Hƒìò\ÁòYÂfWì|èéfWß|HƒÄéØfDHƒì(ò\Áf(ÈòYÊf(Âò $èJò $ò\ÁòD$f(ÁfW—|è”òL$ò\Èf(ÁHƒÄ(À„Hƒì(òT$ò\Áf(ÈòYÊfW R|f(Áò $èFò $ò\Èf(Áè4òYD$HƒÄ(ÀAWAVAUATUSHì˜H‰ýA‰ôA‰ÕòD$PH‰L$HL‰D$@HŒ$ˆ1Òèçæòÿ{òY„$ˆòQÀò ò{ò^ÈòL$X1ÛL|$xL´$€ëU€„ò^L$xòl$Xò\éf(ÅfWÉòÂÁf(ÍfTÈò‹yfUÂfVÁòD$XÿÃûd„M‰øL‰ñòL$XòD$PD‰êD‰æH‰ïè øÿÿòŒ$€f(ÁfT5{ò=yf.ІsÿÿÿE…äްòL$XfW üzòL$hH‰ëHÇD$`1í„òD$hòYèÓòXD$`òD$`ÿÅHƒÃD9åuÚòD$XH‹D$@òòA*ÍòD$PòYD$hòL$0è‘òL$0òYÈòXL$`òA*Äò^Èf(ÁèfWezò^D$XH‹D$Hò1ÀHĘ[]A\A]A^A_ÃòZzòY„$ˆòQÀòMzò^ÐM‰øL‰ñf(ÊòD$PD‰êD‰æH‰ïòT$ èÍöÿÿò„$€fWíf.ÅòT$ wQé§€„M‰øL‰ñf(ÊòD$PD‰êD‰æH‰ïòT$ è|öÿÿò„$€fWÉf.ÁòT$ v[òXÒf.ßyvµL–l¹šH¾l1ö¿1Àè:ÿÿ¸éÿÿÿòD$XfWLyòD$hHÇD$`é~þÿÿ1ÛfWäëD‰ÀA¯D$H˜HÁàHH‰9AÿÀHƒÇDúE9èuÍAƒ|$~3D‰ê¿¹I‹v @HcÂHÁàHH‰ÿÇHƒÁDêA9|$âE‰.A‹D$A‰FM‰f(L‰ðHƒÄ[]A\A]A^A_ÃH…í„ØþÿÿI‰éL¥)¹,HFS1ö¿è¥ÿÿë;IcD$HÁàH¯$I‰ÁLs)¹-H…À„±þÿÿH S1ö¿1ÀèhÿÿL‰÷èàüÿÿE1öévÿÿÿH…Û„áýÿÿI‰ÙL-)¹%HÎR¿1Àè-ÿÿëÃI‰ÙL )±&H…Û„Àýÿÿë—IcD$HÁàH…À„ÊýÿÿI‰ÁLà(¹'HR¿1ÀèàÿÿésÿÿÿIcD$HÁàH¯$I‰ÁL«(¹.H…À„ þÿÿé3ÿÿÿH…Û„þÿÿI‰ÙL…(¹/éÿÿÿAUATUSHƒìH‰ûH‹(‹3è˜üÿÿI‰ÅH…À„³‹…Ò~SE1ä1íI‹EH‹<(ÿÂHcÒHÁâH‹CH‹4(èRüI‹EH‹<(H‹C(HcPHÁâH‹CH‹4(è1üAÿÄ‹HƒÅD9â³H‹C(E1ä1í‹H…Éë0‹I‹E H‹<(HcÒHÁâH‹C H‹4(èòûAÿÄHƒÅH‹C(D9`ÑI‹}‹ÿÂHcÒHÁâH‹sèÉûL‰èHƒÄ[]A\A]ÃDfDAWAVAUATUSHƒìA‰ÿA‰ô¿8è†ûH‰ÃH…À„ÂH‰D$HÇ@HÇHÇ@EwMcîIcÄI¯ÅH,…H‰ïè@ûH‹T$H‰BH…À„²D‰àA¯ÆH˜H‰C0J,íH‰ïèûH‰ÆH‰H…À„íAGH˜H,…H‰ïèìúH‰CH…À„÷D‰s E…ÿx0E1À1É1ÒH‹3A@HcÂHÁàHCH‰AÿÀHƒÁDâA9øuâD‰s$D‰c(ÇCÇCH‹D$HƒÄ[]A\A]A^A_ÃH…í„EÿÿÿI‰éLM&¹ÄHîO1ö¿èMÿÿH‹{H…ÿtèõùH‹;H…ÿtèèùH‹{H…ÿtèÚùH‰ßèÒùHÇD$ë…H…í„ ÿÿÿI‰éLæ%¹ÇH‡O¿1Àèæÿÿë—H…í„ÿÿÿI‰éL¹%¹ÈHZO1ö¿è¹ÿÿégÿÿÿA¹8L%¹¿H0O1ö¿1ÀèÿÿHÇD$éóþÿÿAWAVAUATUSHì8I‰ýH‰t$p‰ÕH‰L$hL‰D$`L‰L$XòD$PHcÚH‰ØHÁàH‹”$pL$H[HÂH‰„$˜L‰Ê‰îÿÑò„$€f.2Zz:u8L–N¹¹HN1ö¿1ÀèÝÿÿ¸HÄ8[]A\A]A^A_Ãf.~Yu{¼H‹Œ$pL4ÙHƒ|$`„t H‹T$X‰îL‰ïÿT$`ò,Z‰îH‹¼$pè]ØL‰ò‰îH‹¼$pèûÚ1Ò…í~@òAL‰ð1ÒfWÀf.Èz9t$ë5fD€ò@HƒÀfWÒf.ÂuzÿÂ9Õå9ê„û òAÇ„$”H‹D$pòò^Áò„$ €¤$'ƒý~\º1ÀH‹L$p€€òDÁòA^DÆò„$¸€¤$¿òŒ$¸ò]Œ$ òŒ$ ÿÂHÿÀ9êu¾H‹T$X‰îL‰ïÿT$hò„$ L‰â‰îL‰ïèúÙ‰êò„$ L‰öL‰çèTÙH‹T$X‰îL‰çÿT$hHÇ„$°f.„$ w'ò”$ ò”$°ò„$ HÇ„$ òœ$°ò\œ$ ò%¾XòYãòX¤$°ò¤$(L‰â‰îL‰ïè[Ù‰êò„$(L‰öL‰çèµØH‹T$X‰îL‰çÿT$hò„$òŒ$ f.È‚I 1Ûò”$(ë;€€òŒ$(òŒ$°ò”$(ò¤$ ò„$ò\”$°òYXòX”$(L‰â‰îL‰ïòT$0è¦Ø‰êòT$0f(ÂL‰öL‰çèÿ×H‹T$X‰îL‰çÿT$hòT$0òœ$°f.œ$(ztEò¤$(f.âzt4òŒ$ f.Œ$u zòœ$f.Øzt+fD€ÿÃûe„ ò¤$f.àƒÿÿÿf(Âòœ$°f(ÊòÂËfTÁfUËfVÈòŒ$¨f(ÂòÂÃf(ËfTÈfUÂfVÁò„$¸f(àò\¤$¨òèVòYÄòX„$¨ò„$H‹”$˜‰îL‰ïèx׉êò„$L‰öH‹¼$˜èÍÖH‹T$X‰îH‹¼$˜ÿT$hò„$ðòDŒ$¨òD”$¸òŒ$òŒ$f(ñò„$øò„$ÀHÇ„$é@ò”$ØòXÖH‹”$˜‰îL‰ïòT$0òt$ òDL$òD$è¸Ö‰êòT$0f(ÂL‰öH‹¼$˜è ÖH‹T$X‰îH‹¼$˜ÿT$hf(Øò¤$øf.àòT$0òt$ òDL$òD$‚éf(ÂòÂÆfA(ÊfTÈfD(ÐfDUÖfDVÑf(ÎfTÈfAUÁfD(ÈfDVÉf(Âò”$ò´$f(ðòœ$øòœ$ðò¤$ðò”$òœ$ÀfA(ùòAXúòY=øTf(îfT-œTòY-œRòX-üTf(Öò\×fT|Tf(ÍòXÍfA(ÂòA\ÁòYâZòXÈf.ʃÕò„$fTCTfWÛf(Óf.ņ¹f(Îò\Œ$ò”$øò\”$ÀòYÑf(Þò\œ$ò„$øò\„$ðòYÃòYØòYÊò\Ùò\Âf(ÐòXÐfWäf.Ô†¥fW­Sf(ËfT ±SòùSòYÂòY„$fT”Sò¤$Øò¤$f.Á‡¸fE(ÁòD\ÆfA(ÀòYÂf.Ç›fA(âò\æf(ÄòYÂf.Ç€f(ÆòÂÇf(ÌfTÈf(àfAUàfVáò‚SòYÄò„$Øò¤$@ò„$ØfTïRf.ŃýÿÿòŒ$ØfWÒf.ʆ»f(ÕòXÖéþüÿÿò^Úòœ$Øf(ËòXÎf(ÁòA\ÁòXÀf.èwfA(Âò\ÁòXÀf.èv…f(ÅfWiRf(ÎòÂÏfTÁfUÍfVÈòŒ$ØéVÿÿÿfDf(ÂòÂÆfA(ÉfTÈfD(ÈfDUÊfDVÉf(ÊfTÈfAUÂfD(ÐfDVÑò„$ðf.ÃsYòŒ$f.ÎztHò¤$Àf.ãƒýÿÿò„$f.Æz„ýÿÿf.Áz„øüÿÿf(Ðf(Üéëüÿÿ€f(Âò”$ò„$ò„$ðòœ$ðf(Øé³üÿÿH‹”$˜‰îL‰ïòt$ è‡Ò‰êòt$ f(ÆL‰öH‹¼$˜èÛÑL‰ê‰îH‹¼$˜èYÒòŒ$øf. èPz„qf. hP„]Hƒ|$`„/L‰áH‹T$X‰îL‰ïÿT$`òQ‰îL‰çèSÏ…íŽHÇ„$ˆ1ÀfD€òAÄf(ÈH‹”$pò\ ÂòYÁòX„$ˆò„$ˆHÿÀ9Å̉êH‹´$pH‰÷èJÔòD$xH‹”$˜‰îL‰çè‚щêò„$ˆò^D$xL‰öH‹¼$˜èÑÐH‹”$p‰îL‰çèOÑL‰ò‰îH‹¼$˜è=ÑòŒ$€ò\Œ$øfT PòXÉ€¤$‡ògPòX„$€ò„$€ò„$øfTÌOòX„$€ò^ÈòT$Pf.ÑsNƒýޤL‰ð1ÒfWÛfA.Š’t)é‹€„ò@HƒÀfWäf.ÄuizgÿÂ9êuåHƒ¼$xtò„$øH‹„$xò¸ƒ¼$”d„êôÿÿ1ÀéãôÿÿDfDfWOéVûÿÿf(Öò\ÕéCùÿÿtŸÿ„$”ƒ¼$”dtŽòAò„$øò„$€éZõÿÿE1ÿ1Û…íŽf.„òàNH‹D$pòYØò„$耤$ïòALÝòŒ$àf(ÁòX„$èòADÝH‹T$X‰îL‰ïÿT$hf(Èò„$àò\„$èòADÝH‹T$X‰îL‰ïòL$@ÿT$hò”$àòATÝòL$@ò\ÈòY ˜Tò^Œ$èòA ÜAÿÇHÿÃA9ï…:ÿÿÿéýÿÿL@B¹ºH$B1ö¿1Àèdÿÿò¤$¸é5÷ÿÿHÇ„$ˆé)ýÿÿŠüÿÿL×A¹ëé<óÿÿ…íŽ/E1ÿ1Ûò±MH‹D$pòYØò„$Ѐ¤$×òALÝòŒ$Èf(ÁòX„$ÐòADÝH‹T$X‰îL‰ïÿT$hf(Èò„$Èò\„$ÐòADÝH‹T$X‰îL‰ïòL$@ÿT$hò”$ÈòATÝòL$@ò\ÈòY iSò^Œ$ÐH‹„$pò ØAÿÇHÿÃA9ï…3ÿÿÿH‰ÇL‰ò‰îè×ÍéÝòÿÿò”$ ò”$°ò”$(é°õÿÿHƒ¼$x„Qýÿÿò„$€H‹„$xò1ÀéòÿÿL‰ò‰îH‹¼$pèuÍ1Òé¹òÿÿ‹‡Ì Ãf„AUATUSHƒìI‰ýH‰ó‹…ÀtÿÈta1ÀHƒÄ[]A\A]ÃH‰ùº¾H=e@èHê‹“È H5b@L‰ï1Àèê‹“Ì H5W@L‰ï1Àèðé1ÀHƒÄ[]A\A]ÃH‰ùº¾H=8@èôé‹SH5E@L‰ï1Àè¶éHcC‹TƒH5C@L‰ï1Àèé1ÒH5>@L‰ï1ÀèŠé‹SH50@L‰ï1Àèvé‹S H5@L‰ï1Àèbé½A¼f„HƒÃAÿÄAüptH‹S H5ä?L‰ï1Àè*éÿŃýuÕAT$H5Í?L‰ï1Àè éHåÿÿÿHƒÃAÿÄAüpu¸L‰î¿ èïè1ÀHƒÄ[]A\A]À€éáèDfDUSHƒìH‰û…ö„ƒ;„‰³Ì Ž úñã¸c})ȉÏÁç1ǸNa¼)È)ø‰úÁê 1Â)ù)щÐÁè 1È)×)ljÆÁæ1þ)Â)ò‰ñÁé1Ñ)ð)ȉÊÁê1Â)Î)Ö‰ÐÁà 1ð)Ñ)ÁÁèº*1ÈEЉ“È 1ÀHƒÄ[]Ã1ÿèNé‰Åè]è)ŵ²žCÿöã-Na¼)ð‰÷Áç1ǸNa¼)ð)ø‰úÁê 1Â)þ)Ö‰ÑÁé 1ñ)×)ωÎÁæ1þ)Ê)ò‰ðÁè1Ð)ñ)Á‰ÇÁï1Ï)Æ)þ‰úÁâ 1ò)ø‰ÑÁé)ЉÎ1Ƹ*Dðƒ;…êþÿÿ‰³Ì ‰siÆÍ ‰C ºf„iD“Í ‰D“ HÿÂHúouè1ÉH5ŸM€„‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3†‰T‹HÿÁHùãuÊHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3†‰”‹”HÿÁHùŒuÄ‹Káÿÿÿ‹ƒÄ %€ Á‰ÈÑè3ƒ8ƒáHíL3ЉƒÄ ÇC1ÀHƒÄ[]Ã@H‰\$ðH‰l$øHƒì‰ý¿Ð èÊæH…Àt@H‰ÃÇÇ@Ç€È Ç€Ì ‰îH‰ÇèsýÿÿH‰ØH‹\$H‹l$HƒÄÃA¹Ð L\¹‡HÄ<1ö¿è\ÿÿ1ÛëÅ„H‰\$ðH‰l$øHƒì‰ý¿Ð è:æH…Àt@H‰ÃÇÇ@Ç€È Ç€Ì ‰îH‰ÇèãüÿÿH‰ØH‹\$H‹l$HƒÄÃA¹Ð L̹YH4<1ö¿èÌÿÿ1ÛëÅ„ƒ?t#i‡È Í P‰—È ‰ÐòH*ÀòY‘KÃo޾1ÉH5rKf‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹Oáÿÿÿ‹‡Ä %€ Á‰ÈÑè3‡8ƒáHÍJ3Љ‡Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1‰ÐòH*ÀòY€JÀS¿Ð èyäH…Àt3H‰ÃÇÇ@Ç€È Ç€Ì 1öH‰Çè"ûÿÿH‰Ø[ÃA¹Ð L¹YH€:1ö¿èÿÿ1ÛëÒ@HƒìA‰Ñƒ?tki‡È Í P‰—È ‰ÐòH*ÈòY ÚIE…É~/IcÁóT†ü1Àë ÿÀHƒÆD9Ètóó^ÂóZÀf.ÁvãHƒÄÃH=:1Àèàÿÿ1ÀHƒÄÃoŽÁ1ÉLsI‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒàA3€‰THÿÁHùãuÉHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3TƒàA3€‰””HÿÁHùŒuËOáÿÿÿ‹‡Ä %€ Á‰ÈÑè3‡8ƒáHËH3Љ‡Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéŸþÿÿHƒìA‰Ðƒ?tgi‡È Í P‰—È ‰ÐòH*ÈòY ZHE…À~+IcÀòTÆø1Àë ÿÀHƒÆD9Àtòò^Âf.ÁvçHƒÄÃH=›81Àèdÿÿ1ÀHƒÄÃoŽÅ1ÉL ÷G€‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒàA3‰THÿÁHùãuÉHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3TƒàA3‰””HÿÁHùŒuËOáÿÿÿ‹‡Ä %€ Á‰ÈÑè3‡8ƒáHKG3Љ‡Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéŸþÿÿHƒìA‰Ðƒ?„§i‡È Í DHD‰È E…À~xH‰ñH‰ð1ÒfWÒf(âfDóZòXÐÿÂHƒÀD9ÂuíD‰ÈòH*ØòY¥FóZòXÌf(Áò^Â1Àf.Ãv ë5óZAòXÈHƒÁf(Áò^Âf.ÃwÿÀD9ÀuÞH=71Àè ÿÿ1ÀHƒÄÃoŽÁ1ÉL 3F‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒàA3‰THÿÁHùãuÉHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3TƒàA3‰””HÿÁHùŒuËOáÿÿÿ‹‡Ä %€ Á‰ÈÑè3‡8ƒáH‹E3Љ‡Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ÐA‰ÁAÁéA1ÁébþÿÿfD€HƒìA‰Ðƒ?„£i‡È Í DHD‰È E…À~tH‰ñH‰ðfWÒf(Â1ÒfDòXÿÂHƒÀD9ÂuñD‰ÈòH*ØòYÙDf(ÈòXf(Áò^Â1Àf.Ãv ë5€òXIHƒÁf(Áò^Âf.ÃwÿÀD9ÀuâH=;51ÀèÔÿþÿ1ÀHƒÄÃoŽÅ1ÉL gD€‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒàA3‰THÿÁHùãuÉHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3TƒàA3‰””HÿÁHùŒuËOáÿÿÿ‹‡Ä %€ Á‰ÈÑè3‡8ƒáH»C3Љ‡Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ÐA‰ÁAÁéA1ÁébþÿÿfD€fD(ÀfD(Ƀ?„éi‡È Í P‰—È ‰ÐòH*Èò3CòYËòDî>fA.ʆ*òD =fA(óf(Áò\ÆòXÁòYCòH,ÐHƒú „iH…Ò„òH*ÊLBÿò\Áf(ÈH ÁAòB$ÁH´?òB<Àf.ø‚¼H5Bò,Ñò\ìƒ?„i‡È Í P‰—È ‰ÐòH*ÐòYÓòYÕf(ÂòAYÂòXÄòYÂf.ÈvkézfD€i‡È Í P‰—È ‰ÐòH*ÀòYÃf.È‚ÿƒ?„öi‡È Í P‰—È ‰ÐòH*ÈòYËf.ȇƒ?u¢oޱ1É‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé¼þÿÿfWöòDÜ:éÒýÿÿòXÀfD.؆T¸ò%Û@H´>òXdÂøHÿÀòXÀfD.ØwìHÿÈòA\Ãò,ÂH5Œ@f(ÐòYÕf(ÂòAYÂòXÄòYÂëYi‡È Í P‰—È ‰ÐòH*ÈòYËf.ȇvƒ?„'i‡È Í P‰—È ‰ÐòH*ÀòYÃf.È‚vƒ?u¢o޲1É@‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé»þÿÿoޏ1Éf.„‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âéüÿÿoޏ1Éf.„‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âéìüÿÿƒ?„¦i‡È Í P‰—È ‰ÐòH*ÈòYËf.ùƒTúÿÿf(Ñò\×HÙ8òBYÀòXÔf(ÊfW 38f(ÆòAÂÃfTÈfUÂfVÁòAYÁòAXÀÃ?„9i‡È Í P‰—È ‰ÐòH*ÀòYÃéêûÿÿo޵1É€‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âéùÿÿ²ò ‡;A¸锸ÿÿo޼1ÉH5N;‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹Wâÿÿÿ‹‡Ä %€ ‰ÐÑè3‡8ƒâH «:3‘‰‡Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé&÷ÿÿoŽ®1É‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéäüÿÿoŽ®1É‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âéwûÿÿò%Œ8¸H`6é¾÷ÿÿDfDò P8fWÒH5=8ë.i‡È Í P‰—È ‰ÐòH*ÀòYÁf.Š …ƒ?uÍoŽ·1Éf„‹D %ÿÿÿ‹T†ЉÂÑê3”<ƒà3†‰THÿÁHùãuÊHáÿÿÿ‹„˜%ÿÿÿ‹””†ЉÂÑê3Tƒà3†‰””HÿÁHùŒuÄ‹G%ÿÿÿ‹—Ä â€ Ð‰ÂÑê3—8ƒà3†‰—Ä ÇG‹GHcЋT—ÿÀ‰G‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéáþÿÿóÀUSHƒì(H‰ûò7f(ÈòXÊò^ÑòT$ò Õ0ò^ÈòL$H-Ä6ò\¼0ò$ƒ;„øiƒÈ Í P‰“È ‰ÐòH*Èë6iƒÈ Í P‰“È ‰ÐòH*ÀòYx6fWÒf.Š …ƒ;uÅ{o޹1É„‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3T…‰T‹HÿÁHùãuÉHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3T…‰”‹”HÿÁHùŒuËC%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3T…‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé×þÿÿòY V5òT$f.Ñv`òL$èÏòD$fW™0è–Îf(ȃ;tiiƒÈ Í P‰“È ‰ÐòH*ÀòY5f.Áƒ8þÿÿòD$HƒÄ([]ÃèåÎò Õ.ò\ÈòL$ò $òD$èÏf(ȃ;u—{oŽ´1É‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3T…‰T‹HÿÁHùãuÉHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3T…‰”‹”HÿÁHùŒuËC%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3T…‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé®þÿÿ{oޏ1É€‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3T…‰T‹HÿÁHùãuÉHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3T…‰”‹”HÿÁHùŒuËC%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3T…‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéüÿÿfDUSHƒìXH‰ûòD$8è8ÌòL$8f.È…sŠmf. ®2ƒ_ŠYòL,ÁE…À„1ÿòZ,H5S2ë7iƒÈ Í P‰“È ‰ÐòH*ÈòY 62fWÒf.ÊŠ… ƒ;uÅ{oŽ´1ÉfD‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3†‰T‹HÿÁHùãuÊHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3†‰”‹”HÿÁHùŒuÄ‹C%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3†‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéÜþÿÿò\$8f.‹+†)f(ÃòXÃò\õ*òQÀòD$ H-ä0ò\Ü*ò\$ƒ;„æiƒÈ Í P‰“È ‰ÐòH*ÀòY³0òY;,è~ËòL$ òYÈòL$HòT$8òXÑò\|*òT$@fWÛf.Ús–ƒ;„}iƒÈ Í P‰“È ‰ÐòH*ÈòI0òYÑòT$0òYÀò+*òXØò\$(òD$@ò^D$èÊòYD$ò\D$HèqÉòYD$(òL$0f.ȇÿÿÿòD$@HƒÄX[]Ãò Ô)òT$8f.ʇÞòL,Àf(ÑE…À„X1ÿH5©/ë=€iƒÈ Í P‰“È ‰ÐòH*ÈòY †/fWÛf.ËŠ…ƒ;uÅ{oŽ´1ÉfD‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3†‰T‹HÿÁHùãuÊHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3†‰”‹”HÿÁHùŒuÄ‹C%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3†‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1ÂéÜþÿÿòYÑÿÇD9Ç…ðþÿÿòL$8ò\Èf(ÁH‰ßò$è?÷ÿÿòD$@ò$f(Âè3ÈòT$@ò\ÐòT$@f(ÂHƒÄX[]ÃòYÁÿÇD9Ç…çûÿÿèÈfWd)òD$@HƒÄX[]Ã{o޹1É„‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3T…‰T‹HÿÁHùãuÉHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3T…‰”‹”HÿÁHùŒuËC%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3T…‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé,üÿÿ{oޏ1É€‹D‹ %ÿÿÿ‹T‹†ЉÂÑê3”‹<ƒà3T…‰T‹HÿÁHùãuÉHáÿÿÿ‹„‹˜%ÿÿÿ‹”‹”†ЉÂÑê3T‹ƒà3T…‰”‹”HÿÁHùŒuËC%ÿÿÿ‹“Ä â€ Ð‰ÂÑê3“8ƒà3T…‰“Ä ÇC‹CHcЋT“ÿÀ‰C‰ÐÁè 1ЉÂÁââ€V,1‰ÐÁà%Æï1ЉÂÁê1Âé–ûÿÿf(ÂH‰ßHƒÄX[]éÔôÿÿòÌ%éÆýÿÿUS‰óH‰Ö‰ØÁèDAÑûHj¸E…Û~GHjCÿH˜L8H E1ÒE1É„A¶PA¶D9ˆAAˆT1AÿÂIÿÁIÿÈHÿÉE9ÚuÜACöÃt Hcж:ˆ2ÆÿHcÃÆ(ÿ1À[]Ãf.„AWAVAUATUSHƒìI‰ÿI‰öA‰ÕA‰ÌL‰ÅHcÁAÆDÿAÆÿ…É~1ÛD‰êL‰öL‰ÿèÂåÿÿˆD+HÿÃCA9Ä}ã1ÀHƒÄ[]A\A]A^A_ÃfAWAVAUATUSHƒìH‰|$I‰÷I‰ÖA‰ÍE‰ÄL‰ $1ÀE…À~,L‰Ë1íD‰êL‰öH‹|$è`åÿÿH˜B¶8ˆÿÅHÿÃD9åuÝIcÄH‹$Æ1ÀHƒÄ[]A\A]A^A_ÃAWAVAUATUSHƒìH‰|$I‰öA‰Ô‰ÍM‰Ç…Ò~4¶FH‰ò¹9Åéf„¶BHÿÂ9èöÿÁA9Ì}êHcÅHÅH‰ßè ÄI‰ÅH…À„L‰è1Ò…í~fHÇÿÂHƒÀ9êuïE…䎅L‰ö1Òò ¹#f„¶FIDÅòòXÁòÿÂHÿÆD9âuá…í~#òA*ÌL‰è1Òòò^ÁòÿÂHƒÀ9êuê1Û„‰êL‰îH‹|$è!äÿÿBˆD;HÿÃCA9Ä}áAÆÿIcÄAÆDÿL‰ïèòÂ1ÀHƒÄ[]A\A]A^A_ÃLô¹ûH1ö¿ 1Àè åþÿ¸ HƒÄ[]A\A]A^A_ÃH…Û„òþÿÿI‰ÙLËî¹ýHÐ1ö¿1ÀèÉäþÿ¸ë½fAWAVAUATUSHƒì8H‰|$H‰ðA‰ÔA‰ÎL‰D$L9ÆtL‰ÂIcôH‰Çè<ÿÿE…ä޼D‰ð÷؉D$,D‰óA½ÇD$(ë€Dó‹D$,D$(E9üŒ…E‰ýG<.D9ãD‰åNëD9í~׋T$(ê‰T$$HcÅH‹T$LH‹|$L‰D$èRÜÿÿò*L$$òYÈò,ÁDèH˜HD$¶L‹D$A¶ˆAˆÿÍÿL$$IÿÈD9íºDó‹D$,D$(E9ü{ÿÿÿ1ÀHƒÄ8[]A\A]A^A_ÃfDAWAVAUATUSHƒìhH‰|$8H‰õ‰T$4A‰ÍL‰D$(…Ò~.¶FH‰ò¹A9ÅëS€¶BHÿÂD9è}@ÿÁ9L$4}ìƒ|$4Y1ÛH;l$(t‹T$4ƒÂHcÒH‰îH‹|$(èEÁ‰ØHƒÄh[]A\A]A^A_ÃL-¹ùH 1ö¿ 1Àèãþÿ» ëÇMcõN$µL‰çèíÀI‰ÇH…À„E1ÒE…í~¶ÂALJÿ¶ÂA9ÅëJõH‰ßèµÀH‰D$ H…À„L1ÒE…í~¶ÂH‹L$ HÇÁÿ¶ÂA9ÅæL‰çè~ÀH‰D$HH…À„Œ1ÒE…í~¶ÂH‹\$Hǃÿ¶ÂA9ÅçL‰÷èHÀH‰D$XH…À„E…펢‹D$4ÿÈLcà1ÛëÿöÃA9ÅއL‰çèÀ¶ÓH‹L$ H‰ÑH…ÀuÙM‰áL×ë¹HÜ1ö¿è×áþÿ»D‰îH‹|$ è•ÝþÿM…ÿtL‰ÿèn¿Hƒ|$Ht H‹|$Hè\¿Hƒ|$X„eþÿÿH‹|$XèF¿éVþÿÿH]H‰\$@¶U1ÿ‹D$4ƒèL@¶ÂI‡Hc2H‹\$ H‹ öD/ˆ1ÿ¶T/HÿÇL9ÇuÖHcD$4¶(ˆD$W¶ÀH‰D$E1öE…íŽD‰óE¶æK,§‹}…ÿtID8t$WtBH‹|$8èCÙÿÿHcUH‹L$ J<áH‹ò*ÊòYÈò,ÁH˜H¶0¶TÿˆHcUH‹@ˆtÿAÿÆC¶ÀA9Å—1Ò¶ÂH‹\$XÆÿ¶ÂA9ÅêH‹D$H‹T$XÆE…íªH‹\$@¶ L‹D$(A¹AˆHAÿÁ¶ÑH‹D$HH4‹HcÈH‹\$ H‹Ó¶< ÿÀ‰@¶×IÿÀ‰ùH‹\$H‹“A;—uÀIcÁ¶T$WH‹L$(ˆAIHcÁH‹\$(ÆÿÆÿ@8ú„8L>¹KHõ1ö¿1Àèîßþÿ»éþÿÿ1ÿ1ö@¶ÎA‹…Àt4HcÐH‹\$ H‹Ë¶DÿHL$X€9u¶ÀH‹T$X€<t DfDÿÆ@¶ÆA9ŵ…ÿt1ö1ÿë«Æ¿ëá1É€„‰È¶ÑA‹4—…öt8L$WtH‹\$X€<„þÿÿÿÁÿÀ¶ÀA9ÅÒE1öA¶ÆA‹,‡ÿ̓ý~HH‹T$ L$ÂHcÝH‹|$8èZ×ÿÿI‹$ò*ÍòYÈò,ÁH˜H¶¶TÿˆI‹$ˆLÿÿÍHÿ˃ýuÄAÿÆA¶ÆA9ÅéIþÿÿ‹D$4ÿÀ9È„‰$A‰ÉL¹LH©1ö¿1Àè¢Þþÿ»éÆüÿÿM…䄲ûÿÿM‰áLmè¹Hr1ö¿1ÀèkÞþÿD‰î1ÿè1Úþÿ»é±üÿÿH…Û„«ûÿÿI‰ÙL,è¹H11ö¿1Àè*Þþÿ»HÇD$HéEüÿÿE…턃üÿÿM‰ñLìç¹Hñ1ö¿1ÀèêÝþÿ»éüÿÿM‰áL¾ç¹M…ä„\ûÿÿëÇD‰îH‹|$ è‰ÙþÿL‰ÿèg»H‹|$Hè]»H‹|$XèS»1ÛéaúÿÿfDAUATUSHƒìI‰ýH‰ð‰ÕI‰ÌH9ÎtHcòH‰ÊH‰Çè ÿÿHcÅJ ƒý~;fDfDL‰ïèˆÕÿÿò*ÍòYÈò,ÁÿÀH˜Là¶¶ˆˆ ÿÍHÿ˃ýuÑ1ÀHƒÄ[]A\A]Ã@AWAVAUATUSHƒìI‰ÿI‰öA‰ÕA‰ÌL‰ÅHcÁAÆDÿAÆÿ…É~1ÛD‰êL‰öL‰ÿèÂÙÿÿˆD+HÿÃCA9Ä}ã1ÀHƒÄ[]A\A]A^A_ÃfAWAVAUATUSHƒìH‰|$I‰÷I‰ÖA‰ÍE‰ÄL‰ $1ÀE…À~,L‰Ë1íD‰êL‰öH‹|$è`ÙÿÿH˜B¶8ˆÿÅHÿÃD9åuÝIcÄH‹$Æ1ÀHƒÄ[]A\A]A^A_ÃUSHƒìH‰ûH‰õèÕºA‰ÂÁèFAÑøE1ÉMcÚE…À~6I4I +1ÿfD€¶Vÿ¶ˆAÿˆ/AÿÁHÿÇHÿÎHÿÉE9ÁuáAƒât IcѶˆ*AÆ+1ÀHƒÄ[]ÃAWAVAUATUSHìèH‰|$H‰õH‰$H‰÷èAºI‰ÇA‰Æ…À~}1Û@ÿL`ë'fDHc×H‹´‹DŠH‰ChH…À„ÆHǃ¨ÿÿÿÿHǃ ÿÿÿÿHǃ˜ÿÿÿÿHǃ°ÿÿÿÿH‰ØH‹$H‹l$L‹d$L‹l$L‹t$ HƒÄ(À€H…í„3ÿÿÿI‰éL¥µ¹üH¤á1ö¿襫þÿëcH…í„;ÿÿÿI‰éLuµ¹ Htá1ö¿èu«þÿë3H…í„›þÿÿI‰éLEµ¹îHDá1ö¿èE«þÿDH‰ßèèÿÿ1Ûé3ÿÿÿÇ@p ¿ è#‰H‰H…À„¨ÆM…í…Rþÿÿ€ÇCx€¿€èóˆH‰CH…À„©ÆM…ö…YþÿÿfDÇCt ¿ èÈH‰CH…À„«Æé\þÿÿf.„‹“ˆ…Ò„eþÿÿLcÊLp´¹Hoà1ö¿èpªþÿé+ÿÿÿ‹Sp…Ò„MÿÿÿLcÊL>´¹õH=à1ö¿è>ªþÿéùþÿÿ‹Sx…Ò„LÿÿÿLcÊL ´¹H à1ö¿è ªþÿéÇþÿÿ‹St…Ò„JÿÿÿLcÊLÚ³¹HÙß1ö¿èÚ©þÿé•þÿÿA¹ÀL°³¹ãH¯ß1ö¿1À让þÿéiþÿÿf„H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰ýI‰öI‰ÔH‰ËM‰ÇH‰÷è ˆH‰ÅH‰ÚL‰æL‰ïèöûÿÿH‰ÃH…ÀtNHP H‰îL‰÷èß¼þÿ…Àu;M…ÿtfL‰ÿèÔ‡H9Å„ŠL¤ß¹hHß1ö¿ 1Àè©þÿ@H‰ßèÈåÿÿ1ÛH‰ØH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃHÇC0H‰k8HEH‰ƒ€HÇC@H‰kHHÇCPH‰kXH‰k`ë¥HS0H‰îL‰ÿè,¼þÿ…Àuˆë¾fDH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8I‰ýI‰÷H‹_E1äH…Ût H‰ßèê†A‰Ä1ÀM…ÿtL‰ÿèØ†B BA;Ex|eH…Û„£D²€IcîH‰îH‰ßèe†H…Àu2I‰éL º¹¹HßÝ1ö¿1ÀèÞ§þÿ¸ë;€I‰EE‰ux„E…ä~IcÔI‹EÆ AÿÄIcüI}L‰þè8†1ÀH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃD²€IcîH‰ïèk…é[ÿÿÿfH‰\$àH‰l$èL‰d$ðL‰l$øHƒì(H‰ýH‰óH…ö„©H‰÷è×…;…ˆŒ€H‹}hH…ÿ„“DhMcåL‰æèg…H…ÀuTM‰áL¢¹¹åHáÜ1ö¿1Àèà¦þÿ¸DfDH‹\$H‹l$L‹d$L‹l$ HƒÄ(ÀH‰EhD‰­ˆH‹}hH‰Þè3…1ÀëÅDH‹GhÆ1ÀëµDhMcåL‰çèz„éhÿÿÿH‰\$àH‰l$èL‰d$ðL‰l$øHƒì(H‰ýH‰óH…ö„™H‰÷èç„;Ex|tH‹}H…ÿ„ŠDhMcåL‰æè~„H…ÀuKM‰áL¹¸¹¿HøÛ1ö¿1Àè÷¥þÿ¸fH‹\$H‹l$L‹d$L‹l$ HƒÄ(ÀH‰ED‰mxH‹}H‰ÞèV„1ÀëÈ„H‹GÆ1ÀëµDhMcåL‰ç蚃éqÿÿÿH‰\$àH‰l$èL‰d$ðL‰l$øHƒì(H‰ýH‰óH…ö„™H‰÷è„;Et|tH‹}H…ÿ„ŠDhMcåL‰æèžƒH…ÀuKM‰áLÙ·¹—HÛ1ö¿1Àè¥þÿ¸fH‹\$H‹l$L‹d$L‹l$ HƒÄ(ÀH‰ED‰mtH‹}H‰Þèvƒ1ÀëÈ„H‹GÆ1ÀëµDhMcåL‰ç躂éqÿÿÿH‰\$àH‰l$èL‰d$ðL‰l$øHƒì(I‰üH‰óH…ö„™H‰÷è'ƒA;D$p|sI‹<$H…ÿ„‡DhIcíH‰î輂H…ÀuII‰éL÷¶¹qH6Ú1ö¿1Àè5¤þÿ¸H‹\$H‹l$L‹d$L‹l$ HƒÄ(ÀI‰$E‰l$pH‰ÞI‹<$è•‚1ÀëÇ€H‹Æ1Àë¶DhIcíH‰ïèÛétÿÿÿfH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìHH‰ûI‰Ô9w CA½fD€D‰èH‹\$H‹l$ L‹d$(L‹l$0L‹t$8L‹|$@HƒÄHÃf.„…öx¹öG$…’Hƒz „àH‹“€H…Ò„·HcÆH,ÅH‹*H‰T$H‹ƒˆE1öH…ÀtL‹4(H‹ƒE1ÿH…ÀtL‹<(H‹CH‹4(L‰çè=þÿÿA‰Å…À…RÿÿÿH‹t$L‰çèEýÿÿA‰Å…À…:ÿÿÿL‰öL‰çèOüÿÿA‰Å…À…$ÿÿÿH‹s8L‰çèHûÿÿA‰Å…À… ÿÿÿH‹sL‰çèñßÿÿA‰Å…À…öþÿÿöC$…#H‹H‹tI‹|$ èM…ÿt.H‹ƒH‹tI‹|$0èé€I‹t$ I‹|$01ÉH ÙèןþÿI‹|$ IL$8HöØH‰þ辟þÿIÇD$@I‹D$8I‰D$HIÇD$PI‰D$XI‰D$`IÇ„$˜ÿÿÿÿIÇ„$¨ÿÿÿÿIÇ„$ ÿÿÿÿIÇ„$°ÿÿÿÿé3þÿÿLXعûHƒz(…bþÿÿH•×1ö¿ 1À蔡þÿA½ éùýÿÿf„HcÆH,ÅHÇD$éDþÿÿLعüë°I‹T$(H‹sH‹C0H‹<(èóÌþÿM…ÿt4I‹|$0HÿÇL‰þèÈI‹D$0ÆI‹T$(I‹t$0HÿÆI‹¼$¸1Éè ÀþÿI‹t$(IL$8I‹¼$¸H‰òèpÀþÿéÍþÿÿDfDH‰\$àH‰l$èL‰d$ðL‰l$øHƒì(I‰ýH‰÷H‰ÓI‰ÌL‰ÆL‰ÊèQóÿÿH‰ÅH…ÀtiL‰æIƒüÿ„ìH‰u8HU(H‰ßèLÔþÿ…ÀuHHƒ|$0„ŒH‹]8H‹|$0èH9ØtOLèÖ¹oHIÖ1ö¿ 1ÀèH þÿ„H‰ïèÝÿÿ1íH‰èH‹\$H‹l$L‹d$L‹l$ HƒÄ(ÃHxè~H‰E0H…ÀthÆH‹}0HÿÇH‹t$0èŽ~@HÇE@L‰eHHÇEPL‰eXL‰e`H‹E8HƒÀH‰…€L‰­¸ë†fDfDH‰ßè8¾þÿH‰ÆéÿÿÿH‹U8HƒúþtŽLJLs©¹pHrÕ1ö¿èsŸþÿé.ÿÿÿ€€ATUSHƒìH‰ýI‰Ô9w ¸HƒÄ[]A\À„…öxßH‹—€H…Ò„lHcÆH<ÅL‹ :H‹…ˆE1ÒH…ÀtL‹8H‹…E1ÀH…ÀtL‹8öE$…H‹EH‹48H‹EH‹<8L‰ÉL‰Òè"õÿÿH‰ÃH…À„æH‹x0H…ÿtH‹p 1ÉHpÕè;œþÿH‹{ HK8H\ÕH‰þè$œþÿH‹u8H‰ßè÷ÿÿ…À… HÇC@H‹C8H‰CHH‰C`HÇCPH‰CXI‰$1ÀHƒÄ[]A\ÃH‹MH‹E0H‹8H‹EH‹48H‹}(L‰$M‰Ðè<ýÿÿH‰ÃH…ÀtDH‹@0H…ÀtH‹S(HpH‹»¸1Éèõ¼þÿH‹s(HK8H‹»¸H‰òè^½þÿéUÿÿÿf„H‰ßè˜ÚÿÿIÇ$¸HƒÄ[]A\ÃfHcÆH<ÅE1ÉéþÿÿfD€ATUSH‰ýH‰óHƒ0t Hƒ~0„íH‹uH‰ßè¸øÿÿA‰Ä…À„ÍH‹ÆH‹CÆH‹CÆÇCÿÿÿÿH‹ChÆH‹C H…ÀtÆH‹C(H…ÀtÆ@ÿÆÿH‹C0H…ÀtHƒ{ „{ÆHÇC8HÇC@HÇCHHÇCPHÇCXHÇC`ÿÿÿÿHǃÿÿÿÿHǃ¨ÿÿÿÿHǃ ÿÿÿÿHǃ˜ÿÿÿÿHǃ°ÿÿÿÿD‰à[]A\Ãf„H‹uhH‰ßè$õÿÿA‰Ä…À…ÿÿÿH‹uH‰ßèÝöÿÿA‰Ä…À…ÿÿÿH‹uH‰ßèæõÿÿA‰Ä…À…îþÿÿH‹u8H‰ßèŸÙÿÿA‰Ä…À…×þÿÿH‹u H…ö„6H‹{ H…ÿ„ëè¯zH‹u0H…öt H‹{0èzH‹E8H‰C8H‹E@H‰C@H‹EHH‰CHH‹EPH‰CPH‹EXH‰CXH‹E`H‰C`H‹…˜H‰ƒ˜H‹…¨H‰ƒ¨H‹… H‰ƒ H‹…°H‰ƒ°éõþÿÿfDÆ@é|þÿÿH‹¾€èyH‰C0H…À…úýÿÿH‹ƒ€H…À„êýÿÿI‰ÁL<¥¹þH;Ñ1ö¿1Àè:›þÿA¼éÒýÿÿH‹S(H…Òt5H‹»¸èº¸þÿ…ÀudH‹u0H…ö„ÿÿÿH‹{0HÿÇè—yH‹C0ÆéîþÿÿL‹E(M…Àt>H‹K H…Ét5H‹U8H‹½¸L‰Æèܸþÿ…ÀuH‹E0H…À„¸þÿÿHpé¦þÿÿA‰ÄéMýÿÿH‹…¸H‹“¸‹;t,LgѹHvÐ1ö¿ 1ÀèušþÿA¼ é ýÿÿH‹S(H‹u8L‰Çè Æþÿ…Àu¤H‹E0H…À„FþÿÿHpé7ÿÿÿHƒì)$óZ\$ óZT$óZL$óZ$H5*Ѹè®wHƒÄÃDfD(øD(%ÞD( -Þfo 5Þfo=ÞfrÐfoèfoßfÛÙfvÙfïÀfvÅfoçfÛâfvâ(×TÞAVÑfú-Þ[í(Ê Þ(òTñA\ÐATÈ\éXÖD(ÂDYÂ(ÊY ÞX ÞYÊX ÞYÊX ÞYÊX %ÞYÊX +ÞYÊX 1ÞYÊX 7ÞYÊX =ÞYÊAYÈ(õY5<ÞXÎEYÁA\ÈY-:ÞXÑXÕTüUâVçVã(ÈT ^×UÄVÁÀ(Ð(-ÞÂèÂÞ(ÊY Þ(=éÜXÏó[Ù[ÛÂË(5ÄÜTÎ\Ùó[ã(ËY ÀÝY©Ý\Ñ\Ó(ÚYÚ(ÊY ãÝX ìÝYÊX òÝYÊX øÝYÊX þÝYÊXÏYËXÊXÎfþ%÷ÝfrôYÌ(ÕTuÜUéVêUÅWÉVÁÉðÁèD0AÑøE…À~(HcÆH 81öfD¶Qÿ¶ˆAÿˆÿÆHÿÉHÿÇD9ÆuçóÃDHƒìA‰Ðf9wþÿÿD·KHµ³¾¿1ÀèX|þÿ½M…ítL‰ïèüYM…ötL‰÷èïYHƒ¼$˜t H‹¼$˜è×YH‹¼$(H…ÿtèÅYH‹{`H…ÿt èoYHÇC`H‹»ˆH…ÿtèVYHǃˆ‰èH‹tTH‹Œ$HH3 …(H‹œ$XH‹¬$`L‹¤$hL‹¬$pL‹´$xL‹¼$€HĈÃDfDH‹{XèZH=‡kH‹{`èÐXHÇC`L‹CXH¬$@M‰ÁH l´º1öH‰ï1ÀèMXH‰ïèõY…À…SH‹{XH5kZè«XH‰C`H…À„pH‹»ˆèhXHǃˆL‹ƒ€M‰ÁH ´º1öH‰ï1ÀèçWH‰ïèY…À… H‹»€H5ZèBXH‰ƒˆH…À…ýÿÿH»Ht´¾€èòX½ é%þÿÿ„‹C8…À„LüÿÿA‰ÁLC„¹çH›±1ö¿1ÀèAzþÿ½éþÿÿ€D‰çè,XH‰„$˜H…À„@ D‹cpé"üÿÿ€€LA³¹H9±1ö¿ 1Àèßyþÿ½ é‚ýÿÿDH»H"³¾€1Àè&X½ éYýÿÿH‹KÇ„$0A¶W¶„$0AˆGˆ”$0A¶WH‹t$p¶FAˆGˆV‹„$0‰„$4º¾H‰ïèWHÿÈ…ËüÿÿH‹K·CH”$>H‰T$Xº¾H‹|$Xè£VHÿÈ…VüÿÿH‹CPH‹KH‰„$H´$H‰´$€H‰´$¸¶”$¶„$ˆ„$ˆ”$¶”$¶„$ˆ„$ˆ”$¶”$¶„$ˆ„$ˆ”$¶”$¶„$ˆ„$ˆ”$H‹„$H‰„$H„$H‰D$xº¾H‰ÇèËUHÿÈ…~ûÿÿH‹CxH‹KH‰„$¶”$¶„$ˆ„$ˆ”$¶”$¶„$ˆ„$ˆ”$¶”$¶„$ˆ„$ˆ”$¶”$¶„$ˆ„$ˆ”$H‹„$H‰„$º¾H‹¼$¸èUHÿÈ…Æúÿÿ‹C8H‹K‰„$4¶”$7¶„$4ˆ„$7ˆ”$4¶”$6¶Eˆ„$6ˆU‹„$4‰„$0º¾H‹|$pè¦THÿÈ…Yúÿÿ‹CHH‹K‰„$0A¶W¶„$0AˆGˆ”$0A¶WH‹t$p¶FAˆGˆV‹„$0‰„$4º¾H‰ïèBTHÿÈ…õùÿÿ‹CpH‹K‰„$4¶”$7¶„$4ˆ„$7ˆ”$4¶”$6¶Eˆ„$6ˆU‹„$4‰„$0º¾H‹|$pèÕSHÿÈ…ˆùÿÿ‹„$´ƒÀ‰„$H‹K‰„$0A¶W¶„$0AˆGˆ”$0A¶WH‹t$p¶FAˆGˆV‹„$0‰„$4º¾H‰ïècSHÿÈ…ùÿÿ‹„$°ƒÀ‰„$”H‹K‰„$4¶”$7¶„$4ˆ„$7ˆ”$4¶”$6¶Eˆ„$6ˆU‹„$4‰„$0º¾H‹|$pèèRHÿÈ…›øÿÿ‹”$°AH‹K‰„$0A¶W¶„$0AˆGˆ”$0A¶WH‹t$p¶FAˆGˆV‹„$0‰„$4º¾H‰ïè|RHÿÈ…/øÿÿH‹KHÇ„$NHÇ„$NH‹´$¸H‰÷L„$ ¶V¶ˆFˆHÿÎHÿÇL9ÆuéH‹„$H‰„$º¾H‹|$xè RHÿÈ…¼÷ÿÿ·„$®¯„$L`NH‹KL‰¤$L‰¤$H‹t$xH‰÷L„$¶V¶ˆFˆHÿÎHÿÇL9ÆuéH‹„$H‰„$º¾H‹¼$€èŠQHÿÈ…=÷ÿÿ‹„$”H¯„$ IH‹KH‰„$H‰„$H‹´$€H‹¼$¸L„$ ¶V¶ˆFˆHÿÎHÿÇL9ÆuéH‹„$H‰„$º¾H‹|$xèQHÿÈ…¹öÿÿÇ„$ŒE1äfƒ{<„FH‹C(E1ÿF‹ E…ÛtH‹C0E1ÿBƒ< A•Ç‹S8H‹CJ‹4`L‰ïè›QH‹K‹S8¾L‰ïèP‹S8H9Ð…UH‹C B‹ H‹K‰„$4¶”$7¶„$4ˆ„$7ˆ”$4¶”$6¶„$5ˆ„$6ˆ”$5‹„$4‰„$0º¾H‹|$pè PHÿÈ…ÛH‹KD‰¼$0¶”$3¶„$0ˆ„$3ˆ”$0¶”$2¶„$1ˆ„$2ˆ”$1‹„$0‰„$4º¾H‰ïè¯OHÿÈ…jH‹C(A‹H‹K‰„$4H‹D$h¶P¶„$4H‹t$hˆFˆ”$4¶V¶„$5ˆFˆ”$5‹„$4‰„$0º¾H‹|$pè;OHÿÈ…öH‹C0A‹H‹K‰„$0¶”$3¶„$0ˆ„$3ˆ”$0¶”$2¶„$1ˆ„$2ˆ”$1‹„$0‰„$4º¾H‰ïèÃNHÿÈ…~ÿ„$ŒIƒÄ·C<;„$ŒºýÿÿD‹SE…Ò„*Hƒ{P„ð½L¼$8L¤$(H„$ÀH‰D$8H”$ H‰T$0HŒ$H‰L$(H´$<H‰t$ H„$H‰D$H”$ H‰T$H‹S`L‰þL‰çèÌxþÿ…À…EH‹„$(H‰„$ H‹T$8H5„ªH‹|$0èÞþÿ…À… H‹T$(H5fªH‹|$0èÀþÿ…À…H‹¼$è)Mf‰„$ÈH‹T$(H53ªH‹|$0èþÿ…À…KH‹¼$º 1öèuNH‰„$ÐH‹T$(H5ù©H‹|$0èSþÿ…À…3H‹¼$º 1öè;NH‰„$ØH‹T$(H5¿©H‹|$0èþÿ…À…ÿH‹¼$º 1öèNH‰„$à‹SHH‹´$ÀL‰÷èÔMH‹K‹SH¾L‰÷èÖL‹SHH9Ð…ŸH‹K·„$Èf‰„$>¶”$?¶„$>ˆ„$?ˆ”$>·„$>f‰„$<º¾H‹|$ ètLHÿÈ…@H‹KH‹„$ÐH‰„$H‰„$H‹t$xH‰÷¶V¶ˆFˆHÿÎHÿÇH;t$uçH‹„$H‰„$º¾H‹¼$¸èLHÿÈ…ÓH‹KH‹„$ØH‰„$H‰„$H‹´$¸H‰÷¶V¶ˆFˆHÿÎHÿÇH;t$uçH‹„$H‰„$º¾H‹|$xèšKHÿÈ…fH‹„$àH‹KH‰„$H‰„$H‹t$xH‰÷¶V¶ˆFˆHÿÎHÿÇH;t$uçH‹„$H‰„$º¾H‹¼$¸è-KHÿÈ…ùHEH9kP†sH‰ÅéëüÿÿfD‹CH…À„0ïÿÿA‰ÁLw¹èHk¤1ö¿1Àèmþÿ½HÇ„$˜é¨ðÿÿH»H­¦¾€1ÀèQK½ é„ðÿÿ‹CpE1ä…À„ÝîÿÿA‰ÁL§v¹éHÿ£1ö¿1Àè¥lþÿ½éHðÿÿè¶IH»H¦¾€èîJ½ é!ðÿÿLˆ¦¹NéóïÿÿLw¦¹`éâïÿÿLª¦¹dH‹£1ö¿1Àè1lþÿH»Hæ¾€1Àè‡J½ éºïÿÿLe¦¹Vë¹H»H!¦¾€1ÀèUJ½ éˆïÿÿD‹KE…É„fHƒ{x„ ½L¼$8L¤$(H„$ðH‰D$PH”$H‰T$HHƒÀH‰D$@H‹“ˆL‰þL‰çèùsþÿ…À…*H‹„$(H‰„$H‹T$PH5±¥H‹|$Hè }þÿ…À…‘H‹T$@H5“¥H‹|$Hèí|þÿ…À…f‹SpH‹´$ðH‹¼$˜è¿I‹SHH‹´$øL‰÷è¬IH‹K‹Sp¾H‹¼$˜è©H‹SpH9Ð…KH‹K‹SH¾L‰÷è‰H‹SHH9Ð…+HEH;kxƒ„H‰ÅéÿÿÿHƒ{P„,E1ä½L¼$ HŒ$H‰L$‹SHH‹C@I‹4L‰÷èIH‹K‹SH¾L‰÷èH‹SHH9Ð…ËH‹KH‹C@A·Df‰„$<H‹t$`¶V¶„$<ˆFˆ”$<·„$<f‰„$>º¾H‹|$Xè·GHÿÈ…mH‹KH‹C@I‹DH‰„$H‰„$H‹´$¸H‰÷¶V¶ˆFˆHÿÎHÿÇL9þuéH‹„$H‰„$º¾H‹|$xèKGHÿÈ…H‹KH‹C@I‹DH‰„$H‰„$H‹t$xH‰÷¶V¶ˆFˆHÿÎHÿÇH;t$uçH‹„$H‰„$º¾H‹¼$¸èÝFHÿÈ…“H‹C@I‹D H‹KH‰„$H‰„$H‹´$¸H‰÷¶V¶ˆFˆHÿÎHÿÇL9þuéH‹„$H‰„$º¾H‹|$xèqFHÿÈu+IƒÄ(HEH;kPƒ·üÿÿH‰ÅéþÿÿLž¢¹€é ìÿÿL¢¹néøëÿÿ1íA¼Hƒ{x„2‹SpH‹ChH‹tH‹¼$˜èîF‹SHH‹ChH‹tL‰÷èÚFH‹K‹Sp¾H‹¼$˜è×E‹SpH9Ðu7H‹K‹SH¾L‰÷è»E‹SHH9ÐuHƒÅID$L;cxƒµI‰Äé{ÿÿÿL䡹ŒéOëÿÿL¢¹sHøž1ö¿1ÀèžgþÿH»Hp¢¾€1ÀèôE½ é'ëÿÿLÒ¡¹Zé#ûÿÿLÁ¡¹WéûÿÿL°¡¹_éûÿÿH»H©¡¾€1ÀèE½ éÐêÿÿM…ítL‰ïèÌDM…ötL‰÷è¿DHƒ¼$˜t H‹¼$˜è§DH‹¼$(H…ÿtè•DH‹{`H…ÿt è?DHÇC`H‹»ˆ1íH…ÿ…ÊêÿÿéÕêÿÿL ¡¹réîþÿÿSHƒì H‰øH‰Óƒþ„œƒþt7LŸ¡¹¡HÀ1ö¿ 1Àèffþÿ¸ HÇHƒÄ [Ã@H|$H‰Áº¾èéCHÿÈt¸ëÌ‹D$‰D$¶T$¶D$ˆD$ˆT$¶T$¶D$ˆD$ˆT$‹D$H‰1ÀëœfDH|$H‰Áº¾è‰CHÿÈu H‹D$H‰D$¶T$¶D$ˆD$ˆT$¶T$¶D$ ˆD$ˆT$ ¶T$ ¶D$ ˆD$ ˆT$ ¶T$ ¶D$ ˆD$ ˆT$ H‹D$H‰1ÀéÿÿÿH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìxH‰ýH‰óI‰ÔI‰ÍM‰ÆM‰Ï¸H;wrqM…ätfAÇ$M…ítIÇEM…ötIÇM…ÿtIÇHƒ¼$€tH‹”$€HÇH‹\$HH‹l$PL‹d$XL‹l$`L‹t$hL‹|$pHƒÄxË,è¼BH‰D$H…ÀtN‹E8H¯ØH]H1ÒH‰ÞH‹}èQB…Àtf¸Hƒ|$„OÿÿÿH‹|$è,B¸é;ÿÿÿfDfD‹E,…Àt«A‰ÁL7n¹H›1ö¿1Àè5dþÿ¸éúþÿÿ‹U,H‹M¾H‹|$èÅA‹U,H9Ð…xÿÿÿH|$>H‹Mº¾è¡AHÿÈ…Wÿÿÿ·D$>f‰D$<¶T$=¶D$<ˆD$=ˆT$<·\$H‹Mº¾èH?HÿÈt »éÿÿÿ·D$>f‰D$<¶T$=¶D$<ˆD$=ˆT$<·D$HÿÈuŠH‹D$ H‰D$¶T$¶D$ˆD$ˆT$¶T$¶D$ˆD$ˆT$¶T$¶D$ˆD$ˆT$¶T$¶D$ˆD$ˆT$H‹D$H‰D$(M…ít H‹D$0I‰E1ÛM…ö„LþÿÿH‹D$(I‰é?þÿÿ‹E,…À„œþÿÿA‰ÁLnj¹ÅHÆ—1ö¿1Àèl`þÿ³éÞýÿÿLL$(LD$0H‹L$L‰úL‰æH‰ïèhýÿÿ‰Ã…À…oþÿÿM…ä„tÿÿÿL‰çèã=égÿÿÿ„H‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒì8H‰ýI‰ÕH‰ËM‰ÇM‰ÌL‹t$@M‰ñM‰àL‰ùH‰ÚèùüÿÿA‰Â…ÀuRM…툙M;.I‹4$H…ö„“· H‹Ehöˆ„‚H‹ExD‹ˆH‹Ep‹ ˆM…ÀtH…ÉuwAº fÇIÇIÇ$IÇH‹D$HHÇD‰ÐH‹\$H‹l$L‹d$L‹l$ L‹t$(L‹|$0HƒÄ8ÃAºë¨„H‹D$HHÇë¹IEÿ1ÒI÷ðH‰ÇI@H9Èt H‰øH¯ÁHðI‰$I¯øHGH‹T$HH‰ë„H2H¯ÏHÈI‰$H‹D$HL‰(éhÿÿÿH‰\$ÐH‰l$ØL‰d$àL‰l$èL‰t$ðL‰|$øHƒìhH‰ûI‰õ¿€è’<H‰ÅH…À„²HÇHÇ@XHÇ@`HÇ@hHÇ@pHÇ@xfÇ@H5å^H‰ßèÖ;H‰E»H…Àt$Ld$(H‰Áº¾L‰çèÆ;HÿÈtA»H‰ïèÉÿÿIÇE‰ØH‹\$8H‹l$@L‹d$HL‹l$PL‹t$XL‹|$`HƒÄhÀ‹D$(‰D$$Lt$$¶T$'¶D$$ˆD$'ˆT$$¶T$&¶D$%ˆD$&ˆT$%‹D$$=³ÉÓÓt =ÓÓɳ…xÿÿÿH‹Mº¾L‰÷è#;HÿÈ…Yÿÿÿ‹D$$‰D$(¶T$+¶D$(ˆD$+ˆT$(¶T$*¶D$)ˆD$*ˆT$)‹D$(‰EH‹Mº¾L‰çèÑ:HÿÈ…ÿÿÿ‹D$(‰D$$¶T$'¶D$$ˆD$'ˆT$$¶T$&¶D$%ˆD$&ˆT$%‹D$$‰E ƒøtAƒøt<»éÅþÿÿA¹€L«f¹;H”1ö¿1Àè©\þÿ»é›þÿÿƒøw¿H|$.H‹Mº¾è2:HÿÈ…hþÿÿ·D$.f‰D$,¶T$-¶D$,ˆD$-ˆT$,·D$,f‰EH\$H‹Mº¾H‰ßèé9HÿÈ…þÿÿH‹D$H‰D$H|$H‰ùH‰þLD$¶Q¶ˆAˆHÿÉHÿÆL9ÁuéH‹D$H‰EH‹Mº¾è“9HÿÈ…ÉýÿÿH‹D$H‰D$H‰ÙH‰ÞH|$ ¶Q¶ˆAˆHÿÉHÿÆH9ùuéH‹D$H‰E H‹Mº¾L‰÷è?9HÿÈ…uýÿÿ‹D$$‰D$(¶T$+¶D$(ˆD$+ˆT$(¶T$*¶D$)ˆD$*ˆT$)‹D$(‰E(H‹Mº¾L‰çèí8HÿÈ…#ýÿÿ‹D$(‰D$$¶T$'¶D$$ˆD$'ˆT$$¶T$&¶D$%ˆD$&ˆT$%‹D$$‰E,H‹Mº¾L‰÷è›8HÿÈ…Ñüÿÿ‹D$$‰D$(¶T$+¶D$(ˆD$+ˆT$(¶T$*¶D$)ˆD$*ˆT$)‹D$(‰E0H‹Mº¾L‰çèI8HÿÈ…üÿÿ‹D$(‰D$$¶T$'¶D$$ˆD$'ˆT$$¶T$&¶D$%ˆD$&ˆT$%‹D$$‰E4H‹Mº¾L‰÷è÷7HÿÈ…-üÿÿ‹D$$‰D$(¶T$+¶D$(ˆD$+ˆT$(¶T$*¶D$)ˆD$*ˆT$)‹D$(‰E8H‹Mº¾L‰çè¥7HÿÈ…Ûûÿÿ‹D$(‰D$$¶T$'¶D$$ˆD$'ˆT$$¶T$&¶D$%ˆD$&ˆT$%‹D$$‰E’ò\d$`òD$hòd$è¯)òd$òXàòD$8ò\Äè)òL$HòYÈH…Ûtò H…ítòn‰ò\ÁòE1Àé¤úÿÿ1ÀéúÿÿLX‡¹&H¶†1ö¿1ÀèFKþÿ¸érúÿÿLm‡¹GëÓ€€òØŠò*ß1ÿf(ÈòYÊf(ÃòYÂéíùÿÿfD€AWAVAUATUSHìˆI‰üI‰õH‰Õ‰ËL‰D$8L‰L$0L3‡¹³ƒûŽH…Ò„ÖfWÿ1Òf.}ƒLH‰èºò@HƒÀf.øƒ.ÿÂ9ÚuçL‰àºfA.<$Š=…7fD€ò@HƒÀf.Ç…ŠÿÂ9ÚuáLÖ†¹¸H€…1ö¿ 1ÀèJþÿ¸ Hƒ|$8t H‹T$8HÇHƒ|$0t H‹T$0HÇHƒ¼$ÀtH‹”$ÀHÇHƒ¼$ÈtH‹”$ÈHÇHƒ¼$ÐtH‹”$ÐHÇHƒ¼$ØtH‹”$ØHÇHƒ¼$àtH‹”$àHÇHĈ[]A\A]A^A_ÃA‰ÑLá…¹µH›„1ö¿ 1Àè+IþÿéÿÿÿHcÃL4ÅL‰÷ò<$è'I‰ÇH…Àò<$„0H…í„UòUf(ÂòYÂòDΆfA(àò^àòXçHEº„òòYÀfA(Èò^ÈòXáÿÂHƒÀ9Úuáf(ÂòYÂòA4$f(îò^èòXﺸfD€òLÅòYÉòAÄò^ÁòXèÿÂHÿÀ9ÚußòYÒòE]fA(Ûò^ÚòXߺ¸€€òLÅòYÉòADÅò^ÁòXØÿÂHÿÀ9ÚuÞf(Íò^Ìò\ñò^uòA7º¸òAÄò\Áò^DÅòAÇÿÂHÿÀ9ÚuáòD*ÒòAf(ÑòYÑòX×IGºòòYÀòXÐÿÂHƒÀ9ÚuêH…í…·òAYMòXϺ¸fD€òAÇòAYDÅòXÈÿÂHÿÀ9Úuæò^ÊòL$hf(ÁòYÅf(Ëò\Èò^ÌòL$Pf(ÄòYÂòD$@f(ÅòYÅò^D$@òAXÀò^ÄòQÀòD$XòD^ÂòEQÀòDD$`fD(ÍòE^ÊfD(ÃòE^ÂH…í…Ìf(çf(÷f(ß1Ò1ÀDòAÄòA\ÁòALÅòA\Èf(ÐòYÑòXòòYÀòXàòYÉòXÙÿÂHÿÀ9ÚuÄòQäòQÃòYÄòD$HfA(Óò\T$PòD$hòAY$ò\ÐòYÒòX׸ºDòADÕò\D$PòL$hòAY Ôò\ÁòYÀòXÐÿÀHÿÂ9ØuÒH¹ð?H‰L$xƒèò*Àò^ÐòQÂòL$XòYÈòL$XòYD$`òD$`L‰ÿòl$ òt$èj#Hƒ|$8òl$ òt$tòD$PH‹D$8òHƒ|$0tòD$hH‹D$0òHƒ¼$ÀtòD$XH‹„$ÀòHƒ¼$ÈtòD$`H‹„$ÈòHƒ¼$ÐtfW-„ò^l$@H‹„$Ðò(Hƒ¼$Øtò^t$HH‹”$Øò21ÀHƒ¼$à„ŒûÿÿH‹D$xH‹”$àH‰1ÀéuûÿÿfWÿéVúÿÿM‰ñL«N¹»H€1ö¿1Àè©Dþÿ¸é”úÿÿò*ãfD(ÔòA4$f(îòXïID$ºòX(ÿÂHƒÀ9ÚuòòE]fA(ÛòXßIU¸òXÿÀHƒÂ9Øuòf(Íò^Ìò\ñòA7º¸€„òAÄò\ÁòAÇÿÂHÿÀ9ÚuçòDîé?üÿÿf(çf(÷f(ß1Ò1ÀòTÅòYÒòA Äò^ÊòA\ÉòADÅò^ÂòA\Àf(ÑòYÐòXòòYÉòXáòYÀòXØÿÂHÿÀ9Úu²òQäòQÃòYÄòD$HfA(Ûò\\$PòD$hòAY$ò\Øò^]òYÛòXߺ¸òADÅò\D$PòL$hòAY Äò\Áò^DÅòYÀòXØÿÂHÿÀ9ÚuÌHt$xòÖ‚Cþò*À1ÿf(ËòYÊòYÂòl$ òt$èàñÿÿ…Àòl$ òt$„ýÿÿL‰ÿèŠ ¸é¿øÿÿòAYMò^MòXϺ¸òAÇòAYDÅò^DÅòXÈÿÂHÿÀ9ÚuàéFûÿÿ…ö~1Àf.„òÿÀHƒÇ9ðuòóÃ…ö~1Àf.„óÿÀHƒÇ9ðuòóÃ…ö~1Àf.„‰ÿÀHƒÇ9ðuôóÃff(È…ö~1ÀfDòòYÁòÿÀHƒÇ9ðuêóÄ(È…ö~1À€óóYÁóÿÀHƒÇ9ðuêóÄ…ö~1Éf.„‹¯Â‰ÿÁHƒÇ9ñuïóÃfD€f(È…ö~1ÀfDòòXÁòÿÀHƒÇ9ðuêóÄ(È…ö~1À€óóXÁóÿÀHƒÇ9ðuêóÄ…ö~1Àf.„ÿÀHƒÇ9ðuôóÃf…ö~fWÀ1ÀfDòXÿÀHƒÇ9ðuòóÃfWÀÃDfD…ö~WÀ1À€óXÿÀHƒÇ9ðuòóÃWÀÃfDfD1À…ö~1Ò„ÿÂHƒÇ9òuôóÃf…Ò~$1É1À„òÇòXÆòÇÿÁHÿÀ9ÑuèóÃfD…Ò~$1É1À„ó‡óX†ó‡ÿÁHÿÀ9ÑuèóÃfD…Ò~E1À1É€‹ŽAÿÀHÿÁA9ÐuïóÃfD€f(È…Ò~$1É1À@f(ÁòYÆòXÇòÇÿÁHÿÀ9ÑuäóÃf(È…Ò~$1É1ÀD(ÁóY†óX‡ó‡ÿÁHÿÀ9ÑuåóÃ…É~"E1ÉE1ÀfD‰ÐB¯†B‡AÿÁIÿÀA9ÉuêóÄ…ö~E1À1É€H‹ÏH‰ÊAÿÀHÿÁA9ðuíóÃDfD…ö~E1À1É€‹‰ŠAÿÀHÿÁA9ðuïóÃfD€…ö~E1À1É€‹‰ŠAÿÀHÿÁA9ðuïóÃfD€A‰Ñ…Ò~0‹E1À1É;të&fDfD‹T‹DŽHÿÁ9Âu AÿÀE9Èué1ÀøÃA‰Ñ…Ò~$E1À1É@H‹ÏH‹ÎH‰ÏH‰ÎAÿÀHÿÁE9ÈuåóÃA‰Ñ…Ò~ E1À1É@‹‹މ‰ŽAÿÀHÿÁE9ÈuéóÀA‰Ñ…Ò~ E1À1É@‹‹މ‰ŽAÿÀHÿÁE9ÈuéóÀS‰Ó‰ÐÁèDAÑúE1ÛE…Ò~5þÿƒøuÙHƒÄ[]A\A]A^Ã1ÀHƒÄ[]A\A]A^ÃfD€AVAUATUSHƒìI‰þI‰õA‰ÔòD$…Ò~E1í1ÛëDfDÿÅHÿÃD9åt*òT$òALÝòAÞè¾4þÿƒøuÙHƒÄ[]A\A]A^Ã1ÀHƒÄ[]A\A]A^ÃfD€H‰\$ØH‰l$àL‰d$èL‰l$ðL‰t$øHƒì8H‰ýA‰ôòD$I‰ÖH…ÒtÆ1ÛE…äu%‰ØH‹\$H‹l$L‹d$ L‹l$(L‹t$0HƒÄ8ÃDIcÄHÅH‰ßè‘I‰ÅH…Àt}E…ä~H1É1ÒfDfDH‹DÕI‰DÕÿÁHÿÂD9áuìL‰ë1í€òè©òÿÅHƒÃD9åuèL‰òòD$D‰æL‰ïèTóÿÿ‰Ã…Àt M…í„PÿÿÿL‰ïèÃéCÿÿÿH…Û„zÿÿÿI‰ÙLÝ1¹¸H(e1ö¿1ÀèÛ'þÿ»é ÿÿÿH‰\$ØH‰l$àL‰d$èL‰l$ðL‰t$øHƒì8H‰ýA‰ôóD$ I‰ÖH…ÒtÆE…äu'1ÀH‹\$H‹l$L‹d$ L‹l$(L‹t$0HƒÄ8ÀIcÄH…H‰ßèaI‰ÅH…Àt{E…ä~H1É1ÒfDfD‹D•A‰D•ÿÁHÿÂD9áuíL‰ë1í„óèóÿÅHƒÃD9åuèL‰òóD$ D‰æL‰ïè$ñÿÿ…Àt M…í„PÿÿÿL‰ïè•éCÿÿÿH…Ût€I‰ÙL³0¹ÌHþc1ö¿1Àè±&þÿéÿÿÿfDfDAVAUATUSHƒìI‰þA‰ôóóD$ƒþŽOH‰øºó@ó_D$óD$ÿÂHƒÀD9âuäóZD$ò\fòD$L‰õL‰óE1íÇ$뀀AÿÅHƒÃE9åt4ó óZÁf.D$vä(Áó\D$è^óX$ó$AÿÅHƒÃE9åuÌó$èÔóL$óXÈW Õc1ÀóEóXÁóEÿÀHƒÅD9àuç1ÛDóAžèýóAžHÿÃA9ÜçWÉ1ÀfóAX †HÿÀA9ÄòWÀ.ÈztQL‰÷1ÀE…ä~:€€óó^ÁóÿÀHƒÇD9àuéHƒÄ[]A\A]A^Ã…öÐþÿÿHƒÄ[]A\A]A^ÃE…ä~îóA*Äó åbó^ÈL‰÷1ÀfDfDóÿÀHƒÇD9àuñHƒÄ[]A\A]A^Ã@AVAUATUSHƒì I‰þA‰õòòD$ƒþ~+H‰øº€ò@ò_D$òD$ÿÂHƒÀD9êuäf.¬c…¾Џò (cE…펚M‰ôL‰ð1Ò€òòXÁòÿÂHƒÀD9êuéL‰ó1í@òè‰òÿÅHƒÃD9íuèfWÉf(Á1À€€òAX ÆHÿÀA9Åò1Àf.È„±fDòA$ò^ÁòA$ÿÀIƒÄD9èuåHƒÄ []A\A]A^ÃfWÉE…í~ZòD$ò\icòD$L‰ó1ífWÉë ÿÅHƒÃD9ít0òf.D$véò\D$ò $èËò $òXÈÿÅHƒÃD9íuÐf(ÁèDòL$òXÈfW šbéÍþÿÿŠOÿÿÿòA*Åò aò^È€€òA $ÿÀIƒÄD9èuïHƒÄ []A\A]A^Ãÿ%¼ûÿ%¾ûÿ%Àûÿ%Âûÿ%Äûÿ%Æûÿ%Èûÿ%Êûÿ%Ìûÿ%Îûÿ%Ðûÿ%Òûÿ%Ôûÿ%Öûÿ%Øûÿ%Úûÿ%Üûÿ%Þûÿ%àûÿ%âûÿ%äûÿ%æûÿ%èûÿ%êûÿ%ìûÿ%îûÿ%ðûÿ%òûÿ%ôûÿ%öûÿ%øûÿ%úûÿ%üûÿ%þûÿ%üÿ%üÿ%üÿ%üÿ%üÿ% üÿ% üÿ%üÿ%üÿ%üÿ%üÿ%üÿ%üÿ%üÿ%üÿ%üÿ% üÿ%"üÿ%$üÿ%&üÿ%(üÿ%*üÿ%,üÿ%.üÿ%0üÿ%2üÿ%4üÿ%6üÿ%8üÿ%:üÿ%<üÿ%>üÿ%@üÿ%Büÿ%Düÿ%Füÿ%Hüÿ%Jüÿ%Lüÿ%Nüÿ%Püÿ%Rüÿ%Tüÿ%Vüÿ%Xüÿ%Züÿ%\üHMM: %s, seq: %sDecoding overflow on model %s PFAMDBUSAGE: wrapper rFailed to open seq fileCouldn't open file %sCreated %d models %d %s Model %s, score=%f, matches=%d, inserts=%d, deletes=%d, n=%d, s=%d hmm: %d - %d, seq: %d - %d Alignment: %s Pipeline finishedp7_emit_SimpleConsensus() expects a digital-mode emit.cimpossible.impossible state reached during emissionfailed to reach E state properlyp7_emit_FancyConsensus() expects a text-mode Error: FATAL: evalues.cfailed to create RNGfailed to allocate backgroundfailed to allocate profilefailed to create optimized profilefailed to convert to optimized profilefailed to determine msv mufailed to determine vit mufailed to determine fwd taubogus state in tracebackgeneric_optacc.c# %s :: %s http://hmmer.org/April 2012# HMMER %s (%s); %s Copyright (C) 2011 Howard Hughes Medical Institute.Freely distributed under the GNU General Public License (GPLv3).Failed to parse command line: %s To see more help on available options, do %s -h -h Options:Incorrect number of command line arguments.HMM and profile alphabet don't matchmodelconfig.cprofile too small to hold HMMHMM must have a consensus to transfer to the profilefailed to create null modelmodelstats.cfailed to configure profilefailed to reconfig profile lengthfailed to emit sequencefailed to grow the matrixfailed to run Forwardfailed to run bg_NullOne()%s bg model write failedp7_bg.c%c %.5f couldn't open bg file %s for readingpremature end of file [line %d of bgfile %s]expected alphabet type but saw "%s" [line %d of bgfile %s]bg file's alphabet is %s; expected %s [line %d, %s]premature end of file [line %d of bgfile %sexpected to parse a residue letter; saw %s [line %d of bgfile %s]already parsed probability of %c [line %d of bgfile %s]premature end of file, expected a probability [line %d of bgfile %s]expected a probability, saw %s [line %d of bgfile %s]extra unexpected data found [line %d of bgfile %s]expected %d residue frequencies, but found %d in bgfile %sresidue frequencies do not sum to 1.0 in bgfile %s----------%*.*s p7_gmx.cHMM is a null pointerHMM has M < 1HMM has no alphabet referenceHMM's alphabet is set to unknownmat[%d] fails pvector validationins[%d] fails pvector validationt_M[%d] fails pvector validationt_I[%d] fails pvector validationt_D[%d] fails pvector validationTMD should be 0 for last nodeTDM should be 1 for last nodeTDD should be 0 for last nodename is NULL: this field is mandatoryinvalid nseqinvalid eff_nseqp7H_CHKSUM flag down, but nonzero checksum presentp7H_RF flag up, but rf string is invalidp7H_RF flag down, but rf string is presentp7H_MMASK flag up, but mm string is invalidp7H_MMASK flag down, but mm string is presentp7H_CONS flag up, but consensus string is invalidp7H_CONS flag down, but consensus string is presentp7H_CS flag up, but cs string is invalidp7H_CS flag down, but cs string is presentp7H_CA flag up, but ca string is invalidp7H_CA flag down, but ca string is presentp7H_MAP flag up, but map string is nullp7H_MAP flag down, but map string is presentlambda parameter can't be negativecomposition fails pvector validation %5d %9.4f // JXMDISBCTno such statetype code %dp7_hmm.c[random HMM created by sampling]sampled-hmm[HMM with uniform transitions, random emissions][random enumerable HMM created by sampling]fseek failedp7_hmmfile.cNeed an open SSI index to call p7_hmmfile_PositionByKey()hmm binary write failedinvalid HMM file format code* %*s %*.5f%d%f%u%.2f%8.4f%8.5f3.1devHMMER3/f [%s | %s] HMMER3/e [%s | %s; reverse compatibility mode] HMMER3/d [%s | %s; reverse compatibility mode] HMMER3/c [%s | %s; reverse compatibility mode] HMMER3/b [%s | %s; reverse compatibility mode] HMMER3/a [%s | %s; reverse compatibility mode] NAME %s ACC %s DESC %s LENG %d MAXL %d ALPH %s yesnoRF %s MM %s CONS %s CS %s MAP %s DATE %s COM %s [%d] %s [%d] %s NSEQ %d EFFN %f CKSUM %u GA %.2f %.2f TC %.2f %.2f NC %.2f %.2f STATS LOCAL VLAMBDA %f STATS LOCAL VMU %f STATS LOCAL FTAU %f STATS LOCAL MSV %8.4f %8.5f STATS LOCAL VITERBI %8.4f %8.5f STATS LOCAL FORWARD %8.4f %8.5f %c i->mm->dm->im->m %8s %8s %8s %8s %8s %8s %8s d->dd->mi->i %6d %6d %6s %c hmm write failed HMM COMPO HMMER3/fHMMER3/eHMMER3/dHMMER3/cHMMER3/bHMMER3/aHMMER2.0ftello() failedunexpected absence of tokens on data lineDidn't find HMMER3/f tag: bad format or not a HMMER save file?Didn't find HMMER3/e tag: bad format or not a HMMER save file?Didn't find HMMER3/d tag: bad format or not a HMMER save file?Didn't find HMMER3/c tag: bad format or not a HMMER save file?Didn't find HMMER3/b tag: bad format or not a HMMER save file?Didn't find HMMER3/a tag: bad format or not a HMMER save file?No such HMM file format code: this shouldn't happenallocation failure, HMM shellPremature end of lineNAMENo name found on NAME lineACCNo accession found on ACC lineDESCNo description found on DESC lineLENGNo model length found on LENG lineInvalid model length %s on LENG lineMAXLNo max length found on MAXL lineInvalid max length %s on MAXL lineALPHNo alphabet type found on ALPHUnrecognized alphabet type %sFailed to create alphabetAlphabet type mismatch: was %s, but current HMM says %sRFNo yes/no found for RF lineRF header line must say yes/no, not %sMMNo yes/no found for MM lineMM header line must say yes/no, not %sCONSNo yes/no found for CONS lineCONS header line must say yes/no, not %sCSNo yes/no found for CS lineCS header line must say yes/no, not %sMAPNo yes/no found for MAP lineMAP header line must say yes/no, not %sDATENo date found on DATE linestrdup() failed to set dateCOMNo command number on COM lineNo command on COM lineesl_strdup() failedesl_strcat() failedNSEQNothing follows NSEQ tagInvalid nseq on NSEQ line: should be integer, not %sEFFNNothing follows EFFN tagInvalid eff_nseq on EFFN line: should be a real number, not %sCKSUMNothing follows CKSUM tagSTATSToo few fields on STATS lineLOCALMSVVITERBIFORWARDFailed to parse STATS, %s unrecognized as field 3Failed to parse STATS, %s unrecognized as field 2VLAMBDAVMUFTAUGAToo few fields on GA lineTCToo few fields on TC lineNCToo few fields on NC lineHMMMissing one or more STATS parameter linesPremature end of data before main model sectionFailed to allocate body of the new HMMCOMPOToo few fields on COMPO linePremature end of data after COMPO lineToo few fields on insert line, node 0: expected %d, got %d Premature end of data in main model: no node 0 transition lineToo few fields on begin (0) transition linePremature end of data in main model section, at node %d (expected %d)Expected match line to start with %d (of %d); saw %sToo few probability fields on match line, node %d: expected %d, got %d Missing MAP field on match line for node %d: should at least be -Missing CONS field on match line for node %d: should at least be -Missing RF field on match line for node %d: should at least be -Missing MM field on match line for node %d: should at least be -Missing CS field on match line for node %d: should at least be -Premature end of data in main model: no insert emission line, node %dToo few probability fields on insert line, node %d: expected %d, got %d Premature end of data in main model: no transition line, node %dToo few probability fields on transition line, node %d: expected %d, got %d Premature end of data: missing //?//Expected closing //; found %s insteadFailed to set consensus on legacy HMM formatNo NAME found for HMMNo LENG found for HMM (or LENG <= 0)[STDIN]esl_strdup failed; shouldn't happen.gz.gz file %s not found or not readablegzip -dc %swhen setting up .gz pipe: esl_sprintf() failedgzip -dc %s failed; gzip not installed or not in PATH?esl_strdup() failed, shouldn't happen%s.h3mesl_sprintf() failed; shouldn't happenrbesl_strdup() failed; shouldn't happenHMM file %s not found (nor an .h3m binary of it); also looked in %sHMM file %s not found (nor an .h3m binary of it)Opened %s, a pressed HMM file; but no .h3f file foundOpened %s, a pressed HMM file; but no .h3p file foundOpened %s, a pressed HMM file; but no .h3i file foundOpened %s, a pressed HMM file; but format of its .h3i file unrecognizedOpened %s, a pressed HMM file; but its .h3i file is 64-bit and your system is 32-bitOpened %s, a pressed HMM file; but failed to open its .h3i file%s.ssiesl_sprintf() faileda %s.ssi file exists (an SSI index), but its SSI format is not recognizeda %s.ssi file exists (an SSI index), but is 64-bit, and your system is 32-bitesl_ssi_Open() failedFile exists, but appears to be empty?Binary format tag in %s unrecognized Current H3 format is HMMER3/f. Previous H2/H3 formats also supported.Format tag appears binary, but unrecognized Current H3 format is HMMER3/f. Previous H2/H3 formats also supported.internal error in esl_fileparser_Create()internal error in esl_fileparser_SetCommentChar()internal error in esl_fileparser_NextLinePeeked()internal error in esl_fileparser_GetToken()Format tag is '%s': unrecognized. Current H3 format is 'HMMER3/f'. Previous H2/H3 formats also supported.bad magic number at start of HMMno such HMM file format codeallocation failed, HMM shellfailed to read flagsfailed to read model size Mfailed to read alphabet_typeallocation failed, alphabetallocation failed, HMM bodyfailed to read mat[%d]failed to read ins[%d]failed to read t[%d]failed to read namefailed to read accfailed to read descfailed to read rffailed to read mmfailed to read consensusfailed to read csfailed to read cafailed to read comlogfailed to read nseqfailed to read eff_nseqfailed to read max_lengthfailed to read ctimefailed to read mapfailed to read checksumfailed to read statistical paramsfailed to read Pfam score cutoffsfailed to read model compositionDidn't find HMMER3/a tag: not a HMMER save file?nucleic0NULEALPH must precede NULE in HMMER2 save filesToo few fields on NULE linefailed to create background modelFailed to create consensus lineFailed to calibrate HMMER2 model after input conversionmalloc of size %d failedp7_profile.cprofile entry distribution is not normalized properlybad transition %s->%sbad transition %s_%d->%sbad state type %d in tracebacklocal end transition (M%d of %d) in non-local modellocal end transition (D%d of %d) in non-local modeldestination profile is too small to hold a copy of source profilebad transition in tracep7_trace.cbad which < 0not a profile trace?invalid trace: no E for a Binvalid trace: no Mbad state typeno such emitting stateFAILtrace is too shortN of %d isn't sensiblefirst state neither S nor Blast state not Elast state not Tfirst state shouldn't have k setfirst state shouldn't have i setlast state shouldn't have k setlast state shouldn't have i setfirst state doesn't emit; but post prob isn't 0last state doesn't emit; but post prob isn't 0S must be first stateX state (missing data) only appears in core tracesbad transition involving missing data (X state) not at start/endcore trace can't contain Nno N should have k setfirst N shouldn't have i setfirst N can't have nonzero post probexpected i doesn't match trace's ibad transition to N; expected {S,N}->NB shouldn't have k setB shouldn't have i setB can't have nonzero post probbad transition to B; expected {N,J}->Bexpected k doesn't match trace's kbad transition to M; expected {B,M,D,I}->MD shouldn't have i setD can't have nonzero post probbad transition to D; expected {B,M,D}->Dbad transition to D; expected {M,D}->Dbad transition to I; expected {B,M,I}->Ibad transition to I; expected {M,I}->IE shouldn't have k setE shouldn't have i setE can't have nonzero post probbad transition to E; expected {M,D,I}->Ebad transition to E; expected {M,D}->Eno J should have k setfirst J shouldn't have i setfirst J can't have nonzero post probbad transition to J; expected {E,J}->Jcore trace can't contain Cno C should have k setfirst C shouldn't have i setfirst C can't have nonzero post probbad transition to C; expected {E,C}->CT must be last statetrace didn't account for all residues in the sqM=%d, but k went to %d L=%d, but i went to %d realloc for size %d failedno such state; can't append [ trace is NULL ] st k i - traceback len %d -- ---- ---- %1s %4d %6d st k i transit emission postprob - traceback len %d -- ---- ------ -------- -------- -------- %1s %4d %6d %8.4f %8.4f %c %8d- %8s %8s %c -------- -------- -------- total: %8.4f %8.4f can't happenInvalid alphabet type fm_general.cnull pointer when allocating FM configuration %s: Error reading meta data for FM index. unable to allocate memory to store FM meta data readFMError allocating memory in %s %s: Error reading block_length in FM index. %s: Error reading terminal location in FM index. %s: Error reading seq_offset in FM index. %s: Error reading overlap in FM index. %s: Error reading seq_cnt in FM index. %s: Error reading T in FM index. %s: Error reading BWT in FM index. %s: Error reading SA in FM index. %s: Error reading occCnts_b in FM index. %s: Error reading occCnts_sb in FM index. --fm_msv_length--fm_max_depth--fm_max_neg_len--fm_req_pos--fm_sc_ratio--fm_max_scthreshbackward score is NaNfwdback.cbackward score underflow (is 0.0)backward score overflow (is infinity)forward score is NaNforward score underflow (is 0.0)forward score overflow (is infinity)msvfilter.ctrace not empty; needs to be Reuse()'d?optacc.cOA traceback choice failedDP matrix allocated too smallvitfilter.cFast filter only works for local alignmentp7_omx.c%*d NE%*s %*s %*s %*s %*s --------%*s %3d M %*.*f %*.*f %*.*f %*.*f %*.*f %*.*f %3d I %3d D %6d %6s %6s %6s %6s %6s ------%4d M %6d %6d %6d %6d %6d %4d I %4d D %3d %3s %3s %3s %3s %3s ---%3s %3d %3d %3d %3d %3d comparison failed: modecomparison failed: Lcomparison failed: Mcomparison failed: njcomparison failed: alphabet typecomparison failed: rb[%d] elem %dcomparison failed: tbm_bcomparison failed: tec_bcomparison failed: tjb_bcomparison failed: scale_bcomparison failed: base_bcomparison failed: bias_bcomparison failed: rw[%d] elem %dcomparison failed: tw[%d] elem %dcomparison failed: xw[%d][%d]comparison failed: scalecomparison failed: basecomparison failed: ddbound_wcomparison failed: rf[%d] elem %dcomparison failed: tf[%d] elem %dcomparison failed: xf[%d] vectorcomparison failed: offs[%d]comparison failed: namecomparison failed: acccomparison failed: desccomparison failed: refcomparison failed: mmcomparison failed: cscomparison failed: consensuscomparison failed: evparam vectorcomparison failed: cutoff vectorcomparison failed: compo vectorDump of a :: -- float part, odds ratios for Forward/Backward: (%c): [ xx mat: tBM: tMM: tIM: tDM: tMD: tMI: tII: tDD: E->C: %*.*f E->J: %*.*f N->B: %*.*f N->N: %*.*f J->B: %*.*f J->J: %*.*f C->T: %*.*f C->C: %*.*f Q: %d M: %d -- sword part, log odds for ViterbiFilter(): %6s E->C: %6d E->J: %6d N->B: %6d N->N: %6d J->B: %6d J->J: %6d C->T: %6d C->C: %6d scale: %6.2f base: %6d bound: %6d Q: %6d M: %6d -- uchar part, log odds for MSVFilter(): %4d %4s t_EC,EJ: %4d t_NB,JB,CT: %4d t_BMk: %4d scale: %.2f base: %4d bias: %4d Q: %4d M: %4d p7_oprofile.calphabets of the two profiles don't matchoprofile is too smalloptimized profile is too small to hold conversionfm.cError allocating memory in initGlobals w+bFatal exception (source file %s, line %d): system erroreasel.cunexpected getcwd() errorvsnprintf() failedinput char mapped to eslDSQ_SENTINELinput char mapped to eslDSQ_EOLinput char mapped to eslDSQ_EODbad inmap, no such ESL_DSQ code0x0X%s%c%snull file%s%sTMPDIRTMP/tmpmkstemp() failed.fdopen() failed.unlink() failed.Usage: %s %s write failedh3.1dev# Easel %s (%s) Copyright (C) 2010 Howard Hughes Medical Institute.# %s Freely distributed under the Janelia Farm Software License.# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EFIJLOPQZACGDHKMRSVWY%lld invalid chars (including %c at pos %lld)dicecustomunknownRNADNAaminocoinsno such alphabet type code %d esl_alphabet.crnadnano such degenerate charactercan't redefine all-degenerate char %cchar %c isn't in expected position in alphabetno such base charactercan't map degeneracy to noncanonical charactersymbol %c is already in internal alphabet, can't equivalence itchar %c not in the alphabet, can't map to itsymbols %c and %c map differently already (%c vs. %c)alphabet length != KpKp too small in alphabetACGU-RYMKSWHBVDN*~AGCUACGUCGAUACUCGUAGUalphabet isn't nucleic: no complementarity to setACGT-RYMKSWHBVDN*~CTGTATACTCGTAGTACDEFGHIKLMNPQRSTVWY-BJZOUX*~NDILQEKHT-X*~123456-X*~bad alphabet type: unrecognizedMixture Dirichlet: N=%d K=%d q[%d] %f alpha[%d][%d] %f %d %d mixture dirichlet write failedesl_dirichlet.c%.3f cvec's K != mixture Dirichlet's KlogP is NaNdp for pq[%d] is NaNdp for alpha[%d][%d] is NaNBad vector size %.32sBad mixture number %.32sbad mixture coefficient %.32sDirichlet params must be positive, got %.32sRepetition # %d ------------ llk = %.3f (vs best = %.3f) ... so copy md -> best_md ---------------- best mixture: llk = %.3fempty data vector provided for exponential fitesl_exponential.ccan't fit true censored dataset%f %g exponential plot write failed esl_fileparser.cesl_strtok() failednextline() failedHelp line too longesl_getopts.c%*s%s : %s [%s] (%s)%s %s %s --Abbreviated option "%.24s" is ambiguous.Option %.24s requires an argument.Arg looks like option? Use %.24s=%.24s if you really mean it.Option %.24s does not take an argument.No such option "-%c".Arg looks like option? Use %.24s%.24s if you really mean it.Option %.24s requires an argumentNo such option "%.24s".argv[0]: %s argument %2d (argv[%2d]): %s Set bySettingOption%12s %12s %9s ------------ ------------ --------- %-12s offon(default) cmdline environ cfgfile option %s does not take a string argno such option %s option %s does not take a char argoption %s does not take a real-valued argoption %s does not take an integer argoption %s is not a booleanOption %.24s (set by cfg file %d) requires (or has no effect without) option(s) %.24sOption %.24s (set by env var %s) requires (or has no effect without) option(s) %.24sOption %.24s requires (or has no effect without) option(s) %.24s,something's wrong with format of optlist: %s Option %.24s (set by cfg file %d) is incompatible with option(s) %.24sOption %.24s (set by env var %s) is incompatible with option(s) %.24sOption %.24s is incompatible with option(s) %.24son cmdlinein envas defaultOption %.24s takes integer arg; got %.24s %sOption %.24s takes real-valued arg; got %.24s %sOption %.24s takes char arg; got %.24s %soption %s takes a string arg that can't be range checkedno such argument typeoption %.24s takes integer arg in range %.24s; got %.24s %sOption %.24s takes real-valued arg in range %.24s; got %.24s %sOption %.24s takes char arg in range %.24s; got %.24s %sin cfgfileOption %.24s has already been set %s.Options %.24s and %.24s conflict, toggling each other. Parse failed at line %d of cfg file %.24s (saw %.24s, not an option) "Parse failed at line %d of cfg file %.24s (saw %.24s, not a comment) %.24s is not a recognized option (config file %.24s, line %d) cannot process more than one spoofed command lineoption %d didn't start with '-'; you may have forgotten to NULL-terminate the ESL_OPTIONS arrayFailed to bracket root in esl_gumbel_FitCensored().esl_gumbel.cEven bisection search failed in esl_gumbel_FitCensored().Failed to bracket root in esl_gumbel_FitComplete().Even bisection search failed in esl_gumbel_FitComplete().gumbel plot write failed& esl_hmm.cminimum not finiteesl_minimizer.cFailed to bracket a minimum.type = knuth state = %u seed = %u type = mersenne twister mti = %d (0..623) mt[mti] = %u %6d: %11u %6d: esl_random.cunreached code is reached. universe goes foomunreached code was reached. universe collapses.String contains unexpected residue codesesl_randomseq.cdsq contains unexpected residue codeshey, you didn't end on s_f.hey, i (%d) overran L+1 (%d).String contains nonalphabetic charactershey, pos (%d) != len (%d).tried to take reverse complement of a non-nucleic sequenceesl_sq.csq has no text sequenceesl_sq_ConvertDegen2X() only works on digital sequencessq has no digital sequencesq has no digital alphabetss, seq lengths mismatchmsa is digital, sq is notmsa is text, sq is not-_.~seq objects involved in Copy differ in digital alphabet[%13.8g, %13.8g, %13.8g, %13.8g]invalid file numberesl_ssi.cinvalid bpl or rplno such file numberwFailed to open primary key tmpfile for external sortFailed to open secondary key tmpfile for external sort%s %u %llu %llu %lu ssi key tmp file write failed%s %s ssi alias tmp file write failedinvalid fhexceeded maximum number of primary keys allowed%s %d %llu %llu %lli exceeded the maximum number of files an SSI index can store.1.2exceeded maximum number of secondary keys allowedenv LC_ALL=POSIX sort -o %s %s tmpfile name too longexternal sort of primary keys failedfailed to reopen primary key tmp file after sortexternal sort of secondary keys failedfailed to reopen secondary key tmp file after sortssi write failedread from sorted primary key tmpfile failed parse failedread from sorted secondary key tmpfile failedparse failed for a line of sorted primary key tmpfile failedparse failed for a line of sorted secondary key tmpfile failedoffsets must be 32 or 64 bitsinvalid x <= 0 in esl_stats_Psi()esl_stats.cinvalid x <= 0 in esl_stats_LogGamma()esl_stats_IncompleteGamma(): a must be > 0esl_stats_IncompleteGamma(): x must be >= 0esl_stats_IncompleteGamma(): fraction failed to convergeesl_stats_IncompleteGamma(): series failed to convergen must be > 2 for linear regression fittingsigma[%d] <= 0all x[i] are 0.value %d is not a probability between 0..1vector does not sum to 1.0 %c %8d %c %10d %10.6f esl_vectorops.c{®Gáz”?ü©ñÒMbP?ñh㈵øä>ï9úþB.æ?{®Gáz”?ü©ñÒMbP?ñh㈵øä>Àÿß@ ×£p= ÷?{®Gáz¤?€833{AzD@@@@@@•Ö&è .>ï9úþB.ö?€?>oƒ:€¿ð?fff?·Ñ8€HÇ<жF?€ÿ@F€€à7yÃACÿÿÿ€ÿÿÿ€€€€€€€€€€€€€€€€@€ÿ€ÿ€ÿ€ÿ€€ÿÿÿÿ€€€€€€€€€ðÿCþÿFÇ€?r1¿Ð?UUUUUUUUUUUUUUUUðÀíµ ÷ư>$@€ÿÿÿÿÿÿÿ@-DTû! @›Ó–xâ¿-Cëâ6?ð¿ø:Œ0âŽy5>Y@à?I@ÙÎ÷Sãù?b- ‘!rØ?:Œ0âŽyE>»½×Ùß|Û= çÃÔ¤?œA2Ó¬"¤? ܺ›§:¤?´­E[¤?§˜½K-„¤?Ιž¶¤?Õ}¾5Éò¤?:‰ÎS™9¥?óóSÚê‹¥?¿“?­Üê¥?ÞmbqÍW¦?ú?MNiÔ¦?¶¯,f¾b§?È»<V¨?,ÐY¿¨?ñ­8j¿”©?}qq–Šª?Ètl-a§«?mwͳ«ó¬?'>-õâz®?LøkÓT&°?ÀÁjn}?±?\ç=䘲?çJ-)±J´?ú7ÜR{¶?sovRük¹?h˹W•½?yß!ÁùÁ?Þd Œ«€Ç?ñâ†)ÛÑ?>Dþôúnæ?9ÇF%I?Z˜fÛåb?©×¬M o?•ÿ!á¡Fv?(]ŸÞ1á|?\9* µÕ?$âóX…?rpe`O‰?f÷äa¡ÖŒ?¼„ØÓíp?xkO¬–’?PëOEžâ”?]›tø÷[—?Ǭj‹c š?ƒêQ~sûœ?™Ó†?š ?.óëÁƒê¡?!¾1ãñ£? 륭:@¦?P0Qcç¨?ÄAßitÿ«?ˆöÒÈ©¯?þ¬àT÷ ²?$é?Å´?ÞÊ3«N9¸?WhÖ³¿¼?ü6ÄxÁ?‘J ]äùÅ?¤XÉ"Í?™-Yá&Õ?ŒÕ‹Fãµâ?hþ=4àÐ?B@¾„ Ï?™dßÌ?(‰ÛWÔË?}•—É?”AÿNÈ?ý›)c2Ç?£Å’8Æ?Ì L[Å?+ç{ü”Ä?³Áx¼âÃ?ßg@Ã?`³·ï¬Â?ÚæÆô„%Â?Ê—4ǨÁ?V‘c5Á?Áz’*@ÊÀ?Á6âÉnfÀ?ù§¯B% À?’¢mc¿?òÁ! ¿¾? àîQ$¾? Ì0’½?ÓŠÊáî½?2¤/)ㄼ?ÒH•r¼? ™«rã¤?iðŒðÕ´?õ-sº,&¾?ÊçËÁ"Ä?¡I‹:É?Yqo£\Î?0qšô­ÅÑ?Zä‚–dÔ?#¾³^ ×?Ã4w¾Ù? Äv|Ü?’ŸCÏHß?@Ð8±á?ßïa@@ˆâ? Ý!Å ä?ቢk•å?Ýd¯Ò8/ç?´ØÜ‡rØè?¿O˜‹“ê?5>8Dcì?VnX Lî?·—4Fë(ð?óªÎj=ñ?çÇ_ZÔgò?k{¡€­ó?ÇJ̳’õ?ßÞ5èK¯ö?…µ1v‹ø?î v¦Ðú?gÓÀÍý?B`åÐ";@ß°™ð=@@?@B`åÐ";@iW‹ ¿@(@€?€?€?€?????€€€€€€€€ÿÿ€ÿÿ€ÿÿ€ÿÿ€~~~~ó5?ó5?ó5?ó5?»!=»!=»!=»!=¸Ñ뽸Ñ뽸Ñ뽸Ñë½%ï=%ï=%ï=%ï=O]þ½O]þ½O]þ½O]þ½¿é>¿é>¿é>¿é>P®*¾P®*¾P®*¾P®*¾¬ÎL>¬ÎL>¬ÎL>¬ÎL>üÿ¾üÿ¾üÿ¾üÿ¾ªªª>ªªª>ªªª>ªªª>ƒ€^¹ƒ€^¹ƒ€^¹ƒ€^¹€1?€1?€1?€1?r±Br±Br±Br±BÐŽÎÂÐŽÎÂÐŽÎÂÐŽÎÂ;ª¸?;ª¸?;ª¸?;ª¸?giP9giP9giP9giP9ÎC·:ÎC·:ÎC·:ÎC·:‰<‰<‰<‰<Á©*=Á©*=Á©*=Á©*=ªª*>ªª*>ªª*>ªª*>!@¶oüŒxâ?à¿UUUUUUµ¿?AAp¿&@ZûRÊÐ3á=CÕ h.¿&4&³œÒ?âfõ©1?À0nK¯t‹@@RqÑËÀÂÀôåRÚ¾‘è@e…ðÑkôÁz‡§G5 A ã*ä ÁÆå#µ9ìæ@lHÈñgí?H¯¼šò×z>/lîdG÷¿/lîdG÷?€L)’ASÿ%’héæÿÿÿháéÜÿÿÿhðéÒÿÿÿhÿéÈÿÿÿhé¾ÿÿÿhé´ÿÿÿh%éªÿÿÿh@é ÿÿÿhMé–ÿÿÿh[éŒÿÿÿh!é‚ÿÿÿhkéxÿÿÿhzénÿÿÿh‰édÿÿÿhšéZÿÿÿhªéPÿÿÿh¿éFÿÿÿhÒé<ÿÿÿh6é2ÿÿÿh}é(ÿÿÿhléÿÿÿh]éÿÿÿhMé ÿÿÿh=éÿÿÿh-éöþÿÿhéìþÿÿhéâþÿÿhšéØþÿÿhéÎþÿÿh€éÄþÿÿhréºþÿÿh`é°þÿÿhNé¦þÿÿhÂéœþÿÿh³é’þÿÿh¦éˆþÿÿhìé~þÿÿhùétþÿÿhéjþÿÿhé`þÿÿh$éVþÿÿh3éLþÿÿhAéBþÿÿhOé8þÿÿh^é.þÿÿhlé$þÿÿhøéþÿÿh˜éþÿÿhŠéþÿÿh|éüýÿÿhìéòýÿÿhÞéèýÿÿhÏéÞýÿÿhÓéÔýÿÿhÂéÊýÿÿh³éÀýÿÿh¥é¶ýÿÿh˜é¬ýÿÿhÀé¢ýÿÿh°é˜ýÿÿh¡éŽýÿÿh‘é„ýÿÿh‚ézýÿÿhsépýÿÿhdéfýÿÿhŒé\ýÿÿhÑéRýÿÿhàéHýÿÿhïé>ýÿÿhÿé4ýÿÿhé*ýÿÿhé ýÿÿh-éýÿÿh<é ýÿÿhKéýÿÿhàéøüÿÿhÓéîüÿÿhÃéäüÿÿhµéÚüÿÿh¨éÐüÿÿhWéÆüÿÿ(¼¼0 ` ` ````0 `` ``` ````` `( ``$`&ÔÔñ¿Ô ¬¼!ð  àÀÀ"P$`&P'À*01 °2Hp4P7à<G0=ÀC €EPI`Q%°V ð^Ðl`mF@n oðopp q  q'ðy {ð𠀂€… à‡`ˆ‰@‰EŠ"ðŠP‹Œ`‘ ‘À‘•Е°œМàž0Ÿ€¡à£À¤ ª Ю0±²°²@µp¶p¸¹й»0¼¿°ÅPÇÊ ðÌÍ ðÒ PÖ `ÙpÙÀÙ!PÛ€ãPä&Ð÷àø @`  @+ P,€8À8 DÀZ0[ \^À^pc0e  ilðloðo ðsðuÀv xÐy p|‡Ї0ˆ0ŒpŒ° ‘à’0” –`—М ¡ ¡ ¢£0¤°¤°ª °°±€³`µ¶à¶¸ p¹ÀºD¼'PưÆp̰ÌpÎpÏWC {Bp¦AÀØ@?€> )€- 2=Ð;< >Ð>ÐF @L QR`U€Y0Z[%p_`cÀŽ`˜@™; ·¸º@º!»€» @Æ#`Ç Ç €ÍP×0Û:pÝ@â€â°â`ãÀã@ä0åÐå9æÐæ8ç7àèàé àë6pìpí °ñôöp÷àù 0üÐÿ   ÐàP @ @`à€PÀP p` P! "À$ 7p9"Ð9 0:À: ;À; < 0=ð>@ B°B5 D°F pH€L0Q S VÀZP[\°] ð^$à_`aPaaàa`b°bÀbàb c d@fàh`jÀj k l€nÀn xÐx °y P~†PŠ ‹  ’P—З@˜Àš°œ`Ÿ`¡ ¡4À¢3À£¥20¦1€§0¨0P© ª Ъ®°±$ ² ³P³  ³ ¶¶ж·@¹à¹ м  ¿Â ÀİÅÉðÉ Ì/ÀÚÐÚ`ÜpÜÐßá€á è€ô#Ðø.ÀÿP°Ð à € à P Ð &€ ð`à- p0°$`$ð$0&'P(,à.+€/ 1 3p3 8€8Ð9 :0: ð=0@ÀC°F0HJPMMÐO@PÀPPSpS VÐX0[^ð_bpcÐc dd epe Ðe`f Àf0g °g@h hi*ð€ ‚ p‡Ј ð‘p“Д)€–(pœ œ¥€©Ъ °À±°³à³Pµ°µàµж·P¸à¸P¹ м½ÀžÄ`²` 0$`ø `. `0 `  ÑX `P` `,`*`2`]`)`` 0  zRx $HÜùÿÿÿÿÿaƒ$DÜùÿÿÿÿÿ2ƒTl¨Üùÿÿÿÿÿw (08`ƒ†ŒŽ$ÄÐÞùÿÿÿÿÿ´ Œ†ƒTìhßùÿÿÿÿÿ¢ (08 ƒ†ŒŽ$DÀäùÿÿÿÿÿ/ƒLlÈäùÿÿÿÿÿó (0Pƒ†ŒŽD¼xçùÿÿÿÿÿ† (0ƒ†ŒTÀèùÿÿÿÿÿ (08`ƒ†ŒŽzRx $`êùÿÿÿÿÿè0Œ†ƒ,D(ëùÿÿÿÿÿa"PŽŒ†ƒTthîùÿÿÿÿÿj (08Àƒ†ŒŽ$Ì€ôùÿÿÿÿÿ€@Œ†ƒzRx 4ÀõùÿÿÿÿÿØðƒŒ4ThöùÿÿÿÿÿØðƒŒzRx TøöùÿÿÿÿÿÝ (08Àƒ†ŒŽTt€ùùÿÿÿÿÿÆ (08 ƒ†ŒŽTÌøûùÿÿÿÿÿ¶ (08 ƒ†ŒŽ$$`þùÿÿÿÿÿL Œƒ,Lˆþùÿÿÿÿÿ%°ŽŒ†ƒzRx TÐúÿÿÿÿÿ¹ (08€ƒ†ŒŽTt8úÿÿÿÿÿÐ (08°ƒ†ŒŽzRx T˜ úÿÿÿÿÿ (08Àƒ†ŒŽTtPúÿÿÿÿÿK (08ðƒ†ŒŽTÌHúÿÿÿÿÿä (08pƒ†ŒŽzRx TÈúÿÿÿÿÿA (08pƒ†ŒŽTtÀúÿÿÿÿÿØ  (08Ѓ†ŒŽzRx 0+úÿÿÿÿÿŽ<< +úÿÿÿÿÿÖ 0ƒŒ,|@,úÿÿÿÿÿ^"@ŽŒ†ƒzRx X-úÿÿÿÿÿG4<ˆ-úÿÿÿÿÿ~ ƒ†tÐ-úÿÿÿÿÿ®0zRx 4H.úÿÿÿÿÿ€0ƒŒ,T.úÿÿÿÿÿO%°ŽŒ†ƒ4„°6úÿÿÿÿÿ‡0ƒŒ4¼7úÿÿÿÿÿˆ0ƒŒzRx TH7úÿÿÿÿÿÙ (08€ƒ†ŒŽTtÐ;úÿÿÿÿÿú (08`ƒ†ŒŽDÌx=úÿÿÿÿÿ‚ (@ƒ†ŒTÀ=úÿÿÿÿÿù (08°ƒ†ŒŽTlh@úÿÿÿÿÿU (08pƒ†ŒŽ<ÄpBúÿÿÿÿÿ| 0ƒ†Œ<°Búÿÿÿÿÿ’ @ƒ†ŒzRx øBúÿÿÿÿÿ7,<CúÿÿÿÿÿÉPŽŒƒ4l¸CúÿÿÿÿÿÔ@ƒŒ,¤`Dúÿÿÿÿÿ] ƒ4ÔDúÿÿÿÿÿ½ ƒ†Œ, EúÿÿÿÿÿC%ŽŒ†ƒ$<8Júÿÿÿÿÿ2ƒdPJúÿÿÿÿÿ4„PJúÿÿÿÿÿ0 ƒ†Œ$¼HKúÿÿÿÿÿG Œ†ƒ4äpLúÿÿÿÿÿP ƒ†ŒzRx pMúÿÿÿÿÿ"<€MúÿÿÿÿÿT\pMúÿÿÿÿÿÖ (08 ƒ†ŒŽ´øSúÿÿÿÿÿ TÔøSúÿÿÿÿÿ  (08Pƒ†ŒŽ$,°UúÿÿÿÿÿBƒ,TØUúÿÿÿÿÿF"`ŽŒ†ƒT„øWúÿÿÿÿÿU (08Pƒ†ŒŽzRx èYúÿÿÿÿÿÛL<¨ZúÿÿÿÿÿÓ (0@ƒ†ŒŽ$Œ8`úÿÿÿÿÿ)@Œ†ƒT´@dúÿÿÿÿÿT (08@ƒ†ŒŽ4 HfúÿÿÿÿÿÙ ƒ†Œ<Dðfúÿÿÿÿÿ™ 0ƒ†Œ„Pgúÿÿÿÿÿ ¤@húÿÿÿÿÿu$Ä iúÿÿÿÿÿ"ƒLì¨júÿÿÿÿÿô (0@ƒ†ŒŽ4<Xlúÿÿÿÿÿ ƒ†Œ$t°lúÿÿÿÿÿÍ0Œ†ƒ$œXmúÿÿÿÿÿ.0Œ†ƒ$Ä`núÿÿÿÿÿ$ƒDìhoúÿÿÿÿÿ” (0ƒ†Œ$4Àoúÿÿÿÿÿþ0Œ†ƒ$\˜púÿÿÿÿÿ.0Œ†ƒT„ qúÿÿÿÿÿw (08Pƒ†ŒŽ,ÜÈrúÿÿÿÿÿ."PŽŒ†ƒ4 Èwúÿÿÿÿÿ’ ƒ†ŒTD0yúÿÿÿÿÿ¯ (08@ƒ†ŒŽTœˆ{úÿÿÿÿÿë (08pƒ†ŒŽ<ô ~úÿÿÿÿÿš 0ƒ†ŒD4€~úÿÿÿÿÿ\ (0ƒ†ŒŽT|˜ƒúÿÿÿÿÿT (08€ƒ†ŒŽTÔ †úÿÿÿÿÿ  (08pƒ†ŒŽzRx @‰úÿÿÿÿÿ $<0‰úÿÿÿÿÿEƒ$dX‰úÿÿÿÿÿª0†ƒ4Œà‰úÿÿÿÿÿÕ0ƒ†,ĈŠúÿÿÿÿÿ$@ŽŒ†ƒ$ôˆ’úÿÿÿÿÿÄ Œ†ƒT0“úÿÿÿÿÿz (08 ƒ†ŒŽ4tX¦úÿÿÿÿÿ  ƒ†,¬0§úÿÿÿÿÿ["pŽŒ†ƒ$Ü`¶úÿÿÿÿÿDƒ$ˆ¶úÿÿÿÿÿƒ$,0·úÿÿÿÿÿÀ@Œ†ƒTTȹúÿÿÿÿÿ (08àƒ†ŒŽ$¬Øúÿÿÿÿÿ@Œ†ƒ,ÔxÙúÿÿÿÿÿ. % ŽŒ†ƒxåúÿÿÿÿÿ $håúÿÿÿÿÿ DXåúÿÿÿÿÿ dHåúÿÿÿÿÿ ,„8åúÿÿÿÿÿÚ "`ŽŒ†ƒT´èðúÿÿÿÿÿ (08Àƒ†ŒŽzRx ˜ûÿÿÿÿÿ7<¸ûÿÿÿÿÿ\¸ûÿÿÿÿÿ$|¨ûÿÿÿÿÿX@Œ†ƒ$¤àûÿÿÿÿÿ²ƒ$Ìxûÿÿÿÿÿ¹ƒ4ô ûÿÿÿÿÿ§ ƒ†ŒT,ˆ ûÿÿÿÿÿ£ (08@ƒ†ŒŽT„à ûÿÿÿÿÿ± (08`ƒ†ŒŽ$ÜHûÿÿÿÿÿl@Œ†ƒ$ûÿÿÿÿÿê0Œ†ƒ$,XûÿÿÿÿÿU †ƒzRx xûÿÿÿÿÿ<xûÿÿÿÿÿ9\˜ûÿÿÿÿÿ$|¨ûÿÿÿÿÿˆ,œûÿÿÿÿÿÓƒ†TÌÈûÿÿÿÿÿó (08pƒ†ŒŽD$pûÿÿÿÿÿþ (0ƒ†Œl(ûÿÿÿÿÿÇ4ŒØûÿÿÿÿÿÖ ƒ†ŒTÄ€ ûÿÿÿÿÿ+ (08`ƒ†ŒŽDX!ûÿÿÿÿÿ˜ (@ƒ†Œ,d°#ûÿÿÿÿÿ™ "`ŽŒ†ƒ$” .ûÿÿÿÿÿ²ƒD¼¸.ûÿÿÿÿÿU (0ƒ†Œ,Ð.ûÿÿÿÿÿþ"@ŽŒ†ƒ4 2ûÿÿÿÿÿT 2ûÿÿÿÿÿ$t 2ûÿÿÿÿÿé Œ†ƒ$œh4ûÿÿÿÿÿK Œ†ƒ$Ä5ûÿÿÿÿÿêƒ4ìX7ûÿÿÿÿÿ9 ƒ†Œ$$`8ûÿÿÿÿÿLƒ$Lˆ9ûÿÿÿÿÿÃ@Œ†ƒ$t0;ûÿÿÿÿÿZ0Œ†ƒTœh<ûÿÿÿÿÿp (08ƒ†ŒŽTô€AûÿÿÿÿÿH (08pƒ†ŒŽzRx `Eûÿÿÿÿÿ{<ÀEûÿÿÿÿÿq$\ Fûÿÿÿÿÿhƒ$„hFûÿÿÿÿÿlƒ$¬°Fûÿÿÿÿÿ. Œ†ƒ4Ô¸Gûÿÿÿÿÿw ƒ†D Hûÿÿÿÿÿø (0ƒ†ŒTT¸Mûÿÿÿÿÿã (08`ƒ†ŒŽ4¬PSûÿÿÿÿÿ  ƒ†Tä(Tûÿÿÿÿÿ  (08@ƒ†ŒŽ,<àTûÿÿÿÿÿµ"@ŽŒ†ƒ,lpUûÿÿÿÿÿÍ"PŽŒ†ƒ,œVûÿÿÿÿÿ"PŽŒ†ƒ$ÌðVûÿÿÿÿÿžƒ,ôhWûÿÿÿÿÿÔƒ†T$Xûÿÿÿÿÿ" (08Pƒ†ŒŽT|ðXûÿÿÿÿÿ` (08€ƒ†ŒŽzRx 4àYûÿÿÿÿÿK ƒ†Œ<TøZûÿÿÿÿÿÎ (ƒ†ŒzRx Tp\ûÿÿÿÿÿ²  (08°ƒ†ŒŽtØeûÿÿÿÿÿ" ”èeûÿÿÿÿÿ% T´øeûÿÿÿÿÿº (08€ƒ†ŒŽ `kûÿÿÿÿÿ,`kûÿÿÿÿÿzRx THkûÿÿÿÿÿ· (08Ѓ†ŒŽ4t°lûÿÿÿÿÿý ƒ†L¬xmûÿÿÿÿÿ) (08ƒ†ŒŽLüXoûÿÿÿÿÿ· (08ƒ†ŒŽLLÈrûÿÿÿÿÿ3 (08ƒ†ŒŽLœ¸wûÿÿÿÿÿb (08ƒ†ŒŽLìØ~ûÿÿÿÿÿ  (08ƒ†ŒŽL<˜ˆûÿÿÿÿÿ4  (08ƒ†ŒŽLŒˆ•ûÿÿÿÿÿ¹ (08ƒ†ŒŽLÜø¥ûÿÿÿÿÿÞ (08ƒ†ŒŽL,ˆºûÿÿÿÿÿe (08ƒ†ŒŽL|¨Óûÿÿÿÿÿš (08ƒ†ŒŽTÌøñûÿÿÿÿÿ$ (08hƒ†ŒŽT$0üÿÿÿÿÿÍ* (08ˆƒ†ŒŽT|¨@üÿÿÿÿÿB2 (08ȃ†ŒŽTÔ rüÿÿÿÿÿ8: (08胆ŒŽzRx Tp¬üÿÿÿÿÿü  (08ƒ†ŒŽ,t¶üÿÿÿÿÿs"@ŽŒ†ƒzRx ,P¸üÿÿÿÿÿ %ÐŽŒ†ƒLL@ÂüÿÿÿÿÿÓ (08ƒ†ŒŽzRx ,¸Åüÿÿÿÿÿ“%ŽŒ†ƒ,L(Êüÿÿÿÿÿ¥ %àŽŒ†ƒzRx TÓüÿÿÿÿÿÍ (08Hƒ†ŒŽtÖüÿÿÿÿÿ”ÖüÿÿÿÿÿT´øÕüÿÿÿÿÿü (08àƒ†ŒŽT  Ýüÿÿÿÿÿm (08€ƒ†ŒŽTd¸âüÿÿÿÿÿ_ (08Ѓ†ŒŽ$¼ÀçüÿÿÿÿÿbƒTäèüÿÿÿÿÿD (08Pƒ†ŒŽ,<ëüÿÿÿÿÿ"`ŽŒ†ƒzRx Øîüÿÿÿÿÿ<Øîüÿÿÿÿÿ4\HïüÿÿÿÿÿÜ ƒ†ŒT”ðïüÿÿÿÿÿY (08ðƒ†ŒŽTìøóüÿÿÿÿÿå (08`ƒ†ŒŽTDõüÿÿÿÿÿô (08`ƒ†ŒŽ,œ8÷üÿÿÿÿÿ? %ÀŽŒ†ƒTÌHýÿÿÿÿÿ  (08Àƒ†ŒŽ$$"ýÿÿÿÿÿBƒ$L8#ýÿÿÿÿÿGƒTt`#ýÿÿÿÿÿ& (08Pƒ†ŒŽ4Ì8+ýÿÿÿÿÿ¨ ƒ†,°+ýÿÿÿÿÿ]%€ŽŒ†ƒ44àIýÿÿÿÿÿç ƒ†,l˜Jýÿÿÿÿÿs"`ŽŒ†ƒœèKýÿÿÿÿÿ#4¼øKýÿÿÿÿÿ¶0ƒ†$ô€Lýÿÿÿÿÿ †ƒTØLýÿÿÿÿÿ³  (08pƒ†ŒŽzRx 4(Wýÿÿÿÿÿ@ƒ†$TXýÿÿÿÿÿ6ƒT|(Xýÿÿÿÿÿà (08€ƒ†ŒŽTÔ°]ýÿÿÿÿÿÆ  (08ƒ†ŒŽL,(gýÿÿÿÿÿÜ (0Pƒ†ŒŽ,|¸jýÿÿÿÿÿÀƒ,¬¨kýÿÿÿÿÿÀƒzRx €lýÿÿÿÿÿ<plýÿÿÿÿÿ \`lýÿÿÿÿÿ|Plýÿÿÿÿÿœ@mýÿÿÿÿÿ&¼Pnýÿÿÿÿÿ&Ü`oýÿÿÿÿÿ&üppýÿÿÿÿÿ:pýÿÿÿÿÿ*T< pýÿÿÿÿÿ¨ (08Pƒ†ŒŽD”øpýÿÿÿÿÿU (0ƒ†Œ$Üqýÿÿÿÿÿw Œ†ƒDhqýÿÿÿÿÿ› (0ƒ†ŒDLÀqýÿÿÿÿÿM (0ƒ†ŒT”Èqýÿÿÿÿÿ– (08Pƒ†ŒŽ$ìrýÿÿÿÿÿ* ,rýÿÿÿÿÿÎ"@ŽŒ†ƒ,D¸rýÿÿÿÿÿºàƒ$tHsýÿÿÿÿÿAðŒ†ƒDœptýÿÿÿÿÿú (0ƒ†Œ,ä(uýÿÿÿÿÿò"pŽŒ†ƒ$øvýÿÿÿÿÿà$<`wýÿÿÿÿÿùƒ,d8xýÿÿÿÿÿQ0ŽŒ†ƒ,”hyýÿÿÿÿÿ20ŽŒ†ƒDÄxzýÿÿÿÿÿ™ (0ƒ†ŒŽ Ð{ýÿÿÿÿÿÓ,|ýÿÿÿÿÿ‰L}ýÿÿÿÿÿÓlÀ}ýÿÿÿÿÿŠ$Œ0~ýÿÿÿÿÿ”ƒ$´¨ýÿÿÿÿÿ^ƒTÜàýÿÿÿÿÿÚ (08Pƒ†ŒŽD4h€ýÿÿÿÿÿÓ (0ƒ†Œ$|‚ýÿÿÿÿÿƒ0Œ†ƒ,¤h‚ýÿÿÿÿÿI0ŽŒ†ƒ,Ôˆƒýÿÿÿÿÿñ0ŽŒ†ƒ,X„ýÿÿÿÿÿ"PŽŒ†ƒ,4H†ýÿÿÿÿÿ}"PŽŒ†ƒ$d˜‡ýÿÿÿÿÿº@Œ†ƒ,Œ0‰ýÿÿÿÿÿ0ŽŒ†ƒ$¼Šýÿÿÿÿÿ¿0Œ†ƒ$䨊ýÿÿÿÿÿf0Œ†ƒzRx Ø‹ýÿÿÿÿÿ'<è‹ýÿÿÿÿÿ,\ø‹ýÿÿÿÿÿg|HŒýÿÿÿÿÿ0œXŒýÿÿÿÿÿJ¼ˆŒýÿÿÿÿÿ܈ŒýÿÿÿÿÿB$ü¸Œýÿÿÿÿÿrƒ$ýÿÿÿÿÿvDpýÿÿÿÿÿPTd ýÿÿÿÿÿj (08ƒ†ŒŽ¼¸ýÿÿÿÿÿ]Üøýÿÿÿÿÿ¤üˆ‘ýÿÿÿÿÿnØ‘ýÿÿÿÿÿp<(’ýÿÿÿÿÿœ\¨’ýÿÿÿÿÿ||“ýÿÿÿÿÿœh“ýÿÿÿÿÿ¢¼ø“ýÿÿÿÿÿ¢Üˆ”ýÿÿÿÿÿ†üø”ýÿÿÿÿÿÄ$¨•ýÿÿÿÿÿýƒ$D€–ýÿÿÿÿÿ›ƒlø–ýÿÿÿÿÿ$Œø–ýÿÿÿÿÿrƒ,´P—ýÿÿÿÿÿ"@ŽŒ†ƒ$äÀ˜ýÿÿÿÿÿÃ0Œ†ƒ< h™ýÿÿÿÿÿa @ƒ†ŒTL˜šýÿÿÿÿÿŒ (08`ƒ†ŒŽ,¤Ðýÿÿÿÿÿ0ŽŒ†ƒDÔ°žýÿÿÿÿÿ (0ƒ†ŒŽ$xŸýÿÿÿÿÿŸƒ,DðŸýÿÿÿÿÿ°ƒ†,tp ýÿÿÿÿÿÆ,¤¡ýÿÿÿÿÿц$Ô°¡ýÿÿÿÿÿåƒ,üx¢ýÿÿÿÿÿц,,£ýÿÿÿÿÿ“"@ŽŒ†ƒ<\ˆ¥ýÿÿÿÿÿ` @ƒ†ŒzRx T·ýÿÿÿÿÿà (08@ƒ†ŒŽ,t¸ýÿÿÿÿÿr"@ŽŒ†ƒ$¤X¹ýÿÿÿÿÿZ@ŒƒD̹ýÿÿÿÿÿU (0ƒ†ŒŽ,¨¹ýÿÿÿÿÿ"@ŽŒ†ƒDDºýÿÿÿÿÿY (0ƒ†ŒŽ,Œ ºýÿÿÿÿÿ“"@ŽŒ†ƒ$¼ºýÿÿÿÿÿRƒTäȺýÿÿÿÿÿ  (08€ƒ†ŒŽT<€»ýÿÿÿÿÿº (08 ƒ†ŒŽT”è¼ýÿÿÿÿÿ (08`ƒ†ŒŽ,ì°½ýÿÿÿÿÿâ"€ŽŒ†ƒ$p¿ýÿÿÿÿÿª0Œ†ƒ4Dø¿ýÿÿÿÿÿç†  ƒŒŽT|°Áýÿÿÿÿÿ (08`ƒ†ŒŽTÔhÃýÿÿÿÿÿ· (08€ƒ†ŒŽT,ÐÄýÿÿÿÿÿ (08°ƒ†ŒŽT„ˆÈýÿÿÿÿÿ¨ (08€ƒ†ŒŽTÜàÌýÿÿÿÿÿæ (08Pƒ†ŒŽ,4xÎýÿÿÿÿÿÚ"€ŽŒ†ƒTd(Ñýÿÿÿÿÿ¶ (08°ƒ†ŒŽzRx xÕýÿÿÿÿÿ)<ˆÕýÿÿÿÿÿQ\ÈÕýÿÿÿÿÿ°,|XÖýÿÿÿÿÿª0ƒ¬Ø×ýÿÿÿÿÿH0ÌØýÿÿÿÿÿ0ìˆØýÿÿÿÿÿE04 ¸ØýÿÿÿÿÿåPƒ†DpÙýÿÿÿÿÿ%d€Ùýÿÿÿÿÿ„ðÙýÿÿÿÿÿm¤@Úýÿÿÿÿÿ< Ä`Úýÿÿÿÿÿ5ä€ÚýÿÿÿÿÿP °Úýÿÿÿÿÿ},$ÛýÿÿÿÿÿF ƒzRx Ûýÿÿÿÿÿ$<Ûýÿÿÿÿÿƒ4dÛýÿÿÿÿÿ» ƒ†$œˆÛýÿÿÿÿÿù0Œ†ƒ4Ä`Üýÿÿÿÿÿ– ƒ†ŒTüÈÝýÿÿÿÿÿû (08`ƒ†ŒŽ,TpÞýÿÿÿÿÿ"`ŽŒ†ƒ,„àßýÿÿÿÿÿq"PŽŒ†ƒ$´0áýÿÿÿÿÿRƒ4ÜháýÿÿÿÿÿÔ ƒ†$âýÿÿÿÿÿñ Œ†ƒ$<èâýÿÿÿÿÿÙ0Œ†ƒzRx ˆäýÿÿÿÿÿ<xäýÿÿÿÿÿ*T\ˆäýÿÿÿÿÿ  (08pƒ†ŒŽT´Pêýÿÿÿÿÿ? (08pƒ†ŒŽ4 8íýÿÿÿÿÿ§ ƒ†ŒDD°íýÿÿÿÿÿÛ (0ƒ†ŒŽ,ŒHîýÿÿÿÿÿ "€ŽŒ†ƒT¼¸òýÿÿÿÿÿY (08@ƒ†ŒŽTÀôýÿÿÿÿÿ£ (08@ƒ†ŒŽTlõýÿÿÿÿÿ¡ (08@ƒ†ŒŽTÄpõýÿÿÿÿÿ¢ (08@ƒ†ŒŽTÈõýÿÿÿÿÿ¢ (08@ƒ†ŒŽTt öýÿÿÿÿÿ¦ (08@ƒ†ŒŽTÌxöýÿÿÿÿÿy (08@ƒ†ŒŽT$ öýÿÿÿÿÿ (08@ƒ†ŒŽT|ØöýÿÿÿÿÿÐ (08@ƒ†ŒŽTÔP÷ýÿÿÿÿÿN (08àƒ†ŒŽT,HûýÿÿÿÿÿP (08Pƒ†ŒŽ,„@üýÿÿÿÿÿõ"pŽŒ†ƒT´þÿÿÿÿÿ¦ (08`ƒ†ŒŽ< hþÿÿÿÿÿ~ 0ƒ†Œ4L¨þÿÿÿÿÿb ƒ†ŒT„àþÿÿÿÿÿu (08Àƒ†ŒŽ,Ü þÿÿÿÿÿâ"`ŽŒ†ƒ4 È þÿÿÿÿÿ¥ ƒ†ŒTD@þÿÿÿÿÿú (08`ƒ†ŒŽzRx Ðþÿÿÿÿÿ9 <<ðþÿÿÿÿÿ ЃŒL|Ðþÿÿÿÿÿò (0`ƒ†ŒŽTÌ€þÿÿÿÿÿÏ (08 ƒ†ŒŽD$øþÿÿÿÿÿ› (Pƒ†ŒLlPþÿÿÿÿÿC (0ƒ†ŒŽ¼Pþÿÿÿÿÿ¥ <Üàþÿÿÿÿÿ Pƒ†ŒÀþÿÿÿÿÿn<þÿÿÿÿÿ&\ þÿÿÿÿÿ*|0þÿÿÿÿÿQ0œpþÿÿÿÿÿI0T¼ þÿÿÿÿÿ¿ (08Ѓ†ŒŽTþÿÿÿÿÿ (08°ƒ†ŒŽ4lÐþÿÿÿÿÿåPƒ†¤ˆþÿÿÿÿÿ€0Äèþÿÿÿÿÿ+äøþÿÿÿÿÿP0T(þÿÿÿÿÿx (08°ƒ†ŒŽ\P þÿÿÿÿÿn|  þÿÿÿÿÿ> $œÀ þÿÿÿÿÿ)ƒzRx L° þÿÿÿÿÿ3 (08ƒ†ŒŽTl "þÿÿÿÿÿ” (08Pƒ†ŒŽTÄè"þÿÿÿÿÿð (08€ƒ†ŒŽT€%þÿÿÿÿÿ (08pƒ†ŒŽ,tø'þÿÿÿÿÿ^"@ŽŒ†ƒT¤(*þÿÿÿÿÿº (08€ƒ†ŒŽ$ü,þÿÿÿÿÿBƒ$$¸,þÿÿÿÿÿ’ƒTL0-þÿÿÿÿÿM (08Pƒ†ŒŽD¤(0þÿÿÿÿÿå (0ƒ†ŒTìÐ0þÿÿÿÿÿ! (08Pƒ†ŒŽzRx T2þÿÿÿÿÿ’ (08ðƒ†ŒŽzRx À@þÿÿÿÿÿD<°@þÿÿÿÿÿ‚ (0ƒ†Œ„øAþÿÿÿÿÿ4¤èAþÿÿÿÿÿ< ƒ†$ÜðCþÿÿÿÿÿˆ †ƒ$XDþÿÿÿÿÿˆ †ƒ,ÀDþÿÿÿÿÿ9$LàEþÿÿÿÿÿlƒt(Fþÿÿÿÿÿ€”ˆGþÿÿÿÿÿ€´èHþÿÿÿÿÿÃÔ˜JþÿÿÿÿÿÃôHLþÿÿÿÿÿ 8WþÿÿÿÿÿI44hXþÿÿÿÿÿJ@ƒ†4l€\þÿÿÿÿÿépƒ†zRx , cþÿÿÿÿÿ†ƒ†TL€cþÿÿÿÿÿ^ (08@ƒ†ŒŽT¤ˆcþÿÿÿÿÿo (08Pƒ†ŒŽTü cþÿÿÿÿÿ® (08Pƒ†ŒŽTTødþÿÿÿÿÿ  (08pƒ†ŒŽT¬°eþÿÿÿÿÿ (08 ƒ†ŒŽDxkþÿÿÿÿÿ| (0ƒ†ŒTL°kþÿÿÿÿÿ^ (08@ƒ†ŒŽT¤¸kþÿÿÿÿÿo (08Pƒ†ŒŽ4üÐkþÿÿÿÿÿ} ƒ†T4lþÿÿÿÿÿ¡ (08 ƒ†ŒŽTŒpmþÿÿÿÿÿf (08`ƒ†ŒŽTäˆpþÿÿÿÿÿe (08°ƒ†ŒŽD< uþÿÿÿÿÿ| (0ƒ†ŒT„Øuþÿÿÿÿÿ½ (08Ð,ƒ†ŒŽTÜ@xþÿÿÿÿÿú (08`ƒ†ŒŽT4èxþÿÿÿÿÿ` (08`ƒ†ŒŽTŒðyþÿÿÿÿÿa (08`ƒ†ŒŽzRx ðzþÿÿÿÿÿÆ< {þÿÿÿÿÿ \{þÿÿÿÿÿ |€{þÿÿÿÿÿ#œ{þÿÿÿÿÿ—$¼|þÿÿÿÿÿrƒ4äh|þÿÿÿÿÿK ƒ†4€€þÿÿÿÿÿX ƒ†Œ$T¨€þÿÿÿÿÿ‚ƒ$|þÿÿÿÿÿ< †ƒ$¤(‚þÿÿÿÿÿ[0Œ†ƒ$Ì`ƒþÿÿÿÿÿX Œ†ƒ$ô˜ƒþÿÿÿÿÿT Œ†ƒ,Ѓþÿÿÿÿÿ¯ Œ†ƒ,LP…þÿÿÿÿÿŸ Œ†ƒ,|À†þÿÿÿÿÿŸ Œ†ƒ,¬0ˆþÿÿÿÿÿž Œ†ƒLÜ ‰þÿÿÿÿÿ› (0€ƒ†ŒŽ$,ð‰þÿÿÿÿÿŸ Œ†ƒ$Th‹þÿÿÿÿÿ †ƒ|@þÿÿÿÿÿH$œpþÿÿÿÿÿE †ƒ4ĘŽþÿÿÿÿÿÎ ƒ†$ü0‘þÿÿÿÿÿ‚ †ƒ$$˜‘þÿÿÿÿÿYƒTLБþÿÿÿÿÿM (08@ƒ†ŒŽ4¤È’þÿÿÿÿÿK ƒ†Üà’þÿÿÿÿÿ,üÐ’þÿÿÿÿÿ·0ŽŒ†ƒ,,`–þÿÿÿÿÿ"@ŽŒ†ƒ,\P—þÿÿÿÿÿ"@ŽŒ†ƒ$Œ@˜þÿÿÿÿÿï0Œ†ƒ$´™þÿÿÿÿÿß0Œ†ƒ$ÜÀ™þÿÿÿÿÿß0Œ†ƒ$xšþÿÿÿÿÿÞ0Œ†ƒ,,0›þÿÿÿÿÿå"PŽŒ†ƒ$\ðþÿÿÿÿÿr0Œ†ƒ<„HŸþÿÿÿÿÿà 0ƒ†Œ4ÄØ þÿÿÿÿÿP ƒ†ŒzRx Ø£þÿÿÿÿÿ5 <ø£þÿÿÿÿÿ)\¥þÿÿÿÿÿËzRx  ¥þÿÿÿÿÿ;<À¥þÿÿÿÿÿn$\¦þÿÿÿÿÿx †ƒ4„h¦þÿÿÿÿÿÉ ƒ†Œ4¼¨þÿÿÿÿÿ¸ ƒ†Œôˆ¨þÿÿÿÿÿ x¨þÿÿÿÿÿ <4h¨þÿÿÿÿÿ­ 0ƒ†Œ,tتþÿÿÿÿÿ¤"`ŽŒ†ƒ$¤X­þÿÿÿÿÿ^0Œ†ƒ,̯þÿÿÿÿÿ_"PŽŒ†ƒTüÀ²þÿÿÿÿÿ^ (08`ƒ†ŒŽ$Tȳþÿÿÿÿÿ0Œ†ƒ|ÀµþÿÿÿÿÿœÀµþÿÿÿÿÿ-¼еþÿÿÿÿÿSܶþÿÿÿÿÿSüP¶þÿÿÿÿÿP¶þÿÿÿÿÿ-,<`¶þÿÿÿÿÿZ ƒl¶þÿÿÿÿÿJ0,ŒÀ¶þÿÿÿÿÿh ƒ¼·þÿÿÿÿÿ€0,Ü`·þÿÿÿÿÿZ ƒ ·þÿÿÿÿÿY0,,зþÿÿÿÿÿŒ ƒ\0¸þÿÿÿÿÿY0,|p¸þÿÿÿÿÿh ƒ¬°¸þÿÿÿÿÿ€0,̹þÿÿÿÿÿŒ ƒüp¹þÿÿÿÿÿJ0 ¹þÿÿÿÿÿ| ,<ºþÿÿÿÿÿß% ŽŒ†ƒ,l°Ñþÿÿÿÿÿ-0ƒ,œ°Òþÿÿÿÿÿ"€ŽŒ†ƒ,ÌÕþÿÿÿÿÿ¸"€ŽŒ†ƒ,ü ×þÿÿÿÿÿ_"@ŽŒ†ƒ,,ÐØþÿÿÿÿÿ "pŽŒ†ƒzRx ¨áþÿÿÿÿÿw<âþÿÿÿÿÿ\hâþÿÿÿÿÿ~,|ÈâþÿÿÿÿÿZ0ƒ,¬øãþÿÿÿÿÿ¦@ƒ4Üxåþÿÿÿÿÿ⃆0ëþÿÿÿÿÿ#T4@ëþÿÿÿÿÿd (08Àƒ†ŒŽzRx @óþÿÿÿÿÿ <@óþÿÿÿÿÿ \@óþÿÿÿÿÿ|@óþÿÿÿÿÿ(œPóþÿÿÿÿÿ(¼`óþÿÿÿÿÿ#Üpóþÿÿÿÿÿ(ü€óþÿÿÿÿÿ(óþÿÿÿÿÿ<óþÿÿÿÿÿ%\ óþÿÿÿÿÿ$|°óþÿÿÿÿÿœ°óþÿÿÿÿÿ*¼Àóþÿÿÿÿÿ*ÜÐóþÿÿÿÿÿ#üàóþÿÿÿÿÿ.ðóþÿÿÿÿÿ-<ôþÿÿÿÿÿ(\ôþÿÿÿÿÿ%| ôþÿÿÿÿÿ#œ0ôþÿÿÿÿÿ#¼@ôþÿÿÿÿÿ@Ü`ôþÿÿÿÿÿ-üpôþÿÿÿÿÿ)€ôþÿÿÿÿÿ)$<ôþÿÿÿÿÿeƒ$dØôþÿÿÿÿÿbƒ$Œ õþÿÿÿÿÿbƒ´hõþÿÿÿÿÿ,Ôxõþÿÿÿÿÿ+ôˆõþÿÿÿÿÿ)˜õþÿÿÿÿÿ,4¨õþÿÿÿÿÿ*T¸õþÿÿÿÿÿ%tÈõþÿÿÿÿÿ,”Øõþÿÿÿÿÿ*´èõþÿÿÿÿÿ%Ôøõþÿÿÿÿÿ/ôöþÿÿÿÿÿ.öþÿÿÿÿÿ=48öþÿÿÿÿÿ/THöþÿÿÿÿÿ.tXöþÿÿÿÿÿ=”xöþÿÿÿÿÿ´xöþÿÿÿÿÿÔxöþÿÿÿÿÿôxöþÿÿÿÿÿxöþÿÿÿÿÿ4xöþÿÿÿÿÿTxöþÿÿÿÿÿ%tˆöþÿÿÿÿÿ)”˜öþÿÿÿÿÿ%´¨öþÿÿÿÿÿ%Ô¸öþÿÿÿÿÿ€ô÷þÿÿÿÿÿph÷þÿÿÿÿÿ<4ˆ÷þÿÿÿÿÿ,DT˜÷þÿÿÿÿÿ\ (0ƒ†ŒDœ°÷þÿÿÿÿÿ\ (0ƒ†ŒDäÈ÷þÿÿÿÿÿ` (0ƒ†Œ,à÷þÿÿÿÿÿòLÀøþÿÿÿÿÿì4lùþÿÿÿÿÿ- ƒ†Œ<¤ˆùþÿÿÿÿÿÕ @ƒ†Œ<ä(úþÿÿÿÿÿ‡ @ƒ†ŒD$ xúþÿÿÿÿÿY (0ƒ†Œ4l úþÿÿÿÿÿ- ƒ†Œ<¤ ˆúþÿÿÿÿÿë @ƒ†ŒLä 8ûþÿÿÿÿÿ¾ (0@ƒ†ŒŽL4 ¨ûþÿÿÿÿÿº (0Pƒ†ŒŽ<„ üþÿÿÿÿÿ† @ƒ†ŒDÄ hüþÿÿÿÿÿk (0ƒ†ŒD üþÿÿÿÿÿ (0ƒ†ŒŽDT hýþÿÿÿÿÿ* (0ƒ†ŒŽDœ Pþþÿÿÿÿÿ* (0ƒ†ŒŽä 8ÿþÿÿÿÿÿ 8ÿþÿÿÿÿÿ$ 8ÿþÿÿÿÿÿD 8ÿþÿÿÿÿÿd 8ÿþÿÿÿÿÿ„ 8ÿþÿÿÿÿÿL¤ 8ÿþÿÿÿÿÿs (0@ƒ†ŒŽLô hÿþÿÿÿÿÿs (0@ƒ†ŒŽ,D ˜ÿþÿÿÿÿÿ/@ŽŒ†ƒ,t ˜ÿÿÿÿÿÿ$@ŽŒ†ƒL¤ ˜ÿÿÿÿÿÿÌ (0@ƒ†ŒŽLô ÿÿÿÿÿÿÞ (0Pƒ†ŒŽèÂðÂøÂÃ8.j.œ.ì.x/n/d/Z/P/F/N1D1:101&1 /ª/´/¾/È/Ò/Ü/æ/ð/ú/"000–/Œ/‚/Ì0Ö0à0ê0ô0þ0111X1¸0®0¤0š00†0|0@060,00`.t.~.ˆ.’.¦.°.º.Ä.Î.Ø.â.B.L.V.ness_½<«=GetSeedÝUniformPositive©>CDFï=†>€ÃCDF€>Œ>€Æ€ÉÐÌussian£>mma¯> Ð°æÐñXÐ>xõ>IIDŠ?fIIDÔ?CÚ?Reverseï>Markov?Shuffle ?ÀÿIID„?fIIDÎ?Ѐ°0š?1@ ‚Windows´?DPº?À?Ð…à‡€”KmersÉ@€•à•Reverseù?Markovÿ?Shuffle•@Ж0‰@1½@З€›DPŸ@¥@ð¡à¬WindowsÃ@KmersÏ@à­ ³ µ€¸ ReœAIs¼ASetÛAC–BDÇBGõBXAddResidue®CFºCTextizeÅDAppendDesc–Euse¶AverseComplementÁBðºDigitalÏATextÕAÀ¼мCoordCompleteBSourceœEDesc¢EAccession¨EName®Eà¼hecksum»BAddResidue´Co›DreateËD½°¿estroyÜBigitize•DBlockéBïB€ÈàÈrow˜CuessAlphabetDetFromMSA´ETo¢C¨CðɰÌÏðÏormatÒCetchFromMSAÀESource÷CDescýCAccessionƒDName‰DÐЀԠ×ÀÚàÝ€ßmpare¹DnvertDegen2X¿DpyÆE â æðæDigitalÚDïDïBlock„EFromºE ðBlockŠEFromEÐó ôðûþ°€ ‚€„à…À‡°°€”e_ØEi_»Fdump_psòElogføEexpfþEК›ÀŸSetSubseqµFCloseçFAddóFOpen–GWrite IПFiÑFCloseíFOpenÝIleInfoáFnd¬IÀ À¡¥KeyŠGFileGAliasœG ¬б°¶ð¿16³G64ÖG32âGÄ32ÊG64ÐG16ÜG°ÄàÄÀÅ ÆÀÆiûGu¼Hoffset¦I16ŒH32‚I64ŽIðÆu¥HiëHoffsetšI16¶H64ÓH32ßHÐÇ32ÍH16ÙH64åH ÈÉÊðÊÐË32üH64ˆI16”IàÌÀͰΰÏÀÐÑÒðN»ISubseq×IumberËIameÑI „°‰ðŽБDMean”JFMeanšJI JPsiÀJLÆJChiSquaredTestðJð£ð¤MeanºJncompleteGammaêJð¥ð¦ogGammaäJinearRegressionöJЩ€­ð¸ ¹DŠKF€LIöL SÒKIncrementçMA‹NCñNReÞODšPMÓP2FãQNorm…RValidateµRE€SLog–SetúKcaleÕMumùMwapÌOhuffle©Rort§TÊ SÈLIncrementíMA§NC‘OReùOD­PMåP2DéQNorm‹RValidate¯RE»RLogÑRetðLcaleÛMumÿMwapÒOhuffle£Rort…T°ÊS§MIncrementóMAÃNCo±OReverse”PDÀPM÷P2ïQetÏMcaleáMum…NwapØOhuffleRortãSÐÊðÊ ËÐˀ̰Ìà̀ͰÍàÍdd˜NrgM›Q€ÎScaledßNdd´NrgM­Q°ÎScaledåNddÐNrgM¿QàÎScaledëNÏÀÏðÏoüNDF‘Rpy‹OmpareáT ÐoœODF—Rpy«OmpareÛTÐÐpyÀOmpareÆO€Ñ°ÑðÑ ÒÐÒverseóOlEntropy­S€ÓverseŽPlEntropy§SðÓàÔot§PumpÝSÐÕotºPump×S€ÖotÍPumpÑS°ÖaxßPin‰QàÖaxñPinQ×axƒQin•QÀ×ð× ØÐØax§QinÑQ€Ùax¹Qin×Q°ÙaxËQinÝQàÙ ÚÐڀۀݰÝFùQDÿQàÝÞÀÞÀß°àðà á€âàâÀãÀåxpËRntropyâR°çSumÜRèRàçÀéÐêValidateíTNormóTxpSntropy³S°ëSum¡S¹SàëÐíïÐðàñValidateçTNormùTÐòðô ÷DecreasingÿSIncreasingÉTÐùDecreasing¡TIncreasingÏTðùDecreasingÃTIncreasingÕTú°úÐúðúûüýÀÿðÀ…àÉèÉðÉc›Uv¡Uè…ð…ø…€†¨û°ûpÚ€ã"Ð÷- <@+MP,ZÀ8i Dx0ˆ¼ž°Æ®°FÇ€Lä dî°yû ‹ ’À£*0¦60¨A ³L€ô\0eÀ4n€8~0:ŽPS˜`S¢pSº^ÉÀ­Üà­ï® ®@®(`®;€'C€(K€)S€*[€+g(.uÀ| à Ø ã î ù ÃÄ ÃÏ @Ã× HÃà PÃì XÃð `Ãø hÃý pà xà €Ã  ˆÃ à ˜Ã" œÃ3  ÃC  ½Z èÂb ðÂj ÃvŠpÏ—p8¥W³ {Áp¦ÏÀØÝ Ñê`Õ÷ Úâ ì`ù+ 8EÀ"\`l øÂu@⃠ó‘ô¢°ñ°òÁPþÑ0üâÐåòàù`ã°â+=U`h{Ð Žž´`ÊÐÞ0ð p` *à:ÀPà fà}` ° £P!¹@ ÏP Þ ïÐ@( "8 P@`Pp €@‘À$¦ÀÁ`×Pøà€+ÐDY`eOs Ý‰àߟᵰÞÊ0:áÐ9ÿ ; À:4 0=O ð>r  <Ž p9¨ ç· €ÝÚ pÝô P[ \$ ðZ> ð^L  ^\  `i àa~ `b– a« PaÁ °]Ñ `á ^ñ ÀZ a à_ Ðæ( ð3 @äG `j] Àjt  k‘ Àb© àbÊ àhã  c @f @g:  lO °bn pc} ÀfŒ °g› ð€­ e¼  dË ÐeÚ @hê `fú 0g h Ðc- pe= dM àèY °œm `Ÿ‹  x  P~² ÐxÅ ЪÝ À¢ø ®¥+ ¡D°±U¶hð©x ³ж«P³Ã ¶Ü`¡ï ²À© ª)€§=€ªMP©^à¹pÉ·’°Å¢Å³ÂÁмÒ@¹íðÉýÀÄ ¿ c*0b6`bB Ìd D{B0Q¥À;¼ 7ÐpHãV@°BG S[ð7pð_…ÐX™ V¬ÀP¾0[ÏÐOåi÷Ý b@c%Àb1€nDÀnYnipƒ}`ŽÀ‚¢‚³ „ư€Ù0…ì „úPŠ P—"@˜=ЗYÀšoàt…†›Ðß§@ß¾°ÞÙáú`ÜÐÚ'ÀÚ?pÜTPæeãy€äŠ€ážÐø­ è¿0óØÐ êàüP ` ð4K d°q ƒ€ •Àÿ§ ¹àÍ äÐýà  P€ (àë5?Hð'\m 1} 3”J¡ 8° :Ä7ÚÐ9õ°Fð="`$2$G€/X0Hm +…*˜@-«P(ÀÀCÓ0&àð$ïà.@P&p4°NBc`| AŒàBœ0@®p3¾'ÒPMãÀNñMÿR@P °„2 ‚Fp‡ZЈhpœ‚ð‘“p’¤ð’µ€–РœìДp“àä$0ö5ôHp÷XÐîdöq€â}0å0û™pí¨pì¿PùËæÛÐÿèÀãû €®§!§5€¬F ­W0°e¾w ¨†Ъ” »£P¸µ°µÃ¦×à¸åÀÂ÷ൾ`«,ð«:@¯I·^€©pp¥€¥Ž`± ½¹p½Ò€¦àð¨ïÀ²°®0§À§1°¬BP­Sp°a½sP¨‚«pºŸÀ´±°³¿0¦ÓPµáðÀóà³À¿«( ¬6À¯EжZð©l ¥|0¥Š±œð¼µP½Î°¦Ü ©ëÀ±þ¯ à®`§&ð§:à¬K€­\°¨n€¨}0«‹P¹š`¦®À«¼P¬Ê`ªÜÐ¥ìP¥ú ° м% 0½> à¦L P©[ àéi à$m è$q ð$u  ¡ £Ÿ °±´ `ÇÆ 0¤Ñ  ¡Ý  Çí €Íÿ ¶!¸-!à¶C!@ÆT!P×c! °y!¢‡! ¢—!`µ£!P´±!0ÛÀ!PÜÓ!°ªÞ!°¤í!€³"À²!"°Ì)">"ÀR"P$X"ðd" ¨½q"Ðl†"€Æ“"PƦ"0=´"P'Á"@nÖ"Àºã"3ë"p¹þ" o #pp#ðo+#°24#Ì@#pÌR#PI`#€En#ÀC‚#`Q#°V›# W¨#ð^½#à<È#Ö#ï# :ù#€…$à‡#$`ˆ5$ðR$€‚r$€~$ )’$ q¤$À*´$ qÇ$€zÜ$ðyï$pÎý$p4%€-% 24%P7B%`mM%À‘Z%@”h%ð’}%`‘Œ% ‘˜%@‰«%ðŠº%ŒÆ%Š×%‰è%P‹õ%01 &`&&&М6&€¡E&àžU&°œb&Еu&0Ÿ„&À•’&•¡&¿¶&à£Ñ&Íß& ªï&ð '0¼ '°Å/'€ÀB'À³V'°²n'@µ~'Ю‹'»£'{¼'0±Ð'Êß'PÖø'ðÌ(ðÒ%(²3(йH(PÇ_(p¶t(¹…(нœ(м¬(À¤½(p¸Ê(Ü(@ó( 8)` )°8-)8C)€8X)pÙm)ÀÙ‡)`Ù˜)àø¯)PÛÇ)Päá)Rð) Q*Ð>*@L$*ÐF6*Ð;I*`UX* >f*À>z*»*`c¢*@™·*€»É*`Ý*ÀŽò* n+0Z'+[H+€Y]+ ·y+˜+@º¶+˜Ö+ºò+¸, Y,l,,0[@, iQ,À^d,\x,0e‰,[, [´,P]Æ,`aÛ,p_ð,^ -ÀZ -pc5-–F-0”]-Ðyo-ðo-PŒ-0Œ§-‡¹-ЇÐ-oá-`—ð-М.ðs .m9.PmW.ðus.à’‚.°–.pŒ¬.`޽. ‘Í.ðlÝ.€mï. xÿ.Àv/p|"/ 0/àD/ P/ °½a/°g/{/„//Ÿ/±/Ä/Ï/Ù/ä/ï/ú/00 000!0*00050;0C0K0Q0Y0`0g0o0v00†00”0š0¢0ª0²0º0Ã0Ë0Ô0Ü0ä0ì0ñ0÷0ÿ0111 1)11191@1E1M1d1x1~1…1Ž1–1ž1¨1±1¿1Ë1Ó1Û1ã1ë1ô1ü12222)21262<2C2K2U2`2¡¢£¤©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõ ¥¦§¨@@¡¢£¤©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõ _write_bin_string_probToString_printprob_read_asc30hmm_read_bin_string_open_engine_read_bin30hmm_read_asc20hmm_trace_create_engine_backward_engine_forward_engine_mixdchlet_complete_func_mixdchlet_complete_gradient_nextline_esl_getopts_verify_type_and_range_set_option_lawless422_lawless416_tevd_func_tevd_grad_gamma_fraction_sq_free_sq_init_sq_createblock_sq_create_from_skeysort_pkeysort_activate_external_sort_binary_search_qsort_DIncreasing_qsort_FIncreasing_qsort_IIncreasing_qsort_DDecreasing_qsort_FDecreasing_qsort_IDecreasing_h.5147_t.5146_d.5145_a.5144_mag01.5045 stub helpers_pvars_firsttime.11973_v3f_magic_v3e_magic_v3d_magic_v3c_magic_v3b_magic_v3a_magic_models_gmodels_num_models_bg_hmm_fp_oxf_oxb_gxf_gxb_abc_tr_hmmer_error_models_capacity_flogsum_lookup_esl_exception_handler_NXArgc_NXArgv___progname__mh_execute_header_calc_band_1_calc_band_10_calc_band_11_calc_band_12_calc_band_13_calc_band_14_calc_band_2_calc_band_3_calc_band_4_calc_band_5_calc_band_6_calc_band_7_calc_band_8_calc_band_9_destroy_hmmer_wrapper_destroy_result_environ_esl_CCompare_esl_DCompare_esl_DCompareAbs_esl_FCompare_esl_FCompareAbs_esl_FileConcat_esl_FileEnvOpen_esl_FileExists_esl_FileNewSuffix_esl_FileTail_esl_Free2D_esl_Free3D_esl_abc_CDealign_esl_abc_ConvertDegen2X_esl_abc_CreateDsq_esl_abc_DAvgScVec_esl_abc_DAvgScore_esl_abc_DCount_esl_abc_DExpectScVec_esl_abc_DExpectScore_esl_abc_DecodeType_esl_abc_Digitize_esl_abc_EncodeType_esl_abc_FAvgScVec_esl_abc_FAvgScore_esl_abc_FCount_esl_abc_FExpectScVec_esl_abc_FExpectScore_esl_abc_GuessAlphabet_esl_abc_IAvgScVec_esl_abc_IAvgScore_esl_abc_IExpectScVec_esl_abc_IExpectScore_esl_abc_Match_esl_abc_Textize_esl_abc_TextizeN_esl_abc_ValidateSeq_esl_abc_XDealign_esl_abc_dsqcat_esl_abc_dsqcat_noalloc_esl_abc_dsqcpy_esl_abc_dsqdup_esl_abc_dsqlen_esl_abc_dsqrlen_esl_alphabet_Create_esl_alphabet_CreateCustom_esl_alphabet_Destroy_esl_alphabet_SetCaseInsensitive_esl_alphabet_SetDegeneracy_esl_alphabet_SetEquiv_esl_alphabet_SetIgnored_esl_alphabet_Sizeof_esl_banner_esl_byteswap_esl_composition_BL62_esl_composition_SW34_esl_composition_SW50_esl_composition_WAG_esl_dirichlet_DSample_esl_dirichlet_DSampleUniform_esl_dirichlet_FSample_esl_dirichlet_FSampleUniform_esl_dirichlet_LogProbData_esl_dirichlet_LogProbData_Mixture_esl_dirichlet_LogProbProbs_esl_dirichlet_SampleBeta_esl_exception_esl_exception_ResetDefaultHandler_esl_exception_SetHandler_esl_exp_FitComplete_esl_exp_FitCompleteBinned_esl_exp_FitCompleteScale_esl_exp_Plot_esl_exp_Sample_esl_exp_cdf_esl_exp_generic_cdf_esl_exp_generic_invcdf_esl_exp_generic_pdf_esl_exp_generic_surv_esl_exp_invcdf_esl_exp_logcdf_esl_exp_logpdf_esl_exp_logsurv_esl_exp_pdf_esl_exp_surv_esl_fatal_esl_fgets_esl_file_Extension_esl_fileparser_Close_esl_fileparser_Create_esl_fileparser_CreateMapped_esl_fileparser_Destroy_esl_fileparser_GetRemainingLine_esl_fileparser_GetToken_esl_fileparser_GetTokenOnLine_esl_fileparser_NextLine_esl_fileparser_NextLinePeeked_esl_fileparser_Open_esl_fileparser_SetCommentChar_esl_fread_i16_esl_fread_i32_esl_fread_i64_esl_fread_offset_esl_fread_u16_esl_fread_u32_esl_fread_u64_esl_fwrite_i16_esl_fwrite_i32_esl_fwrite_i64_esl_fwrite_offset_esl_fwrite_u16_esl_fwrite_u32_esl_fwrite_u64_esl_getcwd_esl_getopts_Create_esl_getopts_CreateDefaultApp_esl_getopts_Destroy_esl_getopts_Dump_esl_getopts_Reuse_esl_gumbel_FitCensored_esl_gumbel_FitCensoredLoc_esl_gumbel_FitComplete_esl_gumbel_FitCompleteLoc_esl_gumbel_FitTruncated_esl_gumbel_Plot_esl_gumbel_Sample_esl_gumbel_cdf_esl_gumbel_generic_cdf_esl_gumbel_generic_invcdf_esl_gumbel_generic_pdf_esl_gumbel_generic_surv_esl_gumbel_invcdf_esl_gumbel_invsurv_esl_gumbel_logcdf_esl_gumbel_logpdf_esl_gumbel_logsurv_esl_gumbel_pdf_esl_gumbel_surv_esl_hmm_Backward_esl_hmm_Clone_esl_hmm_Configure_esl_hmm_Create_esl_hmm_Destroy_esl_hmm_Emit_esl_hmm_Forward_esl_hmm_PosteriorDecoding_esl_hmx_Create_esl_hmx_Destroy_esl_hmx_GrowTo_esl_hton16_esl_hton32_esl_hton64_esl_min_ConjugateGradientDescent_esl_mixdchlet_Compare_esl_mixdchlet_Copy_esl_mixdchlet_Create_esl_mixdchlet_Destroy_esl_mixdchlet_Dump_esl_mixdchlet_Fit_esl_mixdchlet_Fit_Multipass_esl_mixdchlet_MPParameters_esl_mixdchlet_PerfectBipartiteMatchExists_esl_mixdchlet_Read_esl_mixdchlet_Write_esl_newssi_AddAlias_esl_newssi_AddFile_esl_newssi_AddKey_esl_newssi_Close_esl_newssi_Open_esl_newssi_SetSubseq_esl_newssi_Write_esl_nonfatal_handler_esl_ntoh16_esl_ntoh32_esl_ntoh64_esl_opt_ArgNumber_esl_opt_DisplayHelp_esl_opt_GetArg_esl_opt_GetBoolean_esl_opt_GetChar_esl_opt_GetInteger_esl_opt_GetReal_esl_opt_GetSetter_esl_opt_GetString_esl_opt_IsDefault_esl_opt_IsOn_esl_opt_IsUsed_esl_opt_ProcessCmdline_esl_opt_ProcessConfigfile_esl_opt_ProcessEnvironment_esl_opt_ProcessSpoof_esl_opt_SpoofCmdline_esl_opt_VerifyConfig_esl_random_esl_randomness_Create_esl_randomness_CreateFast_esl_randomness_CreateTimeseeded_esl_randomness_Destroy_esl_randomness_Dump_esl_randomness_GetSeed_esl_randomness_Init_esl_rnd_DChoose_esl_rnd_DChooseCDF_esl_rnd_FChoose_esl_rnd_FChooseCDF_esl_rnd_Gamma_esl_rnd_Gaussian_esl_rnd_UniformPositive_esl_rsq_CMarkov0_esl_rsq_CMarkov1_esl_rsq_CReverse_esl_rsq_CShuffle_esl_rsq_CShuffleDP_esl_rsq_CShuffleKmers_esl_rsq_CShuffleWindows_esl_rsq_IID_esl_rsq_XMarkov0_esl_rsq_XMarkov1_esl_rsq_XReverse_esl_rsq_XShuffle_esl_rsq_XShuffleDP_esl_rsq_XShuffleKmers_esl_rsq_XShuffleWindows_esl_rsq_fIID_esl_rsq_xIID_esl_rsq_xfIID_esl_sprintf_esl_sq_AppendDesc_esl_sq_CAddResidue_esl_sq_Checksum_esl_sq_Compare_esl_sq_ConvertDegen2X_esl_sq_Copy_esl_sq_Create_esl_sq_CreateBlock_esl_sq_CreateDigital_esl_sq_CreateDigitalBlock_esl_sq_CreateDigitalFrom_esl_sq_CreateFrom_esl_sq_Destroy_esl_sq_DestroyBlock_esl_sq_Digitize_esl_sq_FetchFromMSA_esl_sq_FormatAccession_esl_sq_FormatDesc_esl_sq_FormatName_esl_sq_FormatSource_esl_sq_GetFromMSA_esl_sq_Grow_esl_sq_GrowTo_esl_sq_GuessAlphabet_esl_sq_IsDigital_esl_sq_IsText_esl_sq_Reuse_esl_sq_ReverseComplement_esl_sq_SetAccession_esl_sq_SetCoordComplete_esl_sq_SetDesc_esl_sq_SetName_esl_sq_SetSource_esl_sq_Textize_esl_sq_XAddResidue_esl_sse_dump_ps_esl_sse_expf_esl_sse_logf_esl_ssi_Close_esl_ssi_FileInfo_esl_ssi_FindName_esl_ssi_FindNumber_esl_ssi_FindSubseq_esl_ssi_Open_esl_stats_ChiSquaredTest_esl_stats_DMean_esl_stats_FMean_esl_stats_IMean_esl_stats_IncompleteGamma_esl_stats_LinearRegression_esl_stats_LogGamma_esl_stats_Psi_esl_str_GetMaxWidth_esl_str_IsBlank_esl_str_IsInteger_esl_str_IsReal_esl_strcat_esl_strchop_esl_strcmp_esl_strdealign_esl_strdup_esl_strmapcat_esl_strmapcat_noalloc_esl_strtok_esl_strtok_adv_esl_tmpfile_esl_tmpfile_named_esl_usage_esl_vec_D2F_esl_vec_DAdd_esl_vec_DAddScaled_esl_vec_DArgMax_esl_vec_DArgMin_esl_vec_DCDF_esl_vec_DCompare_esl_vec_DCopy_esl_vec_DDot_esl_vec_DDump_esl_vec_DEntropy_esl_vec_DExp_esl_vec_DIncrement_esl_vec_DLog_esl_vec_DLogNorm_esl_vec_DLogSum_esl_vec_DLogValidate_esl_vec_DMax_esl_vec_DMin_esl_vec_DNorm_esl_vec_DRelEntropy_esl_vec_DReverse_esl_vec_DScale_esl_vec_DSet_esl_vec_DShuffle_esl_vec_DSortDecreasing_esl_vec_DSortIncreasing_esl_vec_DSum_esl_vec_DSwap_esl_vec_DValidate_esl_vec_F2D_esl_vec_FAdd_esl_vec_FAddScaled_esl_vec_FArgMax_esl_vec_FArgMin_esl_vec_FCDF_esl_vec_FCompare_esl_vec_FCopy_esl_vec_FDot_esl_vec_FDump_esl_vec_FEntropy_esl_vec_FExp_esl_vec_FIncrement_esl_vec_FLog_esl_vec_FLogNorm_esl_vec_FLogSum_esl_vec_FLogValidate_esl_vec_FMax_esl_vec_FMin_esl_vec_FNorm_esl_vec_FRelEntropy_esl_vec_FReverse_esl_vec_FScale_esl_vec_FSet_esl_vec_FShuffle_esl_vec_FSortDecreasing_esl_vec_FSortIncreasing_esl_vec_FSum_esl_vec_FSwap_esl_vec_FValidate_esl_vec_I2D_esl_vec_I2F_esl_vec_IAdd_esl_vec_IAddScaled_esl_vec_IArgMax_esl_vec_IArgMin_esl_vec_ICompare_esl_vec_ICopy_esl_vec_IDot_esl_vec_IDump_esl_vec_IIncrement_esl_vec_IMax_esl_vec_IMin_esl_vec_IReverse_esl_vec_IScale_esl_vec_ISet_esl_vec_IShuffle_esl_vec_ISortDecreasing_esl_vec_ISortIncreasing_esl_vec_ISum_esl_vec_ISwap_esl_vsprintf_f1_f2_f3_fm_computeSequenceOffset_fm_configAlloc_fm_convertRange2DSQ_fm_destroyConfig_fm_freeFM_fm_getChar_fm_getOccCount_fm_getOccCountLT_fm_getOriginalPosition_fm_getSARangeForward_fm_getSARangeReverse_fm_getbits_m128_fm_initConfig_fm_initConfigGeneric_fm_initSeeds_fm_initWindows_fm_newSeed_fm_newWindow_fm_print_m128_fm_print_m128_rev_fm_readFM_fm_readFMmeta_fm_updateIntervalForward_fm_updateIntervalReverse_get_xE_hmmer_error_handler_init_hmmer_wrapper_main_new_result_num_results_p7_AminoFrequencies_p7_Backward_p7_BackwardParser_p7_Calibrate_p7_CoreEmit_p7_CreateDefaultApp_p7_Decoding_p7_Die_p7_DomainDecoding_p7_FLogsum_p7_FLogsumError_p7_FLogsumInit_p7_Fail_p7_Forward_p7_ForwardParser_p7_GBackward_p7_GDecoding_p7_GDomainDecoding_p7_GForward_p7_GHybrid_p7_GOATrace_p7_GOptimalAccuracy_p7_Lambda_p7_MSVFilter_p7_MSVFilter_longtarget_p7_MSVMu_p7_MeanForwardScore_p7_MeanMatchEntropy_p7_MeanMatchInfo_p7_MeanMatchRelativeEntropy_p7_MeanPositionRelativeEntropy_p7_OATrace_p7_OptimalAccuracy_p7_ProfileConfig_p7_ProfileEmit_p7_ReconfigLength_p7_ReconfigMultihit_p7_ReconfigUnihit_p7_SSVFilter_p7_Tau_p7_ViterbiFilter_p7_ViterbiFilter_longtarget_p7_ViterbiMu_p7_banner_p7_bg_Clone_p7_bg_Create_p7_bg_CreateUniform_p7_bg_Destroy_p7_bg_Dump_p7_bg_FilterScore_p7_bg_NullOne_p7_bg_Read_p7_bg_SetFilter_p7_bg_SetLength_p7_bg_Write_p7_emit_FancyConsensus_p7_emit_SimpleConsensus_p7_gmx_Compare_p7_gmx_Create_p7_gmx_Destroy_p7_gmx_Dump_p7_gmx_DumpWindow_p7_gmx_GrowTo_p7_gmx_Reuse_p7_gmx_Sizeof_p7_hmm_AppendComlog_p7_hmm_CalculateOccupancy_p7_hmm_Clone_p7_hmm_Compare_p7_hmm_CompositionKLDist_p7_hmm_CopyParameters_p7_hmm_Create_p7_hmm_CreateBody_p7_hmm_CreateShell_p7_hmm_DecodeStatetype_p7_hmm_Destroy_p7_hmm_Dump_p7_hmm_EncodeStatetype_p7_hmm_GetSimpleRepeats_p7_hmm_Renormalize_p7_hmm_Sample_p7_hmm_SampleEnumerable_p7_hmm_SampleUngapped_p7_hmm_SampleUniform_p7_hmm_Scale_p7_hmm_SetAccession_p7_hmm_SetComposition_p7_hmm_SetConsensus_p7_hmm_SetCtime_p7_hmm_SetDescription_p7_hmm_SetName_p7_hmm_Validate_p7_hmm_Zero_p7_hmmfile_Close_p7_hmmfile_CreateLock_p7_hmmfile_Open_p7_hmmfile_OpenBuffer_p7_hmmfile_OpenE_p7_hmmfile_OpenENoDB_p7_hmmfile_OpenNoDB_p7_hmmfile_Position_p7_hmmfile_PositionByKey_p7_hmmfile_Read_p7_hmmfile_WriteASCII_p7_hmmfile_WriteBinary_p7_hmmfile_WriteToString_p7_omx_Create_p7_omx_Destroy_p7_omx_DumpFBRow_p7_omx_DumpMFRow_p7_omx_DumpVFRow_p7_omx_FDeconvert_p7_omx_GrowTo_p7_omx_Reuse_p7_omx_SetDumpMode_p7_oprofile_Clone_p7_oprofile_Compare_p7_oprofile_Convert_p7_oprofile_Copy_p7_oprofile_Create_p7_oprofile_Destroy_p7_oprofile_Dump_p7_oprofile_GetFwdTransitionArray_p7_oprofile_GetMSVEmissionArray_p7_oprofile_IsLocal_p7_oprofile_ReconfigLength_p7_oprofile_ReconfigMSVLength_p7_oprofile_ReconfigMultihit_p7_oprofile_ReconfigRestLength_p7_oprofile_ReconfigUnihit_p7_oprofile_Sample_p7_oprofile_Sizeof_p7_profile_Clone_p7_profile_Compare_p7_profile_Copy_p7_profile_Create_p7_profile_Destroy_p7_profile_GetT_p7_profile_IsLocal_p7_profile_IsMultihit_p7_profile_Reuse_p7_profile_SameAsMF_p7_profile_SameAsVF_p7_profile_SetNullEmissions_p7_profile_Sizeof_p7_profile_Validate_p7_trace_Append_p7_trace_AppendWithPP_p7_trace_Compare_p7_trace_Count_p7_trace_Create_p7_trace_CreateWithPP_p7_trace_Destroy_p7_trace_DestroyArray_p7_trace_Doctor_p7_trace_Dump_p7_trace_FauxFromMSA_p7_trace_GetDomainCoords_p7_trace_GetDomainCount_p7_trace_GetExpectedAccuracy_p7_trace_GetStateUseCounts_p7_trace_Grow_p7_trace_GrowIndex_p7_trace_GrowIndexTo_p7_trace_GrowTo_p7_trace_Index_p7_trace_Reuse_p7_trace_Reverse_p7_trace_Score_p7_trace_SetPP_p7_trace_Validate_reuse_result_run_hmmer_pipeline_trace_into_wrapper_resultsstart__DefaultRuneLocale___error___maskrune___sprintf_chk___stack_chk_fail___stack_chk_guard___stderrp___stdinp___stdoutp___tolower___toupper_abort_atof_atoi_atoll_ceil_ceilf_ctime_r_exit_exp_expf_fclose_fdopen_feof_fflush_fgets_floor_floorf_fopen_fprintf_fputc_fputs_fread_free_fseeko_ftello_fwrite_getcwd_getegid_getenv_geteuid_getgid_getpid_getuid_log_logf_malloc_memcmp_memcpy_memmove_memset_mkstemp_pclose_perror_popen_pow_printf_pthread_mutex_destroy_pthread_mutex_init_puts_qsort_realloc_remove_roundf_snprintf_sprintf_stat$INODE64_strcasecmp_strcat_strchr_strcmp_strcpy_strcspn_strlen_strncmp_strncpy_strrchr_strspn_strtoull_system_tan_time_umask_unlink_vfprintf_vsnprintfdyld_stub_binderAlignmentTools-1.2.0/manifest.mf000066400000000000000000000001221246663120000165760ustar00rootroot00000000000000Manifest-Version: 1.0 X-COMMENT: Main-Class will be added automatically by build AlignmentTools-1.2.0/nbproject/000077500000000000000000000000001246663120000164375ustar00rootroot00000000000000AlignmentTools-1.2.0/nbproject/build-impl.xml000066400000000000000000002312141246663120000212220ustar00rootroot00000000000000 Must set src.dir Must set test.src.dir Must set build.dir Must set dist.dir Must set build.classes.dir Must set dist.javadoc.dir Must set build.test.classes.dir Must set build.test.results.dir Must set build.classes.excludes Must set dist.jar Must set javac.includes No tests executed. Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent Must select some files in the IDE or set javac.includes To run this application from the command line without Ant, try: java -jar "${dist.jar.resolved}" Must select one file in the IDE or set run.class Must select one file in the IDE or set run.class Must select one file in the IDE or set debug.class Must select one file in the IDE or set debug.class Must set fix.includes This target only works when run from inside the NetBeans IDE. Must select one file in the IDE or set profile.class This target only works when run from inside the NetBeans IDE. This target only works when run from inside the NetBeans IDE. This target only works when run from inside the NetBeans IDE. Must select one file in the IDE or set run.class Must select some files in the IDE or set test.includes Must select one file in the IDE or set run.class Must select one file in the IDE or set applet.url Must select some files in the IDE or set javac.includes Some tests failed; see details above. Must select some files in the IDE or set test.includes Some tests failed; see details above. Must select some files in the IDE or set test.class Must select some method in the IDE or set test.method Some tests failed; see details above. Must select one file in the IDE or set test.class Must select one file in the IDE or set test.class Must select some method in the IDE or set test.method Must select one file in the IDE or set applet.url Must select one file in the IDE or set applet.url AlignmentTools-1.2.0/nbproject/genfiles.properties000066400000000000000000000007231246663120000223530ustar00rootroot00000000000000build.xml.data.CRC32=f22a2ecb build.xml.script.CRC32=be367344 build.xml.stylesheet.CRC32=28e38971@1.56.1.46 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=f22a2ecb nbproject/build-impl.xml.script.CRC32=1c211403 nbproject/build-impl.xml.stylesheet.CRC32=5a01deb7@1.68.1.46 AlignmentTools-1.2.0/nbproject/project.properties000066400000000000000000000051401246663120000222230ustar00rootroot00000000000000annotation.processing.enabled=true annotation.processing.enabled.in.editor=false annotation.processing.processors.list= annotation.processing.run.all.processors=true annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output application.title=AlignmentTools application.vendor=fishjord build.classes.dir=${build.dir}/classes build.classes.excludes=**/*.java,**/*.form # This directory is removed when the project is cleaned: build.dir=build build.generated.dir=${build.dir}/generated build.generated.sources.dir=${build.dir}/generated-sources # Only compile against the classpath explicitly listed here: build.sysclasspath=ignore build.test.classes.dir=${build.dir}/test/classes build.test.results.dir=${build.dir}/test/results # Uncomment to specify the preferred debugger connection transport: #debug.transport=dt_socket debug.classpath=\ ${run.classpath} debug.test.classpath=\ ${run.test.classpath} # This directory is removed when the project is cleaned: dist.dir=dist dist.jar=${dist.dir}/AlignmentTools.jar dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= file.reference.commons-cli-1.2.jar=lib/commons-cli-1.2.jar includes=** jar.compress=false javac.classpath=\ ${file.reference.commons-cli-1.2.jar}:\ ${reference.ReadSeq.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false javac.processorpath=\ ${javac.classpath} javac.source=1.5 javac.target=1.5 file.reference.junit.jar=/scratch/jars/junit.jar javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ ${file.reference.junit.jar} javac.test.processorpath=\ ${javac.test.classpath} javadoc.additionalparam= javadoc.author=false javadoc.encoding=${source.encoding} javadoc.noindex=false javadoc.nonavbar=false javadoc.notree=false javadoc.private=false javadoc.splitindex=true javadoc.use=true javadoc.version=false javadoc.windowtitle= main.class=edu.msu.cme.rdp.alignment.AlignmentToolsMain manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF mkdist.disabled=false platform.active=default_platform project.ReadSeq=../ReadSeq reference.ReadSeq.jar=${project.ReadSeq}/dist/ReadSeq.jar run.classpath=\ ${javac.classpath}:\ ${build.classes.dir} # Space-separated list of JVM arguments used when running the project # (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value # or test-sys-prop.name=value to set system properties for unit tests): run.jvmargs= run.test.classpath=\ ${javac.test.classpath}:\ ${build.test.classes.dir} source.encoding=UTF-8 src.dir=src test.src.dir=test project.license=gpl30 AlignmentTools-1.2.0/nbproject/project.xml000066400000000000000000000016411246663120000206310ustar00rootroot00000000000000 org.netbeans.modules.java.j2seproject AlignmentTools ReadSeq jar jar clean jar AlignmentTools-1.2.0/parseErrorAnalysis.py000077500000000000000000000564541246663120000206740ustar00rootroot00000000000000#! /usr/bin/python import os import sys from optparse import OptionParser from Bio import SeqIO import re sys.path.append("/work/wangqion/python_scripts/") import seq_trimmer_model base_regex = re.compile("[^A-Za-z]") class SequenceMatch: def __init__(self, query, match): self.query = query self.match = match self.mismatches = list() self.indels = list() self.avg_qscore = -1 def process_qual(self, line): self.avg_qscore = float(line.strip().split()[1]) def process_mismatch(self, line): ##ref_pos from mismatch and indel starts from 1 lexemes = line.strip().split() mismatch = dict() mismatch["r_char"] = lexemes[3] mismatch["q_char"] = lexemes[4] mismatch["query_pos"] = lexemes[5] mismatch["ref_pos"] = lexemes[6] mismatch["qscore"] = lexemes[7] self.mismatches.append(mismatch) def process_indel(self, line): ##ref_pos from mismatch and indel starts from 1 lexemes = line.strip().split() indel = dict() indel["ref_homo_count"] = lexemes[3] indel["query_homo_count"] = lexemes[4] indel["badchar"] = lexemes[5] indel["query_pos"] = lexemes[6] indel["ref_pos"] = lexemes[7] indel["qscore"] = lexemes[8] self.indels.append(indel) def read_files(match_file, mismatch_file, indel_file, qscore_file): seq_dict = dict() for line in open(match_file): line = line.strip() if ( line != "" and line[0] == ">"): lexemes = line.split() seq_dict[lexemes[1]] = SequenceMatch(lexemes[1], lexemes[2]) # for line in open(mismatch_file): line = line.strip() if ( line != ""): lexemes = line.split() seq_dict[lexemes[0]].process_mismatch(line) # for line in open(indel_file): line = line.strip() if ( line != ""): lexemes = line.split() seq_dict[lexemes[0]].process_indel(line) # if qscore_file != None: for line in open(qscore_file): line = line.strip() if ( line != ""): lexemes = line.split() seq_dict[lexemes[0]].process_qual(line) return seq_dict def removeBadseq(bad_idfile, seq_dict): for line in open(bad_idfile): line = line.strip() if ( line != ""): lexemes = line.split() if ( lexemes[0] in seq_dict): del seq_dict[lexemes[0]] def removeFailedChopseq(chop_seq_dict, seq_dict): for seqID in seq_dict.keys(): if ( seqID not in chop_seq_dict): del seq_dict[seqID] def process_std_seq(infile): ## need the definition for the sequences std_dict = dict() for line in open(infile): line = line.strip() if ( line != "" and line[0] == ">"): lexemes = line.split() if (len(lexemes) <2 ): definition = lexemes[0].replace(">", "") else: definition = "" for index in range( 1, len(lexemes)): definition += " " + lexemes[index] std_dict[lexemes[0].replace(">", "")] = definition return std_dict def process_model_pos_map(infile): ## unalign_pos (start from 0, need to change to 1 since the ref_pos from mismatch and indel starts from 1), model_pos ## format: seqid frame unalign_pos model_pos seq_modelpos_dict = dict() for line in open(infile): line = line.strip() if ( line != ""): lexemes = line.split("\t") modelpos_dict = seq_modelpos_dict.get(lexemes[0], dict()) adjusted_unalign_pos = int(lexemes[1]) -1 modelpos_dict[adjusted_unalign_pos] = lexemes[2] seq_modelpos_dict[lexemes[0]] = modelpos_dict return seq_modelpos_dict # calculate the total number of seqs matched to the std seqs def get_totalseq_count(seq_dict, qscore_cutoff): total_seq = 0 for seqID in seq_dict.keys(): seq = seq_dict[seqID] if seq.avg_qscore > qscore_cutoff or seq.avg_qscore == -1: total_seq += 1 return total_seq # print the match count to the std seqs def get_match_count(seq_dict, qscore_cutoff): match_count_dict = dict() for seqID in seq_dict.keys(): seq = seq_dict[seqID] ## if there is no quality score info, we just count it if seq.avg_qscore > qscore_cutoff or seq.avg_qscore == -1: match_count_dict[seq.match] = match_count_dict.get(seq.match,0) +1 return match_count_dict ## print the copies of the standard sequences from the same organism def get_std_copy(std_dict): name_dict = dict() print "\n### standard sequences ###" print "standard_id\tdefinition" for id in sorted(std_dict.keys()): print "%s\t%s" %(id, std_dict[id]) name = std_dict[id] name_dict[name] = name_dict.get(name, 0) +1 print "\n### standard sequence copies ###" print "standard_definition\tcount" for name in sorted(name_dict.keys()): print "%s\t%s" %(name, name_dict.get(name)) def get_total_match_count(seq_dict, std_dict): q0_match_count_dict = get_match_count(seq_dict, 0) totalseq_count = get_totalseq_count(seq_dict, 0) print "\n### best reference match count for seq with average QScore >=0 ###" print "standard_seqID\tdefinition\tQScore_0_count\tQScore_0_pct" for id in sorted(q0_match_count_dict.keys()): print "%s\t%s\t%s\t%s" %(id, std_dict[id], q0_match_count_dict[id], float(100*q0_match_count_dict.get(id,0))/float(totalseq_count)) ##compare the match count based on different qscore cutoff def compare_match_count(seq_dict, std_dict, qscore_cutoff): q0_match_count_dict = get_match_count(seq_dict, 0) totalseq_count = get_totalseq_count(seq_dict, 0) #qcutoff_match_count_dict = get_match_count(seq_dict, qscore_cutoff) print "\n### percent sequences passed the Qscore cutoff comparing to the ones passing QScore 0 ###" header = "Qscore_cutoff"; for id in sorted(q0_match_count_dict.keys()): header += "\t" + id print "%s" %(header) for cutoff in range ( 15 , qscore_cutoff): qcutoff_match_count_dict = get_match_count(seq_dict, cutoff) outstring = str(cutoff) for id in sorted(q0_match_count_dict.keys()): outstring += "\t" + str(float(100*qcutoff_match_count_dict.get(id,0))/float(q0_match_count_dict[id])) print "%s" %(outstring) # print the number_errors, seq count def get_error_count(seq_dict): count_dict = dict() total_mismatches = 0 total_indels = 0 for seqID in seq_dict.keys(): seq = seq_dict[seqID] mismatch_indels = len(seq.mismatches) + len(seq.indels) count_dict[mismatch_indels] = count_dict.get(mismatch_indels,0) +1 total_mismatches += len(seq.mismatches) total_indels += len(seq.indels) total_seqs = get_totalseq_count(seq_dict, 0) print "\n### total mismatches and indels ###" print "Total seqs\tTotal Mismatches\tTotal Indels" print "%s\t%s\t%s\t" %(total_seqs, total_mismatches, total_indels) print "\n### mismatches and indels sequence count###" print "no_mismatch_indels\tcount\tpercent_seq\tpercent_error" for key in sorted(count_dict.keys()): print "%s\t%s\t%s\t%s" %(key, count_dict[key], float(100*count_dict[key])/float( len(seq_dict.keys()) ), float(100*key*count_dict[key])/float(total_mismatches+total_indels )) # group by each standard sequence, print the number_errors, seq count def get_error_count_by_std(seq_dict): match_dict = dict() total_mismatch_indels = 0 seq_error_dict = dict() for seqID in seq_dict.keys(): seq = seq_dict[seqID] mismatch_indels = len(seq.mismatches) + len(seq.indels) match_dict[seq.match]= match_dict.get(seq.match, dict()) count_dict = match_dict.get(seq.match) count_dict[mismatch_indels] = count_dict.get(mismatch_indels,0) +1 total_mismatch_indels += mismatch_indels seq_error_dict[seq.match] = int(seq_error_dict.get(seq.match, 0)) + mismatch_indels print "\n### mismatches and indels sequence count group by standard sequence###" print "standard_seqID\ttotal_no_mismatch_indels\tpercent_error" for std_ID in seq_error_dict.keys(): print "%s\t%s\t%s" %(std_ID, seq_error_dict.get(std_ID), float(100*seq_error_dict.get(std_ID))/float(total_mismatch_indels)) print print "standard_seqID\tno_mismatch_indels\tcount\tpercent_error" for std_ID in sorted(match_dict.keys()): print "" count_dict = match_dict.get(std_ID) for key in sorted(count_dict.keys()): if ( int(seq_error_dict.get(std_ID)) == 0): print "%s\t%s\t%s\t%s" %(std_ID, key, count_dict[key], 0) else: print "%s\t%s\t%s\t%s" %(std_ID, key, count_dict[key], float(100*key*count_dict[key])/float( int(seq_error_dict.get(std_ID)))) def get_hotspot(seq_dict, seq_modelpos_dict): mismatch_count_dict = dict() indel_count_dict = dict() total_mismatches = 0 total_indels = 0 for seqID in seq_dict.keys(): seq = seq_dict[seqID] for mismatch in seq.mismatches: if ( int(mismatch["ref_pos"]) in seq_modelpos_dict.get(seq.match)): modelpos = int(seq_modelpos_dict.get(seq.match).get( int(mismatch["ref_pos"]))) else: modelpos = -1 mismatch_count_dict[modelpos] = mismatch_count_dict.get(modelpos, 0) +1 total_mismatches += 1 for indel in seq.indels: if ( int(indel["ref_pos"]) in seq_modelpos_dict.get(seq.match)) : modelpos = int(seq_modelpos_dict.get(seq.match).get(int(indel["ref_pos"])) ) else: modelpos = -1 indel_count_dict[modelpos] = indel_count_dict.get(modelpos, 0) +1 total_indels += 1 print "\n### mismatch hot spots###" print "std_model_pos\tcount\tpercent mismatches\tcumulative mismatches" total = 0 for key in sorted(mismatch_count_dict.keys()): total += mismatch_count_dict[key] print "%s\t%s\t%s\t%s" %(key, mismatch_count_dict[key], float(100*mismatch_count_dict[key])/float(total_mismatches ), float(100*total)/float( total_mismatches)) print "\n### indel hot spots###" print "std_model_pos\tcount\tpercent indels\tcumulative indels" total = 0 for key in sorted(indel_count_dict.keys()): total += indel_count_dict[key] print "%s\t%s\t%s\t%s" %(key, indel_count_dict[key], float(100*indel_count_dict[key])/float( total_indels ), float(100*total)/float( total_indels) ) ## remove the mismatch and indels occurs outside the allowed model_pos range def remove_dontcare_error(seq_dict, seq_modelpos_dict, start_pos, end_pos): for seqID in seq_dict.keys(): seq = seq_dict[seqID] temp_mismatches = list() for index in range( len(seq.mismatches) ): mismatch = seq.mismatches[index] ## there are cases where the nucleotides don't code a amino acid and don't have corresponding alignment position modelpos = int(seq_modelpos_dict.get(seq.match).get( int(mismatch["ref_pos"]), -1)) if ( modelpos >= start_pos and modelpos <= end_pos): temp_mismatches.append(mismatch) #else: # print "remove mismatch %s\t%s\t%s" %(seqID, modelpos, mismatch) seq.mismatches = temp_mismatches temp_indels = list(); for index in range( len(seq.indels) ): indel = seq.indels[index] modelpos = int(seq_modelpos_dict.get(seq.match).get( int(indel["ref_pos"]), -1)) if ( modelpos >= start_pos and modelpos <= end_pos): temp_indels.append(indel) #else : # print "remove indel %s\t%s\t%s" %(seqID, modelpos, indel) seq.indels = temp_indels #Mismatch mapped to each standard sequence ## refseq --> ref_pos --> r_char + q_char --> count def get_mismatch_stdseq(seq_dict, seq_modelpos_dict): mismatch_dict = dict() totalseq_count_dict = get_match_count(seq_dict, 0) for seqID in seq_dict.keys(): seq = seq_dict[seqID] for mismatch in seq.mismatches: mismatch_dict[seq.match]= mismatch_dict.get(seq.match, dict()) refpos_dict = mismatch_dict.get(seq.match) refpos_dict[mismatch["ref_pos"]] = refpos_dict.get(mismatch["ref_pos"], dict()) mismatch_char_dict = refpos_dict.get(mismatch["ref_pos"]) concat_key = mismatch["r_char"] + "\t" + mismatch["q_char"] mismatch_char_dict[concat_key] = mismatch_char_dict.get(concat_key, 0) +1 print "\n### mismatch map to standard sequence ###" print "standard_seqID\tstd_unalign_pos\tstd_model_pos\tr_char\tq_char\tcount\tpercent" for std_ID in sorted(mismatch_dict.keys()): print "" refpos_dict = mismatch_dict.get(std_ID) for ref_pos in sorted(refpos_dict.keys()): modelpos = seq_modelpos_dict.get(std_ID).get( int(ref_pos)) mismatch_char_dict = refpos_dict.get(ref_pos) for mismatch_chars in sorted(mismatch_char_dict.keys()): print "%s\t%s\t%s" %(std_ID, mismatch_char_dict.get(mismatch_chars), totalseq_count_dict.get(std_ID)) print "%s\t%s\t%s\t%s\t%s\t%s" %(std_ID, ref_pos, modelpos, mismatch_chars, mismatch_char_dict.get(mismatch_chars), float(100*mismatch_char_dict.get(mismatch_chars))/float(totalseq_count_dict.get(std_ID))) #indel mapped to each standard sequence ## refseq --> ref_pos --> count def get_indel_stdseq(seq_dict, seq_modelpos_dict): indel_dict = dict() totalseq_count_dict = get_match_count(seq_dict, 0) for seqID in seq_dict.keys(): seq = seq_dict[seqID] for indel in seq.indels: indel_dict[seq.match] = indel_dict.get(seq.match, dict()) refpos_dict = indel_dict.get(seq.match) refpos_dict[indel["ref_pos"]] = refpos_dict.get(indel["ref_pos"], 0) +1 print "\n### indels map to standard sequence ###" print "standard_seqID\tstd_unalign_pos\tstd_model_pos\tcount\tpercent" for std_ID in sorted(indel_dict.keys()): print "" refpos_dict = indel_dict.get(std_ID) for ref_pos in sorted(refpos_dict.keys()): modelpos = seq_modelpos_dict.get(std_ID).get( int(ref_pos)) print "%s\t%s\t%s\t%s\t%s" %(std_ID, ref_pos, modelpos, refpos_dict.get(ref_pos), (float(100*refpos_dict.get(ref_pos))/float(totalseq_count_dict.get(std_ID))) ) ## base substitutions errors def get_base_sub_error(seq_dict): count_dict = dict() for seqID in seq_dict.keys(): seq = seq_dict[seqID] for mismatch in seq.mismatches: concat_key = mismatch["r_char"] + "\t" + mismatch["q_char"] count_dict[concat_key] = count_dict.get(concat_key, 0) +1 print "\n### base substitutions errors ###" print "standard_base\tquery_base\tcount" for mismatch_chars in sorted(count_dict.keys()): print "%s\t%s" %( mismatch_chars, count_dict.get(mismatch_chars)) ## Insertion errors ## def get_indel_error(seq_dict): insertion_count_dict = dict() deletion_count_dict = dict() for seqID in seq_dict.keys(): seq = seq_dict[seqID] for indel in seq.indels: concat_key = indel["ref_homo_count"] + "\t" + indel["query_homo_count"] if (int(indel["ref_homo_count"]) < int(indel["query_homo_count"])): insertion_count_dict[concat_key] = insertion_count_dict.get(concat_key, 0) +1 else: deletion_count_dict[concat_key] = deletion_count_dict.get(concat_key, 0) +1 print "\n### Insertion errors ###" print "ref_homo_count\tquery_homo_count\tcount" for key in sorted(insertion_count_dict.keys()): print "%s\t%s" %( key, insertion_count_dict.get(key)) print "\n### deletion errors ###" print "ref_homo_count\tquery_homo_count\tcount" for key in sorted(deletion_count_dict.keys()): print "%s\t%s" %( key, deletion_count_dict.get(key)) ## of sequences with # of mismatch + indels binned by Qscore def get_error_by_qscore(seq_dict): qscore_dict = dict() for seqID in seq_dict.keys(): seq = seq_dict[seqID] qscore = int(seq.avg_qscore) qscore_dict[qscore] = qscore_dict.get(qscore, dict()) count_dict = qscore_dict.get(qscore) count_dict["no_seqs"] = count_dict.get("no_seqs", 0) +1 count_dict["no_mis_indels"] = count_dict.get("no_mis_indels", 0) + len(seq.mismatches) + len(seq.indels) print "\n### number of sequences with # of mismatch + indels binned by Qscore ###" print "qscore\tno_seqs\tno_mis_indels\terror_per_seq" for qscore in sorted(qscore_dict.keys()): count_dict = qscore_dict.get(qscore) print "%s\t%s\t%s\t%s" %(qscore, count_dict["no_seqs"], count_dict["no_mis_indels"], float(count_dict["no_mis_indels"])/count_dict["no_seqs"] ) #avg qscore histogram def qscore_histogram(seq_dict): count_dict = dict() sum = 0 num_seqs = 0 for seqID in seq_dict.keys(): seq = seq_dict[seqID] qscore = int(seq.avg_qscore) count_dict[qscore] = count_dict.get(qscore,0) +1 sum += seq.avg_qscore num_seqs += 1 print "\n### Q score ###" if ( num_seqs== 0): print "Average Q score: NA" else: print "Average Q score: %s" %( (sum/num_seqs)) print "\n### Q score histogram ###" print "Qscore\tcount\tpercent" total = 0 for key in sorted(count_dict.keys()): total += count_dict[key] print "%s\t%s\t%s" %(key, count_dict[key], float(100*count_dict[key])/float( len(seq_dict.keys()) )) ## plot number of errors and number of seqs passed the Q score filter def qscore_seqpassed(seq_dict): qscore_dict = dict(); min_display_qscore = 10; max_qscore = 40; max_error = 10; for seqID in seq_dict.keys(): seq = seq_dict[seqID] mismatch_indels = len(seq.mismatches) + len(seq.indels) q = 0 while ( q <= max_qscore): if ( seq.avg_qscore >= q): qscore_dict[q] = qscore_dict.get(q, dict()) error_dict = qscore_dict.get(q) if ( mismatch_indels < max_error): error_dict[mismatch_indels] = error_dict.get(mismatch_indels, 0) +1 else : error_dict[max_error] = error_dict.get(max_error, 0) +1 q += 1 print "\n## percent of seqs with the specified error that passed the Q score" header = "Qscore" for e in range(0, max_error): header = header + "\tE" + str(e) header += "\tE>=" + str(max_error) print "%s" %(header) q0_error_dict = qscore_dict.get(0) q = min_display_qscore while ( q <= max_qscore): if q not in qscore_dict.keys(): q +=1 continue; error_dict = qscore_dict.get(q) val = str(q) for e in range(0, max_error+1): if e in error_dict.keys(): val += "\t" + str( float(qscore_dict.get(q).get(e)) *100/ float(q0_error_dict.get(e)) ) else: val += "\t" + str(0) print "%s" %(val) q +=1 ''' print "\n## number of seqs with the specified error that passed the Q score" print "%s" %(header) q0_error_dict = qscore_dict.get(0) q = min_display_qscore while ( q <= max_qscore): if q not in qscore_dict.keys(): q +=1 continue; error_dict = qscore_dict.get(q) val = str(q) for e in range(0, max_error+1): if e in error_dict.keys(): val += "\t" + str( float(qscore_dict.get(q).get(e)) ) else: val += "\t" + str(0) print "%s" %(val) q +=1 ''' ## calculate error for seqs after chopping based on the alignment def calSeqError(seq_dict, chop_seq_dict): count_dict = dict() total_number_seqs = 0 for seqID in chop_seq_dict.keys(): if (seqID not in seq_dict.keys() ): continue if (seqID.startswith("#=") ): continue total_number_seqs += 1 seq = seq_dict[seqID] chopped_len = len(re.subn(base_regex, "", str(chop_seq_dict.get(seqID)))[0]) mismatch_indels = len(seq.mismatches) + len(seq.indels) # step 0.1% pct_error = 1000*float(mismatch_indels) /chopped_len #print "found %s\t%s\t%s\t%s\t%s" %(seqID, pct_error, mismatch_indels, chopped_len, int(pct_error) ) count_dict[int(pct_error)] = count_dict.get(int(pct_error),0) +1 print "\n### error/seq after chopping the seqs ###" print "percent_error\tpercent_seq_passed" cum = 0 for key in sorted(count_dict.keys()): cum += count_dict[key] ## back to percent print "%s\t%s" %(float(key)/float(10), float(cum)/float(total_number_seqs)) ## remove seq with certain % error def rmSeqwithError(seq_dict, chop_seq_dict, error_cutoff): for seqID in chop_seq_dict.keys(): if (seqID not in seq_dict.keys() ): continue seq = seq_dict[seqID] chopped_len = len(re.subn(base_regex, "", str(chop_seq_dict.get(seqID)))[0]) mismatch_indels = len(seq.mismatches) + len(seq.indels) error = float(mismatch_indels) /chopped_len if ( error > error_cutoff): del seq_dict[seqID] def getFileName(fileNameWithPath): lexemes = fileNameWithPath.split('/') return lexemes[len(lexemes)-1] if __name__ == "__main__": usage="usage: %prog [options] pairwise.txt mismatch.txt indel.txt standard_nucl_seqs.fa" parser = OptionParser(usage=usage) parser.add_option("-q", "--qual", dest="quality_file",help="quality output file from errorcheck program", metavar="FILE") parser.add_option("-i", "--ignore", dest="ignore_ids",help="ignored sequence ids", metavar="FILE") parser.add_option("-c", "--ignore_chimera", dest="ignore_chimera_ids",help="ignored chimera sequence ids", metavar="FILE") parser.add_option("-m", "--model_pos_mapping", dest="model_pos_mapping",help="model position mapping file for standard seqs", metavar="FILE") parser.add_option("-s", "--start", dest="start_model_pos", help="start DNA model position to be included") parser.add_option("-e", "--end", dest="end_model_pos", help="end DNA model position to be included") parser.add_option("-a", "--align", dest="aligned_query_file", help="to calculate errors in the query file") (options, args) = parser.parse_args() if len(args) != 4: parser.error("Incorrect number of arguments") argsStr = '' for arg in args: argsStr += getFileName(arg) + " " print "arguments: %s" %( argsStr) qual_file = None if options.quality_file: qual_file = options.quality_file if options.start_model_pos: if not options.end_model_pos: options.end_model_pos = sys.maxint if options.end_model_pos: if not options.start_model_pos: options.start_model_pos = -sys.maxint -1 seq_dict = read_files(args[0], args[1], args[2], qual_file); std_dict = process_std_seq(args[3]) if options.model_pos_mapping: print "read model position mapppig file: %s" %( getFileName(options.model_pos_mapping)) seqs_model_pos_dict = process_model_pos_map(options.model_pos_mapping) if options.ignore_ids: print "remove ignored ids from file: %s" %(getFileName(options.ignore_ids)) removeBadseq(options.ignore_ids, seq_dict) if options.ignore_chimera_ids: print "remove ignored chimera ids from file: %s" %(getFileName(options.ignore_chimera_ids)) removeBadseq(options.ignore_chimera_ids, seq_dict) if options.start_model_pos or options.end_model_pos: print "remove positons outside of this range: \t%s\t%s" %(options.start_model_pos, options.end_model_pos) if not options.model_pos_mapping : parser.error("start_model_pos or end_model_pos requires a model_pos_mapping file") remove_dontcare_error(seq_dict, seqs_model_pos_dict, int(options.start_model_pos), int(options.end_model_pos)) if options.aligned_query_file: if not options.start_model_pos and not options.end_model_pos : parser.error("requires start_model_pos and end_model_pos to calculate the error in the sequences using the alignment file to slice") else: print "chop the sequences form start to end: \t%s\t%s" %(options.start_model_pos, options.end_model_pos) seq_before_chop = get_totalseq_count(seq_dict, 0) chop_seq_dict= seq_trimmer_model.chop(options.aligned_query_file, int(options.start_model_pos), int(options.end_model_pos)) removeFailedChopseq(chop_seq_dict, seq_dict) seq_after_chop = get_totalseq_count(seq_dict, 0) calSeqError(seq_dict, chop_seq_dict) rmSeqwithError(seq_dict, chop_seq_dict, 0.03) seq_after_rmerror = get_totalseq_count(seq_dict, 0) print "\ntotal number of seqs before chop\tafter chop\tafter remove 3%error" print "%s\t%s\t%s" %(seq_before_chop, seq_after_chop, seq_after_rmerror) q0_match_count_dict = get_match_count(seq_dict, 0) totalseq_count = get_totalseq_count(seq_dict, 0) print "\n### best reference match count for seq " print "standard_seqID\tdefinition\tseq_count\tseq%" for id in sorted(q0_match_count_dict.keys()): print "%s\t%s\t%s\t%s" %(id, std_dict[id], q0_match_count_dict[id], float(100*q0_match_count_dict.get(id,0))/float(totalseq_count)) sys.exit() print "" get_std_copy(std_dict) get_error_count(seq_dict) get_total_match_count(seq_dict, std_dict) compare_match_count(seq_dict, std_dict,40) qscore_seqpassed(seq_dict) get_error_count_by_std(seq_dict) qscore_histogram(seq_dict) get_error_by_qscore(seq_dict) get_base_sub_error(seq_dict) get_indel_error(seq_dict) if options.model_pos_mapping : get_hotspot(seq_dict,seqs_model_pos_dict) get_mismatch_stdseq(seq_dict, seqs_model_pos_dict) get_indel_stdseq(seq_dict, seqs_model_pos_dict) AlignmentTools-1.2.0/src/000077500000000000000000000000001246663120000152405ustar00rootroot00000000000000AlignmentTools-1.2.0/src/data/000077500000000000000000000000001246663120000161515ustar00rootroot00000000000000AlignmentTools-1.2.0/src/data/NUC.4.4000066400000000000000000000022231246663120000170240ustar00rootroot00000000000000# # This matrix was created by Todd Lowe 12/10/92 # # Uses ambiguous nucleotide codes, probabilities rounded to # nearest integer # # Lowest score = -4, Highest score = 5 # A T G C S W R Y K M B V H D N A 5 -4 -4 -4 -4 1 1 -4 -4 1 -4 -1 -1 -1 -2 T -4 5 -4 -4 -4 1 -4 1 1 -4 -1 -4 -1 -1 -2 G -4 -4 5 -4 1 -4 1 -4 1 -4 -1 -1 -4 -1 -2 C -4 -4 -4 5 1 -4 -4 1 -4 1 -1 -1 -1 -4 -2 S -4 -4 1 1 -1 -4 -2 -2 -2 -2 -1 -1 -3 -3 -1 W 1 1 -4 -4 -4 -1 -2 -2 -2 -2 -3 -3 -1 -1 -1 R 1 -4 1 -4 -2 -2 -1 -4 -2 -2 -3 -1 -3 -1 -1 Y -4 1 -4 1 -2 -2 -4 -1 -2 -2 -1 -3 -1 -3 -1 K -4 1 1 -4 -2 -2 -2 -2 -1 -4 -1 -3 -3 -1 -1 M 1 -4 -4 1 -2 -2 -2 -2 -4 -1 -3 -1 -1 -3 -1 B -4 -1 -1 -1 -1 -3 -3 -1 -1 -3 -1 -2 -2 -2 -1 V -1 -4 -1 -1 -1 -3 -1 -3 -3 -1 -2 -1 -2 -2 -1 H -1 -1 -4 -1 -3 -1 -3 -1 -3 -1 -2 -2 -1 -2 -1 D -1 -1 -1 -4 -3 -1 -1 -3 -1 -3 -2 -2 -2 -1 -1 N -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 AlignmentTools-1.2.0/src/data/blosum62.txt000066400000000000000000000041101246663120000203570ustar00rootroot00000000000000# Matrix made by matblas from blosum62.iij # * column uses minimum score # BLOSUM Clustered Scoring Matrix in 1/2 Bit Units # Blocks Database = /data/blocks_5.0/blocks.dat # Cluster Percentage: >= 62 # Entropy = 0.6979, Expected = -0.5209 A R N D C Q E G H I L K M F P S T W Y V B Z X * A 4 -1 -2 -2 0 -1 -1 0 -2 -1 -1 -1 -1 -2 -1 1 0 -3 -2 0 -2 -1 0 -4 R -1 5 0 -2 -3 1 0 -2 0 -3 -2 2 -1 -3 -2 -1 -1 -3 -2 -3 -1 0 -1 -4 N -2 0 6 1 -3 0 0 0 1 -3 -3 0 -2 -3 -2 1 0 -4 -2 -3 3 0 -1 -4 D -2 -2 1 6 -3 0 2 -1 -1 -3 -4 -1 -3 -3 -1 0 -1 -4 -3 -3 4 1 -1 -4 C 0 -3 -3 -3 9 -3 -4 -3 -3 -1 -1 -3 -1 -2 -3 -1 -1 -2 -2 -1 -3 -3 -2 -4 Q -1 1 0 0 -3 5 2 -2 0 -3 -2 1 0 -3 -1 0 -1 -2 -1 -2 0 3 -1 -4 E -1 0 0 2 -4 2 5 -2 0 -3 -3 1 -2 -3 -1 0 -1 -3 -2 -2 1 4 -1 -4 G 0 -2 0 -1 -3 -2 -2 6 -2 -4 -4 -2 -3 -3 -2 0 -2 -2 -3 -3 -1 -2 -1 -4 H -2 0 1 -1 -3 0 0 -2 8 -3 -3 -1 -2 -1 -2 -1 -2 -2 2 -3 0 0 -1 -4 I -1 -3 -3 -3 -1 -3 -3 -4 -3 4 2 -3 1 0 -3 -2 -1 -3 -1 3 -3 -3 -1 -4 L -1 -2 -3 -4 -1 -2 -3 -4 -3 2 4 -2 2 0 -3 -2 -1 -2 -1 1 -4 -3 -1 -4 K -1 2 0 -1 -3 1 1 -2 -1 -3 -2 5 -1 -3 -1 0 -1 -3 -2 -2 0 1 -1 -4 M -1 -1 -2 -3 -1 0 -2 -3 -2 1 2 -1 5 0 -2 -1 -1 -1 -1 1 -3 -1 -1 -4 F -2 -3 -3 -3 -2 -3 -3 -3 -1 0 0 -3 0 6 -4 -2 -2 1 3 -1 -3 -3 -1 -4 P -1 -2 -2 -1 -3 -1 -1 -2 -2 -3 -3 -1 -2 -4 7 -1 -1 -4 -3 -2 -2 -1 -2 -4 S 1 -1 1 0 -1 0 0 0 -1 -2 -2 0 -1 -2 -1 4 1 -3 -2 -2 0 0 0 -4 T 0 -1 0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1 1 5 -2 -2 0 -1 -1 0 -4 W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1 1 -4 -3 -2 11 2 -3 -4 -3 -2 -4 Y -2 -2 -2 -3 -2 -1 -2 -3 2 -1 -1 -2 -1 3 -3 -2 -2 2 7 -1 -3 -2 -1 -4 V 0 -3 -3 -3 -1 -2 -2 -3 -3 3 1 -2 1 -1 -2 -2 0 -3 -1 4 -3 -2 -1 -4 B -2 -1 3 4 -3 0 1 -1 0 -3 -4 0 -3 -3 -2 0 -1 -4 -3 -3 4 1 -1 -4 Z -1 0 0 1 -3 3 4 -2 0 -3 -3 1 -1 -3 -1 0 -1 -3 -2 -2 1 4 -1 -4 X 0 -1 -1 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 0 0 -2 -1 -1 -1 -1 -1 -4 * -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 1AlignmentTools-1.2.0/src/data/blosum62_metric.txt000066400000000000000000000037041246663120000217320ustar00rootroot00000000000000# Matrix from Weijia Xu's thesis # On Integrating Biological Sequence Analysis with Metric Distance # Based Database Management Systems A R N D C Q E G H I L K M F P S T W Y V B Z X * A 0 -6 -7 -7 -5 -6 -6 -5 -7 -6 -6 -6 -6 -7 -6 -4 -5 -8 -7 -5 -7 -6 -5 -9 R -6 0 -5 -7 -8 -4 -5 -7 -5 -8 -7 -3 -6 -8 -7 -6 -6 -8 -7 -8 -6 -5 -6 -9 N -7 -5 0 -3 -8 -5 -5 -5 -4 -8 -8 -5 -7 -8 -7 -4 -5 -9 -7 -8 -2 -5 -6 -9 D -7 -7 -3 0 -8 -5 -3 -6 -6 -8 -9 -6 -8 -8 -6 -5 -6 -9 -8 -8 -1 -4 -6 -9 C -5 -8 -8 -8 0 -8 -9 -8 -8 -6 -6 -8 -6 -7 -8 -6 -6 -7 -7 -6 -8 -8 -7 -9 Q -6 -4 -5 -5 -8 0 -3 -7 -5 -8 -7 -4 -5 -8 -6 -5 -6 -7 -6 -7 -5 -2 -6 -9 E -6 -5 -5 -3 -9 -3 0 -7 -5 -8 -8 -4 -7 -8 -6 -5 -6 -8 -7 -7 -4 -1 -6 -9 G -5 -7 -5 -6 -8 -7 -7 0 -7 -9 -9 -7 -8 -8 -7 -5 -7 -7 -8 -8 -6 -7 -6 -9 H -7 -5 -4 -6 -8 -5 -5 -7 0 -8 -8 -6 -7 -6 -7 -6 -7 -6 -3 -8 -5 -5 -6 -9 I -6 -8 -8 -8 -6 -8 -8 -9 -8 0 -3 -8 -4 -5 -8 -7 -6 -8 -6 -2 -8 -8 -6 -9 L -6 -7 -8 -9 -6 -7 -8 -9 -8 -3 0 -7 -3 -5 -8 -7 -6 -7 -6 -4 -9 -8 -6 -9 K -6 -3 -5 -6 -8 -4 -4 -7 -6 -8 -7 0 -6 -8 -6 -5 -6 -8 -7 -7 -5 -4 -6 -9 M -6 -6 -7 -8 -6 -5 -7 -8 -7 -4 -3 -6 0 -5 -7 -6 -6 -6 -6 -4 -8 -6 -6 -9 F -7 -8 -8 -8 -7 -8 -8 -8 -6 -5 -5 -8 -5 0 -9 -7 -7 -4 -2 -6 -8 -8 -6 -9 P -6 -7 -7 -6 -8 -6 -6 -7 -7 -8 -8 -6 -7 -9 0 -6 -6 -9 -8 -7 -7 -6 -7 -9 S -4 -6 -4 -5 -6 -5 -5 -5 -6 -7 -7 -5 -6 -7 -6 0 -4 -8 -7 -7 -5 -5 -5 -9 T -5 -6 -5 -6 -6 -6 -6 -7 -7 -6 -6 -6 -6 -7 -6 -4 0 -7 -7 -5 -6 -6 -5 -9 W -8 -8 -9 -9 -7 -7 -8 -7 -6 -8 -7 -8 -6 -4 -9 -8 -7 0 -3 -8 -9 -8 -7 -9 Y -7 -7 -7 -8 -7 -6 -7 -8 -3 -6 -6 -7 -6 -2 -8 -7 -7 -3 0 -6 -8 -7 -6 -9 V -5 -8 -8 -8 -6 -7 -7 -8 -8 -2 -4 -7 -4 -6 -7 -7 -5 -8 -6 0 -8 -7 -6 -9 B -7 -6 -2 -1 -8 -5 -4 -6 -5 -8 -9 -5 -8 -8 -7 -5 -6 -9 -8 -8 0 -4 -6 -9 Z -6 -5 -5 -4 -8 -2 -1 -7 -5 -8 -8 -4 -6 -8 -6 -5 -6 -8 -7 -7 -4 0 -6 -9 X -5 -6 -6 -6 -7 -6 -6 -6 -6 -6 -6 -6 -6 -6 -7 -5 -5 -7 -6 -6 -6 -6 0 -9 * -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 0 AlignmentTools-1.2.0/src/data/simple_scoringmatrix.txt000066400000000000000000000015141246663120000231550ustar00rootroot00000000000000## this is a simple scoring function used for pairwise alignment to measue error rate ## By Qiong Wang 04/2013 A T G C S W R Y K M B V H D N A 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 T -1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 G -1 -1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 C -1 -1 -1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 S -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 W -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 R -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 Y -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 K -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 M -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 B -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 V -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 H -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 D -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 N -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 AlignmentTools-1.2.0/src/edu/000077500000000000000000000000001246663120000160155ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/000077500000000000000000000000001246663120000166215ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/000077500000000000000000000000001246663120000173655ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/000077500000000000000000000000001246663120000201525ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/000077500000000000000000000000001246663120000221305ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/AlignNucleotideToProtein.java000066400000000000000000000144431246663120000277130ustar00rootroot00000000000000/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.msu.cme.rdp.alignment; import edu.msu.cme.rdp.readseq.utils.ProteinUtils; import edu.msu.cme.rdp.readseq.utils.SeqUtils; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.writers.FastaWriter; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; /** * * @author fishjord */ public class AlignNucleotideToProtein { public static void main(String[] args) throws Exception { if (args.length != 4) { System.err.println("USAGE: AlignNucleotideToProtein "); return; } File alignProtSeqFile = new File(args[0]); File nuclSeqFile = new File(args[1]); File alignedNuclOutFile = new File(args[2]); File statsOut = new File(args[3]); Map protTemplateMap = new HashMap(); for (Sequence seq : SequenceReader.readFully(alignProtSeqFile)) { protTemplateMap.put(seq.getSeqName(), seq); } SequenceReader nuclSeqReader = new SequenceReader(nuclSeqFile); Sequence seq; PrintStream out = new PrintStream(statsOut); FastaWriter alignedNuclOut = new FastaWriter(alignedNuclOutFile); boolean seqHasStop = false; while ((seq = nuclSeqReader.readNextSequence()) != null) { Sequence protTemplate = protTemplateMap.get(seq.getSeqName()); if (protTemplate == null) { System.err.println("Failed to find template for " + seq.getSeqName()); continue; } String alignedProtSeq = protTemplate.getSeqString(); String unalignedProtSeq = SeqUtils.getUnalignedSeqString(alignedProtSeq); String unalignedNuclSeq = seq.getSeqString(); //Just let it truncate, for whatever reason these aren't always aligned on a 3 base boundary in genbank, but they're in frame (that I've seen) //Note this does assume that it is the trailing characters that are not translated, not the leading int nuclLengthInProt = unalignedNuclSeq.length() / 3; //We want to check to see if this is a recoverable error, ie //if the nucleotide sequence has a stop codon in the last place //but the protein sequence does not (many tools will remove/omit the stop codon, specifically genbank translations leave out the *) if (nuclLengthInProt - 1 == unalignedProtSeq.length()) { String lastCodon = unalignedNuclSeq.substring(unalignedNuclSeq.length() - 3); char lastAA = ProteinUtils.getInstance().translateToProtein(lastCodon, false, 11).charAt(0); if (lastAA == '*' && !unalignedProtSeq.endsWith("*")) { unalignedNuclSeq = unalignedNuclSeq.substring(0, unalignedNuclSeq.length() - 3); nuclLengthInProt = unalignedNuclSeq.length() / 3; } } if (unalignedProtSeq.length() != nuclLengthInProt) { System.err.println("Length mismatch between " + seq.getSeqName() + " protein [" + unalignedProtSeq.length() + "] and nucleotide sequences [" + unalignedNuclSeq.length() + "], not translating"); continue; } int starIndex = unalignedProtSeq.indexOf('*'); if (starIndex != -1 && starIndex != unalignedProtSeq.length() - 1) { System.err.println("Sequence " + seq.getSeqName() + " has a stop codon in that isn't at the end, this could be very bad"); } if (starIndex != -1) { seqHasStop = true; } String alignedNuclSeqString = ProteinUtils.getInstance().getAlignedNucSeq(alignedProtSeq, unalignedNuclSeq, true, 11); String sanityCheckSeqString = SeqUtils.getUnalignedSeqString(alignedNuclSeqString); if (!sanityCheckSeqString.equalsIgnoreCase(unalignedNuclSeq)) { System.err.println(sanityCheckSeqString); System.err.println(unalignedNuclSeq); System.err.println(alignedNuclSeqString); System.err.println("Huge error with " + seq.getSeqName() + ", aligned nucleotide sequence doesn't match the unaligned one"); continue; } float translScore = ProteinUtils.getInstance().getTranslScore(unalignedProtSeq, unalignedNuclSeq, true, 11); out.println("@ " + seq.getSeqName() + "\t" + translScore); for (char c : unalignedProtSeq.toCharArray()) { out.print(" " + c + " | "); } out.println(); for (int index = 0; index < unalignedNuclSeq.length(); index += 3) { int end = index + 3; if (end > seq.getSeqString().length()) { end = seq.getSeqString().length(); } out.print(seq.getSeqString().subSequence(index, end) + " | "); } out.println(); String predictedProt = ProteinUtils.getInstance().translateToProtein(unalignedNuclSeq, true, 11); for (char c : predictedProt.toCharArray()) { out.print(" " + c + " | "); } out.println(); alignedNuclOut.writeSeq(seq.getSeqName(), seq.getDesc(), alignedNuclSeqString); } if (protTemplateMap.containsKey("#=GC_RF")) { StringBuilder mask = new StringBuilder(); for (char c : protTemplateMap.get("#=GC_RF").getSeqString().toCharArray()) { if (c == 'x') { mask.append("xxx"); } else if (c == '.') { mask.append("..."); } else { throw new IOException("I hate you. " + c); } } alignedNuclOut.writeSeq("#=GC_RF", mask.toString()); } out.close(); alignedNuclOut.close(); if (seqHasStop) { System.err.println("One or more protein sequences contained a stop codon, this could cause trouble if HMMER ever aligns a stop codon to a model position"); } } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/AlignmentMerger.java000066400000000000000000000273121246663120000260600ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment; import edu.msu.cme.rdp.readseq.SequenceFormat; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.readers.SeqReader; import edu.msu.cme.rdp.readseq.readers.IndexedSeqReader; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.utils.SeqUtils; import edu.msu.cme.rdp.readseq.writers.FastaWriter; import java.io.*; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; public class AlignmentMerger { public Set parseIgnorePositions(File maskFileName) throws IOException { // read the positions to ignore Set ignorePositions = new HashSet(); BufferedReader reader = new BufferedReader(new FileReader(maskFileName)); String line; while ((line = reader.readLine()) != null) { if (!line.startsWith("#")) { ignorePositions.add(Integer.parseInt(line)); } } return ignorePositions; } /** * * @param alignmentFiles * @param writer * @param ignoredPositions Set of model positions that should be masked * (expected starting at ONE not ZERO) * @return Map of files not merged to the reason they weren't * @throws IOException */ public static Map mergeAlignment(List alignmentFiles, File mergeToFile, Set ignoredPositions) throws IOException { OutputStream out = new BufferedOutputStream(new FileOutputStream(mergeToFile)); try { return mergeAlignment(alignmentFiles, out, ignoredPositions); } finally { out.close(); } } /** * * @param alignmentFiles * @param writer * @param ignoredPositions Set of model positions that should be masked * (expected starting at ONE not ZERO) * @return Map of files not merged to the reason they weren't * @throws IOException */ public static Map mergeAlignment(List alignmentFiles, OutputStream os, Set ignoredPositions) throws IOException { Map skippedFiles = new HashMap(); Map refSeqMap = getReferenceSeqs(alignmentFiles, ignoredPositions, skippedFiles); int[] insertLengths = getInserts(refSeqMap.values()); FastaWriter mergeStream = new FastaWriter(os); String mergedRefSeq = null; for (File f : refSeqMap.keySet()) { System.err.println("Merging file " + f); mergedRefSeq = merge(f, mergeStream, refSeqMap.get(f), insertLengths); } mergeStream.writeSeq("#=GC_RF", mergedRefSeq); mergeStream.close(); return skippedFiles; } private static Map getReferenceSeqs(List alignmentFiles, Set ignoredPositions, Map skippedFiles) throws IOException { Map refSeqMap = new LinkedHashMap(); int realModelLength = -1; for (File alignmentFile : alignmentFiles) { if (alignmentFile.isFile()) { SequenceFormat format = SeqUtils.guessFileFormat(alignmentFile); String refSeqId; if (format == SequenceFormat.FASTA) { refSeqId = "#=GC_RF"; } else if (format == SequenceFormat.STK) { refSeqId = "#=GC RF"; } else { skippedFiles.put(alignmentFile, "Unprocessable sequence format " + format); continue; } char[] refSeq = null; try { if (format == SequenceFormat.FASTA) { BufferedInputStream is = new BufferedInputStream(new FileInputStream(alignmentFile)); SeqReader reader = new SequenceReader(is); Sequence seq; while ((seq = reader.readNextSequence()) != null) { if (seq.getSeqName().equals(refSeqId)) { refSeq = seq.getSeqString().toCharArray(); break; } } reader.close(); } else { IndexedSeqReader reader = new IndexedSeqReader(alignmentFile); refSeq = reader.readSeq(refSeqId).getSeqString().toCharArray(); reader.close(); } if (refSeq == null) { throw new IOException(); } for (int index = 0; index < refSeq.length; index++) { if (refSeq[index] == '~') { refSeq[index] = '.'; } } } catch (IOException ignore) { skippedFiles.put(alignmentFile, "Reference sequence \"" + refSeqId + "\" not found"); continue; } int modelLength = 0; for (int index = 0; index < refSeq.length; index++) { if (refSeq[index] != '.') { modelLength++; } //Increase the model position before we check if it's ignored //since the model positions start at ONE if (ignoredPositions.contains(modelLength)) { refSeq[index] = '.'; } } if (realModelLength == -1) { realModelLength = modelLength; } else if (realModelLength != modelLength) { skippedFiles.put(alignmentFile, "Model length [" + modelLength + "] doesn't match expected [" + realModelLength + "]"); continue; } refSeqMap.put(alignmentFile, refSeq); } else { skippedFiles.put(alignmentFile, "Not a file"); } } return refSeqMap; } private static int[] getInserts(Collection refSeqs) throws IOException { //We keep track of the maximum insert length at every model position //The convention is the number of inserts AFTER the model position //With model positions starting at 1 //So inserts before the first model position are in insertLengths[0] //and inserts after the last are at insertLengths[insertLengths.length - 1] int[] insertLengths = null; for (char[] refSeq : refSeqs) { if (insertLengths == null) { int modelLength = new String(refSeq).replace(".", "").length(); //We can have inserts at the begining AND end insertLengths = new int[modelLength + 1]; } int modelPosition = 0; int insertLength = 0; for (int index = 0; index < refSeq.length; index++) { if (refSeq[index] == '.') { insertLength++; } else { if (insertLength > insertLengths[modelPosition]) { insertLengths[modelPosition] = insertLength; } modelPosition++; insertLength = 0; } } //Since we won't always have a model position following the last //insert, gotta do it like this if (insertLength > insertLengths[modelPosition]) { insertLengths[modelPosition] = insertLength; } } return insertLengths; } /** * * @param alignmentFile * @param mergeStream * @param refSeq * @param insertLengths * @return Merged reference sequence * @throws IOException */ private static String merge(File alignmentFile, FastaWriter mergeStream, char[] refSeq, final int[] insertLengths) throws IOException { SequenceReader reader = new SequenceReader(alignmentFile); Sequence seq; StringBuilder mergedRef = new StringBuilder(); String[] paddings = new String[insertLengths.length]; int modelPosition = 0; int insertLength = 0; for (int index = 0; index < refSeq.length; index++) { if (refSeq[index] == '.') { insertLength++; mergedRef.append("."); } else { StringBuilder insertPadding = new StringBuilder(); for (int ins = insertLength; ins < insertLengths[modelPosition]; ins++) { insertPadding.append('.'); } paddings[modelPosition] = insertPadding.toString(); mergedRef.append(insertPadding); mergedRef.append("x"); modelPosition++; insertLength = 0; } } StringBuilder insertPadding = new StringBuilder(); for (int ins = insertLength; ins < insertLengths[modelPosition]; ins++) { insertPadding.append('.'); } paddings[modelPosition] = insertPadding.toString(); mergedRef.append(insertPadding); while ((seq = reader.readNextSequence()) != null) { //Skip meta seqs, we'll add our own dummy ones at the end if (seq.getSeqName().startsWith("#")) { continue; } StringBuilder modifiedSeq = new StringBuilder(); char[] bases = seq.getSeqString().toCharArray(); modelPosition = 0; if (bases.length != refSeq.length) { throw new IOException("Sequence " + seq.getSeqName() + " in file " + alignmentFile.getName() + "'s length [" + bases.length + "] isn't the same as it's ref seq length [" + refSeq.length + "]"); } for (int b = 0; b < bases.length; b++) { char base = bases[b]; if (base == 'u' || base == 'U') { base = 't'; } if (refSeq[b] == '.') { modifiedSeq.append(Character.toLowerCase(base)); } else { modifiedSeq.append(paddings[modelPosition]).append(Character.toUpperCase(base)); modelPosition++; } } modifiedSeq.append(paddings[modelPosition]); mergeStream.writeSeq(seq.getSeqName(), seq.getDesc(), modifiedSeq.toString()); } reader.close(); return mergedRef.toString(); } public static void main(String[] args) throws Exception { String usage = "Usage: java AlignmentMerger [ ] \n" + " This program reads in all the files from the input directory and merges the alignment into one single file\n" + " stkdir contains a list of aligned stk files to be merged \n" + " maskfile contains the model positions to be ignored"; if (args.length != 2 && args.length != 3) { throw new IllegalArgumentException(usage); } String stkdir = args[0]; String outfile = args[1]; AlignmentMerger parser = new AlignmentMerger(); Set ignorePositions = new HashSet(); if (args.length == 3) { ignorePositions = parser.parseIgnorePositions(new File(args[2])); } Map notMerged = AlignmentMerger.mergeAlignment(Arrays.asList(new File(stkdir).listFiles()), new File(outfile), ignorePositions); for (File f : notMerged.keySet()) { System.err.println("Did not merge " + f + " beacse " + notMerged.get(f)); } } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/AlignmentMode.java000066400000000000000000000021471246663120000255220ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment; /** * * @author fishjord */ public enum AlignmentMode { /**Local alignment only*/local, /**Align seqi and seqj from seqi's start and end points*/glocal, /**Align sequence with no leading/trailing gap penalty*/overlap, /**Align sequences with no leading/training gap penalty, only return the overlapping region*/overlap_trim, /**Global alignment*/global } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/AlignmentToolsMain.java000066400000000000000000000052611246663120000265430ustar00rootroot00000000000000/* * Copyright (C) 2013 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment; import edu.msu.cme.rdp.alignment.errorcheck.CompareErrorType; import edu.msu.cme.rdp.alignment.errorcheck.RmPartialSeqs; import edu.msu.cme.rdp.alignment.pairwise.PairwiseKNN; import java.util.Arrays; /** * * @author Jordan Fish */ public class AlignmentToolsMain { private static void printUsageAndExit() { System.err.println("USAGE: AlignmentToolsMain "); System.err.println("\talignment-merger - Merge alignments"); System.err.println("\tpairwise-knn - Compute k-nearest-neighbors by pairwise alignment"); System.err.println("\tcompare-error-type - Detect insertion, deletion and substitution errors in sequences comparing to reference sequences"); System.err.println("\talign-nucl-to-prot - Transfer a sequence alignment from protein sequences to nucleotide sequences"); System.err.println("\trm-partialseq - remove partial sequences based on pairwise alignment to reference sequences"); System.exit(1); } public static void main(String[] args) throws Exception { if(args.length < 1) { printUsageAndExit(); } String command = args[0]; args = Arrays.copyOfRange(args, 1, args.length); if(command.equals("alignment-merger")) { AlignmentMerger.main(args); } else if (command.equals("pairwise-knn")) { PairwiseKNN.main(args); } else if (command.equals("compare-error-type")) { CompareErrorType.main(args); } else if (command.equals("paired-end-assembler")) { PairedReadAssembler.main(args); } else if (command.equals("align-nucl-to-prot")) { AlignNucleotideToProtein.main(args); } else if (command.equals("rm-partialseq")) { RmPartialSeqs.main(args); }else { printUsageAndExit(); System.err.println("Unknown command: " + command); } } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/PairedReadAssembler.java000066400000000000000000000161201246663120000266310ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAligner; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAlignment; import edu.msu.cme.rdp.alignment.pairwise.ScoringMatrix; import edu.msu.cme.rdp.readseq.readers.IndexedSeqReader; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.utils.IUBUtilities; import edu.msu.cme.rdp.readseq.writers.FastaWriter; import java.io.File; import java.io.IOException; import java.util.Set; /** * * @author fishjord */ public class PairedReadAssembler { public static class AssemblyResult { private Sequence assembledSeq; private int overlapStart; private int overlapEnd; private int overlapErrors; public AssemblyResult(Sequence assembledSeq, int overlapStart, int overlapEnd, int overlapErrors) { this.assembledSeq = assembledSeq; this.overlapStart = overlapStart; this.overlapEnd = overlapEnd; this.overlapErrors = overlapErrors; } public Sequence getAssembledSeq() { return assembledSeq; } public int getOverlap() { return overlapEnd - overlapStart; } public int getOverlapEnd() { return overlapEnd; } public int getOverlapStart() { return overlapStart; } public int getOverlapErrors() { return overlapErrors; } } private static enum OverlapMode {left, overlap, right}; private ScoringMatrix scoringMatrix; public PairedReadAssembler(ScoringMatrix scoringMatrix) { this.scoringMatrix = scoringMatrix; } /** * Care must be taken when using this, the left read MUST be the forward sense read and the right read MUST be the reverse sense read * The right read will be reverse and overlap pairwise aligned with the left read, and overlap determined from that * * @param left * @param right * @return */ public AssemblyResult assemble(Sequence left, Sequence right) { PairwiseAlignment align = PairwiseAligner.align(left.getSeqString(), IUBUtilities.reverseComplement(right.getSeqString()), scoringMatrix, AlignmentMode.overlap); char[] alignedLeft = align.getAlignedSeqi().toCharArray(); char[] alignedRight = align.getAlignedSeqj().toCharArray(); int overlapStart = -1; int overlapEnd = -1; int overlapErrors = 0; OverlapMode overlap = OverlapMode.left; StringBuilder assembledSeqStr = new StringBuilder(); for(int index = 0;index < alignedLeft.length;index++) { if(alignedLeft[index] == '-' && overlapEnd == -1) { overlapEnd = index; overlap = OverlapMode.right; } if(alignedRight[index] != '-' && overlapStart == -1) { overlapStart = index; overlap = OverlapMode.overlap; } if(overlap == OverlapMode.overlap && alignedLeft[index] != alignedRight[index]) { overlapErrors++; assembledSeqStr.append("N"); continue; } switch(overlap) { case left: case overlap: assembledSeqStr.append(alignedLeft[index]); break; case right: assembledSeqStr.append(alignedRight[index]); break; } } String assembledId = left.getSeqName(); if(assembledId.contains(".")) { assembledId = assembledId.substring(0, assembledId.lastIndexOf(".")); } /*System.out.println(overlapStart + "\t" + overlapEnd + "\t" + (overlapEnd - overlapStart)); System.out.println(align.getAlignedSeqi()); System.out.println(align.getAlignedSeqj()); System.out.println(assembledSeqStr); System.out.println();*/ return new AssemblyResult(new Sequence(assembledId, left.getDesc(), assembledSeqStr.toString()), overlapStart, overlapEnd, overlapErrors); } public static void main(String [] args) throws Exception { if(args.length != 5) { System.err.println("USAGE: PairedReadAssembler "); return; } File fSeqFile = new File(args[0]); File rSeqFile = new File(args[1]); float maxError = 1 - Float.parseFloat(args[2]); int minOverlap = Integer.parseInt(args[3]); FastaWriter seqOut = new FastaWriter(new File(args[4])); PairedReadAssembler assembler = new PairedReadAssembler(ScoringMatrix.getDefaultNuclMatrix()); SequenceReader fSeqReader = new SequenceReader(fSeqFile); IndexedSeqReader rSeqReader = new IndexedSeqReader(rSeqFile); Set rseqIds = rSeqReader.getSeqIdSet(); System.out.println("fseq_id\trseq_id\tassembled_length\toverlap_start\toverlap_end\ttotal_overlap\tmismatches\terror_ratio\tassembled?"); Sequence fseq; while((fseq = fSeqReader.readNextSequence()) != null) { if(!rseqIds.contains(fseq.getSeqName())) { System.out.println(fseq.getSeqName() + "\tnot found in rseq file"); continue; } Sequence rseq = rSeqReader.readSeq(fseq.getSeqName()); if(!fseq.getSeqName().equals(rseq.getSeqName())) { throw new IOException("Read " + fseq.getSeqName() + " from fseq file and " + rseq.getSeqName() + " from rseq file, can't match sequences with different names"); } AssemblyResult result = assembler.assemble(fseq, rseq); float errorRatio = (float)result.getOverlapErrors() / result.getOverlap(); boolean assembled = false; if(result.getOverlap() > minOverlap && errorRatio < maxError) { seqOut.writeSeq(result.getAssembledSeq()); assembled = true; } System.out.println(fseq.getSeqName() + "\t" + result.getAssembledSeq().getSeqString().length() + "\t" + result.getOverlapStart() + "\t" + result.getOverlapEnd() + "\t" + result.getOverlap() + "\t" + result.getOverlapErrors() + "\t" + errorRatio + "\t" + assembled); } seqOut.close(); fSeqReader.close(); rSeqReader.close(); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/errorcheck/000077500000000000000000000000001246663120000242575ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/errorcheck/CompareErrorType.java000066400000000000000000000356061246663120000303760ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.errorcheck; import edu.msu.cme.rdp.alignment.AlignmentMode; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAligner; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAlignment; import edu.msu.cme.rdp.alignment.pairwise.ScoringMatrix; import edu.msu.cme.rdp.readseq.QSequence; import edu.msu.cme.rdp.readseq.readers.IndexedSeqReader; import edu.msu.cme.rdp.readseq.readers.QSeqReader; import edu.msu.cme.rdp.readseq.readers.SeqReader; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.utils.IUBUtilities; import edu.msu.cme.rdp.readseq.utils.SeqUtils; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; public class CompareErrorType { public static class CountResult { int backCount; int forwardCount; } public static class PAObject { PairwiseAlignment PA; boolean reversed; Sequence refSeq; public PAObject(PairwiseAlignment pa, boolean reverse, Sequence seq){ this.PA = pa; this.reversed = reverse; this.refSeq = seq; } public PairwiseAlignment getPA(){ return PA; } public boolean getReversed(){ return reversed; } public Sequence getRefSeq(){ return refSeq; } } private static final char gapChar = '-'; private PrintStream misMatch_writer = null; private PrintStream indel_writer = null; private PrintStream qualOut = null; public CompareErrorType(File mismatch_out, File indel_out) throws IOException { this(mismatch_out, indel_out, null); } public CompareErrorType(File mismatch_out, File indel_out, File qualOutFile) throws IOException { misMatch_writer = new PrintStream(mismatch_out); indel_writer = new PrintStream(indel_out); if (qualOutFile != null) { qualOut = new PrintStream(qualOutFile); } } public void processSequence(Sequence querySeq, String alignedQuery, String refSeqId, String refSeq, int refStart, boolean reversed) throws IOException { int[][] positionMapping = mapSequences(refSeq, refStart, alignedQuery); String[] qualInfo = null; if (qualOut != null) { Object[] tmp = mapQualScores((QSequence)querySeq, alignedQuery, reversed); qualInfo = (String[]) tmp[0]; float avgQScore = (Float) tmp[1]; float avgEQScore = (Float) tmp[2]; qualOut.println(querySeq.getSeqName() + "\t" + avgQScore + "\t" + avgEQScore); } compare(querySeq.getSeqName(), refSeqId, refSeq, alignedQuery, qualInfo, positionMapping[0], positionMapping[1]); } public void close() throws IOException { misMatch_writer.close(); indel_writer.close(); if (qualOut != null) { qualOut.close(); } } private int[][] mapSequences(String alignedRefSeq, int refStart, String alignedQuerySeq) { int[][] ret = new int[2][alignedRefSeq.length()]; int refLoc = 0; int queryLoc = 0; char[] ref = alignedRefSeq.toCharArray(); char[] query = alignedQuerySeq.toCharArray(); for (int index = 0; index < ref.length; index++) { if (ref[index] != '-') { refLoc++; } if (query[index] != '-') { queryLoc++; } ret[0][index] = queryLoc; ret[1][index] = refLoc + refStart; } return ret; } private Object[] mapQualScores(QSequence seq, String alignedSeqString, boolean reversed) throws IOException { String[] ret = new String[alignedSeqString.length()]; String dealignedSeqString = SeqUtils.getUnalignedSeqString(alignedSeqString); byte[] qualScores = seq.getQuality(); if (qualScores.length != dealignedSeqString.length()) { throw new IOException(seq.getSeqName() + "'s quality string [" + qualScores.length + "] and seq string lengths [" + dealignedSeqString.length() + "] do not match"); } if (reversed) { int start = 0; int end = qualScores.length - 1; while (start < end) { byte tmp = qualScores[start]; qualScores[start] = qualScores[end]; qualScores[end] = tmp; start++; end--; } } float avgEQual = 0; int numQualScores = 0; int scoreIndex = 0; for (int index = 0; index < dealignedSeqString.length(); index++) { while (alignedSeqString.charAt(scoreIndex) == '-') { ret[scoreIndex++] = "-1"; } ret[scoreIndex++] = qualScores[index] + ""; numQualScores++; avgEQual += Math.pow(10, -1 * (Double.valueOf(qualScores[index]) / 10.0)); } avgEQual /= numQualScores; float avgQual = -10 * (float) Math.log10(avgEQual); return new Object[]{ret, avgQual, avgEQual}; } private String compare(String querySeqName, String refSeqName, String r, String q, String[] qualInfo, int[] queryPosMapping, int[] refPosMapping) throws IOException { StringBuilder buf = new StringBuilder(); char badChar = gapChar; for (int i = 0; i < r.length();) { char rc = r.charAt(i); char qc = q.charAt(i); if (rc != gapChar && qc != gapChar) { if (rc != qc) { misMatch_writer.println(querySeqName + "\t" + refSeqName + "\t" + (i + 1) + "\t" + rc + "\t" + qc + "\t" + queryPosMapping[i] + "\t" + refPosMapping[i] + "\t" + ((qualInfo == null) ? "null" : qualInfo[i])); } i++; continue; } else { if (rc == gapChar) { badChar = qc; } else { badChar = rc; } // refseq CountResult refCount = count(r, i, badChar); CountResult queryCount = count(q, i, badChar); indel_writer.println(querySeqName + "\t" + refSeqName + "\t" + (i + 1) + "\t" + (refCount.forwardCount + refCount.backCount) + "\t" + (queryCount.forwardCount + queryCount.backCount) + "\t" + badChar + "\t" + queryPosMapping[i] + "\t" + refPosMapping[i] + "\t" + ((qualInfo == null) ? "null" : qualInfo[i])); i++; } } return buf.toString(); } private static CountResult count(String r, int i, char badChar) { // going back int backCount = 0; for (int j = i; j >= 0; j--) { if (r.charAt(j) == gapChar) { // if it's gap, find the next non-gap character continue; } if (r.charAt(j) == badChar) { backCount++; } else { break; } } // going forward int forwardCount = 0; for (int j = i + 1; j < r.length(); j++) { if (r.charAt(j) == gapChar) { // if it's gap, find the previous non-gap character continue; } if (r.charAt(j) == badChar) { forwardCount++; } else { break; } } CountResult result = new CountResult(); result.backCount = backCount; result.forwardCount = forwardCount; return result; } public static void main(String[] args) throws IOException { Options options = new Options(); options.addOption("s", "stem", true, "Output stem (default )"); final SeqReader queryReader; final List refSeqList; final PrintStream alignOutStream; final CompareErrorType errorProcessor; Sequence seq; Map matchMap = new HashMap(); try { CommandLine line = new PosixParser().parse(options, args); String stem; args = line.getArgs(); if (args.length != 2 && args.length != 3) { throw new Exception("Unexpected number of arguments"); } File refFile = new File(args[0]); File queryFile = new File(args[1]); if (line.hasOption("stem")) { stem = line.getOptionValue("stem"); } else { stem = queryFile.getName(); } File alignOutFile = new File(stem + "_alignments.txt"); File mismatchOutFile = new File(stem + "_mismatches.txt"); File indelOutFile = new File(stem + "_indels.txt"); File qualOutFile = null; refSeqList = SequenceReader.readFully(refFile); if (args.length == 3) { queryReader = new QSeqReader(queryFile, new File(args[2])); } else { queryReader = new SequenceReader(queryFile); } seq = queryReader.readNextSequence(); if(seq instanceof QSequence) { qualOutFile = new File(stem + "_qual.txt"); } errorProcessor = new CompareErrorType(mismatchOutFile, indelOutFile, qualOutFile); alignOutStream = new PrintStream(alignOutFile); System.err.println("Starting CompareErrorType"); System.err.println("* Time: " + new Date()); System.err.println("* Reference File: " + refFile); System.err.println("* Query File: " + queryFile); if(args.length == 3) { System.err.println("* Qual File: " + args[2]); } System.err.println("* Query format: " + queryReader.getFormat()); System.err.println("* Alignment Output: " + alignOutFile); System.err.println("* Mismatches Output: " + mismatchOutFile); System.err.println("* Alignment Output: " + indelOutFile); if(qualOutFile != null) { System.err.println("* Quality Output: " + qualOutFile); } } catch (Exception e) { new HelpFormatter().printHelp("CompareErrorType [options] ( | )", options); System.err.println("ERROR: " + e.getMessage()); throw new RuntimeException(e); //System.exit(1); //return; } //ScoringMatrix scoringMatrix = ScoringMatrix.getDefaultNuclMatrix(); // use a simple scoring function, match score 0, mismatch -1, gap opening -1, gap extension -1. ScoringMatrix scoringMatrix = new ScoringMatrix(ScoringMatrix.class.getResourceAsStream("/data/simple_scoringmatrix.txt"), -1, -1); do { try { PairwiseAlignment bestResult = null; Sequence bestSeq = null; boolean bestReversed = false; String querySeqStr = seq.getSeqString().toLowerCase(); String reversedQuery = IUBUtilities.reverseComplement(querySeqStr); PAObject bestMatch = null; //checking if sequence has been seen before if(matchMap.containsKey(seq.getSeqString())){ bestMatch = matchMap.get(seq.getSeqString()); } else{ for (Sequence refSeq : refSeqList) { String refSeqStr = refSeq.getSeqString().toLowerCase(); PairwiseAlignment result = PairwiseAligner.align(refSeqStr, querySeqStr, scoringMatrix, AlignmentMode.global); PairwiseAlignment reversedResult = PairwiseAligner.align(refSeqStr, IUBUtilities.reverseComplement(querySeqStr), scoringMatrix, AlignmentMode.global); PairwiseAlignment currBest = (result.getScore() > reversedResult.getScore()) ? result : reversedResult; if (bestResult == null || currBest.getScore() > bestResult.getScore()) { bestResult = currBest; bestSeq = refSeq; if (currBest == reversedResult) { bestReversed = true; } else { bestReversed = false; } } //Since this is a new sequence, make a new PAObject to put into the map to compare against later bestMatch = new PAObject(bestResult, bestReversed, bestSeq); matchMap.put(seq.getSeqString(), bestMatch); } } int refStart = bestMatch.getPA().getStarti(); int refEnd = bestMatch.getPA().getEndi(); bestSeq = bestMatch.getRefSeq(); bestReversed = bestMatch.getReversed(); bestResult = bestMatch.getPA(); //output information alignOutStream.println(">\t" + seq.getSeqName() + "\t" + bestSeq.getSeqName() + "\t" + seq.getSeqString().length() + "\t" + refStart + "\t" + refEnd + "\t" + bestResult.getScore() + "\t" + ((bestReversed) ? "\treversed" : "")); alignOutStream.println(bestResult.getAlignedSeqj() + "\n"); alignOutStream.println(bestResult.getAlignedSeqi() + "\n"); //seqi is reference seq, seqj is the refseq errorProcessor.processSequence(seq, bestResult.getAlignedSeqj(), bestSeq.getSeqName(), bestResult.getAlignedSeqi(), refStart, bestReversed); } catch (Exception e) { throw new RuntimeException("Failed while processing seq " + seq.getSeqName(), e); } } while ((seq = queryReader.readNextSequence()) != null); queryReader.close(); alignOutStream.close(); errorProcessor.close(); } }AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/errorcheck/RmPartialSeqs.java000066400000000000000000000230471246663120000276570ustar00rootroot00000000000000/* * Copyright (C) 2013 wangqion * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package edu.msu.cme.rdp.alignment.errorcheck; import edu.msu.cme.rdp.alignment.AlignmentMode; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAligner; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAlignment; import edu.msu.cme.rdp.alignment.pairwise.ScoringMatrix; import edu.msu.cme.rdp.alignment.pairwise.rna.DistanceModel; import edu.msu.cme.rdp.alignment.pairwise.rna.IdentityDistanceModel; import edu.msu.cme.rdp.alignment.pairwise.rna.OverlapCheckFailedException; import edu.msu.cme.rdp.readseq.SequenceType; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.utils.SeqUtils; import edu.msu.cme.rdp.readseq.utils.kmermatch.KmerMatchCore; import edu.msu.cme.rdp.readseq.utils.kmermatch.NuclSeqMatch; import edu.msu.cme.rdp.readseq.utils.kmermatch.ProteinSeqMatch; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; /** * * @author wangqion */ public class RmPartialSeqs { private static final char gapChar = '-'; private ScoringMatrix scoringMatrix ; private SequenceType seqType ; private AlignmentMode mode = AlignmentMode.overlap; private static final Options options = new Options(); private static DistanceModel dist = new IdentityDistanceModel(); private HashMap refSeqMap = new HashMap(); private ArrayList seqList = new ArrayList(); private KmerMatchCore sabCalculator = null; private int knn = 20; private int min_begin_gaps = 50; private int min_end_gaps = 50; static { options.addOption("a", "alignment-mode", true, "Alignment mode: overlap, glocal, local or global. default = overlap"); options.addOption("g", "min_gaps", true, "The minimum number of continuous gaps in the beginning or end of the query alignment. If above the cutoff, the query is marked as partial. default = 50"); options.addOption("k", "knn", true, "The top k closest targets using a heuristic method. (default = 20)"); options.addOption("o", "alignment-out", true, "The output file containing the pairwise alignment"); } public RmPartialSeqs(String trainseqFile, String testFile, AlignmentMode mode, int knn, int min_gaps) throws IOException, OverlapCheckFailedException{ this.mode = mode; this.knn = knn; this.min_begin_gaps = min_gaps; this.min_end_gaps = min_gaps; SequenceReader parser = new SequenceReader(new File(trainseqFile)); Sequence seq; SequenceType seqType = null; while ( (seq=parser.readNextSequence()) != null) { if ( seqType == null){ seqType = SeqUtils.guessSequenceType(seq); } refSeqMap.put(seq.getSeqName(), seq); } parser.close(); parser = new SequenceReader(new File(testFile)); while ( (seq=parser.readNextSequence()) != null) { seqList.add( seq); } parser.close(); if (seqType == SequenceType.Nucleotide) { scoringMatrix = ScoringMatrix.getDefaultNuclMatrix(); sabCalculator = new NuclSeqMatch(trainseqFile); } else { scoringMatrix = ScoringMatrix.getDefaultProteinMatrix(); sabCalculator = new ProteinSeqMatch(trainseqFile); } } public HashSet checkPartial(PrintStream seqOutstream, PrintStream alignOutstream) throws OverlapCheckFailedException, IOException{ HashSet partialSeqs = new HashSet(); for ( int i= 0; i < seqList.size(); i++){ Sequence seqx = seqList.get(i); PairwiseAlignment bestResult = null; int bestScore = Integer.MIN_VALUE; Sequence bestSeqy = null; ArrayList matchResults = sabCalculator.findTopKMatch(seqx, knn); for (NuclSeqMatch.BestMatch match: matchResults){ Sequence seqy = refSeqMap.get(match.getBestMatch().getSeqName()); PairwiseAlignment result = PairwiseAligner.align(seqx.getSeqString().replaceAll("U", "T"), seqy.getSeqString().replaceAll("U", "T"), scoringMatrix, mode); if ( bestResult == null || result.getScore() >= bestScore){ bestResult = result; bestScore = result.getScore() ; bestSeqy = seqy; } } double distance = dist.getDistance(bestResult.getAlignedSeqj().getBytes(), bestResult.getAlignedSeqi().getBytes(), 0); int beginGaps = getBeginGapLength(bestResult.getAlignedSeqi()); int endGaps = getEndGapLength(bestResult.getAlignedSeqi()) ; if ( ( beginGaps >= this.min_begin_gaps) || ( endGaps >= this.min_end_gaps)){ partialSeqs.add(seqx); }else { seqOutstream.println(">" + seqx.getSeqName() + "\t" + seqx.getDesc() + "\n" + seqx.getSeqString()); } if ( alignOutstream != null){ alignOutstream.println(">\t" + seqx.getSeqName() + "\t" + bestSeqy.getSeqName() + "\t" + String.format("%.3f", distance) + "\tmissingBegin=" + ( beginGaps >= this.min_begin_gaps) + "\tmissingEnd=" + ( endGaps >= this.min_end_gaps) + "\tbeginGaps=" + beginGaps + "\tendGaps=" + endGaps); alignOutstream.print(bestResult.getAlignedSeqi() + "\n"); alignOutstream.print(bestResult.getAlignedSeqj() + "\n"); } } seqOutstream.close(); if ( alignOutstream != null) alignOutstream.close(); return partialSeqs; } /** * * @param s * @return the number of continuous gaps in the beginning */ int getBeginGapLength(String s){ int length = 0; for ( int i = 0; i < s.length(); i++){ if ( s.charAt(i) == '-'){ length ++; }else { return length; } } return length; } /** * * @param s * @return the number of continuous gaps in the end */ int getEndGapLength(String s){ int length = 0; for ( int i = s.length() -1; i > 0; i--){ if ( s.charAt(i) == '-'){ length ++; }else { return length; } } return length; } /** * This program detects partial sequences based on the best pairwise alignment for each query sequence, * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String trainseqFile = null; String queryFile = null; PrintStream seqOutStream = null; PrintStream alignOutStream = null; AlignmentMode mode = AlignmentMode.overlap; int k = 10; int min_gaps = 50; try { CommandLine line = new PosixParser().parse(options, args); if (line.hasOption("alignment-mode")) { String m = line.getOptionValue("alignment-mode").toLowerCase(); mode = AlignmentMode.valueOf(m); } if (line.hasOption("min_gaps")) { min_gaps = Integer.parseInt(line.getOptionValue("min_gaps")); } if (line.hasOption("knn")) { k = Integer.parseInt(line.getOptionValue("knn")); } if (line.hasOption("alignment-out")) { alignOutStream = new PrintStream(new File(line.getOptionValue("alignment-out"))); } args = line.getArgs(); if ( args.length != 3){ throw new Exception("wrong number of arguments"); } trainseqFile = args[0]; queryFile = args[1]; seqOutStream = new PrintStream(new File(args[2])); }catch (Exception e) { System.err.println("Error: " + e.getMessage()); new HelpFormatter().printHelp(80, " [options] fulllengthSeqFile queryFile passedSeqOutFile\n sequences can be either protein or nucleotide", "", options, ""); return; } RmPartialSeqs theObj = new RmPartialSeqs(trainseqFile, queryFile, mode, k, min_gaps); theObj.checkPartial(seqOutStream, alignOutStream); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/000077500000000000000000000000001246663120000227115ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/HMMER3bParser.java000066400000000000000000000237011246663120000260310ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm; import edu.msu.cme.rdp.readseq.SequenceType; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; import static java.lang.StrictMath.*; /** * * @author fishjord */ public class HMMER3bParser { public static ProfileHMM readModel(File f) throws IOException { return readModel(new FileInputStream(f)); } public static ProfileHMM readModel(InputStream is) throws IOException { ProfileHMM hmm = readModelInternal(is); hmm.configureGlocal(true); return hmm; } public static ProfileHMM readUnnormalized(File f) throws IOException { return readUnnormalized(new FileInputStream(f)); } public static ProfileHMM readUnnormalized(InputStream is) throws IOException { ProfileHMM hmm = readModelInternal(is); hmm.configureGlocal(false); return hmm; } private static ProfileHMM readModelInternal(InputStream is) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); ProfileHMM hmm = new ProfileHMM(); hmm.version = reader.readLine().trim().split("\\s+")[0]; if (!hmm.version.equals("HMMER3/b") && !hmm.version.equals("HMMER3/f")) { throw new IOException("Cannot parse " + hmm.version + " version hmmer model, only supports HMMER3/b"); } String line; String alpha = null; while ((line = reader.readLine()) != null) { String[] lexemes = line.trim().split("\\s+"); if (lexemes[0].equals("NAME")) { hmm.name = lexemes[1]; } else if (lexemes[0].equals("LENG")) { hmm.m = Integer.valueOf(lexemes[1]); } else if (lexemes[0].equals("ALPH")) { alpha = lexemes[1]; if (alpha.equals("amino")) { hmm.alphabet = SequenceType.Protein; } else if (alpha.equals("RNA")) { hmm.alphabet = SequenceType.Nucleotide; } else if (alpha.equals("DNA")) { hmm.alphabet = SequenceType.Nucleotide; } else { throw new IOException("Unknown sequence alphabet \"" + alpha + "\""); } } else if (lexemes[0].equals("HMM")) { parseAlpha(hmm, line); break; } } if (hmm.m == null) { throw new IOException("Model length not found"); } if (alpha == null) { throw new IOException("No alphabet specified in HMM"); } reader.readLine(); // discard the transition labels (we expect them to be in the order m->m m->i m->d i->m i->i d->m d->d hmm.transitions = new double[ProfileHMM.NUM_TRANSITIONS + 1][hmm.m + 1]; // Leave room for the implicit B->M transition that is computed on load hmm.emissions = new double[hmm.m + 1][hmm.k][ProfileHMM.NUM_EMISSION_STATES]; //So we're gonna configure this here...but the model sets these //in the msc(state, alpha, val) (checking if val > maxEmission[state]) //Two biproducts of this, first if the probabilities are tweaked at runtime //maxEmissions will be updated accordingly, second, you can't use maxEmissions //til the model is calibrated, which you couldn't anyway so it doesn't matter hmm.maxMatchEmissions = new double[hmm.m + 1]; Arrays.fill(hmm.maxMatchEmissions, Double.NEGATIVE_INFINITY); line = reader.readLine().trim(); if (line.startsWith("COMPO")) { hmm.compo = readProbabilities(line, 1, hmm.k); } double[] probabilities; for (int index = 0; index <= hmm.m; index++) { if (index > 0) { probabilities = readProbabilities(reader.readLine(), 1, hmm.k); for (int emission = 0; emission < hmm.k; emission++) { hmm.emissions[index][emission][ProfileHMM.msc] = probabilities[emission]; } } probabilities = readProbabilities(reader.readLine(), 0, hmm.k); for (int emission = 0; emission < hmm.k; emission++) { hmm.emissions[index][emission][ProfileHMM.isc] = probabilities[emission]; } probabilities = readProbabilities(reader.readLine(), 0, ProfileHMM.NUM_TRANSITIONS); for (int trans = 0; trans < ProfileHMM.NUM_TRANSITIONS; trans++) { hmm.transitions[trans][index] = probabilities[trans]; } } reader.close(); return hmm; } private static void parseAlpha(ProfileHMM hmm, String line) throws IOException { String[] lexemes = line.trim().split("\\s+"); hmm.alphaMapping = new int[127]; Arrays.fill(hmm.alphaMapping, -1); for (int index = 1; index < lexemes.length; index++) { if (lexemes[index].length() != 1) { throw new IOException("Alphabet symbol " + lexemes[index] + " too long"); } char sym = Character.toUpperCase(lexemes[index].charAt(0)); hmm.alphaMapping[(int) sym] = index - 1; hmm.alphaMapping[(int) Character.toLowerCase(sym)] = index - 1; if (sym == 'U' && hmm.alphabet == SequenceType.Nucleotide) { hmm.alphaMapping[(int) 'T'] = index - 1; hmm.alphaMapping[(int) 't'] = index - 1; } } hmm.k = lexemes.length - 1; } /** * Parses the probailities for a model from the provided string * * @param line * @param offset * @param expectedValues * @return */ private static double[] readProbabilities(String line, int offset, int expectedValues) throws IOException { if (line == null || line.equals("//")) { throw new IOException("Unexpected end of model"); } String[] lexemes = line.trim().split("\\s+"); double[] ret = new double[expectedValues]; if (lexemes.length < expectedValues + offset) { throw new IOException("Too few probabilities on line \"" + line + "\""); } for (int index = offset; index < offset + expectedValues; index++) { if (lexemes[index].equals("*")) { ret[index - offset] = 0; } else { double v = Double.valueOf(lexemes[index]); ret[index - offset] = exp(-1 * v); } } return ret; } public static void main(String[] args) throws IOException { ProfileHMM hmm = HMMER3bParser.readModel(new File("/work/fishjord/other_projects/hmmgs/models/rplb/rplb_for.hmm")); System.out.print("double expected_compo[] = {"); for (int index = 0; index < hmm.compo.length; index++) { System.out.print(hmm.compo[index]); if (index + 1 != hmm.compo.length) { System.out.print(","); } } System.out.println("};"); System.out.println("double expected_msc[][20] = {"); for (int state = 0; state < hmm.M() + 1; state++) { System.out.print("\t{"); for (int index = 0; index < hmm.compo.length; index++) { if (hmm.msc(state, index) == Double.NEGATIVE_INFINITY) { System.out.print("-std::numeric_limits::infinity()"); } else { System.out.print(hmm.msc(state, index)); } if (index + 1 != hmm.compo.length) { System.out.print(","); } } System.out.print("}"); if (state + 1 != hmm.M() + 1) { System.out.println(","); } } System.out.println("};"); System.out.println("double expected_tsc[][7] = {"); for (int state = 0; state < hmm.M() + 1; state++) { System.out.print("\t{"); for (TSC tsc : new TSC[]{TSC.MM, TSC.MI, TSC.MD, TSC.IM, TSC.II, TSC.DM, TSC.DD}) { if (hmm.tsc(state, tsc) == Double.NEGATIVE_INFINITY) { System.out.print("-std::numeric_limits::infinity()"); } else { System.out.print(hmm.tsc(state, tsc)); } if (tsc != TSC.DD) { System.out.print(","); } } System.out.print("}"); if (state + 1 != hmm.M() + 1) { System.out.println(","); } } System.out.println("};"); System.out.print("double expected_max_emission[] = {"); for(int state = 0;state <= hmm.M();state++) { System.out.print(hmm.getMaxMatchEmission(state)); if(state != hmm.M()) { System.out.println(", "); } } System.out.println("};"); System.out.println("double expected_m_hcost = " + hmm.getHCost().computeHeuristicCost('m', 0) + ";"); System.out.println("double expected_d_hcost = " + hmm.getHCost().computeHeuristicCost('d', 0) + ";"); System.out.println("double expected_i_hcost = " + hmm.getHCost().computeHeuristicCost('i', 0) + ";"); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/MostProbableHCostHMM.java000066400000000000000000000076601246663120000274610ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm; import static edu.msu.cme.rdp.alignment.hmm.TSC.*; /** * * @author fishjord */ public class MostProbableHCostHMM { private ProfileHMM hmm; private static final char[] mapping = new char[]{'A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'Y'}; private final double[][] mostProbFromState; public MostProbableHCostHMM(ProfileHMM hmm) { this.hmm = hmm; mostProbFromState = new double[128][hmm.M() + 1]; for (int index = 0; index <= hmm.M(); index++) { mostProbFromState['m'][index] = computeCostInternal('m', index); mostProbFromState['i'][index] = computeCostInternal('i', index); mostProbFromState['d'][index] = computeCostInternal('d', index); } } public double computeHeuristicCost(char state, int stateNo) { return mostProbFromState[state][stateNo]; } private double computeCostInternal(char prevState, int stateNo) { double h = 0; double matchTrans = Double.NEGATIVE_INFINITY; double insTrans = Double.NEGATIVE_INFINITY; double delTrans = Double.NEGATIVE_INFINITY; double bestMatchProb = Double.NEGATIVE_INFINITY; double bestInsProb = Double.NEGATIVE_INFINITY; for (int state = stateNo + 1; state <= hmm.M(); state++) { //System.out.println(state + " " + layerScale); switch (prevState) { case 'm': matchTrans = hmm.tsc(state - 1, MM); insTrans = hmm.tsc(state - 1, MI); delTrans = hmm.tsc(state - 1, MD); break; case 'd': matchTrans = hmm.tsc(state - 1, DM); insTrans = Double.NEGATIVE_INFINITY; delTrans = hmm.tsc(state - 1, DD); break; case 'i': matchTrans = hmm.tsc(state - 1, IM); insTrans = hmm.tsc(state - 1, II); delTrans = Double.NEGATIVE_INFINITY; break; default: throw new RuntimeException("I hate you."); } bestMatchProb = Float.NEGATIVE_INFINITY; bestInsProb = Float.NEGATIVE_INFINITY; for (int k = 0; k < hmm.K(); k++) { if (hmm.msc(state, k) > bestMatchProb) { bestMatchProb = hmm.msc(state, k); } if (hmm.isc(state, k) > bestInsProb) { bestInsProb = hmm.isc(state, k); } } matchTrans += bestMatchProb - hmm.getMaxMatchEmission(state); delTrans -= hmm.getMaxMatchEmission(state); insTrans += bestInsProb; insTrans = Float.NEGATIVE_INFINITY; if (insTrans > matchTrans && insTrans > delTrans) { h += insTrans; prevState = 'i'; state--; } else if (delTrans > matchTrans && delTrans > insTrans) { h += delTrans; prevState = 'd'; } else { h += matchTrans; prevState = 'm'; } } return h; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/NXCells.java000066400000000000000000000001231246663120000250600ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.hmm; public enum NXCells { E, N, J, B, C } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/ProfileHMM.java000066400000000000000000000210561246663120000255220ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm; import edu.msu.cme.rdp.readseq.SequenceType; import java.util.Arrays; import static java.lang.StrictMath.*; import static edu.msu.cme.rdp.alignment.hmm.TSC.*; import static edu.msu.cme.rdp.alignment.hmm.XSC.*; /** * * This is a trimmed down representation of a HMMER3/b ascii formatted model * * It disregards several fields and simply checked to make sure we're using an * amino alphabet, checks the format against HMMER3/b and the length * * Everything else besides the model is ignored * * @author fishjord */ public class ProfileHMM { static final int NUM_EMISSION_STATES = 2; static final int NUM_TRANSITIONS = 7; static final int NXSTATES = 5; static final int NXTRANS = 2; static final int msc = 0; static final int isc = 1; String version; String name; SequenceType alphabet; double[][] transitions; double[][][] emissions; double[] compo; double[][] xsc = new double[NXSTATES][NXTRANS]; int[] alphaMapping; double[] maxMatchEmissions; Integer m; //model length int k; //alphabet length int l; private double nj; private boolean multihit = false; private boolean local = false; private boolean normalized; private MostProbableHCostHMM hcost; private static final double[] aa_bg; static { double[] bg = new double[20]; bg[0] = 0.0787945; /* A */ bg[1] = 0.0151600; /* C */ bg[2] = 0.0535222; /* D */ bg[3] = 0.0668298; /* E */ bg[4] = 0.0397062; /* F */ bg[5] = 0.0695071; /* G */ bg[6] = 0.0229198; /* H */ bg[7] = 0.0590092; /* I */ bg[8] = 0.0594422; /* K */ bg[9] = 0.0963728; /* L */ bg[10] = 0.0237718; /* M */ bg[11] = 0.0414386; /* N */ bg[12] = 0.0482904; /* P */ bg[13] = 0.0395639; /* Q */ bg[14] = 0.0540978; /* R */ bg[15] = 0.0683364; /* S */ bg[16] = 0.0540687; /* T */ bg[17] = 0.0673417; /* V */ bg[18] = 0.0114135; /* W */ bg[19] = 0.0304133; /* Y */ aa_bg = bg; } @Override public ProfileHMM clone() { ProfileHMM copy = new ProfileHMM(); copy.version = version; copy.name = name; copy.alphabet = alphabet; copy.m = m; copy.k = k; copy.l = l; copy.nj = nj; copy.multihit = multihit; copy.local = local; copy.alphaMapping = Arrays.copyOf(alphaMapping, alphaMapping.length); if (compo != null) { copy.compo = Arrays.copyOf(compo, compo.length); } copy.transitions = new double[transitions.length][]; for (int index = 0; index < transitions.length; index++) { copy.transitions[index] = Arrays.copyOf(transitions[index], transitions[index].length); } copy.xsc = new double[xsc.length][]; for (int index = 0; index < xsc.length; index++) { copy.xsc[index] = Arrays.copyOf(xsc[index], xsc[index].length); } copy.emissions = new double[emissions.length][][]; for (int i = 0; i < emissions.length; i++) { copy.emissions[i] = new double[emissions[i].length][]; for (int j = 0; j < emissions[i].length; j++) { copy.emissions[i][j] = Arrays.copyOf(emissions[i][j], emissions[i][j].length); } } copy.maxMatchEmissions = Arrays.copyOf(maxMatchEmissions, maxMatchEmissions.length); return copy; } public ProfileHMM() { } public String getName() { return name; } public int M() { return m; } public int K() { return k; } public double msc(int k, char b) { if (alphaMapping[b] == -1) { throw new IllegalArgumentException("No mapping for " + b); } return emissions[k][alphaMapping[b]][msc]; } public void rescaleMatchEmission(int k, char b, double scale) { msc(k, alphaMapping[b], msc(k, b) * scale); } public double isc(int k, char b) { return emissions[k][alphaMapping[b]][isc]; } public double msc(int k, int b) { if (k == 0) { return Double.NEGATIVE_INFINITY; } return emissions[k][b][msc]; } public double isc(int k, int b) { return emissions[k][b][isc]; } public double tsc(int k, TSC trans) { return transitions[trans.ordinal()][k]; } public double[] tsc(TSC trans) { return transitions[trans.ordinal()]; } public double xsc(XSTATES xstate, XSC trans) { return xsc[xstate.ordinal()][trans.ordinal()]; } public double getMaxMatchEmission(int i) { if (normalized) { return maxMatchEmissions[i]; } else { return 0; } } void msc(int k, int i, double val) { emissions[k][i][msc] = val; if (val > maxMatchEmissions[k]) { maxMatchEmissions[k] = val; } } void isc(int k, int i, double val) { emissions[k][i][isc] = val; } void tsc(int k, TSC trans, double val) { transitions[trans.ordinal()][k] = val; } public void xsc(XSTATES xstate, XSC trans, double val) { xsc[xstate.ordinal()][trans.ordinal()] = val; } void configureGlocal(boolean normalize) { this.normalized = normalize; double Z = log(tsc(0, MD)); Arrays.fill(maxMatchEmissions, 0); tsc(0, BM, log(1 - tsc(0, MD))); //System.out.println("Z: " + Z + " BM: " + tsc(0, BM)); for (int k = 1; k < m; k++) { tsc(k, BM, Z + log(tsc(k, DM))); Z += log(tsc(k, DD)); } tsc(m, BM, Double.NEGATIVE_INFINITY); if (multihit) { throw new RuntimeException("I hate you"); } else { xsc(XSTATES.E, MOVE, 0); xsc(XSTATES.E, LOOP, Double.NEGATIVE_INFINITY); } for (int k = 1; k <= m; k++) { for (int x = 0; x < this.k; x++) { double val = msc(k, x); if (normalize) { //val /= aa_bg[x]; val /= compo[x]; } //System.err.println("k" + k + " x" + x + ": " + log(val)); msc(k, x, log(val)); if (normalize) { isc(k, x, 0); //isc(k, x, log(isc(k, x) / compo[x])); } else { isc(k, x, log(isc(k, x))); } } } for (int k = 0; k <= m; k++) { for (TSC trans : TSC.values()) { if (trans == BM) { continue; } //if(trans == TSC.MM) { // System.err.println("k" + k + " MM: " +log(tsc(k, trans))); //} tsc(k, trans, log(tsc(k, trans))); } } for (int x = 0; x < this.k; x++) { isc(m, x, Double.NEGATIVE_INFINITY); } } public void reconfigureLength(int L) { double ploop, pmove; pmove = ((2.0 + nj) / (L + 2 + nj)); ploop = 1 - pmove; xsc(XSTATES.N, LOOP, log(ploop)); xsc(XSTATES.C, LOOP, log(ploop)); xsc(XSTATES.J, LOOP, log(ploop)); xsc(XSTATES.N, MOVE, log(pmove)); xsc(XSTATES.C, MOVE, log(pmove)); xsc(XSTATES.J, MOVE, log(pmove)); this.l = L; } public SequenceType getAlphabet() { return alphabet; } public MostProbableHCostHMM getHCost() { if (hcost == null) { hcost = new MostProbableHCostHMM(this); } return hcost; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/TSC.java000066400000000000000000000001401246663120000242000ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.hmm; public enum TSC { MM, MI, MD, IM, II, DM, DD, BM } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/XSC.java000066400000000000000000000001141246663120000242050ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.hmm; public enum XSC { LOOP, MOVE } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/XSTATES.java000066400000000000000000000001231246663120000247030ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.hmm; public enum XSTATES { E, N, J, B, C } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/jni/000077500000000000000000000000001246663120000234715ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/jni/HMMER3.java000066400000000000000000000047301246663120000252730ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm.jni; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.readers.SeqReader; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import java.io.File; import java.util.Iterator; /** * * @author fishjord */ public class HMMER3 { private final int numModels; public HMMER3(String hmmdb) throws Exception { System.loadLibrary("hmmerwrapper"); numModels = initHmmer(hmmdb); } public HMMER3(String hmmdb, String hmmerWrapperLib) throws Exception { System.load(hmmerWrapperLib); numModels = initHmmer(hmmdb); } @Override public void finalize() throws Throwable { super.finalize(); destroyHmmer(); } public HMMER3Hit[] findHits(Sequence seq) { return hmmer3(seq.getSeqString()); } public HMMER3Hit[] findHits(String seq) { return hmmer3(seq); } private native int initHmmer(String hmmdb); private native void destroyHmmer(); private native HMMER3Hit[] hmmer3(String seq); public static void main(String[] args) throws Exception { if(args.length != 2) { System.err.println("USAGE: test "); System.exit(1); } HMMER3 hmmer = new HMMER3(args[0]); SeqReader reader = new SequenceReader(new File(args[1])); Sequence seq; while((seq = reader.readNextSequence()) != null) { for(HMMER3Hit hit : hmmer.findHits(seq)) { System.out.println(hit.modelName + "\t" + hit.bits + "\t" + hit.hmmStart + "\t" + hit.hmmEnd + "\t" + hit.seqStart + "\t" + hit.seqEnd); System.out.println(hit.alignedSeq); } } // HMMER3 hmmer = new HMMER3(args[0]); //hmmer.hmmer3("GRGVITSINFLEENGAYDDVDYVSYDVLGDVVCGGFAMPIRENKAQEIYIVMSGEMMALYAANNIAKGILKYANSGGVRLGGLICNERKTDRELELAEAL"); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/jni/HMMER3.java~000066400000000000000000000030051246663120000254630ustar00rootroot00000000000000/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.msu.cme.rdp.alignment.hmm.jni; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.readers.SeqReader; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import java.io.File; import java.util.Iterator; /** * * @author fishjord */ public class HMMER3 { private final int numModels; public HMMER3(String hmmdb) throws Exception { System.loadLibrary("hmmerwrapper"); numModels = initHmmer(hmmdb); } @Override public void finalize() throws Throwable { super.finalize(); destroyHmmer(); } public HMMER3Hit[] findHits(Sequence seq) { return hmmer3(seq.getSeqString()); } private native int initHmmer(String hmmdb); private native void destroyHmmer(); private native HMMER3Hit[] hmmer3(String seq); public static void main(String[] args) throws Exception { if(args.length != 2) { System.err.println("USAGE: test "); System.exit(1); } HMMER3 hmmer = new HMMER3(args[0]); SeqReader reader = new SequenceReader(new File(args[1])); Sequence seq; while((seq = reader.readNextSequence()) != null) { for(HMMER3Hit hit : hmmer.findHits(seq)) { System.out.println(hit.modelName + "\t" + hit.bits); } } // HMMER3 hmmer = new HMMER3(args[0]); //hmmer.hmmer3("GRGVITSINFLEENGAYDDVDYVSYDVLGDVVCGGFAMPIRENKAQEIYIVMSGEMMALYAANNIAKGILKYANSGGVRLGGLICNERKTDRELELAEAL"); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/jni/HMMER3Hit.java000066400000000000000000000012041246663120000257310ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.hmm.jni; public class HMMER3Hit { String modelName; String alignedSeq; double bits; int hmmStart, hmmEnd; int seqStart, seqEnd; int hmmLength; public double getBits() { return bits; } public String getModelName() { return modelName; } public String getAlignedSeq() { return alignedSeq; } public int getHmmEnd() { return hmmEnd; } public int getHmmStart() { return hmmStart; } public int getSeqEnd() { return seqEnd; } public int getSeqStart() { return seqStart; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/jni/HMMER3Hit.java~000066400000000000000000000001121246663120000261240ustar00rootroot00000000000000private static class HMMER3Hit { String modelName; double bits; } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/scoring/000077500000000000000000000000001246663120000243555ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/scoring/ForwardScorer.java000066400000000000000000000131271246663120000300060ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm.scoring; import edu.msu.cme.rdp.alignment.hmm.ProfileHMM; import edu.msu.cme.rdp.alignment.hmm.XSC; import edu.msu.cme.rdp.alignment.hmm.XSTATES; import static edu.msu.cme.rdp.alignment.hmm.TSC.*; import static edu.msu.cme.rdp.alignment.hmm.XSTATES.*; import static java.lang.StrictMath.*; /** * * @author fishjord */ public class ForwardScorer extends HMMScorer { private static final double[] logsumLookup = new double[16000]; static { for (int i = 0; i < 16000; i++) { logsumLookup[i] = log(1 + exp((double) i / 1000)); } } private static final double logsum(double a, double b) { double max = max(a, b); double min = min(a, b); if (min == Double.NEGATIVE_INFINITY) { return max; } return max + log(1 + exp(min - max)); //return (min == Double.NEGATIVE_INFINITY || (max - min) >= 15.7) ? max : max + logsumLookup[(int) ((max - min) * 1000)]; } public ForwardScorer(ProfileHMM hmm) { this(hmm, -1); } public ForwardScorer(ProfileHMM hmm, int startingState) { super(hmm, startingState); } protected final void initializeSM() { for (int k = 0; k <= hmm.M(); k++) { if (k == startingState || startingState == -1) { mmx(0, k, 0); imx(0, k, 0); dmx(0, k, 0); } else { mmx(0, k, Double.NEGATIVE_INFINITY); imx(0, k, Double.NEGATIVE_INFINITY); dmx(0, k, Double.NEGATIVE_INFINITY); } } xmx(0, N, 0); xmx(0, B, hmm.xsc(N, XSC.MOVE)); xmx(0, XSTATES.E, Double.NEGATIVE_INFINITY); xmx(0, C, Double.NEGATIVE_INFINITY); xmx(0, J, Double.NEGATIVE_INFINITY); } final public void consume(char b) { extend(); //seq.append(b); double sc; mmx(i, 0, Double.NEGATIVE_INFINITY); imx(i, 0, Double.NEGATIVE_INFINITY); dmx(i, 0, Double.NEGATIVE_INFINITY); xmx(i, XSTATES.E, Double.NEGATIVE_INFINITY); double lastMaxScore; if (i == 0) { lastMaxScore = Double.NEGATIVE_INFINITY; } else { lastMaxScore = maxScores.get(i - 1); } for (int k = 1; k < hmm.M(); k++) { sc = logsum( logsum( mmx(i - 1, k - 1) + hmm.tsc(k - 1, MM), imx(i - 1, k - 1) + hmm.tsc(k - 1, IM)), dmx(i - 1, k - 1) + hmm.tsc(k - 1, DM) //Simplified by removing an extra logsum(xmx(i-1, begin state) + tsc(BM)) which will always be neg infinity, we're doing begining transitions differently ); mmx(i, k, sc + hmm.msc(k, b)); sc = logsum( mmx(i - 1, k) + hmm.tsc(k, MI), imx(i - 1, k) + hmm.tsc(k, II)); imx(i, k, sc + hmm.isc(k, b)); sc = logsum( mmx(i, k - 1) + hmm.tsc(k - 1, MD), dmx(i, k - 1) + hmm.tsc(k - 1, DD)); dmx(i, k, sc); lastMaxScore = max(max(mmx(i, k), dmx(i, k)), lastMaxScore); } sc = logsum( logsum( mmx(i - 1, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, MM), imx(i - 1, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, IM)), dmx(i - 1, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, DM) //Simplified by removing an extra logsum(xmx(i-1, begin state) + tsc(BM)) which will always be neg infinity, we're doing begining transitions differently ); mmx(i, hmm.M(), sc + hmm.msc(hmm.M(), b)); imx(i, hmm.M(), Double.NEGATIVE_INFINITY); sc = logsum( mmx(i, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, MD), dmx(i, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, DD)); dmx(i, hmm.M(), sc); lastMaxScore = max(max(mmx(i, hmm.M()), dmx(i, hmm.M())), lastMaxScore); maxScores.add(lastMaxScore); /* * Everything below here hasn't been updated for forward...but it isn't * used right now so get over it */ //E sc = max(xmx(i, XSTATES.E), mmx(i, hmm.M())); xmx(i, XSTATES.E, max(sc, dmx(i, hmm.M()))); /* * In theory these should not be used for unihit */ //J sc = xmx(i - 1, J) + hmm.xsc(J, XSC.LOOP); xmx(i, J, max(sc, xmx(i, XSTATES.E) + hmm.xsc(XSTATES.E, XSC.LOOP))); //C sc = xmx(i - 1, C) + hmm.xsc(C, XSC.LOOP); xmx(i, C, max(sc, xmx(i, XSTATES.E) + hmm.xsc(XSTATES.E, XSC.MOVE))); //N xmx(i, N, xmx(i - 1, N) + hmm.xsc(N, XSC.LOOP)); //B /* * In theory J is always going to be infinite in unihit configuration * */ sc = xmx(i, N) + hmm.xsc(N, XSC.MOVE); xmx(i, B, max(sc, xmx(i, J) + hmm.xsc(J, XSC.MOVE))); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/scoring/HMMScorer.java000066400000000000000000000242651246663120000270300ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm.scoring; import edu.msu.cme.rdp.alignment.hmm.ProfileHMM; import edu.msu.cme.rdp.alignment.hmm.XSTATES; import edu.msu.cme.rdp.readseq.readers.Sequence; import java.util.ArrayList; import java.util.List; import static java.lang.StrictMath.*; /** * * @author fishjord */ public abstract class HMMScorer { /* final public void consume(char b) { extend(); seq.append(b); float sc; mmx(i, 0, Float.NEGATIVE_INFINITY); imx(i, 0, Float.NEGATIVE_INFINITY); dmx(i, 0, Float.NEGATIVE_INFINITY); xmx(i, XSTATES.E, Float.NEGATIVE_INFINITY); for (int k = 1; k < hmm.M(); k++) { sc = max(mmx(i - 1, k - 1) + hmm.tsc(k - 1, MM), imx(i - 1, k - 1) + hmm.tsc(k - 1, IM)); sc = max(sc, dmx(i - 1, k - 1) + hmm.tsc(k - 1, DM)); //sc = max(sc, xmx(i - 1, B) + hmm.tsc(k - 1, BM)); //So there is a small problem with this since we don't know the length at the beginning... mmx(i, k, sc + hmm.msc(k, b)); //xmx[i][XSTATES.E.ordinal()] = max(xmx[i][XSTATES.E.ordinal()], matrix[M][i][k] + esc); //So there is a small problem with this since we don't know the length at the beginning...but since esc is inf for glocal we're cool sc = max(mmx(i - 1, k) + hmm.tsc(k, MI), imx(i - 1, k) + hmm.tsc(k, II)); imx(i, k, sc + hmm.isc(k, b)); dmx(i, k, max(mmx(i, k - 1) + hmm.tsc(k - 1, MD), dmx(i, k - 1) + hmm.tsc(k - 1, DD))); } sc = max(mmx(i - 1, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, MM), imx(i - 1, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, IM)); sc = max(sc, dmx(i - 1, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, DM)); //sc = max(sc, xmx(i - 1, B) + hmm.tsc(hmm.M() - 1, BM)); //So there is a small problem with this since we don't know the length at the beginning... mmx(i, hmm.M(), sc + hmm.msc(hmm.M(), b)); imx(i, hmm.M(), Float.NEGATIVE_INFINITY); dmx(i, hmm.M(), max(mmx(i, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, MD), dmx(i, hmm.M() - 1) + hmm.tsc(hmm.M() - 1, DD))); //E sc = max(xmx(i, XSTATES.E), mmx(i, hmm.M())); xmx(i, XSTATES.E, max(sc, dmx(i, hmm.M()))); * * In theory these should not be used for unihit * //J sc = xmx(i - 1, J) + hmm.xsc(J, XSC.LOOP); xmx(i, J, max(sc, xmx(i, XSTATES.E) + hmm.xsc(XSTATES.E, XSC.LOOP))); //C sc = xmx(i - 1, C) + hmm.xsc(C, XSC.LOOP); xmx(i, C, max(sc, xmx(i, XSTATES.E) + hmm.xsc(XSTATES.E, XSC.MOVE))); //N xmx(i, N, xmx(i - 1, N) + hmm.xsc(N, XSC.LOOP)); //B * * In theory J is always going to be infinite in unihit configuration * * sc = xmx(i, N) + hmm.xsc(N, XSC.MOVE); xmx(i, B, max(sc, xmx(i, J) + hmm.xsc(J, XSC.MOVE))); } */ //protected StringBuilder seq = new StringBuilder(); protected final ProfileHMM hmm; protected final int startingState; protected final int modelLength; protected final int modelStates; private List matrix; private static final int M = 0, I = 1, D = 2; protected int i; //curr seq position public final static float ln2 = (float)log(2); private double[] bestPossibleScore; private List xmx; private static final double[] nullModels = new double[5000]; protected List maxScores = new ArrayList(); static { for (int i = 0; i < 5000; i++) { nullModels[i] = genNull1(i); } } public HMMScorer(ProfileHMM hmm) { this(hmm, -1); } public HMMScorer(ProfileHMM hmm, int startingState) { this.hmm = hmm; this.modelLength = hmm.M(); this.modelStates = hmm.M() - 1; //reset(); /*hmm.reconfigureLength(475); /* * Configure the best possible remaining scores */ /*String bestSeq = HMMEmit.mostProbableSeq(hmm); bestPossibleScore = new float[hmm.M() + 1]; for (char c : bestSeq.toCharArray()) { consume(c); } if (bestSeq.length() != hmm.M()) { throw new IllegalStateException("Sequence length doesn't match model length!"); } float score = mmx(hmm.M(), hmm.M()); float startingScore = 0;//(startingState != -1)? mmx(startingState, startingState) : 0; for (int k = 0; k <= hmm.M(); k++) { bestPossibleScore[k] = (float)(score - mmx(k, k) - startingScore); }*/ this.startingState = startingState; reset(); } private static double genNull1(int L) { float p1 = (float) L / (L + 1); float null1 = (float)( L * log(p1) + log(1 - p1)); return null1; } public static double getNull1(int L) { if (L < nullModels.length) { return nullModels[L]; } else { return genNull1(L); } } protected abstract void initializeSM(); public abstract void consume(char b); protected final void reset() { i = -1; matrix = new ArrayList(); xmx = new ArrayList(); //seq = new StringBuilder(); maxScores = new ArrayList(); maxScores.add(Double.NEGATIVE_INFINITY); extend(); initializeSM(); } protected void extend() { i++; double[][] nextRow = new double[3][hmm.M() + 1]; matrix.add(nextRow); xmx.add(new double[XSTATES.values().length]); } public Object[] getBestScore() { int bestK = -1; double score = Float.NEGATIVE_INFINITY; double[] mx = mmx(i); double[] dx = dmx(i); for (int k = 2; k <= modelLength; k++) { double sc = max(mx[k], dx[k]); if (sc > score) { score = sc; bestK = k; } score = max(score, sc); } return new Object[]{bestK, score}; } public Object[] getBestScore(int mp) { int bestK = mp; double[] mx = mmx(i); double[] dx = dmx(i); return new Object[]{bestK, max(mx[mp], dx[mp])}; } public double getMaxScore() { /* float score = Float.NEGATIVE_INFINITY; float[] mx = mmx(i); float[] dx = dmx(i); for (int k = 2; k <= modelLength; k++) { float sc = max(mx[k], dx[k]); if (sc > score) { score = sc; } score = max(score, sc); }*/ double score = maxScores.get(i); return (score - getNull1(i)) / ln2; //return new Object[] { i, (score - getNull1(i)) / ln2, score, bestK, state, hmm.tsc(bestK - 1, II), hmm.tsc(bestK - 1, MI) }; } public double getMaxScorePrint() { double score = Float.NEGATIVE_INFINITY; int maxState = -1; double[] mx = mmx(i); double[] dx = dmx(i); boolean m = false; for (int k = startingState - 1; k <= modelLength; k++) { double sc = max(mx[k], dx[k]); if (sc > score) { m = sc == mx[k]; score = sc; maxState = k; } score = max(score, sc); } System.out.println("Max state: " + maxState + " seq pos: " + i + " match state?: " + m + " score: " + score + " scores[startingState - 1]: " + mx[startingState - 1] + ", " + dx[startingState - 1] + "scores[startingState - 2]: " + mx[startingState - 2] + ", " + dx[startingState - 2]); System.out.println(mmx(0, 0) + ", " + dmx(0, 0) + "\t" + mmx(0, 1) + ", " + dmx(0, 1)); System.out.println(mmx(1, 0) + ", " + dmx(1, 0) + "\t" + mmx(1, 1) + ", " + dmx(1, 1)); System.out.println(); return (score - getNull1(i)) / ln2; } public double getScore() { double score = Math.max(mmx(i, hmm.M()), dmx(i, hmm.M()));//xmx(i, XSTATES.E); return (score - getNull1(i)) / ln2; } public void contract() { if (i >= 0) { matrix.remove(i); xmx.remove(i); //seq.deleteCharAt(i); maxScores.remove(i); i--; } } /*final public String getSeq() { return seq.toString(); }*/ final public int getQueryLength() { return i; } final protected double mmx(int i, int k) { return matrix.get(i)[M][k]; } final protected double imx(int i, int k) { return matrix.get(i)[I][k]; } final protected double dmx(int i, int k) { return matrix.get(i)[D][k]; } final protected double xmx(int i, XSTATES s) { return xmx.get(i)[s.ordinal()]; } final protected double[] mmx(int i) { return matrix.get(i)[M]; } final protected double[] imx(int i) { return matrix.get(i)[I]; } final protected double[] dmx(int i) { return matrix.get(i)[D]; } final protected double[] xmx(int i) { return xmx.get(i); } final protected void mmx(int i, int k, double val) { matrix.get(i)[M][k] = val; } final protected void imx(int i, int k, double val) { matrix.get(i)[I][k] = val; } final protected void dmx(int i, int k, double val) { matrix.get(i)[D][k] = val; } final protected void xmx(int i, XSTATES s, double val) { xmx.get(i)[s.ordinal()] = val; } public static double scoreSequence(ProfileHMM hmm, Sequence seq) { return scoreSequence(hmm, seq.getSeqString()); } public static double scoreSequence(ProfileHMM hmm, String seq) { ViterbiScorer scorer = new ViterbiScorer(hmm); char[] bases = seq.toCharArray(); for (char base : bases) { scorer.consume(base); } return scorer.getMaxScore(); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/hmm/scoring/ViterbiScorer.java000066400000000000000000000126331246663120000300070ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.hmm.scoring; import edu.msu.cme.rdp.alignment.hmm.ProfileHMM; import edu.msu.cme.rdp.alignment.hmm.XSC; import edu.msu.cme.rdp.alignment.hmm.XSTATES; import static edu.msu.cme.rdp.alignment.hmm.TSC.*; import static edu.msu.cme.rdp.alignment.hmm.XSTATES.*; import static java.lang.StrictMath.*; /** * * @author fishjord */ public final class ViterbiScorer extends HMMScorer { public ViterbiScorer(ProfileHMM hmm) { this(hmm, -1); } public ViterbiScorer(ProfileHMM hmm, int startingState) { super(hmm, startingState); } protected final void initializeSM() { for (int k = 0; k <= modelLength; k++) { if (k == (startingState - 1) || startingState == -1) { mmx(0, k, 0); imx(0, k, 0); dmx(0, k, 0); } else { mmx(0, k, Double.NEGATIVE_INFINITY); imx(0, k, Double.NEGATIVE_INFINITY); dmx(0, k, Double.NEGATIVE_INFINITY); } } xmx(0, N, 0); xmx(0, B, hmm.xsc(N, XSC.MOVE)); xmx(0, XSTATES.E, Double.NEGATIVE_INFINITY); xmx(0, C, Double.NEGATIVE_INFINITY); xmx(0, J, Double.NEGATIVE_INFINITY); } final public void consume(char b) { extend(); //seq.append(b); double lastMaxScore = Double.NEGATIVE_INFINITY; double sc; double[] mx = mmx(i); double[] ix = imx(i); double[] dx = dmx(i); double[] mx_m1 = mmx(i - 1); double[] ix_m1 = imx(i - 1); double[] dx_m1 = dmx(i - 1); double[] tscMM = hmm.tsc(MM); double[] tscIM = hmm.tsc(IM); double[] tscDM = hmm.tsc(DM); double[] tscMI = hmm.tsc(MI); double[] tscII = hmm.tsc(II); double[] tscMD = hmm.tsc(MD); double[] tscDD = hmm.tsc(DD); if(startingState == 0) { System.err.println("It's really weird for the starting state to be zero..."); } if(startingState > 0) { mx[startingState - 1] = ix[startingState - 1] = dx[startingState - 1] = Double.NEGATIVE_INFINITY; } else { mx[0] = ix[0] = dx[0] = Double.NEGATIVE_INFINITY; } //xmx(i, XSTATES.E, Float.NEGATIVE_INFINITY); for (int k = max(1, startingState); k < modelLength; k++) { sc = max(mx_m1[k - 1] + tscMM[k - 1], ix_m1[k - 1] + tscIM[k - 1]); sc = max(sc, dx_m1[k - 1] + tscDM[k - 1]); //sc = max(sc, xmx(i - 1, B) + hmm.tsc(k - 1, BM)); //So there is a small problem with this since we don't know the length at the beginning... mx[k] = sc + hmm.msc(k, b); //xmx[i][XSTATES.E.ordinal()] = max(xmx[i][XSTATES.E.ordinal()], matrix[M][i][k] + esc); //So there is a small problem with this since we don't know the length at the beginning...but since esc is inf for glocal we're cool sc = max(mx_m1[k] + tscMI[k], ix_m1[k] + tscII[k]); ix[k] = sc + hmm.isc(k, b); dx[k] = max(mx[k - 1] + tscMD[k - 1], dx[k - 1] + tscDD[k - 1]); lastMaxScore = max(max(mx[k], dx[k]), lastMaxScore); } sc = max(mx_m1[modelStates] + tscMM[modelStates], ix_m1[modelStates] + tscIM[modelStates]); sc = max(sc, dx_m1[modelStates] + tscDM[modelStates]); //sc = max(sc, xmx(i - 1, B) + hmm.tsc(hmm.M() - 1, BM)); //So there is a small problem with this since we don't know the length at the beginning... mx[modelLength] = sc + hmm.msc(modelLength, b); ix[modelLength] = Double.NEGATIVE_INFINITY; dx[modelLength] = max(mmx(i, modelStates) + tscMD[modelStates], dx[modelStates] + tscDD[modelStates]); lastMaxScore = max(max(mx[modelStates], dx[modelStates]), lastMaxScore); maxScores.add(lastMaxScore); //E sc = max(xmx(i, XSTATES.E), mmx(i, hmm.M())); xmx(i, XSTATES.E, max(sc, dmx(i, hmm.M()))); /* * In theory these should not be used for unihit */ //J sc = xmx(i - 1, J) + hmm.xsc(J, XSC.LOOP); xmx(i, J, max(sc, xmx(i, XSTATES.E) + hmm.xsc(XSTATES.E, XSC.LOOP))); //C sc = xmx(i - 1, C) + hmm.xsc(C, XSC.LOOP); xmx(i, C, max(sc, xmx(i, XSTATES.E) + hmm.xsc(XSTATES.E, XSC.MOVE))); //N xmx(i, N, xmx(i - 1, N) + hmm.xsc(N, XSC.LOOP)); //B /* * In theory J is always going to be infinite in unihit configuration * */ //sc = xmx(i, N) + hmm.xsc(N, XSC.MOVE); xmx(i, B, max(sc, xmx(i, J) + hmm.xsc(J, XSC.MOVE))); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/000077500000000000000000000000001246663120000237535ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/PairwiseAligner.java000066400000000000000000000256311246663120000277120ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise; import edu.msu.cme.rdp.alignment.AlignmentMode; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * * @author fishjord */ public class PairwiseAligner { public static void reverse(StringBuffer s) { int l = s.length() - 1; for (int index = 0; index < (l + 1) / 2; index++) { char c = s.charAt(index); s.setCharAt(index, s.charAt(l - index)); s.setCharAt(l - index, c); } } private static final int match = 0; private static final int gap = 1; private static final int left = 0; private static final int up = 1; private static final int diag = 2; private static final int trace = 2; //trace 0 = -1, -1 | trace 1 = -1, 0 | trace 2 = 0, -1 private static int[][][] populateMatrix(char[] seqi, char[] seqj, ScoringMatrix matrix, AlignmentMode mode) { int[][][] scoringMatrix = new int[seqi.length + 1][seqj.length + 1][3]; scoringMatrix[0][0][match] = 0; scoringMatrix[0][0][gap] = Integer.MIN_VALUE; for (int index = 1; index < seqi.length + 1; index++) { int initScore = (mode == AlignmentMode.global/* || mode == AlignmentMode.glocal*/) ? (index - 1) * matrix.getGapExtend() + matrix.getGapOpen() : 0; scoringMatrix[index][0][match] = initScore; scoringMatrix[index][0][gap] = initScore + matrix.getGapExtend(); scoringMatrix[index][0][trace] = left; } for (int index = 1; index < seqj.length + 1; index++) { int initScore = (mode == AlignmentMode.global || mode == AlignmentMode.glocal) ? (index - 1) * matrix.getGapExtend() + matrix.getGapOpen() : 0; scoringMatrix[0][index][match] = initScore; scoringMatrix[0][index][gap] = initScore + matrix.getGapExtend(); scoringMatrix[0][index][trace] = up; } for (int i = 1; i < seqi.length + 1; i++) { for (int j = 1; j < seqj.length + 1; j++) { int sxy = matrix.score(seqi[i - 1], seqj[j - 1]); int scoreUp = Math.max(scoringMatrix[i - 1][j][gap] + matrix.getGapExtend(), scoringMatrix[i - 1][j][match] + matrix.getGapOpen()); int scoreLeft = Math.max(scoringMatrix[i][j - 1][gap] + matrix.getGapExtend(), scoringMatrix[i][j - 1][match] + matrix.getGapOpen()); int m = Math.max(scoringMatrix[i - 1][j - 1][match], scoringMatrix[i - 1][j - 1][gap]) + sxy; if (mode == AlignmentMode.local) { scoringMatrix[i][j][match] = (m < 0)? 0 : m; scoringMatrix[i][j][gap] = Math.min(0, Math.max(scoreLeft, scoreUp)); } else { scoringMatrix[i][j][match] = m; scoringMatrix[i][j][gap] = Math.max(scoreLeft, scoreUp); } if (m >= scoreLeft && m >= scoreUp) { scoringMatrix[i][j][trace] = diag; } else if (scoreLeft >= m && scoreLeft >= scoreUp) { scoringMatrix[i][j][trace] = up; } else { scoringMatrix[i][j][trace] = left; } } } return scoringMatrix; } private static PairwiseAlignment traceback(int[][][] scoringMatrix, char[] seqi, char[] seqj, AlignmentMode mode) { StringBuffer alignedSeqi = new StringBuffer(); StringBuffer alignedSeqj = new StringBuffer(); List scores = new ArrayList(); int i = seqi.length, j = seqj.length; boolean fillFromJ = false; switch (mode) { case overlap: case overlap_trim: //For overlap we find the best score on either edge { int bestEdge = Integer.MIN_VALUE; for (int index = 1; index < seqi.length + 1; index++) { if (scoringMatrix[index][seqj.length][match] > bestEdge) { bestEdge = scoringMatrix[index][seqj.length][match]; i = index; } } for (int index = 1; index < seqj.length + 1; index++) { if (scoringMatrix[seqi.length][index][match] > bestEdge) { bestEdge = scoringMatrix[seqi.length][index][match]; i = seqi.length; j = index; fillFromJ = true; } } } break; case local: //For local, find the best score anywhere in the scoringMatrix { int bestEdge = Integer.MIN_VALUE; for (int row = 1; row < seqi.length + 1; row++) { for (int col = 1; col < seqj.length + 1; col++) { if (scoringMatrix[row][col][match] > bestEdge) { bestEdge = scoringMatrix[row][col][match]; i = row; j = col; } } } } break; case glocal: //For glocal we find the best score anywhere on the right edge of the scoringMatrix { int bestEdge = Integer.MIN_VALUE; for (int index = 1; index < seqi.length + 1; index++) { if (scoringMatrix[index][seqj.length][match] > bestEdge) { bestEdge = scoringMatrix[index][seqj.length][match]; i = index; } } /*for (int index = 1; index < seqj.length + 1; index++) { if (scoringMatrix[seqi.length][index][match] > bestEdge) { bestEdge = scoringMatrix[seqi.length][index][match]; j = index; } }*/ } break; } if (mode == AlignmentMode.overlap || mode == AlignmentMode.glocal) { int x; char[] appendBases; StringBuffer appendBasesSeq, appendGaps; if (fillFromJ) { x = j; appendBases = seqj; appendBasesSeq = alignedSeqj; appendGaps = alignedSeqi; } else { x = i; appendBases = seqi; appendBasesSeq = alignedSeqi; appendGaps = alignedSeqj; } for (int index = appendBases.length - 1; index >= x; index--) { appendBasesSeq.append(appendBases[index]); appendGaps.append('-'); if (appendBases == seqi) { scores.add(scoringMatrix[i][seqj.length][match]); } else { scores.add(scoringMatrix[seqi.length][j][match]); } } } int endi = i, endj = j; boolean done = false; while (!done) { int traceVal = scoringMatrix[i][j][trace]; if (traceVal == diag) { alignedSeqi.append(seqi[i - 1]); alignedSeqj.append(seqj[j - 1]); i--; j--; } else if (traceVal == up) { alignedSeqi.append('-'); alignedSeqj.append(seqj[j - 1]); j--; } else if (traceVal == left) { alignedSeqi.append(seqi[i - 1]); alignedSeqj.append('-'); i--; } else { throw new IllegalArgumentException("Unknown trace value " + traceVal); } if (mode == AlignmentMode.local && scoringMatrix[i][j][match] < 0) { scores.add(0); } else { scores.add(scoringMatrix[i][j][match]); } switch (mode) { case global: done = (i == 0) && (j == 0); break; case local: done = ((i == 0) && (j == 0)) || (scoringMatrix[i][j][match] <= 0); break; case overlap: case overlap_trim: done = (i == 0) || (j == 0); break; case glocal: //done = j == 0; done = i == 0; break; default: throw new IllegalArgumentException("Unknown alignment mode " + mode); } } int starti = i; int startj = j; if (mode == AlignmentMode.overlap){// || mode == AlignmentMode.glocal) { int x; char[] appendBases; StringBuffer appendBasesSeq, appendGaps; if (i == 0) { x = j; appendBases = seqj; appendBasesSeq = alignedSeqj; appendGaps = alignedSeqi; } else { x = i; appendBases = seqi; appendBasesSeq = alignedSeqi; appendGaps = alignedSeqj; } while (x > 0) { appendGaps.append('-'); appendBasesSeq.append(appendBases[x - 1]); scores.add(0); x--; } } reverse(alignedSeqi); reverse(alignedSeqj); Collections.reverse(scores); return new PairwiseAlignment(alignedSeqi.toString().toUpperCase(), alignedSeqj.toString().toUpperCase(), scores, starti, endi, startj, endj); } /** * * @param seq1 For glocal and overlap modes this sequence is assumed to be the REFERENCE * @param seq2 For glocal and overlap modes this seuqence is assumed to be the QUERY * @param scoringMatrix Scoring matrix to use, the ScoringMatrix class has defaults for Nucleotide and Protein scoring matrices * @param mode Alignment mode, global, local, global-local, overlap, or overlap trim * @return */ public static PairwiseAlignment align(String seq1, String seq2, ScoringMatrix scoringMatrix, AlignmentMode mode) { int[][][] scores = populateMatrix(seq1.toCharArray(), seq2.toCharArray(), scoringMatrix, mode); return traceback(scores, seq1.toCharArray(), seq2.toCharArray(), mode); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/PairwiseAlignment.java000066400000000000000000000036431246663120000302460ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise; import java.util.List; import java.util.Collections; /** * * @author fishjord */ public class PairwiseAlignment { private String alignedSeqi; private String alignedSeqj; private List scores; private int starti, endi; private int startj, endj; public PairwiseAlignment(String alignedSeqi, String alignedSeqj, List scores, int starti, int endi, int startj, int endj) { this.alignedSeqi = alignedSeqi; this.alignedSeqj = alignedSeqj; this.scores = Collections.unmodifiableList(scores); this.starti = starti; this.startj = startj; this.endi = endi; this.endj = endj; } public String getAlignedSeqi() { return alignedSeqi; } public String getAlignedSeqj() { return alignedSeqj; } public int getScore() { return scores.get(scores.size() - 1); } public List getScores() { return scores; } public int getEndi() { return endi; } public int getEndj() { return endj; } public int getStarti() { return starti; } public int getStartj() { return startj; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/PairwiseKNN.java000066400000000000000000000253471246663120000267630ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise; import edu.msu.cme.rdp.alignment.AlignmentMode; import edu.msu.cme.rdp.alignment.pairwise.rna.DistanceModel; import edu.msu.cme.rdp.alignment.pairwise.rna.IdentityDistanceModel; import edu.msu.cme.rdp.alignment.pairwise.rna.OverlapCheckFailedException; import edu.msu.cme.rdp.readseq.SequenceType; import edu.msu.cme.rdp.readseq.readers.SeqReader; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.utils.IUBUtilities; import edu.msu.cme.rdp.readseq.utils.SeqUtils; import edu.msu.cme.rdp.readseq.utils.kmermatch.KmerMatchCore; import edu.msu.cme.rdp.readseq.utils.kmermatch.NuclSeqMatch; import edu.msu.cme.rdp.readseq.utils.kmermatch.ProteinSeqMatch; import edu.msu.cme.rdp.readseq.utils.orientation.GoodWordIterator; import edu.msu.cme.rdp.readseq.utils.orientation.ProteinWordGenerator; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; /** * * @author Jordan Fish */ public class PairwiseKNN { private File queryFile; private File refFile; private int k; private int prefilter = 0; private int wordSize; private AlignmentMode mode; private List dbSeqs; private PrintStream out; private static final String dformat = "%1$.3f"; public static class Neighbor { PairwiseAlignment alignment; boolean reverse; Sequence dbSeq; } private static void insert(T n, List list, Comparator comp, int k) { int i = list.size(); list.add(n); while (i > 0 && comp.compare(list.get(i), list.get(i - 1)) > 0) { Collections.swap(list, i, i - 1); i--; } if (list.size() > k) { list.remove(k); } } public static List getKNN(Sequence query, List dbSeqs, AlignmentMode mode, int k, int wordSize, int prefilter) throws IOException { List ret = new ArrayList(); Neighbor n; Comparator c = new Comparator() { public int compare(Neighbor t, Neighbor t1) { return t.alignment.getScore() - t1.alignment.getScore(); } }; SequenceType seqType = SeqUtils.guessSequenceType(query); ScoringMatrix matrix; KmerMatchCore kerMatchCore; if (seqType == SequenceType.Nucleotide) { matrix = ScoringMatrix.getDefaultNuclMatrix(); kerMatchCore = new NuclSeqMatch(dbSeqs, wordSize); } else { matrix = ScoringMatrix.getDefaultProteinMatrix(); kerMatchCore = new ProteinSeqMatch(dbSeqs, wordSize); } List refList; if ( prefilter == 0) { // do not pre-filter the reference seqs refList = dbSeqs; }else { refList = new ArrayList(); ArrayList topKMatches= kerMatchCore.findTopKMatch(query, prefilter); for (KmerMatchCore.BestMatch bestTarget : topKMatches) { refList.add(bestTarget.getBestMatch()); } } for (Sequence dbSeq : refList) { n = new Neighbor(); n.dbSeq = dbSeq; PairwiseAlignment fwd = PairwiseAligner.align(n.dbSeq.getSeqString(), query.getSeqString(), matrix, mode); if (seqType == SequenceType.Nucleotide) { PairwiseAlignment rc = PairwiseAligner.align(n.dbSeq.getSeqString(), IUBUtilities.reverseComplement(query.getSeqString()), matrix, mode); if (rc.getScore() > fwd.getScore()) { n.alignment = rc; n.reverse = true; } else { n.alignment = fwd; n.reverse = false; } } else { n.alignment = fwd; n.reverse = false; } insert(n, ret, c, k); } return ret; } public PairwiseKNN(File queryFile, File refFile, PrintStream out, AlignmentMode mode, int k, int wordSize, int prefilter) throws IOException{ this.queryFile = queryFile; this.refFile = refFile; this.out = out; this.mode = mode; this.k = k; this.prefilter = prefilter; this.wordSize = wordSize; SequenceType querySeqType = SeqUtils.guessSequenceType(queryFile); SequenceType refSeqType = SeqUtils.guessSequenceType(refFile); if ( querySeqType != refSeqType) { throw new RuntimeException("reference seqs and query seqs must be the same type, either protein or nucleotide. " ); } if ( wordSize == 0 ){ if ( refSeqType == SequenceType.Protein){ this.wordSize = ProteinWordGenerator.WORDSIZE; } else { this.wordSize = GoodWordIterator.DEFAULT_WORDSIZE ; } } dbSeqs = SequenceReader.readFully(refFile); } public void match() throws IOException, OverlapCheckFailedException { DistanceModel dist = new IdentityDistanceModel(); out.println("#query file: " + queryFile.getName() + " db file: " + refFile.getName() + " k: " + k + " mode: " + mode + " usePrefilter: " + prefilter); out.println("#seqname\tk\tref seqid\tref desc\torientation\tscore\tident\tquery start\tquery end\tquery length\tref start\tref end"); Sequence seq; List alignments; Neighbor n; PairwiseAlignment alignment; SequenceReader queryReader = new SequenceReader(queryFile); while ((seq = queryReader.readNextSequence()) != null) { alignments = getKNN(seq, dbSeqs, mode, k, wordSize, prefilter); for (int index = 0; index < alignments.size(); index++) { n = alignments.get(index); alignment = n.alignment; double ident = 1 - dist.getDistance(alignment.getAlignedSeqi().getBytes(), alignment.getAlignedSeqj().getBytes(), 0); out.println("@" + seq.getSeqName() + "\t" + (index + 1) + "\t" + n.dbSeq.getSeqName() + "\t" + n.dbSeq.getDesc() + "\t" + (n.reverse ? "-" : "+") + "\t" + alignment.getScore() + "\t" + String.format(dformat,ident) + "\t" + alignment.getStartj() + "\t" + alignment.getEndj() + "\t" + seq.getSeqString().length() + "\t" + alignment.getStarti() + "\t" + alignment.getEndi()); out.println(">" + alignment.getAlignedSeqj()); out.println(">" + alignment.getAlignedSeqi()); } } queryReader.close(); out.close(); } public static void main(String[] args) throws Exception { File queryFile; File refFile; AlignmentMode mode = AlignmentMode.glocal; int k = 1; int wordSize = 0 ; int prefilter = 10 ; // The top p closest protein targets PrintStream out = new PrintStream(System.out); Options options = new Options(); options.addOption("m", "mode", true, "Alignment mode {global, glocal, local, overlap, overlap_trimmed} (default= glocal)"); options.addOption("k", true, "K-nearest neighbors to return. (default = 1)"); options.addOption("o", "out", true, "Redirect output to file instead of stdout"); options.addOption("p", "prefilter", true, "The top p closest targets from kmer prefilter step. Set p=0 to disable the prefilter step. (default = 10) "); options.addOption("w", "word-size", true, "The word size used to find closest targets during prefilter. (default " + ProteinWordGenerator.WORDSIZE + " for protein, " + GoodWordIterator.DEFAULT_WORDSIZE + " for nucleotide)"); try { CommandLine line = new PosixParser().parse(options, args); if (line.hasOption("mode")) { mode = AlignmentMode.valueOf(line.getOptionValue("mode")); } if (line.hasOption('k')) { k = Integer.valueOf(line.getOptionValue('k')); if ( k < 1 ){ throw new Exception("k must be at least 1"); } } if (line.hasOption("word-size")) { wordSize = Integer.parseInt(line.getOptionValue("word-size")); if ( wordSize < 3 ){ throw new Exception("Word size must be at least 3"); } } if (line.hasOption("prefilter")) { prefilter = Integer.parseInt(line.getOptionValue("prefilter")); // prefilter == 0 means no prefilter if ( prefilter > 0 && prefilter < k ){ throw new Exception("prefilter must be at least as big as k " + k); } } if (line.hasOption("out")) { out = new PrintStream(line.getOptionValue("out")); } args = line.getArgs(); if (args.length != 2) { throw new Exception("Unexpected number of command line arguments"); } queryFile = new File(args[0]); refFile = new File(args[1]); } catch (Exception e) { new HelpFormatter().printHelp("PairwiseKNN ", options); System.err.println("ERROR: " + e.getMessage()); return; } PairwiseKNN theObj = new PairwiseKNN(queryFile, refFile, out, mode, k, wordSize, prefilter); theObj.match(); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/PairwiseMatcher.java000066400000000000000000000103771246663120000277150ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise; import edu.msu.cme.rdp.alignment.AlignmentMode; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAligner; import edu.msu.cme.rdp.alignment.pairwise.PairwiseAlignment; import edu.msu.cme.rdp.alignment.pairwise.rna.DistanceModel; import edu.msu.cme.rdp.alignment.pairwise.rna.IdentityDistanceModel; import edu.msu.cme.rdp.alignment.pairwise.ScoringMatrix; import edu.msu.cme.rdp.readseq.readers.SequenceReader; import edu.msu.cme.rdp.readseq.readers.SeqReader; import edu.msu.cme.rdp.readseq.readers.Sequence; import java.io.File; import java.io.PrintStream; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * * @author fishjord */ public class PairwiseMatcher { public static void main(String[] args) throws Exception { if(args.length != 3) { System.err.println("USAGE: PairwiseMatcher "); return; } File inFile = new File(args[1]); File refFile = new File(args[0]); List refSeqs = SequenceReader.readFully(refFile); ScoringMatrix matrix = ScoringMatrix.getDefaultProteinMatrix(); DistanceModel model = new IdentityDistanceModel(); SeqReader reader = new SequenceReader(inFile); Sequence seq; Map hits = new LinkedHashMap(); for (Sequence refSeq : refSeqs) { hits.put(refSeq.getSeqName(), 0); } PrintStream out = new PrintStream(args[2]); while ((seq = reader.readNextSequence()) != null) { long startTime = System.currentTimeMillis(); PairwiseAlignment bestAlignment = null; Sequence bestRef = null; for (Sequence refSeq : refSeqs) { PairwiseAlignment alignment = PairwiseAligner.align(refSeq.getSeqString(), seq.getSeqString(), matrix, AlignmentMode.glocal); if (bestAlignment == null || bestAlignment.getScore() < alignment.getScore()) { bestAlignment = alignment; bestRef = refSeq; } } int start = -1, end = -1; int refPos = 0; char[] seqi = bestAlignment.getAlignedSeqi().toCharArray(); char[] seqj = bestAlignment.getAlignedSeqj().toCharArray(); for (int index = 0; index < bestAlignment.getAlignedSeqi().length(); index++) { if (seqj[index] != '-') { if (start == -1) { start = refPos; } end = refPos + 1; } if (seqi[index] != '-') { refPos++; } } double ident = model.getDistance(bestAlignment.getAlignedSeqi().getBytes(), bestAlignment.getAlignedSeqj().getBytes(), 0); out.println(">\t" + seq.getSeqName() + "\t" + bestRef.getSeqName() + "\t" + bestAlignment.getScore() + "\t" + start + "\t" + end + "\t" + ident); out.println(bestAlignment.getAlignedSeqi()); out.println(bestAlignment.getAlignedSeqj()); hits.put(bestRef.getSeqName(), hits.get(bestRef.getSeqName()) + 1); System.out.println("Processed " + seq.getSeqName() + " in " + (System.currentTimeMillis() - startTime) + "ms"); } out.close(); for (String seqid : hits.keySet()) { int hitCount = hits.get(seqid); if (hitCount == 0) { continue; } System.out.println(seqid + "\t" + hitCount); } } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/ScoringMatrix.java000066400000000000000000000172121246663120000274120ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; /** * * @author fishjord */ @XmlAccessorType(XmlAccessType.FIELD) public class ScoringMatrix { private static ScoringMatrix defaultNuclMatrix = null; private static ScoringMatrix defaultProtMatrix = null; private static ScoringMatrix defaultProtMetricMatrix = null; public static final int DEFAULT_GAP_OPEN_PEALTY = -10; public static final int DEFAULT_GAP_EXT_PENALTY = -1; public static final int DEFAULT_FRAME_SHIFT_PENALTY = -10; public static final int DEFAULT_METRIC_GAP_OPEN_PEALTY = -13; public static final int DEFAULT_METRIC_GAP_EXT_PENALTY = -4; private int[][] scoringMatrix; private int[] reverseLookup = new int [127]; private int gapPenalty; private int gapExtend; private int frameshiftPenalty = DEFAULT_FRAME_SHIFT_PENALTY; private ScoringMatrix() {} public ScoringMatrix(File f, int gapOpenPenalty, int gapExtendPenalty) throws IOException { this(new FileInputStream(f), gapOpenPenalty, gapExtendPenalty); } public ScoringMatrix(InputStream is, int gapOpenPenalty, int gapExtendPenalty, int frameshiftPenalty) throws IOException { this(is, gapOpenPenalty, gapExtendPenalty); this.frameshiftPenalty = frameshiftPenalty; } public ScoringMatrix(InputStream is, int gapOpenPenalty, int gapExtendPenalty) throws IOException { this.gapPenalty = gapOpenPenalty; this.gapExtend = gapExtendPenalty; BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line; for(int index = 0;index < 127;index++) { reverseLookup[index] = -1; } int curRow = -1; List validChars = new ArrayList(); while ((line = reader.readLine()) != null) { line = line.trim().toLowerCase(); if (line.startsWith("#") || line.equals("")) { continue; } if (curRow == -1) { for (String s : line.split("\\s+")) { if (s.length() > 1) { throw new IOException("Scoring matrix header " + s + " is longer than 1 character, cannot parse"); } validChars.add(s.charAt(0)); } curRow = 0; scoringMatrix = new int[validChars.size()][validChars.size()]; } else { String[] values = line.split("\\s+"); if (values.length != validChars.size() + 1) { throw new IOException("Expected " + validChars.size() + " columns in matrix row " + curRow + " but instead found " + (values.length - 1)); } if (values[0].charAt(0) != validChars.get(curRow) || values[0].length() > 1) { throw new IOException("Scoring matrix must be symetric (expected " + validChars.get(curRow) + " but saw " + values[0] + ")"); } for (int index = 1; index < values.length; index++) { scoringMatrix[curRow][index - 1] = Integer.valueOf(values[index]); } curRow++; } } for(int index = 0;index < validChars.size();index++) { reverseLookup[Character.toLowerCase(validChars.get(index))] = reverseLookup[Character.toUpperCase(validChars.get(index))] = index; } } public static ScoringMatrix getDefaultNuclMatrix() { if(defaultNuclMatrix == null) { try { defaultNuclMatrix = new ScoringMatrix(ScoringMatrix.class.getResourceAsStream("/data/NUC.4.4"), DEFAULT_GAP_OPEN_PEALTY, DEFAULT_GAP_EXT_PENALTY); } catch(Exception e) { throw new RuntimeException("Failed to get default nucl matrix...something is very wrong!", e); } } return defaultNuclMatrix; } public static ScoringMatrix getSimpleScoringMatrix(int match, int mismatch) { ScoringMatrix ret = new ScoringMatrix(); ret.gapExtend = mismatch; ret.gapPenalty = mismatch; for(int index = 0;index < 127;index++) { ret.reverseLookup[index] = -1; } for(char c = 'a';c <= 'z';c++) { ret.reverseLookup[c] = ret.reverseLookup[Character.toUpperCase(c)] = c - 'a'; } ret.scoringMatrix = new int['z' - 'a']['z' - 'a']; for(int row = 0;row < ret.scoringMatrix.length;row++) { ret.scoringMatrix[row][row] = match; for(int col = row + 1;col < ret.scoringMatrix.length;col++) { ret.scoringMatrix[row][col] = ret.scoringMatrix[col][row] = mismatch; } } return ret; } public static ScoringMatrix getDefaultProteinMatrix() { if(defaultProtMatrix == null) { try { defaultProtMatrix = new ScoringMatrix(ScoringMatrix.class.getResourceAsStream("/data/blosum62.txt"), DEFAULT_GAP_OPEN_PEALTY, DEFAULT_GAP_EXT_PENALTY); } catch(Exception e) { throw new RuntimeException("Failed to get default protein scoring matrix...something is very wrong!", e); } } return defaultProtMatrix; } public static ScoringMatrix getDefaultProteinMetricMatrix() { if(defaultProtMetricMatrix == null) { try { defaultProtMetricMatrix = new ScoringMatrix(ScoringMatrix.class.getResourceAsStream("/data/blosum62_metric.txt"), DEFAULT_METRIC_GAP_OPEN_PEALTY, DEFAULT_METRIC_GAP_EXT_PENALTY); } catch(Exception e) { throw new RuntimeException("Failed to get default protein scoring matrix blosum62_metric...something is very wrong!", e); } } return defaultProtMetricMatrix; } public int score(Character b1, Character b2) { int i1 = reverseLookup[b1]; int i2 = reverseLookup[b2]; if (i1 == -1 || i2 == -1) { throw new IllegalArgumentException("Cannot score " + b1 + ", " + b2); } return scoringMatrix[i1][i2]; } public int getGapOpen() { return gapPenalty; } public int getGapExtend() { return gapExtend; } public int getFrameshiftPenalty(){ return frameshiftPenalty; } public int getIndelPenalty(){ return gapPenalty + gapExtend ; } public static InputStream getDefaultProteinMatrixStream(){ return ScoringMatrix.class.getResourceAsStream("/data/blosum62.txt"); } public static InputStream getDefaultProteinMatrixMetricStream(){ return ScoringMatrix.class.getResourceAsStream("/data/blosum62_metric.txt"); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/000077500000000000000000000000001246663120000245335ustar00rootroot00000000000000AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/DistMatrixSeq.java000066400000000000000000000040401246663120000301350ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise.rna; import edu.msu.cme.rdp.readseq.utils.SeqUtils; import java.io.Serializable; /** * * @author fishjord */ public class DistMatrixSeq implements Serializable { private String seqid; private String seq; private String name = ""; private String status = ""; private byte[] seqBytes; public DistMatrixSeq(String seqid, String seq) { this.seqid = seqid; this.seq = seq; } public DistMatrixSeq(String seqid, String seq, byte[] seqBytes) { this.seqid = seqid; this.seq = seq; this.seqBytes = seqBytes; } public DistMatrixSeq(String seqid, String seq, String status) { this.seqid = seqid; this.seq = seq; this.status = status; } public void setSeqName(String name) { if(name != null) this.name = name; } public String getSeqName() { return name; } public String getStatus(){ return status; } protected void translateSeq(String seq) { seqBytes = SeqUtils.toBytes(seq); } public String getSeqid() { return seqid; } public String getSeq() { return seq; } public byte[] getSeqBytes() { if(seqBytes == null) translateSeq(this.seq); return seqBytes; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/DistanceModel.java000066400000000000000000000006311246663120000301110ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; // CorrectedDistanceModel.java // SequenceRelatedness // // Created by Ryan Farris on Fri Jun 07 2002. // Copyright (c) 2002 Michigan State University Board of Trustees. All rights reserved. // public abstract class DistanceModel { public abstract double getDistance( byte[] seqX, byte[] seqY, int overlapLimit ) throws OverlapCheckFailedException; } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/DivergenceMatrix.java000066400000000000000000000047731246663120000306510ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; // // DivergenceMatrix.java import edu.msu.cme.rdp.readseq.utils.SeqUtils; // // Created by Ryan Farris on Fri Jun 07 2002. // Copyright (c) 2002 Michigan State University Board of Trustees. All rights reserved. // public class DivergenceMatrix { // constants other classes will use when accessing positions on the matrix. protected final int[] A = {0, 0}; protected final int[] B = {1, 0}; protected final int[] C = {2, 0}; protected final int[] D = {4, 0}; protected final int[] E = {0, 1}; protected final int[] F = {1, 1}; protected final int[] G = {2, 1}; protected final int[] H = {4, 1}; protected final int[] I = {0, 2}; protected final int[] J = {1, 2}; protected final int[] K = {2, 2}; protected final int[] L = {4, 2}; protected final int[] M = {0, 4}; protected final int[] N = {1, 4}; protected final int[] O = {2, 4}; protected final int[] P = {4, 4}; // useful local constants private static final int x = 0; private static final int y = 1; //This matrix is 5 by 5 so that the actual value from the byte array (shifted right 1) can be used to index //in to the frequency matrix, this however does mean that row 3 is not used private double[][] matrix = new double[5][5]; public DivergenceMatrix( byte[] seqX, byte[] seqY, int overlapLimit ) throws OverlapCheckFailedException { int matchablePositions = 0; double [][] localMatrix = new double[matrix.length][matrix.length]; // alignment position by alignment position, count the number of matches and mismatches. // the alignments had better be the same length, 'cause I'm not checking here. for ( int i=0; i < seqX.length; i++ ) { int x = seqX[i], y = seqY[i]; if(((x & SeqUtils.NON_COMPAREABLE) == 0) && ((y & SeqUtils.NON_COMPAREABLE) == 0)) { matchablePositions++; localMatrix[x >> 1][y >> 1]++; } } if (matchablePositions < overlapLimit) { throw new OverlapCheckFailedException("did not pass the overlap limit"); } // turn our matrix of counts into a matrix of frequencies. for ( int i=0; i < localMatrix.length; i++ ) { for ( int j=0; j < localMatrix.length; j++ ) { matrix[i][j] = localMatrix[i][j] / (double)matchablePositions; } } } public double getFrequency( int[] position ) { return this.matrix[position[x]][position[y]]; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/FastDistanceCalc.java000077500000000000000000000017141246663120000305370ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; // // DivergenceMatrix.java import edu.msu.cme.rdp.readseq.utils.SeqUtils; // // Created by Ryan Farris on Fri Jun 07 2002. // Copyright (c) 2002 Michigan State University Board of Trustees. All rights reserved. // public class FastDistanceCalc { private static final float nan = -1.0f; public static float FastDistanceCalc(byte[] seqX, byte[] seqY, int overlapLimit) { int matchable = 0; int matches = 0; int x, y; for (int i = 0; i < seqX.length; i++) { x = seqX[i]; y = seqY[i]; if(((x | y) & SeqUtils.NON_COMPAREABLE) == 0) { matchable++; if(x == y) { matches++; } } } if(matchable == 0 || matchable < overlapLimit) { return nan; } return 1 - matches / (float)matchable; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/IdentityDistanceModel.java000066400000000000000000000040261246663120000316250ustar00rootroot00000000000000/* * Created on Sep 29, 2005 */ package edu.msu.cme.rdp.alignment.pairwise.rna; import edu.msu.cme.rdp.readseq.utils.SeqUtils; /** * @author farrisry */ public class IdentityDistanceModel extends DistanceModel { private static final byte DASH = (byte) '-'; private static final byte DOT = (byte) '.'; private boolean metric = false; public IdentityDistanceModel() { } public IdentityDistanceModel(boolean metric) { this.metric = metric; } /* (non-Javadoc) * @see edu.msu.cme.rdp.pairwisedistance.DistanceModel#getDistance(edu.msu.cme.rdp.pairwisedistance.DivergenceMatrix) */ public double getDistance(byte[] seqX, byte[] seqY, int overlapMin) throws OverlapCheckFailedException { int match = 0; int compPositions = 0; for (int index = 0; index < seqX.length; index++) { if (!metric && (seqX[index] == DASH || seqX[index] == SeqUtils.GAP || seqX[index] == DOT || seqY[index] == DASH || seqY[index] == SeqUtils.GAP || seqY[index] == DOT)) { continue; } compPositions++; if (seqX[index] == seqY[index]) { match++; } } if (compPositions < overlapMin) { throw new OverlapCheckFailedException(""); } return 1 - ((float)match / compPositions); } public static void main(String [] args) throws Exception { String s1 = "--------KIAVYENETPLFVSNIKHSVEELSAFPEVIDQFEFRKNLVLQELENNKIPF-SFDAIIGRGGLVKPIPGGVYEVNEAMKRDTVHAMR-THACNLGGLIASELASTLPCPAFIADPGVVDELEDIARITGSPLMPKIT--------------------"; String s2 = "---------IAVYENETPLFVSNIKHSVEELSAFPEVIDQFEFRKNLVLQELENNKIPF-SFDAIIGRGGLVKPIPGGVYEVNEAMKRDTVHAMR-THACNLGGLIASELASTLPCPAFIADPGVVDELEDIARITGSPLMPKITI-------------------"; System.out.println(new IdentityDistanceModel().getDistance(s1.getBytes(), s2.getBytes(), 0)); System.out.println(new IdentityDistanceModel(true).getDistance(s1.getBytes(), s2.getBytes(), 0)); } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/JukesCantorModel.java000066400000000000000000000013551246663120000306130ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; // // JukesCantorModel.java // SequenceRelatedness // // Created by Ryan Farris on Fri Jun 07 2002. // Copyright (c) 2002 Michigan State University Board of Trustees. All rights reserved. // public class JukesCantorModel extends DistanceModel { public final double getDistance( byte[] seqX, byte[] seqY, int overlapLimit) throws OverlapCheckFailedException { DivergenceMatrix dm = new DivergenceMatrix( seqX, seqY, overlapLimit ); double D = 1.0 - ( dm.getFrequency( dm.A ) + dm.getFrequency( dm.F ) + dm.getFrequency( dm.K ) + dm.getFrequency( dm.P )); double correctedDistance = -(3.0/4.0) * Math.log( 1.0 - (4.0/3.0) * D ); return correctedDistance; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/Kimura2ParameterModel.java000066400000000000000000000021171246663120000315330ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; // Kimura2ParameterModel.java // SequenceRelatedness // // Created by Ryan Farris on Fri Jun 07 2002. // Copyright (c) 2002 Michigan State University Board of Trustees. All rights reserved. // public class Kimura2ParameterModel extends DistanceModel { // this could be static, but I want this to be part of a interface public double getDistance( byte[] seqX, byte[] seqY, int overlapLimit) throws OverlapCheckFailedException { DivergenceMatrix dm = new DivergenceMatrix( seqX, seqY, overlapLimit ); double P = dm.getFrequency( dm.C ) + dm.getFrequency( dm.H ) + dm.getFrequency( dm.I ) + dm.getFrequency( dm.N ); double Q = dm.getFrequency( dm.B ) + dm.getFrequency( dm.D ) + dm.getFrequency( dm.E ) + dm.getFrequency( dm.G ) + dm.getFrequency( dm.J ) + dm.getFrequency( dm.L ) + dm.getFrequency( dm.M ) + dm.getFrequency( dm.O ); double correctedDistance = (.5) * Math.log( 1.0 / ( 1.0 - (2.0 * P) - Q )) + (.25) * Math.log( 1.0 / ( 1.0 - (2.0 * Q) )); return correctedDistance; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/MemoryResidentDistanceMatrix.java000066400000000000000000000061551246663120000332130ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class MemoryResidentDistanceMatrix { List xSeqs; List ySeqs; DistanceModel distanceModel; double[][] distanceMatrix; protected MemoryResidentDistanceMatrix(List sequenceList, DistanceModel distanceModel, int overlapLimit ) throws OverlapCheckFailedException { this.xSeqs = this.ySeqs = sequenceList; this.distanceModel = distanceModel; distanceMatrix = new double[sequenceList.size()][sequenceList.size()]; Map> errorMap = new HashMap>(); for(int seq1 = 0;seq1 < sequenceList.size();seq1++) { distanceMatrix[seq1][seq1] = 0; Set nonOverlappingSet = new HashSet(); for(int seq2 = seq1 + 1;seq2 < sequenceList.size();seq2++) { try { double dist = distanceModel.getDistance( sequenceList.get(seq1).getSeqBytes(), sequenceList.get(seq2).getSeqBytes(), overlapLimit ); distanceMatrix[seq1][seq2] = dist; distanceMatrix[seq2][seq1] = dist; } catch (OverlapCheckFailedException ex) { // set the value to Double.NaN distanceMatrix[seq1][seq2] = Double.NaN; distanceMatrix[seq2][seq1] = Double.NaN; // add to the error set nonOverlappingSet.add(sequenceList.get(seq2).getSeqid()); } } if ( ! nonOverlappingSet.isEmpty() ) { errorMap.put(sequenceList.get(seq1).getSeqid(), nonOverlappingSet); } } if ( ! errorMap.isEmpty()) { throw new OverlapCheckFailedException(errorMap); } } protected MemoryResidentDistanceMatrix(List xSeqList, List ySeqList, DistanceModel distanceModel, int overlapLimit ) throws OverlapCheckFailedException { this.xSeqs = xSeqList; this.ySeqs = ySeqList; this.distanceModel = distanceModel; distanceMatrix = new double[xSeqList.size()][ySeqList.size()]; int x = 0; Map> errorMap = new HashMap>(); for(DistMatrixSeq xSeq : xSeqList) { int y = 0; Set nonOverlappingSet = new HashSet(); for (DistMatrixSeq ySeq : ySeqList) { try { distanceMatrix[x][y] = distanceModel.getDistance( xSeq.getSeqBytes(), ySeq.getSeqBytes(), overlapLimit ); } catch (OverlapCheckFailedException ex) { // set the value to Double.NaN distanceMatrix[x][y] = Double.NaN; // add to the error set nonOverlappingSet.add(ySeq.getSeqid()); } y++; } if ( ! nonOverlappingSet.isEmpty() ) { errorMap.put(xSeq.getSeqid(), nonOverlappingSet); } x++; } if ( ! errorMap.isEmpty()) { throw new OverlapCheckFailedException(errorMap); } } public List getXSeqs() { return xSeqs; } public List getYSeqs() { return ySeqs; } public double[][] getDistanceMatrix() { return distanceMatrix; } public double getDistance( int x, int y ) { return distanceMatrix[x][y]; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/OverlapCheckFailedException.java000066400000000000000000000011111246663120000327220ustar00rootroot00000000000000package edu.msu.cme.rdp.alignment.pairwise.rna; import java.util.Map; import java.util.Set; public class OverlapCheckFailedException extends Exception { private Map > errorMap; // key is xseqid, value is set of seq ids that does not have enough overlapping public OverlapCheckFailedException(String arg0) { super(arg0); // TODO Auto-generated constructor stub } public OverlapCheckFailedException(Map >arg0) { super(); this.errorMap = arg0; } public Map> getErrorMap() { return this.errorMap; } } AlignmentTools-1.2.0/src/edu/msu/cme/rdp/alignment/pairwise/rna/UncorrectedDistanceModel.java000066400000000000000000000012561246663120000323130ustar00rootroot00000000000000/* * Created on Sep 29, 2005 */ package edu.msu.cme.rdp.alignment.pairwise.rna; /** * @author farrisry */ public class UncorrectedDistanceModel extends DistanceModel { /* (non-Javadoc) * @see edu.msu.cme.rdp.pairwisedistance.DistanceModel#getDistance(edu.msu.cme.rdp.pairwisedistance.DivergenceMatrix) */ public double getDistance( byte[] seqX, byte[] seqY, int overlapLimit) throws OverlapCheckFailedException { DivergenceMatrix dm = new DivergenceMatrix( seqX, seqY, overlapLimit ); double distance = 1.0 - ( dm.getFrequency( dm.A ) + dm.getFrequency( dm.F ) + dm.getFrequency( dm.K ) + dm.getFrequency( dm.P )); return distance; } } AlignmentTools-1.2.0/test/000077500000000000000000000000001246663120000154305ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/000077500000000000000000000000001246663120000162055ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/msu/000077500000000000000000000000001246663120000170115ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/msu/cme/000077500000000000000000000000001246663120000175555ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/msu/cme/rdp/000077500000000000000000000000001246663120000203425ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/msu/cme/rdp/alignment/000077500000000000000000000000001246663120000223205ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/msu/cme/rdp/alignment/AlignmentMergerTest.java000066400000000000000000000147601246663120000271130ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.StringReader; import java.io.StringWriter; import edu.msu.cme.rdp.readseq.readers.Sequence; import edu.msu.cme.rdp.readseq.writers.FastaWriter; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import org.junit.Test; import static org.junit.Assert.*; /** * * @author fishjord */ public class AlignmentMergerTest { @Test public void testAlignmentMerger() throws IOException { Sequence[] seqs = new Sequence[]{ new Sequence("seq1", "", "AAAt--A--uatGcu"), new Sequence("seq2", "", "gtCAGg--cC--Cat"), new Sequence("seq3", "", "AUTg--G--taGcat"), new Sequence("seq4", "", "ttacAGTgt--T--tUt"), new Sequence("seq5", "", "GGAgt--G--tG")}; String[] expectedLines = { ">seq1", "....AAAt.--.A--tatGct.", ">seq2", "gt..CAGg.--cC--...Cat.", ">seq3", "....ATTg.--.G--ta.Gcat", ">seq4", "ttacAGTgt--.T--t..Tt..", ">seq5", "....GGAgt--.G--t..G...", ">#=GC_RF", "....xxx..xx.xxx...x..." }; List mergeFiles = new ArrayList(); for (Sequence seq : seqs) { File tmp = File.createTempFile("temp", "file"); tmp.deleteOnExit(); mergeFiles.add(tmp); FastaWriter out = new FastaWriter(tmp); out.writeSeq(seq); String refSeq = seq.getSeqString().replaceAll("[a-z]", ".").replaceAll("[A-Z\\-]", "x"); out.writeSeq("#=GC_RF", refSeq); out.close(); } File mergeOut = File.createTempFile("temp", "file"); mergeOut.deleteOnExit(); Map dropped = AlignmentMerger.mergeAlignment(mergeFiles, mergeOut, new HashSet()); if (!dropped.isEmpty()) { fail("Expected no dropped files, but some were: " + dropped); } BufferedReader reader = new BufferedReader(new FileReader(mergeOut)); String line; int lineno = 0; while ((line = reader.readLine()) != null) { assertEquals(expectedLines[lineno++], line.trim()); } reader.close(); } @Test public void oldAlignmentMergerTest() throws IOException { String stk = "# STOCKHOLM 1.0\n" + "#=GF AU Infernal 0.81\n" + "\n" + "DE02039D02 .-------------------.-AAA--gg...-----------------\n" + "DE02039F03 aGAACCACATGGTTTTGATAtCAAAGAttttaTCGCTTGAAGATGGACT\n" + "#=GC SS_cons .<<<<<____>>>>>>>>>>.,,,,<<.....>>,)))))))--)))))\n" + "#=GC RF .atccCgcAtGggataagga.GAAAGa.....tCGCTaaagGATGggCC\n" + "\n" + "DE02039D02 GGT\n" + "DE02039F03 CGC\n" + "#=GC SS_cons )))\n" + "#=GC RF cGC\n" + "//\n"; /* String stk2 = "# STOCKHOLM 1.0\n" + "#=GF AU Infernal 0.81\n" + "\n" + "DE02039H01 GUGUCGCAUGGCACUUAUGu.CAAAGAuuuaUCGCUGAAAGAUGGCCUCGC.\n" + "DE02039F02 -GG----------------aa------....--------------------g\n" + "#=GC SS_cons <<<<<____>>>>>>>>>>..,,,,<<....>>,)))))))--)))))))).\n" + "#=GC RF auccCgcAuGggauaagga..GAAAGa....uCGCUaaagGAUGggCCcGC.\n" + "//\n"; */ String fasta = ">DE02039H01\nGTGTCGCATGGCACTTATGt.CAAAGAtttaTCGCTGAAAGATGGCCTCGC.\n" + ">DE02039F02 \n-GG----------------aa------....--------------------g\n" + ">#=GC_SS_cons\n<<<<<____>>>>>>>>>>..,,,,<<....>>,)))))))--)))))))).\n" + ">#=GC_RF \nauccCgcAuGggauaagga..GAAAGa....uCGCUaaagGAUGggCCcGC.\n"; List mergeFiles = new ArrayList(); File tmpFile; BufferedWriter out; tmpFile = File.createTempFile("temp", "stk"); tmpFile.deleteOnExit(); mergeFiles.add(tmpFile); out = new BufferedWriter(new FileWriter(tmpFile)); out.write(stk); out.close(); tmpFile = File.createTempFile("temp", "fasta"); tmpFile.deleteOnExit(); mergeFiles.add(tmpFile); out = new BufferedWriter(new FileWriter(tmpFile)); out.write(fasta); out.close(); File mergeOut = File.createTempFile("temp", "merge"); mergeOut.deleteOnExit(); Map dropped = AlignmentMerger.mergeAlignment(mergeFiles, mergeOut, new HashSet()); if (!dropped.isEmpty()) { fail("Expected no dropped files, but some were: " + dropped); } String[] expectedLines = (">DE02039D02\n" + ".-------------------..-AAA--gg...-----------------GGT.\n" + ">DE02039F03\n" + "aGAACCACATGGTTTTGATAt.CAAAGAttttaTCGCTTGAAGATGGACTCGC.\n" + ">DE02039H01\n" + ".GTGTCGCATGGCACTTATGt.CAAAGAttta.TCGCTGAAAGATGGCCTCGC.\n" + ">DE02039F02\n" + ".-GG----------------aa------.....--------------------g\n" + ">#=GC_RF\n" + ".xxxxxxxxxxxxxxxxxxx..xxxxxx.....xxxxxxxxxxxxxxxxxxxx." ).split("\n"); BufferedReader reader = new BufferedReader(new FileReader(mergeOut)); String line; int lineno = 0; while ((line = reader.readLine()) != null) { assertEquals(expectedLines[lineno++], line.trim()); } reader.close(); } } AlignmentTools-1.2.0/test/edu/msu/cme/rdp/alignment/pairwise/000077500000000000000000000000001246663120000241435ustar00rootroot00000000000000AlignmentTools-1.2.0/test/edu/msu/cme/rdp/alignment/pairwise/PairwiseAlignerTest.java000066400000000000000000000104251246663120000307350ustar00rootroot00000000000000/* * Copyright (C) 2012 Jordan Fish * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package edu.msu.cme.rdp.alignment.pairwise; import edu.msu.cme.rdp.alignment.AlignmentMode; import java.io.IOException; import org.junit.Test; import static org.junit.Assert.*; /** * * @author wangqion */ public class PairwiseAlignerTest { /* public PairwiseAlignerTest() { }*/ /** * Test of reverse method, of class PairwiseAligner. */ @Test public void testReverse() { StringBuffer refSeq = new StringBuffer("CACGCAGGCG"); PairwiseAligner.reverse(refSeq); assertEquals(refSeq.toString(), "GCGGACGCAC"); } /** * Test of align method, of class PairwiseAligner. */ @Test public void testAlignProtSeq() { String refSeq = "TRLILNSKAQTTVMDLARERGTVEDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYTEDTDYVFYDVLGDVVCGGFAMPIRENKAKEIYIVT"; String querySeq = "ergedleledvlveghlgvrcaesggpepgvgcagrgvitainfleengayt"; ScoringMatrix scoringMatrix = ScoringMatrix.getDefaultProteinMatrix(); PairwiseAlignment result = PairwiseAligner.align(refSeq, querySeq, scoringMatrix, AlignmentMode.overlap_trim); assertEquals("ERGTVEDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYT", result.getAlignedSeqi()); assertEquals("ERG--EDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYT", result.getAlignedSeqj()); result = PairwiseAligner.align(refSeq, querySeq, scoringMatrix, AlignmentMode.glocal); assertEquals("TRLILNSKAQTTVMDLARERGTVEDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYTEDTDYVFYDVLGDVVCGGFAMPIRENKAKEIYIVT", result.getAlignedSeqi()); assertEquals("------------------ERG--EDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYT-----------------------------------", result.getAlignedSeqj()); result = PairwiseAligner.align(refSeq, querySeq, scoringMatrix, AlignmentMode.local); assertEquals("EDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYT", result.getAlignedSeqi()); assertEquals("EDLELEDVLVEGHLGVRCAESGGPEPGVGCAGRGVITAINFLEENGAYT", result.getAlignedSeqj()); result = PairwiseAligner.align(refSeq, querySeq, scoringMatrix, AlignmentMode.global); } @Test public void testAlignNuclSeq() throws IOException { ScoringMatrix scoringMatrix = ScoringMatrix.getDefaultNuclMatrix(); String refSeq = "TGTGCGGCGGCTTCGCCATGCCGATTTCGCGAAACAAGGCGCAGGAAAATCTACATCGTGATA"; String querySeq = "TGCGCCATGCCGATTCGCGAAAACAAGGCGCAGGAAATCTACATC"; PairwiseAlignment result = PairwiseAligner.align(refSeq, querySeq, scoringMatrix, AlignmentMode.glocal); assertEquals("TGTGCGGCGGCTTCGCCATGCCGATTTCGCG-AAACAAGGCGCAGGAAAATCTACATCGTGATA", result.getAlignedSeqi()); assertEquals("-----------TGCGCCATGCCGA-TTCGCGAAAACAAGGCGCAGG-AAATCTACATC------", result.getAlignedSeqj()); result = PairwiseAligner.align(refSeq, querySeq, scoringMatrix, AlignmentMode.overlap_trim); assertEquals("TTCGCCATGCCGATTTCGCG-AAACAAGGCGCAGGAAAATCTACATC", result.getAlignedSeqi()); assertEquals("TGCGCCATGCCGA-TTCGCGAAAACAAGGCGCAGG-AAATCTACATC", result.getAlignedSeqj()); // test global with simple scoring function scoringMatrix = new ScoringMatrix(ScoringMatrix.class.getResourceAsStream("/data/simple_scoringmatrix.txt"), -1, -1); String refSeq2 = "GTGGAACTTATGAAGTCAATGAAGCTAT"; String querySeq2 = "GTGGAACTTATGAAAGTCAAATGAAAGCTAT"; result = PairwiseAligner.align(refSeq2, querySeq2, scoringMatrix, AlignmentMode.global); assertEquals("GTGGAACTTATG-AAGTC-AATG-AAGCTAT", result.getAlignedSeqi()); assertEquals("GTGGAACTTATGAAAGTCAAATGAAAGCTAT", result.getAlignedSeqj()); } }