pax_global_header00006660000000000000000000000064142240470660014517gustar00rootroot0000000000000052 comment=1d08eeec1a24178de69488127faff09082dac0cd phyml-3.3.20220408/000077500000000000000000000000001422404706600134155ustar00rootroot00000000000000phyml-3.3.20220408/.gitignore000077500000000000000000000006141422404706600154110ustar00rootroot00000000000000# Object files *.o *.ko *.obj *.elf # Precompiled Headers *.gch *.pch # Libraries *.lib *.a *.la *.lo # Shared objects (inc. Windows DLLs) *.dll *.so *.so.* *.dylib # Executables *.exe *.out *.app *.i*86 *.x86_64 *.hex Makefile.in config.guess* config.sub* config.h.in aclocal.m4 compile configure depcomp install-sh missing autom4te.cache *~ doc/html doc/latex \#*# ltmain.sh m4/*.m4 *.origphyml-3.3.20220408/.travis.yml000066400000000000000000000011171422404706600155260ustar00rootroot00000000000000# sudo: required # cache: apt # language: c # os: # - linux # - osx # compiler: # - gcc # script: # # build and install software into $HOME/local # - ./autogen.sh # - ./configure # - make # - sudo make install # - ./configure --enable-phyrex # - make clean # - make # - ./configure --enable-phytime # - make clean # - make # # put the installed binary into the $PATH # - export PATH=$HOME/local/bin:$PATH # # install testiphy # # - cd # # - git clone https://gitlab.com/testiphy/testiphy.git # # run testiphy # # - cd testiphy # # - ./testiphy phymlphyml-3.3.20220408/COPYING000066400000000000000000001045151422404706600144560ustar00rootroot00000000000000 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. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . phyml-3.3.20220408/Makefile.am000077500000000000000000000001061422404706600154510ustar00rootroot00000000000000SUBDIRS = src EXTRA_DIST = doc bin examples DIST_SUBDIRS = $(SUBDIRS) phyml-3.3.20220408/README.md000066400000000000000000000053521422404706600147010ustar00rootroot00000000000000 [![Build Status](https://travis-ci.org/stephaneguindon/phyml.svg?branch=master)](https://travis-ci.org/stephaneguindon/phyml) [![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg?style=flat)](http://bioconda.github.io/recipes/phyml/README.html) ### Overview PhyML is a software package that uses modern statistical approaches to analyse alignments of nucleotide or amino acid sequences in a phylogenetic framework. The main tool in this package builds phylogenies under the maximum likelihood criterion. It implements a large number of substitution models coupled to efficient options to search the space of phylogenetic tree topologies. PhyTime is another tool in the PhyML package that focuses on divergence date estimation in a Bayesian setting. The main strengths of PhyTime lies in its ability to accommodate for uncertrainty in the placement of fossil calibration and the use of realistic models of rate variation along the tree. Finally, PhyREX fits the spatial-Lambda-Fleming-Viot model to geo-referenced genetic data. This model is similar to the structured coalescent but assumes that individuals are distributed along a spatial continuum rather than discrete demes. PhyREX can be used to estimate population densities and rates of dispersal. Its output can be processed by treeannotator (from the BEAST package) as well as SPREAD. ### Citations - New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0 S Guindon, JF Dufayard, V Lefort, M Anisimova, W Hordijk, O Gascuel *Systematic Biology* 59 (3), 307-321, 2010. - Accounting for calibration uncertainty: Bayesian molecular dating as a “doubly intractable” problem S Guindon *Systematic Biology* 67 (4), 651–661, 2018. - Demographic inference under the coalescent in a spatial continuum S Guindon, H Guo, D Welch *Theoretical Population Biology* 111, 43-50, 2016. ### Installation To install any program that is part of the PhyML package, type the following command: ```bash sh ./autogen.sh; ``` If you are using a Mac computer or running a Unix-like operating system, you will need to install the packages autoconf automake and pkg-config. On a Mac, the following command should set you up (provided Homebrew is installed on your Mac...): brew install pkg-config autoconf automake; Next, to install any program that is part of the PhyML package, type the following commands: ```bash ./configure --enable-XXXX; make; ``` where XXXX is phyml or phyrex or phytime. To compile a Windows executable, install MinGW and run: ```bash ./configure --enable-win --enable-XXXX; make; ``` To install the MPI version of PhyML, type the following commands: ```bash autoreconf -i; ./configure --enable-phyml-mpi; make; ``` phyml-3.3.20220408/autogen.sh000077500000000000000000000000521422404706600154130ustar00rootroot00000000000000#!/bin/sh autoreconf --force --install -v phyml-3.3.20220408/configure.ac000077500000000000000000000150001422404706600157020ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_INIT([PhyML],esyscmd([sh -c "echo "3.3." | tr -d '\n' ; echo "20220408" | tr -d '\n'"]),[guindon@lirmm.fr]) AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_SRCDIR([src/main.c],[doc/phyml-manual.tex]) AC_CONFIG_HEADERS([config.h]) AC_DEFINE([UNIX],[1],[Unix tag on]) AC_DEFINE([DEBUG],[1],[Debug tag on]) AC_CANONICAL_HOST AC_PROG_CC([gcc]) # Checks for libraries. AC_CHECK_LIB([m], [log]) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([float.h stdlib.h string.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T # Check for presence of LaTeX and pdfLaTeX AC_CHECK_PROGS([PDFLATEX], pdflatex, [/bin/false]) AC_CHECK_PROGS([LATEX], latex, [/bin/false]) if test "x$PDFLATEX" = x/bin/false || test "x$LATEX" = x/bin/false; then enable_docs=no AC_MSG_WARN([Documentation will not be built!]) fi AM_CONDITIONAL([HAVE_PDFLATEX], test -n "$PDFLATEX") # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_REALLOC AC_FUNC_SETVBUF_REVERSED AC_FUNC_VPRINTF AC_CHECK_FUNCS([floor pow rint sqrt strchr strstr]) dnl DEFAULT_VECTOR_FLAG= dnl DEFAULT_VECTOR_FLAG="-mavx -mfma" dnl DEFAULT_VECTOR_FLAG="-mavx2" dnl DEFAULT_VECTOR_FLAG=-msse4.2 DEFAULT_VECTOR_FLAG="-march=native" dnl DEFAULT_VECTOR_FLAG="-march=skylake -mprefer-vector-width=256" AC_ARG_ENABLE([native], [AS_HELP_STRING([--disable-native], [Remove AVX or SSE compilation options.])]) AS_IF([test "x$enable_native" = "xno"], [VECTOR_FLAG=], [VECTOR_FLAG="${DEFAULT_VECTOR_FLAG}"]) LDFLAGS="${ARGC_flag}" dnl Uncomment two rows below when compiling rwarp (need to have libtool installed) dnl LT_INIT dnl AC_PROG_LIBTOOL dnl DEFAULT_C_FLAG="-fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls -O2 -fno-omit-frame-pointer -g ${VECTOR_FLAG}" DEFAULT_C_FLAG="-std=c99 -O3 -fomit-frame-pointer -funroll-loops -Wall -Winline -finline ${VECTOR_FLAG}" dnl DEFAULT_C_FLAG="-O2 ${VECTOR_FLAG}" dnl DEFAULT_C_FLAG="${VECTOR_FLAG}" dnl DEFAULT_C_FLAG="-pthread -O3 -g -ffunction-sections -fdata-sections" AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [Remove optimization options and add debug informations.])]) AS_IF([test "x$enable_debug" = "xyes"], [CFLAGS="-ansi ${VECTOR_FLAG} -pedantic -Wall -std=c99 -O0 -g -Wuninitialized -Wunused -Wunreachable-code"], [CFLAGS="${DEFAULT_C_FLAG}"]) AC_ARG_ENABLE([safemode], AS_HELP_STRING([--enable-safemode],[Enable safe mode.])) AS_IF([test "x$enable_safemode" = "xyes"], [CFLAGS="-Wall -DSAFEMODE -O3 ${VECTOR_FLAG}"], [AS_IF([test "x$enable_debug" = "xno"],[CFLAGS="${DEFAULT_C_FLAG}"])]) AC_ARG_ENABLE([gprof], [AS_HELP_STRING([--enable-gprof], [Remove optimization options and add profiling informations.])]) AS_IF([test "x$enable_gprof" = "xyes"], [CFLAGS="-g -pg -fno-inline -fprofile-arcs -ftest-coverage ${VECTOR_FLAG}"], [AS_IF([test "x$enable_debug" = "xno"],[CFLAGS="${DEFAULT_C_FLAG}"])]) AC_ARG_ENABLE([phyml-mpi], [AS_HELP_STRING([--enable-phyml-mpi], [Compile with mpicc instead of gcc.])]) AS_IF([test "x$enable_phyml_mpi" = "xyes"],[CC="mpicc"]) AS_IF([test "x$enable_phyml_mpi" = "xyes"],AC_DEFINE([MPI],[1],[MPI tag on])) AM_CONDITIONAL([WANT_MPI], [test "$enable_phyml_mpi" = yes]) AC_ARG_ENABLE([win], [AS_HELP_STRING([--enable-win], [Compile with mingw instead of gcc.])]) AS_IF([test "x$enable_win" = "xyes"],[CC="i686-w64-mingw32-gcc"]) AS_IF([test "x$enable_win" = "xyes"],AC_DEFINE([WIN32],[1],[WIN32 tag on])) AM_CONDITIONAL([WANT_WIN], [test "$enable_win" = yes]) AC_ARG_ENABLE([phytime],[AS_HELP_STRING([--enable-phytime],[Compile PhyTime])],[phytime=yes],[phytime=no]) AM_CONDITIONAL([WANT_PHYTIME], [test "$phytime" = yes]) if test "$phytime" = yes; then AC_DEFINE([PHYTIME],[1],[PHYTIME tag on]) fi AC_ARG_ENABLE([phyml],[AS_HELP_STRING([--enable-phyml],[Compile PhyML])],[phyml=yes],[phyml=no]) AM_CONDITIONAL([WANT_PHYML], [test "$phyml" = yes]) if test "$phyml" = yes; then AC_DEFINE([PHYML],[1],[PHYML tag on]) fi AC_ARG_ENABLE([rwrap],[AS_HELP_STRING([--enable-rwrap],[Compile Rwrap])],[rwrap=yes],[rwrap=no]) AM_CONDITIONAL([WANT_RWRAP], [test "$rwrap" = yes]) if test "$rwrap" = yes; then AC_DEFINE([RWRAP],[1],[RWRAP tag on]) fi AC_ARG_ENABLE([rf],[AS_HELP_STRING([--enable-rf],[Compile RF])],[rf=yes],[rf=no]) AM_CONDITIONAL([WANT_RF], [test "$rf" = yes]) if test "$rf" = yes; then AC_DEFINE([RF],[1],[RF tag on]) fi AC_ARG_ENABLE([test],[AS_HELP_STRING([--enable-test],[Compile test])],[test=yes],[test=no]) AM_CONDITIONAL([WANT_TEST], [test "$test" = yes]) if test "$test" = yes; then AC_DEFINE([TEST],[1],[TEST tag on]) fi AC_ARG_ENABLE([evolve],[AS_HELP_STRING([--enable-evolve],[Compile evolve])],[evolve=yes],[evolve=no]) AM_CONDITIONAL([WANT_EVOLVE], [test "$evolve" = yes]) if test "$evolve" = yes; then AC_DEFINE([EVOLVE],[1],[EVOLVE tag on]) fi AC_ARG_ENABLE([phyrex],[AS_HELP_STRING([--enable-phyrex],[Compile phyrex])],[phyrex=yes],[phyrex=no]) AM_CONDITIONAL([WANT_PHYREX], [test "$phyrex" = yes]) if test "$phyrex" = yes; then AC_DEFINE([PHYREX],[1],[PHYREX tag on]) fi AC_ARG_ENABLE([phyrexsim],[AS_HELP_STRING([--enable-phyrexsim],[Compile phyrexsim])],[phyrexsim=yes],[phyrexsim=no]) AM_CONDITIONAL([WANT_PHYREXSIM], [test "$phyrexsim" = yes]) if test "$phyrexsim" = yes; then AC_DEFINE([PHYREXSIM],[1],[PHYREXSIM tag on]) fi dnl AS_IF([test "x$enable_phyrex" = "xyes"],[PKG_CHECK_MODULES([GTK], [gtk+-3.0])]) dnl AS_IF([test "x$enable_phyrex" = "xyes"],[PKG_CHECK_MODULES([CAIRO], [cairo])]) dnl AS_IF([test "x$enable_phyrex" = "xyes"],[CFLAGS="${CFLAGS} `pkg-config --cflags --libs gtk+-3.0`"]) dnl AM_PATH_GTK_3_0(,,AC_MSG_ERROR(windoe-default needs GTK+-3)) AC_ARG_ENABLE([date],[AS_HELP_STRING([--enable-date],[Compile date])],[date=yes],[date=no]) AM_CONDITIONAL([WANT_DATE], [test "$date" = yes]) if test "$date" = yes; then AC_DEFINE([DATE],[1],[DATE tag on]) fi if test "$phytime" = no; then if test "$rwrap" = no; then if test "$test" = no; then if test "$rf" = no; then if test "$evolve" = no; then if test "$phyrex" = no; then if test "$phyrexsim" = no; then if test "$date" = no; then AC_DEFINE([PHYML],[1],[PHYML tag on]) fi fi fi fi fi fi fi fi AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile]) AC_OUTPUT phyml-3.3.20220408/doc/000077500000000000000000000000001422404706600141625ustar00rootroot00000000000000phyml-3.3.20220408/doc/Makefile.am000077500000000000000000000013041422404706600162170ustar00rootroot00000000000000docdir = $(datadir)/doc docfiles = phyml-manual.tex ./fig/phyrexlog.pdf ./fig/phytimetrace.pdf if HAVE_PDFLATEX docfiles += phyml-manual.pdf endif MANNAME = phyml-manual MANTEXSRC = $(MANNAME).tex MANIDX = $(MANNAME).idx CLEANFILES = $(MANNAME).pdf $(MANNAME).log $(MANNAME).idx $(MANNAME).out \ $(MANNAME).toc $(MANNAME).aux $(MANNAME).ilg $(MANNAME).ind $(MANNAME).dvi latex: $(MANTEXSRC) latex $< pdflatex: $(MANTEXSRC) pdflatex $< makeindex: $(MANTEXSRC) makeindex $< phyml-manual.pdf: intro pdflatex makeindex # phyml-manual.pdf: intro pdflatex @echo "" @echo "Done." intro: @echo "" @echo "" @echo ".: Building documentation :." @echo "" @echo "" dist_doc_DATA = $(docfiles) phyml-3.3.20220408/doc/fig/000077500000000000000000000000001422404706600147275ustar00rootroot00000000000000phyml-3.3.20220408/doc/fig/phyrexlog.pdf000077500000000000000000016114261422404706600174610ustar00rootroot00000000000000%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x+ T(2P0034R016WR  DYX($r'(+W*s! endstream endobj 4 0 obj 71 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /x5 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 437.52 183.12 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 5 0 obj << /Length 8 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 438 184 ] /Resources 7 0 R >> stream x+ T(2P00Q01635R50342T(JUW*J(ԁ@L= \.Db K|@ Цy endstream endobj 8 0 obj 78 endobj 7 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /x9 9 0 R >> >> endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 1823 /Height 763 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 >> stream xtY[S0 ֛5ޝ{N4eWWW]2 eAId˶,S`1SvV:3"22Rʪ[;d,+)%%%HRPX/#^(I(U(a(mJ!J'#PMȈ |ATDt &670&.1^(I(U**+ )y((((`JiiiQ$1%7 8 8\R\&@B CiC*)) Ԣ &%%%EEX痾EvD)'R+,"ҌM80stEDe4` H_(AU][KiFF)`/, FJ",19xߑHC£"X'YmllNL ,dI$y9e)bIQUa:AiA@wJJJrss;UTTZa^1nZqh+/]{<mOѻ"HAaofv.f/SKkj$H$8??"/?$;'Xc 64jcxOqSv;KC iaPZZ޵s {Ӱ$x۴4Rib=<yyTsuB|le222ģ$o .8$F@#Q1q> E숍mfO_59{eŸDŽYDgdE bB&+ 0ٿl$^[o[ 6WY%U`0u޻~uꋂ^rObYb F.\8wܴٳgUģ$^}B>8|?|ǍXf2f +**xWII'L޼ʵ/:=emu9yo\k4n~,U(٤gL?UnMLhTuaK3\0q#~e0RLMSMLg#sΕr/N;6Zts,TεfE ;jcɪonxpɩ;&񍍍<q[ņ\Oܸtݵضm4gxTZm`0{={ ?w;Jk5ߔn~ bjZ-%Ay I> y~e_a>'OT̳%%a!ﴫ eU3=`=RZZ]A첝)[DGg :ncЮyWڳыg '$fMjm=KN2 >[p1yq>ڶ"NiwY$U];{!= 9~OX]~|3_HIH3[pgޞG 0'&[5\ #;mS/33Sߣ(英7Wn3zznxoliVcVwH~ƛZ\\ YwvvW+++)nV|Ʉ zc[7䌆31ʼntЩѧ5vΝ[]Q!t`T}V.N^_@>}㡭W]}( &\)))/^7orϟOQnhh( 5mjewޑKvN9u|\f[{8׮]\3uwwgddRXX@tƛZVVm-hufjPBpWTh[ɡѽ8… |dPsΉކ`˴9[:u^NӘAxep;7RD2~ر M-*m'4~`}\`󼙅((.3g7Wɹr 'NԈTOXXC'N̪ 9딦פ7jj'մQ:*;!β8gްaÚ5k ˫\3ĬJ*ڑkX*&]~~~n-[R[[ԻWLLLNN΄i0e;ȫbm̸T#psˡ/uϞ=c_Zݕ1nW?IְLzZ1cɓ͛7oӦMʡZb#樆sR{@ŨwpG2Ӫ+C/..^f Օ֮]KG/ՏN7nCLΪ~UzϧS^p!E`wfh6GT'\s:v|Eٳ3g@رc֬Y_ʡZKӦMr|hX؉sFF2GښoŵuTVT$վHIo`nWPJ`Buѫ6\533[bj,_ 󠠠4uU"66Feh|L윓10M{/垍CVJ:p5-S/(BGG=PG ܑA,p4Cm?}.@m+ sMY3 whz{{)o{j<0q#SU_6rhD dkܑ\믿e˖\rq~ժUK.]hŋ\g=gM6m۶Mi#}k.BE7!+FRhUP333ˉ&-ѨTyttܹs̙͛7ϛ7O# qVU+kRoCdA lTl$GYԩIY-5ò+|x;7\飆+UQ3ׯ_'''ocǎ]z5))RZUcccJ`O? U栆Rëw{|E!Zt3/r0j j0r0?/gkH2j{{{www֡1*۷nݺw^"|WWWS& mtg٫W#%%LJUa0f檶O)*..NI, 2Wp{A_w;ο*ɰ'~7qp_2k%uR,Z~ժU⚫7of;q-3ז-[;F_|IG\KUqgfGDD̘1bo߾oBBBm>}: hɧM6o<֭[o߾pB8Δ_}ELnvvVܾX%XEqܹ۶m۹sӍCڵkw]vQ*F!'\䱧qǞﰣ>(<0VڽduܡH EUQܳ!.]Zl"Ckmm3{lZmkkcrhd/czNgee 4W[;jkj2d@|Y7(7;wQ4lmm[ZZׯϙ3qV8{˗W}_|'Wf5WT˫r*B VUHF}[+mYѣ4X(~0駟R,$ѽ{7fULˊ *@WE_L2Xf_˗/Ϝ9iryexءL;O%\gĔa}֬YY_U`,?~MicTM?c<67U'qps7;x Mo׆T&Z0ꦍΨZgZpuʙ={6C==ĉb1=eӖs1>}״144 P1q@IT!Z&iG\vUgh#zFb N<9}o⌌({GlżJZ\\#_oWgd]uZ<\(5T2.SN20x*f||<}ZUUE VQwf^z*QYYIz \Z.//W``@Y]VVVZZJ^\CqfJPU*2T3\DDjmsNf52!V=-PKu`ap_U1UEL*ý %EeU/,5}_PVYQ*F=31yⓘ_VQ.˫bw).+dٛQeWD7W_hύ:~~c7~SaGF>>+7lذa]h˺u먘(ŋKO-b^lmmt҅ 5::>b^¢MB*nǏׯ_wuu]lA{zUBJ:GYqŊzc/J*H쯾+Q75߿歹glk6:͛7o߾NNҥKwA,Yi&`f92˶(Rl,.(l'YCRik7[PUQ#6+iӦ==Ϟ=}Z'O~.Ν;t|,XY[8wlUӣ/xyy o܈}ٗ_7LʫέΪ*Wec$\I_~U(9B5W[so,X@J[T׬転/-0nB|fff*}e<ɆI&yzzJg}F7XzhX166r\IXڮ2çrB 9i5󛫊4}y=Z&OliiS%aeWb^ViaaTemmMaww^T! e SUBB*eWs4CQ^ݥKIէP)I}GbLÞeyB'0>-0(sCt^xAeʮ8i˔_jqq1Gl- Fs3k5A*OOD>}>ٳg8sN=ҁPKUr:铖(O;Gf&=01y FՁ0˷w[l+Խ]?hEڳ_](՝_ݓo/8Ex*=Dӷ}z&.iV^-z%z={_~ƌ/_d=sLz¢y9`}Dv?K,0s 0r(K"xɡ׬YüKǏf6EBtsIs6VV?̋=U>fVVV߿$ [ۘ4۶mێ;h9tC5>|>>>T$͘iNwIy筢"R GȦ=h*,-$}Q%M5Ř@X)P>}zMŋcǎ1i&fZa3%^| {ksb{sk82sfyy5b0| |g`ƅ:G}A+͛tvn}BGӇ|)_fNV$iO>8q>522򙙙41'‚DaErUbQ1&W\Kȱ4H\p]ڊiի7W[ZZUUlթD"utt$%%9::Rt5U*Tv5I3Xt4WWd Fs5 yoh1ଲچڂ`knsUVs; *hk6VS~}}L~/\]d =~-gѢE}߅lذܚF&&&^z߾}8wލ7Ξ=޽{@b$Cx&|owp׷\N`j/-^Z:M$f33={>sr_TTD1d^<;pGl{|ASFF*5WSs5==Lgm۶JFW\jzzUX@mmm.\P1*<zY+s+jB 1I wx%YӠ4T_TC2NVJƭ[VXҲ, 'm?qĬYX6my&E9^|Yk:tǬK1um9ղ$eT V &W & ėM=;R JKKc5W*;>Le˖*ǫ m3NNNmJS绺2檗?M{̙3MLL lheeE24ҹӧM\rȑ#_+Hʹ,M5BE7+窙TS̛7PG> PgwBZXX=>S풚JAsH#{|Tܫjf(2WʗV*6j{G筇Ϯܳroٛ5uΞfeBU:mU雺 w溘Wk\hJ5{{{p&y={N|W^c /2R٪ݧN=O$rny}4B5XzFG2SD<8d%V 3fxڵzeguͷnbɓ'gdd;s=fo5v9.:{؉өB4BtMkr>=|{.]CZճHu!Zg*t__uwwTdoo R_{xx:,~論`ڴi!!!rCCCǎ4ic1?Q W_ut#//V)n}gOѓ'O㝝+r.K~3g444r,*r<-1wMi33z)7^xA{1?hżʸaaaQ ###~Ġ4P<P=5X)/IQK-,,(1b]]]EJ %%%*mHh%U?|BY7<-rRMj]\IiYYq^Jczt"36(;5K<:X64( *sd54\~:w;Pÿ{ -4,LMSFn\vW' `ڙ=#lO򤖹y҇9RlЁΞO fݝ٤}_}{w y_뷦޾cUeD̖-[ajee%լ\QQsnn.sONN`cXZ`ʔ)/^_xN׬YC2T2ǥUūHȡf>rɓi;vڒʹ,My3f0~c>zF/_1-df_ƨT;00ѣ/vY| ޤ/޸UHdccC(t0;::,,,\]] S^^N #z)EiSQQF7'OGnnn9NER ...JrFF@sUm BU?,SGc>a1Im1rsU*)$g.3>3çNɕ]o zۚ>15 kQooap{bmusU8cy6mC0WjUM_~wzZۯO[hd}}>>~˖-+,,;zBU**tw޿]V\`r.\H|f~!h1tCLtY7:S`^=plmm_xQ__o>U;;iӦ*rаcg /0ac᥍]†v n:H25d`s&Zm<檶7W>|H] <3@rr2k ut~1tV322),*S} {2DePx,/?BwɩJqҌTD/"*HOOF0!\Jxo.rL+m,nO&k|"NYcC Ѫ(n 6N9eMq鶶Q:.U*QVVaÆ[n2y%V.ۏ^v֫UsB=s͛7;88P|'y}q t7 ]2 Wc]/&\e`~~~/+W|&MڷoO x,Qhll477ࠓEr=pdd$w^'жLl`/t0W?Pxdh郍cO<(z7n2""JL|JJJ֦xzz:99C ^^^aaan#Byyn h5c$MU $*_U'@BBAAAA\:YeM)UխmCC$[*ZRZ{JlfYM#    ]x72o}mJ@;J6u݈&[)ͺ&)Yy] .<AAAAA 9ϲȻQ.Ί*l,o׻MxU$5k4W)!'TRxU    jw,<vSReOޝ7hugWzFsrɋ'C     H/Z甿1_ePw >p1RJ 9qޱ _AAAAAV_|m΂ (ل_=AAAA}u"`"v{I{q 0cw4O"B:huޤEovOGx%:?չ ,)V<:q1ȴqNz^8p,#ʈgQZc :XAEȸj/Z֦F/b]_Hz,UDR\wȕz~Ls//W^t򀥱NpW!Uhk`CwOQ](j(GB/!ժ:0s1{YON='u^:%^ǿ/׹ ƪthr,!>f1<%uϽKcW5)Z BLH!箱sK)^.f>UoO,db΄7#t(FX#X/Me4*քQFcܟf7X%,)&,2OiF\Q=fq\+R.:#nt5W7jˈ ֪U \HR7W!   K:fqd&6\`7Df!:s   0W']Ll(:#nGe ̇;{%7C[T[P,~QE*r.&Mx*%D:呴YAV$\Tҕ'tGS^t#FziXaѭƋU7Z {\m{D{C8±qx?UkMC91y`A5 \ s\UM   Xz6WM 6L(sU:;2e)wy`BAAA~sU?su-/mY؟Ƭolt,}2W3zkn`-RUs2x"o*p_L`עS\ҿ)Ŀ!MFڬj.i\aVQ*?i~eX*Ղsmc|RBsjuG:Gc3J箱^Q?Q VIFڎ:3y-$8-ky+J jSWqTn}B$ꋄ^r4.JZ_㕮msU:HjջC!Fi|*gj|x\!;@YYٷO/bYLCN m-XM??Ͷt:FM0sUiqidܶzY,jED\0z sJztu0 Eo꟞P󧩽PGSTڜdg~T8ԴP%UB-$PBha*W5^) xeLV9lQ.sx"/{VHz&O$yNzC[_Hnɕ:7F۪:WilV{ScGL zj<_<_&BN5|Ot m5J:'j n J3pkU:gbQ2W^ DnMF{m%< ã M% E[E$/6YNm)7mn*ș oW J]w mn/n{r\"?̢7ŷuvVo|BۍrBb0a|_hĦjTRҚ67EE4Wocf~U_'JX@0Wj$*AAAA#(?<)HgT7FRiߛͬVVP?^gs?oӋK;N\&>=C3/j?6D?ehóAR<2a|_UŘU^|0^UU7W)4fV*P0W!bIiOJh )A8-F 14A5J=Lfsjh8'7"e[zkg)kIx mnjy55?'yҞ7lA1؛ȵxIq\nÌ>ey^9Mc zhi:t_ڝB}=EE6n[yK0ub߭O\O#bsN<9R6ze)4fǮuRimJ_Y].pgWwvYoI>ﱲ;CQɭʫjEQa++cJkk~w7V)V%%}nkS&+yYaka{kyu=?+UfyYՏ޴Ms_wtR43qUŅAx(<-+?雳Gmޤ4k^fU?6mn5ׇJ7^fYd=m UkIn=C!slu[`1؛q፹;1F(y.3WzkB{^xFt1..Jf}k0rOmܦlέOZvJ񨮑35'2SVGw_$/E>XUV^QZO].#NJʷP;('s5쫀FZwFUeVuwjsaS v KMuS*%ۭd՚Şb0[!i1+KWCYm%L--i[>-,xwv${ՇTvRHGvuTZ$lunO{GV=cJsfGS: A´?WrSMf/N\2GҗhSV]Zڄ+rtwzWO*U^?_ \1;|s1=UC7.CGq31 R{j[*.c7 1̷~{j[*[2goï2|Fs dYa`{㏌c"ѿ: {Ҏ&T\ os. ViNś-6U5z޲ܩ^χ!O~lZE0ikQT.e-jhS\1WҞfJƩm®V7n#i_ʖL wkܙfo6&/OxS'Ʋ o+7ܖ/93[˭Snygfo!6)ts'jr4 ygߡNI(ͩ1nD1ŮD"KEfo?e b^ze{ꓽуƺ#Bk<2V˼M}㜶9UY ħ4)_7vhh#{gv1{npdr-s.-WKOӛo\C A:Đ6xfSbdoT1K\T #`0b(ÕQ[쒦heU6{Q2W|G X{$]/b(/J^8pvdciWOamKBiQL[_K_.IÊ%ghYڬ nj_k /sBq-zo2ӝ>?z~('E 㘆H:ncW{驪{L hw?7/ E>1i3;[> bӳ4Y䥬~t(/T1ՑLG@yE՛VB:zDޯpOWhk=6>r=̄ƭ-\'h Wձ%M Z2CqqmPzj¼v34[}je/twC:U d[:,rQbFvoS7b2_͛Up!DW Z.K ?xO˯&D7W~F6D9)\3\p-hѵou=!Kn,UCW*N誻?{66`e^օ kv)M酲)RVZ tѽ+jVw;I8#Ӊx$d'8g>އ't?I[(;Fz:-R1Wy wŶM4ތ)U"]~ȳ u )w b'_6>rkOc=B4w䪐ֳ;V1Uӈ;C10M̟t&i,*WﲬsyFEٛ}eGUj- ~(W6lwZѵwf.efM5/U6ķ ijq,r̂qL'd猴%E ĸ@7Iw4ep5`՜L$Րoj"~Ұm0> vĢ }Og9?X`E2wݱaۺy);6,o؃xlrvͻą5)8miZB!Zuh+AW&?Lcy1 E/e8XQS ?<B-e,33 V29 ,/dBq?\\&̛p\_D&KF>S‡d FG|:P5F|J93^,-9F6D})뽹qFp_/7XU_=os&n%WUj.=j‚Jbu$W+\#p``[ܱ^j=Fh1CFw-bIlj[5ypް[s>'jJ]uNh4my/" &Z(>PbH[&\=brϑ R.W3`5քKQ旗Ze┤\=j1rxִLzrkdD@fۿ>Fp2=lzB֘V>$-"iחgN_1c3=?8Yc-&KlL'-7 tL&L,1]ZnO2/Z{>6x'g 7{ȑ-N1-N1lbuxKN1i[p^g;htsbLo,ڦ-6}6ê{t<h)w)AE2` l{.d~q!7S ^x/d:bÅh N1&.Wר6ruؙL%#W}V jb}zYRZ g*bj*$~Rh!jFYt4៬s5dhm5vSM+9f}ܹ0Ͷ6hYŠ.劍']Jujj=FE-reֳ?a=,4,[~issUtT !s$Wad㝫W"bV2ERΒn&z(4ޣFA.[\m+\}B[eCѰږEM"k۷L'3mGmjDY%_8D1yǂƵ0!aӿ0%W[-f3\mOlmrvMn|㍟g϶=x>v v~{S\jOKRнzmasM7SljNo\͕r;[wC,ISLeR62hm\orp#;e:g2O1?^5]cZb8|svC^ZbZ-dܑȍ{Sxe˕veŻ[5t†ZohnL9K[n|5|-.m]*gjHd1Q\MNߖ4M@CZF}행BW*_+ĢlhhԫQP+cԒ6eH##a)}9쨝s&5;uUs%~救?-ONlEq+{}VD:kG%M%lGvgCgW[z )W)?>|]ؗ!e#vm^~M_8F|߿!oea\#K-eb_H-\5tBFS-)]c;q,Tᓕ򤄾9oH PT2icŋH>_O"ꅓm1*n򛬲c{|    xBQq8ejčrǽMd\z&D`aFzn_xĵruuGӑԈJ%e 3z\=ѺXWkɻW%UT|*b +(E 97 uϖG. Gh6Ȥi Y ;^-(i27P\ue݇qD@-)WY?>~ԤG3#F5UVxBfӦz'"o@mW֜ϭ.=NN_;XGΐfOJt-5㤩e Ie֎=q<´IAKN|]C%8ܦr(xo l;ɤ\x:usrǭƏ7]eg:ܚ   t3V|ύrǽMd\t _/J1fLD,Ӱmrոرy tјs?gϩL9jjH̛3crc_z G7ABYh.s8r=pgV_GJissEZʓ ^)nkL( O뷱XUJSHjh)똊4&傊jO֖"da}ElUf~JVk1v\\uQp7iIم_H?hnV?ySHz% ʢkHvG;Vٹ-&    ݌'BLQY,Yr՛M\0a"vbfrmln1 AAAA\%X&Œ}Z$PNf/հUF5&_~t:D`e"vB4>2U1{ž`147йbYnMAAAAUI?l+Ht=>j"ꇧ2L\uT؎c &>6R"{|ؗss7ܚ   t7Ne0;!t*nfo˭    H7rQ/W?n媣rtja{!6DAAAA('M\>b'\mm:l5཈Ӑrbk"   ͠\Ez!'Mr5}N27\r((ؚ   t3(Wr&rub'Ds=\pBQg5AAAfP"= t%# A섔MG0pBQHj5AAAfPvc3lwCtFrG;M{en:|[AAAAnCr t,|UΫwCks-C94(W#@Jig5AAAff: IhbN?<(8:5C SdrqJ4|[AAAAn#'%^&W\'*䒨R{e vBգioM%rҐrո5մe-t\]T+4M2'1wVfne:"m&xv鶳Ֆog4:b+uA{v te;疖"wh3g{MP7so87!= ١5o8cy)|: л[s\b3@{*3;"ʪ*4|PT\h3qInXى$L=,% < ^, |+"%%%A }Ex Dr$u$R)΋^c``X'$w 媷r LP\=,(W@ U(PE U ذ\$\\VPB H8v{XPBrP\ras?\ݕ}# IAPZr< -T䆂gaA U@PBr.U8Pb`RL\TEjywv|gBugaNŽc$Goj{A  ՒC98v{XPBrP\rOU>^lmR_^5t"vESY&F|zBh0-(e3ϾibEծT܏jSC]1~{ɚu=O:q?qtĽjdЮp5r[A Z&((/W~+F8U(Pr pQ)ڤg:nSv:WWz/~:ࠀ3=KqI1r.27N}A G/\xh-k̕ \fg+Sחq$+j4I#'$P /je3!IrP547ҳqe=JJ9Wj ɢ o@0]2W7Ԑʥ[.<4)e#㝾ow+qV y\*x>Z&(.WƉYW3q\* (W@ *ʴk\b,a(Iͪؿ(y9/;~yt㪆=?^1q(c},Us10<6"W_ڝ0.Vڬr1R}1//J_;p~;bJ5SF/c}8@0o6ZLH|Ձxzٖxb5Iw>uNbݓW 2>w'֠PTl_ľ#Y?w~؄3E:%U@  JU1ZY3q\* (W@ *Mq/Ӌ6jsu\t)3ٲMҸY)L:KȟuqvQt: q  ۣeGª/*dp\ؤtiqGļ3y1w4'7}žtjߩBl:*[ؙrֈ {z`c)_\)&mWnpWxӟl,X*',yi[9&IWKΐ̶{\[_J\kPH(\a;lGnWeQFzww**kdksnvj șFz1Xnj[SmsWqA2yõ5l 3Ua]\A|6ݲ.W7Jgn{k2FVܷ2tԙ\QD+}Wyz\5HӖ ,vrUɘڝCO MwꫯDU kjkRPX TUU|4|Z]PP 3qԀMCjRπgDY8EEEx>< ߄HCP]SSでݾ< DTWWRZ -Z~𲱯Jy!П#o_XW$ч^9%5 Ru[]ԅ ƣ˒R2CRMZϪL3촎]ɨz˒ {Y1(W0uE zn1wrhkQ{EQFfjM:)Wߵ=k@onReeۙrަXX.2^W8bunwը6iRH]g)95 f֗\Z2-5^fgK[jq^#W K_1'J5jN{*Зv7)SY}%u:)**RTi "QEEx ^q`;38GMmmEe%x> ˕i o @oR 4|Q]@(O7nX")Xնr~|>xCi9U >@rwydIjd n|=P}坖k U-~ya܃$tToڣSeUt1WApI(>jE3qPPpqU8z֘P2U:,j$z@i7$VðjޡS_ C\2pU hwg*Gy>RW r.'FBkt[zᙏ3rL ^"G+*X@brs(W@(W@ U@PBr.U8<"Wy'?OsApVn.Tb˹⤽[ 8oQtOӯbtn[5I*A/|k/?Ŭ+sG7k:|/+as?r\&Grs|`|J^W)ŝk WU-wfI З1 "Wr< -~8?v{PPBrP\rUeL?zTE=]5T_erҳ>nZ} FqT?)fa0ϑ7jz\P܏.WY}8-W3VHڨd%ŷō3?Io}X|J~Ѡ-2 DN{z1V(WA2AAiZt4o3q\* (W@ *as?K65|͑^S[on #-3c6*3g?I=Po<^Cɬ \OA5A [#8 v{XPBrP\ras?r\|qW3ۢL3C\OvD;*)W5%޿{Я>en.r< -Ԓ:\V.RՕwnfk zܜ=,(W@ U(PE U ذWNoG716<'xPq8eRrШM2Gnh=8`ܺj]ǂ(WA2AA-iZzGe5'oY?^4R먑aA U@PBr.U8Pb`Ƚr5P4){XYXԊ'/q.W/C9()!W*x>Z&((&W6ju^Kɋ&\* (W@ *(W10`~^J.M0)2轣Q!Ҿ +հUY%hT_gx(e(W͠\OA7J\* (W@ *(W10`~d\mr0%VS̆IJo҅XC?<ց_࣓Kgf5gU9\(WPezr5bKLr̟KتS5aA U@PBr.U8Pb`r2Kœ)gar0)r[A Z&('W7-}Ϲ ߬URP\*(W\*l܏Pb@ꭠ\-ԕ9(=2*4(W@ U(PE x#-sRg dM˫&|8ND!.Phbq]ɞt8Kei {ԧ~.\9r[A Z&(+W[jEj<7'n U(Pr pQrYWz/~:ࠀ3=KqI^癚GKŹz9S;498rѭG_=LbU(WPerUʞx\ ^i Âr \* \p]1 ȡY&z80Cyp(k}_J?ݰ@RPT6f$~K~rUo*h\ 6TV^VaA U@PBr.U8<7jc,\e 1M럟9y`LaIժȯ >Κz^q/5fKiЗ~%{;IzގXg͠. 8>N$)vu\tԕ)3U+ji/ 6#='Pz+(W@[>«KbJ\* (W@ *`r[rΎ# 0I%e~an^p~SAeLzޒG/Vj[Ur <)"y`߆K;&:!BRi ݊ۨS6p^!`􌰹\9r[A Z&((-WK.@]O-v{XPBrP\r@\4p*˔M}a\\bӾhP77+4z<%KQ+ê7fk?%9agf 6CWz3:ϖ_"~~BO'ml}' }?vU[Su귌8gy܏Pb@ꭠ\-TU!krx؜$j<7'n U(Pr pQ7,ҚZFJ[tO6;dSߗ9?0M>p!ml"b#{?' b4ec_1җ 1Nod_={)$*.1FM>n>J>+%zaч, 0l媧L~Llnr>[80 'vPz)(W@ZR!`;RRrv Ϟ?pJT`*(WA U@(W)rP^mO{9M#V`&r.0:Iy^VfVP -ZJ*Ό}l͹C#O6~rգ07%}ꁤbܙL G 媷r LPPN ./_?Yi)W˞LeM1xnNP\*(W\ƢL 3T)f;W 5V։ _J^oj sӳ~|>xCio eꬁӒmh˘6+L~,#iγy$c&S,lpPz)(W@U@Ârvr`*:UO@ U@(W!rՐA;B*4emrY~;qr>)ug) oRf0+OojnT/U~Yg&cZ/i}UQ(i-ߨhLnm:} @Z6Q5c//T6#q#='cC9b(WPer$jתu^-\RuK(J/r pQCjS펂-g~(~\mif6l[LJp||?[[I{;pbߺ~?.m@_~`8Q ĩۢ-N:fʰw'In#~]H=yxҟ%ʾ*C°6#9J?xp SfHj1 U((g*UAByYHpPXUJV~zJE*MC xbU(PE G>e̿\~+%!5-*h7o쩦[X:LbSÂsf֢g[%3 қUC_&_e젏[x4䪡Gd)ؤ* 2oهUN~rs1737WP\VPBA95PO^ZY ;[>Ȟ(n6†xLU(Pr pQ9aO܏Pz.|\-P\VPBA95PS>cf~jQxXpq~'<r \* \p\ o3ohOJRt緢\Ej U4|Y&rzs?Qv(WrP\ras?\mv~؛ZopB*UxPP2y n+3\X鴵 P"rP\ras?\;bΚuD]F5y)7wARu(WQZr< Bˠ\;{r@ezi~Tu?UuPr pQvOYyL.O!=_ O <-Wo.֚'*N}ܛF{fYvQP+ (WQZr< Bˠ\7k(W#kTEl_rq\* \p\*(W&yOOhl(@Wm tF;*rMў%3M\;OC_mL|at7A/)LMHb+\;<"V \2sŬ3J1B~$3zL])_HhZrg"UJLhr&(WA(d Ua6)W³+oK̙}xӕܜB$W+orqkzr2n*(W\* (W@8.{'vˠխ7)Wop=&q>Ыw]OMhyJ$rF{rCړ\guDo7Mr5tAUd{Si ecv;YR@\nBkHvǾg@XiΉy_>ȁ-<ះYR}5/ЬI\Oe2(&W<9O ([jz^4iA4x>n*jC鱟+W\PBr.U8Pr VqۋcDfj\;B"jT0NMe -W[xbR3.1/?|(I{|XmmѰ]7 R(07T"^u,7)h V$)}Fj8~Ϧ,۲g+Lr)3I\Oe2('WOѧ>k#Κ~oI axnN@no~]-\JNxuFZ /r pQrP\}lKD\ 8iưhYːS=6LjQib ishMP |1bI2c_Ǘb[؝yNٔ4hQnޡJտKQ$OW+xf2i7--r -)Wkv0iQ$а0z_P ylX"Oeei"ry^^U{7+Of??Y$<7' =< {(>BwmՌ:4|JnI_%*OϯO!}IkG6v{8M 9Z< =ۼ{\Օy+6hir?,m1u!BI ɖj%Rnk \7|օWCBYcݗZ>޹-I~WPKc7Jã{/ ~"/F^PQhE9/T7d罹_u:#dVck/ iAoֈy/ܿ!dr|2l,|124,|1]qqltF|S Ř cC}r~_ 3Avt, -=1hvt Yb1RRSM1YF D|||n^tYYYń0X,VR2a"111;': _ &c}Mm-\mG2䜈wՖ\-rZ-ʶtt&ZQMg-"xq]Y l5mU(WǭjxlFf%W4e^͢mkM2 F.`>8lh81Nk[:LY(R쾫)mrUnEw,AMzGm쇲fǜj7PyHe&[@ U(PE U@PBraV"c9x)~˭Q4-|>g֍'h rh'0T63սG$^hW(9kՍoRbJ#mRwl8UW?{W˔ޛwra-!v2jFS%8oO%Ж| QAuUZsQ2yI:Qv(W7rP\r\ez?ׄ[ F)W~ݟ (,W*ԗVj᭴,9>r< WuY+,AQZ(W7 .-(YU6u<%A \= n*(W\* (We1&̗jP7U髯~ӗv[ZGV6 I6hW}=(WӠ:}_H/B!ePTVGd np󐊐yYϼ\\UJ_r{@ U@(W@ U(PrgYx\Ֆt}Gh[NF{zFN+it1YF{rrDުiPru핡k2? A+gew޲kb:(WZhק(W P\r\/|͑U}f7C^z;-~6Tk[V~~׿UXU4U A1Z+;+c ̙dN%{s3lܜB$WyӲ+ws;SrPt^wPBr.U8Pr gE,툞ؐ=T iPݣk\Ԓ*QY r,ܜ*^nz"hE?X]tU\**ѵb!xbU(PE U@PBr՗cN?ߎh)S3$Uo[lV*%\-9=)W!j9<7'Jשd1՜OUuPBQ*(W\syZȕJPBr՗㗸Q~c|/C9b(Wn}XuF5e>*W,FmT ^[^~z k^\* (W@ *(W6N+\/BLX C-r[A8ۇUEnuOX&r/Qv&*$R}Tpe1xVr \* \p\u媏džt,u dҙY YU6Uo[lZ *%@ UI/)=3kì/uPvAD(WA U@(W@(W) URXl/009VY=@ꭠ\u ߩ*%\坝r0-5n֬/uPvAJRuj'귖;G jr pQr9PRUo[(X&U@I{1ߗ9Pz\eћ1ɷ0g;3<+A)z]}ee'o'WMjr pQr9PRUo[ jvuju=_!:1_%~ Qz\%ZDִ{OMuPv^#VU\Oo-W7r@ U@(W@(W) U 媷r-\V&8'y#URT1 jwm!v6e~uPvU/*(W\s&KZpÕJPBr@ꭠ\u k^YwB4iUu?XAQZri\4uo*cuPvU/*(W\sT)?$?ҕJPBr@ꭠ\u WxerRUg x&VPSe\]QfTjRfN7Y~Zzu=U5Q P\rQv+\*AƳ^ UB"TLNC]EFgbjmiɁ-*{@Y4ܜ*ZNq}sr{k=qP\r΁rx\=! C^cU\JP1՝m3jr[sK5޹2n2xnN@nQ[AQ'"(W;r pQr9PR/Iu5rhKxu0O#'͠\u y .-@jFZUp{XA1Z-M}㲦ݝ9VuUĆ\?r3zBꕠ\* \p\u DU!Vh7GT}!Ti -W+ RxggH ]zA!Ar?+7UKLr`XAQZӬȜD+?p.UQEti\jg:YYzފE ֿ=*(W\sd *BRVAAK8 oŗ\aV57T91_fP\rRFlaz<+(W3'ZmƟwruF]/(Xz;c0kr>d{~+^9=\* \p\ue'~䆹R U(C!SK.2F.3+2*YEJ]PCjZ\Q<+*W׿r8kr#E<1Ar >\*(W\sTG(=2ŋqPx\!r\u 9?U0MUõU,ӨeK P+ ׼j)W 7++MOEPvU/*(W\sT/9-UrýAi* *z.')U,ӴEOgbU@[ ֿ!a'"(W;r pQr9*֡\.(W10ԖAE;?g^OA2!g(W ե P[U 6[OEPvU/*(W\s\4(W10 YfPAd\)W,a~<+(*W׽7J2g_ڤc~Zg|}P\r΁rҠ\poP_C8Ub_u=KcRTW1|K Pz+ʚ0gLj~ZsC@D*(W\s\4(W10Ԗi9ۆ\(++7="UۘN` :3yKgL=k=_ .i(N j΂[<1AzVZ*Q)(W@ *(W2lw߸zW*A URĭ%<. 'QX#AsbW{O/vKg?0Ko[@/J9zs{=Ն]z""#yI8[?g\@U[, e"W%a~Z<k :{O. U,Ӵje"A]SnY_Ɣ^.?5Exui'<7'JWW,W+=|\jguZI^x' WK_lr{@ U@(W@ŋqPx\-S2yNדn Bz>魑񪫫Ruuu|>?"rU<|6eٖ={.~4ڽcWM١wçl}ݴV'"2<1p{ԥݧ:QJru<k u]yˎ* U,ӨYW\ue5}Xִ{r?W!y+K19U^Y;;<1AzF̚0=Q{Z?~r{@ U@(W@+wrx\+u:95ɚzV  TV5J"lj+`6]L7*CsInU}h} -:5A1@9ʃpf8Q6;'V$_!H_I$Q951΁ř,\=<{De<K(IjYMg͸5Y9=ʊBssr.}5;.w\]WthBHn^^uM x=q]ExU+NQr'|DWn/jH7[S[ o"((,Or?n &rv~~eU Bt{tSP$*;:׋DuuuGX,RRZɯTjdԧ-/ho[(0'&$&r8D\\\+ >f?󋢌( XL=F3!D9& t{s3fFg};kFGZW3ܜIt{(J%))|uArsszLx:\@AZ"Ԃ`Q]]]SS#HJJ"/ɤRiCCZ&P@ ¼ȝG8^jz_;/ooH͋)R>F0I1G׾V~|8AUf Ae{ZyH|fCjo$z,3/b-hm_Q*Ao-cfRzg~༼/**1e;{c(W0U9/K&WCs?jaKrՋAŠ\* \p\uVJ%(Wnz]=1F8)V#T؎ o]̯hq*cHRH>LChz\5pSC.Y=4ݒ\T1UԥN@]תu.))WL01BjE\ѧ(^p *:u(WJrՋA U@(W@ď[ζ2\ *^,W&f䣯r^=Wl7Cl& dʶe;3UHTYI\VT0+T*rV=\m~F뿙&>b&=CLyaKj޲~Sԕj.Y],S~g.yNV֠\6ʉ#֏ 媣\J{0 rՋA U@(W@ď-ԥqPx\=ͮŔq$ "ནLY@j8-Wl1].+_U䪡nUmiOV_h%8vӋYV/,ؓyQIUpUU "xeI],N5rKnerVz8'DUs~TrBOr5{?^YT\I~(W}NSu9j3 (W@ *(W[}[ĸycCy6'Bh7U/PSWK|-Q9IZ'K{8U=\ [ǿ0rUY/rSr=A//̞(w(W-QJyg2Wy^Ulx&nFV Ej kU(Wݏ(2y^r\Sç(W;Crr'귒s)X*(W\sn|*EV:'W.ԩ}䪶t;?Ew޲th43$-Ҕ{NZAn8z)oCm&ںRl\Y;7rUge ^qG~]$?u d֨jKNNʚ~omFMC xbԓۇGɷVD tj9ў+Syrpӻsʎ\ N-J;͜;\fEm\* \p\u 6rx\V?ģ37A>!/=4"~6Tk-&l#so{pu6.jq; u媬4ĒCuL]=s|. om+HZȚU+T5ܲfM:zN@F:&1S˴:AbUf*"xto(WA U@(W@,J9XA@>e%r uA^""#9V,/nF!{+«K;{(8LѮQ9?)J=,';kzӘ{SzhLILL3&vҤ4i VE}YzBgqY`sΙ3;vLlC29QmJ c&][#ukҜ` ڪVVߍNY&ڵ,?[{_'\U˹]-tK_7kqtG/u OY.ucpEap-apEq10j6v*;lY00lX᳍#D % 3EحVT9sUr^GLg䢏^\?9;[xUiR$%'JՑ[dG\MġI(NYkm@j:a WCcpumV+Q}'uΰQд1,5rj[s}{TIncKY%}v ( % (.WW(mkd_%7p\EK\fF]R.Qh|U\}Iyڪ3io%/5 W`0RY QR\eE|,[ФLNWOzPRK$ݧ]-D=c2ĭ[ՁQ 3SrGW*`pY)?婩9j:J/w^"(rcpEap-apEq10jD60W L.~+lqgyg U~A/yNj]sҬa WknR^Lv=#iI۟fS6XC؍j_jSrE'70`G}^+N_jaW: EOGG n٥=F%WN=kõ:bz9?W|PϪp9F܄Nvd¦qCK9q`n!S1:8*Z*bp=ap> P`pu Lp͘XUf^Dvٛ*XB+7yg U~A;e]kU^0pQ(vQFTz0W%~_UגumCzm) Usg}V#M*cpU^iRapW_mjגt_~뇑\^㤅T|zgՒ8¦G Sfp>Z[ 6ZuqG h (UUd?\e]!m{ LpkJ,~-xfAZs\}@/.fbpv^pUUDy5}zMW[>=[3ԥkՕઙZLۦ#p6 (,4*1:ꄫ^Z4#\#\ΉIKXzVp5dlg\ ?y)_Όpk WWEV UU*z}6JZ  W'G@E]VX:]~Wa BvxROѶ4e]v@\u0VΕW Ƒw(8245SޣETudg/ F!p$WM*UiR#OiUr()QaW #yK4 ȞZnIg)h)'v,o7WԳ꠆\utM'n>avN̽3!S}^/WI\EK\EQ\ WkC6sb](ޯ*&\(Wwy@y)]̿~-Ws̥{c[&:1vU*~b+W_Xy 54;=I0&{(L4JӨ?ǎNm5+57v邫T)- g"/i1=ei"U6*"dt 4 r06_./jMb198~D :Rs( h (U4tAf\JMg!pYU5((W\~-3ջdWF=, :WH۞նԢ[5|r$n/qbR|'Fy5 e'\X njS }@: CI_6 *?qQ&զrUu1DDnBZ;ʫEMίaWr. pS(p->QOnSK #{*1Fz :E5Y_HNZ 4 WPި%8y=WQWWQiU9waZ]{ 9FUU5we sl]ƏvDjl(|F=MjiYn|!pMv"\wxŠ^)&='7?Ow@U^irr^QdIPa]erP-R++EaTGx'\΃5خ!puL_p1zZ~NY78jf_OcG%\}v۔\^tjC\۬ڄUQ־ϛ N.a35 Nw(>k\EQ\EK\EQ\ 'jYu8txUUd 6:R&aX-iW}2Gv"d\~/1U p5.go2\}0\uUiNoxK٥v&\ն`3sg9 /§m~gN'Pmo`\)tXgp( DsNnTR_eG~CWWЦ /qQ\m`UVG@=vh})ZۢIϫo>LWF0\id U~A9OIcU7U(j٥PI47[BZKʫ 1$NOdG}gMb!Y_p[IuHi%>]p2e([t:N* `Gρa WkѶԛUHiR4ㅯgW-Ð^&m{pAU &-hvPՠWrf tpMM!p5w7`d8 '>x_K]١oS pu2WG\EK\EQ\ '+b6Ӯ#ˇ~"0S1j(jէvasW%;00P0I{*q˓-bR^gLy5/GeE|M{WK^$kۑp(+G&\4z^'UѩMm*)\m`R&Ѓ'm{FQ M WܫJӵ5U(d#b2yRCWR^90Lh¦Gkʏ1CKWߣa5ર B)^Gzpj]pojʏ9[ Yȟ6M*`h (Ud\tgecX͏#{jZU5F0\݆}k[UzT\WXG F *\mMbnC6]F,UJƺ,fHxܥU4W}!!x5E87K2n[O΂Lj=5O <[fS_|K\ĎWǪ%+d*^p~,ggdZ$d ܔȟ*is2ZuqG h (Ud7\P)Yٸ*~: %NJvW/cY]B\dA'( bZt!C>di-br%M\QnMbNm%EwjɂGW/GX]O˧Lrke&HY&eW 0گ- UzNj W_UgPϳjf/ Nbōǎ%q #\յ6/\uT߮:jM0r:\Z5 h$,*Z*Z*bp= Wa(ƝuNmPh\E]Yъ/탫[ɭo\y-Hմ+F viƝ4/_;fEQSm ;wNU1 4=S(>9=a#c7|׶=VvU+jnY3}ر|,\%Y-?{4;>&tWV?G̒-Y1벟jh"˷mOvȵ>YR(cVv]艾ӧl?iW.^| 1R&ktG?Mz{vmoCܣΙ1YQK|Ͳ4˧(jWm޸3YHpۛx| 5jr߬%fK̙bBJ9~E8Ҳt}dc?^UԿ?v cG/uՅ;,&U`%,؁U,7պYH?V) /W|rZg4լRCU=u{:f~Ӎm`~c-GgܪO7OgwHx*ZQ|(r p\n+=Kmikر<ՊZg3ү֚/#(i5!PPOցϳR^M\hoo%(u2$Ћsl6W_ 9fڲ10h%*3==Lv)Ӵ8d \\˧D1׾+7W[N{AUW5׷~ lÿ)n>*r69ٕW'Za&;=Ӄjtݾ ysmd_/&NlO]3iS'Plm5׹W\ն 0ijVsu3c9kE-mOjՏwu\4B\q;͵oۏ9q*l2פ̕[N\g\OYN︹.p|S̵/ozkZpFs ;e}Ӻ5[UIp#6ݐ4z[.mtۺ+h`~h] L6sYd=E`u+ rܛfY缿,'X|Ӵ?{׺e1WiMsd3mSܣ:\b-ϹW4hѿ\coZ1_~`FTs-mF5wfl*`U̵QȎMX<V9t"n]5Ca6mlVsuh]E\s @4Z[5_j;R0`xW'.oif[ڴxןޱl4WW*5Fs-%l ۛ5+Gos~oj_z`O̰\kEꈹ᪭*8r璏xxE^q^6gT90NAvz\{=ѿ*kezjUah݊%+i~3?Mw9#Tn7۰\s5דy6k\JѻfY63=ͻl`fpHVtFW{)q#6-|qbzB)Y*]D,X.Ge<fSJ d.A^l[krz3, -bJ$D]~XHo`V\)dzegw,i@on^Jy]=s7%Da w>d&I^Im9+͢n'osU5ΫFXώQhǹ(nh,"HaI.٥>6"'/n2n6$2]Tɖ}_7<̎:͍1re]>}$ݷMɱF]y`-b2_`Mqnx^HmFfVږZ^Z&^9UTIaӣm*i-,^sUICVCM5߲50WVX VCapA^fN VGD62 N 4k<(4sb5QU. M؆Vh Eq̆V0ҶÙ*6YNp}Ly5@dz5pu7 <4y}7 *almhP Z#p5XV,q%4mN19.ǍeEB7՗z&p| =AAg==j]R;5qR2uǹy~xY-|!.aZV<;pyin{~Yך%SE=Hx7ĭOȾ e Yd }C/?Sj]e,^B9V9B4)onC#pmw%#puwu蘜QC6ʡZ:EFL@ٶd&~yuPRHwy+5^ d?weȒΫF ` WWC-<;!W_WW9~5]{&n~֞x^?:M>^4UnQ`zZYz`iдk) % (yKeze\ZZ, *~v)hapuX - egȍ<7~B%Eaz ,+)RҗypUWC5]S;jObg8aδDA7b .҃?dG}g6*4᪰JK2. u,/G@WKI@4q,2ujm$ݗ%Zetw3vOf2~Ⱦj]e,^-sGio"f ,g%>KjʏW(xNjhѐ3Nn` H | 1<zNy5)Qf3oٷ׊%;S#L]CL3UmLu)hAWwմ-uM4k*gQr(U* l$--F:bj"}Q\4ap-apEqz>F0j`@}o'G)5rBxU \նrw~8JS:4ΕT&+;.F=jSE>>H^[(r0'e-3iy;%ɪT-z~TnNj3ujd`dm7ɉyujeFHt#T2Jv5= {*O󩜐k]B!Em3gnB˱)_1cSnT2..N]OhWw֨D"e$mYϮjt.K(#&kDtHq% E9{ n椬D=VJ0̾FD`qPdI`?θNo];!,I~:<;( P(P5za>׫Յq_V&E*Ʀa$GYU2!٫QNmox_aNXM5Y^]E$;~03*[Vq*Q;M EDӹc%f٨g)-=")Ԫ BR>28H$ &ֳ7fVN%8U5bD[s cMg*ʼnˉjU4M&,wvaWK8{j>T lNj+Q>LeMͭ>O,+)uT*=GMYȊHKI3 |.w5&JYӎQb>&~xf!.mvF C.-O6oǺrf P8R^[IPD}%cW|Tm~v+UJ;cqykX(12QJNrWQ?``&vns yw>c Pϼ"C9Mߨ B{AB*i,ʡ5yk';kyvPeׯ3>h1愺TNZ5aƒ#bgG^[0\5~ܜ"P}^یyCMؕŝ&LԳqD&WVV;Seee=X5q3HQI%G̥PDž ^B޼yֳ ؆1z8TIP ߳.^&*h0oܸAQ;PWT M RؗJWV; nsui4-|}^~\|hԘӤLj=O=/WěῈ#M 57Mm0]wC/8Yt=W, 되iƱ$h^tjg=^жut;}EJ̛Z<?+A[@iѵ5\včUxb]K5B啃i_S^_, 2*~ǭ[/ j`)k{f404)ʫE 9?ՑeBr~C=Vj@Մ[lINէݠNn0 +:I*u%ƖpPeP|&rjPܚ Z{vPW%\M0Y8ò:fmS#Uđ?[s/AE/nz*uq [-a(nىNܶfҵ5r6b:ښcQ/~Uoײ9\Y+~E!.Kа"Y5+jxzm;,ZGeYzi.΁4~Wi?L7QzGw2\]|QO,<-ݼᄔSyy'c=*;ء W`_#dZMɞߔ6ŭ;^QZd4(t oO W߃=dO~9*d跑YRGLoA;ĉ+8YDFq96z70E+PP5uJ2v2|b|}IY?Wr.8J j"Y Ǝ.zZYivu'vꙷR WUI`^?m26Ϲ#pFzT0QF;W+EQAY`('lz԰2(vPWyU-m6ҵ5S/AHn%K{CAWWQ/RlzI#r 1kVVD]Uv'eX g ^pA(-CD\4|ܫܱpU߈ ਇ>Ch[hGzv}ysaJ4ʖj"W% iXUN puG57O Wߖ_'lRiUou#^5ܟoSrWGA,3YL_w?aSQ4+|s*d]ZGr{?85>0hiBy~91?)=^d Wo6=*~(:K" RCՑŽnM4Uv757rI۟cG}z UEq 'f*&K2vBS_A|Y|{ET \uMR񫵩 ^m:WkS9zUp $M5+q?;pukqk` h (\m3y 0:"pU%΍_b e9 W\EQ\4|US*C?dԘY{*ƢFrC{]I4*[ethH 9j8FD8? WUs YLz+t)W$ q%9s "/eҵ5!ĺIslil/0|/3pB&43YnCSH&p%.*KxOG=VjHU([INI$ӏt,3lWCrb!pI(m3''ۿ*YW Y* \U1Op EqR(-mFt3ovt(@ĥmޚ]ҬN~ԝe۪`w%VWfBt"*srWkE61B?6Ua6jS5rJ; =z<N B.%ܺI S nWWQ/*&3|"8l&M WY)ޯrj WcP-<WQ:p63 J=cpOEحVT9AIB|gݽVIˏ~רQ LL9rKy$AC/O9DD{Q^pWonRF*46Z0j=#ҵ7Hm՝ #Q&CdFrCU ٻd;K dg۔u6ʒ8^V9g2\}3.(|/[~)S{Xtr?+Ϲ cpj}`7~A#BiV 'G!>ŸM#ˠ3S^9hܲKMIs punݐ#rV_Sb\#meauzr;N9Եm6 q uZTA\kV1fFM[?d#ѩM-O%uؑ_C4rYH#eEz B.Jx▧0jA`ꜘАx.02bE&ny2 ƞOu4A6y^vԷ}͖ HY^I9}~c@* ~݃L4 Wgw+u9;* !_po,7ԦazOq,WQp{wgb ) +gM0ɓ@ez}o9W5 0jnT*߇n~l`a ?Մcq%qpU aW|RG]'ucGԝ5  JE)\N, 132bs~6Ihozj2Hi-9YNpl/&ލ)dͶҶ֫δ׉ x #lz:ǰxT)90QP=\ljUh ȯٝpu{ꪴpEBaG~%[325l&D -*nG^IzE6,)^b p0ꠜ WUy9WUeY0۟Y5uhzLV׎V^N x!q\Lap-apEqMmO vA1U5 i@e?\ @hŮ#j Q%eүtdKOAm!4#`<*zB2>5u/\[W~)Sњ::i;T:k~)\=p3Vטּנmji<]f$W\ꫯXVߗ~IYfM٥PԳdpZ;NG2 wrsE6 WmSrM@ pZyfښ\'L*IPuխO70e[ei)ޯr qKZ=ͦRf/wm}-O%u>gĔ0=خrQ1>~U#6U CO'm'\5"7 ]%X+m׻Sz{p[; ka1cp*Y(zK`tAkɊhn5w( :(#\%,넫b}p3F]p2|~[@8\D%'$>^VmxNJ]i*Z* W;: t xxU^Pr#k 샫ӥYz]A :;zΠ k%m{vïQ0P W'GG_~ꛑEPN7W6\u=@$YP49hFAr+Y)F:^p.rqA%u<igrBPϒpVlE"E}ս3iyq ů{ڨ:w4$0H_4BY_Hir@7pԝKQ0R_Gζ>RFuN<^"MSG܄_!idNM!p5K#R*1g HUI*77H@x'\mSXH6yuUy(4(1C"<-Mdpe4g"'GzѠնFYN0_SFj*e)?} lEag\uP$eyaϊ/z;~& na#\mV 6zR_W](Gr+/&E=]4FU>2*uq h (\u?=]ƞvU][Ie|I ~F6\qUC:jԷʴfq9d ngڬ.*KAvy*JB NhzgHT ەI>wy)]̿s~c]kpT]^yW6;_ yPoZ=Pm׶6Tm~ ,Ya W)t_Ea ] n]! 3{6\y#Iv?ط W+I:VnĘ j֧)9UĿIz*=߱_,bG}KXi4_iQߙ?pmզwWE])~0?pՃ@]S<'@UJ21ګDi{?32N !mqR(>L f& ˠK2v7P6c Nf47ĩpWѩMƆĽnQ]KfN W[-}_8[\z.&A%.ELF.4ap-apEq{:m=-*!SE'7 W!şou\4#z iV][tC|W!Y^GgAA> CDզ઺* b톫ʻW4E~nt|]Q^yè?hXU:Asƍ)Sd:͛:WDWإz|ru$$G _,f7?.L] "d .ǽ}.E=?ʏz/oeu[ȷꆘU΄ :B,w7sVP&!۠ kKfnR:J.k,n=C40K::>g~lD]jU;_GWB1R|&VCrg=__&x7>!04.N"'298?# WyIxDo\Ys{ \ #_iTYOǯĻKXX}f#pUy%|mz|5,81soU9Ktj8@GrB(_SJ+>RMB.4ap-apEq\ !b{mQu-oJ̀}dը酪F }0"<ć\ S]yN9Ae3zqU4tjMy* z&zg ݻJhO-|||_(\M/sl]ƳvDjl(|F)BN#ހcB#z^ӶNp$Ma W7?qquxOWjWo͎6\TKZ,:jjOB/4XT7 y@.;٧WSL PiշC }Hzm<2p5u^Rm)#5K>K}hSpka1%uYW8~R];\{]pd97~A=-`լ@pnH. g8F ~&uU:B>U}vk:jfp[f5Wa_ -mnϲKZdt; WswP3\у7SAl2ҁw00jG Wa 8IPсZ*E|c;\hPpbI2v6W#_`DWl491s!bfRP/ r>U5hٜ̑e蝅Ȳd% _&zRҽ?S\I WSRRdS])N@7?6  W;݂pUU}"?pF"S%a<Ո-b2sypUR_a H=/7s uq0zpUiLg70 p2+Oу?k3Z$([GwE;e:ˊ,f zȴ:rV95 RUmMxWvU)/!\[{pa]zV M*8X,;[aVٷ k0*FEޙqJO!p< M6^b^Z໊VpŸJi!('v; rzeB}uUU%eWwgKK]lV vMcio!+0JuQ*Z*W5\UĽ:*M gZL`k+\q d75Cr[tbـBDE/΁eS"WZTFښ0BA"!Aڞ W!j-)*ks ̺'h|V&J@? 3RQkϽǿ`ĬI?34,0Wm:EioS3!^(:#nոwK3Jm4pUJa)N\Waύ_> W {^QO1o/~)S𼜸y-Du)fا͂JDz; gY*-:bV>wri۳*#t4'1~Cԕ`#6?K{sUaY#X6,Ut_Z9p>?Pju N̏lv<>\d,7jEl RNO ?cCJiRu1U{ A yܚ_ȡ\e}9\Urzڮ Q&!W!i\zW|΃1=e\ş*;, wLNaWYjػP6Uv)T$~ b\5 *#C]pYXK#3{T7 nYWWQwՖz$~߶U٥=?܆o_2Yiq@x'>pU5lXp I<'q4KΆ)\@/Z5ԦV'a, X_Js1+iI16 *!ZS^M)r1l / ._Oaa!F4(z+"wylt}sn橮=%_rD_EWN^NOJ;;܄\-ӚdpV]60yk} 6.gWw׸Qk ?)^t3W}K2Z Wse57Sr¦qTO13)::?J2v $n} >P*cje;p5Sű,u(TSr!|( W_DjOuհ0z <$ݷ{2#c\~6`?WYFx0㒋0CEjrD/puuzJqG23UZf$<~\,vwE8U1u h (;jt܄_ltPvFa7jT9[qZ:ms_)pUCTh1k,#vl p5zkpr#j()d!%\5 Ǭ^&*l//@9\q =O>;_OIIفj`8]K=\%<W94&;vյCtѦsX{jjn-R^fy8 q^Ue)0@Tu|^+ ,/reÃ3~I~)45#pC۬_ T0Q\u`]pڪ3[TƱut#, ,#nyaP)zKĎ:'\L$! Yʍ* ){V)]'\ 7>)!`UYYТʿYGd$4:iN0}4h(/z0:ƱMCU>7pXc7\)OmU ']pY@@T $,ƃ{ Ww+8:F_V\EbZc SȨQ(Jsc΁F5WOm(:6uO~EQ~*: AJTV-kk*Zlʽc%t^9\U2d7\ZnѢEoFFF]AA&L8vxjj/ o@t O|qTrb:6v Os|c#\#eΐ?rs>2Uy"âop8Fk6ƭ{8v᪄oeI|JR# WK jWBpE排w܆GMdv7pkf ^gXpun= PtgW]4jSg W9Jw p *^L7JMrb =E y#xQ]yW )9lwՐH\Bw0jZ#&FǍܲ^@B CQ/ЯUdEUJӀUƱMNmе22UyU*yDp_\ !<fabBgUvJ2I1[N6S mT| }%x""QS/~a0UU7pkg}:*IIc'\>J!3sWE8zM[*6=8yI[gWռh3?gey{{Eq_{*\EQWQA \ܵ 솫_451p b*ĴӧO_nqiӶlݪ`֬Y~*;SvؽkkڡPu"Á ,EDPŁ(nDNHB† 'c +ɽ7{o}#h#}>Bk˓'#F*NGà*z-I7#rXDrQpvYJuѮHr~cxY+ e@-ɔ&e zJWNJJdI'i3Y~WDq!z1%,|slS8C8GjK2q!'+YYKPwUƫ7Vj 󃱐E%\'|{\Ȝ346#-?;\Gvϳmp'U|83*6.g]Ækg6Hh/$kF jjt)z8&XEzmռDRP-f#/\p<0$o-0kރNdŇ#K EN'+>U;5Y!5%ֱ"p55}{{.>x<).ΎMmVS)=O= W]enBvW%.lͼ9 h}i]%4!]p{>c*fj{im:\f\mnlVg,`#p5uo'ɸيRiG*Uι❶DO) lú5bN1vϗOy/2x/>}-ʜWF1mtcGV} DEE <%ހdE3K^򏃫6CBHδ::ւGJ_W|dU&\:խS y1̹uWQY~`%)Rj?+?(c{Lv!˜*셏C}9v,%O|R#IF0 o|-M53pUjih >D^<i}E{[W!|] hKu]Ȳqú%=0'U$nCdp uq\%IsVtW.[M%xG L3qE>Ny3T^$\_Ԅw9G)M}6o[Vn]Uo5O%tmR&p ]w,1< 7k{ R7$I$\Wx^ vuKSbT\DU G1ޤRg.F^ WܠW.nsmBGɓ9}*$8QE|ACw!1բ=~eW$\]^Ma;p=8\W_miXoT qVpsXPŘph4g3A꽋-1h&|Qzn3æ_g,b̡pī>1܇ۭh<́`޻o՞Zalid*8 {zw1vP\-̫O֪w` y&{C W]enBvW*ΧҽrUѼ/i#Jϧ*qtx2#-]ofliBm~HW ɪvPpt$$~hջW+Y1!3ë`X\Nc- 5¢M%tWQPX]pR5!FʜWs!ᐼɫjZ}^R]z WaSOk0k0_Fʹ|?sŋԧ--H] iK_7J~*!B!PcNߛjl]C+9WWzP%\mi=B_va }4 ;] 5K xCQpUs̛ȃR:-Q]4TD拏DGUܐ d-x*MGwܞmpUM*5ծUN3gm3+;E"C7VZKA]nXaM&K! W]eΆ߷H*ߥ7p5rR0Ի ErB쪪XY WVc0TԴB+ ۠yQS=7լ }gPZva+/e R &N9~3\ += 1|5\i/lfpVEǛaDɦ|d.mƍȸ͇U]ˉ}`2\V_KN -}{O~QpX1\m4pYYY^΀.käpA CkI5QNI#qk_!]h')0,&>YhŇ: [⃺"Rth y$o5b΄uZ.5mpuۊg܍TInK#p5'"73\E'YUp56tGc \ŭ>)`͓%OB?FQ " Eta2mjwgtk$gIavያ Yh$q27\u MjWkcP)vy:5 ո }*R];W+ YB t{L;A<^R|*d "ydNAXDE킫:5_g݂(*O\E7U$wHy~XW.B&Il(uUW*Js#7kį઱^wl>wU{ WϨ|_Onm8?ԇa鄫\R{uբSpޑ:7\u\-= } 953 \=>vfTD˜so]/ 9ֺ㰍iJμ |X] ^Oj]%" ՒSQwW&k\%uY| B@͖>_ݾNbx6fF`cmVh'}*t ia]Zv1M'ъY Ff[nP*o *zN'}^)*\ƩpU͒5\%T@Mf >**)lr=sރfʏzU5nw 75mƍҤ ڃaornNl ^\\Ys;Xw{cSb@Y W9FmFhsCu}yWKt᪫ W]hR Z^(Ep6׆vC0HqHnSltOū>^p{*h-i2eͿ\ـ}9Aq=]] TvWɚ۬*qe)V zGy3tN}1%yIPCaŇ 5pZ?Fe6U\VQ܇̾kUKS:CRv1M7ъsǽF1(>/Qw|$i<WE+?8S4 SiG~̵LZ[ \lst9nK*]Jc *}FgѮfػ"fᅾ)Md.FXg>)GUna)j2J\W)O*GLiJ k۠3;k W]enBZՂE;}d\WlW0TZ?6ie5 jV8[PXVD. M`I+j}@0QԠ,Tn!9&DlYG${IGU%- \ j,[D+>,8\}Wv}^dK6Xv>U{0pZM:7\u9  1 cFV^j#vkcSOp]w6tJnX 4qDA]aKzK>uj@>7f.iBg}4P"A@m'`lܠWj}Bph dU;ڢ=Μ{?۞*-HyS--dڌ$I urmkNd)+ȹi!Zd8H6;2n)R~Hub !/ P 9vmScs.'#:6Jk'V)$pu!CK'f\znss]%Ñ%Qk]NE H©уGVrWfEauBc;ГQ䊇ħb"Oӣp[ W <~h,(_p(mz_'(u3*yr<3^ȈxSph Ze9c ,9~sh w=oH(^U$EoHUi#p5O EL̎?!㖧.ypU)-ܐۦ["زrGSNS fP"p ULA8ZkDCV\=K:zyWsp^'2rX}^nsv- 5?fRv>W#G+Y%@FT1IpU0]F5c/V+Րh?U K4ֿū1ܧJڥ ? 9Sҏ5'ݜ W/-}<ß!T;}w3O0swUZ}h} ֌-M 97) uUE{# 7&qB_}'V|dR]_4 养ەYΓid?ۦ#ۅkpmh6_gQ=t'6 V|(Y5)N_\nn*sUWMueS= v4U^f/xWs27\u MjuEy7]Y$6jkkS'pUvWsJC&F/4k/\Ul?/1)S2X,~"˶UʏcK}[-8^~i4!J"GC5/4=&3 C =!@pXUl2BpUj(! }-AܘSz`kϜ -2Ekn}Ioc]oz愯LLA~.6mФѭ7Gdrڦnql8˿ѶGj(SjB:$dQUSD)Jj-}{i?\7*]][hǥIHSl>fMRia7gv'p]f%'4U_C1܋󪑜?{ގDh7 {ފ!a>,PmftW bVaU^ГUCۗCs)\936l6(KjiU1dɿTr0D4~()߄tBFj2.@@5LiR=Rock u$a(ղ鹶V41oGJIp6.Oš*ه M-nd3|{͸6VcqvnR ҳ0Ҭ6 cT߷ּ+,/8(`ײƾLѽ e \ ~hoŐi_5i3oB^?FUbp8s\-_޻P4^eZ`YՈאWR" 1|A:i˜XDN ʘ /ד dd9Oq #sUWФ&Z~1VQ W/ jl,S]PՈHNdνRC9"T8a\'Wk+p3M{I&0G~ ھNpƏ%y$D;dOKR_Z_u^ߔ \:Mz_Ŵvp;m]NpՈ9ٺR\\ꆫ.1UIϨgH9De톫n*Մ EV/>^GFFj)tW`i#7| &5i~OzV 5[ըϜ0ig]ŸokmJ0+Ì 9W;kHI)o*w6ooU2Gq<75XϾJq^R=\E GpKqx\Su1?$Ft 6ݫیV G,{C&?%73*XI_.ubeL$v!wFnğ"qSU1eXOUUf$4x<}[m D!ucކ1Uir,לiNuEպ`ޣ=A#I*YYpÛT{c35B 67xYG݂]XtdWkUt#ฐ 7U~Rj/"79D(sapn p w \-^9)F<2ɒ'uVy*Y]sXk+%a;v?pU3 _Mܵ\טWT.> Xrf^ɩз΄ er5.[s P#z3d+&EE섫+oZ#E7Ŝs/D 'pH:-Ղt$yAVo}(dFcM_:ŁNRQG^+0┑)smeRd5AY\*rU*8F5͉QAXHfAû\5 4hRt\m1?5W+~vǽSNjd h7(BY?LIwKR4^}!z9G}nR9K}j3+`*ˏ_ ܳ=%߿# +eYY틹gW}U,Iw/b̽uqJK^tKx)<([7=鮅V2D=j\AqTڌeb[?Ud s#Ks"XUl }7umYbHY#Ie2P$bvn[4oV;sCck}&~Qq4Ac ]!Ib=:l}BG%;m^y.?]Sk~B׉Ӽ @Gp#bR=y>TjiJ($@t`DfiqΥCC_]v5gVlfݚx ߣjG5N*}KF88B }\,3cFFE~}a9N'˴(QKcnL/.8ƀg0TJ}Y~_Չy^Zr72avpyƘ,F0aąܸ8+¿нCW~( ߁БZI[YQ9*FZ4(NϾ?Sɞ@5Io : \z1O&HNt?6r^}F}[uCihy[tP :KgeeZDa̹G+++u8 c2MP;*+a./\c0ZJ"+AzU\D@ٕ‹NֈM1>e)Z,ڏTHIWJP?͊d:ZVYIWT< ()>UmƘ9P}f{4Ŀ.ZQA7}]Yy|-;49'|;h?~/U^V["foBC;P@SgbmWaX$}zM]U(c{y`/֒4,zAkeogㄎͼIkO;M7\.DwpEς8+J&*,~ժCV8jbU=m%*LSU yqO']|/W]؉biO) mj^`gW1N pF03ꪏ'8?%%@>Oc/\ ɮyZ,>ӖCjYoF^ɉB8i~SҽȘZt$ŋ;}~\;M['^䮛\8FN9,+d$9m;$yi%/м#ƶJyjb!3`3h+Vh rb>4V|x5?e4p]l#zb4r@(] g嗂 Y(@r9^_̀gE-q|8C;{*e"ə]ܤg1>.B`KM6J{g}C79Ϲ'sn7e/H_f E Vh'|0#:2i\n)gmAuk`irNRYj|0]{GIec>"lӼs{-7୛9N%'(+oN]_ŋb%_-gZ,7y:BR!^aIٝ H,-^s{?HrVlos)q$8SBi ޖ^oE!KRECINr⿒]:w wFqb?H?ZƂ'/'Gǹ0%.x<Ns'%4A\9'O/??_PGi7{6vpJ P*'Lg,t{ Ipx(;mBv9.DF w/z3E}JD BƎ|[PA66?NZt j؏{>(k9!3erd 21R1RgAUJ/DI͎zip44?) pROCBDtohAǃrUl5|+.om? VUW<8spuMb!CWe>ͣ׻Tժ/nxpyy v^c~-ڃKU;_#]!V,T]$^ s0WaMfUZxRζ+b YM/kt>wPflidι<ڪKdGcVپ,X,ݍEm3h3n4\Dgk,dsC^`x߉)!=^Ds'XIwwg!]{ku|tўykmI9sW)fh2>*9z!nWl'HɲxF|Z/N߫TkT N(NŖh-79a[Ժ-- 5t[+h- ݱ_f݂mpLنPg,f}nzۦ1}Z;˭&BT2cr{KGM %ɚho$~MM q,G ^:P֧ku;egzjny61 VnpVd7Uý#ߧ sCGBF@*~(3\pq v0 D`*um UL2y.ZL "GC# 1\E5N}(IO};^V%5C^m?r4e*jipȢ \07x8E]nn*sUT&SX !;?b jKs]-k#)jsSc^fEL6 pUp@`Z QCaI/`myI˜wؑ Au<+P*}G!7MƷ8]ت9VsK^ W? Y @">/I£Kyp%Z>{ѓAM( C-ꆫ]T^mqJ!hےw\]}qMD=ZYufs#p>\,XYY Ҍ5eqۻ x=de*p4D\ WU;yK_*<2'{WpozWU;}螷6b;¥fYD>mՙ_rqʚAO  < .y,xI+ZVvힲ?*h,y!d_Rbl@uC}ɓ'O|+X%s[^ -ustO<?5_K\m4-=obliDy xE~vk,;rJZ.Wԙ)NeޣY; iŸ em%rV!\~yni_CZ"Ff,Z 9^C7VeufNg! m2l]?lȆxw6UQH`u8D48*^./]c-*jĨR)E\Ei4 \ ^^čc8>5s&k)Y_yՕ QcX cޮYB~jW^$7;sv͑$C'^ɚ;it!CnKd\&K&iI CկWpM=mPp !\=*27CWCFT Ovxj4.[ zO, ù#G[Mi À,:U5ku!#U;}y!/T22o"ȁpf$LF Z#( ڞs)UDLyкdx S.>+\rU*Gܶ%h3n WrmuAR|kN _{)Ji:A3uO]ZT:c^[pU_Ro 4?|cǎ--#K޻ãG<<ت5/hUэO/fZ/h4F'3ٟb'*Ne=ʜs4Z~$N Z 0A5\ed*Ms\Mh-\->#Oʽ e ?X G,Yu%sE _ŜY[*2m mp_>y1DKN&>):cA ɂIQSk-Xk^ecU;5Yj-<}UctS&M`=5=M[i3zQ溊ҳ͖ɨMGα%ymTUV6H6Q]X|,k 2C1AC 3pE螷7Xӎ˜ Wg߁DL4s0m*F2>n{El+W\W+ca^HP1[MϜ9viH'1?X8b>HU^苈2-Muy8asQ;q˜wvWrcI]ȝû3X_wʭ-Wdy!3JBl(h^Zacc+k{06:' WY~};N`B~3|Cz2tdp ϧ~V9U킫UlAI+ B R<w  V'@Rsk_:]W?,FU3 ޲pM/RR\k` NVWv1T-ǖ֪PAd.p%4 ͆a,I: W((p{1Mi5,I>֯H=ܪeWWW|pjcm'?o 6g&xÇ2 wwWMI~d+Z^Kn83B+yFŒِ ҦB\]޷z:Wc/z s$zZW<W I?Ͻmk@Pp9!B,~rRnn)SKS}._ډM;2(ʇd$Z^[c+pjiڃK iH}Q$hi4r7CEy!U-*.4i'nPvOWUٖBI /ՋۡuΡz9Avw>/P?2dNq)\fv0%C>w!i}Hh}1x'8rYM r>ak\\d$zхvUZ7^NE6Ւ3p SpXf!p?AhO{.+z2m&bGF@'i 6v*j q¸JA*-\4RfuBcU\=,&O$]=igj2sb=7mn̤2  ꯄoB@5ʑȒaFg.,jMn>sY\j~+̹Cr_c$kџHp.兌=WA=8;,4Y/*D"u |r'RN󛂈QBg5(*d}Ud+Hl,^!;EkG"[,=O<熫.1gUH)\k' \o0Iq85UMOB{CEV92݈N#7P{4ĭ9/+g,pl55UUF{]Ԛcyx<2~醔T֙6h}_kgQ1F\X;s㑡 OP ā̾;PdR6?bT eid\Wpb"2D,p2W 6qA&HKp- v/; EU\Md2mVt53H \e@KZ WR?MAa=2W%ֺuzO6z(\ WvKxK_^oڊΏ UܣdAWrUѮtФFXѮ9y*a컐7-Mu͵[4O&ҽ ܠx-Ipb2Cl7p'5T7H@'p'pd@0.4z/\63\e(1 :5\E%*awA.;'!x;: UjQ"u?0a=Eηk֔`+L567o'Õb/zJgpD$Zw.}Zp# WKv`&%pu,Z[XziTtͼ cOtz7ܝpJW'|^xўV-=rjaK"FSvxU3zrZ[KϘm7 4]K pUS7Ҥ2*;@ ~"} W'n963ñgIC&|ӔnP\twJ9(( åIHuC7:ƬbgWqtXP3)`Cд]L!^=>f [p/rWQ^#>Y<r#unCҖRmpu$ǏHF8 Y/%4ر4YѴbwa$h~'~ 6żЗ8j\GUur.׶v욀ҒS)`"䅽̚2mVNdˡjC n #1q螷k$gz bW3FM]pRq*2ek{ZlloG8?W LVO a "{hËbGd=@*mz?4Xs Zq憫27\uIe2ev4xe!g eNW)))!WEEE78f۹>+1Zeot  K&#irf ui\%Ҁ\eTjmWKl$땟ZQz W[q:ͿY-WA(Zz>Ukj79Q'HA`7M6H/ k2Ix gNu z k^O_lnD 8d[+)v`XNk+X^C=r@hrj:~]qLMj]PnAU9t \X+o w#OovYc -&^=ԢYyG'T;McWp7#ݵon*1\Eo(hdpډv셏3GsdɓWYWlA/w;Z%;[ bl8Yq}Wt5Ĭ!Y -/f3U^/F˻J P*5tCg'ȼ+?)kKn&s1rSՀgd5VwRkCZQ9,N'l BJ|EŃ+-~FdHIͺ9羒DYns\-J]ajE*c\ѽC9^[WғMPe47eꇁdԭP5! DB w&+je[rReI8+ۺܮ5ύ'Oz]H.F\elR_]~iD}nmæwZ$bGm̷֩ DHs/?5l \$bA ;Jt]YZGUK2m&.u#䇿&!k:,< rxvsa͆rQH%0D{ Wh65䆫n '(M']kC:jVE2"3XWa;鞷˒ c-|:,^6$łNy4'ddHyn\_r6#T6(N6W}v= L$n]<'E@r:ˁ^ͼ6zSIzP \jeH%[q?ˉk5!]myA*EwZ眀J*P]A@N,9Aԕ]nM#ἪH@w &!_$^:.1 [=LjU 873ډ7c XS[rgՆw}wРA5Z۪*X=l|()1C&ݫ Ƒ'B /%,*^L%,yl?\\Fe5w"NUљ ԞQ2(RXAGc/R]VFYۓUø$/ `џȝk2Km֟\Crp0xmzic_5)~{ 2YAĽuM-DmH4p{$yJmAU\MV0-YD"NU@j1z ߐc0Ol 4b@2|j׋>$kU7nAà콚WǤ{ -}Ȅd(~= N N醫qk\EBX$;s7TZT魢EјudصACfDnjeS%ϩ5ջ!ҠᜃtR!K%g6@3(#7%BK˿/wVAi 󆫣o/><ЇyZ_[Iq\Ws X< Cpb]rC *'Hq݌r L~O'a=P< ynчpu3etҶmd\{Ov 5gu.Wu‰AWKQ L\+U,ek矊wWNz߂ko>ݷM4]C}EDՔ'ajp!%Y_kN!킷H2ZnO"ܭ_d?i7*'=o=,ļhuT p٫v[W{6]iți`[7Mk~OC )Fh;?g;2SbA=9Dv+rȓ #4dnE3f\+ ^;7u<#8H'"^{nH'Og2?euϊ5jM`dVJ6 EoWkB:Z_*:`:1~j!oKZ[;*~Wyd֒/TNzbORA 1"w[x-+DcB\un"r$ rn1q+:T3um3 &˦r e.D#ڦ}//7y럶Cqu%xѲs*1.@)g.0p#,=opղk:28;țŒ^h* 5۹Eyf_W; ܉#GjHdX%3Ntfƴp 7y,z^tfW\I=E0ޢB+x b=j{.4Ոi6'c{f[ңU.nWMy/\Df̯׍ } OB]=7FNӦg{9s[7\*k'\MtUPy b1'u<*d5OpU|zp]SsP18Xx~W|ə w!$MD솋¡]&ǠQ)9UOI[Wo+:pżD"L WG wM>v߈ m!Kfn&~_|<4vs~F;W]ň\0PVW(>(}k}'\5{po.K]Hќ W\=>y\E~Wp}|iۍjς]}JoUg#$| ݄!2l*׸5dDL!iߚ:;\"o3%󄫥tZ1ZewB/_e^p0cf"ꈃqT)Mpi%7y\BBXF̺MWe;Ńhү 3foɭ!=a6 "WB g Z~*ra%YpTSfA'"}̗y8yBOѼQϕlw 3OhnꬔT%\5]2:V W1.e Z9Cp5猻TbW N,퐵etoܾ?.LzClgmz,Y]+:G:2Y y O>^OYqX񟵣zFG!ޚ=@wqiBj7&oru 0\FVZ]d(QAp]UR±.T"\lBަw\]bu.潊 W]hlAf# 1+Qr/d_1>eS/^_A*\aG$jʓ,q3W+38%qUs9+}XWa߅,SkGU8,Ux>l Cp3q(Ք^DC3Ԟn%v 5SbW}*2W| W94X5iq$p5*j#\mp7 {\5) ݢh-e#\mZ'9{ }\rzi槌DOż3c+= K.4*pl/6e.9QMi;5姆|/EUJD)gO@KBgm2yHkӪ_!~b+u7TO=qirڭt'KO,7Іh݈>FsVuXtc]̻_iN^8d-P}pj}meUswluծUCBߜ/jASv@zkѰadIӟy8Zaշn'qˮBϗJwdG@1kԧl ׻T~*{ 0"7 1= r/Sdh_&yip1rPjFD%SqR '?y}$k3 =zLkC73aot"  vLJ'|/} #F^Zp/r^f3>n gkp\ *}ޅ;2_TF7\;op Z ]W1A"gl:W8#Lʒޮ> W\=5U[^ W[\on 1|\'|k\-S#@\=0<UcG _ AeXy *J%:)cJ W[(&<v"oYgQ8೫O᪒jަP#EbBA} )P_SrvUW 2/oPΩ.YDs \̘5.]{łCpTmQֽsճ_F:'ہEP 9o0pHoZՏau8I4tit{A#jL<\UF>[.J2\W9,;A?וזߏ˪ZՔU*}0 rt1w\]D2eGdLu$.ܳPUpjepMhiÚ})p]v 'jυG܅`ԋUxd+A&2nwFnac e\*-KCp6˛(>S6MwGhV*{0cxpy!ƞeG`H[lfO{FiИM"b߅o?p5+c!8\ujm͹W>@p_vZ|r5y#:W-Q8m:۱wfD3Sa톫W*/ouʉVѕv#2451pApwCw &C[}uydϫjdawHBe. q\d:mܬڕ< vp#\&*{nnIo1{KLmm[|UNUG>2fq8*LF-ؾFHXW!D ُC_rI꧜(SoZ\5VoyW!MiT(up!Ua,W?Ƽ, KĮn%v`iou3ćxJSrz=RNUO.>HLfUWg[>Ѫ7ZS[,t7[9[/J-nparoA5bi)yJDp!NUz\q#rɺR׭cKB><Ғ; #oТ# ^t((1j@ٱS 9Gj9rKȪmdO4ŅdxY!?[jXU)SUcN 3o m)xjG%Wybh9\@Ze$~ixcpL:%\uoP'*µ}hN:`jčPTWa:.\w*x+#l@#R1Aî"!p5{zOʮUz>^VMS%p5eu|SR62 W7Ah\:x4ZVc ֔[!a\Q/9|z/qEGWiSґFFS} Fdc .Z_D⬝fCmiկɲѷ!yZi? >ۼxΘUӊ3o~*OiU4-DwfpF5)O& j2lAOə jae߰MIv(޼m\ pY!AQX,v[ 놫nPG5g?.-xG5 uHO搛xQ4opݹk1]Ɠx-a}Z|m!}.|%)7"Y@ Z6OJƇ8W-,n-c\-5%Տ솫]bf Qq!L>SFN|z2`Ut:Tz\u3Kfp5H$zy.?//Tsj/ b~m<9gi.S&n/(߇[!+i5ٍ^`p'yXmdkB<\-;#n4&|$Z\ GI*MEFd3 }Df7"_B5hj _2VjU FAϷ%Uu&'och ʒ1Xɩi=B3=#)Ҏy"4#~mpP@cIs.߻b1lECU(]WpC-sa2ۡC}*d-.pi􂫶qs WճCC7O'<( \E>ZfG*4CVn\5#o y'\|=稑;.4jI"ոOUm1UZr[ɾp.Ѽu,9>5jim^pL_Utw,H! w7`h AFJV*6աW~U w'ppϜSpZ·ꆫȺj[C}pRr,o. {f/͜W!sV  Q3 h!8@Я`iկuz3P-fz,I{UxQbԎڒrzOr;2xzDX@*NX1ހp!qW1g<Y[B*T 7"ӰK~qdsxkuT/U++qp^rܦc? WcA:l)WJi8pu f W5\EN UdL@›oۡ8tNp^*u,Vs[uU޼*r.nEjpqG1!1"d4zk.Tüu\*!M#c.X!NSrz"Ҋ| 1EA*-J'whpkpZ%Ciʪ)-0CLmjSȯuSÍ˾J9O%ý~Đ^".5Ti|,ѴO+'cBfU1S W!c]NM8"pjᕖp겳eANgBi>pKq]<\-\{83P'(שTpU[F$|?Dî',et>DbִP2$8y÷c@s}V+Oqwho3xڡ15\d0~p%!;*F^C]5vU>ï#PLx`Gi8~G! .4eY/E?)9 3Zҹ}f+4ǩ>V2-/'c*"ƾ2qqp4zpf(mII WkJ-9+b$z9+~@7ke }Al"UoY{63 iZWǛֳv[X~qehP ֽs7@ 4Ʋb8ϊCq!q@bÿiǺ퓵 ަi:#! h[-;dPOC3/HP/m.b;xn8[66k /wpu8L{5FB,W^ۀVI#C#dGZkh+\ė?Wr;p*Ze82];@=5!-P|]h[dK8 pwу?iԣ[6<1Uݔ7h㲥?[;p  r\ (u<~N Bޫμpƚ.._*КJ޺*o^p⣉.;GՐarpubƒ;u h}Y tMG9zUZnŸ˲!ɲXZՊ c]%_{UraiCꔈ탫Hm1paeigB pC ̡}Qe|!6$PyO* q73=1pմ&v0VSp"W9/N2ά[gTeB~v`4.kMGWM\xD/&rD m àCYFL X4MZv*ieQV_LshJ7\={XݺjV+@ɰRmCɔQտ;5 g@C2CWrf=W 왃^)ٔW4#&rs& ȓN7'X_;puH.,ڤ?M0\x$S1uXnpdFoJۅW]tͬAQ/)w#e˾f:1#1T4RD h3i@?">UMy -QaO k]Ÿ}_q fJ"ߔځUHpW'?9W:> "*!fD9shɤǥLn48?E(zm >!0'f=ѽtnk\%nY.pubUZ :|@w[y K j |n]vVKY;P|tygm #:-m[m\׺'[z5eT$YH &xNy"͜ר [0hf ?\|t)@cwґ7W 1-oeҔO>kԧZek!Aex$$\Eb/j漂h]6V)@!R#OU$tئnA+!.[xnȨH݈CQQ :V5p2` ?>ը_?&$JE?Y/Cv'rItƉ Wa9?XFH+U5װPIy!Nʬ WMg^Btft1ls BRO6V)33{L if W.QNz S{ȲcJ C[gkRvD4Va 2 yu>=*"/*fڹ@3\2~j D8w7o+'>Tt8:b4Ua:ᢣk*CTdqpJeZelϵ_dpuyoHjc,W䷲]lcU8PSHX7Q~hEh/Z||%$zʟ!:vƄ @cpU AԡSsW ٬-/\r"#z:"~eޓ+ 6 w]e)b=y%JJbCy4%o8D)荐$/PybiNpHF.W- ?8.U<\->B5 hcs+݀!OgyH CB<#O%QuU7en=C3zY'> 'A}Ak OgΩ n/\q!".t\5U~k- b{1Ք 1i:h> W+&_(-^u6 A״ N8+ΡƑPW·뀿!Tt>~(׹?!w~9gկxt{;ږhux 3Z|t9b ?M6#E_#^Ņ X)F9hc>Kpjtb6&8t&/Kq ܮo`A.d\MV,.qVTu9춎PQy .|? Wys]ӭ4mȖ. ~xE:&P WK廲? aLң+6@Gp{ ?'\uUd킷BWo(7\#}+M|0} 5<ˎi==zב;#A \sJ= _Vˎ/HeU Drpv`17OEY-x|*E=%nZ=[[W\%O;py!-2qB\<ΖU 5]>\͌A^Σ˿E,cpzjXf+gƄg 9yϔKD݂=kn b*'?!TӞAWluvbe\{9qSэEzY6&3V4|K;?jJfY;wn@uT/DR@¼F}aq@XFݒ~6e_ʶdU)?i\8a:™M=>/P.Mvg*Dy+%_AZ벣!Q-shP(7Dd[J4qҢĐ oBʎzY? < Ç}kpwRr\ZކKpJʖKC/M{G$ (6"֥FDڬ;!|ex6]7TLx#N(\()#k|jn ij}oܯZq"nj y8cݻR ք=s㰾NSac+Ch՜_cA.L0D +!v*h~j}_x[ k>!bSMiAU"=%sWճ_Wi7 .No nKV%~Ɂjf 4h.` wlއٳ_->_6D.T.W\9qW9y]0ͼ%)@ `p]pyCppSqɏ"B:9JάYxN5Z>4Z.ty WsxUn`D/*z׷ZAxᵽE] J42nbї> f zX1䳧e }$î-!Ð MbklWFjUS#$DryJ#l1JsQ"]b*dUNqTYtiQ"X@3!w.أyҊ>ig?#1p[vⳝw\g@ippurC1”Y ՙ/ Ke;UӞ݁PM}Al1kYcQz@4kp6h }WM@,P=P:fӪ_eh!vj\rP_gXtr]5%7O+=2ytv^oMkkjˋ\y3fVF,'&uK6qpu/b4͞~69o.hCeZ;b:jˌ!DHR´ DwhmWͫu*o(]YAHTSF##N+K?rEV2n\Y %Mt MkH[*U| OQ6U77yղch0Yy+)TDt\@%%D=B`@zNӪR]=pBp2:R0WVХweVʦ30s=|dUMe9۲)`/j7NL[5U$_I!/7oApuկ4!m"zT3\-!J>-s5f9)&<##@TEgxOч 3f"Kr~)܌Z&ōl 3}iX+CyA*UVo|F{otY|bFG*i&kθ᪏>qRjS^!uJ%ix c@ 퇫\9 v, NSs0w`548@D@h\xE9998 |%oc(BU "_ xjy# {-.F&x2I\yKմ0>*kAmCJGݚdMheJЫ45Uڌ{\yk@j0Tt$A':խi)iz@sM^"~Պ<{jBC2|JI.uCk5uD^tx 11Dopju!Oiqδ {nJI=pK-pUF ]WҴnrxh Q,H{7 DJ\Vrm^]#.q7p}W1l!TSRx~bp!:jxЖ%g6_gNg $J5V Ǒc$° țE.1oIOw#)azpTgCm\;&:ULG5!iC W ۡDEso1jZ+n4Ӫ~mWz A4MO8O=*Z[>nѼ\ [nP_[h$'oPg.Yd r"]}`$μ`$|-P4jvzMk_ APNzTMaňjn՚?*A "uAﺹiϜ}ps*~"?5\ȝ孮 }]\iFuvy8m: sk eoހM˞yue9RI&n277raH\U>n A!#MJ\~'a'UCW|ſ \DMu Xt;\)\z\O HֲD\ȎGUת)wctjr7<*lj{͕|%M!pǔ .RbjL W˾DPttSkzԳckH~jYq8m5r B4\\{8Pu vja6~I֦eku-jt#Y/0.\W!v;WV'^|NjuCp#jn_C-U61w!(SdH&>jshhh Eǭ =a!khC1׷TíyhC5! t%3l$Tg`8Krcȭ NF#9*n WiUIJz sF1~/CED#<<$Zn8A}"dpu^G4D:E *P~J2#-hmcx< ~zq5vS#\};N{jwh]]e%uծ0pA.Hֽ0tE?88Cb }1=88T9aC.;}pa˻).gv]~y~{]7\myU'\=oBxU~;FBjzxnP0sd~?WhiO2Tmщ @AnE³!Ze jKCopjTZ]7ޤU-kUSF{E|\]#/tsM p@'m\=෹Ǒ,+mP5i^p33&|-uKpՖ-S2՞m'V!%_t9kB\ *ːK/\-:D35tlH8/$q#UɶͣFzt9:?kWhC7.2, Ld%ӓǐt wO@AT,ntC\ i95“BOrpӬd,.<,{_FߨUmfΫlE? u1bhqz`~ۻaƘ2.D4ݔ# ~ 7V[UN<2/4$b6i٨[m<7Zbp1'{·eݢ[UwCm ,gK{p(,|VDi?\-6[:НAI2·tM4=| .q*]pZJNxkɞF!\lN/)\ګx~jՊ6i*r.CgΧ "SUM뉾OA2hpjXbYuY! Y/-:T'\A5)8*ےL ߢ%!FH!G0M9B?'Q9=Z6UF.-lKCx,AGbH }RC*&<탫UO.>ΝJ<5p} W&hHq'7bށ!+Yc'*ݮ|=^f<\ 8fx@5$;oTIK.vMaL<j(pvPzv0@!P"TbYxG>ᕶ85czLpոk@^'\~3.VNzIweHQPA'P*qSLF5WRMoe48eBOpZbY7_ leqpueշ}EB/^p 4"v`C{Ztx># #$;h!pʟ6Bȡ=*".Kt^A*& x7ݩt,l]S`G?5 iK#\7ߘrƒߠC)Њ-c&\9F~j:eM=;b*Z:VW4\y.V9Nhp'\ujVB.1o l{uۤ#o_\V&U/C-|+:޹ 2Eގ)I)ڜD!p"ʔ$v-x~rԤ:;gnݿv0NR6MwᅔO(?eN:>Che . +"|KtMWa« pef\٘_Zj/Y^K #rËTfSF}*z&-xW!*iSgU?6lHsDu7]Oyqpu>:VQWA YX;(,Mku.;|4C\cr[ɻ͖2B*d'սs,G૯,>W[!;*UkC<կO$\L/p({3W GNW7M8\;-R݈nawU84! KTE>³Ѥ2y\t!MCԃFE@`0  aaYv"?%C/#o8:iۣ_*'?VײBSs0\w'VA{6Յ~P9! ߉K*CE51? Yv^1&|c$1.ΜOZܜÒ U2P-qy. % If;G.nnчԡxVzi<\KڨTIZF7fdAʴ&$?5[\ex+e=CUY3CQvַV R0.UռV`P\]]!Wg)ƨG~+ f zl43>V6AcZD0`ц.әfz0 Cȝm&aƣCP=ĖUt VNzwv1" Ҷz}|e ]bSܜ@kFZVHpDDŽ+V|Jm߈Dڦ//Z_U}W݇.'*J?OpuP؏УpBF: o'ґ7!TF>|&V;Q5s^:SK_ȎH)A^ I|/kGkfmcIJ^ſ, c]I;MJx[7U(hqxPyBc0}"W6$a Jojc&~mkW)y^{u*LYٯ -5kօyi RtrƒƄWnMs#@^DΩҹp5H_0o_t06j@޹T'kcj 0*t%$>1WSF~:0##ZZpM_Lh'&_K{d4oO:JҨ gsR4Mih gv&BL{Uh!S7 WcDčàSw y|=PCq SFBK \@%J6A`9$ie4WߋӦ?鑒' n >pU~Y>?pULp5} 6)XW}虑i.}g7\W!K,=1mgQ6l<[]hX<.6ij2eϼjmͺd'\YALI%î@Fo )ߏ W""glZkUanAHiٚ* r˯Grs"tRJ6!GF:]<.e TVSjU^ 5Cx8[d YVCrp.Np\cav` _#[=\ Y߂EcN|k)qRmIBo :pj(jN+fyD6П|'#bp/ ݢ ap ?a\eZ'\qym=~s^v=r \EUmJ'\hʟ\}OGB.qp[\r}M%@ёC8,Zϰ+t<:8\v,VفZ@JӼmN CnVҘ#º7\+JSsNAxwjOvJZ5XS?nv^o]"Ս5H9D5%'״~z]Eeߠw.!~ྐt\5]e {`>kW'40F]pPG:V7Z!Ї+\K>duHTW{"] WKWYьWIfOʶ*7R{NUHZ 5!W"*y5A*_xԺJUx EFwda#fKD2 W5s{;$۪,큫.xr̗lbkKEGr@4לBL L`s U_v|ۚVdB6dh庣~ ѧ]plr3!9hֈ!?jɱûTNloUAn9N[N!~Ģvs{{UHŒhz&K< @ YObep3*48aQK0ShIHj}mSraVڤ]]-/>gXmBOjI8\-9A1iPE Q\%3US f+)m@TM{&\ȗ =+t" W7u?E_W@:F;jt*!Zߩ|=W=h/)OBDpc-6BFߎ; Wè[ _!j򄫌[xjqUV6s_}"m@ޣv %gCa8dO1An.Ocsי‡oMkW-ѷ5Uv(>o`!*S/a4su=jU:oShёֽ&?OepxU/JGJOZT,}pT2┚᪭p]]x+&lѾ$[4r/`?r-(WC WKe; ?(8eB&w(:a \U9'et+~ߢcB0q Ҧ1Nh;W \mKV '\ L?;| 9՜S jx_Ov-Zɩp+ (WO~y>ꠕkgO{Mp**qv}' {h%*2Krt|R=k7\nGm5D0;$~oJw|A>1^p*6uѠ˩RJ@Z)h.4D$MˎHǙ{pŚoxxN< *A \b9%?eTAhzUҊ\,_$oVy]p~˔\&\1",!\ im98pC$zy{ W1yqagE=,v͜Wpd7V C ?vs#wdq\-6 䪦C[-|w"N W-;*;5%\%;Z2&P; j7\4B2\}VJ7$ep*Vn\.-˲B."DՋexV}b"K່HzOTݖӉp~* Tj)\EN}>SwbprsuG :mY@3gsT."|Wa59jo*#B \1&)wnqw~ gSٶ\>M7.F34~%W]!T4z8h} _o{USF5'^IVbQl+[f,˩9?#;3G=%9nwə xźpG˯no4[Ջ&E> w2piS. ^<3pU^o%yR&NiDٍb4,4N"Z5!۹Mj;1lVa n- Q G󂫴Okn8=~r5-ZfΊ\.66j4-S"wpƔxY!S1AVVSɝlmHO .^Z8=LԴt35U㔓Ҕ ?F.0'O%bAO-xRy%(UPd讥FP\uUe:W%\Y3ku WMGܘi/6AcI_mkYUGY_ W֢{"GZy Rs޺,p#տ[g\%3x2 dIub9蓁*Եt׫c? PJm}.CvCUIhI6Y\㽦Ԣ&7^tKh>p5ޜr Lp5$4?YIU$)"~!|.y$F6N:A8\řDе "1`d5ULk^1YLS3\ J{x~b₷p,]̻^p U;QWЯт)OOړ~9?5FۧL. =dpP=E(s[\~*4Pu̸u ?aw.\E}JxY}m%W) i~dLRA~7CH WOԳ_rUhW ͨ!>1-;ڏxUl~egU*a:Wџ B![S]l}ثp[LR6߃sNLWT{Bb?D,W('=bZ pv0榞Jn)8zhp'­ʦ%h?%:O3 e\ }0hln²i7"=U.k1z,{FÄUt68d`f2_S 87$?1=(솫AnڹW$Z1˼u u,(o_†%kcMP[n+>³ffCJL_7=PY3u Jr:5ܑ>?eT\~zqd!Z?)9UGoƕ)xRC"{r؝*#$ۧw QX\204]:jL~CZT檍7eRML]*)[ ])^M ˎH(CPS\J["B46nr P/r ]aO=ȗD$Co!B.|a7R  DPtukc߅Ej]T>jyIfW\5&a iN z@MM5a wзk\ ^];Ӟ)Sv{"mhy6Bp"_֓4gӈF`ZRŒ}j}-dzd"ҸX(|sw\yRtZ *'<^GW{{Xum%tHQ{{ @d {{cz;mK,ZՖ˸|ϾWҕ-{G]s]D\2r(˻Pa=^]Z( $Sݲ8 j]- -rպIwcmO 䳒-6aKZ3 lf1)GcjeJF[_H,wx̸)/\\[#@@UD,zi&E}T\EwMG0.9 06CY!WDђSqē,Ùolfԃ! @b03DMаrDf/wd9jEhhrƨs )~t3|Yj\-f_+dk5Nv(k;+nYVX&9oUEoِ54T|RJаY(dG\]ށzdU7ukD; j'Wŭ%& g鬓00fԞ7 '\g`ݷ?i#-ZME!ǰkrԻJ'${V-^$Hns!*Xz4)aXV5AKj&!6!sh /!`g\=86\š`?kJOź/ jf7;+MYDJ/]矙4)%.]\(8(Hfu++!WM5rUH "9U4aB g'f:ЦiX )0d\-LfmV8E\8l{&)xobzV5B`ag_F{pd;>[ƽq y5$ c9=+:1։vU*m,GUu+x_ p/kǯe R7!WG?v>Z{~{r5Af\=03S}rP,r-{Et>1p<ӈ&z\juQO!W/ ?+[X[]H{91ƓEJ)m 0O{ȸMݾܹ:霽S2|]_!a 7lT/#%SEBH:2"C)L,%$W[%̓Y.Q%w牒ģ(_ 'W|mLsχVYtuxib~جq6!W/bgKT /u@ՎW)EKž-H.>y"+ :^Y8|=l:fɹk#$ %/LݨF+h  eso^dڅ!YWdjcFn4=5ugp7G\-=#{abQ%W# t!W(ӽU4*4gdN F2 _)bߑ49"\6\\[Uf-RЪ4ԑE؍Xị hJK@)5*0JJW$iX ̥{&7-G]? ~ !'\ F Pwȫ394˵Uyfճ^c,g\5C|tg  uږ͆ifr۟*SHǭ^tFQew+\[ bD1 Z5l}_ OqQ;9 GDdC5ϹBTHq#.&nr U 9:Kb{Z|dՎj,J] 27%**K*)!&p\&W[<\wiK5u?oUy.s\=}%uk80ҵRߘ6V!J4 $(HY7$WOu.@2k˰|7RrRJQ d€ݮ/F4-hJ/DWfe"ŋUףY\e oUrƣ!rUjI5":AI .ooݒ\Q}*gr͕Tη؉˶O?</ъkײ]\e>wSAX", RJ6z (D\T7;1CqXu«La"ru=B74\-J\ zdQnOcBo}:ZL 6%}XӳH"t,-_" PTE\X&ٍl!R hDp7`XK)~O0 th >Pʾ3:UњAhyEF]sƼNDIA l[S`0|fmTi\{JK }n'W3n Br>gt1(sߣKYxI d;˸'WO&Jxr7}h.+~.AfP l5T[Xǽ{j\ڔϱf>BO%^Olr ' JV<\b=BrD+)摫tыOC) W{d?QH'PWnJ3!W Jg IAoe: L^gN%50[u)TU4(bp`ДgH*%Zw!Wg:|ؙ@X[UT-j׈lϲQIGP׭ŞDVt`3([[^hb UfҶLu{h@_%Fe@4!W #Xr5vz=_ăX;Dp**ŪL;҇=.MG<RK1emrKSߋ W+ SzDƾi\hδxU٧ lSC |`rlj?TX~Iޙ[(hO|i{4.3{?HƒNʒJ>|Dg#WO}_^['U\MMٸqQ?44LΖ۶{vߺcʷwIοH3˼BnO=[;w%m4v&vOuKrͳHeA+>54x0;'w4 _a>ؘ>ԁ[uk۲.É~#c넴/86IxuƎ޷{5iJMxy2x89&p̵->6,˂ֺnJ'7qܲuyWׁŚVV.3>Aυ%hcƾ>Cyƾ?MMxKӔ}ikJ+K;ySv24u7 y̺q&;W{ݖbQY.K"&*|TtJ<zcmBoN|ea[ 2y2˙4]妍þfi[itY/uy'B߷2'9_}x{=60.MK ÞIt]c$ou9U㰭쉭]>cncD>:soAOa:ɔg\νp]2vL Wɛ}f?e26Fg|3>&&H^l 3jJOos=I[ßb2{E+:;{Og8 tXdžaw`",=30@uq׾0,/qA>1 |۷W9wgyhe2}R:\i_i9ie?SO N}Y#9>;=w>mW[6۪W2.OvA(u&~"?bY1YaxGOH:}[l1=A C~g8QQᦆqF/`26s CCÉ)w e4L|/uԋi=1FmWgG{3]c8=vyt2u.[P+[ۊZz{py7lqF'}ўR<q^,~O͕ƈj4@}h[- ֞9!9q[loKn}$ XTU@00AHnmuYe7|hM\g|ƴu#/ q;cVH3>}_- Cc2̰T`:Eǒ$T *{VGR]j6~5'0Ӟg־Y<¾n``=wH5^k<Y"n.w2#_eX!~<8ޓ[@#/0 "C[3'|7þ~jg~;G6)Pʕelpt,Os%o3{ sL >+:d[׆S!u81M?.-d]QsbĹ3bwHèLisYrKG&͡}cd3O2 z ؗ#+Œ|4Ե! 2Ipi{ w&HO gR#-&WgÏ9w^&9}ޟM]qF'OwfoYj-늪rYj-Pr^ 3m6%ٺeYLuiowIrKrr韜mXyݎ;LZWH5q6n72vŗav߄Lxekͣg]+=0nqڷMIxa|kKμCnXuqYÃmZ M+Ӥ=oM^ژ,KdZaM6U cuYWuyyxi:y 8ˢ=5/,ԥt%M)ؕH!Jױi^7M(Yf"ks|6̿l6AQq ۚ|hyQ{u@ˊ}XoJkp%mWնnhR q쫙YAĔM֕kifﵥZuVՉoƍ#uS <$w~h[?=qseAknYaIm.r$<.YunױkuMƷ^W#c.!UY/fq,˻a۪=XM +&udʳל&cWz]yXWZuͺdmk0X6w^% m.fn_ta1 fcطv4Lׁ%,[G1a[?,`\'2cvgO# KOǞyI<3e~*։!p8 .t8N>+i60~5^O:u~jLZ=&eȓ ~hϓܙawh#-#`Qrb>''n^}L(9S))fJƼ3##͔.׉tڄ?WcLV ;J\^{M=m0V'º 33EUyue_{ተ>E}tꠇA{thi n7\7y?lk^-㱢,tpt[&C#qFS-Z ߧ/hLE|iߵv&ӓvqsr\%>&Sl/Z\ih'Ot 5gT+[Liњ]2q$c"èK:iKHb_OG֞qXn^34ZϤM0%%vР)*c"&l~vӧqpfbedB]'6s=8c~w#DzaK͆}j5jμv0~^5} K~8e)]o`ÿrL]_bpѶaג9x@ 챝B{ӎR\IzFCߤFN(+BP'y`%fj9#Rܯ <ѲjeaY[<e뚁Sq 0H5a uգG# l)-dYv0]LJtEf(<t; - Bd|=6Y:в6{kn1XW&mN6oBl=ksS[&RlSO/HZ^:}ēU]5ԹTb?Vϱ{)gϔv0:I }ns9o:(kpMy;"ө# ԡINWߋn,PJKm0 s+5/A=obGNϣ,8*_UWMK_]Uy8utm\ٹ[WJ2蘵eh9gQs~(c:\{hN>Vi S62Y}kn@҇?!9f{ܔEݗi&2cE'Q>Vʿ}}h :8HuSAMU'^I(_E<)jnBV+_^ %Mc7P[]kJyQ0b)iMߝ:\MmwgtC&e"sɖ[lJa# %ŨR猽̓4̈@aa6>gdMȱnN>XQy:KUdЇbT] oTG(#uX33d \Goh t둱<$QaX2e!yzKRٻ{;#|emq`X@Ua7cg`㈵PTa=R\jBo5N8CXl0Mt|Ӎkj mO,sjTk\ _>m$W]tuDpġ).J^ap}d,ĥcS;W{t *M  L'sy Re ` \=03kTY VڬEXG2cbFޘSS@lIMNC+I*O|k{Ko\vL%aڎF՜=DW\ѐOb70 Ei Oy:Qq^޿}T#BUՃRZ*NK,Ϸ*DL$"^GҒ/i%gN UZo}?Ͻ DܰZ[#t0C*K){XJX* E6 ]oHțGDŽ^>$TLg=Wl>01꣡%o}!f;MNY!Wإ1G4owc uCgxxt\UM \٬yIc\{;&v,XxytiƱ9b#Z-lUOr՟2'j@eeAZ'Jzd^4}UGyh piDY1sC"ȧ 0U"DfCs1-[ *HI\2ft\0~(?YjfrԱųذmǎM˧z;>I? WζOo} :7}dzW⋁"85v 3%<]63Z# A>։L<ĪzB7 UdC Pl TrU?O ,C,g2^T>fbB胡3> 8P6n( Uel(@/1 Gωh]'k^ƴpD8kf9$4PJF^YչC?H>jVxn^ӆkq+&4AȔ_^:/wqkZƒBz tq"4XƽM-4 y%}^ym*o],y3^):#]kXڸwkM|\u'xc7bYB|.bPEȍyVvf5K 0e dzczr59 kw9dUuxځ-D%i t]K3[KZe(wmϸU]-!E/JH$'ŖXFswbUWvO5 W 1Lb=wJߺ7m.B.(xUUtyZ @AKKlX,Z^gD J蘟ʽm0 }@pO%Wu!Gॴ}\Ul#g#jT\YEՁV30 If[о58Ҙ=0Qr5_!W0<n !!BNHΧ.L$wE Lةcﰘpۤ70 KGBUߓ9*f7ɫGc XV:6nBm[Kk\;Uٟ`$z6zFpm(uApdͪ1ҳgwȘZr9^0ӎ{Y{$J w~w)v|7#uTDETz>|l[o@Α{e+j0Gs,cf-Db7atB& [8mizcjh%+e V3XcU?69X*kV#3ޢOj2f \߿2ǞwpN=z4زx )k1k4ƒU 26 3BrUXw6`Л6AR4 ~#iʥx㏀yϵdsp: \i0~ǿct.$WYA)3p bqPJ!ZQ}|kDf #Q_UUArBoUkڏ#<8m}X<-֑;|Np+qݮWU\$A\@vvǭ 6y O0ԵUjR1@( " AX RM{._rឫ3pe;jsMt>u|Y#'vƄL;f%A,kӨ c柢/VNwiDJq. m.ύ'T\9ʳp pQޑL6}cŸ*@-s]KM%WB6 5F@foױa-dwuy-8J\I9Q\M~v@Ֆq/G3ѿbYV ,<*`􆐫+:O4NzQU<:?2}ScirJzr>d&\]֧ I$5[~\=8;\-uP .A?ru;z)5w*< lUAYAazmS /y\-°ꤖfi8PՌٟUw R:]cp݌\WhvUS}6坼CsNǽ۟ 7)|a"#Qb?DEW3| W1iBBP'.LT2Мխ-ji◇}qRc8Q/'~̝*?$+uoە͐DՄ\*?Ij\],B:f>q9U.̝B]ݵI0p&'E!\bJ"zpAZiC-\b+;=n!r۹Ǥ:!<ۇ[Sǖ/7u}7I)pE[eT)bn3E^S.(W 3h ^/4)Hru/0ƅ9fٷ^h Nbr,r>tD'eIJjKK〻 !WcJI25P1z6ȧIԯw6B iO/R%!Wk l|)M,FUגֹfVGy+,D%WDj5>HUu_uֶ`ryH|լz S%[mjTCLN;\oۧAtGkVڳR 限," Bi&:ך$WRpNi9덼D4;пu FxI^K EGT۶\lsΑQ-.r5Pkλ ? Wn]|Q*~"\q lqFud!WIc 'W"j;dTMI^TϤ%<M~`ǽu+1ϦmJ؋E:^i0p $D^1RA0Bauqt]Xf D 1? ~kn4\i#$YV-#WiƬ?Ue** hn$F00!8utQ]Xd B'J'D36=\]I攎W:]F^CB>,c$k:W[/FN"W @rOgB }4'Ŗ}cuՄjHJUf鬐h7boV{3%W/s-Zs[iBI #!'{N JFU۔wހ慺/ oX^]'d\"W|zAbꙥS$/k1Mr 'W-q1It( ue.ɘ)*d!WwCͣ~/ g-6VwqcTђQyɘnpsZ[]TX1;r.~}rտmPb$TB$:$WӶ̓TOA'\l[KV燓q/LZjEKL;M~|«x^#c]u<'B䮒L/:~"E<G\lޫ)r񒫁\=9*jy4] S^ҪɆ>~7+O vh$"&&((cQ+㩣K uyTrٻ'D+9:k>1cKp-$W|A UcKuwz `{GJK15摅q/3r4!j?'Wاru'oPpIۤ@MzCu.m/Nq?5¹kٮBnUd&{$e+鉵+y|&K/ڇl&sM}&WqHoU1~S5a:Y\Ҹ}d ֗I6lDnic-8EyaK7H*cM~ Vw=Qj^hJǷ0۹Zչ.\!N&3.ru?rΎLҀ\]AbGDIDT/츒OKi90]BnyHiG\;#_M.{֟3Tzݪ)ZFg1< @OY$N<3҉ZUd#W[$WS{Ċ{b`ciېi]\]J)@Dڠ\fضsΑQM\+̫8]*Pt蔌?\=8+|p^C VTrU< kJ*rՑ:5i/J7Ö1Wj%bhArubUn!W'F+^r i5Ja5N|%n\u~ JS:\^چ 1g$>X6NcD#6蘖1REwKuCsjq6uk>+ixXerI`LAPI2>ĄՅ\]ӳ*)ѵp4"W/쵌\nKH n$W%XXOw/kZ' .xU޲q`(~&Y R: Z8b5* Hk\-+`Ҹn 8 #\G<4g EVsׄ'k[BD~6u >P~L} *Qc'!w]#4 *@V3xWuWArոjU<)XUd?˘P̍*l,?QOyK(N 1)r@qrՉ=QI73.5Oxj"3= lr$ clÃټA590H|::Q'vkQAa g:X[L p%%V0?-⛐L!W!W$hr2 Ie(slq'7\@Kr 'r> Z䪨>Rb XK0+c9u/tq+W%WD :3R]jI:f,I [!3 (/U9b̙=P2*}gV~Cqr$sCxP rK&Wͣ~ծסMBvjZUhŞ ̘XTC*<j nwUޑX?,U[I3.bN_z^U:>ofmᅺ WK=()?D6L;$W>ZhO~F_Ֆ8UЂu܋RCԒ @!pPkHxR~h.o W\qsVWԟ,?|D9ZxGwwitދ;V;#SE`ٟօU)_ԆoQ]+PLGRoEymۤ֩F؈cS96"ȇ~q݄<<({x5['ۆ7Rb&PPwic,Sޡ9t#nR-"WAT*ʳX]Oxu9GΰƴB1/o WR"vӠW!)Af0>[ WjoYV!NWՔUM8CrYIp֖aiKn{11Nq.;U*T2ͨ1˘&z5laKĪx)5I|D;D_ԓ{t'A=gR !Wa]-=Nt)Umobg?NUżlwhiÙ Er|Z3}S=oN0b8kL ^ ĞuȂ8U$8}wH<3b{pa&_cl%PL >=Ĵ :,\-LOGN}7_y}Y],eԳJR]q#޿Θ>Ly7οKG<)&ƶ#]T梀EXA򚂔uPgs^[ͦա5ATIJ}Nd&#ѱCs -#W񌌺yEn iL9 J( {zQ[UA$WyɒdRcJ;B ^Z_$tu/ny=wS!\7M1C_܃skp''[7$Wow6j|>UT6e)q\Bj rN1!dB,U.a!py5ϰbKַ!!F΋^E)/E*x3 ~ P(A`5^cǖ!ZjRDžUUHdsk{MCOZ\u K6hrp-F`,kUT?WUDZ-r S,4̵;t*Fv^`_1:4:obP/fYrh7#Wquy l F>T+݀xaʾP8"B᷈,>QfN!OAHZ艒چo E|ڻ?'zDcrOѲͭirP&XC2h1؈=+=Qܔ w_,}m/Mq:㬓7u9rt+kGƳi/./ɿޝE\=$cgG<]P b},)XU%KAk3<f=4G!WKqF%Nj s*iVJ"r.賔ׯq20};1UY4Ve#Uco-^o[&L Wwܭ^/g?lOH\[ ӛ(uG_Mi6 e7sUjre}(<+;7{(U!WgƺE?5~V^0 4$WܡjUEYR9^6g$u,\pӠ\&XMRNze#1`PV["*J N_J@@(cKjJ󉏐Mz1c40us U0䶗 =!VMl!Wg"9[Wջ>& i$+¯)%E[!WY&8P1,˪)~RphAr55{h^ٞ?ZVم)PN:`gר;WQ#0`QrZ q~!J:6Vl̳cW@He{CBȬHr֑"ÍH W%!L|]MPa%j =ʐd2R'K{D['F Ӊē^Rb֬_&%"&-NcHthn E¯C L`˩v,| RJDAj9}К|omj¯Y ٖԔCkR\]K%Wa;Ng%L)lTUzzl<~<0>a6UC:.)T3nv,f,n oJw˘?h},O1p//!|iJ3I:r!E!1 ~XYS^rgQ r-#IIjS2\Xg0r`c AD^OeaB*=t`0m}nׇ03*BL ;MQ0طaEw!}1| 6M6+e$jwE (uUG*U'SXD4t B25^0ruc'`}i{\*y_%Ň X 6K(2laPRz']:a};J&%8ul1&X[ NUd#Trս a ,]C!WД'MX[UJҕ1"BZpkIk"sLCb}?Uf@_yWjQ2o~Wfw2N_ul/67Q/alٴ'G)m=W $NCJ]\xQw%!ODYIe76"Wg= @z5`E?XUeRE\fo;4W4܁RUC#nO<s50/m^WϼHo}_{ԓ9֙┝1: "?q;4ǻr\wg'r*.mx(ׂrƵK:RӺ aerKR_RsbN| F(J`/,񕐫3|u^#`#*kCT^L&I+(k`:`د̣em)77ʮ´*iQ\ *UU[@4s"Z DžU<)`WU/w1['RPq&"+]$%$'yePlڹk@cƇE+sv ㊬2E sNu+!dSqCrUMPSE(N=o6@W~C պ$$hܝ qĵ5`'=;JwvG=c\~R"#A ުR$N<bJx̓\?|fm& B84O,2Y%w^/.S 1RqJ])EYcjaťfiPy$ʂПԬNʾZ)4&9"]1U>IZkޣ$FyJz@v0׺Tʽz)H 'W ,VmEq#*<#$"66MLAui.+8Mq^Ln\}Y){663dՓYS+2ne (xZ6W^m3󻿧vA@P,^eue^ z|9k<*(ls/|7V]!W5!B稖BJhLqQl К,AAWNx%_liCC y5.S^63Dj(> |*).ǨZƾF(2Xmeɑ96ͣU6l "oxy §zrԱ%Õ\&Yy>EË\.6+L>Qxĺ>] 10RsqlF9ӧnCSHJ%8F 491cGd;XX`b9V_V0јǂi1 wRޑ?*ۏ9ҍ7 D) ˽Pz g $>Mf[?۔ XxDHM:]VMި*@+b#)4W$$WRU<>7N_bzi[Lx| ::Go36(xUN߈\ Aej7CC;iϹcmO;d>sjEǗSm\=$j|{wM o"UqU#r"4w9H^־ɢ*~\ZP}e NE :UJ'8t- Oy; |)? $%TZߟL wǿcѐ !W*uArU$ 1Nd>#29V\|U][] m a4B,s*' ߡmI:VeV1kS%W| 7\up7 S7Gh=Y 0ͅYD]Ϲ&WjZNkf{pLW~"HQ@=+;S_`jC2d ]X,@}FOC⧴D,gϛ8k 0Fˑq زO%WOYd(7xZwK<-DTrώ-u`\СŤ8z?CGx#\ZtMUX駎.V1 2yj[1OY˦:$a]ԅf2?Th( 2odSW[ի0L}3̒Nɪ"Wo:6 [[%j- \e}Q-lv:4W 3cD;GIw%ōRgG&:0r2%T/5 KR]䷎ ngYW4;#bňgre*hfTFZ>M L"U4>a>~ (6VF-P<F3Mrիʱ['&~Vby0 `e" }{HcsWmRk0Q7Pֹ9T{+fv*f?tCc=>qg:XFdžX޻I!ABIHWA6("w !!]={{rrK{++9&,9> u ,m OA$iW3eFucf?6Pp1ufөO4mt4A 1zJj/K F)OU4U &'@m2Dw&e6kIN:qQAR36:hIm):rw_=gwUc8WۄFW}iA Ț~>C}F%gf׺gm? qZY:q3ڻM/_ Wpv*6AbWWx.{aWydβZU>?wxiD-|%S&"$By^)}L79!/@~6-^.J,;9Kμ-z{T߾pe=xFpbRюE嬱E6&I0Hy[SSϨ!-϶Nog㮕sO.#8X=\\+!w'đDLFd뤰gP:R (޺yY]ȿqLH[!j~s7YghJυO&Ӕ]Zׯ~6@>6@bcD>p\~Exjd WOL0$+pQW˲uO^ˆa_ й_Gn 8{`*,%`DDR n5 Wo\<$Jr>]9nK983CUQ,*&~RFGyq>YӒn)vDz@Up#LNF/s金3')KZƼVU_K PCnȂj\jfGmNI*쨬 OHtrepucpcGQDS)J׈78VpuFsT Q$3I-0Esb 't;{P֎rƮHvxozӲޔ`_ ES5'l*UhF>ّ=6 8H=juQ4Dp !ig-茘e@݊3Gy8~>0)bgpRU\nuМX5Jr`#gG1VOXrVpWYQ4}I };F5`%q\%[g)fP*kpe{a3_WrҦN~ {Ҋg-#T[5m 2_sU>Dm Lz8ӊK%xaE COC)PC>oia@ > *U7sN=LZqXR]ZbzK~8DX@ kaPY!pf.[Yǖ;Wղ\'3r,4kWT8TpAr @ ~mi2("L369}z+Bv߂ {z w1 񆘺̎ \@Uq|ʳn8ܶxx3;/r/4VS`\b?VnCu$lxs)wbβ>_')cDms* G T7l Ǣ+vCBt~]ЧGu;̨N-uUlCv,0o`N |ڽ1CJlי.Cv6nȟJꤢ8#4P={#Rm$s4gy_|"ʋaca0]b><>W q^ݢ")E]>B\lo^# "Ƥ ΘaB!v \U[J" WU+"?GBq1aa91K>ڎވOw޸\[BOþ+%)$ef_/qU::OژUaiuhvcnhFM7ٲp_0^*íCyU|AUNᆘZKHg.S\k:6#$#ԧS-6p5DCZw38O?f8Jz"pj9*B EϜrqWUbԱtN, \E#dޮ#唟Dr Gudu.w\%*Y[Am \ \@HgPzݣ0Ȋ@*\EH]`Kz]f57ze'W!b?Rq׸k$wƀR!|\CRawOV*`WT\f ԤN_Z!d4HZ洖c뒼s> qTy@gu ):)SVWzb9)?~md, *xd޹*5j6#d$ARX઴f8 }·+$g訕4o C (IDmWUDevbxWǕҬx&NM&<Z52/Ges?kszUfXҸcQ6_a$#TV KٖH'a[YR" O:L\seiyO>0>k5̙$XeǗQoYq݊終^#JA?MnB:#0Z1Kf4n J*A̕~]dYuKZ>,wŤ4!qrg㔷+pu~]4#> ո|{(BJ󻶤gXWMҧl&Qbmq-t,*IdZM&:nDy3b #JN,5V{D^=a[=hkW-pu:cpyLWRP p5#Ϊ?0ZS?"n[-/KF|1w(ZbyfkUtᷝz fU2a{+)Feҁ=7;oUBM=s#41o@=zƥ9 T"h*8Ok 1_!0ZqIEݱ-9(bWwH;_VL_3Ա8Q7p \>쥽2K/B˅ \ 0Jì-׹R&(QyUMŊ3[r yĉՔsp7 c&|AE4RךSy1A q^{cQeh֍ZEY\7/+)[qW " dq!~Wg@oy ^s,,;kn6p^Mp"w |=R?cr؇Ȃ $W/c oB 3poN_ Ngxg*cڷž5gKO7k{0'zI|9p -DOj鑅ĺ&pDG?v㟽;'ه`RSNw_4:Ivi8_TU)*b[P&8,>&iob3ŸWs rH}"f+> K(JGڅ&T߹+ؙYb],hh|Av D~\XϺ^}>ufp9M9m 5F_NX_\-_IvӺx Ԝ~%Mܡ搵$TI-,,~gFD&ǖHzS ]D$>p2 cęj_*l%d2i~aah7KCkAyAV{PBiVi;ٻe} *a AϡGf `H qߢgO7\[T!TӤ1O!d#zYַA2kb4r >AA i`Ľ7 -dI:,/;!vJcU\,i3p,w4J &-k=ZZ{4=w V=$f=MɒP4v/ܟYU|AR)/ȌlsB _,vrԠ.Ō'Od%Q1F2SMECE<6gEխTAjuik}W.׵_y7\&}prVf\L$913?RqBq{: B)_cU1t,_BivbRb}QDUrPl$PdBOE\ +&yݢ6ϋHn'͊6pB2rWyGD91XxGb|*H7{yI @EpB7֠_tp!4W-IMƞX9 bMYuYR0|:xB-g${`oYQe"D8.n\:{hԞ}X*܀``|W#!gLKhFVƭIb$Uțt8){Q7#o]gj8*F&T:ה WebM9&&4&׸aw/&bW^8GZo.O|1+B_1E}ꁅ\9zgq_ΊrEGzFUڗq޿GTŚXSRmi@}d]7rrekmWaVpa9KFʫz}(R ?{5+CjUǑ3;!iY\^wF`9;kpƌ|P܇@.꾏OWg,Xyb * "@0ONٻ(S lE cx[Ia*i2=bⲗ65a6NJLPFRYUFme߮/쫍Cl iYd ?ZձƬy($B[tcM]GH&ts(o^S<{>JV0JvwFjnR KER :ؓZI\Lڏs/`Luղ+› u:F8D.6rgOǂ[|GFl4+PFV{dw~ԻC䊘mvFHȆxuRNl>8nvljK}bjH\5"Ï_ NvwqnGNq\5#e C:K pUEy7iJ'POd[ior wsZ^}wઔ|GXg\?e[ruxJU Dc*NVm5ɉ@HsgG.O$:uPBUSaI9sf+i>\Mܱt㇀[dOwݝꂫE3fK?) ל%/+D޿4OćfjT*C]Dt&obx;pnL.^,Aa3mx1 J u£}LN ӑ\* $I{m9)~P:0Mm%X.Z'%1 iS_Wb\=wY?CZ \˧jA; TgW86J8 6z1HD7l'-=nk6[WHR.>YƜw#5]4X1$?qY./~#@^EjOl+@sN ܪpF~M~I~'7m̮|F0 Pzl 1Xsqr|ZuN^A\vr!40QI]' EUžE"X7o/ln@MZ ~9@r,fg4@ }i`fRv3:.x=aO&F ^`4^` e1Jȉ7.gUʥ)y,q]}R0O}Z{ѯo\I޼RU~f3NJ$T@UM˲/5^!p-zhj^_'ErJ-Q{VY\-XH"-6˃鷨fnWٯ`oUD'Svއ 5RPfBFւ@比&yoV mTV k(Q((AlwP쀮ip<1z荳ơH'M"! ²Nxܟ>ӷf0$zUWbl.qF b"㵝66g~1WM>iZE Y? ^*Noբ-!/M;k`@:3G`ӠWS}䠊cHL"~7~P[b9!Af_".mG$8tH#꺔&]_G?WLொw gx]pŸ]#T}S\ݗnW=F)'- ^N\G:kD$ל"^ګghWsjT-GPt23顣U6մd޿qEh \%U鐯"nnޡZBRyx>oprzXlq;sqX*\&ɘAcNYtSULDAxet}Z[U9Ƌǿc9!)o (W+T_f,Cce bR4jC / `-= ;p. s+=(:U=kaIOWe]EDw:,W\%]HSpPQ<5{j_!5Xʿll](jHWr(u{{p5+i&9yTuOйW _ɶ{ R-Ĭ)crPg^3(a+7.1A~qb +2woZ:p5vgC 2}2e3}ꬣ؛ڊ7Y=5QvbXq˜ߡ*E23#ےū##1te A w # 0Hcߣ)]1@#!gTAc$eNՂoq=^209DDNqg`M-7@ ^*ˉ'%"^6~\ꯤb|65N1~!{٣6puܘ&pU }Fu^qK,[-Ê8r A{];O9+;i j^~ڼ_-^COk|fdWX!szk|7}|x]7)RxO!vZE[~}xB4qB>*n.AҺ#+=" Ȗ_ "3:3 !uK ~B {zF®NG5z9IaHgI{aIRc+}V 9e(;k)u\8yJɯ0D c؞we"F7Aڵ(V=q̟k.M@:_bp5ikl!u˕,')K|tQo0q%tu+baR0>SRTdW'Sagh*6]= Ҧ+1izܫX*'j؟61aԼAq WH8jUWRxOORUp9ޯ/d/nhk]9~)?=w~'WX3\U-Ey=mڛpY˪@K'Ӯ,q8]Az· X*$] PLS3$PP0({JusAVM,1PA^p@ƕ_^z"jY`j*{$%cn+#)ZӱpE%іBp J"u?8R^}iWwc5D}D[,M #G#EMX#/`4&,q%/Fh^<4xo\@!s<IMğfpAjO"Ჟvk.GB@̈r7Sg25(#;l rI"o'tlj!Oʮ-Uq%\fu˾^)Eu_7Q ۥrbHn?%Zǖt#ӆ9QӮ.=_]u>q5ss WlW OIfUkg4r "pl{p] H#q.iυSk(=Zzr Xi6$_*S[7pIO5j\X%! c~\]ڛJPq;z>/JeMw)^;$3~j%{% 6HCj1Y !yL ?%qR6ZUD^*r6r(m.W׸)yWwGpW_W~%&#.M ԹߘNΜ|F4 ҧtՒ}n٤;ό~Vp-c/IZCzdt$I7ripUEu9E:'Z*9ղ\MWTm9nzl32_3`+d6mNQ?gJvrՋ`ǁApbٟ/wŀɯb7VFfTG 8| \ ·Ȅ[Y'e\=TZo_zX^]$D)fÂ6U&^I4É兛}cw £sg @Î2h]5FH`aڹ+%{' ZprqҸځ=\fgip{BqcEn kХX # MNKwyrB`3guKRF=8`]fQȌkΈl/z3,P >8Wo\#O<}KRղO 쟂2UcF8Wat|dT}[hٿW, /|s^ERhRdj/˵ L]v!?mBaA} kW"\ !B ^'Ϫ!L\]wKN%OfVjN{C9nM.&N<*iW[&FLW8"Mfw*bO<)J<Io\_F$_f;ՙΡ+l5|lb:CBA_?"կ\ ;\!&3Ϻ iv/fR&QjyDƜ|-=,0)i}rqRo9;W b1 Ӫzv͌l-T+CoJ-;L*IfNA4= "k"P=Lg~! L&bIabG]9GAy06aAcKa뀫gS0F*oH="Ys|F8ЌUxg jޔ-:W6鉑%z+"*,7[dc@d_vAnAY$b_Fb>\ 23*.[rUDnL"2 9/޷r\C'r7N  8Ǘa4qYW>I6Uؤ{Wkp5Ԯ7a^/z2E*+!$P ~Lԧ:rI2Zja_Ua1˺Ӂ[5U;Wץy}ŷx?1YWsy:\ \%YTy>#yp(+nj!i3沝x_kpN~٦|E =#搏ޒ[1f.@畷f*s&8$11:G_%sь߸R CWIa],m`/9)\ӟȤ$*8!#3maAӲ{lP?5~d-rnW ӦFCX4*V"߳'r3翰iם D I׺]i3.|:gWXKcdOwLIgR{Bfyv ^=IbB GL W!BL8uUxXBt(C--/os[My©CwB$FT {FoKz Mjqyjb1Z1ڴ_ʕ֔q[=GqjTap\l!A>;|=;'apuXN]`Ke'鉕_ ^.CavVp|p[pɁiWU@r`g}L5Qz"v#63JFiސHaHP7n801}F]2e$PҾYn$A^(੊g̉VIc,C5&y(AˉXnp**m -!"Nrv &@(VΉk0jr?0POG8ؽN:d\BN*j.W^.J$;|2Ah㝗.^z|#pybPXԥ|[iapu9d䬣H<1W QG)_H$C<(J}jxW]O?KQHҢE]́Sn3XXܣ2/&Y4"@Bpfx;4 "n $gw |Sk셯W!K?H5c٬\%/P.pqϡqWgTX@Z?{iY-[98Cp\ M,kJ %[{^,!Gxn^Ir>S]nV *o\+'s@eϯ {Vgżh# zꌵ1઴B[7SqV>`Ho\*'5X!)$x$+&DfKb3t WcbWM>ҍ(-jq2DHȪ#ƺ.餱\ ^vb_+fpǴQ|Jm+`x \ h.; pj "5J&6\-96{QwTٽQ5{Iτf1aumF)?"[cGU.1:*ǭWΦ'Jk鰆)JNcW/-& I JO4>.iK7puCtlt|&* />{uA q઴Y)*3'W?{x”F^oaM~OpJM `Ew鷨. eNQ@.Ȍl{1i?A`- S=즁ڤ6Ɉ"$z6,DiH&Vڗׇ 2-R&<̑cBlW1dv=#WubRvۃj]B[<{>9#3bOp5#@e˹C$FyvSW.#{\_vr[9U #˞TF[vBA8~jQOS^nRFc4XX$\o%FDݿh̨UbT":$AW0ԻjbLRF>5yb<uFqYMu427찜(!PZEWEҧ ?&w,P%2CKpJqSQ-F&.yL.rI${TdٙQY.Vp(d9A+1ɯEղಏ:\IX!L {8}tzCҙ?,t wx=wӁ Gp2iJ#~:%PgjҘ[=D2\s!A`f++r]@$)wRv{ vy;ք M?p6Ǽ1,o/)K#e@s?X{EZqDP]|7ϒ\.L 37+]v"&tBz'>DMdN8r mdR ! Q%!O(* "^>gn3߹ɩ1U)}ϳg} d$!4xxya9 q>BK_?*BrUMf #1`!,N,&YFnqjdS^%Cm~!6u .Yݮ9ge!X 4H!eH:_R$$Y'3#ۤM}\%DS"^$xoLԘ \(#o0%U'(ͪolut?gg[3B\U>ⷖ[Ddń=9K{WԍFȉv>@[\"UҾgEuB2.7Yڇ=qS+9[K8"+=TR-Y7yjv_W/\:eVT,9i/ pg 3RE=ƈ+"}ۗ}v"0m VΩɋ׏J?JP9o=blUQ|h{Y9UaNN-C{kT_d.%& Şnrf|eη> Znΐpe-,Q|Ch(ğ&=rۿ&N-Ғ4o ˟Mz'mtxƀbQshTv8cRnȂ;P[ V[naOMVmqzUIİ?3,WΥ4uGikTcXlD+<&2Ə;W2?m# \􊆡n\qb~n9vvu3gWn[l&#y1nsHCW`IS_pJ&l*G+Z׺ʳv }j-`ipZhW'͜Eղ\:Nz܄U{:<)㰨7 o M?gݥrHyG]K x.&7ٍWO瑱2%]}`Nqr%>cXWH)w&4^QĎ9zi= Pdͳ\-n Fa]S"^( 䘧czA2pٺC׭)=S`M>/!(KbD[W]RHL>9kQ/Iyy%2c5 痃TAq%4r0+šk8ZJ/KtQ-DlHMDxݐK{3(pXJU8%cs-mG5vWLE0K'~KcnN:i;'S쨇tv:8<K?Y] \/хRkQGhfDuQ'(-!Wj(9Ui_jpʵu?]Wl8WH/*{1jWgq4\P% vcYljr?y6Fk, ˜yc̃K"N3$$t <\]랼ilE3WZnIF6UzrF\2ك3$WecVT>'ginęN78翌]Ǘbw!%浶uxxD@h!SphJ+),[̐1JǛ&ϥNt RU'p: f6]wلR^Gu& \zSQܯKb:sgf/ z U{[ab%p`f0O\9 a^aβW 6D)=YRj^-_?B 9^jSEh"ԩX_pW_Bk nIE䐵˝7.Uɭd1*Ay=)9 0 bӌBKEv$BPW'\dQjGT]7 Zu.)س\'kaW}rDɝQwOzp&L^]y0 #%&9"_m&DxzV5_(;. g1%Ǝ|Yk$&|"n'jJ ıbGuU{&4H3zK,QWrFqD]\lcX62,0?) r3xG}i')˰&mtaPX6U*LGv,o"={^o,4Jϔ_,k&_Kg~ I1Ɉq^K}Wx온#m[R ųiUek(6>,C͝ZZ"XtF G[s!!fpU^djphhr.AB˭G5ճf;j/pՄ&u˗K嬂!3m-=$C¸VGk")'}6e2ڬ[.:)g.:l{u%]#2t 70ar!*_w]0NU˴ſR]_fx(yr*!TN_o"`7k",p${qOU9݀Ÿ+%)Uo\ %tb}3ahM4څ|\ 3bn\7h>m EFFtrT:Bn.<~Rv"\O@=+Tz~bҁ?\$lrVpa]!_y,̦-ը''%/!}vF> eQm0\E;Fc3ub8h 824)sw](sHK {ncM~*ڽx[<qU)/f/X2IXLd\ T^8x4R$W- S\aQ'xq .% P9Y™^>_Q )/eKҫ.#rl1v)+oC~ \k!f0Z4;whN7],TʮHVfP ](%вV0QjK qf}!(5&:1!64;vkL;mHrt=iuv'|g{w8}Nw$s hԜ쌈ŢY鱫ې Σe5 x3Hl, )Eٓv\;le2s\\%@(*PLjtMx NvX<>R"jYU1&y"&Zzb~^Nf6ܥTYbaEEtF~cy߫7N%v pp7rkD*IS9dI"!4^BBblB@|sl 0yW+GhD\-vu_È#{yWcUki!5wIֲcKR'S1*YT0pRISꄿժ#RѶHc䀙mUﶁmA hӦN2ȡ;)M`qW ՊwE>3rjR~)/;8 tЌ`; QaG]y:ex'5z4[ D[p( R$W+ 4JWen 3K诶Y{ݺy1"_8zbqւ. 6A~β>V8c`\%J'g%EE=+b>"$g[BQFdƼAm勮RvWqNo6r jKߺd> L,R=D /|ZzwQU'"Trgy u#NU_FyUhs/;MWƬ䄅۽.իSL)op=gB^亶1D`m;uOۢq>Be#K\F1X$ðW1VKFꡍi%J>U1$wdDHDt\6~pdoD7w[0wjeZ BPX8-6lK0zv/yvi_#`pC̠k#ځL@Y{jp"D?AHw{11Åoa ꠷n^KGrD.kQh 9W0&MT [,Dھ ,ԊWwGs!25ѕO 6BKeؑNU>1|hR31[ݮCx^]S;wd< eY).irFL*o#]?%1 ߒmr$wfٸT_~z^I,+ͪ.;ǝʗ EfLSS"^$r}%=.p[b-4|WeGM *2!/C6zjwFaxvyU6.$v271vA]A(W#,jwV}q>퐐<ӧ_[l|>]{HHwV'X)8( 8܌#O l'E,b oXo';?in7πN~p%ݾcF 031"K}ջ,i> SmTh1c/ wP7,k"Z)9a@?0Zu~y e,|]I|ƒځ^4s1х!!.}P,Z1}!ć(l^C%hW;Qj a?k)BUYCG%*[h 0p7!#.tF %3+vKvF,&!YfApV#MaOjh7N 7-0V򯱓fJ9#y1a㱮|{?/1 ?EӃSЂm!69}s\ OdCI8Fux.(,|ɳ M!%DCX&[GqEyje틶⧼zԃ#]P^\k3!JspzYKYtVLX}l}t4.HWYDUk2 Qt &nz B\%f _261&&v΋1À0%BFHCadYU3(:e\9%w)A #o+1+BG2Z{!W ,!s07j6@G|w@;` VH5npkfݹ+]B\1v V*`DO!\6|@/w2YfAm=DbH/>2rs6yfD0h<2+⺗ }ڡ CR Jy}dx${?1 O 8i3m#ι̟#SSIWԶzG($bfBjjB}etjl8*€r-@1\cE~6|wջո o=60෭&o~~1^5F6yk6ys ˕{ǚmZ=£I󡏾7/4mӬU}kn~hOݶD>oh_~o${ףهmUgw7iػ#Xc͇Y'xgJHOZ>i^MY̊+|̹ Af-}͇I1Lj4}S-ahl鯆γ`FsMd9֖Ʒ`Szs7j߶%pI{4śE8?)w=X>s)Q3B|ϳ΃Z@&o>XEHp~aI*|oL!y 1%ƷA@ z_CsǬ_.;h!;nM<gwck ɣJgWS!〦BVEB`?q9q oEhu{"

"E"!ֵkU@=NV6]e"lEn %JV1͇*;Q5 e a0'YM[X|c"~m=AIJqf|`Z~=tJg+9l@pwunMQC5nkZrdRtJ YZhb5]RXl3ϰTPI.E頞-Pq8wq7*zQe ˠe1V%0nz>\eVADKX<>UAHh1F_[xd}=re1 -.TRԖ)׬2V-bȶ `т_6:[)KFn!RJ=@<{ p<ӶK땯oA1YQ"cXm2wzVKs5ÔqϬYdO}]̦ft$rETVbT8e kLu&[%ZTH@9B+)nE/('rFq}׈!x,GƳB nљﶮ \Q^nz*3(XEGFhhsDHԕpAEzZj`/ DG`/ovHCe%q^YU )Yr6;RA 9 9Xs/FNjV~Ц]n#"z,^}%Gm[V|b1z|W.hץW=+pAYteɭ~eؘyπO{/28CݸIN[i߱X&v5[X<#v)'F J ayD@z|zҮS΃:mݦmkE)xy>C>>jj~#;h`Q}?x.rYrҺm.C{-4C5A ;<v6"N 9sg܊gP_i׵M|zO]΃mǾXu6GQ'"bYnna ( ~4"&,`=1I$F1p!KۏFIB v{:N6:#ЍG¦Vać\ܟ9,1)o,?Adn8ibnK@Zڬ h:o+e`e2UQ[aGMN=CŸ :tfQ5~F$sVYŞ mcp: ڶ01gT:U>cPZ; ra ;ʰ!KPXfGZR@ÿ4EAV1q]JM6wDwIJV[bbpZc ok$#Tv;i=# kq"?'BC̡C!,g|e"ăD|tGY)>Ʒβ>GZ0Xv{}Dțī@ܳa9!/sk۹;* kH&N{"dO1F''J[{>`CbWz* ۴ Zb(F汮 c'.V݉aBL^8pRm fB#_bg#%>2.e8pI ܹCF%[WڊFX7qh+܇H0 & Řg-m;v>F*8wƨFKm߱dLT̊y1^.z]E?utt8n";I2L:(³G$7@T/S$U+ rQ&GhPiVr nh4QqhlӮ#6ٺ$i@mnʃn„ ^\2Poқѿ&F yj"wk,ETL'/ l%a ]tL ω5eF)tϋNկ~J\=tM)( SF!qer{;6xKhJ>-}R>[?v8תە_^/fLigрY;&|&}z!˫|n1oĔ^5S#ݬۻ|x~|v-T _^}Ͱ7)y%ܐM]~okef.{n7nq/q]6tYFe}y%?5 _]~ݦqG|mw^܀׋6AJ+y B0.koY~O$L:Ucں6sc;!{Ԭ;'cٳ<>tŲ/=s~+bv1}l{~j2E! lL|5ew(tv#3S7nFo3G̻wtĖ7(6 E\Xk sc;ܽ7gnZ=Θ|-,;~_"J*:rKkvWtXFvj+F<ϓaGnΩ-,lܾ!Sھ;+<%۽ x{;|BPڭFi};vƴ6Yh:pؐ%1kˠ7v'˫,԰}[;>W{W5y]n_>v)7x4B nW u!Șjo,dٗMk4Ll>Ծ6 Ե9Oq!vn,FPF'{d;Mhig1=vR_ ):r`hڽ)_43ṁ+v*ƣe=n,nP+ZLMt:= YF3I}u{Jzuk֌Et%At;mڕn3e$k'~ wyr@G!1ق~ջtMtV(aP,qحN mĩqOhqwS'#\9jS S8ZV<M0gub1}igݞŃڳxྵִuK)=OOfO }FΠEF)c֘WF$A6k4vmoJQ-4u7?=n1$7SZ."L"m CIG>'iL;㛻?Oۣy s,7eCs󀔝0&iH2#y$ml{phDMLJ~Ӯ%(?_h8FD3y)QHg&bDPu,x]@@ i9Ё*bYЧH!*ni~gF/=m GR*8N. nzGмqbFJ]1[p<ݦ-cx yŠ0"퍌On5#@4c!B yf=ۇ!}*'q&ek̫Pb J]; 1,haѮY5?;7m_6u3T-F%tE:f)ÄoYNG= ]W!sGޥ1"ɘ!Rp5%O0(>P_%)R#,mK萞aC KF!!^]=BYj!q^qj4&2gKyUIg?%WX~J\=_%@N9KŦI ځV:s"vtMxEku{N ;EU~mrr̿[ޯk{ܬ_ڸ4muoVtjyK]śF% j6R/b葚K!)i#kU7핿KP;mZ׍,^m@Ij'-:7Pm'O03E?ME*uڙEGP: Tc\\)<|j(N;`Jp{1t0y)Udg+1C( nܩ?sJRi^Ї#j\GsJs Fܓȝu{q3k«ZM4FW^ΰ{2ofa .GA(i'Ou}A1l{y꯲؇^i~#Hw7*ސSbQSW3|ŕcUšOH0F/nI,F Fh}nW:Ѫ:=wǞiaMy+:Ĭ~b(c75bo\svį_p<)9S#{%3U}PsMn3?|YÕk!J>~q>N%%䘘U&Z7tS璄ԞJӦ 5bYeK)L@*Sx\ΡtO~YL/tHP;g(_խ0qԸvD!`/o}q~u` h؟ cJR,FN]iuRm31=(t2d)I e?TC&ra `LånQp|,+} 'vl=(*QU:QY[E BN3Ԏ!@^ڬzW?0tP@?-%n'e&`=`<3Y,@>E"=F(rt` ,拏z-G<_O+L{gMqJ'? B;1[2T_Y- ŭLn~sK =B!-kĉgbp*GmQ'V!_BC,C7]Q1!а>РpnՈ LrYҰ>tvT\FrR%v?Ҽ&OSIGʽʨ)@l@wԷATѴ<-<5Gzޚ2tqH *Z[X:w?ס"[PF3`dJ02cJh8& Ѡ%4I:\R' >֗AVkz#G=gq+Gj}{rg:FEH3xxxg~ vOy -xG}B(~Y3֘`#4^)"Nv4+Y*W۰fha)j_P~Z!Mr`=x$ʒ,uV{89ghz9Ъz v /;^ը?\,m+gMys6& ,=Ȃ|<ʖڈN%ƨC)7XVDcB7BAC3#޺'^-</G8y.Z#AWwC24MC?0ɈEd8,̊`#o3JlGN;h F~EN)ZO&rM˺O9cq5Ȋ0#ªHjv`|@IABq=r騧P BdA;ӂ j}N+@cfg-NNdaA!9 z=ZtDwPƻ[3j~hiDa,PfbO1&S Oa"8g껶 FoX0yǍ#&WaylHZ5%uJw ,4*1&u 6~ NarnB}4`]_Nux%΅n4Xu)O 5 }LXX "ڶdjZyMq0. ( 1кc)PU \El880x2:!䪖q/+>~TĭFJ?\ ˓@#KW;Δ\udyV;'U-ܘpL`g[Sr*$W=VI8Pru A-b}G*紺omNxSK2z  Op\̓xHrUɨ*P k6;mZ+ e %Wm1Url;PmTB6J:u߿,tDaR eaA AN|%<`kD>QJԸwČNר*fx+G+EICcϜ.K05ta",$W!Qa gdxHڟ@ F$F#-u?Ó +27+o_M>X{~CSKM zY4Buv-Th]J0oPP«`cUE9%iw3hF~2vpi"èԄ\}z@8%䪜 4A󋒆3P7%[ ݓ^Gِ @rw7DܽYc%Măc5%[:]E%5\}Pe($>qW P{9vX,;rh`xi*-qgڻp3;szQm wZ 3:D4_KJn sθ犒cjD[;-5$ .C?oyGI'WeCUy c[I#Zr "J EP)m1HD[i9Q#MN.{}Bi;%ćaΒ\1 Ibm@,\c8ja\:9Y`Ϳ%A:Y0um/9Mͦ&" dEEbU;z؇HBzz梐k,*ZK^%#ZrT{\ҧ.$r Q9ID$W@jofM(WTpy*s,t$QUTV[6A}<҉-+v9~ IC<,}c0WXm9HJr%mOԷ]<0( /t꒫=/abӟ<~f*y" HY]!#0ycjW{_F$Ӛwߩ>z3ٷ=/~~ w:B [v~?koa 0#4^hjB whĻH{fr3L;]rԡ|#$.uMSa K*Lɖ`nTΠEN37D$WBN/ }.9#HAojA23x68ِ*rۏN5E0'!Xg5\0[A,8>L}4H/ =x1F +$: (JNzAN}&RMKQAךz^-PU],I#A՟&ñ+ -яr~JB,iu|zcê%W?(Ӝf\%D%S3R"4 $ 2v3mIm%W,u(jTڱhSPB2=(tdd^&8N[w@LK:Z KpfH+$@A2tV X FA/e'?!bERBc#:L$J `H Ն*o듫;„?T\6Fĸ+]P0jy/Jצcc %B'QC-?Dba y"IU[L-VR{*&/`!8ͣ`k@iIfd|J(3@3^ԪƔb8αϣ}D *PmX _޿gJr hzV1APB#!p~=dAg,\2/Ixl f% AaCfdru!A xg2gMPI8h1Zr@'tN*2\ƽxRgA!+O<{FX'ɉ)$Z}*ӅE-uՏGpeDJӧ)  h(ƽH:vƕ~t ƓśFA!Tr6&BQk@Q5_v" zW2V?oUW"JXƴqkjWsIf[Q txԈ:SPeDJZ(I0=`Nt0p pA+zm<M֭jyp(UЅ_Gk(Bވ7u(0*d橕&Tr[& O|x>:O߇0&M+LOR\.l^K[崾HͰݟLGG'WK Ϊ*74\m,I}4 olaȰږR1*J覤\G;֥΂AT  ,kQK~1?`(Re Lx5\<`wO|GV1_@ĭyϯ< H`A2)7E1SۈbD}}*.V Xs2%* mqUcR-bh]+BWɈ{go NyKV#y-Og s *m^U}=O6M u?x.UM#Yg. 3/Iru4K59ʰVIFe#k,@.9 0%C)Ms{2~!_`t,8gN%Wt"=mw {:f ]t C *Br!di)߳(oY;!*_{#>D2Qj3p K_Cja }s?L!I-lQ>=b2 ƈ(-fcBIƓ)c藚C:;OB edqMn\=?" X֘;VS*{5ȍ!d@6l1͡i$W_# *l(T4L7ˊ>\ቺv0M/9qT"B̡ƽ+bK%/'h .W;H3=`}?>G( pR \?P gA^2Ȕg.=fL=@MBzl$:rR鶃;\5ԨdXJ>Mz=8Ҡ۲}hrDիۀ\*9?յ_EݱC~{9c9VSzkqXDTrO"TBUT ~w!@(@g QdOh;NxYE }ѳYβE}K1ܳzs3ϟONw6马c\{՜šo 9='NUJ^l1/Ң]WF=+kmJ+p+n9m%I-$8vȉNS~Jhr`):tUDNe%  dCz]r]|VdH)x[)7SUB5Jʝ1+bBKc]c?φ ( !ܨKJߴ%MO\BKqW*LXm ԅOwBRxcKFy —9u?sSBֵ%{ZM 燬ol\=\QZ8\sVhNK gHFzJZ&IPT,IHj-Cզj$ǏT࢓V$뒫sCUe1!)#8-ut g\E+`kHņ#D+& ѷ;|=Pg ;7C!q:p̘<_ӓfhW<,$@a,n诺F$NOI'WdQb ƛI#ƄN.zFAJ^ه=VmRy}n7T({¿ExgUr3mbH钫pʛ:\EeDn\_é䪱/p(߄7z'{/6j0-KEΪ 3'WO| (ZA=x&LOͱ,X0;5=)({~{h%\z{q}^L.J-׵F>\u~&*zg}ruMOnKjQaeU-NeZfDUh9-)Uxj~X;\6%'9sZnr 5& jR68Rї{݁t3<}q3eN?@ xe3*s* WǸȬ8U{/'WYQUVm_> ~[@tDrlm JwEDj{hk=1+z}KZ)2̝l'W\X:xsC-UCBD]0  /F$W-ɌUYJK^ :ǽhzZF y+WʞŦf%WG'W6wg}0Tk'5Am9$%}򜒫{dD;$E~0V\_ѺWEAMIDlԦ!UH>ģ5\ZQ7$Q*At-NU_NxʸbS qʀX,Uyw$WKt.E n3`/( (3kzHtF( I²gS$n<;qg`IjmKqADT i!v[B@т5=1xg}XLC\9#=3ah)He@7BvT)ʣY }raJ؂Jc5M'W:{O~g.O%W!8VW M$W]_#꯲0y;U =M[;]@nxvP#eG#dLB=4c*Wqx&s̳XnDrYe*;hU,Z@%Y|i\}&_v4Q~preZr"˴;CԷIԒWu&_5y$nJ"O"6A]tσ}%^/+-zE䳾ۙ~N%l~i*Y<2s[8~NS~JhrU֯mur͊qDmn>qV"k01B (a$Wci2 d,bUD!]-O C/բ{A'''I,!IJ$U*!lK\o!(mrO%W opa/ = x.]&3ސDY= orD >(yl,lx0U ^^"<$WgL뭭K 3UjpZnaD3?&.^AH r=]rZB_ܲtDK߻B{lJ;$CGאsQP yLl$O؝s3*64=z5Zo&UziC°CFзKNR[.HkZiE>BǑ6STMͲ{\ˋ~^4$\Y)cY> cMP|qK%F e6V vL/LTsvѦ^tZel\sXĤFhp1t |=Yrj ^ 60_r08MON=VK֔&HB;ap`y{{eA*s֨UM_{#8?(C1RK,[cAr%{[D4aⶀ%ЛXW ܽ :AN>z"GiBXG^B YT7 g\%' +ӒB_.u*s60v̔yLs~BnE<"bK̳,iURqĕu M5%q*QsG]] Ka sNdM&WWv&A=1ZrY9oGn7!>#Oz-ӌ{6ղiE_+:^h d&w'%[Ƃ/1O4!(U }Hru$W1y\UO L$Iȧ,km{*T *,*'aH\tNS}Dzu$K yD;Imc3eU[[$B\u}k>~G$`/5W\PIg+;WhnQʜ2Yn5Ҷp#eVjEJBp B&,nUq2"/BcO?m}kf Z">`>#)}* ij0^]PEqqqmK[Mo8jrl8zd,hMϸj@S5}&$]0 L{t٩LG:Nt), tJ.kO1 5LfCBk.zNWrgC?gHL[/ F5IUX'iUp SaNy--Tu.|Zt8,pg|ͣL@N_ svfȊ@b'] ;\qjk«̉ctbg\ʾEVhg8KsQkUX"LoyAqr,(b @DkCH Z{U_GP QP2OA@\#ړG蒭erT߼/pI"7{sGK}Xġb{x4]ãrWo Zru%Q6ַFPds$p&钫5 T$Le(CC#KӧrF=~D2kd+z\#wӬ䄗âOUjB69$[m¡{U-?*,QOц=:^r Dj Dkٟ0~7_1͈SF?HVg2M-z3rZ %ؑ=WڂGnvvi[TGˁ/"g*u 79kԱ\\׈5B;oNWI!j*1ΡS'݉hj㇪ KVH'S,c,e.T>۷\Yle_NZxr ŕe=-ѽvZD;hwU@I}*6ӌ.^ CL`G~zg} p#g%PutVսݓhޔ*cV"Rͤs];#5:>Ĥ%G֞CZHca>=c|퓕#CڱqoedOTR-qy0gLox 5z4M;y:c+I6: FldnY$Wq1s7UN$UTμ|}c~F9Fm~fv#(#o[+rLF<„%,f_ ;#y**G|&WWd:X@ÁMUHr5,FͲ a }_XS60QrM|Mz0l$觫u\nҧk6SȢSPDU K)Kft*j uڙ\c2Yi[ƽ:쨗q05k{َUSe^ꎱ[z }2Y%WYHdc|UctП :ReO tTdZ'wLunYl/6 I׶́ER#k%)c*S<`N6vhe9Rx6 I(U~`Y7wg4lxI#jxfA ח#(7hd1Th 9ӘFT-5?(9:SrU2ځZsp}= Tc2՜ÈAS/α[k8oYwCxg"ɉ7t:mB{6}U}㸰'kv(G'W)y+;k2.q'c>gSNhmҘA8SDOW^cզOgMyLo֭U. c;X:]nMD.9ThE=VS0@M V7N/DDLzF^u KO$P\i `JMqU 迲`pFDV>g{ƹm'5yYE8AV%W߈X UȞ@"7x@JW l!V^\8Ypm$uեqb݇j'c7.wVWXt*+QsNS~J6D%9s> s^K*vyq₟=5q,FC$W -%ksy%I$T63NW\V5 sõt&yA3=E/ඪ[d$eTs&)g* iK/&Wa^䪆aU\mue}K>Krb> WC:J0v\޻5&+*SO"e^Wf"8ư6TeةIZw&Z@ 7ÈpvjWOTrAה[d8k {i wK2g:?8hrTTsVH䞹Kk ꎙt䪼~I^a{5*?/˯GHfk |[-- ]Cgs~窎P ɀ9HzH3g.5y2OZ\-1c]j7fO!Y]4}TQxCX{KRlCd!8JZ:UW"qjRg9js ܓ#h,rMb@MIyϻfȪ"{e`Y[{Jy0j٦u$}QN}a_j=JR]Qx.jF%kzS& 7X?pUX?8F>%ē'Jӧ3$8R]_R[v+ېpC値Bf dyil(p- ǸCC2XeπPrUvT^GJZ|܈*|R6h}1:^ѣhQ( BC <U{7@fr7DB v;ZyUWE(>g|b.pTa{?܆ =n (02%-dזc*-?}0ֻQ^] BN{QSw6\w󐼝o,-A]um/6u"b1}ppB*YvG,2jʞi01I.īXokz3p% ̘,-i?<~KH{-mNIl,Eb.5*#ek# 9\"3]+kj3S\~J֗ڴ/n_dr.ŅS,UjW$?t +XiKa{Aa?O/|Y|:CBiv'){]k߽9=ZƿrgЂ\kU],c_-30lg29ul* ,{)>wy'{QM+̳eY%7}QA?ẉu0M_luܫf2楬>gkPķO !JufIsя gsE<^y]}~Z&t];1y/hsGOMC~+kiyԳi}!mgK:X4wg] n=k=P00෨\"_i}yם˺;wX"wXvai 5%['k{IY$KB9C:d}:`Lϳ2z8`yus$OIFgϻum8>\m=6:oyߢ5 >w{XEyoV?ݖkyxhcs%],^sV|ycWO:C;wf>2-}]k?׺!v?7ƛ:34>w,3cfm>Dium/6 C7L"/GӠookutF'yN|G npͻr>[+Ϛ{]l0[D])/r<0ܝ:6KךHչw|0Sj0lWʳ&k_2sMǂ6E0('~Feb5t-?o;ZamnuŽ~(r f4~Nss2ܹuG7u6϶%lt`ѹ+r3;]k&7G<gUSO&ݱ̝:˓cXe+Ӌs2M"u_(Ttoo}ĸ-6؈7uc~%\:v]ӿr::\l'hH 'm^țXHfy.ؚ;)Lމ{dW2chS.Dy^cI'4Det7 ]Ɲ+zQUlum Tۛg| ;ҵ;1s6 2+r3?Lo{Bf,#1p!OԶ7e*NuE{m,c_AMP-8w\+VP ۂcxtmr>+K <&h 1K9w\64R*Mm>r2MeһSl"n3! q"?3zPϦITFdzqB.:p[|ǧw".7`p̱k` Sq T=E .%µz U9P{)7ÏD(FKf2}o3 ~XVIcV׊ Z?6"5e-q/F@ Z;w4 y CO,#hU>cf)Uov4 ?7mmӎ-2/ wiؓ1/:WB`tZnXFζ9_3"sށP}N >ep-s RY`ec(5heW+C,1Hsv'EhtNzX_OޤtmNL13y:ώmcpiߞZu#F$}ٵƱszhϘP}_Y.z`\ɳQaP  Jn{h]_ue%4ݘ<B |v 8rvdo[X܉nK>s<) #:svm֗؈+ceQg$M BŝaqЀ3>m4 +SsRl3?$YF=kccILЖs[2}&CC,c^صu`e۞ݘ)4esݍD+\[Z7bσ9 =nL`̕t1Hj:=Dg͈ q$yQb#!{ϳg7xSJos!`؆eݦ\nwնI56|vac,[蜶:_XcV#qWumF?8?j} .{W.Lm~ZPxԕ{7$!1ћ[ZVְg'A ,;m y'9?K _hN~KKrbM|4~_x]fp1ca`g}+l_:?)]$w{yw =,D5ȥM|+s v.vyP}O`bṣp[qgY; )XP,--znHJ_Ņy{/eJI~:ȃs-K (ι_F=MP{gy\ Bnܴ1Ouo3اs6t1k]눅r|;V ]o,J^k.-)ַB>/] [_SM饥 ~Y^7ǽ|}}Ѓßvf{mjgH?c-Őo/oDo/O; lvg 3!m.ص1DZt `i{6zNČʓ:eY2 ̧`kfz4]K::Ӏbq?)芜X2t$7~ď#"j&l'MxF9zy"ٳ/]{Ą >Յ|c]AnsDJ5mVk,/T>o-{Ew. w+z:-z4R,^#Ft{XAO۳Ʒi"a 0O o6Moű;kbt(nD&-; n^wZb1X96Xh]ѝ3:c39s7U}0LӠ-ß䆜v?/ bYwZF7q1Eܰ{%qF {uӓ^Nh`{7m͙?Yhۍ(rhC9ƞ4c' XJhv#^ga γasa8qom=Y(%=DI-[۸WK.=/e=l0@U~ O ^JmS<>XߏwJY9ᵂ=k7lܰƽ Y&z܆J1 d,5y9[ZZg`Zm64Nyޢ\;%Y}hINך&c_HCeGDC;aJ5\Myĵ OAфYekX}Y$+cʱ~BC*jfiC  Pǒ @% {>#Ϻ!TKB;9?םy-^At>znwwuzXCf+{9KqL h _?x<#hm y963eS;,1!_.ƿu-,hO?m)"luL}ﲎ|&711^w2:8oWh ‡&{I'Fyy b#'rMóh {@Y\×C !`ދl7w[{˶ܻTV+v{wsg׫ժ"98ws3N} us(%WfBONmZnes|<Ǚw8 dsN-/Awz5B22%\ D05# ,m҄6Ovm5bFR--%!ɨ3aP(9$&"†=BO1`5qv{ܫ!QÆ뺘5ZL b{G>nYo޴8s{Ғt+(cw~qVѕja࿯ou͗OOt̫siR<(/H/ʹ_Mz)'*cһq"Y'W1>[:e_:ney)g lǠ Q{]SqXHneq Py&)w+N"tF䑃_ڽƳ_UIn(gv>dI p=R}CI,}}wr5R^ܬ=Ũ%qySc~~ 2mI/ٗ;m^1]E]3v )ૢ lXEj<0seʫv;/cUG>#=SOa :[.|VQ{џ/0uDS@rB7- {K!=)XDQXCܢoj,-e먨1O<-qi bzOwT 26ꍴkK7Rd9uXCx*mog:c_U;JºiE3ڧ"4je[֋ &3rLƯh3@_֑&Ti0 `)v)/<2 [b AUSjvnr摅Ԧsk8Z~pvr0_-ٌCsWvKҭ zQc Y]/˾߅Ӓ0x#o9ob:>]RZհ5oŽT4׌>P;cK b}aWIaQ㟗l[A2HJG{[ˋKqX&a"t\_5Ȃ¸5q;XQNM=hR,(!=X{7)Xi鱢y_@Źa[@6Y'W6cr~G&n5WO TK%[ Sg0ޮ89t<FHf"5ӷRҨvTQ_yl)'%؍|K`߿"G=o dFOxAmOtl3Ե>;Uz"nzӅkNdթ%Njb%%kЉ)N]HurIzQXۢ@iyA&w ~u~p$<08>ƒ6].nuk<,+>m@L+KnX}\8'$.[;ȓZ&7ٽcrSmEy1ƃcُď\4̲:WNie]`~x\[j&Tm̵)iO~#G? 0;A'0Î#G;*B:ZIMҕYw&0YLSt#욹ƌ Px0TSieVOVmLr5{n$-9#G>j8EjrCUl|G\ftIXk)pD `ݓx:N50i }k ̗DP -)€Vydg;c.Լ,"(:IdU?Rv"eyȉmRoxyI@U2g=FzzYPkgi7@ %i\IXկO]8p )^d0˒:IԨds]C\BWcnY8<*%Y)y[Ĕo=3v:e'uT?/Ѷ wcHk}`o_4.[Hv~qV$xVt9^h|Rj|wVmgy]*Ql :iq5˥Z̓o b~Z\M9橐W}&E{^k_->3ӅwWlЛ:F=B(~ lN&/@C9=,:ckDY\K\(-8RB~603RBicfO1byg*Id}ӢƷ<܄|kzp{ĬL# 7$vM.H!%,sj@rA$)qSFIZw3fVNQ%UUq{%6 '_Iu.c 0 C9HtVȠj%$؄[UmDz|HSqW =%%GZ\eW=y" 9>1<+xҜ`͋;;a&XZO~2__AKIn XbfKjqUe*qub-cu'YyR"P>g@ղAQ3 RhiKbum^wiI쓺kHito5ᔂSRr}QLXTxg6/UAO2/p}n\^3y[^.)^1,pS`=T aT6 wWq5VwNpqxcHxEouŷ-WR#㛘t=ܪȋ5>Ɗ?50K-i.??()F4In8!@M:~=Eޟח`^*-vL86yt1㜰NU }b!#HΩp!٧Vbge:7!7GӢŜ?eX9:jڞ)I8di.qպ+mH`g 4U>s9|8|V6rx䗙/ae0 #ȤjWl|*ࠕsM¯S u`:\E.<+ S{ԘM2LEgjng^Vj9lfu]桱s>b#fm}/B?hlq){hZyWkq4I(+ne0Cp #||ciG8 9mރJ@P /LIXךS6niJ\84O%VV@cˠlY IctWuA/z vnjIJTp1O M פ ]9w>81b؃RˠeeWc_ot׮ ^aqup7q6v|[t@y7 eKmާQҡ73+U8=%(GاS8l]:,sܘޛP},_ٙAv%js,+C8 gΩ*b _~%Q&E-RM}# VH)?ϬǗuUQ+}^WA=nqտ%KXb 0-2WK;os7kBOX}$D8>[b5(m7󶹟2,L(;~/8ŠYӻŒ#bqRLmMiZ\=o5,ϼ$!JV'o&eeb(&8!c2!P_Qz`V›JN{]"7Gz"aM*quܲx)剿O‡˳c~ ]QBJGKR=oGz𫒔H „Nog6vZb,mm/N%Q㟗rgK3g3\W63w9V,,d].dY^ mԆ66;quMw1e( ?i)x(xH˭(KeB]-} ]<t֩I]Zls?PJPMj^xmGweYso,Csd٘ac`cKmgWb4e9Xȋc_o|Đ6ZSn,4=6JmtWn;Ǘ9X}_j8 =g1j8Kҭ W|#;n;FNb?rY'c{ WĜ̀`oƟ$:[܁e"@YP&)NUQum Wq3]o؈Lߘ; 34xů ÿhHdrRuB(_,eK:oP1>ȹϳyp2Qß2b0H8`B"zz2JZ;q Ν9I8Tsޛp1?Mg0]5ePDSIZ4tϡjϝN3x`\VCua}nscS *sP` *F胼NH;l#90ZJ#9~exW%m—fqQ9ı[֚-;mw/3ƒuTȭ:F7؝T*vMD =Wö3S֑k(Y{KN'l!- Aĕ$2.< ~UW;*J l q4!CZ*q7 kF/9jEfÿq χ @0OcYǜM`h1OO~6eӤ`İPUUu]\7/ƃP7]pSsjՂh=Uz]'%;|_M׫}8竢zM9YJ| 1P $$.ԾF՟..RY[\%j6ި=Fj/*0# maĉjSZD9y a}oHo--ԧq*US!N9"lݒ<a#p Xu\>y|~~IZAÕ![OaWwOuS~*3k!3#L(?,ID{XԥlSh;=uy;ms?BSUmBq-#+q4&<1ymz璱کv(q*qUy JQ)q}C r]`W↾aok?h0VG(b܉஗bfc΋ ܉Ze8kG _5/&m?$laEspa2mH+ L6uAYN&t1!م5]Ww/>9q q"b9idcE !Q3ƺ I_$I*GT-KaD*M:;j1R皙e8:*P ׮[`cDРGQ|0]aH˵! `^-S*aMl4=%/>s}(F/ꀅV`YGU5QNvWMLoZ ‡=#`Y8\EDĭ]SEp9x֊}qp6(~ͽp1?M21.JgA m"9!z]qxdsJ(4&'^F`˚͋"N p{'p犳F>(3wlGf@Fc]d('b\> @:O5qQ3hY5􁑉_+ns,7/rς9Xk vOy[a!';6M>:~eg#0_~ *f;5c#R/2z4~v lqO\<~@Ry!rYbRv=1+ƍ"FfKk)D{Ϗ$tbvDYmeEU&p-1X&0zW1cG+$őn6`9d` _tWj-yK!28D2=r6p" >[.^Hh _(vrc#~[$y|t8Tt/\iĉZvN\V䥧߿rM\W:NWX4z)VDluhJ(jSqJ$+qV$/fuWܲXt 0:J4h2>0ZFON ۰%0|D?3S^q=ţr+}ʇVI&a5O,G!5:h{Y"ގ~R^ǖzE D呻).%.(6T]\͈L~_֓I4H/>ʕ9Γ[OK1Q0-$|C4 B$"jҌX";BZsI3uxd*D*t*T]|fYa/șFj#RMUF, u%nO\_363*v{LA\M%v ,Ksju*que瘙bDX z 3ޥæ7qPĈG\p 9%zpJ(FXjI鵄DC0&# ձlZ5IB隷jZMe fBJ;`"&|aءl(-Ę}D S ?d[ʗI H6!Z\UwBTLXU:'9OZ(}SRqVv:(XZ[$;h=Uy}~].f @7^v}l+:=]k|'rscg}gfW;]S~C GzLw '%a:p_"Vy/ks.=Xg Z&@AE,EO+\a=J\D &$9[:d߶io4Upk);LJ%qjkRj~#pݑ,xRuY,) پ %~2~#5>6Xhc-N4O 0rE\VLzF==[> WR@`{2 :{qx>%s}e@gr-DOh ߪcpE6UbԋWWY-'`RbÞq1RmȽj%lOHS^̊'5:r>LE&z Fq^.㦓<,=hXY&;"!}r$ƒ@mtWN/oVhٳ-Ꮉ*c&ܞeq GxTFo<$8>o*c!5R\j hf$>5BcT҉ L}nL_h;L= jk$;MY99kBYkm\a/w0{ *@znәq0&7~θp値CODyZv0epiqdA$ʱ%ߤC%ɀ;_ļg1$Ȏ;&a&#C7zf$5:ff{h3U]`;c H7-ngp.G{^EfB[,/%eXPֱnjab>8+ XB|subg)Jqz:upWB8K9|A^1J\NyɛqV)ks;8XrBI2.T (RrKp$R|ʹߖ&1+XHiv|qs[9YeR`HM-ۚ'3~h~+ V"YM\i q$yU:ox'ܺħ|r $9ɊcS73*GfXSº^UꑅK!PIgIiQ L_vw4 6t6*ȲO!rkK5xND1&N S@±HصsV0#!C4OjK@9=|^qF w(;jZ!rPT!WqrT!PG;i(;-/bܛ ;cb. ѨTهmS qh1lKJeoIqu8J\!e 7XqIA3^7C?xt_s>XD+ͯ fZQOf aVw(nגI엾7:VtG\8#|<@~S+W "MrsöYZs8:3&\uycf9ٮ" :e8kY'W%aD%n:aH&<_5~ea18w&mTb.⃕!96U-J,'{Z*nلO2ERpNXj@pʀâ](;qazC#S QYn.*A9fGYW̊T*;#=n'j+;,7U\ҀZð+A"N<8OP@j#qpA  @lX- EqM$uJ)1WBO\=0TW%F&3/t?ay,m?6W+; >&e-ak\:5I+r%"nB՘eWI$yiՁc&X/ruxsQ^sOr/š׈yLIc${}> 5nE mdsVY#Ƨ=:=ꄲUjQ—*asSʶfxoTl3j ytrS|q')L[JV*ܶLgݮub))X,N4IM_$mUPP9$"z#Iʓubxc{Ef|=OK#G?*'sW tF (ֵ}⪮&k =F5FY6O\u%)Ii5%/Xe3 jژ*%45u3EB Rءxu<N`h?'ZI}y'36 m2g4!vib[ˁ#l!j 5€)od)IBjV.'`}{..q}obtw,>#phdnqmU #M|1bYMWHNZ1 kz\s8T]jkn96NX(._¼ .E\u)՘Z\BW7BCz\A\ݭ[aiqX]IX-/e734O|n˱{&^Jkbz.n5iXrD@ٖwEV:]ލSqhuj۴=S7o^mynΡ?ﯵ[m*<'jetm?9vtptFy_V=%viV=79"^\őA!B{ 떚#.pQ0inh@R}#Rt5joyAlDtQƁFfano N(" ^؎`13ޑlloeiq sdDzE\|H+ a;_ U.I'CJYflϡ'QjJ/}f)-_5dƽKRWe皷s#JAbܼʴ䬄]sGrˋm>%G\(eBz^TUQG#K<uRt5"u0ǴƵrْ|Nq]~qU9.q< tv].f4$Ỹ-^C5Uɢ6MKu.䠓r];g*Ζ_XX4$dt'd5b؃,ش}ӥ^vr{gz.1)}Hǖbaj_!ѴSh? [Sio&mʠASccUdB"G=nDU ;8KgWO&|ݣ.qv D,[K]%,ʾ##ۜՔpѺ$?v{I7XLpK%YM'KD& tgG߆1\ $0RstP.|;N? v滢xTVDyJeTb'nJPE~[p U8vdҽ_)е= Dn䯚*9;Q:QhJ7U>j=`]"fۺ`S_7ZNr]pWWt zhrJٔKowqS[G`uaJE>W'2j*D,XsYRIl|knxN2FރJ,F?)"v*<;(O.RwOv<0%ijwy!nײíAYw4n3P?1UF>ƿ\WbgZJU`ra&oE,m Gm_u*.v `!2jYjE9ћ5%r}7ƀZսKT;>+~^FU]:_\^+EVڈw%-r՜ $dEtLw-/`@V1hw+vUϙ_˟5(iJzv 1Mgn* Mtt׈xvj^泟' 0\>%=Te'MciCrSJθ6KA^V^N9\3>~%{KY,DS))[G' H^_+.v^_qr8tm/f2&tZ#+Z\Ū1_JRO wӉN82Ua GS^ y$W\;'%iіI/& v9W1+;UJ\}~qxF&dI3?ۯoWiN%{ ?v>k+|+`Ν Mjq״'g:}G|zK??NZytqhkkXx)9 TU/-+"4NX9qP4ϼ,7žI,qq:9`X&2V K;UAu.;513}D ĸE@Tz(bp÷.P(j\ ηmhvV`q1D(2/},#IVoW,(9vo"S-_[j4 p N}v:Nn_=N?C.-lgtԉr i! NQB`ˋe)/K:KcZN_{SZW ׵_ LPh@K;ȴz5|))B9rj2T/G=n#RX\-ISv3Gds{+zrȱȱ"Lꎱp~az JZ̀IA+NUB-F|&߄]"ڎfO3Qr$@f%E1{u%?Lٳy6M\%cY|Wö@?,Go}$?:g8Hu6v{Z\eQ~C{)X#Uio2I/XN{1O0;yˌy-1FaNLG_`@_q`Ty a+u^F iZ֒ 1jJ$f5\7Cj@bڞ)!wŢijI~ľ>q8E1񬛸*y&δRL9$iC^F{ND\]tD)oP'#e.~Q-.:s߾ *VSp:VK;_$Vwwy(99}#wMp NT˾ǥKݓX/[P #G?n 9b 1upHP|e+gKI߶:=a\=®'b"2刽 "z՟qօp ! !7Cfy~uj~.LJǰ@Wa69jܳ}z_GMc!}נm *qu'&GNU~Zj=,|q^n ٢MC$LGR\yfguIj BYvGrnc2q3u}Ǿ;Z6ʼn&-,iϩ͋j0]oI< 9w*4@6$,V&n&̘٘[%3#F< >!MW=6\*ALQډ嗀.ƟO?ҌB (2MC^jߗe`ʔ`@e@QJyQ{%aH[P;oF^,u g^O"j5gnl /(С3XX AeʪN{rjsVoϏbϕ;? Tdrekg#]r#k¢"y{*laÔYl0̋/?>Vod0E u=@y FE #B/ГzxKɛWa}oi|r9&qsC`YS}ڍ Q1OIWDXsbR*afa"".t͐1e_b;pL~H5Y4N0ۏJohm4XQ3%\MYM"LQ(1kȑz aUY|cM>OI3j)ebzItƝ cUb(Y~an5K%p6஗B#*1=pQEIanPރu;63:q q3/qRʊ16zmpn'7&Cvo97"~U~tĚo q5d#$9Bz|Y0۸yD*B43g;v +ncr,cُoF|$;_6z 8-Ja~T=EZNڎGOhDs,>;藬XqNC欌.;@\nضJ<.CYy_UPW Wy E⃢ǷN7%F>RGy*b2}sISx̼ yl1!WJ@]YZSG6k)|Βx=&>BØ-fwwqȩ0d>ga:YE?}x eXD|I2}GH9ۭ&_IP,g\=3z¶q8 /j/I NJbޕ].AX0iڝ8,F?h@%P뭹ohol -sTqhcG3ZEY!KY˷-TUK%Fa/*b2l^Ialexg%dX>;]I'F0|XBYzU\3e)[G6ZǀI5Ew[Kx"H/k07tF!ܬ^:y1ph^W،i ye9 z$իWFr֩CWG>jbWڀANP@hOov[yA&H.%]uD&g_ԁ;Bmz"[~ExTd]/ 7;$!rciB>~p7Ӕm |_#Lx0Wha*Gy .x i|}YȂ[jqh-!͏ M>\R)h9$5uc=POHzcL4 VL2gh"Sw'XMH^xkrYyAΛ/'oa{3n-tJn$GOxAvm{xȁ' 'g:ǣƷ`Clz|iq|KUU\V<΄vGSp!cKĀLȂ}f$ւ5e N08wej ?n13X3NՏ ӃeW߫'aVqT1tU+J zeK}߿~cqUvj#R}ө#mVexhk/V%NT[7[ԡVgڹZjp'xo@}1]O]+ö^r==Vw9׼Ӆɖ3k=T24A*?$JP*+dc7+72 {bgj\=Ww{TocX2*Eca8?z_ºV96+ p,SۆVH~cm%VU9}ْ]Rvis;U]r`o/}mZ2n\Y%t$j@}lr)lk[ĝγ9(-; [ߕ[/!z.є8"ϭxc8nUL3rPvo "…k9St40]r AÿUyuVv.t)LLyW}k~W{L;&Lv k{0yqϏ> ֘N[FoLXX xw+V_.9ZrN%U utK^%5n!K87t_?lY='"EάsV3 Ӑ'Wap L9!~M k?Pd6 ,,}f'~5B:)z>Sjl"/ lKt6D p}z q AT٣EvB +.ש@U#=YFצ+ Sh?eN0 {#wdKbН. c/0"I2,j?AT_] F2dϣ`BB62Xm%#᱕Hmӕ]Zrx#Ɖ[;Svw 4Yl@E!-Ynt 8QW9t1A)1=DIFlc߼lquoS{g{dFޘghWh3u?W++gLo˻P$:ѿEuA̸?fqxAY-@x] kJucL5PPഹY'WJ}q1Wuxciq OciGJNfȱO׺>NWZ5$ʁ!^WGOh-;NhU"#[Ze\wqDh|%uAnD$,ʮ蓞M?a)z5 =RY@>0je9 2jʳܗ%v¼Cca&EÃm9%BM6 *_H餼*: &KUZI:a@c[jp'ُENU R ld;$!Uz>)N(͋E\3\Ѥl?%@"qĮ!F<afyɜEh pB3ۼOkO;5k_$ޱB6P4\JԤIK2'mdd]Iტl%?R))jl6^׋po7a}oЀ'|eڑK&uق_QZhFjHZ- g<SJ4M\-zPʘG5Uo{p:yJօݒlxzd SwMbنuYNBN/9!tX%@*bgos~FO|_"Hw &m lOJFkyc ˌߺ0,]3G|LꦍoJeYXxmwq9i@">sGP!U9T%)1|L͍bf>Itq_K?oS }ww邀:'ltf6of^ޛf9KͥY"#p'a=&mydc4HVlU&Ù$L~71JfϹ]ѥRy?1ِ?LDꮉ:_eE!mTI &uҪzB~VqP9+zwO<*U-ͭ Ъͣvʔm Gx۱?e@1D9jd%9qqRA> 0f}=ӡ[z-smޒeH(=pT4Pw̃?Yk-J\9H: 5Z*u0mt ,0`v;(dZ%W4o\)q`Nz]C{oӀӘs!Qiq&Y>{ \Hh{aoƉ׈A@` :M#Ԕe$Y2%)p3\IYn,pS15'3cuֱSn=˫ ܁wIOg-?W!TǚmQ$|扫"ӽC [/>_h磽"Wh$ڼU04# '06hèeRD :P KU/W:^cK4$ngrPZAv?to΍~ h{m>*-?DY9ϲO eL@̣ =lVgYO E&$%3BC5 >⧚#\'H#_WVW:,Ż|MU[]mB28bse? nT봜,jH7JR< baer0MINR{]vwLJtwUst13[T&28dzDs;ƱYYCch{1~adGcd˜m?Ms>¿sLC7;*^#bCRֳBanZL( r|Ec( lɒY)7 )r/w:o,I(sIk>䛉+ 20V94W3yFmp˹lǀ ;SLYڈaI“l˔Wz=߭ eE@N3,}?˥ٟc CZoJC' d_ʓ-FK*} CGu2z"IjhN}M\{χEH-c@։U)2 qZD=dgS31^@ X%EYen*,̃t+Elh6ڱ?LGnb(e$òXԁ50#|Aʜ,u{]t=Ȱ-TlY'v p'l@5Z/0|UV YN+8o c8X eZ6@krM[̃eVt9!TGp&pe+T%:%B$!ýBdU]]"quܳFBi")) H] +_Ǘ霁dދ b=)pDZ\W83\P!VQc5Xy~B<7P>qp6c59ogmcN.msX"Hw0b@h`$9 .XxkғEyjC)_h}q+k-!:d ZJqüZ\pKɀ ѐ&\-5r@NY|(#'tSf6 (9曱e5லDΟzOz7D(s4I]tǔqd*k2 &|X*$~Vev) twn:g3:&~~'|i՚~* *DT78UXG {v67[e&6lUfSoZYR*$JፒdW8gzG6C7R'Uwp޵5icaxf01W}?'?z|k etTzM4, a*">^c[.)nWs7cW[GdG!xMZM..bE)\qyo[AWv gIeLjd)N/BZX J\mSg&݌_|`_oL8X\sN.kc IAN'TQHS3bC3OFWlCL1+؋`7s6kQu_!Ρka^ȮER:m5@8&kͲ C1wHF= y b=4 ǡ gl!Ɏ$yw~X+E釪ICDx|TS͹LuVx?!1oѰ>8 Z-!LR;u- ֕}V)ſhI>oqkO \o9'=*O%u.$(*p ƇP_zJQrMtN f(\)=/BE=C*2s" ;vF,+[G#R#WԩvKLd9/p (G(u?IF>W;"W'7Nxj xU84`*hU8*Ny׈sTmpVfsR2em=nG|}3+\ѥ_1fCxd%}Q q?r !%C}:hQӁۚ-39:cM4@ax=m"bžhq(MiA- hGQƘɶLT#mCA`K ",+$Y=ݛb:?Z3V= ffs;#*a]ʲ`.+€t>9UK#CHr"ifjnyrG`p):3cSRa`B-Γ"l}JtSBww9J\_؁8Sѕ_\v>``U'EGr ȤNR).N_Tt"V(7S!8&Riqa*$& Bn'g\@Eq? `(VCdk}P}nLE.d?L"$FuIbRx8.U<1; [^7~T%~wK=1/xTR]ѩ2b]THHԔÔ,~=6Z"xG4"]Sĕ$5hRŎbs"ϓ*Y 5ehDOD(3a{gw0a1zw*#/Jf=XF9 /d1ɷraS)[K 8w@L:8D5|Wp( J  ]Ub?FTaaGuJ"^!GRYU̼ IXA\vIS +d|>IqHFXDY:LJbQR6A NeIopb[%-xCyS5?:tt⋐dM&LaTE_ԹrAO[}X5dTo`9+OmhU$irxUBmt Z@hB혩i/PzZ{pDAɝ 8)0=ָ̼b]uZ?gM1k0@qZV5ʁbi#`hvvԕgexR8A(]ƤH۩*x 89M\ŭIzA>rO< f٭IZ:[O/aaIXO0Fdř"ny0 =yEg6A@5t@V00M?1ܒ5h7HN)IY{]yb Ĉb0Ø7 x2Ҥ/})ӆ=4$pp4EH9_*^f{Zl܇z!#S!6>W}uMYɱu>[~u|ؙ\mB؀wp8˜>R>*Dze aپ? 0CJ.wv,Dz3)0b3!园u4o/s1; ')~w?)rF;a1-q*VEbUc7ꒂe* =O& nZR$dݾ?x auhE B^Ʀj%@vO#gWls@3*3FՔE>TPQcZm6]nx8Ϙ:4i41o A4vA[a֨juCk I@kک'J0]\r`׎~ݑj`GkU5:_)نo=rE<޺d@Fk mB=AK> `CJ{>VFu4]ǍzNY?zrhtX8$sQMUy-!W,*Sn4JLΙ}?.qTJBXW1.#Ys>L>8Yc;MF>EvʰAngk|Z\U.\GrՋ3\͋z*(*/щϦëZdᤨ>3\n0靳cïUncMpbQ :8_誠̋ ϫΊeօ\5Yiȏ7Ҩf03;E*"/I!L0?L41A@6wqJQ w,)[s0S~Yf֔gAqM*TRjڝ[x ! G_Śx3P`ڕo#8ARr X$0>]&ri΃ߓcPQ5jXpR*۟`QtbpRmb?EW=jmŐ2&So9i%}GS~ƃ=E\OGWEzG?#Ib(ڤ_awޣܹjD<= g[ vEP7HO˓oݒ0/7f1HH͙(TN !)=0_H0Θ5Ic"y(c,}ޒHVa.=8{^tWq\N*av\E@Jm֨H>%~Y3'8UZa,|x%D4nD -ǰ!~pi# juiw!DDaطDq꒭魛ptB& QndVd{ hKԦU@\ d'sc*(G |) de/t1/4Y)r$q:jނ'!w7 z`!1g} @vh!;dA9%zII䤹U˹IP1!DdX__S,΅?IRH%6=MUrZ/:g P_b*Tk̄5C)8 -MyK5lĆcW`ښXoBIvsEvCqHi9a=b`;V|ȝ(J{m?0 YpcLЂ]C1y`ZEt9󰢝wru潰cTgF';Xf t޼GHհkSV֩|w>a^f :P*D}ަ;1Za9 W1®eGC>z -K $ .:s0PkVތ#הga@霄.B)SsI}UG,xjՙMXQ5Uɺ۩̆8AX;.D.X6S`3Hm90ss c25*=%]!.>K o!}j:I'Wȏ|Шs^uTrKsQkJŴ;(_0<[:&W[f`EUhg!XRҗl3-\*,`24U)DaHيXo&}Iv5ײJ|J˖@\YjTd|+g}pUDL%\%,jhrnGI!Œ)ݎ5b@hw4UoqS4?2ݰo%c ca^˙KxF\&W[Gd2wo yaI:aYvCj?"n!z2D#Wē^!Wu:/TU\SRGtڽ)r1Wklk %p0quk>smav*9=^Uryu ʴ @\d;T6X |k_ L5[IF*IƂ87I ucJ ZȶFw pgLC2[! btwQOw|5[VM0<4Kˈ(E"TO-8]abRRU&Ғ4UD8)OJ˂ Ql2I蒾M=YT4R}6] )0tC{3E[v 5fyi; -.fQ.LŒ AP{)xWPI%~80$Xs<,AXq׋WXZ>oߢ`5v2®v͵ZCA'rZ-XMLJyvx^a1 WkFLӖ_aUt( .MkmEDo55RdeE ̳ʱĸs-\fgrp=wÂkgLք~ݖ x:; t;).fI hx8.bX_81jaxOUl St Eڈ:AX-X!c~v;)&l?)&tbCs"Ik?F8#eT* p$X-2u8w#'6֔%y.d5tRhI`t9oعX8pw1CMU // GIfh7UQ*Om+)ͼD]FR/:1nPG_ $˜6 4|gcIf+LM no kh;炗ޑIާR b/C䪝E9KؙΙ&g=z%nowTt|D&jA,u(; ]7Ȋo7&.H}ƛoU{/$tnlWM ^ Лc̱A:ou/ZCɞz{=l7!D7e!7FEmJa\ nݾfaʊj x{tAfN8=5άgOfbהg5HN5UY u(m3Υ4{T5'U fS=q?֬͞Q1.XL)P=rFYu-ˉ\m!8ymLdFR,/b[th#\$ztR3ǣ46X}%Y)?5GK^@\NVlUrzfTrN+Kmca{f Uɪ(~rɃ""*rZuz 9-t*q4G lePIA8,MR#ZƞnM`0 p+zAmIv&WaK ]>Ϝm\M:|w[9\%׎7DXHjBoB^6: ?,~^'Xµ3ID6vϙy/L+)u >)qBh5xV$ Ra2k.C7iZM'=RgVr4SyԻe$U(1>th\?3z@O'\   G(J]r1}Jp8z8L.0j wlk!d-5 < AD>K.%WEƂ8y)T^t ~\6 &"~ޓ8 ZYpAV̢T7UWMs&/&{Hs\ź$8)Sbo7:wKvS7m UDžL:m/^b˯nUAzA\RaPrIE nsה0 =ԆhQ:ܪ*)vYeڸ|g<va#b'QDEm0[)s,XF_`mbfCD6F1*J^CA|RS3sMOl0z5oU In3+}̙y)qt~R\6B*Aznȅ^},{ڝoJɷbVl(J* MIFbџak0w\a"f.1ൌl*w:׬q˝ :ck`{ mzQƘk1o0'*8ⷲ/q8Vx+Q:g Wb:VOHbdV} 5~E^`wpYJGh{ΚxsM.R u0.g) FO$Y*Rhrn7c|e'N2c$@8sî)Xby GYU[$s!WQgѾ6I|̚/J'\ VPy>B!$A+$+8EBiw"AV3 Uy/uwU^2Yl'* K\*ƍ3!DXݼ`OH%a6[]b\ 9e.ڧ|B%I7T]M71 Djp[727~FikGhm<ѝwЍΌp-VkTSIe`;@}G_ܦ?| zqOmz(~1k6tq>l:fvk~Z5lD!9ˠύ}Di𘎭uJO5$ՙ]+Y͙;$d5v*6{fAzo<%/־?!W3F1*yPx:}~4,gu6) aeަuv8lsZ1#+ؓA463(`K,!ٱ` G ª3)mx.{Bj!A'WِJ|tyT@E'Vq*AL^RfkͬC}_}/bg]S`%aBuv`9yE^y),ec({ #Gɞ`&l_wj-sd'Ƽ !r;oME4;/њ)X 5UYhX1_)._w8eA$'֫l9%vʺC&Y)$JzQ֖3V68IZtH"lcޓ,٭i'B`K\  dؼF5yO:ɔۺ_V"WaoͼCVv \! ېfˏzokAWz9s8]ˍlXݨ*Dksv\%^An8tեۯdu:]B*{\-7H 2r|܂%pbgtoI3OPzq 6V >.#3;Wf0G FvO9JQ.}K[g 5U aT՛5 B&0v.9,dVmaMdtj@mc _vUҩқ* 覦l'y HU!J__ CHboE,0haWy <ǟ4j8#j[<|78zI HUިa"qnO2l..Vޞ㲊5l@АyukvF0#T& :>CAٚjTTŽS>zy!j8MYRw=5j9, KrE~hyr=j0-lFlĴ;eVl9@3]W.N,~Q@ϝm\3|U0%%xfÝ;X(~%p(V3W;M2,CD[0JZ9^! ֍Γ?&} ;OBi$S 1ΙIzrjcAڷ{,igֿ㮯-5n%}Μ XWJ~)ruH^t&O9p%/C!0Te#0ĊBBcG5&\%9%Z{7>ЙQIƿeY*\#C`qVjk/[V-pI;POVWL>pWuWfSc/*l(՟JQSCrN_ \l6n1ь1Wsf'{Ӿ&?Uӱ՘bF5}oե/mV3|0IݼINJJ~Az3AJt)\KVąh,(Uhά֬܂l0%X2Tiok*)d4^}/ ] d vzg`KЀ1Z\~ Hߨ,Zz\EhQCA)6=K^$v2uj{*ټjΫC~4 4js:х\S.:ZIv;^M6HNCձ|,bڹvڍ(SjJ3Xɓbq< pOgL!l'[F #S]5׋N\NJmF14D< ~<}bɁ s".o !Wn66+IcO^xLc,^mv^ kͰ$/}wLn'TOhv-+G}XAYU u2_UUX܄=Xu61pp$yV^Su0D „VI ֍H#+aaŅt!x+';&~w3Zuf3"#`r(ي)/z9Z3wLP WgMfMqoה4T)"<G sǎHB fa5Jd}H&0֠/#t0h;g{6רkHUQ2}$+,@ KzQh$YoުÀ'/hooTTLx{Ҥ!<]<$1øA|IM ,PJ|?wQ5Otuԟ7&) ;z^7Zѿ2vYeZ|nl#W+"Wa9B-~ Wu8'GA7hlFj[,jI-ڨ*Ga(f59|6א%C\Þr0RՉ.5ߤ]r:бZ"\풒pp#/I2YD$fݾydO׻efuU4iI|%wRUyr}7úL&7cA(lQ."KJ=].gxb{k.k8CD S=Zfn>4Wp=Jn wn4F2wŽ[54.5rNQ!cڄXUW_ RϪϦwg2c@{S\ƣī5H؞s>!r;Es{?MEV TF*yr{;"Aղgown!: T SWq+;aKދ`4K{n"[;1:ԡ7q힙VHgi7J|svӱ5$g$_6U+bdmc<]3 Z7~[s. **M[t?sfM/f<hu|qeS]l÷vj :& Rkc:yiI}H!X2ؖSY4,tg5ja@7>`fT>m\Ƙk* B4 aoaUe0/)\*}I'8l7mc0AE(dM&阫IW!E>e:(]X*97f7Pa|^'{8tzĚAU1f!zt'rUTm[*Yno%y㑕 y GS]Sg'gf;>.{J$rƸ d:z\X;TR(q XH}y}B~j8ڮj9t8j;!ftd2mD7UEO%MݨM *3p{{+M6UJat9s3耙_$Y_i 'բY\ "#YQۑ! 7}_1.~Ӣ ? r52ru|w..i#`B8yPEi)04vKZ/C>;W Eo"(0[-^90U2|p\wU ɢv&E+)aKxd%sM$xd  H,yhUqPgc훇[xf7_V* ?!!Wa{эtbdL"o&4s~(2;׶ە[Gsf#K&d;U~zG\b+᪋W .٦BI;᯦[}݋El̼CYqM=(FȊH]µ¤+G.L:)+EJ~&y30 ڽs`g9s`oLqeDɞG ~E5 7N'Ej\b*Bz4v>I,~Q=Bq<67P[G'`ryWDR᫩?_'S|6UB [iYrܫ\Y<[<~IP0rH]>qB,69y?]-j;#G\)^5~0I0d\ŌhWнJ)+^ն[DW)L~w-s/8*n$9tŝB5p[#_pNyWo+UmF3(ΥsD5XU;=t| }<^\uCUż.BS%WrFsRŴ;Z҈֩Fݝk89s\=-0 c}ߝl R*B/|tF56zxl54|ҨbxJ8Ҏq{[HՕw$=;<)s7wGlƣ+%k>-{]s˷%/*j'5׸ɻn3cM(Fxkb?r(<YPUx(y5$/"2xQ 7{CĺNi#/zpuWfNxnL2v+ӆciC jjhf9k<-K2Dqx¢7rX =Vv^}Ver>\] l&})yCoU{(mA".oI$PrDoq<w]$Yf-s<>%?`FB=埬 $',R\J&>5/IGނ'*Om J Y1niXyKCϴg2͓5]J54YtraK\M{-W7fm14X 2}M^l#W+"Wm75ը`sRGܓTXB=;WPv$ ،BRke:Vk{"/fY1v,}!! 6Om@, rt;ֲ|w!zTH΂/}$KkȪ]yT)k2I\*mn]\5]Ql:hzU[ǐBRrRiZkY@2ɰFujjL"\.NEl[SQFɚt ̻b˯>v{KvMM\]~޸= mMEQg]ɺ1;'IEa]bZj|7@8"ۮ0IbAYPUX~ěGIݿwu_ % ;$W-5񣞹"HSZQlE[eUg<^/<[ljW07 ɞ|=NX~s;.NyR1xS$ F] QPmGw(Uuz_`8chP>*EOX֔g5 ьpk*E}~)~b. 2`!.%/]iV1]_.g^6@p0zâ>\ 8xHojljq+&WScZZ;VmhkmV)*6NV.5znܾ.3QssºzKZ@Q1.]jK]uϽǘRSW]C;oKY[X6Fm'},P\ȦU]jv߲JTT>Qa64RW)~d7a7%/akڻS覺wv\9N/ zovR`J}u V'iI*u%]ҔSsmV#ХXWH\]WO4N#.u8c|%S,KY]/v)x|4P_/U4/s{SW.i&+sjE^#`7.eTW]I'#C7Z|÷ ԙDia5?ԵLD^*5츿N4]Kxt$al&[;_I]b] e9 vꬮ /hn]I~]yՙTnZښU1pWLO*J]2v ]AY<:wG__5,ӵZkl.|"潒NZ,)JctC]٤VDr=ZSED 1e{kMFAfgcFGHnHũM?* =)c*2R>j9Vs$cáat8!t7{雈n<Ħ{+%2wuqu_];ϩKɕ-}jpeQB[#.ԘCcM'rOWx 4bKۋT Cˋ?vk~Ɋg\۾l,k[{ag@aޞ#{3\Q:Q.ʺ)e*˅*0;yi5M˼ͩ Ҳ i#j{hrUmޥbǙn[d9 a7ι]J^]]K#i+᯺ZlucڵO"!jBcAQWou-8uumeW %8uR]z?ՕzڽKuuAkluk{R״=s[աlwz+e.d8uY"'DY a]ksQWczgP@Օ&WQSkF^Q֝Kyx}pCAQWͮ;VIUͺ^| }QWY쐇ܭnڴiմ6&wUWxNH9JybG|W-[=kּWʓ_Έs<xRnڴyMwI)䡦Zb]Tם~ws6pZuھ7RW=:ȅ wM몮{iյCi.oVׂN;>>pA]]UL^uUDۻQ{wu%~s~Q]ͼCo0ӻAF旺ƤuPWscr߮յ@Ky5u%f6հ.(Rd;GwQ]G:W5_WFEu<,8lį?vxR'%H$]^Օ(ŀF8M֋ ֦.kSux2 xﷀGbߒ%-VgsE0/G]ݪiI⋺:um6no"=GƝp?)SkQucmwE5+ꢮ ӷȢâ'u}ޫuuCs}TW\eK>s{$ }Lz]9~4ȩ^A]>` +1b"+oqo95Kԕ{yOzKSxt9SvPыڸ~*]n'jS1\QK.tlؘa_V%J]1-:A=KG/' θ!@nj5Eq+]3zɷr9n1e.ﷀvҞLP {q]}߂ 08?\>y)/$zi˂-.]_~GX96=&W*dۯv?#51d:OuS*gv7u 'j2tݕn?tιہ}qo|j!3cb ӌW}迺F.!vrk= D^C]]uNxC]iruԒ ?񮮃ƭ0l"Lܾ:9~hToֵt.us7u$mccAߏ4#P쬮98|_`Ac/NDO7368ԕ7-Nw]ͮo=a|4~uuĩF]Z\'up:>|P'E]ѥ x mArz1f|;/~ۂ뼤}"Pv>Eu{_#S[9\eF5ۚTUKuY]XWWuk}ao~{QבYW:YbՕ&WeZ:hl{?N{snW]cVW5yo頮M-FҾM˶yiK.Dmo2|=`htVRW7>0lthcn\ڨb;f/>G.1U _9ٚ:\"_`߆ըGD#r}4D;J1J=Y c}100pD{8ͩ)n,-%I|xktȷ>u㈺v+iu}E3so'u5.!-<'W<4nRqGV&_A6n/2vls#( nE2dbԘpkLu.=G':5Vk]II~Թ ڥ1+߱=6[( 5oA8u{{$-mۻ^S۱%+`.,v襽TZ;XWe~z3ƿF&UUf$J- ~oݵg bki^epdE] CRSWwO]ˏ_;On)WWaյE^,[xSv]kZ鿺_BJu X])gۻ쬮.̶}c(?/ PZ?U뿺Tj_4}Օ/ײˊ) P]~v좮mw.rLY]}[YoAkS\k ڊ9e.牤ڻS׺ SÞVWVJV,:-:Y.UU]g r,uş(M*յKu<;QUdʬ B\2).2pyWW̓L>Ң({B]]zp޻|P~2ϛjZW7KuՀkb]2 QrvC ]i B`қ+fT\kX:T/?qjl}?{G}`׆Wmi15,3^VI!t[hF|F9_›2ĺqSh,:r"q|QJ"oKIǝx W.;Ԗ>X!Ur2g}E;+'xbfm$3ktkFXE]2-O,KUeL.5a+-MSaWR}ſ+MP;MG|/QTƋњk5uupZF6o׋ So(JsfFj[XE~V3WΊV)mowSz!5ȒE?HkE^b'[ Vm`ɋXwg}c%fϴ:Z U! >)"woRԔe۾<>^Ն\H`B'gמ+Uɗ<ٷO(iu?*J2x2{W 'Tqxkdߤ8UBhP{e'(`yX57x ԞT\Y\.j)OZ!GLfL9w\jA(ksÌqKk?K`"=V޼Z!ᕝb- w=>RTzj#>W>JijVJ[pC\> 7v Jѐ],0̐S˥2OJU(EE19(e[ƫDLo-~ $[' 7.΍cFܪj5^+T>޺ov+呯*\ VqRL6PN5NJ ֌K 4*~8{VYqJQz[;W Y* ϗL+ @]s٢I,˻e/'+Oe"ؖ =㐫,fsser( NsШUOe|g慼WHR@ %,ߙ5 !KYAyCCt Cލ?j4@~ke&U(</c hР+1:Չ^g LG׋SGd2R4%ٜ$S0 2>Jje si4$wW(.76RV#*JdX _,x5G8oҜݭxߨLެQ-.yFHwd{ycpg#F\~ =A։)[5_]uOOo5;:Iв +KG,΄O`*dY.m/}7kɧʐ2ʾ/PLb6l`L\uw?yPܩY_ZZ*fNs> |t-KRoۃx+Lz"-EY&Ywc'7/eK Z 8-#_}xZzq2w#//.ݦɚ Q{>ߥX%eFZX@Դ֜Ap(ޫiMimE ˍr|"@]ǾŞ|(a'}QYUEm6TKh&:ƪ#<*b<ҪPVS٨fIUME>>6V'p .:\.UŽm:JW/cVV #WC(!$WvI\q|"^5H1Rc&~E(noom7ڼl:ɚyKZ,UQEVA-ssC1m͍'yOnxTe#EzXւ`bEEP+,XP +B@ BwF^H/SLIr̄2 !3w2}3sgNᤪc\Jw[g}UIS'U'_L1/ 鸱#vٛLyJa8 V&kҬ,y<m=* *P㪤 ȌS-׎2mJWj]E~ʣGbAcU,U d\mh0r▛^=wdFξ)iW&xtۨs>Ԋl_⓲1UU‍]?Es>k O.j5n_gI~( ͋ȳ"Ϯ}$hwYgW4箟R[*4{÷G{ YNW\3mi JU~*[A[2‡XPW꺬{*m=* *Yqsy?KW]WqWl*fnܜE^jdթ ҩ4t<; չ̟+t^+=sW'x8 zƞ'\3mU{q CG:kE^rAuwyq> ʄb*yƆ15gee\X(@fUyi[ҜhW/*ȸø dSq5sޫ}8b?WM\SkߞcZU]*N^7}}sWKT d=÷EL6]WRz,|!ϕ>JBu-Wp@L(VNY;&3h˸WQW̉jEEYkTqHd\a\Z}:կCKd ڗijѿdn}׮WfquFrU q >qgWp@L(V"7~qqȜW*rbJd?a\WqWl*jjI4tGYW9;c\KzM՞a\2X)VU9Q_U?@[eŸ¸ dN\鴚:e}M?ndWDUU Fѿy4d{/"={gww1Z*| JqUR+* b\Ea\2+WDUU G> U;[yDmifq.Ub\2X)Rwpc10108@6W-o/jWvpվh֔jnY_-|yyC.Y!+mW-c '>WLL ~$'$4T3.XHPHH=OTt4|(4,, > e_2|;$<"> Fk=wĮyUXUxx,{jGkȬbit'WPEb\^L7.a\uz:..&66i$}ǎ%#"#pL\(\Xa11a8興0c쁸쁤Εb N;1)wHʦ}+ĸQkl翻hwjw0:^\%"""""""";c'q*5MMBFy&33nlr趄*ȴ999_loH[65)f^)a1SjJtҫ5u7|ZeؕZXhʆ'*\[DP42uզ&U}A,I[ʦaW5&3lRX6vsMQ3517VpOk tkՒ=[U:yVِ#kʢ76U6$9W>?E\].|3zWq.g?1+,>6*m7<* U#ψ{oޜF媝ݑX}_0ߟ_ҤZ+.Kw _Up.!!Ѕ5=Y ʕ_ UGdw--kH o{NN>o[65^))FWyo~&[a\%""""""""BjGm\ N 0ܼ-#G[6fOD+"yڟ j//<'5_?‚,*f7kR~caXUs7gjk~tRԘ,jMMuuf S{=V@6_-Ԯp?0uqUyԆoh 7 nOnjWVNXvx 4AZaDC\B֩ɚ:ظ곕fTC\oIjms voM 3 *QzWg!W4g9xCFGO WG\klNqcEj°>NVJӆΗ/%ɂsL=&Iqa>]axف"tMʦ=vf{ Z{}Wգ>{-*k(8sۂc~i~GlzIW6]M lu,uc7aZPG3c]-S_yL+^o++)w?&AO6FVhzqzzC>LE4g>ɜזmk _ny52N~/M~+=9;37fD] l |m ϶gxؐ2Coy1G[>fѓjuZ7JG3ıkN_usk +Y:L_ <|,DդAW$˘~u'_+;ޔ_mjT+:|݀/[NgU=֍cۜPqpms߾G>.WEόUgzς~V*'Ǫ4޸A=B#~zs{\oE9IM2[//qdʳғ=" ߢ'gg2{{~v&&߬3r/l|m߂g[mR]%+O[>n%~$aٮT*Uw?mN(. i{pE>j37kP{(v|oM- Ugϟչ?=,L[<`Ÿ?Aۜ&]IO^O]6sKZr 8͌[GggNoٙouvxN>϶om!ߧ϶=W.:I׭nnE,)G-555)))jyyRd\Ay! )I]yO:c}΂/w=?P}NO&NӶyoU _4ߣ))<[V='tl1=#~/9W1a P9Hfo𴅻#虱˅?M R\[b{xv;f9fN9ggN~|g[w='ϳ-hٶq% %/^IS٨IMKzHeٸZZZT*333_XR0mMinֺ'l u[WOYgU/?j髥S=>y+ >ߕ,q{:g 5O|#V+^0l c)p{Kث.9)P{G}OtApy87ݛT3.l&|'ggNoٙosvwxN~s<<&m{WoZEͲqTPTZR)˫Wm:?ofhNRur /[$>Xˏ%{ wOۿ^+wX eNnOkq{C~6g>U?7>d`{qoz{W2>wpͫ xk8fN9ggNoٙo\/l [uyN~?8޲ڇ~uHu\-))nWTTTVVVUU1ڠ}]}K?V+U*IU’)R0~MS<67Z]K~q0U~o.<-'4G?Axn~#j]/O#NQ7j>}˞BR3~S[xAƛ*䷢ 9pۿ\oךsv7f{6i7/l [qg[mwgTwn_Kꡭa_FWWe/KҟG7 )?_лڥj1W 7L:On["׽Yn' x:7Gz>ʨiWOrVVP7e?虱?O[++Z1Nu'_mٙouv䣧Ŗ&ߌ3'$_;8]oɷζ𙱙g۞I'Gj쉌s_`}(>4}*- O)ל?\0ّf.nߋڥڄٷ my-; Ac~b'ߺ9ۇ WMw7s{å\GYnAxdK+Tq!_dͼ|=363O_-\5mC[s9;s͜|s=|svwxN~s9OL~_?,>[65NyxyxA qkU̷ F)0>mocnb&RFNE_|QMWgom'\% 7_sjI7 W>Z?hkUy12,1ʈ)7 ?Fu-_WPn;V7'A]C zyCwȜ|N~kvv;f9fN9ggN~[]~֦&g[ƳmN~>,JEOyr=(2{n<𴒓ouښ(S 7?4**6QW!AxH͘Ou7arྟM~W}jK|u' h]Z{JN'K<;s͝|3Μ|3'ߜ3'}ֆ&g[ųm/O~>8J<*> ,\Gaj\ͧ" |fՈqxB5hJ׼M_OCXWGbM:>5\}sS[|GOiJC\?akx˭N~/w]k =>yL}k|eX[eϑ>0^%/KV=-_ɷuggNoٙouvw/a\%""""""""1Rwa\%""""""""1RW@e'N#!"""-U""""u>{_sǰ8n-'+4!1ƸJa\%"""}7reKΜ:g5fTDDDD1!?t|$6q)¿i_k[_w.z%^ŌDDDD6q נ<Ӧ >JDDD4;F99WUWզ?pl,T^K¢.Pi;;c_BH;CkȓWΝOOYqOݧ_rSxy㪺"v{@j }YTkHDDDԻW3DDDDMW]NN~yʣ}y3\v>}3+Gۜ9oN9Do響1\Gqm~σO/֌z⪦\6I'^|Lx°yZzzUae1t̳IO,SkSuueEjq/,}k3Wlvˮ)zEpc aeJ'[ʛkj7nw2mCS ZSrrzm"rcNw|僬C09zzU]~}нٹZ}:ݻ!t/!/T.ȍ)IϯwSmSjOtp-o,=z{7Gk~`\%"""BД7g8]sc3\ӲM]A#^讏jZږ׬~v;&մܣ_3 St;9=*YaԶqUNwO,Rժjɳvrzl~zOjGRRt sGgL+n{̣Wed>[qЕF̵&x[+oA3l ?Ls0i+sýl_ :%E.m8}T}) vInwDNjM8wu=ug=kڢc~hhW5q29 UaѾmdɯU65)+\_50g!y =y~㣵z|b DDDD6B;4AW4es*Z~TM'wwW&.iAEqcaq◽>nRu5EwroA[1'Zڦ*q8Y4։{a6qUWNN}oҩDUOq\0xvZ!6*+.n 4>7ȸkOjjW| O6v91޸xbIaq?*OxE?~y|B~mחKw<ƔYfM_jen\urz?.Yz(۷+Lmۚnʵ9$"""E=W.:Psv5u QZ܍6*QʳCW7~Go_cX{ruV5~PtG̿,7}w;%T}\+N[ exaܴ"J4 $"""U=/w׷޸.t̄v78*lBYWkQ78޴y{(A'Blz|_c%[|Ї`U#yU%z=##ˉ.ߛ|HӥgdG‸2*^r@֪W`\L.{/,1Z~~?u99r> $-|0zjoŸ  + *=* ** *ȸø ĸbqudt]3`\ qqqqqHd\a\b\E׸հ -|JJ j U[XPWWQ̎s(@"***Տd$[@͓'/020qc10108@(W-'fw?nZ<Ƹڂq8 V&U .{,UU UU qqq^dydx'3Ė`~+k隟-)j U[XPWWQWWQWDUU U;ϬO +f$ב}W3YUdϬ1zu쌫(L(@\X(@(@"***}UIS'U'_L˩b\+tƌ-q57 cg\EaeBa\b\Ea\b\Ea\WqWWQ8 Νxh[BqNz685N.W{Ws})/WQXPWWQWWQWDUU U{÷G{ YNW\3=ø  + *=* ** *ȸø ĸbquR`዇ g q_5ø320qc10108@(WKT d=÷EL6]W{q8 V&U .{,UU UU qqq^:x#}%j0ʄ¸ eŸ¸ ĸ¸ $2010R%& j0ʄ¸ eŸ¸ ĸ¸ $2010RŸjYȸs(g猫 qqqqqHd\a\b\Ea\qղq6*m7<* U#ψ{oޜF媝ݑX}_0ߟ_ҤZ+@-1scKb+5g]Uqv5liYC_~s tyۚ;l_nQ~}~iؑ|56Ȧ8h\UgOY=Oon2/>|t\ո%[j {Q{wd1a8&.{H.{D0ӧpLAAA\Ҳ1J>) > c  I8s> dS˾Ăq̣6gCn^閑-'"im9h\ \7οe/{VuWHP:}e^wGqc(,/ ,/ eGm\ps!ᆸzwk<:1vzilmenjrI?h9ʚJ3W׋m{ٜSVTP=u1Ɵ<1Ԏ4V5Ha~UmL'ANZ c{u،qwGʄ¸ eŸ¸ ĸ¸ $201s\}_~ث 9W=1<^qa9ō {_$8Y+M:__6D$ v1a&ŏ/\<'.:>pc5<7WW׿lQYC8 F[vaٛ[jaG qK/ &6o:Ƹh6븪)سe灣^^73c6CvAc\aeBa\b\Ea\b\Ea\WqWWQ8^6,w+691K|\W#3<4huԲtQ:>!]s W][[X!-pJ)f$xjLi\gyeΓqzmSR^өWO(QY]Ws(y͞iqZؖUy?|PrTvٛLyJظ坒-WqXPWWQWWQWDUU U;\%+O[>ne6|u|V1$|8h\UOZ1Pmv|gЪw}˷ظ*ny$p3d:UV&U .{,UU UU qqqŎꕋNR+f~]Ă˾WW#`\u@L(@\X(@(@"***ΨvݾΗC[þ@ d\m;36ʸXPWWQWWQWDUU U{d/Nŏ皿W[@ꎌ/3: V&U .{,UU UU qqq^eS9l}ٟgOOԘW[`j cg\EaeBa\b\Ea\b\Ea\WqWWQ5JEOy+dN'͂N6vSH[65)f22v*-p@L(֏GşR0eŸ¸ ĸ¸ $201q\޸EjjRf[٫^) _j c7lZX!Х%MM6+%Bq<뛚3]NoiŸ  + *=* ** *ȸø ĸbqufQŠ_}.7\BPY.\UdvuU]rzc^matažbI-qղWobeBa\b\Ea\b\Ea\WqWWQ8^$7Ub\ qqqqqHd\a\b\EzOoŸ  + *=* ** *ȸø ĸbq^dW-q8 V&U .{,UU UU qqqŎ-}Ⱦ1Z6&/z Ա320qc10108@(vWo_KvN-pd\m eWQXPz#n~] ?ReŸ¸ ĸ¸ $201k\j؆{\^ >%%q6&TԱ32X;VqLMzHm=* ** *ȸø ĸbq#Y#z q0Ow7beBz\=:&-~6qqqqHd\a\b\E׸zl83Hq5/0z%q qp &qc10108@(W%# >̮'}xvO^YSOoLW[ 㪯sW+ *=* ** *ȸø ĸbqUUiPxŌ:j&,U#20qc10108@(Wc 'y0}!q̗_G'K/ bĬ:qc20qc10108@(vWs0c􎸷6_[DqSoJl@ֆ jϠmA;* + *=* ** *ȸø ĸbq5ћ?@-IofE5ø3ظzfu쌫(L(@\X(@(@"***U׷ž[AЇxlwP'ڲmv x'KŶowhr]WŜw6ɭ3}I\3=5{ϧcg\EaeBa\b\Ea\b\Ea\WqWWQ5GmВ\'-/y6 ek⪶,uc7aZPu5' xޣ㣌;2V&U .{,UU UU qqq^̗\'s H|䚱Z+l՟=z0u}:[7 ˸* + *=* ** *ȸø ĸ¸J}.\3WU?]1> eer:..$4> },{y)lz8;یr/s̘43',О IPuoyАy4 J{Jq#%))қڻ#+(,Ɂ1%''[oٟ ߟْôAҲͅaIpJgy0͖cRSSomp@ҲIǑ~E0SZZZYy9|HZ,zڢqu<7rWܣ r0eϪN?ٝUPi\eP{wd(qYV% ePxY ^yY^@_ 6H)M6?FjϝmU'G yN&W线A I7WMb\EaeB靸ZyHm=* ** *ȸø ĸ¸j/&KiW0I\=a{j:ڂ}]}K?6ߪ%w =R״Wfo!{12X;<)UWQWWQWDUU U;.㩍# q> qи*jZ9YJ۫Ea?<^fcp\ {12X=FH]OUWQWWQWDUU U;.h;츱Mnzw|7V[w(*^<Ͱk|Yl]|jxⷁJMI7tQSqF(4j1d툫IHCh{ul_pUu{ [~UّfǛVР }v <3(<\fKd\^?mCc\aeBz\ܟ|8I\X(@(@"***Ug.z{IW|E6:mѐ.ՕMt HNZ-;|\?wVJ(ް+hk US!_S[}b) ooS56Ə `|mEV}s=beBa\b\Ea\b\Ea\WqWWQ8{sk޹q9%T\Օ54ĵ$*z_ #?l,xQZI븺>xMc_6cN/ՆʬFʸz37?5X+vXJk~ԐO#妞kq:Uʄ¸ eŸ¸ ĸ¸ $201q\]xy"KX5rר_^r1oJY[[κ.n QSt1 YP~:v҆puSNo6r>sn6_g C>5/mU]4xͻ4P2bMˣ=ʄ¸ eŸ¸ ĸ¸ $201q\]pjSmx`"^l%ޣzneJS4qk}_[![+zwm᪆Lqkߑ \h[UO7H&U;V  + *=* ** *ȸø ĸbqe ?Ti μl}dJ#^^gemmݲWq {B}.erW~ɋV?v;reSSAP;j?ZkVcc>7RK¸ڂq8 V&U .{,UU UU qqqqFy},Si\h3;SW:J`}8%W%kKTW545jSc+i {r>؎[5Ro^42|QFKG.tlؕ{cߛFkxu_q1ʄ¸ eŸ¸ ĸ¸ $2010ڽ%aGjtqFtc6W?XtVW-bKK%K_^֎+}m嵎[65ddﮓgĸjY5[A;* + *=* ** *ȸø ĸbqu糎sY"iu겥kNi_i]m=2}5b\,l\==Jqcg\EaeB酸c#A\X(@(@"*** =znU"uFd_^!n:vUV&ވK9 ?ReŸ¸ ĸ¸ $201u\}e1ʄquѿqc10108@(vW||gdqMjS41͸Z%Ȍq q,=y'qqqqHd\a\b\E׸Sp@e~ Y*ٳGfVDW[jƦt:tSU+j!}ceBz\ ߝ4^UӓeŸ¸ ĸ¸ $201k\H[x m}{)K|5bȀ Y`-qs>nxU jEV[iW+jخyw3.{(UU UU qqqŎ$΄W<هi#w&ͪc\m'~98cM\Y//Ou.M07V&U .{,UU UU qqqžjLA7>$WA2>>=i\zYpk37f\m cZT׷ZT_R0uz6M՞a\ 7ܻˣÏqc10108@(Wg8[CK& j`/:N5ꪊZռդw+Ǹʄ q5qΝaGjWQWWQWDUU UU껤wa\p\mWtڲq55i2q 7;JCqc1010j45U5|PWl3jjZ>q:rq;/emRg|Ov];cb_3eY>.RQWRƸV* + *=* ** *2釗SI@a\WzJE4YUO]U|~ǮxoekqU/J731V&U .{,UU UU WUi#|Q+jewd qUSҪk-:ڲӿCf粂syUW-tjɸjXPWWQWWQWD3SX{GݏZFOHEnZc\N<; 8*U[Fsgr0Zms>r~ƸjXPWWQWWQWDYi0k層qU..o1Uq:|{*Uv(C\u0Z*-p@L(֍:]iNpc1010Z\j5A l100Ww8KW̊.h;츱Mnzw|.^Y݂gj.FxK;vcqղWobeBj\ժkK73vqqqqHd\qtU./HS U9qqY oD1M>2^?L/߹/dkL2E׽ANWW865#9jHH7>S0Z8N!{ڒ EW+ *=* ** *g{p:|qJy#ꧪS*8:G/B 㸺EkRQy>cZ[;fؕ~5ou݈A3"j*pk}3 %Qi,`|k޲ؘnѿV59xaZ0Z*j5B|\W1:V&U .{,3V]'p*ϊ9XU UU W.7IhqtWR|`jmvWaAT-^/Ȅ[,zqޣ3[זR)LUiO+suc'mW7$ 9We7e$|IU7SiU9I( zUY\iuUʄkqUDk:m=qU>FVbGŸ ĸ¸ $2vPq5gρUzyiZg*V9lxeqxo)X=- =G\Вs? Ti μ $ޟn[ryY҈WRݘ2f+?6EE:`Ub>7kκwq0@UMRWq5WvNJWQXPz),}cڲV?jeef\U++̐c[WWQWDqu݈^FݍT?+:w繾2hiߵd\MHY4$x"r?g\rj2&?ͅ&oԕPjK}qdFޟ_XgemmݲWl{i^Z=hhÅU~o{h[[N֍K06[5!Zu>n_tʪc`\EfeRUI^ۍވn+mȋFeAV`\b\Ea\b\Ea\q5/!6W>Wku7k hwp0繶,sy{׺Njq[U8nU )+T매_d#պFܶm>#:]?({#[,ziĶv|^Ym+u >!['{w=#U˲Z꯭W1ڷnVb_l7z!~.1b1TTVd8 UU Ws|cq^Bwj*d,|@Ylsq5X+b@cĸj zW{>K(]i_i]mm=2}5b\,p\-ٻ?ViUT[sgm U U,UR1ڻ<|$q.tBjt:-|$]q5;: T<+욧m.~fgn@z W%qGS2ӳ|* Wb\,l\=3rLVjvt~ 7d-c\Ea\b\b\E()HuiHH*]ڒ Ei>ظwrЎ\ O]OG[qWJ\8kL*kDŽ`ͮ3dW-V⪺&-0fr? c\Ea\b\27**}Ǹ@(vWKdr= IDh\IN1Uk3e{׺N}\4?+q\woekq5;(s{{7oMn bLL&{ +"Ҥ(""R,(} u)Rv7uw:|~?왙s<9kZ/pp<)*%(a6^ {'WWqWWqChpUnK6sRVJpUȬq*:JH]wEUk1vB._ý&x8x8x8E!r f2}ޫrUOZ!>'Z\XE}ha51E\K\Q\W\K\Q\K\Q,j.'y)WvU\\=6.>pp倃UO w=}'+jJ패@BSIkpU-;κ|a$%ukO߄{MLpx W(Uy$DU|EUDUEUDU&-qPY骭Od\Djw-*'y.*ka /; \p J2Z!JO )귄\OJǟgLe*}ߺ懕VJ;/7PW1ncRD10gW˭v WI~u0  :IlZ%)ِDU+ʶpf \mWm~GD"Z\Wրyb\"*"*^"*b W'sSV ؊(WDf՚/u`BψNZͫ?˚rN7#q* f\ :Z WAS=t=r ~pb:}j '*p{r=Фs?{1~}?gx=4`Ϲ=?;;~rOj~W#xi:j܎WqWWq _z'NR;[1~Vq'2"EXS'W}j vkYr? RT\=6CB)ı UjJY SSjrZ*wwϊЧU͗?S^)azY([/_yM)Kg0 1s~JϦ{N=[~YpfTUZ7ֵ(jG)6LÇ<>nmG p)Ru$b{toJB+J tFN`?*=U.r _*dUTp\wȔE˄z\*A HM^˫{M ̞ssѳ C*WD[dVWW-&2X'^pQ$"Hp#Zĥ Lҡqcxg\hg6GNA,6y%z_Yq*r|;q}M @)ҞasU%"j7IC#븥kUa?Vq'W#ﹹ}"R2,|2ł#12DF!q~gGs(\e_@ʽu֦\[ ڭ6t)?t&51EtL&-&<`{SbĽ®$0{m̾b^_OVn^U,zSbN'S(WUeUϷx#5qyY_0ً:B <@Ȩ&:fpS(&IǽVnTn5gAMkbX3{!̺ŭ*-a.9j%v= ǰ˯<أ9I>5ͮ3^CStj "zeSS+օ~%b4YQbTڿ!s 6`S6t;^Y&uX}%Z{t̥rldL;Qń]p?M7 ˳ZHUi?~aDnƵN;*E _}y9C W vO,tiN Qs٦qiZ y.0-@ż+)U/׈.e'-.#{L 땦GiXe㷘B!Y}EG1-VEuĴ檭SwΗvx,5dM+%RkSĴx%h*८ʧ[NVB+f͆I1-7-L0Z(z;IW}m~9 i;Y ?ʡv:^|zN `k^@Bg+=eB:+wDDD߿_qdr pnSoΫ~=zKoV;v?Qp~t(wwo+{MH>!Wt Վ[;\Wk}^nb\L_ ?6WWkn^%dٸD\ÅY%-jT}˯KEc3񇫽:(ǁ=N[ ejg#=bp5Qꀬ$vK=WAUd NsY:ma*tܹU fCCCM):Qڭ[m \w_HZ3n[p^Њz ջ\5WWkjZQfUѥ}pqx8xU*)51,jsioUpu#U] Cg=V(pUʡpU*{aju\ >;$d;NznpUTܹ=--b1rb…Ə7,t<ô#3usNngJ )kkջp4^S{%@=R18f;Wp*GU+8pv¨\2+[u~՘x-JU-_sW[NQF!NIʱBئ 1Y FzP:j͎ ƥ> t_ǭUrM52ě{tL 5jb~mSoF{nn_mP/h%Ξk5&.hl8nݠJJr{*%c~ T6gx2cgr4$jK՞zA7W((էd~Z[pU)gDbVP90"*bWvMT65ZĈ̌o臫>pd4%D5lo4L¿aυ}> # W (MqW~_p NqL 1bĥ\o|S*ϊ_g?ϷTŷjhye"QwW4'_I hٞpƾ}jՐ^pV0Wxos }v`\;"%(Up=ځܛt.\je'd:\̑1JWRN93n6W aDU2H yAFKBz$DŽ7eE W_F1|+m.}#\mOR8ppͶ^GIUW sU#GpUP,YdرoۏW:wuz6'gikE;c+k[oubw'\n*m̪X+,\y;lJpTpa kbW %*FV%=Ӱj3 YSjo-WAm"fݙ WcgpF\Q,*d% %yܳkUUZ7 WGM2I2p  v6Bp"*!sUȑ#L&\N`w,g/Zd0Ue79o}f^4y`a W:D{ W{mij L7pDpN-ǽ&xNpv\*pr[ANHFpoip3{fuW)!U}IUPQwƓx8eK*>`BJ;(p|0{ Wl}jSjw{˝ւµN##\]GhSl ?}3.QpaDUBtpN_X]zٳ?cƌiq Wet7g4.q95\YC?:f kjYpaU*2,{p#+Uvb){06\]360WO{Rþtɮ *!r"*IZ}=FK6^i:/!o{H9IKE!WjpV)q:+7ҵjHٵbbpU=zTkS\KNW[}$"%]vK{#ߵJlS1\ݭ8p5v}|\/ir@ ~btxkv9:?\URWg5w ƃo 8zpt{E`p9t<z;K͖ H{ޏ҆ZASB7)]cxzrjꀲ'\>MJ -tU/\M,IaPFA^s'*^2@sRVW#C0D\ ՁNr4ɦpz_ l)dft2WH\5[vwI$j4\KW!$0Zҕ*BM E'\e\,yq: J鑓ى?W!m$>\=eWqWsU-FK>EpU&NS~)v7)!}˯W_~Έ&NWiTN\TjŸC /ڳR9KqQ~aS5rEzn[\TMׂIWqp"Q̃cfܾ7PPћZVwQ*?2P&_ テ{+-vp WITpuU1\=0ۧ*R1p0& fVzjoYxC+UR+jCeP x^/'/k?6ujA8/u=74lD t VݮW\rRVʚL&p/p/9\M߄uoX\=S6u6,ְLROh/:AzjUJN (a6bT̊WJhsHc'C:=OEk}_fXK}*ˈBUe1\_hOq`//\ qByoD_ kݽ \Qi4OOOؘp8=j{u.*=:,\IZ˒Q> C;(o$nÇᰕuiJ^EUMpuW*5 v.li ?6UjA$ܛt.\l>Bb(kTQ:Wc&N*ZamR6.\K;5W a\pU5}ђX ?H(EٰXU#H7YjY'puU= Oq,z=L߃nQjs1[\mqDpRZp.#jJݮ9z)%S|ꉟD!$oSf)`|WFK9ݼ zd.᪛_hO>85qޣW VsÜ_ k˹* cǎ]dɀ\pB {ͮp2nATcQ aLKi W䤬4Wv+Wm"Bo Sil\KʦA*i\ 9WMW-jV p@jSa)M.ƯKZpqW a\p{f) p5~^':|*e?mT/};Vw W脫stǡjCl0œPkvN֧6W42 jȚhъp1n+bNgur\UR@Yqs_^I޷[$pd9\ :WYF?#4.m V=gL/wߍw+-}p, x㍓IICJrayR8_8=7V(_Nt}L{/XOW}{lp W!wtH#&‹%:*>=rekՄ:D\ rN{.ڝpՙdC/kCAUWى cqovpGT/鄫쓋 1\B]AUB:Lp;iqFKcLsyPeTa CϏ)iV\}̈/}#[9K!6\m"co+ W@t)j#COZ>yt\>ra}W *ʵֽx {q*P/"gfq,̸ٚ\M^Ίg{$B:W2eYgB kE47> pF8d&UJg}W Ֆx։ *t#9=zd$JWF f,+Rj?Wa`L\ =O4 svQC?6ߌ">\ρ\[W*GϞ={fG_~zU2o{>Rdnc%z`c!\x; WW50t^lWprvN2fp_Qܯ㈀؁n^EGeWa2wY;Fz=? ^qW\ EUB9\m.c?cWzᾮxׁ]2A'knTڅԣpu6禬dͅt̺p/Uo}o+"y8ջIpRAvV:?w{Z-,\ w6^?D; Wqp z7UOOO HuK/ߕ+V,[WTSUxhţ=D'Ʀy`ӏiۛɚjz\nإ[2n<2Kw4l K?U.6\JZ;1jTmsq̛}羵g片|0pcXMZ\Aa1\Q4W2nmcG\=|ꊆaj#ޕodu|~Gm)Z`hkyy)5\/]-691o-UTNsMoǦakm]l,{ϒ/ĝ~\s-7\0 /Ǟu<%>;ҕT00]J>e_%QZ! Ncn~iZk\~0aV]-0WڶA6>\3כktS0`p_1qzXg鳵w5nc3N W-0Ԥ]-3:}~sO پ2g}*P_س|T}ǬmK5{JxH`d쉣GlFUmfkNg8PO\u\1pa\9&+ Wu+}W# z*nOe AÏFF[59e%ׇ]M0W$mAN*}}賈.ܳ+=w-(xo7)!ַKi%]X\c]׼GiաQw5l7z1]ysrUf1ZIkXbuf"xk**Ept¢mOּ=:~5%+ A_zߘ~O>nղeKYs[JP:n֒&yeMZ_s j}@}\?@Z7zߜ}swedL/-?i,af{](,(.?gGJCS1|m]-U4-)2| E~sNWscΨ,çP(\-, -3bhȈi^ էzaǘk_/ <,3Wt;etûvhk\AP 5WZĔs}sn0{Pk[ ">K\Z;uyn7]4}u I5p&+ۮ W75Wx^2\Q4'͟~,vO`<?['xW3cgW_4\76\ŝݚ4W?.,w\_9CTI˜7Kǭ`kV=af&{M`a3 *fsoS?cW2p|0ms=pS6 ƌ-ԕ/CיeӶZ\3<M13oЏlDF "]s}b3wUѴR6 cRY emCS\SYrsƾD1W%ku-J4.?\3]Qsm.cDz79٘[5^Zbg RM>o!B{mj49b}:xZpPXo}mj`GL\;K \5j_Z'gHXshy @b[ ci7M4W4W[4x EtsUK\ߜ__.xA w+ҵ1j7򰢄VXp0jx4u}::Sy2] ʃkƮG#vBW@% ]:檊@jMM:\1k׵޸1]Wp^Ks A\r>EBV0 l0\>6WLbrx!!+Goz{Cp§nS 1ꉜ *"u,ɋㄹ+ȤE[&YcJ' #P|j(3n׍ Ŝ&\t@}\qk>e pwW3tX@cvJk ?fbSWMqAG20U:p2_@ڨYC*,/績3F.^녁GNY3~[0{=z. Wױy h40, WWK1?ifUBNanxswW+fV> : +=橡KՆOm-.E[?3yc*^?qǭZpbEs>}QmHrȽc*\ls?ǍyWE{! n6\C7^{`<\!1\^FgEasC{`\o>x雏b?C ݾw1/=`΍K(o~O\t ֧̽s֚p 6P+o~;Wi Ke}W+7CwAT5]`՘Wc8YJZ…/ H,fW-ZMcp0BbrpPMy#g';1pceLI՚sQlV5WЃzOuFUV\**W,]Ƽ+Z0Wf? Z5+yWTE?-ToeX fY>V'f_rFjgxi;7e.eInA5}RhO]2=VFv]+"s5ᘫU|py*PQsU(n\cV]zt|˭vܪ Wukɽeu$z2s=A\z=7ғП&^IOZ̐JNk'M1!}Y\++^#鑓43\dwafqiL檂/4^ EwyH> WukN[4I^ӄ&w4GK+_,u\YϱiSkU ˂g\=Js]k)ל#` }X]M2ע[eg6~*zFbD`+]kykwk 41W}}+s\1^epuUiÔw3.ڒ'\-**r7 S\Jty/G󥜇 ZLZN'};x1ǁ}ߔv1n#&pvhA+b@*n Պ]kJKUv[j } Z9Ɉi 2栫J9S @o3C|FYM[UEû?U݂V=KV_u6!+7P* Zr@(;!V} @d 2%bN0jt%C⻠@OGHF+VtyOC Nltu6NumrRN\#|<:I-r\m^ԃ_Sm Z%} Z :jrekVsi-SCZ{ }`YZ[2A+ 7eR|ӕp;HUh ApAa {)$!msbtA+a. \+m}j ZAXNB;5Ѝj2 vQFA`E?oXyE4{f5|ݮՅYЪqsjT_G?sw{ve"W]*&~RBq窼jEz\oahnTӀ W>ى?ie䠏5j`ճ`MA2 uϔM?pU!WC{ZQWyc3W☚/8\:W_}: PYjʮply_}G]Ɖ4 kqpoFpvdd8bu 7,%3qyWWJKYEu>/pFj Y*\G :%E2+g0sNP"pUrDo8IKLa q&=gwDK 9jj.>pdզz[XR(v[hP}w7W}_Q ^cW%R^FisMz~+tK!&WBjW_zY-BoRJ>(nWX#FXz5>fySƨjc:~;pUty+rܔUqO~M^qISnj"C$pWQVsϬ1JQWWm_jpuGZQ;^gzYlۣ S*/}y x5;@aUQwQzz<\vpSp`[UZ&ÀO={Uh뢵NPWșjq 5(%9C_u`Ԕ詜% π܄R uI )Ղ W}R2F*G*%W}隵ꀬCq#kfWyi֠~9܁*  ઃb i_sa[Mkȳkm Ϭ\C|k׭'{UKY'KPʌI^VOpUxɟ?1 ܔUj>P{K> v j_9>\?HNP W2Mp WJ{7+U l?9MirOrj.pxܛt6\^b*\UWd 6@w[C~[U7W7^ .pA fTp{i Q:kUDUB:Dp >FK"pU*D+(\-;HRबJ%%Ԣ<  WCZn%XWUGP BAp=zĄV{+=TpŮp&{f %3dąW)p'3TOW W휤%ȚRFT?YK" `jO\PELTXtpLdQ<Paj'*DWyia_"spWY Wjg?9Q62bB.&ޛ{Y-xw.*}C}zqXc`4B\ SWwn\X(;!g Wեci\Md6V}n+Zpa)k*=%\l\AUeW!H~1d[d}j9\S3p"p5,񅫭ww-\%d9\%~SW9IKqlpbNoD{n{4 B;$m zaW1ꭇ7Z5a0=! pM7#!Sh.Kn,*uK)Ou lɅh1@뽔!:WW#\e\D k Wϑq灄lVzVK˄5v(n=*'i |vBp5j^MZmV0<=pv{[XuY޶2b=LWp5f:pe}ҶG!`tÿNUCU` Z vB1dSZyH4; \Nlm:)\eυ*W )Oi NpW^ʼ CU򃍖|jZ0BJN\#pu۴Cc5wG0yUZ ?}S˭(\@ځj:W!/oAjybSG=R2$tM73<{żBF.fI\iUUNl&.!WWn5LɪǝVuڌCՔD=*b։NZ\ [‹O\pSN ~p] \ Ÿ-5KÕIΐ\Ŋ6 \^+WJp՛qDܛt\}zh,f'pծf^zȪ, {v-dI XβVcw{Ur5t4܅DUJ(ȬW_kr&Ui0*4zKjRA !YvA ;s2!Y<=r!pj'"[ (\gz!dqjݮWjwm*z*{El&f:-*lK+c'eXAnj{EHWE$BZG|`7*\A}{wHv`#$СZ}QɧNVqZ'\e%NZ ~Yc(o [N Q DqS+?}p5}bIp}6~ppUB.nSOn'wZ9WP~a2{)XʺWWc:UZp1R9aeYցac rϮkezfu?@~אH>v?̇ZcN:  \5?RJgPZ"*^W;7, /m9ݢB(w9?MA0tp%stnWE 3Up}CJ;4Njs݂jO-बl.>jEy\B W$uj}7mmW #葓1 W~  ~zTU&Kca;?Ȫ),\̂,̃}BSR:?wӴRדUrM52ě{tL 1bĤIptʞp; U>qt@*VA 1 \%p5Kͽ JjpUNJ# pv<58Ml+\pUB+m] MI9R* m`jKDvF-fby{D$jipB'&Ω0rw|8t?3 f.kpu&\䷹:YpU&eR#hY5$*^2W'=ʴ`9l|SV5W/4 v!1P>Q>ӷ`*\]U FH|ró^)'y2XXWO-o*PoA#aޑrꄫBغ U^ꭿY67奮Cjca@p DF.$k`èG6J00p q!z5#L^é NqL 1ѣkxCeO {RtDqrRV腫fP~NZ2*0Be`8b6Zp0дW_rʕW5;^QBô)]…pN'\7E¿m7~IYЏUmz$ JBI=8ƺp[Qdtt2*b@H@i "fn{jj_P!ꀔf_J j^W;R?AhnqE6 /W9_k=̈́USy薖x ]J`i̶\h+OL٬pպR(]2 hIp""tNs5ƈ&mx@- }2 ]/㩀R1Бh6ңr9}јy1|[.Ţ=Sf *68*6z ;\][wUpUx -4{#"ٺ h XN+בgBTp%gifCK6\ LVq CƉNc~ 걙`\]\%OWAGuwwgٸV:eOJ(V*k.{fMՖiGiUf,7SB>Ղ-,LNA G*%ss 8ġ઄ZϴMme5#:Vm~yX{A$kf7BZ- #&U FdS뚉-j{U*HɨTSFTm<~~{xG\mӷ

N:\Ư#,\̓U3]s;/u}ןq?B~'E|賔UFiJ-Tx*Ǘ \n"jUpwk m~HtiђW!AVgSPv1BnK9X0\M3W;it j0x9ٔW/k}QN?:;#"5^㤬ļhభe)h"p@?!3 Wςyp}td2WqW sUBQYU'ϤzJ^'\+>HB+AGty\5+M 翩Nr WnFAx<W|vp5T?C"=s*0pr 8f[Zk^Nʪ.t2*g^pu5O!\'ւo4XWXe];ְ%jez$?=n[|*gj ÄntZEzEy 3t-J%$tp56r^d\uX$-$c=`0! K/\/`%̳?\caz!o˪G؆ێհ/ Oe9WX,p21q4UputڡS_uѯ_I#.+zpt?[fą ;̖v^'WPo߳\UUߢ%0ZNR*~*=F\}W0ͨ=bJdSkY w;^/HuUpC8ˬWƶ: yȼN3UdW|DU|EUB\pn{ͮpXJ'jWy pussv l\*pt ]H WY ?@ttLbK*બ<6tʈROh#p[RoVi5WOJɨ&qyrӫ ѹ \uj6V3<..4q1vp?O'\a΂7=%*2c|}p8ZVy:>\m*TW BAሀ.a9pp 3~pU&i.cWwMp:2@Azb)2= B.yep"YěiUpS+~VOEbvBY WaQoT\=}'vpU+A\Ӡ|*D#0,>m [Zw5CJ W!krN+29#p5[u\]I^jzYNZ vxqz7r\jNݮWC }lxS\}Js`/ⲑdr.ߟ^'\| # 4Z)2]O 1*W~!  OzdX<4~'pU!0 W#3 ‹~3[鑓M];Bg:\x/[ W!p`T B*tjr_5\E+]+d_WG:WoC$$,B`&Ȳ׍aO !\eo)t٭meRt{sI,ë Av=ED \Zd'K'\-< Mj/;,NW3 W[n'WO.a%hc(՝o0'pU!ܔUgG*?} ?mxp5gp]55K5\m -mC2S{2q!4d c51? WǨDj(Q_+?Af쥂M7#z."t\5$V}R:.$KJE_,T(\mhuJ>.z#<pfNj4(X$2[zK@/i] weTʍefpyK3 Ѹ {zK;?#p5uT %]6 s|0p*f)k )|BuPCGWmZ?PU0Ϩ W}<#a I(NrA+30l!pUc5WJ%_]nlTC]v'>[_)Qt}sE"ZvM :7ꃫ0C0Dh *GUÁ䠏U_A N'\:aXB*$տw#KoʔFBe#$U̇u~d0߱ \f\Q{> ^ p=WIZb\?*#kUX~zY.R*Ր :  puu[aQjؗ[EpeeRHQĴ8UJȧRN9EW?aks2zgثd>\mpռ N;=)"Cic;Wlɀ+- zV_=ZOMʺ.Qx ,U"*)X\U ?ZpuG|ւ>A Ġ W[JiЄ_*7e%+a&\у#pu;0٧-jOg0j͖"?n~Ņa {띓J P=tOvm2Xq!jO'R$LJC gןY?mpW\7L# U$5&dpdUEz[XVtH(~HM1mr+/aץCCբ(s'yj_GD#:_@p?]d|vQ}( aX0iUz$v"፩p].}VmJh s` : WXw" ź_yIZ %m!p5fp):-DP}fdDM߬jnT̺]UL7 Bh'c*26%-!~4wn}si|_Ϻ4h-K|V'pj3n{| Ƒ~~y3rlz Wa_Acf`%[EΪ:h͉"J[g |]"f_-WqfW (?~TG)7T>G B.*{C\]ۢ{!dnGWfF8Br4>?ǩjWKC^P QG'*\ r;QC_mt:jGmVCb\ClE{U6T yģ6R ߬xvߟB*kf@K V`pu2b5\N/.\s!ס?냫E" 9W{xp7Gpa;$z`P:7!h44Zo6݌c"jؘ;'>hjWQS* 2f}`\Er:*<8ypS}͌ =~UH~po_Ayd^*cလ Yԃ_h"S \Ȫio\=/uutS@,m7 BXI \n=o:O 0&tDQR\c6^;\t 5MiU …9U c3U:)uV)l7ߢ<,BOvG}$o."gIu9)y;ZܝB_*/xC\ W6e [\SAh2\/$𬉋cj~C_ 2<Wmzyl:$sN,WAUzzv!CLb26UWV閭Ca_K[~+.O6}iHpU_ւM,UAP~7׉b *= di}#1/W3%.qa͎E{b. pu6?c+ܪ\pپUB̯!SZNj ^evR ՃxW I~Xͪ!W!i`eeW+( Wz:cUV<?c&Ud 8Π>bYW!).p5~&M*hzD$^WgW{{8j}metבi_O@$բ+[ %gડQLZpP{4f^Rr HRpupzv1p7iʵ?` f>ux\Ax3TGo"lhoH)yB!y=Zt)Qa'\wvY\u:|*Wrt{p1Nj]^y72\wF!F))\?Uffމk.El#EuSHriU\}5cCѓW{T[UM7i&J=fV_[U&:JCgbpmjC}f8 1\E&1l_enUd(=!HmU֮dݾ0eCZ*ȵ'+Ro"cȼ>\]9 .={4oz\% {py'cd#9mcZ/D[Maڲad 0(O܂&i,+<|..iڅ)*9Fj,"\of/FrwU 7+9@jxx~EjCoë [>bǚ'[Z$DKApRǯ(A0)H WK8{%QG#W76\%b\)څ:.8'u^˗ʥ՛?HVJ'O%xZH#%E%eWgPl žpr F zR\=+*W7 ß?c2UD3"׫P {uꀫ6|_)en՛B\qn9*Ro =5); 8;pט۹mg D?`9g e"t^.W7WΏxwl{p5htO \%L~׎ʵ3Bw7ZSlk gW/'eՈhs([DVI´pc´AHO v{T}M}TQH{:\zZ=H4/sf ܣy W+旵ݯ\tN R!g*k.8ʟ%3~ wør  R! WϬ2[{p,a >'u^s,xRS%aAdv1Bs^='_7K6\ %LV_O/NhȼN"eA pV/?Ǚ|=k@6|\ 5a-vuzg#Km?^0G VeVCW.NKw.I_4 o" 9W]Q/>)T@?'oo:w*rP\};t“  k'(:~°\ThfpuQR!pՈcW2)hW W,3f*է'ocZ#\pBg+frWG ήiF a&\mhDŽ*jpRWmWW[te˿bkl7jDpmYAycؼe޿܃|J?ZĬeK?4d^ટ'pU4eͶOxS:\$]9C lz<+GU|aEG{=dq\O\-8Ǽcf+jωl3DC;dpu[9UXXWYBh󇉚!\UmIu*b_EV6CeϔUs4bg[N}T4NbX)w?wP"xQ?駿?+|H\N܀3G`e'5}KC=Q@ז癛K0YIP$EWeTWɛ֍{r{NycKjoY;&+V|Zp$[<\-΂أ*`#S@Dl=<.\l2eHfz28܃륐p~քh {');>pUv2$n_X[^CKp .=LUQn;gv؍mbPt)׻~/8]`[Ao.国rGG.>cWM.MRpn- 3/{Ξd ӽOƸ/AvŠN矎M}{+rh* W Fpu7i\.KmW~]S1%\-NO>+~W/?->\;r⌝*\Ǖk 6k[n W? Ĩp EbϠ 7#p;[f:kpcO+\C +\7ҵY'^i$P6**8<{u711KX^y)1%\-NWTlUyx3ܬy9~]dKSpO*"jop W!!.oA;Pd,7aXoRL{fxR "շ\z 7HҶz[sJ*^&Շ~h{BN+<W͆ɒs0Ew`226B#v؍mVZŚOuӆyd{:Ģ&Z#ǧgZl>WƝh΅Ͳo{]=Hwzzo8kܭ¹HW'-T~dVbe>/-*DcM;cMCL4V ٪xOzgnV.=̄?qI%YBoV P|yJr/mc)" ;^WqړqNOPmZte2]8e\pq&[/|D+UmP?F %&t>/+FTL1LrvN=Fy(ջ+ƩL~i; d^kݙuڦMc 17*&2ZcTb3<`t^"i|d.O&]j=[^%K؜ æP_i{EQo.{Ovv<],P9851gLDѝ\ g%ZNhXۛH,.,*rSE+u#39ilOrӒ2½#C2.ƛ4\S^fSpHx`,`uvLqﴒ% T&XNyD##fr!,FDP'O #=]kJ *5#9WmS* f,|܅ "t"at9 =em$$O_~, m ]6g^Ujʄ?k~,S;~.'GѿSDҝ^K@x ㄼC@X;'& :%,?%|V/B/Ahe۳Feҗ!K f4rhiZH/97:0xb3=VB8yָNJI'/q\h-}yYZ&DtWtQq{e+=?nɋq=a-_؃V}/+)cxdY\@pZ ژ=.] Ev=<%젅Ѥ9"O#wCuh>rLaމ˟,\x;ËU< .EqB(:ȏH[LXDRPP`j=Ȥa0X \ wk@tJޕ] 54(qCcvjCi[Z+Q&;ΨSf`16x,1jE;ƶ)\S,~]C=t(JQa쮔+W(X-'άn !?M4/vx8a}!f ?-O# bN+Ir'|85N[{젧G~ӳ'%OHƻy347 &|.9bUP̚&͋;(yb?~.߅"Hꧤs^Kˤڄ}^?W|zu~L?͞ҕ5plTf^jzL"8+| V8pW$#k!OT2!Q/&<*9|/93'.D$tT&lE`Oƌ&EqS,_Kwsf&3i~޲/3݊."ڳ cl'P}Gw'ܨv󷇶ew3T9${ >=ݍs^`56?~\,gM[tls7rwΛ[۽_OI/+fO!3?cMgd oZ_;JQrS- W&4I~nN9ڇw.70VAXN˝wW9~?Ķˑ9{c G"ʚUƿFb>*9>"L @$J 8H#^ r(gfoAR{ɅOe 7-n035&?qs+4*orjb$mۯ _G,L4Tʅg#fM'?*M $ڷ׉l[b+ǐ 3I &zHZnј-mA\ }^ gV?dLp\'F'xhMKKM %9~ɥTVR4TBWٯcx<հ^ z-d L3$ f my>Ah@xmv۳1' \3NT^ePŚϫqj벫mYصW[?^ -a[ۉ3^~pl;՛{(VS%2(,|k-ecgX ;E/4sO=aϑV~N#_ejxA=0yS/LkŖV_[Y|\MyVx~}_D_?_phvnDF-5Ge)өʱ'#1%axoAHO]gV7U[>]WQshf8z[ޙOӏޗr u7myӻmW"Q@)zRkYګ&Ws,d̸jfIcn.TZm倖Z5zƲQee0Gn~( `l"j9ۡC.s]e ]5s֎[=n)Eײ=T̃)^,d[#̪.P-.tɂJʵ?0ke%` a}]* fje#9}ځ5b;d S2AaO#q 4`$fxBDxr,dFi9/t)dT'5L0UFeK>yǗ0T:6{m?kwZ ^Y!h]GF#e/8+ué9;eu1aNٗe*_=zT*G4J QDtA~{֪eppei8uu:?{BgRZ}5s܀D(v}DW1 Jyf{Bp^׏/B$Ab~B*OF{iEWG B{城10r4{b4(,=XfazTY"ǤH0骶ekLFFr\ 3~PU+Y6Ċl.]Nbp zoi*]4:󺽡YJ5,I:1xhs>?'I7!t=x {jïhuх$󾊎 hBIX`B)Y);Ll@  zk+dAiL͓-qkYH H8 %۳;ʄGuB{gzRשWUV}>dݨF%t/~vOq #ܐ>> |&s݇wt296ep9Ip W!ԉcZUHe|ʲIcwN\-EtSZSY`AC*3q,wi#pu+\~K޸-jR4\@g#FcMy0/:g$qW-6``ƪ|ڼ"mt"<3Z}U9:&\%N.oG T5R )5kp5\Eܱd]Z$h32qUyPْ'ڽ܃ԯ?;O]p^@j9\!{\ & \5.b|AUr pUhd۹G|:ojmw*t^tH~< sh!Y^e ;%M, 2sZSѦLfsY YpNo?o3\]( W pG\֒#^sn/~*]1qh㕍pUy 3\"Ahc(0#fzaC-⹯G^X5J *p5eʝUrLr<ɂ0}pˆpYQ "M0=ANưuxJ2͢+[Yf!%1hageg~5jXHn*6wDrR\u WՉcH| ?|"tݨ]SYjH5!\m(f~ء^jl_RK3%qH3&m*1f~5k֔DžŸg!{gUhH#Z@#U.%ڀYx3"_[:p1µZUˍ">['%{ciX 6jk xZB!!D” 7ېc¼luS&*ѰNH#mx$QD?h3h{x0twE W[&~ WgmDr\5[U*S;tlwch6 i@pUKq$NG+ٻV<*HKo:O<H{0IU.&zf5څ:.ؠ^6@"5pX#hV4I}uwjuJDMt\9#dHyXrizٖ .˥!=̜~%NU*{7ZUߠdBKC6{]5m$5:#3Z 66n*dF8 Wl.4i ܅whswj'<%m\A'Wwij>ǯ *3ׄdS8R^#*6<Z}7Y!zս3k\x@mm WK)\ <-ճkdWa!ZՆR6yUUdi}Z/WmpU/?B/;E(~Sk+:U._ CVƏvxMlؕ7;kBgu(&B9d@_ig$#|?@s" Ff tk'0xZ;g985$P,]b} xEs^&IDcniENǐ_5apy\wvO];O1rGp$*PU(:'$ 3[ՙϢYoGc0Gq#L*) ooqЈIͣ6LAS1pSpD^I yuXYC]uMI*:E/^pCM gR?djh%-XoS'A^``_p6Οk!U1xշ֞>HLj2[Iv:}|Nlz([}uUCy"&Y5\5!zDGϓ@#>Qpf j溟wNj*>P%_6D%)9iE)AՆl cWȣ@+?)\eOp" \ͼLU=d МpXK UCv"cPLWZC!|ŰJ3?-"BhSRMX/&p`ͻpPn-c\BN\A<5o5yJъ,6F.F/ 5S+!=<=PgmD"̼Lp5e:&,$inY?n W/p5.H|&\);Tpƃ$^73\EDR) !$=Ɏؔ8m RZ8|)9\EgT[\]M? \#],C`@r"rd E;~#U[miד*:li. (&B:NI} #=V"*l.|~ȓY;lZk@{1\9Չ[x0X4z WȖ|@UH/y]јP\3yǗVɐd Dea͗<GjZfUP~y ? { g&idi/kO vd&[t"VSAafN-mwlIkU WFt؃\TbuޅPEWLpuC/ȉsk}[M5a_K+oWplSb+/Mjy \M˼pdEO;*s3ifcZΟ],fс<oxhfR?$]8 ~ĒUu$ș#ԛ>Kl.+g92Wei-bW!pUCWBo`zV00"۩OhӼWIz;O"lɇ܀ W ra)WW'*u?+W oN?l=w|)-Ǟ.Wz8{1\N~--lKT劙4xU߅ Q,\7Gz3c&q f7kP溟="ds&՛Z#|CvU){ ɷZB xͷ*O+)OUb0JVpޟ )!Юpՠ GH) K^Ք-_*NO} u\(aXU4Y2/՝Mp<׌[01#°/Ğx4-*~ {w͖R}\ͼhor+? :C.w$6ZŒ*&QDD1s*#pug r*jV2OQӺTAUSЏ~,SړG3سo?s-ظeqoskѢӫ5 J)_{f~={]¦MfrTYm W˥(|oPAjXl~R%M-RUi =Q$ vz2A*bp2L YtqShhW @Mp5:HGy7]S!AM4\ \,$$?e=yWJppR$Uy2nԳHS'LpTK$C W܅=T6kh*7k ԓ1VH|N*/#sjG2WDuZmFv?iIQ'ax&:J[io37:C;b8pԮm+,t`Y9ZF6N0B>4\D)NAnQI=3j>0m) Ss Iɺ8; 8r3^FGP 8^)AUN_7jd{4oվʸTip nJʄlT$fn W pUˇ\Q}U, W-nޣ-e9hÜհV;YtCkpU' ؁!xW\KXU*56x6F8m޴ndc&\nL8yR1`Գ{gB&t"Gf?1<p#R+&GOO7W#^,NߎG4KT Mf%['`;qg&]qr\\$CBIwU$IaY;l<Q|uUi\}W~DjWP켩$冺-j^H4;5Ux!94 B8)>sDI) R&iL [J1ٖkolU\HCݚXU=\5b<-DG0\MYb &mbemr>˟[1l앵i}y>T]~|u9:{c憇 /GnForpFk*RyPh̵?m4U+%\M];%\;AFpEdDRe hB/I[,z=?'BaUUٲ.nt TsZ^pv5D F"-]2Xh$\hR\e@12jL푞CWKI<rI ^p5q?G㍳ػp:9c͕:5""p1+2\-!pSB8+zC/>\* q pf 9méZrwAժSwI.hpy_&H%puJ7%Շ9\Em^O 6\8nQm5jEjjxg.\.TA9Y07?,x CqG-SQquMqRkda<iIO93_P46p@+OPS˝p#\LJf\U+V^Cp~7n&\%1S5 _p Ÿ 粤4UyoN8xkf4%G,8pnH .ǝ$pRb(nȀzBj8f H-i Ac:W!36,.  R]ExrVP2*D%-SZ<)[Q'y'b d6,|\6%v W1kՔ阿g!n)2L/8JpJsF;J{)]$(8,f*4p_@%I䇳Csp`(J~2,V\ni1!=Ћ=K}濩I' ׊u|֚͐ YoNy7. WOPG !Mȡ6 C+҈7lBl*1CbH3漤\}n R-_^~C9);5\]E}:fX1 |D֨3ts w 4j4 ."5+aj`CgF)-F) Hå2׵لz "}#Mi:Je5WGd` ?u2逫YUC)T"B PUHTÐ,) LJީIs02;eF-f+򸮲$4@5ςD?[OVb"C9}?d@s7K@eAC 0MgcW PUzKx=:ApU!dއ >kાG3\@VedW1~/ATMZÜCX ß'R$~hFS,ր.lkhQMrn-*:8yRY(zJ)ozww\P47uE1N+]򁣖l60jRQ0#9/;x,fvȳ`?iN ŋVRZclaC]ה鲓(U߀FƛЭb2ҹ|\E- yW'ߧX9LT3;n)Imy>gfM0ȘRu&{^`W x&>?ߓJnyRd}*/aR^ZqUsp1I DkH!Oۆ9bygmWj~,3\-@|NPpU7*NX&)\E4o &%Z=S4\Ep;ub$זjy'bԛ"gj:OOc%8NWiln'c b46@G91Z+[p!\~'QoKw j?;HU_j3%\qYe->aN(ϪG Ocbމ^x wlFָNA;L*E"5^~vCKN&l-!)Foj+[| o@lKqUR4n# *1k${acڄT0^ >"[A<%Q#u%%H1\&]~MocB/EuWri/|glՃ!O"#`WK2vAYbbSOUu-jQp_h](IɂХt%KZ.>X5#]URҍ!fD/hi*4U8nJßVʵ?T:X`4bVbnpKtIJ3}Mqjm/ȥ 7iVv +|V3T?Uk'p5/]Ϟx\N@JjY.DxKJX&'u^\_M8t*U>KYb W.'-{  .m2dJ/4\O@$&emXEWmU-[Z;]-v\94P8zdTkx`W,$;چ܂2{U1B nw4+.O7/FFAJ?S4\EcRPi8F#.Ëp,Q6\ zYpU7&5b#ƿ[Ds^=ǞxWN걝/Go {tˠ\<3ظ؃Ptp2\>4&\Ō0UJs"Y> AUI=W}j 6jXuખ1\ʱWlU^*C G6S','l.9+ "ǗPQLWc˥׈#cBa]ׅ7QmWCȇZ+CR@hADbh6z}-mCAU3F_#A![B/ǥ͏WZMp5e,G}fڿpT8IN,l`/3d^Fلi P\0ENy\r !Ԅi\#ō{ɑi@ѡn_8l?DU~4\Ny"RS 2 2"1n`8gҽ?i(+[:3\6S,) ~pLw !CT5RH^gS|`c8 +LPdx\0{^9:{.pU<]HEj3vRpNy'fJdMJKUM"Ֆp\|VBg'mh3z2(:еІ=DW 3-{Udq]is&V\%MpuVY:$Gʵ?(~\F8Hr)ߠNצLWmI*DuRj-.sL*R21 t{#\Y*~ 9h۠IW/$Gm՚R |.\E6!Cડ*B _lk\uvDYU s80& /nn 3U1XjRzW1l: Np~Le9!\%5-=7cUŪdN EԮ\bڄo W+sE36K3T2=H M{ LN⡵-\p叿 58*M4\d+,%cWk]MZ_*H21TՓ:0{pa?\}`pNp WܲMk \ )8F#n WمK?8Y~i:mXKpڪp5%~?ͬ QSOғ(+!OV2[TI%e݊FUKĻSZ#b0MXtܔy|Ra= l7++6հD/r)*W~.Nh=W5n݈,Zl[O*.la42v: puvC"W#Q "u?gйy0y'cVq{f`˖}\:i 2oaF >dQ`P\ \]5QX=j7b#w+8"" {.#?k&q *?_fJN[]ނC ·jȓyHfWKX)63azfD3\x7B"UARicx+pâ+[A=UKikWU$pudpw͝׌LqCܥ~qW*|RUkx3As!EJ =G?|gWzfp<_w*yMMVL AVI^y)$JfpI^ dfjitY $59hRWW~Mj(=umU: }mNO<yHy6y1fUuv@#\O0v镗4 \= xD Qfp@ e\. $u$*b<_pUwyfl&;x{~5\ETlG{sLJp :\1u{C=,\.5W a G>6\|^ &.}Z7濑oU!N+pb.UdZ S&L5p 5#!&i[w'C?zh1-W&yᝊI Gg^6"!Ϩ\ cWkJ )A!T]1۩\v Sm WŠlmz0=f,81\MwW[nRޙ 3jT Wq/e£ 2 mN=}7if!rwtMpu-Vpif`+#.%rYUnk: IEH)[fIwt)TpUB*y hgP^zg)?U[hu :27(e^1W`Ce b[1 s.{$}vƼ@_X1ު*(Hif>\/*?F2rfp1چHh Sa2Y5ՙϘjW] yח9$͉z B0BJ8{aWwX0[\0{WkW ٜWu`a?IA^=eLQpu1|&⩃L I.B3Iϙ17\Z aN#|mJ^",adj^ƛڕ \%z\-aEB^<p8}c9*dRz'GԆ$Kze%p<NmWgטWWI:{αi(\!]UmMyVp,UjE r0pٍ"25 i~4;pUnIUI*'66SjEqމedaP+ IluՐm W#"&ds t[b2S S+uYGEUßLU=6r\T_*\'P4\ = ʗϼD?Px"H3?f'pd,O}epCgCfz9t "袖pW묭Z z[U%")bQHյ:]|^ )t#ohpyr*m4zG ϭ]b ??7/:ЇfN* WE)At[0L}\Ō0d^B_&\E"pA2I^u逫lMpbQ+F\]pR"jb/?=HZx YH칯ξC@o4WkބF#y5 W*uBr%4ɅKA΅ѳwP2MՆ_Mp+Z_ v$' E%|J?,Tck$flej!\e\i)\EN037{CmޓKyc̭(h}nUba\[P^rE5=ApǴ4.3\%ϓv~wG -"n:W?m .ViX ˘<\uUs;WU/ZՊ9mfaF*7#ܚu&pJbR*Wp)jpՇD!4j,j$nz3XL\_#OT\?Ur1, ^?`UcX N-"D᪭8wZ!5\bdvѣ*2Ղߦ,:ml%x9WKgUgmS/N{rcs?KB5i'2].|% 7wғ-iA\1 x@Ccs;\+^sӥĹ22U*7crhDy%\"|kYdʒG<s·V W'8E!Nׯ`,P띝s?*8'08gƘ{_Up&-3Y-;k=l+LpB\$,O>;yħce2kFޙeɜkISY4e5\e'Ouw"CoyG浔kyW|b "-=1˴!"xԎG}YF`aή WՆGn4#l5_ςm $[wO>0nȞ(pb)\uxJ"w9U>:]t#cs Y# v0\Pʭ $8tj$m!gw@0 գ !LBW\*6$v 1cTEp.:cnmCTnT#z5\eyN 5:_n&BMp␑̀S:߿+*Jߔg kBkr<#4##\]Ք_1]ULY5\*g᪀Sp-\*=8 2e ZFՋPbdYX 9eiGn\֖F}3kߒ/6*_1(߅V{!|"=))Tx$MZ0>cz=-piwh6s)6?*`x:踓ۙTa!p[xvQJ_]q WgK_7 K@U&Ls0^Z.pJb}_c WpT%K\="}MԠfpuHwҿ N|@R^WMu~b.>6ob's̼\/p)>lҺҺʲێWT ai쁨J⠥_qW7˻dnR N}(h=<%b_eG⦼TnLJ[Jx*i같~fu"|o j$(VYUcpeme P(4SUWb|AiяjPJV:G!ڋ÷!xDQ O-, f%1Lx"z&%8g]xz쮙1jHEH:ss/HTu?=c:a[LpٴRy5Sj':G}VjYAD]οHI;&AFşF=d "*+jh{p&4Jr(8u]*W۪u;83>UK \'^sbKvc4\;8 tNkBPW9V >MNu~rфgT.6*vM7ĀytYRNEݓşD\g,Ww79۰5_͸5Lp^py";w3zW$fNz1k,Ԥ^r~suv,Wˋ'pԋ'p@4v%̔*a[.S3\;Ulʬ3U]Z W{F3.;9ӽgmq#.?egZ&]>0mg'fLJZ8颐Wz WOl,U`rO2#O h3vP=p5-\B D-uŚIvʺcjI6:S[#]f` \uMݨj?gM2= Ae5E!*jjfFČ}B9U$l\ zL)s/{6=³Jj,/Gձһ4CL )4\,W/f/4_P%eɗ'*NltH \y 졀U=3\M_׿R˻h-/f~e=śwh1 W#6fb2C"kzBh+эeWXs2d?W5x0'al-nnLq-sL{窒KBQڪ}3\VTf7\/{GK6l\k m* cjQF?pha&FǤH}zK5r*HAՃ??W\)zށ{<=6lWjuAjgwO:kC I)q>+v[,U"-i1Op5~qO,ŕ6jܔ%Q=#Uϋևe}$ᮒႉ:%KZFA 5A&gX9q. UYd U#m u )6٘<7ԕ'vv{P_J[ٝ{&jP??WҘqO*_$O\1 ~Țτw9QXz[o3lEl9<2aZ}ui9)%5Ati%hc)F+Ttyሹu[U5^U֗Y> 1);1^σ]SW3Sg67 WsJ}U% jaQb?\%މ9n*4uE7⦼*[tNs\PyKD Wg)=(IjM9s5kǀDLi+Yf~㘍;8SU4qKsMaj? \"܆As WmE{YȘ1/`Rxsi>#gUNWY_ E2UẀ'XjQ\nm |Ŵ\>9g:GJ8 >337b"U=E/f` 3 \~7 -a;:7gsq\j#mZW־'nH^4ƽM}9ԥUO$xU[c>dVt2aƛp ʍ&]*q_-\ \- ߆>aInjӞՠ.,*HQmTh#\v_EBHbxWƈp5}MofWUNvձO9o"!-q>$'gC~֯{: FķHM~PWUV ;]xfMԗˠ.bb֢FQTws?H]Q^?ex,j&S5^9NF I?v'F 1&|na Hdn]fTJ\okz3YثS+,*a2*Lξi3Kp7C-=$& _k^Y]?uDW+h UV fK_B1L ]$ +ͪ,:2/qmWϹ9p~"m%?|~g/;pw9kqهشc w> E߇9z,mնmmWKvpe߉#91’('aX$d8,O<.yV$-n/؞8]&GIi+#PWۄ~_uAn!*" Kl^;8+Am$Ε}=B|OQ>]u)Z}u)]4C6fruCEͣ{ NkVMpu2 e rF UUQ+aCġ*Ki2)=t\EZqpU3*=03Mp5wԸI/W~;y3\ wTt2/97Tt"a>n/{䇜/?"VuU ϹRz2xpƬ-ѢJ?r %\Շ=Ru}e[_M~7F&JX޲puDֵvw!v:6Wk(8-=U9 U-v dR n#漧1N}u:kv4z Wxߔ<,TpUNI}0-[qbEwM2?chȇڶi5EolY63\Of-y'qb fh+ yϼ~tx(3anH^nQo--:nZ\=v:&;\]ן[AN,'E o_)h5)ʖt W~WpU,{]՝Z&zt!%ʴϊB{RWtӶ9ORum6 qxdOp˰- >eh?ȸhC]Ҧ<\mVp(h.\ W\@)jiQb~PRBK\}KjqHFd5:B3Y+8z f28UfZԗz34\HRF <˞p-m]cŌ{Jɧ3t58tsg%{6FnI/1W 슟:HAmnW+ 3 Oָ+8ռs[##$c}⠶CoZMa.{Dd2m޼ PUjPUŷC{_[xv\] p YDߒp$xa=N"59Y^j̜4\%Z?_p5}OOdgLEJ"ЀD̴sv;klEpUjHalh ,1 WZ|(mU Cƽlɯ^XIɍpUүpGEug(z_)frvOHs%\؁} Y۶Ft_w_{H]'k3sT3\on.XWU"[\UuNC W^~V4\+,.8-\}Z(WƍCa^Ռ0lWoؐ- Dz+ }ŒlK0vy9,l,5.fpuvX7WG!eE'k(dֲ7 \2"4 &u|WCү$v^vrhƤ% n3#|-.wZzWG%TI[dGJ*3#NxV&4f9w*~ֻoe;1!aϱDdM,تNPUq;jVa\Qs]\;fOrJZo]䬢\-q Wӂ3"60Ԧ^V7\p՝?'҅b=7[^M}o p5ezwn\Y%ǜPSy{ӈa-6lH?\ _G]_=?*>zI_g^ ^ğv]?Kpm[uWޅူA.xtC{%_8+̀7gTC}^Wz:zCLKc`$&? ; )f3ݔK8 z=rZ ~{p$aWPPxJ!E,puYĺ:Doi5\)PSALk"A9UzhԨGxp"O#\=KWjtd$pvf f(c9 h{t I:y!$F,mƯ]rF>l\Q:Mt>D:ݓwP+#(;W,n7燁7⦼$i~(o8TF{ʜD˫iN\e;#GaIm=XE2]m};ƢUk^7D{uE %QFƒѾ\| ]xzUtOjk \-ìZVDxPޛ4I-^.6v7ઔP!(%mW7Fq?h/Yp5z:eF6ϵ!1pMӗz[D"mj)>jU=҅fՃG(K8d2{W㏄Y 1Ι!V\&Lq"6Zՠ #U9Ǽ 枹1WAY&|+Z_[)*&"=&-Ѝkd #\|mJ~5nPkct, xt<+EbU=^L^?MZw#< C|up;wQ%Wd˽WȉsbcDHrڑhlzG'zYhb* A ?c]77PWYꃮnIθQ٥nEp^'9Ē%\e"|<]\cfn|K>xMqlp0ȼU9!\}z W+2 o\6U &A6h'N1 h<⏈ R"|c~d>#()KY6rJEӈL,|Mj'&}ֻh-.,⋢F=*Fi#}:MUfX#kN {`&=QI6 .1n*aG6&9z=)d'+j@U0pPNT{"= u! Me[b.ᡢJg'oq|nhYLu}E!p5U]ø{ˣ5++&D2K; ~_?U6i<YZ|Ao)\'a[~] W!, I&j&`tj=m&~ʕlQ#2B8pwO ?0v]:ՙ~6tՐcuֿ iEyOҾ8q?isW[U\Eb36:+p|EDvF@6FvWg[?&jpiG jU^#\?:)BS޸ (ݟwx >pj bB\O jՁܒyj_{ɋ>ۉ^:]]>" mjQ&bPЈwtmMNyHtrU^-C3\-O:WG\(h:~ kRIBGW2(QprF䜽SGIζ7O|ޑyW_>ݘ:\M9CD8⦾pQp`<(=)Ir{ b3;<FfvIyPW#1NHCI3k̔p|p:S =xKfp5f?RoU{X}g#rWqf,2w\Y;\54doA4-K8s3H(;\- #k-]ȯ;-#{] WQ晪;!S@@UfF\m%߳32j5Ll-}mh;Ǐ WwqơB4W\min zpVүkKs ߈vWNKfUlAdX9wR_[e gl"G,=zQ)s?<x^=qMVMbPdn5YA,gscGB^osy. Wmw! t1Q}QtvV[k%\>qOpU^F-T)Q4"YdAe::ʀ<5k9\M7[F0V}ߡW+8,1 Jh'ѓlsz+YnEop=-rKp2=n qeevZ*#(& k0+ՂKuDt1v,I*[gQ.nzgc;pa8Z W/'*"ѧ~/\a{:f Hd>I yO[(HtWMn?Q;W۶\e`3x&Yݛja:-c?#,;F׼*J@*wdч!=*ރKp5e'0NB.ܪzFTOp9bph?M;05\8dW JqV?;EEݣyV N5谄8;>fp캨8kճUIѯ2\}I;2p+[sgx(eut-Lp*SM}YCRC,I5 9$\FmWKs33L" 'CFl_ p5Oj{8ݩ:9v3,o#򙓱㟑buI&Yݬ8d`4 9mu3,8D _1@#c>cgpA]4\%W+ޫJ꫗ Mz \ҁ˖АU͑,gך p \*cZYXF-l6V3j6њ$V%facKk#$.wp ƴ58މ4IC}yYsǵyWk*Jvj?:z҂O tj+p+< z WO (C5 34m77x+sE!MmL{"; rJWp([*1lG|gYpu;#3$qT: VrzF0u7E3\(sL*.jKݨ޲ Y冲0M^69g}pSsWkK.֑:W%/M 䶍BB. 1>pIUbf /puUK<3,J%\rLܫz\] bv(Y): *_w-R|mWz,g z_"ʈ9b,sWX?yѓ4fI0Mp8C}@8\6F覯p, Sy:HaxVtRw[&:{y CPVXZ&*$/;?J:}M|Wjҷ_x W3<ԟ2ժ8BȕtW&w c( @W SX1ja[uFFCՙZj */z.pXM,(ͺ_hjݪӷ:LjN\?X( W> ٘7M*MO*A>pe$&?7^8'(#\-*HK5,"АMpuc6k"G K+YсZVՋo=~<\m6pf?5\.?W 7#x(XPtxdɞ*p\Ud)T/?9%|cw)W| kA!=>1:I\ pǕ.jQ:.yAߊsW#3Q1c-8?J]`axuүn8WKsu \ [G9Zp#"Qp`jp'9dzt%YrlmsT_hU*p䥤 2|)jX7/uY' ~\m vN_GՙjlT4U`VWH]ڑ՚8=3\U_#&%q ;fp4z#wKh,v,$*5MPef7([hUˣ7X_qRU wcW w&,f jQ:BW>9W X[ZsvO r+v;7 #o?(;}K;W"*o*.Cڒ\EaL kjK 㔗Q#c|27#tzj9?',kbO8|ʮ)/aբ ѣf~%\OuvWkQn;^hYVф{]!\]H-v[aAꎱi fTߡ0U|7'-/wqStS)c,qOEމBTfF0:Fښa;\ Lmg0*=̜!/<4E4<긧,443Q~;el[Q2m[J" iW,Ot W彿Ւ-0xCtchD5tUKo&RpuHBat^U7) rtn":1f!j/eS_e*ecDqXmh9.bC\51|-\)ŸiƊ3Υ_'|`OiyjVN\Q);$|x{]S( ^F1SE",# HDQ#/+yD >" $(cd R5tg)pE{\DW߇` kUA=KȰR9+їjw|~G"џGjΉkr Ϭĉ\e2A*EKHJ =p(uZilLoMy9ۯ@mY6[:3Ⱝ#\-HQp6oyʇ%AG s5ZQj\ x xfJc'p5 &_љ fn*oE5xNoLGq{ naե_:]}=Vl^% I/IhXgb~>eɗ}74fӫ,m) Vpx]Rjy/qA].u WDUj~l.|c}}a` 3fzYcœ†?-3\Uiѧ<,gnw/dFXXRfq>$cv%;\G~r}f旉Q'Ml++:_d;X \o3UT)/2#IԨ%|sZx#\-O:^OBK{yoJ^"Wp,&⋝ ggV#\?Od2/:_{j6[}U sz="4d: ,ofV7{웁R,6#|F7:d%r0 8ⶅ׍uyڶEp a%K'ar߉]wxY%p5{Ga+SNnj{ yiT&A_qzSh7bz>KN,ZO-` ϮhiI$xǬEcWI= ~-+Wgsh4 J CϺBSy:Iz$puWILthK*7H匍2a6 W75պ|7*qWd_[UvrYKr l!O[c9qB3\qQ% \-K6D-)g\ Ww,no(Xd-RͿl\I83)2 fZȳt9p5i' |0)PSλR5\Eb$Ff;n آl0Qr6"qpuW##Sg3\Eв`9p9CD]b[3\U=qЏYprpv_ys6>Lce0ЏW%Ws#"Q6opU؄g12*шh'2izf:aU,g혦<Ҹ *?>ET C|!DLjMvWL-\C~9jE;]X륔AW\UZ94^֦Ch" m'W_Aj5ɞ$& r#\#(";gԗ`JqlWMn.p q{*W)o#\"pu8䅟IF &Ϳ]zzҚr5Q-v4^ Ox\;DGu,L[핽RH wSF١Y CUs=O_DзFk\֩*k5>v+;8V8U=R` A[U N,0@KKʤH^qO震6S!T})0q)7:jAlOs|[u .%z\-L#J%B \UDB4պR%!MV<\3+v8A9h?qV5y³ke1|:n.[1gZ[Gj%,U[*{?oo W1,XtP RvG+gɂlqꐂ%isTgXbI,?W.$ bƭrB\͍<r 0mu(ُ(7meT%?ao1ȖW*a;S_)Ð 27u7eX[*˜m_.65`Xa-uag` P_SS){PjBv(%RC]L)VUp5~ x|5}Hז~`9#d覃,Q#\է`w15^GUUpjo(4JUY*u@n65}M}(mUO P>sӰ(tR,=(ޓEPX$&6Ms%W Fd† SZo<3*rB&LL{d7@k,wbtgZFt`lmN@qՌ 11~_ vkC;VF\4> WYW̠˘6Spus5z[ _O2fLP_Wxv ˁm z븬*)€oV˫j5c>>fU, 7eU <K֩xCN%+c_ߘ*7UFw W 0MM:^ <+Z}.c@ ZC {Ȕ헍s&:?ltj+IRyO7p5|p?Nx!frjZxj(Lv>ʿ=gk3OtM^:񤤤„S0HQS&,}JLUA;a\eI2*'pZRz:/=O*~GtwHqX1c,K8;E(j923ɔo^U;8w26J'pU}<y"U'b4us/Ԕd3NxNr|Hu$)5\ُS[1/f:U)RϢmWs~u%Q#LU*30 ʴd*e٪c⧿S[w(+ws?Ā\VW)p^0-L sᓜ!]X!3:Ff퉤 lTMzfoՈJc`sTr̓;,8k V]%:6&H S_c{:@W%Ʉ va~9% X\-IN9W1SckweVrI?fXzWuW|50l8஗eoW2x^C/0yE]B51L`⧽ ÃtW }Yp5#\`щ˞&Zs7{]w̽E:|ȇxuJyOU ipkdpg3U3 1 WѴ0NcD\j* ȹ<* b>upY7pSmlKryچEp5"{qƒljk*99ɡ *Y݈00B \ކpE7Ɔx@1"_Ҡq8W}:cO$as W ϬAhK(GWO|+rK\U HbOoɋ>5gVnj38%E겎6Ih0+* \_[+RY2zpׯ%e__j)qH|Df-V.Rb^W0i\yCbFw`pDCpU۽?8J%uO^eGzN;,pUB~0!u5ceyReɋ`^KR6NrzׯYQ|;D:ŕzk"PWL?ՒNvՄLr"␍pu᧸Ⱝzǝ4p8(Fqq\QX ,%?%czgDqKpp9*Gp1Vـ4Q~7`R\:g36 ~=8i󃭁%L|۝o^/<凍Fڪ=XMC>b~2stV)hWKrgGҕaj՗2X^}:ՊЈfmL^9fAXb:ab:g:wfo<={ǹظ})zxA눥h{0UB)Fƚf~*ׯ!W)IpU˘L \+̅3\zgmab7E9자+/×.lYEgA~SBrwUS$*GfaRsT5 rbOtASt,sWm L]Mʘ[selsUa9 }WmfyL08SXUJY] e[WGlU $[uc?kF(p5UN[ճ\e8^1, pu0Rr@,mrlhhMo]p'ẓp1rNzj_J$ƈHLL ;c]0 KZ l+vX^bs̙ϳQ{*y;jî*]'o(>%t.ֆQk)rؽrDee}8 ɖ***?)?3.6ɏ |kZ[r)U^N#p5q *o) ʣX\UfCpWC|υVH]iG7J\\G0A r Wpí:qHbn-*fr(h39K䵆8{D4@csLil̗؃s{#DP; Fo$:Mɻ&:Lq6}t\=Rr++z\2aSjK:B)/U#puD9\-7SPV|1fj'YAh*ݞw`&byL"edMUǐ^= ǣIYQ=\-<.:qG0䌕FR^SwQw{CnչƬp0ya}M9 $|ȭgHiV%,߮{WJiH8V^P">* Z/xJ>)s$lSj8 Wc|u(,R\9>Fbp$}L S|W.Pyhu*nӠhH1A"a]Dzk(.JeejwyLDQEB~V"n4\Յ~fs(M}9dmZjʪgvŌ{%O4s5,R~p%-Pȡ5->1վOpUyֈ@8e7ɧyN|6OsQ%J5[y7QL,%A{>uEW{lfJ.hkT)GI. 0aR2"떻FʒU9U`Agƶ)ډKbF %*֖df_\q$\ ={ \eb `a}וTӨ. x3r},gҁ Mj @[&~WמciX3$㻁XG? WՖp;D'N z{,XU%{^*tZyjKsx+>K5!dRj/LL6&v'ȿ{T!_ =汪܍zêY_n WʓZ~gA;3ҸC̰pb9,^%PWYdlN>n/\:+N3㧽7. #&$N4zsOav2A fll W{J^m7P6Y7v'k@.zARQ4z%ubds Wo1|ȇ$WLo7EKϛVǪ#@G1p6v'/TRh~nRI-U]z"%UJT6_3\%B'u0ujO*˟ N+! YXTW-Vܹf"6iz_pJ:*USW`aZo*X%~bxJ}U kӊ3^{orWbna[&YʡKY[DsspX~`GQH!+A:tX{B<ߞ%/W 0fBW%`$/9ՃRWtI߉iaY'Ve+8_ hKj'R_`7I&{3b'ȈI<'rsM7)N'{K4&6fD'fiDFJNfH̀uIk W.!pUxW%acV/E:J 8Rg|l֡ў[|Iff;Y=WͭEpӑ6bvDwoU̇#*R&em%Q ,jA2 jD)8S[fij>& ҂S08-t<pxsm$]:#jRG67}:?:7..(~  FmJ3-X`ԩiJPvB \ كj\U;j2#*U55\ =u 2CNϋ!Ao3 $ J_SCb7L3F6Lmݒ} Dh ]j}g"I]̓6>W'zWlգ.ΑB*[er-*fF <*UU 1ɨ&IBNPPDŽR~MsIwWp_7}4\-8\P/<05gD1Ṕ_~rdcĒ8ul4\]4C2! O!-bp 26?>3jޡYD2^#"|0Ĵi{;ڏNm, Ŕ9“˭c=,5h5{71:R; MzG@p&M2ӘJ`sy3}]oz 3Ϲ.׾}エ  #=X!!AkFvE0%WMXeb#j~1\̈́~@ /o@B6k\Uk,.ruEy5AbAO1XF,* ^!:\%J7X=iۉvs>r˾I'pV WJ SmEmKW?{}@& ~D:M!"W󃒫wsخW:!9ś')ugJwᐫڤq#iܓ$WUaq{dAB>!!WȈ"Ð+Y"icǦM[_=\wJ 'W2f ډ\͍f^4[UA<@ZK>94>"Ų1#M&m@4PV:gvMjnGE>] fDN pݖ\el^{dѢ kJyLǻrZnrJte5A@E)c_b:]3ճށG]04L +d}y]*+u3кf`c˞ArUð Q;0Yu#Lzlb"W]uآzy}T~j]CNϘt'd8Zq9$(*ȝg(\= m{-(Xch[d"j452G4QKJ>&|*A1yЪG+ )mcQ0ZJV[`)In$1s$e }o-V18# _b*r,*,F Jo@. >Om;K/D|hH['f7O~7=}m1ABXҝ%x#Zt#K;Lj\mΔw%WG<!-/z/t~š$ z3:js^ٳE'&W71q@t׶\ $W^O͓_k|9;X}$ƞ&{mѲl M{K"J`b/ܲ= bֵ}M<;gLGN,E)JfUʖ܅m-uQ5m\?=d{,{[A᪲Fr`X  ~  }"fxGií)qMrc|V5 ~)7&غ 묊v9X{i]k)ryH_J|=` !gO|Y8^7C+5YsQrNn4UejEw썛 fly5{x\rL>yC!W K5kUI8~ÏJK.՘&V;;`\=RXOCroW%m8BЭSn}N}??˭9.~M>ȒQ޲.?rѺ6 Tgb:_|mӾJ_IwwGbŝ:_8m~Keja)-B=k0A拯^tt菍cq8z3-& +@۰Ε|"O~vBjk%{Wͬ~w "Z]ɯf1CXK-tBT^ dDhw^ys>vMX .1䪢aĿ_*5{muȢ8*l p[oB2`["h%WYR^h /cA~w(GzAkǒ*!:1^蒿&}ĒDnvE&(j}E:!zE‘.p%3Ekvc--^_wD-YTJ?@>u U=gy١"W&ru=Q-5] =TĔȹ)> Ot(?E =|8Ab+ ׏ΘCdp O毬c raRjUgQ~UHVgsv7 cg -1L_Iru,h(jE) D8*۔]`om)fto?Iڬ|Υ&0 v)DROa2mSzk-][m0u?aTs1!LA|(EM$Fdmh⠟\Ÿ!:IE*\2%W}ΜGG!@2BR~&uF0ʄu]4} b B r0ߐ JZl.h]% z}lU͹MEs\m^*#e~1m3hh_KB4{? LKKK)B¢^r4bӥ{؀\]=@5S|f|3;?[aCksn {֌w^ /wkȪddh>*ZT! s"uЏ+8RE@TFQ]+f|MWmۢu#q 5;#{WdO\U[mWWNyK:/nrUėMClRPՅw8{4d[4E|ğ8a8'mXA5E.n'LGjd rUݎ›y#A0\ݽPU^?L6a&5^%B= 4Dpu ^LEj<2"W'?!uza?Q:60RazT5<0t԰Szd${Vnae \e% aYs[8sFÒWFkUDՎ\-L.>[JX1Ud.#qWgjU(n ";g͚ G>^#WMzը__v07WOw5M#>917]MBᯪf2 f ƙgL}#WJ%XSVnTJp"D3ao SԐ XE#WF 5ȎT%m@a`y VYrȁ|!ד,\e[[}[>` m"1b* ZDh}˫Ҷ\55pZ bQEmQm[ǒךU%Q!9zruRBx/h@DI١f'Es*]k@ sr)+AW6A,%'MzЂmS1eJyCB;ݧ [2Y[-ϴҐ]qֲ@"YrT\EV$E=arԶ-D,bW-}?h=06~DG&WK3q.\a5z@Ц}DVWdՄV qkt?n};`0\]ۯr,횁/LQϦbٯo&/nZj2%gnHjqCl./M!E)IPꄗ&1 jK.`0rUw$}$0dž^v~xX]<l= 0Dn$bIa>LX)fneqCamaY6dvI*ڄQjKw%gJVeߣE 6JF(1wn&9!eݯ tm/>_?ZQEt>rN wT_gkikY=[*gA<ݳ_f9a;KPZUH$ED{J7H_?MH^H&llf4t*׌hlT(6ZMTM)x_UJDXOnl3oc:_Sp2gW!WFJKΐpi$߹𛻨ɠv">C}ľ^NѮvX\6B%,\akdȴ$GfMCBh%i.?r5br>͐ݐ!~j"Wg)#0yn`!W뻒ec.8NwT.ɦ\? e$l4FM$wa[[6ZVpj ̬ їkT_{H"nr5ykL0Ϸ/9rkɹUrh]Y|5殺g$/̋mQEw>> \\ ABsS$R[V*i#˕=RwΖߜ{Q{ =6Hԃ'Wؿn'KJ ^H#HZEG>IѥeףC/f=pcQp#"Hw,'E&8OL ,]|ޞ-bդ̷iU#We@9*؃B;h6& ]3r.u#W6A?L59QYZ.nV*+, !ъ՜(EWAp1/a4>Eg=Ig9`X\5'͑I\Uia.j2gWaZf &G z;UWIa||:XY/u{?TNL}Ώ\^v?ᯖ^`#Abj6!zCIƷ3kD ZѶDS\\7ֆaϭ<ȏOWWJd7 l۫eH`JVle?d>eo ё,S\]>"rդ*|&\ec콙j!nrU$(b䓆\nWLձ~ǖ:O[M!zJZȍ tUĬZM.hmFJ%W6LJx|Z^/z>yh3ut:'ּ[4:ϩSꀻw, {T ji-;Ҁ\ttru%W3: Hk9\U\?R;FT^e5s{jAU ̋qّOg=ղ]s"&*q}Xd'"Wl*FXHG?a6_%j6\* ? =SU0",#W[l-˲1䪮#<ءrlwǏ2!W>/ru(qTk/6ҒD6c$>yrxK8 WTx*5QUt`\-X՛S> 6sS -9G'jI%Wk"zr_qȞ_[.rӥ%[!gشCP}ACG( :BGbdZi\~\%O~"fUYȕ;d&|y:;i @K'MWǴD%W *%k;#~}@Ѳ=Jlvs|Wo/Rdsfu*9)ʚy6~|F23MvZ8^5["t*ѓ:բW\ \-6Ⱥۙ|\NʕXj3B' АJT/{x2rR KY=B6UJP{ 7s;h@Pr˃T4MIKo3sכMNGʺ=ߒbph~eZiU\mM֞5W}sw bݐ; r|&Cf^H@ɢK&hl{>2 $WK~>nUqvܾ֒6瀸c7O8MI[L_E֗a "3lR淘ruv U*ݣ r\ 9=kY3e[^o諂g`}C]dA\v4X&'ҏԭU"A/Kwb. DgV쩲!J}Z"Wg`7ĥO|iߧi\-BN\M'W1_(f_js,?/y,Y:E?rBM@DM Z H :WkYY~\U`yŬg l\U!Ws#F,hžg8\Wx<12fY%r-vkUՒ*ִqσ]5t^r;*n"m쟋7O25%. P{>W&#@OdCTyۻ\*0/Xէ˾iҥ4u3rl{`5=\j`"{k}?47i*C-0p"rul;Htlq.$,ǂne bHҪ]&W+ W6Hbu jxsd&y#Y!\?\-&*FՖg!*fU[Tm5fwxXȚw=D1)<%Wbm+8<2`QnrX[\ ]e}ɗG[ @*0;Ǎ\4`y(ǾI$W}ohg'O=?lƮ6{+O?U%(}hD=U ߄;ȞBjra ]Sꤗc+9\p! qJe|j4{;4׭դ *cʈ'&W]B^r5 6#[Eڞbɛ"{HU8hAG\m\1-*bs}SF=ek0l QC|Ma2 U@D%!WcjoI]#W7]Ѣ¯3BsE\~ՙ@MrFYꎙy˻oR"GTNnA*AjOo;mڸhOcZ/\;TE}U?krV#~"W'^مHS0oIGV-75o0MR 9+Pr])4!6Q?r5qex=_x Q+|(4*%W=.*'o'O2Gޙ#r\C$ikN;f\ՅStZg P '"'N>’ݯ'{uA~$vMD֥&UK.'W+7r4z9 !WkϪӶcXCޜ0A)ZΚoš%V*vy@ɒ\Ӑ\݂^UeN{Ft 7%_,Ľ{X@ci3G'W\.$ULeքɪ5r͘Z F>OXUqթ[O%W@֌w!WTD!WG`ȼ oxv'Wd^1ɾMҒ5.rU-o{ 3nlf>@F,lC|&~r$; zqe&4YtRF=HVƯMwl!W[)CG96RNm˘=MYЁKW&sMdT!Ԉ}-5'b895^5VЫTa<aЬ\#^x|[-ӦAG50@DRyrmZ)BdD LǚP )Aȉ_zm\OE0䪩;,~AI6$aXϘ7M{G>VﰾPɒNn3vaA$0`@ra]rETVmµa|llRj>EG;-$Wpr W󲮺w.4JJ9?QS ~`j>S_%Wei-lq6gU"NKVGj'sUEUzx)KݿnxN2Ji YrਉnJNU,.`́g8M#<P}4䏺hu'saRҐfmB\53lSG=6y[H_'5ɬ1/So"˅Wۗ8~\xԓ[?k:Wjhbz~ 9E"WA&}B#۰]Ӏ\l `8I5ś'J^ru{Dc-ٌJLVyR ~&~nԦ,irBį&gl]DLÛY+=ߺi%-,騫(K:AGSk d~:8'(JBLjjҠu?xm|" mڡ:\zx Z\-GF\mJ[ݱ XیQ-ϴUrπAm_155g /:=kA>NBBߥzk*VBm]"4`f:aw]@ӥOЗ\Z:oABxSsMs ؠVccל _N(c_mh(j L"W&r8}T*O j35খ9,{os9 ژ\/:c~՚\V ?xYƔ2!WA,TҬnrN&^NP΃G߇*Cds4%E!7ha]a%vh}v79dֿEj  MD1/yUO]e_Cȥs\{ܐN \B %WDnrZkUi;Aݐc'r r5v5/wVU @āfŴ=fZrYEX4uV,ĩEz'D֓G"W'Kj}:~JXSIxY&}mZ {4m߈D^L\3MxDzrM@tm Nu=U_Pa%WMߊ' ӘgϠ-gyC"Wu' WYv }䪚, ّFˀ3_M!WJ37d_s|@D}qo\G7MسPQgkeoy `X$Nd:ś&Mvs>M4 LIP Jt&/O>o\E' yC՝ƘAܫS VFX}+L+bV lG h?63"]6v7IC73}OoӺ̍qa*1uJWjl>*fQ. eUe)ȉ/,(Ȗgb7x9tҨA89r!G],0'\U ;ێ&SL,Uw'.hfM'β U~_}m 9?!€ :\L ʣ*ؖP$ȃ@5gA+K;\:ꦷG|[5a+ eײ=:%Lâ% տVuu;鴫pDX6(`#l1_:mw )~j|ϛ,/RT\s޸nWrVD4p=nr=x]c:]b#̎U Ҍ5C2vsU2,ۡ6щ:gU判fq ^!WYظz1 &(zsH*u A(*rԞŌj @6Nb򑫿`NL]v "31˰\gOsyzB;/\}O̕rC[j?B=|8(r5K)cQԤ5+!DU7\|;:i\U5yK:XrU +>O(rաr@lR.Gn|%W?7J-n/M0Z`X5 g xfUd 7 lA]τ^MTJ5!ؙ3cDv))יb}΃IDz ,5^RxG> x(3Ek\5nQӫH߶'W=u ϋ"0keZ݃j۟G*r5ބ͙ґXC\8R78 {k@؋YnA96?]b|㴿7xcP[V@8c]4u]jLKMRn6Bw\e_pӪK6y")wQ[k~;-26?Y[r =4u;9jVpRhqN<YŶYaކo\}i<# z_f'WM`f\n"W]^uxD%>SSjg 8TJƱLk=͞0o8 ̎/Tz%?r)r5;~T\@y}GGWAyԑK8PghAk[+Tb}pWeSO!Wž-Ԏ/搜{ ?N!tf1G1i y@i$#Oz[&Y$߆灅]ͱN)*iO~6p++S^ Oɜ:kMN[*9"v "a#%JBnw!W Nn}*YwĂc܏ďt Y#%:+nc=΃en;7 LZ Nr%W,!?ɀ-֊ju@ {,63Bv!vUhΗ21Q`m QHΐU! j%61Ew-Z+jE7nOFz iGBT!`ب542䙟 (*xޟuMwq'W)r!,(21B&"=Bk2iD0ju oP?q_\ e(ru蟘:"G* Jgv/"6d>9,^|-F0ݒ˻!_  Kzez#W?1DT-֑O)nrUgU+\cF%WFq06ii[Pw>%Wm,ҴtjˣX;~^q t?8̉ PIrqX'fbV3c}x9^r^eBCrPw)S+Ujꑗ`$,Kw'ȳMZwQOדl&c O?r١S:Z<*oq&¶Ɔ^t#*!tjTU]7}} Z˻}r& ~XU̅ ZPB!E(ƪ󱤽9@0^r˕:4ua=w[wL'yᯁv2|m%1JQLD\@y(JCFު'WUu1o.G ;ro=EoY/#Œ: -ΕZSM␮塸>@* Fצ*.%Wuu[lɛ0 t!WJ~TB}=ocgmi48om"ŷe'AjDd[l+GEnrEM,~Gb]t]\LJ0EO7-FUs+-.9K C;*7 Z W^ruM\I_szq+ND܂9w:I] y6cwn ,lm@~.DjU~_M~cSꩧ>7l(Έ+h31:>;é:j9TI WW6fBjи)SeכU@ўz%rHSIM#9ˆΗ W ij#rPEƔW:R]Bv\}V[JZUQpK5t}|U!gkj9a?l.lmnr5 %W?Hwr5ErW|D8AqDa)uCQcP/JODžM2%WcVo,g<,VetWĮƁ<} !jF0StUĭ1e޽*rBT=x0 ĹvꌝLJL2`Gpxsw}~(t`5v[>[QR$rui'˜)鶖O*uNێ4cU { rULo!Ϛ {ݒ5=zh ΔyPw%=lJ⑘ՓQ̴7.6Tsvļ%vcbEdžM#G3bM X!Y1eŅ^T' ^ڀ\=KjŶ_Zsmsz oS%ۧ!\(Tcת>F)o.`K%+xx1ac`%~xȁYO E׽A"Dl5?ǒ4 W}>H=3UiU5I$|YI{"Fi:ĀXsU ?W2ed "Wgl".q+RnC &cJ |K&mtUc#?r{baV&ۿvXgo0T3߅ryUQnF. ,6ˬtKaMd>p =yILaYrW\됫H>YԓR륝NH1Az {B_u'W,3+z(նFxT`m?%Pg s6173 }"W"<7js Y!4XvjuJ}:$"KGaizDJ\~+6"_O|x#&Ȑ_;`4"ՃcA]Np0V(%Wk"2Z֒QQ%WQ^)Z7¯dr6(#p8oI'>oUF+l.Mt;A~_Y<N{RU\n1({c)uwށƱ/W tT7;wEk ɼPq_ vX4zH֊0E00 9="WgwCov'{N?~ÆM[dj?&h@z-H`{0/&oYW7="ߩBNHzLҩ Ud 8D^b^/X @\ml%2j洷z10X~>ruK8̦@s "^+f3M y 5U9m{6)Nvr5u+Ȑ{  1T1$kr Zn\WM0Wj8-5k0܌~lödY334^rd?~F .}e\ *fUؒ=U!~wks1,]7j bMDOg;iAw 5NO$3?AVY&^@lUfWMe?b=od0=[&[N|!nw+&.öMa.&pq)WC2Nu) GqZ+c#X\КZrU"ɧie2sA|?ru%OLftITkDՇZW' w7UBu9Z/!WUBk)> @TTl1*L:ټ~x'i:e|nZT{)=HiZДY}*҅,ٖ+--) $W̝;j[#o|=~I܏ GE:\:/*h>~jdۼt$j= Te-Q%WUtM腭>bi&蕪3)$KuFȣLRмpu\-X9" `YM٢ ,,c P4V{Ēh%^T,W>4!Sw%{Ē0|Æ1x@rbmgF&.0_&W'-2dljntD0:kU&5al>rR* VfـWIGAb8aK~T WK3Ѡfzҟ̡/zr²c +/`u lC)T%oB#MouM(E'd$nrE~#\=I'P[c~f{7l*;c'Ӵ7rUY gxT'&}>]^rۙ3Na}B3u qp"+'ۻHB?۔ tX _(6y0#sZKﳝĬyNcƻ1/uɏ f:1t)q$=w zYoͭ_Rvۜ§/j8Fᅟժ:^W-ȡ@;\$3Tuj冈5Eځl%r%ruT{_f?0 8D:}2Ú Ռy]egUG= b =ѫHW9)RVmW[uú_"vUڹW!>ZpE+A[i|[UzhyW")K &| 7uzˆe]KO' L\[)\ZUy5 UYf_k&/`Uv#UʉӪVmKݸy`A{u;3XC"W /<M1Ž/l.:WM7jnIt;UL:k?= 'BDq^o€Jۮ0: VfSb?E?U75cjbtU2m[mgO"Wg Qkl{.c\tq!W=?Vp9,ҒB"8`^cW  )*@-O~@XrՔi̢G l>oo-DalyO>Xru?dA⅀sl::ZSv8-Ô~p }`<*sՏ\GB>S[QXq!3?<^[*u|Py-7AUݴ /9V&"QM+=\]݀\U5{h~=f@n|hUrh 8VOxIh]WKbCvU"2w!Ex sw7G~sC-L*ළp)#);rHF<}_ ;h!iL=AH"6Lof4'\]&cލ;8Ec=op$7uPjr U.mGjkÍoܕԬ9glu\ [W_3EGS(1b Tj$nrUh}64%W#o! V;qA/,ʬ)!ސ)\ߊTG 7bpJ\ue|D=;v(ttܺPA}qK0o[cXcP+ _ Gzj 7J0KE֔ٚLBJs$de/fP ? N{S?c {+bVYeͪ㐫į44^g~K=oi)Dn:"kXNpqƉW CwR9mK6E3Jg np̍@9STFɌNua){aSbkM*b>9{_.2&ҘE9RMa^{G8{caE\̑t-f$joڀ\M2@7QrK+]\T5 {K܆c^휭̱y֬[O@J֬Fx?"ftw!QQ-d"h&c=t$Aj0$#PtɪON*b=Eœ%rth 9JL*ڻF15(2cصOig>hmAW̋7bHx a?6 "&ÅA (zmD#*P8Hif{6o#cHTĮ:l9V$OWQvk}<ߙ*=fJ<6ED z/5:0m0r8 DyCIan@mysgTK Gl L]v~_#Wuy$ic\6|1 ' 9r%c0|yTS )|L{USLCMӉ&y8ߤm6s뙦z?z1ד@S\<؀9vo( v弳xKx& B%d~r&NU]~Xs=u)PEqӷ式avMVla0hJAg^f臑*~သW&sC/oWLʧ:_$I_`YI5t73UP_j׋H$\9. ^4˒Utr cG咫 Sh&W/fd7rod ]ưZ'W-b*ó2r6xɋ<*ױKgm[XA\[+CMpz+ݧ!G'W;.]$Znv]1= UrUmP:|dl20N]YC;UY0 LC 'IČFrU6lW/ l6xn{%čbqUrQq ~])]\ϹXeP8ݽl>Zm h?ݑ%1>u9rֲNU~]Oݥӏ1DcZɄwoOgxؠa m1$WeSiBh-a$=T/5݌(9->a JrU} ]jP`ir=)AL7kCayV $lx&?F" IhXj\cwnof"V-:z^2:&M|Yz *"GZ ;{|IT&ӉK n`Pոu2Xѯ-S #C #~~p9'zؽ8wvXo#$ZiH6$We'Wi0؋$ljZGvsrճʵMr –)gNyi w)NI哫+ͳLH%Eo1ś>:Esq_ `LؿaV/*q!^UR{KrU>RA灨Nf7t9EvwJ8[ʜ\{9 CL;uZ}K-bt?n q&GI+G#Q2BV.xqw,f1\bxrA$=, I:. Qf/+'/EK[Y\L@u*L\űM 98q=y+#q%Ec$f"H,X=±,P/R=cF|>I\ y1,z>DMAalan[FG ,Sӹ"v-a~jOѭ[3;v \̒iңdЭxpbNn9_1]J>̏vs)Ů .'D{Ve8~_F_$W2l:Q˻Dk,`w~r/c}X 䪞b~%79Kkb-1Xon,?fǹ;?o?d~rHw*@?^I+ՑQ>? 9kƕ󪢇QZ<7Cq/H@1[F@ KJsƻJ//rTDZ( \ ZȤksb ɡ? y6r^()q&|"[[$Wq2 ۧN_| w̰rX }Z #~fm$W oe1WzXf mʆSYt!.Oqr3̆> =3\B -+$qIru^$d͋I)*=E{ˡujCܶ|VX 3\e:=KIo2:1U"d/Dz00$]eʉ`br:. ܦɲB0 trp@KgcH'ޣFZKՂ?쐮 _N9NT`ur@TSGbMI mϬ{9oSHrC= WjQI V9 ףּXuJ|c+rpO򶜡>!U9 U>ZA0]6S:Z/s^T!eM?5!{&}/]K$OO.*[LE`՜YZ.*+y9K2Ѓ_Oß8QJ* >r|׍ێYjod)6ū&BTNGs!D|l_OV?+SKHb\}GCQI'buIo@ =ڌLczAmyIP=!GhN䋉Ë\=r7NeP)c`l g]_>,<$ =)z6IkOe3vݒ§՗-wk&~\:=ɃEes>U9ᭂxIRMg _9To?Y`x[HWdZt|$ O㯈. ָ6dK8_b$$"aڌ,#ۘpB$;;-ܬvQ#*qWe؞2?v#u7^;D&!R: ,ʫ;BɞU9s&W3*9X"$ \x:?{bopX6]]dv7F\/%H)K*&W/e=wYFx_$FVrVcduqW0!8'=}a~=뀭AA²̡ߡAsrU>0 3Jm,U*IpCbo$0¤udJw]M>#'T*2 +\0NZ(PJ?er{%2trUmr\ hQK/1Q'խߌ`(QY\ -M]J-׻VJrկ ؆K =kZ>s~G'E!Oi*CH|bO*&GX| TPp+Bo+.>9)\LODT4+?>$&Yd`hĂr wq9>(yUjZK&ۆOHrpVCcCe@9DӀdoc9*T/새.*1R K0cj\?\˞V 7_-&Ws=rlm?3ϼjfsҕXiعkWޡeɞ;3hQQ<]¥>_NQզ:z:T@\ c3wgLxp?\-wnSjʜPk ƉWf@+ƭ#܍7*F_}%W2F@j-kE}:(GOFg(Wn:*RߜzQ:B  o\odL·Pc)Ȥ.F/3PV咫pdz}9Dлn<#5(/"`+*\Ń+ j5?\\dp.GhwuzW$J܏O Mt B;x\|q֖O;E#+J0Qμ寴غV+dG_1rg`E~~,\rË{-MW\^q[yWCr&'WTruěNP5q ]g5d8yH$|(U8{zr8wS-tdz=&\[證eR5΅ˇ#TfYuzmsrurݭ'0d2(y2% E6E2s֫Z&WA,*?Q1A\>6z~:εmp>0`*FɎZln*ȱ`&\-kqw+8trq%9Ԁ;ɐӇU)6{4R3N]CKCKNy'xBn0er_$:~S}}c ++cՎ- zn7vAd#/eTirc̲V' I&2,6-;(HƗj9Ut<\P IriA&[[y53̖],B!"Z2WIѿ]ͷ|\%&tJ>b'\-Yu-qc hϩ\f[ yUK1y@tSOS/Mn"_Q#WWfg1F  r~YT!),Iu^OiE":('hWX5#UĠ1[sruZ}\Ja^^%W%8u2Arp%ï[po*١"1G""]&Wh%Ed?]-V2%0>?k ]=wDǴs#ʋE : {a/ UX(>Ѩ_!NлKruA|Nf(<myrkqir9tt=yCrA$WfƝj#q5Z}cTZHnP2٤­/Xq ş^1GބєLei]AM,IЍbu4Z!:FXvL%W‘U6r0F’\?@2I$UMb0+g^?w3(F. ӽ"qaJz# JImŏ@ԕQLF!Fe÷o&{VŎ2CX<ӧ8|rB z!R\e{}$WBII#r,YhQzKw%ꃎf|%ՍO@ $%jǣw'W?oz=xܣǫ_.;Y{_\㽈et9f]e=P ;sNCʞ#_xLX}?%I{X_On,y<ܲf^bOcO/h3/U7-|i}מyiV 1 }晧&WO3/由뙍ջJnJzM&urU}A920vAFUg'W!t?\.E-pn~MEP=Yܖ^Ks);3 cO~9c (sN+N٣{ջ&#FVL9V͌Mś_1V*LN1,2WM v"" \T&!a (HlJ)DqVf`ՂcRտwNvH9m$jڢwprlqFrV^#CR\}[^C9l]Q0_tX^ .Ivw`jUW4YHd 2 ?u5]RoI3V{>©Hdג&~j$WQ4KKb&s) [NU"qk˖{\ /}~BfeAʢi ߅j]P*? r\- +|Nݭ*&W Bh-/T&{^=U\A cFo?=zSJtd raOxQW}^ʼy5vt&zHAW 3R̓5۪Ȇͩ"]Y."[]kP\[D-1j;mKVL>ⲹo*?6 @Vr3ZHr ^ٱ&H9,:%:۴Nb&WaNX4;(m\\Ukb|%xv[咫Q:_0S~6Wq1T){u؏R֓ɢ[5͋P|aSOwNX1)?ci~5ȜVo)J]#^*1/rT&dOq7R,x@2ޠ>MA *'sr5l`T$K CP71^I̖l(>=@@Ψܮ?w0cî ʱYelq4b<a#>%kTY&L¥h V--Y]fUR䪜!K7{ϠAZ+1ʍ+i7 jU~ECbt!zZ2GV]ܥ+@\}PtE9JzՀ[&We+} K8_ǢKbЇ5JDD${Y3H]YqU'PX1MK{0˹\r٫KrE㓫7.*Q\x\l7LHiNJrhYӓS}'>rxxTb7tߝ\}nk^go>nr_=m}hmĖ'}NBbA7;v9]!v+Yyt4oƿ޽?<ܾdۿ^bOSwbǼ+͢壋;;v:J}}~=azy"0\aN~W&'K,ԁ·/̓mUr 9qA\FjÎGsTe>=*X!5z}.w?eհP1J؜PkL|+%\/jp@j п$)6n:+ErՙAG꽢qըpF<w) /O?\͏ϋ̠^.8(]9(y  g`\r5ik\9U@؏wfDONŘ"{~9r8{%pqwc"H0'WǽO/K u8 fI_i/@ڵ+G NP >u(FVL^Y%=gN uO-A)4br lDUFsHM#CQ=M3xU?衯R$-;1F,9] ;Uv1nkFr2srl0wtNl". kFXerbQ=jbB&nNܡ/4R]F(brU^X<atÈFa"[.*.K]e\&zOl++%n~Sr,yא,D /#%èfjK4%{f|Rr57(;=Z7'W=a/g']ziQ3ն@4c0vD:0x$Zj$W Voʖ咫eLct\Mp]: &3\:/xuysc7-VxW/#_meU#4H߳:j2&w_ʈD $ \1 Ycr.ˇ14dew2h=ïqK"X_;#Z7= &TtI2#\ {]HMʧ uvNbHP'T*˒d*g7M`͘R8`2;w'>,#5+'*C8`P2Y |AݵlZ'hyq7!.ϚV\;(/IgVLƬ)No:,&gD@8aE̋-,f>dqI0B>Lذf 7M6&鉝:zaO8JB%W qF2Q^B'ĕ'KqQ3NŸX-{]v/a :W1 AQ7d]wSI%6 b='dFao`rrլvGQv _9*$`LUzzr1[BU7 x;njbo1|8 e>Y<[ W'W cWY3 ({$W/!&Wo>˒jMo\R># M6ShƤxUU [Ø-G_f!7pBGrUwOB&ZzoI,}lrUv!kqLuby hQ\#zj~ NHrUS{h$Wo2ࡌjJi K\G9[N4O}O-T/TfiR:\׆@5XQ'7{ST%9){[U`U  VZoK/#WkNAt䪸PkSOr/d&=z@*t(Eb\%=}: ;f-d#Yg({AQ/zwrM{=T9+s3OP4w >I? ϸvɵ;+Sv*qg®*cjjUr_.n?s^D?M>3 ">*STrOW\<+OI^ĒIqr'Lkhl\FzZűNolɕvlkbPUM 7cO pĀN'׎)_ 3sor~J;3~ʖ)ѿCGuʋG3Lٱ ~W1/ {#9)0aFSwE%0嫤 ~mcG6Ĺ]M+ldzr=ʈoC'OO5Q0jrXW{N%O^7=F G6#yEZr?I .'7i=,n쇱C_M7Ļ}cef{׏fR8f6kLGI)k%L$jfZ02Eux9vLkӼ"nhvzR[՗HKI (PtdtD ISFƏ"SHU{T;-vr7 K=&u bbRWDxVf]n")l)iU-)6i;nk 0{&xHdʀ?%1it)6X z1ۀ F" $ 7&qx}SpoڗX7ŦE#)!.qvαο'h-~G#Jc@ D8IN53 Hݻ4yܫ\|Z$ W&-_1~T0кn`pq2_´ॴC Snۤl%/uI}/cePdˍ$}䭸1c'v\ _Ŏx@ CV#=`ei" I `pZrHI\fْvhMO6)lo΅!\?%""=Q蔶l`x׿ ]- /xd%|݁.!"dZJ&RiiIqh7ԤM?"OϚ S1pG iK)Uk}>h9Yqv۴iӃ$M2vHP*ʔ FM*5WȐ8TmzCp{q'*N"XLaHaiڳ O5A,BeI %둄`⸇g(&=f?q|"Ayc/ӴoSwtw_8#-x g6CǮn`%oJ 2rJI y@N5 Om\\ mߡ `QK8/D X,T1ZFw ?:aVxW?^MKyS_Ψ;zp-.0L- P+vOnm=CCfJY[),=Y_-'_OJK}_{øsyݶ?_{Jrumig˴_u0G𢢢[ߕ9Sg|}z때/3IU$H*3z,2|c]2JT&iݼ]+HM˞Ln숾g]&}N[G=OC\9Ջ򓒽lAWO'Va)S"G\=ky*MI̡e&oB/Ƭ𬈾2~Y z;֞wvW7/Ƭl$?LV3=4n\̻u(#s I*'M.3&}Y37fᅊ->,(qYgis!+L>A4&L(}ni TG/ cr f\8&#[F`G_];kMvK[2uL4ߦS虫&rѴ4 Ǣ 6NNr+釲mi7o\-ӝ1=녓7O%f歬gΤ j 2ۄg- H¨w.w>igRGo U\?NOcyk'@9옝0݂3g dt//uf8 θys5'i$O1'WSg~iJa 7YarWJNoډ(;\C ݁73^ťM hP6TߦqߐISm}-+FS3ifLw9e%Nqfg@):=cz%1 ]5d~[q)Q0'֐ù S}m6-]z|Eݼv0Fgٞe#.˴ӫbSq| %C\JXDNLYOd={E.Nu/+q-o[N6wٽ`bǽO#5mN" ("j.mxsg5[%dh0H|F-4WE"eJmD]tE>Lh7u:Xe:03FuEIڙtziOꁳ{CG90wk޺ WRtlSkSf|y^\ڝ5~D@wSaYoNr\JN6xiCKSY5lȒ-Ţ*7-W˟x8#T'IoJ=n\*P8}Y{|Nװ4r7 [;ü$Ͷ-qVP ARt?*mog I݌]]1gn\QdjZ^ Wcjzϫs7_h;h`yQe ItKƼNWݼq#n4$+ߙy7#GzhA\fM~ @5g0Hbgv%{T0* ^lYCuh!g*#kv?z#Gz5ͯ=Dr4Qu+Tw©歼U3ŜWZKܼ^hu#x7⇸FM2W8筟6/mmY=z"; f]suƦ|h* geYAXCjnlIq+ &IoI]bdR}S)28NѨc \8)ūyaD|Q5'jE7 I.`'R1 VfY7]"LR Wa3‰엦#*Q`司f$M"7zpˎ2ё7X|vw`ꬆbk1cB̀[vK h.Kw |$H< /D(2bg/ugo3Ӥq^h0*rES;kpevp2V Ŋ f[)Z̰޲Gt3eׅٱ;*oh' \PdT/-ŷ)!Ukga_re2oHoegew^}ܽw1.d[{IQˤ=-/Tyy ;NOnm UO944j{wN$}5_-'_[ۼ̻G;w3߮%Wg.5jv:}0wXy.]jő~}/ ];f[Gtt6݅.^ǻF[E{O?9}z|=?X]Ϲo[=)#{ ="hۓъZtʹ#Z/|N@jY ϶,CXe?7#A_4|[Y+;lF0p檝'՞C>ghQEYAX )'V=ψ^\ҷu*2d|; 9r[zq'W8&"t[0|ޘBsX}=\=:" tj?oL%ˢX3c0U;[vgŖaF8~(jf ͚ݿnޕ'^-cG68XlC}z|2ϵ;0XQӂYiɂc)CŔ6Ơq6:GM^Dلv-ڂS. 49$ eEkrOC&3H>tOx2j"5im}DO{b#-^6m4+6 ڌ^/Yf$*ݯ6 NkbԐж*V0gLW2 Ǻ8Y8o&rO_ay.ݴQ?{@}!1")#`TYpPe h-U}|6J_;CHE-Sh͟tǚVtɡ hpazȄP:Wbj(X684F x(,(lXO , =?';qƈAba;N$,a9Xm2a#0@a^5<P;<8u "ꚋɦ**k3*c_tAX4lxjv$prlQJ 94¸#yLP/4N.t.= <w&V IŊ)"+j47@ T(3KEɯo lLw#`jhj ahg+l ".&ֿ8GØ# d~&">C < EdVn=1roF"PaFuq)5WHZݐܑmT ׀$zPA,0 PDوuLܮQȼ99<I҂r ^Բ5"kZn,s\;7^:~ 0>L@6}4@ Pvxt"v\/C?1 '4^iYcgl@p"+14u{ ,DCQQDSMgȆk@2E}sG,zu%~G̝bl x>s7Za`=7-P@Qh'%)a ,>F /\b\k㚒`2RDKL%?B4w,Wl=4C9 `JyHK9{WKB,-/^N qaJt #zodfnY:Sơ O "Q}ZBud6DE![-!1<6}&Wj?%]UZܨۗuڬw}kZfJͮZS۩um:fgmxz5F2{zTi:ΣT`ʩܰsݪ6SUu9?˳j>5<xz[jS~aTΡw])ܗ_1QZݽZU5: ڮv/OZ]Hkuܨ+}Ҵ'Ҥg-RWtj3M{8yN^UTk5VwҎFJRi7NoyTުJc*#dUp^j 敊^H4I)]B>J#kZu|oEkKf;E֎6WK6~XJL/Gjs[WZ[{Wm#j.j҃fQ US}i5 !Xi/='!LFݨEP3 8FP3Tc5;CF]\Q Q dEQ]hZ*ʂ40R#@~&[h=N>ATNen7$kuKl-f6Sa:jKoFV*b}Na,zr-Qv T##(iCJ`/tѤ@QTO o cIGiH@EMJuuTD[wwWm64j/νQ7 Yũ?:WWM1$X+E@wDF2xBoUA#UM$A5ꨡ(ݗt[:#SVix 1k%jBikDQaȁT /Z5B}%4Y,@=1^X^" -v MDP##k_c\ci{Ǫo0,mSSI#pX^i4z`@’F4ڥL$<^Xܑƽ' ]9C_tЬ^rDZ#0Wh j?; cjƗh $bZnً絈h zjg cQ xTު-9tP5 ط)Fja],U]cu;@G:~ #p**b&87fsi*iߡ .s9ALzY`!ʣc:6$7K$ kB4^:~"^h!I𿵋2!2aW+aɀŠibQl6>@`M} crqDz?UOjePf=F)4 s W[nD/x4:S0fV zX INu}&îbJnLI4 tڴUc{h?f*6Q|hOED$6}yxC"O^:Ch+Ctz-ִKN I_BhW_`yDt-A62  : -_~I2) vAlu,Tyֶu@Z.IsxyL\,ĊKIAlc"m /7M(^8S葫Yw\H)"P)G,`}NOd0+7೉mcʍ5Ė)GPrK{U>obzbz&&cI7I$Lb(V(Hްޫ;k}}rt̛],\<9ۦ8 uKPAS=!:HnK!pJP 6j)Y$*(6 CX@w1N%~>QcuJH=+fha)7kЂEJ2/u ;79Ͼm˟WMZUFse͉V=reu7s~u ?nX_z@@xL{(y# 1m=cW7m۵ptXx^{؍ t1ߺlMj>yS֟_6}c>[~-9CV`ta/ pwڴeWxt"OU^Y=!_1]<bs q.[Ē}yi6_84dh)s9+w|3$_ X|mwb]z|[d7ʢɁ)r4)x|'а -㜿kΏgw!  YiKN| ZE#aȁT11sz;G>n՚Q}olڼ -~җi2L|7sؿyNyb2> FCA>h\ 3k%.gzFy7T4{?4X;5ȵ'сekF=1(@>>7P|H6o=󋁞+=>6n-m^[- 7i%30X#.c(F_>m^26}A3YrC[<9m jE q(ѼTg\ `P֎W ^]Z@Ɛ JԘ7\SRG!nKWƁh<̯X~6zQ\]ֽ3$ Ǩ{-mY䩿:eL2xŻJz!#k j=u{Plc k±Oh;lڲsƍٺMy+s'ElCcw(ϑ?E/ 폿eLMNWD(c&0('>!/?2?cdRtXg ^ C+:);@,=bsw []9?bha|#}zA]wOyW`jEK֌z.,l3Zmu'̝PNݝh 0?CWi9;29Ɛ@?D3Q-2GgRAP&Rq9LVqB9AC/^kIoqQ֢Kh?<˘?㴟{~6G~^8BC_Ar n~ =!ء] OS?K xg؍7b KX5m$4x@W (Ybpֽ;MjCn5Ȑg"nOGIĸ#a"YXc(Y02`7~XK [拦@V;J6ae߈&PQt1=x`D߶>IVu{ dc^"Zn{6/|>u0+?{ĢA>HKtk*a:4ٌls=9/[wx(U ab87  ib+f{]ڶ ǎpxx a3W̘RB%1dED)0v_1p& "z3F!yQWb r-v+W-AV$6"d.~&1w ^62N'UL mNH &BĬߐ\$??J9j]N@Qlg}/}}CGsAԑCG*~%zm7k[osOː--;]Z!ySK_sϒ=iGkGG{c^t2>OTY/y31}`bpCm͵bXW䤯~7/xbsY6's[I\UԆ5~/yM[wyjq/aW,%㓆Ss|}ةt֟֕_3TǗb&\kvѪWO;ֺ2nK=H{v|e._/:| 6?dRu̖Pʓ5;CTnk*JL^, &ΕSrƘZfU$ryJr2?xbDD8sWH79Tvxm!$ea>aփImn.M/MĨ*ښ4Ϗ_YI1 3L_Jv;򢨱&Ӹi+oy-޽$H wHdϒdF-t!7Nzة73>x}d~KV 3O-ӖQ>Q zͶdC򣞹#Tni+L3Q:`{?-,:݈FS}+:_ӏIؙfA3}J-zDhC։b5bmحX1Z`%~(gݏ[P\Qz1hʓ8mbʈ"̎3qVeN F?YϘ'%'g^Lgb\8k1m W#UGm*?8r|Y?ץal(D&drutំ͸M#K=Xm*=ʘIؼ0 >8_ GM4LkCLxHݓhaWRSeV{s]c~  cw>ays 3D( V3Z@USzmo,>^܋SnBmD31FډT(mڄ3𵫧-5EuGhaԛSw2G.65ԩ#z8NFR>Ӣg>(P W[p,E\42}ś<\8?tQՐ{ښyZCx>?mo}M y`|mc^TOn.M@DFsVOh;j؉L b (z寛C1vU^XI^,?Bq!y+Kహ1Ma<fg{y{*wϘ9 4}~ o7qޣ_#q~O :i^(9UQa r" SBH5q΀}+P93$X4\uTx҂'w,D(!GimH ' Q苯C8+smA^i.mQ+ja7iX˛9_sx3xOň!`+,DkkXGt6Wl{kw07֐sNHƦvW ˈYîG?}N /M? %Ye" )4]< vW":dbx;JU6^cAAV6Fgڄ2 M(|ԛ재\mxK_/VAVu6+3$@H"ե 8U$ ٧ \SOZF/msM*޹O8)a\7AITaVu $$/0imq/}9l㸚O>'`: eե0X!a( Q"521l`:wXy2OF+d("4}TG\o> ? \̅ I!υ~ ΐdG> 6b6 [-U& TE1 oDO7tנEaX8 X+$)z3i@08[h+0XvX yɊ0@許WФtoqQ@+Ntat<Mޏrr铘<4<DBgF_`zE]44Pĥo0ޭ0zhV W\ʥ0^ S%JPT<8Ngb5q68,|U'ʦcA8@.}3/5LKF 7\*W8|NsnTKAh (mi74ǖnE/ Ugӎ`AJU:l1lX+.x[S5!ё$pIVip#s Tp&*3L8$|cq'w5e{ )Ǡh~jdH($xݦ'w)RKCk+NpƢdA'^o-}_%WٚƵ]3pAWteW,-;.{=+ĝ;{W_vgFv5ߟtvk`9%H~W~$+ ܆l.ī'{2_XX!E\?&a']W>[HWi6`$b.l~$G&۰C 䆣t$p$ I.:b(ΟGvy+ђ3qzDsBgktrb~`m➴̸Bp$Нy% n"W (;J(6'O&e&> W[bVkC(bI3ݿ(4xx=d"Wu "WhKoیbnEAOz!Wg["L+Bn $>9-7}Nw%=Yɴt2\>,DI= /npE%=T<ph)6`导+y3$"cWûu $}ۻmPf%ɶy C! I6`:U56)hJChz(;٤4^${dEgy50mfI4h*6}{"41WI2 P+W jk=k,ʓx263 gy| #ժp[~@{3\>bi MЋ.//N>,Vu$MZ-UnQHWqßI(8]1)"eZ LqxD04ߝ\U ) x2F)ѹZHf> >1a2ÇJ\͏'\Gѳ}Ttwךf(!5k.IãD.# )Ю߂@ lh ycJ#`bP;C !A2޶p5qVl/b#|+sgŝ)dʄ$mm=Z~# &rUKuL#eNbBN[펶f̊'/K}\-DžO V](D F 9Fr5/NJ},u>E2B Ci:Yf1(򠵊{,:aCܖuF+{\)c7v @ttDŽy#OHTmY'y-V͟4sBm43\7.2OpI{54Ks}DcG  Ǫ<52,?ճ1SnIsr:'27\Z?!ET%j,rsYLGWiR~D0r19 m"WI\5tet;#Zixu{$cYh2N$9r\zQxЭPZUKk>@Ȝ` 6:f(|<\޺;Z:kv&E8=4Ag^EI[>0j|$,x݄.ھ':B(om  e:NHcnj/ 0d2dQo:/&y04a"ńA8TaҏpY ޤrȂP{F9OL8_im8R ե0L=k bwM2.$Tc,G: 4̀ʴ孴}B MHptsZ_Ϳ5T =%Դ Ll@M4|fi'VzNPW %0һ}1jР\ 6 |뛚1GK1b.B3,Mn#`&ԁ3&ryh*ADL* f\N-_Qa6+G2c&5@$` d^iCĎv\vѐ}J8krxL8\ 3Uo?ʳȕpq'#R[ Ya`'lDڳa-5QQx&f(Bz~ENm,GP?ӫ%klKXTɞ8@9ߛA[s-5T22UgCd^&W^u?|pzW {U]v=ǃe]r/߳=U_h'P$nCԛ6@f"ӖoՓ g\c!ƣ\ ;je㠲) OjA#ZaAX'Zr tM@#<q6}9!W,M%%>%vW?ӏ*$ͭzS\KOҧ<'aN-k't6漐I6y6WF$oxaV/TH7;hmmN8v$PDF yGweY$@Rvr5fr_UJ]A6̑,cB"%D5"%1z$""Mm*J"Ъdn%v1u񋥑{U R'#Nd]ݔ4S@&)C 79k?͆Nyc^^VOw%/zPWP8[d]Hg*2zaQݓzmJ% O~4\ fTוoWlڤUޅӴ \sz6$PD W4! z\mo) U׏1P,2e!4ɯBJOEgLjm'AȊiwI]'N=,W S-޽Qffգ^F" 2+=dpzrzQ1dXDUI@]9WM[qoTD#n9~G7rǂfUcڃ\jAg: +^@zȓo-kU{a҂'2?2Yjd7re6Az[zݥ#L 5!Sih#LbE8t xmMQQŝdFr@HZF}BhlM# 1$r9G[N' ܕgV%~|)n~K/>4@UMFJ$r ]=(W"a4"W˳Ԫ­s|H"j} Hqs><2L\E̵[ RmbS)rY7>DN*5~ƽh j.:qVW\ݿJhF,eNd a~#4 ā0iK_Yz2 yݏϸGzAFruʍ!Vsa O-;qüP*,K/dWMM"WPqDȲCQ`Iw\͋2jipW[@j=$,ݬ\Պ_|uaqYW]I>ϗ"W14ؔeӫɑ:$boh!WBɠW pk;:s#@@/lz3n6w|ZUxL$j*JrxI[pB`'1mͯݎ8vΆ4`sW>uqr7ةg7 cdqsm kbIy6rU-5R"gL?(Ku$!䖪IEp=H/9뇷o,;d. Um8 ߮:JɎ#@ t5Dtć/ݎ(𻑫hF(ESxDt WO+뉕mB3@s[:aGxR^QH8쏁0=/BL"qQܬϓ`G?2]>B+z'hzik5BAOk{KSqo=jN_m͐8;Y32d(DsĒb?"Wh IQ]]?yӁ[g3|{>"wEǐa~$ Jq/vI9-o% F}&{D'/FӢL]AS kSw۞/sr5so#A PLj`Nڱ˫QQUWYA_jb*'I%r7M%* o!B&#XUةR%4"oSヤUʔE_,*F."J. &lBth 8HF.C?+THYo%X&q'Oǽhr e4CRy*JQ5V4'WQ¢ nLw[8Zٶz[4Su64{i8MMd8'@>03Qhl^X98^?dKgQ,/*UTQ1Sn4_BתջgOJlQbUy "W3< $3Nȟ;.ikzo][=ů_VS;ܦ^ tc˺RTaCk].5VRAm˓UpGỉJX1y\%(}Mu&K̒!"r+r:q3S0"c\% WEzødRG2Y:9IZ=^\E[6pA*%+jԦőJZ8I'ڜ}qtJ$f܋C`Q~ڀŵ5՘U<[ ?$3~(LXw1@.8&K.y#!sB34~`|wƊ+y12K :UYvm`_} (;XM!|鶰FBk 7fejⷓ.!5fF&aJo, +rurE<@D#}dyKpn2v'\u.^|#XM OUaC7 ]!]jbbG[K`DA^bŒqG<]խGG7!\Uމ@)ep2TFD`3HOvso^&v[y.TkM)F|e+eOQy@3ݿru惺^Gm^ #wtB8$Ϸ+4&;e{cKOhz|x}Iɠ#fH! vNIdqx'O!4n>GUY"|sX Cplk&"|R9:du?0Dp0Ł~&n>_o,Vc%䪰/bʢgmu<-m̋ҨL'Q񽲷H- b)'Z72궼5`6.+Aw4IGp5d!@MMj~=~7%|_04[\Ӹ+L=r@8ad\.ɶ'k#MjSA(]B-ҏ^SMh얊1 +[ y$frdφu+P=7H{ɼ+Q9`u o6>"j*_+]:k+@$i+܀Tű_%m 5K-CM_q<\/;T u4A%HF3Mmk"@ ˪JO2iښG&du'irU@@LFmrZ=F~$ ?dm.Ib漣)#ZJdũ"W.w2?t 0gc-.bLHp#W";l@ /LRe2vCGEN*75BR;?B0y';s"Ww*rW'.x0 RVi"W M@uQ3 f"*=U2Ђ0K?LtrCF7~sru!OOڝ?:sdN&>&{Dqd7%@Vr WkƆ 3SAz&W ^ w"Wݤ=D4 ~#쒜ZߙNdnǚy! =^U 񎇤xd$Wg>X~۴D9?4'Yfb_]t@d@Qd}qܵڳ`gܠZv2^ O-%T$C&uJ~JrU`k?)=DUbnb;AUQh?`UBԖqd| p2=xrFΉYuLk >$W̖q$AMł]*tQB n}]J7jw0W'z>I/?F DX4 UԈȄeu"*e `)4U$s]Og^ ]a+Cߧ; qI"pˣ=Q*wO?ʝsrsjGů6iN6tz4SXu.4~`fOD.M""Fԓ\% ,= ڨW~kŘ*j?&jx)E8-2D(Ev*cn 3>DJrˊDZBMbX͍v U=ç5Yu6?k2( ӥUԬ(Q=rUDDđtauRNN N$e\} .IlU:ƚJv1B"W b3?ERD*\ -$+bKXER.(!.K<dvF[M1Y뮦3Tc2>hl@M(.z㿺C AxM[z7rRIozVuh[Bv"]j K?թ7)g! p\g @-dt*=UUF ;+Zq'YY!]%-}(PAըMwj$W'_Or~ . WQ"|nӂE6Jߦ.XS~014.yXvp:0DRDF&rKڲײ}Zչ*RK8y2B#6lap4&,OvH:@v2# Aҡp\:;^6,3 $AyuMvMѲo] #Fӯ]8`4լtY/=,u`w+';4Tk+ڱ}aVz!zc'z`\fZ_Ft!%=@ ZKwru*Xp#h$Wk+$+\+gI1UňYR#:BO8 n#n3Ƣ ͥNYUbq, pϖl$&,&gq>QF4]O!a!'7mU^u p`SA<֜\:"]/Ud%|{|)T5Ni D@M>] ?D^=_`"WTގ=2^8C] L+"Jʑ1r[l.ːo ֕!Ic-o䪦p2Es $Kxc%'XII$dZDZ~'ڤH}@Hg0TǗ%t \Dp鍚\%Z]*x|eYvglP2#>r5`sij~$iuL|}̬)+?△~D@qjw^}:ܘ:jwbH䪉U@&|K UUO]0ji:&h=f$ේحE[g^b0AJa:;g#EUU.5qG GNO 8nv.LWRRm)gYjd %/`?c8^8a.y 7#9KJW&׵ilZW&anBvn.IJX.sr5O`a9KAJvx_񋐫~Û.RM? z<:Պcފ 3An F!K"8O2DӎSQȳi˥Rj+&+w7j禮#*m=GährZI?^xS =K4)yz5{/2'W6RE-FB' ]0]$uS~G֜ C;V4CFνL/*NNGdLG;ʬNH5Y&zFMZ,ECib5p'=)PWC@q5ey+bhd"T@ωo X#Z`"Wi'O7cզY!1}?kǮK:Io $W-o,φ蘢NC{JoץƚZH@,ݷf4†-}w eNr"n}z+=F23i%ׅdiErԛRDÿG_\yD ,!. WG1A&Bgי_OR/54(#$I&^KV=L_Fr5rIhDKM>]G1hU!$/ePІZXlhGꜻ:it OB|6::b69+q\$ :DMM.v"8ylZS33K/fn2Y-Vz3V'U_0/Bz)Jvن$Ƣ:wN 0p 0F}u.Bm{ղV\h hF Fr5v+1<6_r73rNK%SҨ̢Q d$WKRP z"W[R:$@S_"O{]Rd甛U+4绂p/\]ؕ+31+M`$W +B=Ibd~6 q4 He%b>p5̇LJQy{*-kfw`/{ϸ 87,2gjLg\Y\5T-R)JmFZUʉH(:tEyAJ~,u:R~!^vA-2yG=xk?u EVˮevTZ x{UB fJUK)C:s{%W:"BAdGD}@Dd1wC)ZCU~$X1uߒW :+d wJuN'o|0jG ORΨ$Q2>F৹ -) _tNt;Y00dN,wwPQ.îHBH 2YZL΅5 Uj馱HBKm1 fg rPv SttU,/5oSw%̸с"Y)@ὐ͵ޢ/c蚜j{մ0eH't,/ϫCQ M}jɚ9fZNc޼Eߌ+_GQ1[*s!=4)bqVE?$ztJ?lA_̱ ծ^Jʃ5L/L[W*hwr ۄy5kc$?i.{`QH}ԛm P[刱B,e][@ALPΥbu !Bp,rU C=JT1m:? 7hJ.E҆ ׏ î7#Z(FH0"W'rVH:cH61.ԄY՝jsj@,kp8_,~ I/[8h6OJq*mѬKٯrdNnX ȣܶ?d)<]}ˇDړ6>MA_ɋZDHo`tfjKZf`<ļ8T'A>Y<ȶ UcmH¬4-Jqљ/:mHUǗ\U:ժ3KRcY4O֌_sY3ɚl~G9>vIH#:n9"Z!WlCnIf js/*\?хC*DeUWZ%gY:t2 Պl;9+rԆP뼣:uGCPi 9|m5xx H3(lx'UE|_ -HK<1MEIt G'ӂ@IY_fjɺiw(rոIJyt`W䪋,_`@y4Vu.$W ]o+&jژl T3*JX׶/7Z {f}'D2 K[:Q[-UVhE/EO+02?{ea[8"u/N#]hTgOUt"+W 1%k 8<.޳$e ufDOuX!H3XsQ9J}omX1p !BzP{H'ᑬUb\z3L3b)B2Yӕ'<3ʇƣ!e9~@ޙUjF/m|E*L*Aa;=BfIJ}D! YJZAouBWr2Uǒ/R^:j%t GtR@Hxb>ڈ@. W<(df_ODdo7a.We%n; N_!Hʷez,ZSaˠW Щ6q__{s R:-류 8 ta GCο(u8lSW\1}̥x&ΎMjw!b9+Mh8$[ 5&WUD)l]Gͪ?+r1FG@ )jUYPq :;T';SSrVEԞpեئ┖,odF Tɖv*6h H_.$p\$,VO`yYi(z3Jì )*=,Nru]k}w뗺Sd;)ZR4Rs%,z6fu fdѬ'lCC }Q㮐axߘ\_dN͘cVq3[3.GJ5ݮOWn5Xݚ7V\;6ZV@!bFpDM5T` \Y.G  ~'r*W.1";q2 4I SȕdfsCm2O"iV_0QFq_(\>אk'*{ڄOqxAUl9-i,Sk>SY;׳>dgA-v1 |o"eZ&\ALHQ˪I-9T8ܳ.C~WƮ6z~PAKxQ]C-ӒݎBfHR_VԨ#'ip ( Hހ|r$YeGBT Ui$+4kz}KsS+6k 8Aqh||WΤp| gZ5aPLTDVk_ֻsyfݘH]t^Єp)V֕J}3ADvM4 cMEr@~ӫ$eݙ703c'f=XuNtXI^ËQ0 U+ajc~̡,{ o\֐}स=Vq[VVM9'u0tUGG69dUTw^`!>h+Pu*yޟBԇoKH$/ۍݿ {eXe[`~]B+KN@k^FaH'tU-@NƁ˙;RTK1daYc^`fnPGDub?(v5 d]:7v-E>E~'缇'4bTr՘WH:ciO/葱E_$`w%r[dE:#g96wd 4&7`"OL -KM鲁Nlµz%ժ32yޕQ8_}Iu6}.5{~EJmzŵ&opT~ i-)@LDxMGp4ebⵄ-h"Wʲkv )e $fMa :-ٓ;Tod?LЛ uhF DNCٝ\aGD֕ʚІdjiU ޥ9iK( ?o#Weڮ6nki+W|W´4`RbfGuL:6}.rӧ#:!W3e.+>Dπ`HZV6MsaZ^``*(\xƚ!u.Mu?HΏ5mfc ҝ*صJ\u Mi T-s@*:%)ruvKM>o{VE d)*$i1uiS#T>dHaY,Ma~UxS 2]$Z#-' zK#eدjPs2ko$icPHGO WDGֹnw[3C}C{.8TWuL.-N[~JR vBMɉL׏d'ͽŻ{i&WfwG=|+ /?W"m|#!WOmK ŭMmOb^?_p3ޥjz㲙B@Y$t0+x 7A'cܨ'\H>9BtF  "R,cf\ vE@ժJ@ BTg(^0+7BWTQ@DܗwrMW e:vM詥C.<2bȑtu#Qg!7^)I ]L I+Os-OPSũBVac0\er׬R?0@xMj9Ju`wYmyTDe]eb}gqP.܁a,iT*e5mUV %{bɶWb&a) <8jčfHӀD)i1L5q;} VPCrsuޟxc Mb2Wj&/(+.'E撲W{?=&\n (ˢUro8N:Bɾ0ƂXsZ$:$'}>q*%t*ݷdח"WmGqS$,Iؙ_r} %_՘{m[e*EE5)w;ΥoJR*n w%!|R`qK&J:K_)0)&m Eʹؑ~2DR:W $uQV171#W9N '%>=d$WyI˨<QE6nB V4NZb@PgjM2?/ٳD4pܕK+bmq:^>Wm~ڙ'1 {1'A"TxIבt0*o7zbrCU'Qp PΦwxNol:8~ 0hN~\Ե\uR 8k9>w^EVӹ`0)~HIWYV*gʢ;5cCmį6Pm8HPC,E5U{dIa3Ig$7tti*NK?LV%FI@)jC(x@ _]ڪ*9KNiLYch{;h :a DqCpΪ^.:\2^wc4~")X>W;NqZN,yx`?]Kj_[7]BHM0>ce,R ~eX-AhaajnX]Uu\DԩzN)~Uu$を_XJM0YQ[+ q8ip}^H&4Wt6erԛa L-SdWy+D_rhԌ[\rln2٘.#1=3NARu wtUo:ڤvaW}zi*!沒C:kh 1j32>*n[9S'.4PY̓@8? ,#R"Np(6Kdbq$p3H%/!ЧF֩I!Wn+:G $|#qfjA/$(VDz*tbeG?q rR9`zVwh Z"E-RhKiR(B݉'$!$!$D qwww}]{w N?'u0y摽^^^ҝI`4eZT o䅑c Db8v3,Aۆ$PM@A~l;*.a|o(rAS{=G}3EG_$Gpٌ3!o.MӁm7A,Bީx7=FTthxL*A~=qOwP6ӄ~N6_^r+ϕLNm4wPF$kD~zkCnr\lYI\R .kkcDF&mMA[Q@^hUlxL䪩et SiYR6w­Tx$T5ӦkJr?Li[`ŀk:F w Z^{瓗ǚw6V|m&D\9vw\Uto!b"Q-?L~,| 4ֻ3YQIǶr ?c\5:+՞x[H\#e|2:6*G;[ ǭbhMZ5ߑ&s_O$gS>UdTwm't4ܦT>;['B[|-Vg),BVF t*? ¿,#~yضqavv_]SCiO۶([-߾Z~װ O6+ŌN2 idW)QcR闾p4nVЬin0+b[b~y|5_gU@U֏CsCLz'W6%,|_]WwF_~Bbɕ9&|J{<&r=]*ש-7熈0QC",%dmꓪ:F{Dll__dJSl=W}]Ԙ+{䐗W)YWގS+ ͒uYr {&mCOa'սȱ.~r!q3ågI|N;Sꋪ;)>i=l.mgĨ"(XԚdrÖcY_Jr\x(J+NA含Xk:.Kz! B0Tz4rW+ 6meۂxxةQ!>W8_\ri_%4ڷ 0J9昃9[X[g:c1k4eJ \Pne Rlĥob8L|_5;Df6k o"a56 jaTrh*.T-2Qaf6dn- 8ApU_g{0"#kS0sv9[Ne$!roCI>WtN+k_63z@Eix5j/SR}5=3PexϦ ]*-U2*'7fie{x)y1)]k[a]u{.S!j {DRDe꽑"W{^B]r#j5b#!Cm6ŒUZSI1༦,?MhL*sS7p& dčyu*-'rucH+Z̘O/hѺ>C&.yýt׹bzRVv/+hmq_Qap|Jv{}TzKu7U6 _GT@< 0/L`T5{a}Vu,i 29Ft ;fbXr>`0G3QCh&-{7WO!\/v0NA]Ubjd-7|N[m$7gS8L9bEZe-̠ޣ'+ƳVQvV; +jm_$Dz9r"WeM}uS[rU뻉L͞U#w8[Mf}ߌ\]3|]W.;Qz\=#pkK(j$l; Lƶ!ej6IV谦y@ASg&JFX}_pb=&>a^``!@\-7Sj}RSW ]zæc ХN=myG)昪YDd<6+-V#ԩ9:|Muy')(iPsÝQ1*1Ħ*DOhIvÛ9Erٍ(cL,f *>>L}YC{]6%[M q86I9*fV6[jN*Mg*8'62/!8Mjg0iVdSvR˘E-TrʞnNh^z)˹öRu1 j}-•ckJlWV3L[I ROGp'"Zc|SftVZ!d66L3Ş8sM-z!IKd'FGTzw>ߖ{2f5{%;|_{Xh(5~PIU ez-Rg/c,4 joT݃iIK F@ۅfPx'E`@&YǛ6j4girMjcHDgp~nÑs|~j)+%@fasG߫ciOd\-[\9#Y`?>e|<7N{?.L'ecʽUld736Vݺzy==wlj+ , DNL%(-/P?艏G}J*@&մdq|BS0iL%A]`cOMyd]aڦ޹nP#bc:wUb;0_ԙф_!jd^Wtln+"y)=Sl}3mƨ{af 95/WrU[FEz@NX7L ҠxPBn\²\x.sB+2E6LE=DŽ%. \<* 0s^;Ӓ\UIJJrUuQL^TF M "WLb7sFv+-*=TEnMIU{=!T_\z1'e_YrU 2wc;,/R3J2hΆ W}?Xb*j,3< ?z<=/mc&URJĜ0b0ڎm#žP`<AR44*=!!ǥ,Of̴#$7V|ZhU#$Y`k^[irS23K< 8(˩*yU{"{W| J0`#V>7r(+{",x:?VT儡Xh̰MO[fUu\ƫ: dTВ%QTLQTtʻ %BoSo[C=]$)0G,&!52K\ A-NMqskbu1)כBN/Hvek|oHAO>*ۅ(\ _\"NX.`K9PvlyC=K}Z%ՍRcW=+Ŷ%5h?m5[]c-8K\%_LBT(I*EU٢Li9l֢b7ee.vFC~nxrc,4vv5Xm0r:T%$/iW+c̩)zy\5b#R BG&[rf^ P,8K#@b,ignڧ Ӹo*=OQMEqU;њJLx\U-So k7LةO4@bٹ1  k W%z^$Z}U*wMh-_m)0G L=:^5jLӞQ&ԲՊYkK_iuEhZ,ů*qc2|jh3\$1P IT(O@`/2Qy&ɜa ֍ G _vv3w2,aQqqiaY^Q{MDCX4 \ؠKellcpjRtҁ'2ŒP*ͩvZ87C)r=/Uc7!WۑUQ;XMA4U6ߌ\}P#ݍw&sr4+䦩wj0Sd+w!W?QS 2/SWYUmqlqDձY{&;䪒L[de~i1xa|\3McSHjc d3 ̉;ͤ+VVUo8_`[)O=U~[{w.oF?;b-@Gv?6G{0?ýd^hêTM%jY۷)fG_r+&ԇ[S W.=(S.J) #P_;FLNiQU;z| bHDva@vv2g\B.#UIA?끋\p0՞jP pEݯG-d g0eYw&ImklU엫XYs#o s󉻊kQ*B4>Q/:$W1n$g_B]Tq~(-̪R\h} }}EfjpTǸBVX}GWBc"ʬHsXh #u}wc#jYzҔDb7IKD6@;LMeVt!?kDߒ3џ4h+uMQ"򔀄y/ي ;YQ:$UUa)ObN(NgU ~ڤR /ڄ"(Fv&E(6)o5~&ڞ%U0=@ǰ9+A+wMeRuڽүO/7ũ55r$BJL:P'>h4Q5בƎCL}%yH,{̎MJ/[%Wj+!HA[ XC9US5R{5!l ?2 T E]~QboG* Imݒ,p6 #jʓۣ/wW[}+>i!j"M-Ɏ<9aˏ ȁϋ YwcX sF˾E$Fc#lKBQh-D=Yp.CY-}pcX1(=6DG;'Fmb+({6[Oժ-~gטne|;%,} cm{wL=я}3rOx/~'όnNuj24Z93r3cnGQXFGmog |=0|>˒ϣ*m[^)]MJ2%mm9s殱;Uhȭ (GO-q"*#CeɉsU]GWE&򴍽k=*k3U'2U 7&m\,о z@v8Ck ju~ Hؐu`!zcmMoOYG*Mv D=h(vhkZ P-v}|PG٦+ySg$xϴ\lc~%$3 _V\M,΄ؼijuQRAHo:Crxa$$ܐ s;[*0-..֐ ӞR8xn9^U7)m QoXX6Ƣ9DO(>_G+W˳_ 6cXpruTqfl ԛC6զ+3™,K^i3St~-k@-h|?e/ĝyg֫(':0qL6IKL9?U?np#IwDMh _S<'XG*8l Ъ/ddْV*f+XtW_[UmM-gGDT>GnfYUo CmۃU=5(&bmeI~~`QPyUE/jCȌ׊@|>l_ ӓMzI\]pXء|럛X;8\,Ƈ g-5%9z&D-k7pTkPf!W|`?۪*?ş4Xe e'|[\qlMaSu*_$p̤ؒ0H;lO3'?ϕlIkds/9 b|A|PϻԾ9/JJ?ύP͢PhW8S+_.ru4ƊьC9;FjKјaqi\תq\T%"2-msv%`"3}R%(jFڤ`]2o0֛+BHbGv2L'lӋФɏ 62tv5ʉ&#5S]uPA/2*d\lj#oq{^G`lf ]a >ܭfҷ (nliŪ6¶;:R`)uңѫLեo |rCI!l" WoZ=yU{ M{5ArΖy֠< RPtBDԏ"3EQiLd 6VۿqfGǤ洒&2몑{G-Z\u߳͝Q8 4NmV+\7ruC'n- Z[QWٰ}=]m`blO/j_ ;%b?B8 a=3Us~Zƣb}v~]TF| 6ide75nNTš5 ւ\ldۨ ⨽GmSyoے\Չ'b4:<gAnriY ngϴjlJHb8)O*ssﴬ]3?WBȆ#pɆ!뺠2w!WP2H 1"W\@ |5<5Phμ+lK6ხg'h9/:w^>}h/m|&-U`aKM}!B-~õ/ ؄a1ިԍXDtv*ʈ8U"6n_>0jY}&z:OԖ!_!Suږ'h(\?ލ?=웒#ߙ;f^u\=㳽{f9 D-UA`o< =*r]*-ËtG߃,wC 6eka- 7#Wg5IUJEz(I* ގ>s@%3ԍmmR^+Uhɛq3`_Mʬ(!<%| 63r?tJs/A4Fny&J@$6 t|*/tU[?c*;~CZ,oµWZW廰^cl~+S*y&A1zlGց6k`åqőVU|>J6㕺+ q<+U(p7Ph8n.cY&6g M-/bؠy(ܐ] 1^yMlVό€:5x_ֻ\q558JKMr0s촧'? 6`lֶ0MO ̌_rN5N bD~Z~Nq&F:j_VVR[lbKiWrO4 lXBy0+"Ul[ xoQ_kx{YD}T-MKc"'`9}fiy`ZWo@SVdz(8.0@ |^6ۇpQj- Έ@lD{\'|W9XݲU@IT[tǃ\YTZqH^E9TA~ZW44SzKU|֧˒OJr\IP8exٸ!L)Zf#)X9  =S5IKU݃L@0?%{jMosnfq(iG[D$Nj2wr5U*7!Ӊ{4IKZh܈am|Xt`"WADӶdzcM|z)7]lZx -(nCI6[x|cHBgU\e5vfgS|-/ڱ{8xHK7{]n܊~ÁE? V*\+ҙ(C@,[³.pI6Z40fShuO)6xަuT,N ƞ(IFYWQ"WWQ,b:r5pU_)D%cY藪+$wPkY5L }]':} 3ަ@e,vZ,!Wu4'e 8m%Oz {xNj|$ R]ͣM6zO _Xr5qA) TSUS]u#rC=\tk`t;ϞS|ulQ#^@M)Xy=D&&VVUY}2%RuSLS gDeCŔ\.ka)GBz_f _SF k$=sx=ccy!Uv]ޣ] \-vixقVA @uYEF=cOXZbMijfQ3wTՅjfTm\o|bJLT]_`2Prʓ6b-k0P6a#?inwBఠml?8 4x:/-؃;~`<.sL b/+e/@yfTerLMwq%49=l FP^՗Ku'NI=۰.*w:K6^Xa%VRu3VoM@\lNjTҹۥH7SjjPQVb䦑kE)?ۦE97|^ i]Ƥ>x[ Rl1Vʜ8<26Wr5X3i\emӞE1Cu;jJ=SjtAm5&@]k;5^\MZn[@&.~(dwCgk雞:0YNF};Z?4eΪP O!94(=\-Q?[ҝ_Xmb5^Y]k,\_S9.};v#Yf(;3Ylmwt~WNi N:dItľG"ݖ|hٖƬVae2=" Z ^BDl;T. 670IWϨMX$.x5cpal?n!c05+oNUBG;jz$mu S}›klY׀mLO|0D~"Gm2B]kHΞj=ZOř\V옲s 2WV&B\Y\Qy?1y;Sw8a _mkEn#Àm[3,O>" Unф_)9l*&fDAhڊbD)9XSV>E3STtgq?%ܸl6B)W~i=hK"!L 똾e]Õ֖ Uʒ̨ϳQ#;P>S`/0Wn}]5l =AUV6gyC VnxxCs,ɿ+OPblKm[~^BXr̝\Y`ckS@k2uÖ>gvp9/kiQD1`SgwfI;6&'yſ*~M䨻MyGٝ\ mWZЇۇ*?R}sEFrUJx0$ 醵(nI\wEp$١ U>+vJ^݁q$G 65.o<\>C->fjJr0,YE{4xJwrc[D|>Uok:g ,$:r].HY[A[Uu x[xߢ;s3SWy&20\ﳹP k;GF9/"WMŦc\:l$싈7j{A?lC?h .,{\9q}"8g4XU ;mCθŏXG^WI-T7>% F ő{lʖAPP"Wkb";797rBhڐWՔ1c:\EjGL'c2wt~1X+RM˰(QQ6@´#TfCK\JW?ұ J=  ׳ߝrh(;#B [yP0KY)izƄz\eW˖DB0Uz/sh[mcﴧm 7t'u=lǩ}Vds@ oX\5Шڢ6v3Xą"7 @:x6J|!̰ge5,"d_kR "eO@IK3࿝\+v^CZď{bTݢ婭(4dnf0e#-WgCDs\7>lu:5lxV1uc/0jF zPؠl< A$f?7&,[H+4-{&cE)Fay^c=ab3B۩"Yۃvƶ8UU ve_ocsآy3k!WO*WdRvT]m6spu艿vUԠ!0-a5YNnH=_h1$Wc濪6 yŦUL{W1hf?o+\쒍B\cR6$Wql>0 RN (x+߂}IYץǁ!WqңxAD 5fEATdfſ,5%~*&(Fr)e _E8^@.?}`a1gx^ըsNƴ"rEUVtk V'j̽ 8GC J|$PQlM+\C}|n间v0F9^`}J{V֤ms9z\.|/e]W6MjI*%bچ2u*Qٞwjm? hamEARՔty|2%~e~*ӎWK-vOc/.fl]*7;Q_41W|'f j}JthVдZ(2{*Ϯvi!: I]ߍŲY jyau1KHO贾 h~fZ/\. (0Lt?[hW`^jC5HnGiNn23[6s^TG܈~0GoUΖ\Ua#3?U|g]0e4OƔjk,Gcpvj+G "WWFu/WEDE=1u({Oaj)k:m'W$(R Wes_E?Pr5@mnТ2nb~Lsd:/K5]=-UM۔n#NI$.x~Òy~uu'W CN鎑sGRO`ˣthL-ľ7Y0!x:$c+dgVFVȻ\e)K ~W ,%.{$r˻JmbFݕ@Eߵ>bY]bHe)wGJσ˦ʓ [Z۹ `#z5ΐQ9#0H/OA}\tJ^>_Ϳ/Nb6lgDOFrSbjQme]uU@U'?$io,k䬀gz̊ fʪ7BԘ{$'>gWD~رjT0롤'L&SvZp/g< iTaJQ/+2bG3]~=ap/fb6fʭ@29k;:O&.y3iٻHw RBK$c㙑M&ZBelꐫ_/!/.X]ʒ7rщ\}˅( W'bPpmik+r۬4`Ph-t^$W\Ug'^5]Q&'s[,~ҷhP4l=LxӮOa\FYϔW/IN;x=9ԡ{}EiQ @B e4 ԙnJ:? g38Ca]*Rp=S C^sLmr?Kuh)Oǒ3GŁ|Yoa;/: Uw.WCUqrbL7(eF8 y,u]Ad<,/ihuCL~. tԧROUWcV*um4S{֨e"[֍\fW&=VUHVTϼ1yRC#[G1Fcz|mFxVk!SP0Wg?:}Մr!W4_W}Ҹ~c}3F:ą3ݠz- I{a(W}`b q3~[ǃ@CoQq@rH)eY&=4izbC^bU'wr5b]l45;}wg'o6 ´vOn-H8ю,m?%-oJ:U[ԬKc\|&/ו'hO(JЍ\mv )_&zg&.y3zңHȼ"gvU9qC=z˙fŦSZWSWQʠ?P*p=Ve1yU4i Aõ֏o6qklGT}F]<\:JR}f>ˉbGZs"x(MV \,M6=x\bMp=s%0`ODh̝cEVJb 6*/gfZ-9VwqYQޢ](؍\u,y6f>ِѹ!rӉD%-mϻkJrlwWæx+,Hf=<^ bݓ*9DEO:h$M)fUVTH#2G뻋\q {֦az[G|vFIFL5jƞ|5z)𗒘7&ڴ&bxLꂶ?֪Y'adՑwN{^hQjXrkWe_.r5|ڔUXᡕ%NΒtu?.ٟ=<| aZ\|>%T+~#|%5t{Y[pClo0p؀1SFć0J^]=~W>WFmVܷ=Qyy `"L28Ku"l%oqtZq`^ÑӤ,&.]?ehUW+Pp1F-;.u[Н]`;j" y Aò(kjx7a zYSr YN!h$.w*#/ k#Ng38CaUn$mWbؠө|bX螳Pp4׏QɔN#WKbaEH**,I[@[$=tҊɏwkG]uW]k濂77݊# [,el0S\`kZ3ɏۿ#rFM*0&58>n#S? Wq1La9u })UjFt-U5g0/Ti7aK|6];@xNy2H\u][ =A9%䪜s?eӆI:Ja.W?;SHasAŞ+ŝX#>Hu2(ג||;i;GW !WQl*jo"@~#}Pr5^_h5mYb)MX J=o^%pwB;mQ%zK]WrD%]ǒQٳj6A D/O uV˖rm_e \U(Lee(sk߂\5U&voj= kUx6j Xi!{UݚtB@Nu)sU|^4SQ͖0M"WO=ozRt"~Rbm)\_TH6@Zm@Ѹ am TtHr$hm u5e |:#\1wڒ(G\l:۹8y\B^k 0 'Tboyua;ٶ,\EEH5%|L:6z#<+ruuCVEiYڲF(ݻɴyGW 3XɤL}2tK*RpONYVmCFXE>.~ޟy%W:J]=5A ܂u!{~A?\*\:sx&2m\e'*ej)!EzXDPU{ v@VOr5"Qf#bJC_X seXƪFхF:-*quORuJ nW >hB9]6NYBGтAfq D:a llrը& ..SYUBkp\[ȳN+rH*ڊ.}P"}ډ>U9,η[uޥB U^p5glyӛcsMyj0L Q@qwrUk):TÛ8OFchM_UzЩ)-ZS8uG[3{] 쐫h`+N'd*)Ӻogu-pvX\V&Wh'7 W}UQXSRAj܌prÌm[c*2"hU@&7rHvqR(jP78ʒZS){0u=z)eM5 Ǎ\-dJ<KcEWrCs^,O 4N aG"DSBP ^&J>ťol{n L+mJ|-KzgAP&IKd`ȶ tQ͍ڪawZru*HD Mc9dWf}:Q$7Ӟj"W+/?s-@J64|l䲤_OZ^o~U*s(@ QꂿZr]w/'0^GMiNylyY7⪯̌05d-bN*{,]R?e]vnnjLFFZ%ţ=4[h{/Ze''WY#PYz`.{ ̉@aL3a@Ԯ/.LG+2#lvǫ+,xf-x*8؊6߆{[A:ae'ZNd+GMY./],=R(Ҧ69ljܛsRe.dZf 4*3ύ. P@;ap-EC\?~ \z WSҷc_T/?6&\U3MJ.2(ԑe}6ܝUWRHz~ j=R739 k_rӞ p`v_\m,9kjeV} cg>>auޗ Mz4%ޏD].P=UgTfFfDԔ1ȊtPͷJ@ XȽ2g6(_ cX@vM#>K€^-Rӷ x\U׳t2ee*jNLcۊ!Nysg*5~o8 ޭyzk!Wr=I)cWGIl\e!?) s7U]SNuXɏexkg &P/G%,|-i;lcU^`/%pY'7ux V#x&JvnuQ}pmn@r\{>?𥉉-gZr,Uf5]XȢԹؑ";wgBkT( 4|S[*'Y5&\U}. @D&h WU47~sp~ ?>Q2TdE5{$TYI7@>7 p^?re-8^vOH]%ЇTf#Ҩ1*ŬY|>ɫP{@qgA [Y{&t* 7)l*6i!ѽ~j5+MW=|rZ^WE/s?M}Z-+=O4EQj+ѽvG*r3Ad\rp;^/!WB5iE d+%W+*0/{1ԭ鵽Z+}C7OC$if/L~KL\ Ugc[]bbb8azge1Ϊ-b/:tƨfKQXH 8eI=tj'\Hl%?+G[]^w#? sEMb~P5}TGܬ%.z$ (TXb-gხgqy\(k+K򏯵v֮q=EN-N^^IS(223vQ5A.TeV܃&,x S&,z¯p1phfTdֳ=M+XCC~vP"t8TnIJ=lS.gX %*]fHJcK.Njƫ0F$c!9Z)fʓL:woʑFfF1l f=kS*/31Kb@Z'TOP\<2/5k6̎90'4v@Ӷ㵒J˪w/Cm:ͦB~Xafe``R}zv>\oV93|:<Fr`@_En ͉u!0a(,}3Q)f6n+*;+Se%L8SUgC"( c?fs J^CCHrS ֜!W1;Q.>U_ZSœoO;W]bLof&Ҕ4eqktBf'W+**%9恙kn3]Q~/}RbckDF|(@ {@jjh_j⺞hfax/0y/ap m+_Ċ^@_eT&''j/vty:(2l Y:׸LMi‘ 0„antpWd|<zrϰ,660-2RSբKGuQNi[# Ӱ"u5n-h5>f8vs\noimY^uqV+z+2ƲcgCs$/7ϕ<H.\<-[U}>ZPPd`hm?&֨Vx0 $.D6:䪩ک-wn X+aXgkvl d ֑u6p H$5X\S{?n*j31ucO`i(eGT&WjQ&lN6[5%9U̡x[>غ}B>݉_,JyySyVKa@o3dkoգ˹&n_7iPԲh K;ƭ Qd2aS uЗ6A0Lil[r5I@_V걛65)K*jˤu'RiΎHX*o5H^̜((TmyFRD}ckSU|Z7t$+s*sbX6 |CyZsʁ*!%џf.# \!-)l}Ҳw=s :GNBȭsՋ\q{w2kWC٬&1Iq%Wk,D6 L$/"-'-7D| `zCD5bCz_6ԖU>Ej^6n6zC<(=h(ML5eyy_.FO~ Ii1PÊv\z[W/R] {檁\5O\j_=_uZU`P 3 [F$2cMBKtE[Vl9Q%*ld؝R̂TsU ?Xˠ؝F[֨Y}C*z8Fp䨻MYBjl*hpvlaVjLKNz#cg֒(ՍNmL+ۖT_˲{'!EZ_hV#dk;}cm)2d)ᶣ)raNׂUdGj=;~2*hQ?t%CBz^ˬ~X`1=s6(8BKBn7C`εq%1޺Muoc@LQOMyai)k*˛{BαZHg? 3;dPo98[NN\Cgglތd0dRp'E]ju03bm~{@z0ꐫ8>a f*‡,ۘVu [g|gjr~ wNN/3>}7|u̖ܾ8d}he]Af?䴎Bfff坒\*[1Ŷ`-EsҊj˛s>mHYRSBGMinania }] W60O ^lxNo+)$鸟E뺁(e7\݇;WW0pB>hF7T[e v-je_y^nǀ{d|@F~3)"#f;O?jքz`i#1FfI3q~h C=/&= jJsl3w_* `=US ~bb={o߁W7X⢰]-xٟM1AVn[]5Sm!ڊ=S"ZrEN90#rZ#yD!*/ Զ*7sl>G>Q8NgZWSנGmezM$.yC.Jg-oJ#\inA2Ej[<܂6ՊhjKRs$h55j 6Ł'3 jˢ҅޷ҝ"$sL5Uo?EK%@,us$eMG6z骔ƙ*cpvL]z~:QGEm.qsBZkY[^hǭ39eMZ?SqMXV u˾Wi~`!]h`j+K'*zckf'37{+NM[4j*iɏGO|!<5V0p ۚ⨽l+ԝQ==s,(~K(оW!WC<3~kMy b![לh,}h-< 0q:~XIAJMq&8eŨqQFC+ޣ]Jb#WYN2\SBZF^NZGQN9}ېSN)fAuപ$@8{PP,(ۡ*o\8Z4pvՌp!J8TSuvF|U,@s*ih6):EC5E#SbE϶!W;Efl*=} 3Mt~f!Wl$[5!JTLhNbg<l^ӑ4Pk>z`LyspSe[3,pt=A}X7wz\!?KԜQqچb cXq*?2+ QWU/~8 erq#㻂G= X p7a>t,o*I:珸 GU^)-t/؋jzTE3#CyjpۆԖ 9ߍ R]P'* {x?ssp'Qڼ|Ը;FXQ tC _y' qs^l$WӞv4"-p|>FTRu.@>_mk_xN䨻fLE8jJR?+qkaK x뺘sjq:%dzM˓\=k=c>e9?ϟZ˛G85g JL}~v<YqZ\\-**(6jUUU]]]```+{^8?)J/=“/O;7)ek~eο]h!oƞ{ĕwa挿@?Ey:-]Ur/0iYs]*K&^<{aE GEF"#V0g [ $ZSEc DTi!.5zoab>4riG@Ik!L S[#q0ޅ:LXmɥN[!!С'p^:\f2=="7.f;X]pM0t`%6',*S+;}v@ ÉPٮZ$[mE%~Գ.)epQ$QD[ށ9냅J隗v}+L?F"`B/1,@%޷o*2xGǠU4l<X䓸\}`-|i6`k×4$HX<VK[h8F}x"1\8sj"(pzԴpwFI7:DQ4Bmxx31>fE27`t+/s˪3@NL#$:) t9#S@A/~L^c.V|61~!b 0 G.,g/ $Gnj0 `!wzvv~ <о#*Hj8\Epj⋷N b=_P``M5TPa&qgI k_*xm=SK zD+7 J(f\r83g X޸p6Lꦪt105Q?i>t[:ix\Jv0 Lwႇ LnKCQpn[ķt Bb"aL BbRŏk}#?gQs;p|`W˼MkBS &EK$TX#!-'/|kŖ!৘ƒ `Q`z3+bb"k/K<'$p'k^U0ɓ*8ŏ6/o 1߹p]=NYUª&}r0%?E>RS)_WZvOc]aX~Zu?$WsrrD"2jrU.z5lrq\@4C"YejtS BYsٝUN K)0[B-]".JQ蕎J%3u;UcEgu<9woLq π8i kYu,]  .~Y&\$;CK|fh  :S΢Bv\Y!˘Mfm2nYy3iA03i&t>B+wx Ma$u#&| ;7Ü' dra7\dsFBTW{wT{hCZ%[8Ջl8'ǁbM*^1dgUa }JX4aEׂ7nWy1wo`~/}l$"A`_0?;4b>|ZOɍp_Wl}OR}6k̓AV4-r6@5󾪝@`d.sr,^XeΙ)]j7,DrbHn;7 .7d,2)p{}p"0iV#Ja fD&0g#q&\mN9j29;{f L;0 &썱[:`X?[]'܀d0`Ju)9n QՎOB;}oCKLUg P j1a?rU&u\5YNޅ,1߀{*:R Ձr.n쯻%䥷yb+N;­D xć#g 桏Mr:V2zLe CۆW7&OXkU6E{rhY) ^ouSwP[Q\ѮVpÊܢEOz7ܐi0[aI>H{k1[@M6m,t{z"8@׎xm^qpI"/FK׼Ԕ(+8#•/γO&'*w~"asNMaIr - ~fu`{N`0) =hfk?NBYܳZKbח*I "ze !SEK޲fLΞ R4%Q.1b68es9bYoiYKDFL#3ğO@+)G*fTL& BTMh4p d5Wmm=V%MBB|zbE z-16̚ ĄxBm4Q'|icbI#0Y '}]]sG"49wrȢsb:m\h%vⶁ#D Ul!03m8ke7lJګSq F!f^gyQf' fjds+kKV<4@0XTb,?jV5"& 1l/1d>l1bk-4&d >^V.yz{ruקLBЏA{ ժ=_cCM& ӚzA2) aZGk5%pF#圚`bi` ZN9?`G0;m3~FbK՞d^ӉmN$W9y` f9pysN۠gz. bm,bY@Mf S fpwX" F}թe#?B 3OrN8jyqA*Y11"b9QJA5IU0MU@lC `@o[ zԈŬ0C,J}#u")*0(r8= *bM/:ZhJx<ϛpssJ2O7zq`}qnM4 = QSW_ޒvj_b6ՈggO-}$p_ό\;Nժj(^ie ?b9=_B)w×w/s[L1  jV fho`"64 Ωપ BPݜv,9lh?˕_&=;l,\ Б9O`)J( Me]Cܑtuf5Ļ\iZ;&Ϊ.2%|\3'WoZ{Q\#/3ğnu"o+#oZS\uH:BR#j.iQt\uȥdr)04UYCcʠUC#f^x_ZYp y 2'WSa,}3ďD\JA.8#[Elr LjB?s3|\٨5$~ZSX1x56(Og:..x$IDH,KBh D BO4k)(] L].:/B;T5bG'waj>:ZReo$W3 veͼ"5/H Jg&q G3u\%^淪TQFz/| 4G{[Ҏ.Wі!RsƜ:mNs? N5l#kKȜ'Aйy wi!'yD%+b;nI<#9'Kl0z>T!vMVie2@uX[{lyI,.MrUΆG4x=\-\iK}\c@&DDr[k|3e |)kAԉ/`x9eSrp-pպs3K׽fX \UP pܐ^iE\P/y/@Y=݃xSnPκ  ҩuLpiaBBŚ"gK˓@SjG1 (\y Olڥ*bߛӏ?,Zb/tn7EK_*leg|B$ndUAߒѾԞgR{ I"=X`Q`=3S&^эJ: 5zJBys/N W_uXX<)dRp!0&nFqg"lUX/UWۦ4KC#isGQIlR1v-#q*jh]\j9)ғb;;JcjIwherUS/MEV4[LO=3s[7HP_a5t1βµSwMOO#, BQHX|qMFZrNAyK6VXUOѾY]F]s1u_=䉺X][$+EN9*^',.]P+Kl_7b-+NK-Vs_e-r:p~ona9n%[a63um:Y{7[A]ߩ&dť3?i" 뵥k_ɟ4LVzuBWE!;M~6܂P쒺¼t˵UX+̨Ϳ_qE]\^Icph]AWY C|!c, QP3->lzxaְM6+`}bV܂2uܱ5v3um  fsԵκ&^rDZ&jU(>Eŕ0DU5*?{TWE Z\`ě]fuU6I+'Nʺ'DnLy uEqe ٫^oJޯx"R3iIi5DCցg_ .5zW]o{ndh] 9a\p!nrsvy%5r`j9QӠOUdg]3RB~$YWaAbեz\&Ĥ[nr`ٽ+ZLy=?&61'ly8[jo]إ懯.3-^] z&}uk]spetmk])$?u,2WMgAe$AԲ-R2[WĮ`޺ZB]뻭 'թZ[OW\kwٺUPWh̯Gna}}bWP[Wj T|@+F%f3LhN:9`L?QYryk[>+3#ࢄs{Ț&PG|~Yp>TWc,NXq厏uSl^DlکM^ c3+g9gRV~Đq07[CK]7ѪsAWOܴh{VYgG/z̡IRKSr͂JO*:K|q7Ux`DpE}w:յɡ%ص*=7^Y[A5E0D6tteɌJ_ϱ3[N}(SuGUŦKo-uI~]#Wt,1W6I]v5c27P6])$X]ip.E}M!ԧ@u}>-u}gVwյsC]a~[(t7ш  MUP_LQ3uj=۩AU?Եt+s\YqkUNu\_;UFUi0J *<; e8Vj4p_v!88뜠 6֕Z]韻dM$[eN>CQ&>eS\:{v*\MʯoO\]d SuwFg#Vo]'>Kgcutca"|?(۫OKSઙp^JdRwW]=]u=ce]7nM/;U5&pCd}3uW7Ԟ|c7Pb[Nkj۫'vRUĶT]=漊Su1qySua]]TWtW]u+u=uMs_]YFQԵEd y^'Bu%N݉uQ9/d:]lpXuA[[Q#_0sb'mAEUvN*'oS']|6}dŜzWS>VE^-2 2}TS[44VxSefSo6!rC^f&!66o!u}{uxjɂUgs}`I9.,2[l(]Z$N|gr&ꗒ)*-8`ӥ\M}HujH{/XਨOn0tñv.3a )ʭ;BO1sjIL]l+4h*{w8¼V/ 4~{E'^bӥ_V>9@%)ǯ=es?[HQ߬2s9[6$U}յ &@ >cW-5_D];JV1۲LQW5kO|xu}:`(QLz8L#Afl=KkI]BW-ZuO]_p]u8ኺJ+j==]u}{<`!⵺:$XVS'G,uW]c2K,%OSׇ>[@Qgdfl9G}&֝ 2̨o/A͡}1=VWsqC'ӑC#Օ̧VmucR+X̤,#)uq?}͏*zsUR9R1˝Y״EqvX<2R]wl\e}Bg:dvy?%SyfYad*uwGm=3|mvK]UWeg"պث뗳Pbrv֕T{(7bq[KqbeVuMjԧQפ|VRԷW)dM2ڮO0?b x6eq8Ua9%Vz,"]V*TX[W7uA/9=I.+CF‡@T^썰W]:oP+`N[}ڠSjsSjn466}qq.ҧk7-#`]KWAAe)23h!(=zu >Ůۂ!F-=~1s7fDL"=\ ZoUK0FVį,5*&+Զ͑)ԇNI]_DvfQiվͯ<0)Mj./.O2'Wh .vIhpS'_Zb45NWֲ}H .)NtɅ]@P{VI3OpOORxێPfzuw9t\Vۍz^!+Dm^/*٦(Ё0.d-r+ {EͲlQ]RT>o b¼nH$|>߇-x>t הh FbREZj-7mI; ŕFMU-`rJQG ܨ8+ %1E fNRs0.j/iBV TL'o6P{55KKlWHM_ih־98B.*y6a44\ҧrv1k_i- ܨ#F/(8ug7oDR>Sc֢ :WY3hUʠB*pnh,ԴpVj ?WwAoOQ>2!fg brY`r'ҍUi5 3 F^)9Vⳙ?*LČPp0\7_̼ykU%QeIF <8 2 |(jsdI@xNVbr+{W:oU/r}`gTN*P7UD~fs"½i]K'k VFZ>kЫOjUjk2\ |eB\H*Jp^7"L^Gzp',औu,M3~WkQ4Ԅ椽* \Z^^ *[uF7ɚ5%=b.Zxu7r6wϩ)4zLb1 }\GFN+ L%WMkcc\@.\co~$H` qjzZq= ݂쬊5U6-WYnYAԪcc\_5HbPIE٧' T7Vo'WLv#7ʠp'z0j䪲U{l,L}`jߜORmijֆ\iUU+xErU4%+ijB&Wmn =bfJ,2PEm&͝Մh\qLQmJA&2ώu\+ub?Ъ5Si 8S'^ESRRČ\浐0E_Ĭ̝̔c"S}E_$333))W1S"sUk}3Yǘmqb +/-w9U{-Ԟdf dee%$$tw/(fRȈOHqnef_cf#Nkf%_! ׀'&&z5̼,WAU'{qrb1 fB>;%77ן/Nb1ԁ}waV̒԰œQ4???{Uk%)|Z=d{#nԾW]dee͇ɚSCe>Ug;\F#VjY^\EAAAAzNB*    S*8y5THAAAA$@jpiLٜ"u|^"W: &WAAAAD&Wrg䟇U| }Τ@g^9udtl{rTUAAAAҦL#ݞu(9?)˨λ;.\EAAAAz\BqgMλ5    H"0N42p\I[0pe9ˇ R% _{` F mHjw^ 67gŐ&mo֚wu4@BEsnlGFC\AgڗÞ]&П$u8-{,|3bƩwpz[4{ u])w&)Rλ5}DkPtCFO<;h Vҽ]$A[{hym;ذ|UAvwhmx m1eλ>[ɏ[9cC[?'miOHWt^ $2D=k4MZ_홍?'֎7t0?MΰkqOzQYiӍ VS)< & 3"(N; .GOmAoC>z[Iߣ-&W1UwX:]giafs'-GxoD?_OLש5֣E=gɩ 4ڐ6195>Dyh˾~aRӟxE LJr_@hx_SMa- ]ޙo{;qKxg~Xp{'§WO8~\*&We/zW'86mC'D2k[?v^j njM :n~IKF^՝ӏe7h 2h9((@;mo٦oҿ^v$<.!C賲6Ak·EŘ^ S\) 5 §ڀۃ֏8>u}W8>z[L=BcIBM-1bҼ!&W]JX1[zӁMʼI]NJ?FvqfMǰ& (XbrtonfIg\h{#Oc÷ kZddbxד䪖}\!.(Nq)O3 sl =msSG{s᣷΅ýmOH[&-etcK6qqKGVr5t01Y'Wwfn)&W2OKU&k/A֚lZinX#5"½/%Ǎa[G7=W<,qM.\\p;nz*U;ڃ4@Q~?g~!0 C\͎3mfs %SG{ o#\3;=brsڄBA|&W1Ͱw`G =矓n<X;toDAc-) }Yy*QdLaY˞ClW y.OUiw~z4؊R "6m%W27o&6Ǹ"|79i3kk;؀ۃ*|(|pMmbݍýmOޗTd KO'?c\51rZ(x ]l$U-eU4:ō^=w`_RN\=Ùt$ɔ?]j?|bb1jbToWAu \  7H OѩYeb}3OX/ }#KLʽuGh46N=X/z!7>l|k: C-_:G̍j+%_^MFφ\5J6s'0eV2 C\79i3nK;Ԁۃ׸!|(|q]]m}=ր 6`Onw.lhxcKR"GlّgqGH|zgژ,BؾX ٙKra''zo=b&W]385hł6Y%Ur;+hݙg>mLڙM.ro3{ B;ܕwND6̡"b㱄'wdn ҞvK5`r5}L*?i?'Wwe&]̙ {p;R@ɕ 4din,LH(.Dۨ'';TfOyF{|acsmCAa͊>.,ߦoڽ)VE(|pUQ(NqMxg5qSm}·)m6oaKeQXi# lMkaح˫9["+/O=,ӆ8nF1r-qi a[uBmdűU:+v~a؀MF7/ lF2j]x^]$ޫ D(1 -"-K=(]:Ene=+Wok91]Au \ @J[ic[& v4]ό36O[shwr.D7[2FoAa9'x˫G 2NA^nn-$#7QұJdh7CսtC3rm>'|]hzԐoBệoo;pOxg 8z[?5^{ *maKeQ/6iqb$˦Draw^VĪ2OEM7%Wo&,CcqAHõ8L\_Ww%Ms"uיQnWÈ͟haEfNz$,Lwc~):{Kmɵj?WxP]&W{6Oem]Ф~j`TT౻g[>fg%}odO&bH,,{lށnNSÍZAe_诎s(Gd0mn _S Gzpj;7p;q[xg5 +GoG>z[Wx"m78ܥ$^~yq42pgeu¦ۣ^#aq7'.]'FZ?*!qkp\u+Sw!ktC\^qSo#]UFmd UDVN\!^Vf0U[?ɘs)]dP]&WAAAAD&WoZRY;֔\ӼeYx~[KiWn^yϭ:k¯:+_Ww+O_ewDUtR XcQ6^5O z`ՊMmD_{\ B70] 4WulζH>keݽ5yv2    H"`GTVZ&fesc˵ F:e"V).c]d 3PgUJTz^lwOų/t\uFM-_+,6km5++΢WoP0xT| yẠ TQ$I`dswD_u49&VX*5`rAAAAAlrUWMY#2f_ӣ&W)\EAAAAlrOkO]/6pծ &WAAAA)\}LMƼĿ{tju?    ─M>9Gn5`rAAAAAlrm<?HC;֠L" $z˙%" ,\]|~wA^Μ+顝wkP]&WAA(t/x:cϿSVR,wW0  L$]^R{vޭAu \EA7DFT}3yњV-1aO[>;*&WAAL;'r_ݛ3,Y6_;L" Qd}N<,GcYӘfmL&WAALrgd]zxU=c {:C:L" NVZ263be^w~՘w 3e 2b㸏^z 6 ~sƎTm!-g6|3N/ދDk<?HAA$ *Kd畨`J'5P- {3(UAA:Fq/OCF7R,RUُڴ=h5y1:Jb')?GcΞ1߽A?&Κ5雡ȓB0?B41P`\5I? CN[9f8Q`qAAz+\E1$UAA6FyLzI6 Hfq$:C :7x9پ% uhqsעgyBS 'ܘP&1zN2;SNַJ*rF慬zO_!DAAճ<R`rAA>^ ^;7xso,fҏ8WQߒ!}\5v`p:=զCT77QCOnT(8';AZ?KAA$p\MV5h$   $F836Ȗc3]2SSSu":)v |%ί?16FHC:4^5`rAA}]wo#ҟ)×Ϳ/%{*2je;U=?s:vU}Ù/cOڐWT߼! ҧpBbE/) #UXuL~\T1  H/ǨW V_^ls~BUE֜!tLJĻ_ OI7AA$WZQ# ͯX\bsk*5\EA*X?UBE عC&]یˆӿ26 S^4a):cܪMr(I"HE7j^VR AA/ZrAL" қ!W1n56^8?[͈2a`+LY|kU:կ&,\y˺c{NӠձUQ3~>ΘvٵuQ ӿ 9Zw  ;1!9Ζ!i*/AAz+'-x˜џ'ڿ_rFdb|2~S#7_ 0ۙ|=I2ÒVm&1?f>~%$  HBԆݝ-C7HV5ɻAAM8z*   Vtw A@]b mw=  L" MC:4^uCB ԋUT9WtAA \EAqJǪ\fΓ!'ah~}pv,X` JF` ,XrϭtfAAAAAAAAAAAAAAAAAAAAAAAAAAqć endstream endobj 10 0 obj 461942 endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 11 0 obj << /Creator (cairo 1.13.1 (http://cairographics.org)) /Producer (cairo 1.13.1 (http://cairographics.org)) >> endobj 12 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 13 0000000000 65535 f 0000463044 00000 n 0000000184 00000 n 0000000015 00000 n 0000000163 00000 n 0000000504 00000 n 0000000284 00000 n 0000000761 00000 n 0000000740 00000 n 0000000861 00000 n 0000463018 00000 n 0000463109 00000 n 0000463237 00000 n trailer << /Size 13 /Root 12 0 R /Info 11 0 R >> startxref 463290 %%EOF phyml-3.3.20220408/doc/fig/phytimetrace.pdf000066400000000000000000002224401422404706600201240ustar00rootroot00000000000000%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20180621144741) /ModDate (D:20180621144741) /Title (R Graphics Output) /Producer (R 3.4.4) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 68187 /Filter /FlateDecode >> stream xMnMo%6~=LyJU6 ݯMہNl\Zu1v9]R-I/~o~V̟?cQ/l>Ϛ?l?k=wY; BtY>{ٳ C]/cQ짃ɧ6{20nTzm1r .2iF΢GmvN+﵍[iG^to`r v~oQ%6OXFs`|B!]bɎvEN=`7~0 Eʰ['mA G[]s*~` A)T\RqM,jO[H\d/h]`'U`5(cXj4 h<.\ ؊A7+!g]>|Ђ bﹰ'ׅ#OAL_mu?=Vb`W%৿~|~J~O3P1K3[ ৿nl.iFmdWq?үlF`g4,56[U,k\>0үl}^Y'>TOK1nmqU >d__oKڋìUs>OG S ~*}[rb " UmǬn3D@f}"Wĉ~F+έ] ~>Z̍pcOy?tb`U֯j1Z|__}Pmϭ] w>:ⷭ.(TXgYp?}m"ՆWߝ6>=;HK8_}CqPJ[qvo$`+ڏ6NЯ6~EuCi~56 &!řۅ˜R/٣~Ѿ.C `#@A6K*[ABpB$+% D ܭtQla,e fw/;P\yz*hP&!`[Yiָԟ֯Yzdگ_N(6/Ow?<ih;w8j)eĞ\IhX/N95;Emĥ$aTӐbn> (p> \[I#[Ϗ+Z-jjSlQ+=[`m9aC=[Ρ%X_ (`3o>"nT3(͒?2gGVz5PjX}{f.r?0_TEݦh곥b0d+ #'[h#iր,jkNW-A9m+ TBq1neПOiq|q;,z:&NaPw*SNv-l,֯~֯dS-2lIт\(0sNEMX 8"jNh``x~tتl QV2q o'f0y`4FV6-Xwhr؂@ σь^ &4~ۂw@?pwQ=1 a81EGԯ~K0@}r"*(.̶%a`WFeLUA`0 ͗F$ P\y<+o>p?_?lJLW}"g|zxcү*F i vn j`(|9~WMjr. *Y0 g08iP &lبf<|j]Eϒ|c,WZm`Ʈ`БNί]UW0t4%!+<55 A -rH ~Pk6د Ǯa/0'&ZT_67!n7ȃ1 vUÒv-hP\l1q0 W9+MCg:t LIԆqJ;p)'!! WqeQ4 B*Ƣxxm XMzq|X0hfGɊXTbbm?]VG7ѹA{N1 ~~Zzx_}GE毳U{}-G7j${tk:@\v/7>,9`o'T(X밸:n`y8P{ 2+#\X(8nNmۂ n^J˦Csaqۅ*gb\yW٪GiBW ,oÒu Y\|.^ѪhշBQLj WR]'O@]@ VhVCX7ͺ5&CjXT W׀q4`pabiâJZZ %7_Mقڻ9M(|-Y~7[âJgsm%e\HR\ȍ fĒpϋ/;~ɗ+ 4CҮϝ0 ,AJ ֫$8\D3>p|ԋ?vE1{xߋM:g XQ@q}ӽ Kxnx~EN͡&O> {*uCs*{\5χW/? XZ|@] ^|mA25)``LkNA){x5~HjU`-X{j|`>yUS'K6^ A-ƞ ͒ *yū;M:07cPJ=;_0u ŕ2 @Os\=;;P }~iQw7 aQOL+?" 9O@CEG1 [{3^.tϋd _߂8=o k{^`AVuM7Wubp`3`EژV` 5;;O6oyhb :TB'[6zMX\7| IqEQ/c0 e$Ӗ⊒|o&Gc9P]o"9E\wF` >sGnCcX(Fڋ$U~o_ax cp<KNvOysɃ6X16kX\ɓq0u>TѢۀ^uڛ24*Y!E966;cqQcP$O?, Å18 '/wY\1˚iKzuB,vBvu=XFTLk8@t~WAj}+8ĂR\uZi 6#0Ud **JV_ d0u w0b~?A 42$T=`,@cp$W`AMCTLtބ~6qN110UTĔ~oSE8q"_aIX\ Ozi,`o7毱 }X(,Bt` ΟP\d b)nz7 cLcPxtPz\}L`A-p\I2 2筈W FJߧs-xPGu|7 c00,6U*q, dVGSʻa J1x%ص84ţt9h 0MjnRPA]F, WݮGFf >70kjubl` /"A}YRUV+<s8" 06X\m~th-~ue 0#oQ%cxm3u` :I5"6n0D1b_//>m+5cpuقjdWp5-}?T17ͧ_( aWӄE %o18` G笭_A0zK`Y7a΢ * G>D}i)6A )KP1xwɣfU1XYv7ڛ&Mc z>DzƠ8P 0㰸N6Y ˇ˵08 zXt0Ehl,*Tp2R"X:;Xӛ2q*L6c$hƠ綹G:R`Ơ<łC#Uf=үVR5sƠi݈+IXIbƠX%X/1b .R|` Zrjb-CAKB18h3`m:~6TLRcZ`\!01hNm(ghyGcH 0^` luӡ;eBKm.4#RWeARt%6~0aUsV)rɧy^`18xO` >aV0_T1) 57yN WET\Ռo5XY%{^f ,~P+j+Iy+?wG$c,ya?\'1TrG;tRy9dJp>Hmb6@f18 h8,Ycpү *2~5 ֮s*@?cp, WY:'CcrB*3W^&e .>5 ^7YtcPyfjk. ˁ{0t \o>-~P0ŬN0 YG XlapėK+{ $cpaK2->ڋm0R]ؼ$<[˕)ߓpx>,9s!&~(čX/ I7$cPklM9d B&ӉwIFwr$$cZ0o[` ^T*V{YIk^)lU̯ 8 }2M7N"WI:q sJ1vr%^,TL 5Lg0:,/ m%o14*R0b"ETQrb}ت_ё+160(+EAU1dɣ \`Qcp8tcpGm#L]nBh u NXF=PlZN0Pg9霵9=6AS2MOdz4| H  sE&$C~u+,E eX]7&Ht|`aA0K>_*iėOz\]%Ga,m#I ~-*WH` 0e,0 *EFWS>â6퓄T\'_&az} !* Ҷ8/'+,#)",)Wbu /܈` 9P.kKaN>e oi$9[EX&uE0ep͒I*_ɊBt` 犎-!U۫6fD~E>ORק-]y.'V=X]yEQ`AUraz0j'1u ߦާ'3-*V{ [%Ly8CGT}7i/ i/.cq{qOB6BܘMn1Ƹs'j$N=MX?G=Iꋃ>kH獥6|ߘ?\c-j/y|j\x8rTy@7h2ȯ`EZo} C=%\p06&)cƣJ*|epRO+vLP<=ߵ,}jъGoe2wb*"^tKKw+`5Ƕ&8Nph!}%;(M*#oͶ=d7=>(ƷD% -9Kv{Ӯ/O=oPU0Wp_VrzΪħV/qX SM0^Kt ]X F(6E )s|C'}2/ӧ7'}"$75_qRMܴopUSKʉۭ M1 "@ߎkhfOFзsףiy"mտ ./[Ț{|3Jq5h". -5ذS*y;C ߣy&/:M3݆%) ݵ~,׿3gƟ+31}"ۻW>M=S]dKWŧ!./{R9㭿䝏{?ڛ)Vljz>NwD>F-' E!yg__ p: ?Uso8[ ۦ附qSoʧ}oJy&2ϩ\<}՟7pm-H~u_k{;SAo{75} ki2F<6z?_^1PP{HVH4ۭ*LB 17nb[O!7Gt[ I<ח= )ä t=')Ut=y~AW,pltPL3'm KsqP۟$c0REٟR/FP`ΡX&#LNoE?/>_dܜ"o}lPʋr>p:ztXI9M?aߧ|@1܏q? eߣi^j/9BG~q~G~s&zNT{#ǭsY?q|Ŵ7:1=Ӹos_hK/\Ƴt:H<@P7 :GߗK)2_,%Mu~5]|%0Uso8A)d_uMu172ĥA#W}KrVCG(~(J:}&W^AD>]}mS>y|wMbS1V}-OAL Ƀ|?o+OoI~ k Cb.U*`qp }d?)+y*>*07m7C1>Tx%m'p~Izk?~G|K/ {߽`.uG}"Ub&j|{W^C7|/3E x}>L|cꯓ>ԟrn %[fR(5fp$&|sG(oߪq篡蹦i"U5ws0?_ Ӂ}?hy!I~O'bMKmͧ]SuS|TyO[qV.SKXzf-~b싿w^٘ տ1'+$K~.aG5՟~rw?k\ s,<_˜o/[}"uj7)WsSo?T}íM0KSޮ:D}.y0OP[_ڗ}}_)}T)}Kٷ)5/}gTේor*S+o~_UXX OY4V޺T>#z%/|Ii{ 7X푽|/#>=:L1[])yollGLSH&_g&T{KSSy%%4dtHơo~?Jy~ßߚ?~_|oPyo3 ,ȟuq r 伽-~M_mo_RO??Wmu䋿?=_o_vky٭/S=Xk|ϟsy{¯L9tżaxEkVkw4GW>."GcorPlXv|`:JWxuV-Ɖ/_~4}3_00̂}mV?_)ӛa,52%v⊟͍H:'ԉ!  :;hm6(' $3b'l3IoA_zԲͨɓnuNDP_kG9Nʫ0|әqЬ7qZHv;rII_ۗmiZv/F2TބGy-A7[z2[]~ nuL~~e96Mյ[/5!m>SQvl7KJy8^h":N9s/L3[Z&`i=H$ `V44H#dh|C__܎Vg|h)„!Sn>9ڭ?ԲC3\nCZvFf¿&ͺj}n^<&Nأ1) Y^na>u*\>.;ۍ,˭]`5ڄ[}'v_A5 N)k rvz^>ۭΔpi{^5Dz4[CSf :[yOUڟ6ߚy#O4H[ߧ+?eud'zԖ_4*' }M4&ey7c6N_'5>o{Pnuk jߣ7G~8z;~ ;kŠG +y)/NxT>#4CZbU-# j<_v|^ڭn=/o*h?Nf݉8VwT &7 :S^ >3U.ygjkdi[]hHíjo{ npM s'/qU 7Vgr{/\yۭM;VW\§ۋIL[s'OM7*4YVZS6LdgtDT~{= ٚU7T ;ΕW Aqa$ ^t;-]+f 1ywVoXߘ[4HS :Ck#n [5VWA֯ I:c(xgKa &vA:4yyRhW'ªnзqvþL;Y*?{Otv!(Ola\;Jǩ/N$j|zmmG6Ե[Y<߀YՅ')\al/n.ώ3m8:?ӭ 4Vwd_}ފx[ 40>җ>íC h$Bld\e?[ϐz4Z?VnU`V Sr:Y[Yc؛oyoWhI[]W>K[~@ |6]nua@̭h>Ξ=>}U};%yj~I\Hqt_N@|Oѭ..{:Vw=YU۾6U}7\3]cq/}{hgj 5'F 4m6"t 87 i#nuq^!mD{8V 4Im=7 7 };.F[y)\έnu?2 ; q?ݲo_$:/Эgֆ_ս°<ʞ_[]//ίaV6b^Bo}:mu|+󲷞_y cƟW}l=o{ZGj_[ns9?k|6Lwoo VW8 q77;8ZGڈ%n;Cڈy۷CCڈu;rU .69tkmnu.>Bڈ4pK'VS|1}:~ͻ"mľR|ql1­lo~ө|޷/oWVG t{'~Bڈ-VOX~~x6輺Ǯ,) {RoGՅ! i#vS:xSz:=p%4aHw gչq7&KKt닏_]l?a~:LP#nMh+7oyeHoݿZ]{)BzLo~kWaЭQ MIdXWts5-[nu[ߐ6ujH&y*~!mD8Kե ~~`Ci Ww p߷k? [rc7­!mhktCtۏ~둽6bowՙ,t|?Ø wyo#ٯ 0nu&O>f8oqۣ>q~y4Vw~kN/>n`K|b+~vL;o:Эni4V/ghí.]/?`Mqҭd7[/q}Jq٧>h}pK(ե~k,i#'cj?ep; .z~6"V~ҭ.{CxNӭ.[aؓ0j[Fk"cQFCڈwkBOX:FlzG|lkū8_Z[oo=>7؛=w6[$ 5q]즍QN}O/~@ &>!mD2lCcycI~C5yI&._| xj~k~λ~k:mD3o}qY|/5o j찗N! CڈgEGn(ɯ}RVߪN ,<H!V(<{ZސƄ1`}5/>_2>jo-D?'[9o} HU^~coxLi#goJ?>O~I_ M7G|G|ྜྷaIcHL;L)}Ha -mگG}FڈðaoYz?K; 3Vmq>HLܘ|C=3 Jc7'oM4SCK S5?䏶Z|bӆ=oa ෺mĮ^o?ZooZw\ ~C['fU>X/[?oU@ڦa'pU_zoOӶOmobؔƘW_w &| ~둿Fol8S㵉7ߦ?_;^ g}PNl}b۠-}y0|_?x3}1월/0U7ܰq}nǴNu߾-~擄li#W֣6D@T]Ξ[F~~{8i? y17[k[Y Jk-ݎr~mEl[Ň/iKV?Vz ~Iv+l[O4S_ӮLL ^2t_owjOjOz␷?Cޏ֓Vk~xu/ҧ8y~݇l5.=j_[~[ ~#&Ui# 3[ݯoHqHv߰}[qi#R_;oo_t_t{6bOq1|D{Gge[7wK ~kKi#owoѹ0υ''W~Mi#R*^& i#R;6V&{S7_6Ÿ7X6FT;aoFڈ%DZ`-?>_ꃴ0q DԶW1j6Ծ<gȟ i#B9gO"5e;}Q;և~} mJ7ao9Mɛ5fX _<.UDKP;m3o3/1x9!|;oA ǙзS-5߄xbKR> a';*i#ς?7l{nGL}i#}<7/>ݷa&\~^TۏwϏ~mߤ0\ߐ6l/2Lwc> ţ9෦i#r U~Y6vL҆[j۷u>8>:HqB1ȿ A_֟˟ mDv6@p>)F|5x5\򥿤ӆKٖM1;CMg8^ lF[S|~kv6"~O~kL}'Q~XTp< Fz1?8v~Q= Kp 췷oV?Aڈ%r3Vփ&5x#UF䒾 ~i#`v^o~M¥ooFl@;=jA<;B%8Q_ UNOT>w'/_=?HqzB7}=/F|o>I~k,HqG%57=HOvo=.ɥ~k~oz7o}o@tj.otC}o]j#m?ෞ10~ôlao>#8FCOo?O#moM;[ `خxⷚ9k>N|5BAڈX{۹fx:OͿG)IR~} {/}8_U2&zO&mil Hb#_pt{MNIzHrHݷ9>B "K8[:F_5W9?S˷~&ַp>/ z:F}I߆~HW ;D}/ ~;7yq[6"u?@_ . GWU8R~OS8H&}A^ZL}[!^>'Nf1ޟ i#L_oCGڈ /97_Oo}ԾU [;{ &>q?@|Fnɫ@o5i5B8z|[_{!^Vުp|51Ϸj%(Á}[q ?5e?wKg_*|bN~]m?~oz'~~Og.ߪx~/vbO5o== \L> t[M~}yL?_8O#^5'O[+ ghj"dox!~{+6xvao~~}s>A->_a bCXD8BM~[qM@l5X ?z~o[y|H K{T^ۺqŸL þ@~K~_<|V{KIX O˥>~k෺=!o#Vxi[﷾m-:op[}'}O,~{V+OvfELyo /1dFWG܏[-]xiQe'_zc>*u* _쮇pxtзζd6W|8sAU~[[bO"~a/>#\|[ [=1$[e?%Oji3o]m7};$8(V෎7&~OncE+/F)g| [mV7-=/{^o{J.~|zL'6=wăz>6ĆN՗*u~ේǡ}zX~b=HTϧg\w|s;[k`~~ේjX*?/Q'~O,姀t'[G]>/yoۿ}[MMߺO"L|7\@>z7_|bR@~[hC!{(p[ o9#>O[=(d/ ٲĆ@>=w[śD0d| K-_V2d>oݲ'[@y%o}m&g:~OuO ֛$d)~P\~kS| O*o~8os=n{$)wMq7AΩOBA<4э} ]'}]oE_?!Q;?iU_{>0M]X|v[]3}o{:%@~!HOqT~oX_7t>ʟ.c@L\-5_@>_ oy{^?.oxhUexS;oK q3o]_ٷM#`V~Hݷs?N|T|u,-~]jG"^ZJ_=o74J[]|do}~"%_o}֐> b{_bxQ}eۃ_:Nu[b}FD'{Tx`><d> ~떿Sط埅Ď/%gTy[}῍|bsO&py2S-{~䷮?_|$xJ[CΉ| G5o֩6eOV gaȉxH[U:!'!o{zzxK'D>TܐR.߹Yʗ{~| /ෆLZ_lސcz}5M5տO&7?G7(|O9:/%LPIYw<8/%K@/};[/&> M [u^J[^45 rmߺ?$w[uේO@==o&,/t_^~"H(Yߺ_ 2'ʍ7AˆKmP|l~cV>8V"?D_IوM\r#^% JෞgCߖ%yuGf_}to|ۺO[o><w#[]CV/!<'h7T{- !o=Fuߺ[_S<5| -灾}wRJ̋o|\|b}o෺O:GJ[oE/O෺♤|վ?oZ!w! _{hȟ|VO-oUVnH(`xo%D>>/"Q˛2)ou{۳o| 7?Bz/Z_/>~Wmo]?6ouw&m-%s1H/_6=t_ƑJ~&%eJ[=7ۣlM}#tߋ@}'վ^+UŸ[5?#P_1+[ O>o|L VK`֯|y1SQ/>ʣp'T~bzG^R|bW95D.r<-BRP} ]#ao| x ^U~oo}YL1~m/Ym_ ^ID>-%;/w aoI<@|ig/P} ~"L 1b~'~wqx@=S;~@>5{zL @|c4'mw}{N-o7 2|}@1soϱ=O//?>{ߚs[ܘ+q;oͻ>q#}:|῾-T1^z3V~56iߺ+w,_s Wo$Q慁z| ~S7 ~_L?(~Q 7o~Ch5D~#I{rZpg4遍@ :2H2+vWW_èiscZ$Q{y{{wh}{K|@ }bKt~NKk װ}+dF/.ǖ'>_,yy[ŻoʹTzC:_/gQ[o}Vo  }{P܎J1+o^~+5}ظ!~7??;/%6!ߞ4+O='e}&[/KW/5?tܡgqo큭>W1\p#o%0x]0#~USדu/zQDL_~xaa=}_?*l=1NJYUoo!?S/uxD=a犗ˬзz=fSsзBZ-z2~C@}~~l}k|t:F/u)s~ob={[W_?/?~՗=K߯~_4~x>~+})EճV>-_  M9N/ܳl-~_~7>T? ˣG5w??|׻.&ߟ~I/Fqpbiۆ/x ћ_h;a_/γ:61ܻ\]t_F}FOm/ۑa/WMc,lfyha _i uaxM ^27y0i%O,}GBbL`x_of w!6 cj^H,KKOlXG>vn 7+LxfYa#=7?xQ{+U+nWo%<3.0W_0ר?ԟ.joP_=LjoR=7w+JX2^0Yȁ򥌩QS{Bz~ԟIϿ󒽡¼nW/*̄Fi0ש?}fqZS{:oiFxf|KƷUV'c.0 /Nxe\q*Q{=񿆨WƣOjoR&?+7%%3.F8Qf Kƭ:ש?ރHO =ޢ,j/!'do!'-$3bOBBBBdIo'Io'IdIo'Io'Io'I&I^E^{Y{fQ} S:ש?-"-"ދ͢Woַj9BKϢnܨ?YTߍ;'ۢ'ޤ,zlomK87[NfQ} Sר?o[T_ԟķ՗PڛԟI?EI|Q} ;[2''ۻ!/AB gOjoR[3{+ٻfr{+;[KƍkԟJ]3yU17?R{%lo8񿷑5dL%6wַ*AB gR{ޝV2ެoUL%f}ƍkԟNuOo'{g}ףjoR&??;[όUӕGƉmLUO {g}bjoP{'7??[ [ ?!{ ?!{ [ [ ?!{ ?!'do!'do!'-${O=L=M=M$>2M$7M$7ޓ=M$-"ދ콈'8ެo+WƷXxP{JzbMwMIw%=$kyB:ޤooM:ރ7[+[ {7[+[Q!I[ԟlo!{ ٛUޤoB7[IZIZMJ*doҷV!{ ٛu'I&}k%}kdoҷVҷI&}kdoҷVҷI&}k%}kdoҷI&}k%}kdoҷVҷE&}k]dE&}k]doҷVҷE&}k]dE&}k]doҷVҷE&}k%}k񒭑=ލnomom/HڞlFFd{7ҷ6ҷ'ۻ=ލnomom/ٛ%{doҷ6ҷPӨF%^7[&}k{/H^7[[[!{Qd#}k+doҷ6ҷB&}k#}kxFV%߷7ҷB&}k#}kxF֍󓾵g{g{WjRۘԟZ%{̷K6ҷ~IMϤ_^)^57[[7kom/H;ש?}A 7?[ԟEϟMFޤomMFޤomoݘԟN OS{BzIMϢ_doҷ6ҷn<2NoNKocjQNxF6ޤomoݘ[ԟEϟM֍gƙ ٛ%>+cOB&}k#}ԞPڛԟIϿH&ٛt%,g7ޤomomZ 36ͬoh3ZPN2cjO?IOf֓)N;ό+3$}k[doҷ6ҷ|pƒ3==P{3ooOw'}k'}k;[ݟlN֞lܩ?IڟlNd{'ۻ?ޝ!{doҷMNII_7[K&}k'}kޤoo/ٛ%{7[;[{!{7[;[{!{']w!{'ք'=gg{׬'֌G5{%{Wwz^ޤooMN^ޤoMN^ޤooMޤo-l_@όƉ_@SbϤ&=3Ɖ\dl_dUʸQ{Mg;ٛII)^7[;[ {S'N|{cjQ7[;[ {7[;[ {7[)^ ٛ]ޤoBxN.doҷvҷv!{Sd'}k7[;[${'ƍ8ۛ}II)^O7[;[${O7[${/7[;["{^E&}k'}k_doҷE^doҷE&}k'}k_doҷvҷ\Dd=H:H:r=+oƍӨNI֑l_hݗo?Tf/ujJ4B  M9Üp|ҷ_]=fglo)`>E4}|/_&N_&?_k"~S#-?_ NJ_X _4&z yZF??riH6/~]~E|okqGo+xAhy _ 6"{]>m"57;?}|&nSg?VajhbͶԿ_?GYg?~6ѣ _7xK7*ש).Z﫩ߩ6.fُ]ٛzJS(n96*/䱀M_ip}B+m|ǫl,~Ƿk5`k|D/R𧻓*!x*J:C+(o`}Tp2wwsq* Pn%?(UXu6l[ m?:=wCU >QU v/oif5Uo;w7t )4ԫ* Uz+\%UuPuN~ΰd]P* : ~Rm6$UPu)vڭz*cxz?zYtqw_[CۮE#=" pH4?*_4IOrWdžj(S™d\8SA gj^=$;K/K?! A6lf ,a=` ;U'𓫜ѭr3BU'wEtvK5*Ucc/ǟac<\RpU;`SKvt!^zMA(=N oՋq}ͿeNx!Y} ?ղWnO0ԮH@ 6BUp&YCv"~v[STՄ[gV=‹k%ۮa*U#N.Kw,?yFJ^Y6QTpVIMgOXeDBxܫkЩM6^)l?ؿ܆լw- *>xe Z{ N՘׀UۗMnMuz [6_ڻ&lׂ9^}BϲuB736P1 afGva^+ qUۮHޮׂCĴGvWgڂ*-x_OL͛QtMb)WU4LP=ZV>?UOp&*&x6ꛯ* khs nM_(S5k/ՆoOj}`aps+y@6bM+Ӯ`] Ԯr+Qخic> nKj״XF;w][bkXەSG`خׂt ߮°] ik.Ki_V]aP ŎuyJ`2 &WsaGJb*to&Wyz7 (۰ε澊+K~EO i ^ j[uW]@̅*BWU2uY* X kʫ T D|W{SVW5ԘNi j;d< 36֋M|8CPEwWg~P+[$!Ùrz4 *gՊ膞_zgQY8yz7y4r큲Oî&oeITA=t?lV5Xh'N,gM]/+(k m:kzcToVJl]SXšk{^`Y~mץQN Zr?6ۮwq횺*Pכ ]/yt?o[5kL]/Ϥ; O]SVOz Rz nj崥7pV}4[Upѻ\&?,]/tSu?WTWDokUXCocL; l 3}>]SSѯwpV8=;/T,}AM@9tٟi5u^o새u? P |l]}y#MEu^}mYC۰ +zM,g W>>XjTqPET/+So6azz;oqrwg8*:G,:1V;vK3_`X#]z},Z}\i2=k/U!zg i {޲IPYMe \@kz,zފɣ޲05ɡg`j;z١1ڈ4];X^4 p>l[j{<,*.Ij<22w]ukxk;sC,pءIkCSDWshxCDPbk/|v/-#o=nÆq43T,ALiձ kФPq/|@ueЄP-jX? M|ch6 *vgfPq&VOCc+MU(: D MuEͯ|w'>j,F0 |>T4Sf~:SR?ogW; M%ہ7МOW}hƧn24y"4`q.zEծn y4OzFȨ f]rfx V;Ե@;4Fh l[c]lW>3th`ngЬNqjNxwK"kshLfs:L_ݫd؆ 朞\z1٬y޷\:dsA(H0A|u֨ AC7 B!;o~5uSG2؆Ah0ih^7r7+-N8״rc~ ܸ ɚu  N3+*9 =t=l@"# ܸ:eXк1`X; g:*v׵c){n![agq:vNnlX.%DdzHW+>Hmq%0ɡ[S*p `X`zf!WokNC }|Mwbj35Ry:|NcB#0lp wL[j'd[2y>oUӘ=mɘ୾PL+gWvpo<*/+_4RК ʹtFMNN/,V 4Yxîh׮\roQcƂ_trgez@N7:Uu :.^#v>~AGZ'7gͨK5u-ژ+Ds)jC]3_h",F)WH0Ut !P R/ƠĔ@)讠Zuэ@tTfJd(\*$秶_XEJAwnI`<@y>0DT0ާ*:R #{v I٢i+2RAק(:RAw8 /D {=j=}! OW؍57!&T鼵뢄zl1@+ ҄<SZ`u0Jd+[^m^u'jfZ~E~ mZAIĭbZA_ ZAhð: vtfbA*:' X4y|-@,TQ>! `^+[ba>!bA\OM}y AdG \Cq› kB,轚OrNN!7!?m!dB,`jĂ6pj 4lc V `XRys&ĂNF&Ă>%WWbA8Cqy봟8]&ĂiL<_t* /˄XЏS  ƨ ;?&Ă"jX<d"'T`Lɩt}:fʄZ07Ԃ1TrF,Ԃa U ƙu" `̅4 W^/|j@.\7ꞳMð0(DLVOWIPzmLB.sBjՄ\Џ S;kdO}%(HXCu_VcV+V =UGzt#6t6=+^M>DPՍU|aVmA ƈ5?Qa}^OzAgAY1S`̈́^0Vx^MtTL}p^zA- =ߕK4)" q6w_yCsZ nv_Me9 ?g^06/V݉+Ɔf9u/˯05OP oSۃDza2ǸOPT˦ Ӽ Zfq%h_zA?Þ?~s azA;ZMWG;@A/@TV tC>S^]Ps@czAWLD acOQZ%O rA֜ u&䂱i&8XNeK0[N`Ӯ_&>5OhNn&rȄ\0 GɄ\0' j)p :T`&&bC.G9uB.|B./e"x<2Sq* WDT;¦1Mb*,Rrp yznA=}˾+54=q/5!g&0l_VWcKYaozB.聽s0@.; ~rbx- #,֮1&. VMr\08J: `pOc-_8 y²uC.讂[ /'0&w K²\ tZL.h=[ :YOa»Ǘa.Ƙ8L maA.BXZa. ^ sv r*E-n(gA^ z,Æ#rF76\gA^or_- +rzAlBur!,˅> rAߜ7W-tC9'oK>Vr$~A-UO+vԂw9Ԃ˾{ *.cVA-+jA- Ru}wz7f?U?dgW]hUiA-ojA_q.X.RW`׊mtKՂqtη* \!46L.x;(O(>䂱 A.XF<[K<Ѻ 6܇ o߂\Y2vs~$huYYJt܂%- uY˥%1ag u\ ʂo&[*` rAg@hT )~h!0+f ~:|\0NTng\0A~V͞܂KW]8,ݭ ta`gcE\Йچ_Wf,\Й>.T [M ^^mk[зA]" ur@ rxev|yA.]ô2O\H!t,s7/?W28 ^ iF!-cB.WZ6,ϮS],`KZЏ;k<( qYz-x}]0iw]9rA o^쌊ƛd(V|mzr\KxFخC*ƣϭy4K9tD8!]q? FmAv'&m)϶[nEQg~( )hXrn7֣~>%M:9(9%t!墸u\{0y[hr,#^{ne>p؁L<6rUx+6~!43.evϧsۗ^b~Bn _ 6o7!mѡ~9>}T0x) I+^=0l2㿂 ~X[l,-.^*tW3}(|6E}cyR6ωWU?Hߺ{ nd=ܸ<(M'!vmJrl4O\qT|۸> d,]^j('~bEڀ|o|4Ы]}Խ/g8BSLŻ.ƽCKzMK J׷ 7E^0uG5æIKb8={td7\bڭyr5?s )N65]n(nG+x;ǕpGӲ{Ayv[*.ȕJ̳:#].fC# X}a$\ޝ!ЌꋼgDG/4gwpBw@7"5@bA3!<=~rM {DhܱgG8ܼl۷"~_6n!w Btln B\5f,'Wkics3 %:^zlq#b,ra^H9LH튯mp o?Gȳ3do{ UY.l wd?<3\/Uջ-7{_ԞK|!Lϣ0 X:uP|2'yX d/Hw3rU/#M'%<>e﵋m'|l𫀢92*o /|{{ťw i\ xPwկbJ.-BU2Ԡ:ԳߏL A *;덉Q7ex==S6T\}UDg~\yo@zgT Q25MEWE^(2ӧC倳>@bb=D~ R=+SЩA<5*+;Xq|eN3Rd\f ~[C؊[ۏtOI\U Y!l崪C듕 PZT[UB[}=+N5 aklu6k}VTHS5a/G5 ›W!l oO5*񵾞'+|>2χ ak*jo:"E%̬W<8~ akۊq^!lLZ/gz5a a/*7BъZg>"0;PJ\O7kX akxG+jW -8UjCZ$ {U@yprWokmY5ݙ_!l]ȴtAcMkе-)_.]cӂ G7۠k _Ev[y6׺f56 jеY6yZd _t^>QFuSf5(j?+> H}  N{rƓ`ڭNx}tXMJ1$wovOAGRqr;^ 2mT Qo_o"YWB(qv'Dد8WNCVO79(6w`9H'̍;({͟g@e< ԴI#pXu}u.p6G _УT>dG1L9OGx_qAj[oj!~b^{%m. b'o>M ObnˇlX;Pk8Cz"-kqdk ^Esп=}$1Bǃ#t{G^[}h}:AEjjC]> D/k#I_],8`\D7Vc@4]RHRܢ¥QͿ=uOEUyaBo+ͭ U|DQqփ;j֦16jD&X] 1v8+wv {9x> @TH<-JP9vY{_ {ե"cE Ȯ5'yP,a<>+ZA9} ~"kpƮ ޝAYO M6])FZ눱~*'04 bAvǞ&l+_U}-ÂHYYŖGB]/*/o17 R q ,PLᰴ,yzw,ÿO=C.wm"E]yOﯠB" U@Y+m7\=ły7ެ\e~ W|?IE~"_y: jmQvޔ T￀eL|> -(Ӣb|ǯśAUp+EE1/SPtYKN}*!1 d1 J/T2+ez| .Y$ 6ܞT߼?2.V[^gُ" 2=YUy= y˶Y_+~Qv^ix(-(_cEI,xe*ߧ^@نfSE+/E cAxkP <8~2foh8Fa>]h|Qv}|@,JaZ/C_֣e秲RqOj5WĢ@^r g lEfo,2nj6XΐbQvw'm8Pj ߿aYzqz /Fi^d\|zX]Ҽ΀*COKsr<4Ckx(L܆:x,ǁ=שߢߔl?^uFC(rRg_s|{Zej{M峵=E[[XEMK`#.t 2Kz/~hQvez`ȰGy_Vexױo?+r4ok=xg=,r P׈k|d70- ܮG,z(.^Ay2l ~(" TPG;3Q_q%=xFݜ@ng~E=[|{}@%2[]xa Wɺ"(^ l~'yLE=OOh+?7x3Dٍez}:.Edq,(Q QvGy8G}~>%"06}X>^kVBx/y]3TQ?B9LfwH)?favTԏ[ }.yQͿILx^ê#Kxz{EŲ0\l|{kB[u7X]V"c,f0^ a䪶Vԏ r.?[[dW۵Y]Ⱦlam}\Њ_=ϓ#x0zaH#kavqޫPF~TG?o+G08V(#~Z]MS}m08_: u^+%#׿?_[YM:fj# ave#b?0ި2r03L}EYOV?+*#˳}!.ίUGEQQ?֚c$V`yVd-#nE8TH#z^>"ww%V?#fwg⸔_;ncjxQQ@[h0;xD]ugͷvX2 _fwil~D(6D7-̮-VnavgD=}ewIE0;?ﰺvw0o0Pl<.mEx6^-vE~Zm:_1ųb= (Ȳ;$javg>Y $NZ4oo^!Q+$~08OrBoP@مnյϡDLza?K%`av$[] ><~Xϫ\:oqcavߪ( gfD* HB&PgWJo"j;ϻ ?D-.η$Bќ|_h H|cןPC" m}jHyjZo{~jxmk~lVCUԐ[݆+G|;a;AziAz!Q\ObxX/!qCV6o=֐8|5*rs^o_7[CPDG[}k_HNJHxG"1œֺܳMZu<{C@"з}DjhӚTߺǯ]+"m@^9=?'==l"Nr=aHkvG7WTZ^Kæ Vw6[H?kZ"+ޟ?5[PD/ӷ^L]syAz"HZ }kߟ5hAfV}kD}do g>v`7}:?oGq("z}kqU~G8 6︣/c;z j0Qo=xZ鿷u[D(}k*:H>CnU$[}"HUͿBm^}ouT8~~"C|[ Ӛ?}`Ggu[M*'зzߡo=W|S˼AHqS{|y5L*Ο:JX}_}b?U$q7z|.+~C^ܿ]QU$~W/lm{?o=ێ*`(a"?Di͢}jֳ>T??tTVT=H4[ uT8 ֻoG [?oxU$p^눒A"8=zx^nU$\՛뷻QU$Bԡo=*VErYzX,ⱳI :H6h!o yK.ox 1[ o|5va!퐷<\NmֳݣD֐r?nE$Lx۞ܩDq:!o 9\LG񂽶Cڋ/("ױ֐Kt[]m~É:g;O`˝@mEn5 u'O~i,'("*}G|Bt5yk\{nE$\!oi^`z]IGItw.)N!o͎*CzƋU*됷Cz'VE׺:HJyk:Hx/g "yk\_w"}y8Y-VEݯֳ@*q!o `G.7g v= $$[`t Vժ(JiU/~)pDd[stǁfqMH0 [6hحn#[9'­_Bu^% O<ktɨĦ J.o V: ,ɏoϯRitINO OGE>_u#-67q5B p(v@E8ޚ*,/H0<*-{?kx[$n(-me<\^ ?T$ V  ǂtICV#T$.BOOq5 NW%"bQ;S"Q\'oxhh+d$X_xk}>v}B$9D̷2/x+2'~ xk1VHAǔBF"]ޖPHlW3n[_RHp[پ2?om# Ncݨ[VH)V.)V1~),?HПR[NSHPݽg5[9x+sP!$Uf}}~MZW+ޤl !شo`|HoBHؾuBk]Wh*VSkM5w(֬=p +Vp ! x+w"zB{,oN[($[>otI I&:nAr}Br}H!$uuJ-*b;l8:u5@/ŦٟoeI.gSf{.!쟁fzuUUߴ5 NMw oxͱFo @'6%f{o{ Opbw_Ǒ 5GJ'\nس*V: UTo 5Ct585}Wrv;Kōxk'HdoS.Mr}J>*o[GUMG߰]?gjl߅jȈ/ArI5x|\͸xk'F,g\Ok::ڲ9-O>.˷otoQtI* x+8-YZ=D)/Wv\o2/B',ଡ଼_A0xkЉ/|k˷oJ|uAVHg[9>-]#dJ{q5׈C|rUYa|bA_V BaoƃV7,p.֬(uM [JׂHo[s|r5txA5ǻw"]<-T3%# ۷zIl!ؾ!d$ϳ$xכo,A:Y Z ܾk[[9\!18s%,6g:o|+/Oa5d ]K'8g% r 96sKg/u}kA۷?2=p8ۑ,"}%s{8^7?uo߰r=qo%_Vl+Vn >r>Vl&Rm ˂׻V7@,}VxZH'<}C7-a75@v$=l߾?ȁdޱ{/ȁpeߚ@L[+u{6^.Ǝ퉽sor ol?V/|k 5۟D|{} Og?o-[u{ 5@4gkY[9ݐ |+ 5'K;ߊ[boe|e;I'8>ío7ڕo.|\O{O_|k[C +eߚO v5"ϯn鿭.V6@|3?ZY۷X}盿E{r r ^l؞X*/v7l[M5lW|[s;m%,nVDط%R^[!(zk]z<߀\=ox|7[7#7g{1T~k]. /Ca}o6 c":oMηk1<5{g?- ..c~5S>揙-<ەOfv_3{g~l'cyoc}ْkޥ?2{xavٞ?ηJ<@y||oOpx`v.cb|kWfK#--َ2w[7{ұvlc]ْEox;c~ӈ=}oogNح:t8/|AK>ٱ=x/|Ǔ-GOtl$Oȁc̖䭎 pfȱHxlw_1?@7{|F8CŸ|kGV7ya%yc{Gɧ6{~Ǟ[#_RW.-“=3I^첾cv{=V-|I̞3}|kG;E_ٚ˱Ge{cϒOa;e-/ȁ˱o~d|62o*"15<(=2^l63η+Oǖ73͖O5_3f䟏+_}?_/v:/Pշ7zvr>yAa㻯D~C1@xM(/__||2=cAs>dsϞ|{#o4^?Ὃ/'Xoo#bUWX>D(%0$+%tM(1zKr+J< $u-@ಫņ)))w+5V\ tU<aw8x^u!la)wHf}_P;ֿ{ݞ>!}.W)wv.m[ GH}Hx>mjm YrGmUG4gk_|7>%an^gawIZzB\r ެ"YϑT׷\}V3^oͲ$)wxuԘb/(J%H[ƒ‚4z]i\`^E |ǖ 3߁ HXq|bIRӷql9297ɹ=(1=n|>K%^OgK%yG ^Hf8$)w+XzS))"f#Lz? ϛozHsHLxi HcIi (A݊"9/^3B^_!)מrbml,,1>ċc~?HJd{@ʝn$%[IxStykr E1S{i9o!;֧-9 )χ/RmD%I٣~H ~G S>>HHdϐ߁HB~ D )χ;i_H!z)0#?{?[.ۂ%'R!)/Rr"$%ilqs_{ Y>辅E+%}ڿAR"-Z,َ7'HJX>{-opy~Vb8;og@$oHJFhu0S8n !)17H+D_ܐdHlHJp)wVC7c)g 'Y;µȸMPb rxD1?+bhv-\+$nbD'zOoGLiv]QkѳX#-G&!QO,̀mG}ϲ-)6}buv=ZXЎb ۊk,dy>hGd_ܺ\`![۽pك \w\Hs\H Z!џhH{Gǯ~mԺ?Q}Zןh@!WZ (dK牞Zx yRS8/@!?qO zSތxj, k>~JbC:x9ާ7qy># ҒSϫ?QZ|i@6#B:϶boԺԕC< wtG@!ۊWyNy?/^~B:"@j;wl:V6?Ժzϻ쑣@je?/ٚaxj]̖͏-Ou}Ou ?ػX~{tH33@?lϋԺ/ùh>:=<.;Ժ.^?ΰԺw?͞6|<-m/zw>qEjd#Z @Sz 2c= Oؽ̫̞ .cuulF}Cj]ubaU3#?ZCJ< Ժ ߿}>Hձ-YHu=wc={͇ɛu.qu11jJ.ixj]xfk뇧eyU=W!nz*ٻ~?KG|/.ѢGx~Oy-իګo l!RS;S#Btxj| 񺔸ْ뱏?#?!KOZ1#ސZ9#".!w?!џHo Ժ~kԺ}.r`kU~u[uY~ؽ[S?/x鈈#Ou$uu?A:lٿ".ck70_*G ;'El~Equ_cvHvx5KGp|ǚͺcϷ琎Hu=RY_!)RoekvO[Տm6Etjwy#.fԺx|^Oc}jR4HGyjgulTb?[N-8OGڃ|ȈԺ_ k-OK/S\:bZ5Q]MOc{@:Ժ8hqi R,7?{rfyyZZl|<[lWo5pe>uX95HGyj] +5OڽZk֗7oOgo=.#8֬oX! k~/p1 O[_HG?kolk=2C78,?HG0i5% k?HG9_=.u~r<Ş]9o?FYG4;C k8ּM5B:q]'#h`?]_ۏ\o6[KB:"H>k=b3&9 @CTvI̮ vo/#}2|بm_ GPh_`A= yy|75`31G+k/d#} }  +_0Yȉʵ2V{M6" 5#X"'k/,\Fʵ +cy6+V +9Y`Xv_FdZ~Y&=zE ^g9nxSڑfv]i~`ͻA3񄵁 YxЌkkfZOco|+!c>4)cu6Ы5#23I37ic~фArE5r5PT3c9}mDYifn5n5pQ3ć`lLX󔯃fJyh(DufH]  ٔm<G?WcؗSg>X 4m& QC:jW-}e\*p5;?4ӄ؞/j*8qe z{C"qY =:I/8fG=ˮ/ 7U^AdG* YЃH'jvN݌߷,Ѓ5DЃYJ8uE*z\txrDy?q5f/YBj/UBFAv|fVfudrCYqrY rf!`V8 AZ_W]Z_2|5 f5iR`V9gx!`Vz+b3:`VfB"*׌^0zcf5}pAds9 f5h_09GZo9Իb ݿw}5j^j>/r rf׻b/լ`V7ʛsgV]쾜Ye7Uq_01~4?0}C" ww0u0ugV~ݙըrzAW1MlΩ; 2+ 'Au0.F? 6~K:ˮFG#c~*4zf߿Yc*c:*ct0Y =v0\S됃`aV{5`V_uA[.XC퐃༰=-{ r\`V/jyuC~ k*cbݙX.k*cnr;r9^u0Y>.Qlk*_j_rt:|]9jG0Y!5f5*ǫ`V?wA`VvgVj r2rd;z}e됃`u9_x۝YaPu2^1boO`V!AYWFٳW0#{瑷*wDyx_k6*9l_`V9`V#gjtଳYԡA#:aw5!wGVc8{ݡAwY{݁{vӁUzPہpdށ5f%Rļɗˑ՞{y{u j}Yցf5nr:ӁDv@Vܡj6_ \P3dM̮L# ~z/t fi|fwxY@Vzj?լP f}47g%dd7 Y^@V| djٽXBduxZ{|AV; =qdv/#l@ Ye@V9 Ap|D@jlo÷^=rPǵ"jR {P`dY?6Y:@}@V9@fy,ޫz A0|4;7rv 2U㽶5"jgA04㫆R }} U[Y?f}G${Ѯ)ɟv/[+ş@V.<,WI,[+@ꆱ=Hd~֫Wnf{J` 1>q& ?YYe{o`Xf@VY%2*O{>>;7Y@HYq}߫wdUUM0?ZS?շd5/"Oor8ҟ@V?}aY;D/||8;QO #[?(㩠Y_r3f/%6)o;Uj=VDvYMjGOd d׊ [~w :j"M j =mo@V~<;Οu3}nϑՖd>Fshz{U ˑUo#\<z`jY%k2 gCOӨ'74S 3 X%1Y0-nYj%?Ln|f|H86@U>'Sm_aW0.Xrf~>9ד$7p>0>5 !TLptKEF.׻bCПRaNզ1ds&TJR&T"R\Hqd{@RcG/g6$5p $T'TkR'R:I zcB[p 86&:tI%4ϑHJrI%768 4l:0t$5P,Nn'2@RGQ˅1i=y&7Ie~I/:[l_YЌ kT%[ ښ޴1ƴ!Skڸf>Yqӧ#d7DeS&[K9?¤9NhdA qkJ S:x(D2#:1{ģ&;i5]44A,km͈iM nd,F\٦OLjL8lj<'cFʛO鎯hًQ1sO3fO=i)GOK`i^y#<6o#6qW e>cO9Þ39$H>O$2zN'-|]=)ʤ)72XDZY-eӑ 3 nZ0fܬ{@hzKDiG F &xTF&7kMQ9Ø߯ZgKQ\|7qxo({TLRFD@&T&Mߐ/HZ캉{ 5# @*#(@*gIO7Q. 5|_o00f{o r:" 3 @lEa:3Qƌ~B|#GD-BZOu@j@jOʁԈXMRy}od  57RFHZ@*WLo}fĮ xDqDaD! @*T'w﷯oX? "a'bjJIL|#7y"BG;B*HZd#RnZ"Rͺ@|&EoIHeLuEZ;B*Rٿ 7yH-  P C -RB"H  |_o=K "z?+` @| ˮD  F(@*# ^n|DE#FnF]o0b*o$8|#A"ZGEZˣoe7ȗ S⛨F$R?K7@jG 5\R9 hod;FCCXҽ~YfsᎴ8_#yTv7QVO hPVmd ^H&GWC)ǯ9R}vxtɑTȎ=kyY-|$ 'H@¤j 5cZO 65L~@W~  )O Z<o,{>q@He{hR@ aZ{)TwuM+Լ~=k}@*;uM^HA!m}k,Fn7F}SRY>`{Ql/B!_:HϷj{S/59+T{ M,7?>V}oDHywHe 㹺&G59T/@j/YHw 5O MZ7z~#ÁT}O@*s&G^ɑ,W@*cu \H:oxUmvՁThrd{q 5:b'lo59"R_*ƽgH"&HVhrpH5k[5ܦz37Cu'49HMHp$]x{u~ ;gf,'UhrӺgH{%),_E/C5c䠿M_6r?}:֍=kYɑ3CF t92IBZ˸=]xY[䠳V?[㠯{}V\o!K1빓{-8>RJxA0"꼯umc=^[8u_| G_7x>~}a֗h h>xw_i\9%yy/O_}~úՇjn~ۏϟ=?߿v?kni?r4^?p P6_Nh`hZ<--{'D䲜{ ,_m3 :/gXg_?4dՄՎӭ.?Ny?|Bkl o?_?>{?> endobj 10 0 obj << /Length 2460 /Filter /FlateDecode >> stream x]M5uMHv%QReO=3De^-cCfb\U~<3޼1惉պ`Bk6㽳_b~6?}b,:%?3o7/˓7E> FMCL V.~g|}ŷw׷ux wxlXtkDfϐl<ڐMRLLfht5:P$w6 /!}Wχ}C<~QֺҶDm'Qv|S־q! ,ύQ_ L$\;+_\qo tz?EmA;|{E7{۔[+; aJt,t%z]LRJb%pICvg9F8 ;;r/Lix&K wNBI"vQ&7DR,XLaLC&s+ O{3XMG:9rUTuFEi#8dY;lWeIN/(ԉ+w[P 3FLA;ɭFln3ɓDzi@y[鑽,̎js`j#V9ད*7TBūBrok$tu0zPѰPT*MU[MurҾS[c8DS쏃zdOM`TdzL+bR_BSnU::Q߹-/[`t 8=H%ɏMbT2t`hݪΝhIr,4wXȁ`A=ҖwhJvRk`trj J\Ql T^@#oV{ &!h¬+R[-CGֵ|XΟf6q⡒ՠrTɔ,NT ̙Rw( :#6 5*}c389CdeM1MX3X[lDVZFekۈJ Ey`t-$hf zlط9و$a?}WQ!KVp9#xrA)+b4yjE0 xnRΩcA$3cgڟђe4)VB)}D5s1UFFQ0_}b,4T&}W+@ߙJWΊ>.xPNI8|}<(穔|}<(e_>e0V>S|Ю|߿C%h/Fy]m?٧Tм;}|UXr:Hǣ,e6t4}I/^;'v{&cJ _w߾777GOw?{+[8uxlaJ%m_,c-A%endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R 9 0 R ] /Count 2 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 12 0 R /F2 13 0 R /F3 14 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 11 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 11 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 11 0 R >> endobj xref 0 15 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000071166 00000 n 0000071255 00000 n 0000071390 00000 n 0000071423 00000 n 0000000212 00000 n 0000000292 00000 n 0000068552 00000 n 0000068633 00000 n 0000074118 00000 n 0000074376 00000 n 0000074460 00000 n 0000074558 00000 n trailer << /Size 15 /Info 1 0 R /Root 2 0 R >> startxref 74661 %%EOF phyml-3.3.20220408/doc/naturemag.bst000077500000000000000000001070471422404706600166730ustar00rootroot00000000000000%% %% This is file `naturemag.bst', %% generated with the docstrip utility. %% %% The original source files were: %% %% merlin.mbs (with options: `head,seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% physjour.mbs (with options: `seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% geojour.mbs (with options: `seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% photjour.mbs (with options: `seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% merlin.mbs (with options: `tail,seq-no,nm-rev,ed-rev,jnrlst,nmlm,x5,m1,yr-par,xmth,vol-bf,vnum-x,volp-com,num-xser,jnm-x,bkpg-x,pub-date,edparxc,ppx,ed,abr,xedn,jabr,amper,and-xcom,etal-it,eprint,url,url-blk,bibinfo,nfss,{}') %% ---------------------------------------- %% *** Style for the journal Nature (created by Peter Czoschke) *** %% %% Copyright 1994-2002 Patrick W Daly % =============================================================== % IMPORTANT NOTICE: % This bibliographic style (bst) file has been generated from one or % more master bibliographic style (mbs) files, listed above. % % This generated file can be redistributed and/or modified under the terms % of the LaTeX Project Public License Distributed from CTAN % archives in directory macros/latex/base/lppl.txt; either % version 1 of the License, or any later version. % =============================================================== % Name and version information of the main mbs file: % \ProvidesFile{merlin.mbs}[2002/10/21 4.05 (PWD, AO, DPC)] % For use with BibTeX version 0.99a or later %------------------------------------------------------------------- % This bibliography style file is intended for texts in ENGLISH % This is a numerical citation style, and as such is standard LaTeX. % It requires no extra package to interface to the main text. % The form of the \bibitem entries is % \bibitem{key}... % Usage of \cite is as follows: % \cite{key} ==>> [#] % \cite[chap. 2]{key} ==>> [#, chap. 2] % where # is a number determined by the ordering in the reference list. % The order in the reference list is that by which the works were originally % cited in the text, or that in the database. %--------------------------------------------------------------------- ENTRY { address archive author booktitle chapter edition editor eprint howpublished institution journal key month note number organization pages publisher school series title type url volume year } {} { label } INTEGERS { output.state before.all mid.sentence after.sentence after.block } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := } STRINGS { s t} FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {fin.entry} { add.period$ write$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {add.blank} { " " * before.all 'output.state := } FUNCTION {date.block} { new.block } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checka} { empty$ 'skip$ 'new.block if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {new.sentence.checka} { empty$ 'skip$ 'new.sentence if$ } FUNCTION {new.sentence.checkb} { empty$ swap$ empty$ and 'skip$ 'new.sentence if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "\emph{" swap$ * "}" * } if$ } FUNCTION {bolden} { duplicate$ empty$ { pop$ "" } { "\textbf{" swap$ * "}" * } if$ } FUNCTION {tie.or.space.prefix} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ } FUNCTION {capitalize} { "u" change.case$ "t" change.case$ } FUNCTION {space.word} { " " swap$ * " " * } % Here are the language-specific definitions for explicit words. % Each function has a name bbl.xxx where xxx is the English word. % The language selected here is ENGLISH FUNCTION {bbl.and} { "and"} FUNCTION {bbl.etal} { "et~al." } FUNCTION {bbl.editors} { "eds." } FUNCTION {bbl.editor} { "ed." } FUNCTION {bbl.edby} { "edited by" } FUNCTION {bbl.edition} { "edn." } FUNCTION {bbl.volume} { "vol." } FUNCTION {bbl.of} { "of" } FUNCTION {bbl.number} { "no." } FUNCTION {bbl.nr} { "no." } FUNCTION {bbl.in} { "in" } FUNCTION {bbl.pages} { "" } FUNCTION {bbl.page} { "" } FUNCTION {bbl.chapter} { "chap." } FUNCTION {bbl.techrep} { "Tech. Rep." } FUNCTION {bbl.mthesis} { "Master's thesis" } FUNCTION {bbl.phdthesis} { "Ph.D. thesis" } MACRO {jan} {"Jan."} MACRO {feb} {"Feb."} MACRO {mar} {"Mar."} MACRO {apr} {"Apr."} MACRO {may} {"May"} MACRO {jun} {"Jun."} MACRO {jul} {"Jul."} MACRO {aug} {"Aug."} MACRO {sep} {"Sep."} MACRO {oct} {"Oct."} MACRO {nov} {"Nov."} MACRO {dec} {"Dec."} %------------------------------------------------------------------- % Begin module: % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] MACRO {aa}{"Astron. \& Astrophys."} MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."} MACRO {aj} {"Astron. J."} MACRO {aph} {"Acta Phys."} MACRO {advp} {"Adv. Phys."} MACRO {ajp} {"Amer. J. Phys."} MACRO {ajm} {"Amer. J. Math."} MACRO {amsci} {"Amer. Sci."} MACRO {anofd} {"Ann. Fluid Dyn."} MACRO {am} {"Ann. Math."} MACRO {ap} {"Ann. Phys. (NY)"} MACRO {adp} {"Ann. Phys. (Leipzig)"} MACRO {ao} {"Appl. Opt."} MACRO {apl} {"Appl. Phys. Lett."} MACRO {app} {"Astroparticle Phys."} MACRO {apj} {"Astrophys. J."} MACRO {apjsup} {"Astrophys. J. Suppl."} MACRO {apss} {"Astrophys. Space Sci."} MACRO {araa} {"Ann. Rev. Astron. Astrophys."} MACRO {baas} {"Bull. Amer. Astron. Soc."} MACRO {baps} {"Bull. Amer. Phys. Soc."} MACRO {cmp} {"Comm. Math. Phys."} MACRO {cpam} {"Commun. Pure Appl. Math."} MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} MACRO {cpc} {"Comp. Phys. Comm."} MACRO {cqg} {"Class. Quant. Grav."} MACRO {cra} {"C. R. Acad. Sci. A"} MACRO {fed} {"Fusion Eng. \& Design"} MACRO {ft} {"Fusion Tech."} MACRO {grg} {"Gen. Relativ. Gravit."} MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} MACRO {ip} {"Infrared Phys."} MACRO {irp} {"Infrared Phys."} MACRO {jap} {"J. Appl. Phys."} MACRO {jasa} {"J. Acoust. Soc. America"} MACRO {jcp} {"J. Comp. Phys."} MACRO {jetp} {"Sov. Phys.--JETP"} MACRO {jfe} {"J. Fusion Energy"} MACRO {jfm} {"J. Fluid Mech."} MACRO {jmp} {"J. Math. Phys."} MACRO {jne} {"J. Nucl. Energy"} MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} MACRO {jnm} {"J. Nucl. Mat."} MACRO {jpc} {"J. Phys. Chem."} MACRO {jpp} {"J. Plasma Phys."} MACRO {jpsj} {"J. Phys. Soc. Japan"} MACRO {jsi} {"J. Sci. Instrum."} MACRO {jvst} {"J. Vac. Sci. \& Tech."} MACRO {nat} {"Nature"} MACRO {nature} {"Nature"} MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} MACRO {nf} {"Nucl. Fusion"} MACRO {nim} {"Nucl. Inst. \& Meth."} MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} MACRO {np} {"Nucl. Phys."} MACRO {npb} {"Nucl. Phys. B"} MACRO {nt/f} {"Nucl. Tech./Fusion"} MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} MACRO {inc} {"Nuovo Cimento"} MACRO {nc} {"Nuovo Cimento"} MACRO {pf} {"Phys. Fluids"} MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} MACRO {pl} {"Phys. Lett."} MACRO {pla} {"Phys. Lett. A"} MACRO {plb} {"Phys. Lett. B"} MACRO {prep} {"Phys. Rep."} MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} MACRO {pp} {"Phys. Plasmas"} MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} MACRO {prl} {"Phys. Rev. Lett."} MACRO {pr} {"Phys. Rev."} MACRO {physrev} {"Phys. Rev."} MACRO {pra} {"Phys. Rev. A"} MACRO {prb} {"Phys. Rev. B"} MACRO {prc} {"Phys. Rev. C"} MACRO {prd} {"Phys. Rev. D"} MACRO {pre} {"Phys. Rev. E"} MACRO {ps} {"Phys. Scripta"} MACRO {procrsl} {"Proc. Roy. Soc. London"} MACRO {rmp} {"Rev. Mod. Phys."} MACRO {rsi} {"Rev. Sci. Inst."} MACRO {science} {"Science"} MACRO {sciam} {"Sci. Am."} MACRO {sam} {"Stud. Appl. Math."} MACRO {sjpp} {"Sov. J. Plasma Phys."} MACRO {spd} {"Sov. Phys.--Doklady"} MACRO {sptp} {"Sov. Phys.--Tech. Phys."} MACRO {spu} {"Sov. Phys.--Uspeki"} MACRO {st} {"Sky and Telesc."} % End module: physjour.mbs %------------------------------------------------------------------- % Begin module: % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)] MACRO {aisr} {"Adv. Space Res."} MACRO {ag} {"Ann. Geophys."} MACRO {anigeo} {"Ann. Geofis."} MACRO {angl} {"Ann. Glaciol."} MACRO {andmet} {"Ann. d. Meteor."} MACRO {andgeo} {"Ann. d. Geophys."} MACRO {andphy} {"Ann. Phys.-Paris"} MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."} MACRO {atph} {"Atm\'osphera"} MACRO {aao} {"Atmos. Ocean"} MACRO {ass}{"Astrophys. Space Sci."} MACRO {atenv} {"Atmos. Environ."} MACRO {aujag} {"Aust. J. Agr. Res."} MACRO {aumet} {"Aust. Meteorol. Mag."} MACRO {blmet} {"Bound.-Lay. Meteorol."} MACRO {bams} {"Bull. Amer. Meteorol. Soc."} MACRO {cch} {"Clim. Change"} MACRO {cdyn} {"Clim. Dynam."} MACRO {cbul} {"Climatol. Bull."} MACRO {cap} {"Contrib. Atmos. Phys."} MACRO {dsr} {"Deep-Sea Res."} MACRO {dhz} {"Dtsch. Hydrogr. Z."} MACRO {dao} {"Dynam. Atmos. Oceans"} MACRO {eco} {"Ecology"} MACRO {empl}{"Earth, Moon and Planets"} MACRO {envres} {"Environ. Res."} MACRO {envst} {"Environ. Sci. Technol."} MACRO {ecms} {"Estuarine Coastal Mar. Sci."} MACRO {expa}{"Exper. Astron."} MACRO {geoint} {"Geofis. Int."} MACRO {geopub} {"Geofys. Publ."} MACRO {geogeo} {"Geol. Geofiz."} MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."} MACRO {gfd} {"Geophys. Fluid Dyn."} MACRO {geomag} {"Geophys. Mag."} MACRO {georl} {"Geophys. Res. Lett."} MACRO {grl} {"Geophys. Res. Lett."} MACRO {ga} {"Geophysica"} MACRO {gs} {"Geophysics"} MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."} MACRO {ijawp} {"Int. J. Air Water Pollut."} MACRO {ijc} {"Int. J. Climatol."} MACRO {ijrs} {"Int. J. Remote Sens."} MACRO {jam} {"J. Appl. Meteorol."} MACRO {jaot} {"J. Atmos. Ocean. Technol."} MACRO {jatp} {"J. Atmos. Terr. Phys."} MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."} MACRO {jce} {"J. Climate"} MACRO {jcam} {"J. Climate Appl. Meteor."} MACRO {jcm} {"J. Climate Meteor."} MACRO {jcy} {"J. Climatol."} MACRO {jgr} {"J. Geophys. Res."} MACRO {jga} {"J. Glaciol."} MACRO {jh} {"J. Hydrol."} MACRO {jmr} {"J. Mar. Res."} MACRO {jmrj} {"J. Meteor. Res. Japan"} MACRO {jm} {"J. Meteor."} MACRO {jpo} {"J. Phys. Oceanogr."} MACRO {jra} {"J. Rech. Atmos."} MACRO {jaes} {"J. Aeronaut. Sci."} MACRO {japca} {"J. Air Pollut. Control Assoc."} MACRO {jas} {"J. Atmos. Sci."} MACRO {jmts} {"J. Mar. Technol. Soc."} MACRO {jmsj} {"J. Meteorol. Soc. Japan"} MACRO {josj} {"J. Oceanogr. Soc. Japan"} MACRO {jwm} {"J. Wea. Mod."} MACRO {lao} {"Limnol. Oceanogr."} MACRO {mwl} {"Mar. Wea. Log"} MACRO {mau} {"Mausam"} MACRO {meteor} {"``Meteor'' Forschungsergeb."} MACRO {map} {"Meteorol. Atmos. Phys."} MACRO {metmag} {"Meteor. Mag."} MACRO {metmon} {"Meteor. Monogr."} MACRO {metrun} {"Meteor. Rundsch."} MACRO {metzeit} {"Meteor. Z."} MACRO {metgid} {"Meteor. Gidrol."} MACRO {mwr} {"Mon. Weather Rev."} MACRO {nwd} {"Natl. Weather Dig."} MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."} MACRO {npg} {"Nonlin. Proc. Geophys."} MACRO {om} {"Oceanogr. Meteorol."} MACRO {ocac} {"Oceanol. Acta"} MACRO {oceanus} {"Oceanus"} MACRO {paleoc} {"Paleoceanography"} MACRO {pce} {"Phys. Chem. Earth"} MACRO {pmg} {"Pap. Meteor. Geophys."} MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."} MACRO {physzeit} {"Phys. Z."} MACRO {pps} {"Planet. Space Sci."} MACRO {pss} {"Planet. Space Sci."} MACRO {pag} {"Pure Appl. Geophys."} MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."} MACRO {quatres} {"Quat. Res."} MACRO {rsci} {"Radio Sci."} MACRO {rse} {"Remote Sens. Environ."} MACRO {rgeo} {"Rev. Geophys."} MACRO {rgsp} {"Rev. Geophys. Space Phys."} MACRO {rdgeo} {"Rev. Geofis."} MACRO {revmeta} {"Rev. Meteorol."} MACRO {sgp}{"Surveys in Geophys."} MACRO {sp} {"Solar Phys."} MACRO {ssr} {"Space Sci. Rev."} MACRO {tellus} {"Tellus"} MACRO {tac} {"Theor. Appl. Climatol."} MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"} MACRO {wrr} {"Water Resour. Res."} MACRO {weather} {"Weather"} MACRO {wafc} {"Weather Forecast."} MACRO {ww} {"Weatherwise"} MACRO {wmob} {"WMO Bull."} MACRO {zeitmet} {"Z. Meteorol."} % End module: geojour.mbs %------------------------------------------------------------------- % Begin module: % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)] MACRO {appopt} {"Appl. Opt."} MACRO {bell} {"Bell Syst. Tech. J."} MACRO {ell} {"Electron. Lett."} MACRO {jasp} {"J. Appl. Spectr."} MACRO {jqe} {"IEEE J. Quantum Electron."} MACRO {jlwt} {"J. Lightwave Technol."} MACRO {jmo} {"J. Mod. Opt."} MACRO {josa} {"J. Opt. Soc. America"} MACRO {josaa} {"J. Opt. Soc. Amer.~A"} MACRO {josab} {"J. Opt. Soc. Amer.~B"} MACRO {jdp} {"J. Phys. (Paris)"} MACRO {oc} {"Opt. Commun."} MACRO {ol} {"Opt. Lett."} MACRO {phtl} {"IEEE Photon. Technol. Lett."} MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."} MACRO {sse} {"Solid-State Electron."} MACRO {sjot} {"Sov. J. Opt. Technol."} MACRO {sjqe} {"Sov. J. Quantum Electron."} MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."} MACRO {stph} {"Sov. Phys.--Techn. Phys."} MACRO {stphl} {"Sov. Techn. Phys. Lett."} MACRO {vr} {"Vision Res."} MACRO {zph} {"Z. f. Physik"} MACRO {zphb} {"Z. f. Physik~B"} MACRO {zphd} {"Z. f. Physik~D"} MACRO {CLEO} {"CLEO"} MACRO {ASSL} {"Adv. Sol.-State Lasers"} MACRO {OSA} {"OSA"} % End module: photjour.mbs %% Copyright 1994-2002 Patrick W Daly MACRO {acmcs} {"ACM Comput. Surv."} MACRO {acta} {"Acta Inf."} MACRO {cacm} {"Commun. ACM"} MACRO {ibmjrd} {"IBM J. Res. Dev."} MACRO {ibmsj} {"IBM Syst.~J."} MACRO {ieeese} {"IEEE Trans. Software Eng."} MACRO {ieeetc} {"IEEE Trans. Comput."} MACRO {ieeetcad} {"IEEE Trans. Comput. Aid. Des."} MACRO {ipl} {"Inf. Process. Lett."} MACRO {jacm} {"J.~ACM"} MACRO {jcss} {"J.~Comput. Syst. Sci."} MACRO {scp} {"Sci. Comput. Program."} MACRO {sicomp} {"SIAM J. Comput."} MACRO {tocs} {"ACM Trans. Comput. Syst."} MACRO {tods} {"ACM Trans. Database Syst."} MACRO {tog} {"ACM Trans. Graphic."} MACRO {toms} {"ACM Trans. Math. Software"} MACRO {toois} {"ACM Trans. Office Inf. Syst."} MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} MACRO {tcs} {"Theor. Comput. Sci."} FUNCTION {bibinfo.check} { swap$ duplicate$ missing$ { pop$ pop$ "" } { duplicate$ empty$ { swap$ pop$ } { swap$ "\bibinfo{" swap$ * "}{" * swap$ * "}" * } if$ } if$ } FUNCTION {bibinfo.warn} { swap$ duplicate$ missing$ { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } { duplicate$ empty$ { swap$ "empty " swap$ * " in " * cite$ * warning$ } { swap$ "\bibinfo{" swap$ * "}{" * swap$ * "}" * } if$ } if$ } FUNCTION {format.eprint} { eprint duplicate$ empty$ 'skip$ { "\eprint" archive empty$ 'skip$ { "[" * archive * "]" * } if$ "{" * swap$ * "}" * } if$ } FUNCTION {format.url} { url empty$ { "" } { "\urlprefix\url{" url * "}" * } if$ } STRINGS { bibinfo} INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 'bibinfo := duplicate$ empty$ 'skip$ { 's := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv~}{ll}{, f.}{, jj}" format.name$ bibinfo bibinfo.check 't := nameptr #1 > { nameptr #1 #1 + = numnames #5 > and { "others" 't := #1 'namesleft := } 'skip$ if$ namesleft #1 > { ", " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ t "others" = { " " * bbl.etal emphasize * } { "\&" space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } if$ } FUNCTION {format.names.ed} { format.names } FUNCTION {format.authors} { author "author" format.names } FUNCTION {get.bbl.editor} { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } FUNCTION {format.editors} { editor "editor" format.names duplicate$ empty$ 'skip$ { " " * get.bbl.editor "(" swap$ * ")" * * } if$ } FUNCTION {format.note} { note empty$ { "" } { note #1 #1 substring$ duplicate$ "{" = 'skip$ { output.state mid.sentence = { "l" } { "u" } if$ change.case$ } if$ note #2 global.max$ substring$ * "note" bibinfo.check } if$ } FUNCTION {format.title} { title duplicate$ empty$ 'skip$ { "t" change.case$ } if$ "title" bibinfo.check } FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {word.in} { bbl.in capitalize " " * } FUNCTION {format.date} { "" duplicate$ empty$ year "year" bibinfo.check duplicate$ empty$ { swap$ 'skip$ { "there's a month but no year in " cite$ * warning$ } if$ * } { swap$ 'skip$ { swap$ " " * swap$ } if$ * } if$ duplicate$ empty$ 'skip$ { before.all 'output.state := " (" swap$ * ")" * } if$ } FUNCTION {format.btitle} { title "title" bibinfo.check duplicate$ empty$ 'skip$ { emphasize } if$ } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { bbl.volume volume tie.or.space.prefix "volume" bibinfo.check * * series "series" bibinfo.check duplicate$ empty$ 'pop$ { swap$ bbl.of space.word * swap$ emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { series empty$ { number "number" bibinfo.check } { output.state mid.sentence = { bbl.number } { bbl.number capitalize } if$ number tie.or.space.prefix "number" bibinfo.check * * bbl.in space.word * series "series" bibinfo.check * } if$ } if$ } { "" } if$ } FUNCTION {format.edition} { edition duplicate$ empty$ 'skip$ { output.state mid.sentence = { "l" } { "t" } if$ change.case$ "edition" bibinfo.check " " * bbl.edition * } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages duplicate$ empty$ 'skip$ { duplicate$ multi.page.check { n.dashify } { } if$ "pages" bibinfo.check } if$ } FUNCTION {format.journal.pages} { pages duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ { pop$ pop$ format.pages } { ", " * swap$ n.dashify "pages" bibinfo.check * } if$ } if$ } FUNCTION {format.vol.num.pages} { volume field.or.null duplicate$ empty$ 'skip$ { "volume" bibinfo.check } if$ bolden format.journal.pages } FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ { bbl.chapter } { type "l" change.case$ "type" bibinfo.check } if$ chapter tie.or.space.prefix "chapter" bibinfo.check * * pages empty$ 'skip$ { ", " * format.pages * } if$ } if$ } FUNCTION {format.booktitle} { booktitle "booktitle" bibinfo.check emphasize } FUNCTION {format.in.ed.booktitle} { format.booktitle duplicate$ empty$ 'skip$ { editor "editor" format.names.ed duplicate$ empty$ 'pop$ { " " * get.bbl.editor "(" swap$ * ") " * * swap$ * } if$ word.in swap$ * } if$ } FUNCTION {empty.misc.check} { author empty$ title empty$ howpublished empty$ month empty$ year empty$ note empty$ and and and and and { "all relevant fields are empty in " cite$ * warning$ } 'skip$ if$ } FUNCTION {format.thesis.type} { type duplicate$ empty$ 'pop$ { swap$ pop$ "t" change.case$ "type" bibinfo.check } if$ } FUNCTION {format.tr.number} { number "number" bibinfo.check type duplicate$ empty$ { pop$ bbl.techrep } 'skip$ if$ "type" bibinfo.check swap$ duplicate$ empty$ { pop$ "t" change.case$ } { tie.or.space.prefix * * } if$ } FUNCTION {format.article.crossref} { key duplicate$ empty$ { pop$ journal duplicate$ empty$ { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } { "journal" bibinfo.check emphasize word.in swap$ * } if$ } { word.in swap$ * " " *} if$ " \cite{" * crossref * "}" * } FUNCTION {format.crossref.editor} { editor #1 "{vv~}{ll}" format.name$ "editor" bibinfo.check editor num.names$ duplicate$ #2 > { pop$ "editor" bibinfo.check " " * bbl.etal emphasize * } { #2 < 'skip$ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { "editor" bibinfo.check " " * bbl.etal emphasize * } { " \& " * editor #2 "{vv~}{ll}" format.name$ "editor" bibinfo.check * } if$ } if$ } if$ } FUNCTION {format.book.crossref} { volume duplicate$ empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ pop$ word.in } { bbl.volume capitalize swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * } if$ editor empty$ editor field.or.null author field.or.null = or { key empty$ { series empty$ { "need editor, key, or series for " cite$ * " to crossref " * crossref * warning$ "" * } { series emphasize * } if$ } { key * } if$ } { format.crossref.editor * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { editor empty$ editor field.or.null author field.or.null = or { key empty$ { format.booktitle duplicate$ empty$ { "need editor, key, or booktitle for " cite$ * " to crossref " * crossref * warning$ } { word.in swap$ * } if$ } { word.in key * " " *} if$ } { word.in format.crossref.editor * " " *} if$ " \cite{" * crossref * "}" * } FUNCTION {format.org.or.pub} { 't := "" year empty$ { "empty year in " cite$ * warning$ } 'skip$ if$ address empty$ t empty$ and year empty$ and 'skip$ { add.blank "(" * t empty$ { address "address" bibinfo.check * } { t * address empty$ 'skip$ { ", " * address "address" bibinfo.check * } if$ } if$ year empty$ 'skip$ { t empty$ address empty$ and 'skip$ { ", " * } if$ year "year" bibinfo.check * } if$ ")" * } if$ } FUNCTION {format.publisher.address} { publisher "publisher" bibinfo.warn format.org.or.pub } FUNCTION {format.organization.address} { organization "organization" bibinfo.check format.org.or.pub } FUNCTION {article} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { journal "journal" bibinfo.check emphasize "journal" output.check add.blank format.vol.num.pages output format.date "year" output.check } { format.article.crossref output.nonnull format.pages output } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check add.blank } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output new.block format.number.series output new.sentence format.publisher.address output } { new.block format.book.crossref output.nonnull format.date "year" output.check } if$ format.edition output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output new.block format.title "title" output.check new.block howpublished "howpublished" bibinfo.check output address "address" bibinfo.check output format.date output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output format.chapter.pages "chapter and pages" output.check new.block format.number.series output new.sentence format.publisher.address output } { format.chapter.pages "chapter and pages" output.check new.block format.book.crossref output.nonnull format.date "year" output.check } if$ format.edition output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.chapter.pages output new.sentence format.publisher.address output format.edition output } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.pages output new.sentence publisher empty$ { format.organization.address output } { organization "organization" bibinfo.check output format.publisher.address output } if$ } { format.incoll.inproc.crossref output.nonnull format.pages output } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem author empty$ { organization "organization" bibinfo.check duplicate$ empty$ 'pop$ { output address "address" bibinfo.check output } if$ } { format.authors output.nonnull } if$ new.block format.btitle "title" output.check author empty$ { organization empty$ { address new.block.checka address "address" bibinfo.check output } 'skip$ if$ } { organization address new.block.checkb organization "organization" bibinfo.check output address "address" bibinfo.check output } if$ format.edition output format.date output new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check new.block format.btitle "title" output.check new.block bbl.mthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {misc} { output.bibitem format.authors output title howpublished new.block.checkb format.title output howpublished new.block.checka howpublished "howpublished" bibinfo.check output format.date output new.block format.url output new.block format.note output format.eprint output fin.entry empty.misc.check } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check new.block format.btitle "title" output.check new.block bbl.phdthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {proceedings} { output.bibitem editor empty$ { organization "organization" bibinfo.check output } { format.editors output.nonnull } if$ new.block format.btitle "title" output.check format.bvolume output format.number.series output editor empty$ { publisher empty$ 'skip$ { new.sentence format.publisher.address output } if$ } { publisher empty$ { new.sentence format.organization.address output } { new.sentence organization "organization" bibinfo.check output format.publisher.address output } if$ } if$ new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check new.block format.url output new.block format.note output format.eprint output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check format.date output new.block format.url output new.block format.note "note" output.check format.eprint output fin.entry } FUNCTION {default.type} { misc } READ STRINGS { longest.label } INTEGERS { number.label longest.label.width } FUNCTION {initialize.longest.label} { "" 'longest.label := #1 'number.label := #0 'longest.label.width := } FUNCTION {longest.label.pass} { number.label int.to.str$ 'label := number.label #1 + 'number.label := label width$ longest.label.width > { label 'longest.label := label width$ 'longest.label.width := } 'skip$ if$ } EXECUTE {initialize.longest.label} ITERATE {longest.label.pass} FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{" longest.label * "}" * write$ newline$ "\expandafter\ifx\csname url\endcsname\relax" write$ newline$ " \def\url#1{\texttt{#1}}\fi" write$ newline$ "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi" write$ newline$ "\providecommand{\bibinfo}[2]{#2}" write$ newline$ "\providecommand{\eprint}[2][]{\url{#2}}" write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} %% End of customized bst file %% %% End of file `nature.bst'. phyml-3.3.20220408/doc/phyml-manual.pdf000066400000000000000000017645751422404706600173120ustar00rootroot00000000000000%PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 807 /Length 1352 /Filter /FlateDecode >> stream xڕW]o8|wIERTQh" iK"+M$fᴹ8آepgfw ("PLaD)%4 KHB$.D$t!%Vd?E%|Bx*:ߡJS$5(VPRS>=+R{FD"𗤸h2A8YĒt(ǔFH)MP L@ 7(+&SZ3 20Kd,RP$\5 L3^! !)dz 8 h$gE "snH$;@֌h-<Z(f=:TcFbJɶͷT2ce0riWZ`#pJMn7?(!v3y]m]@®*x͝9yڵޕ o+w̛faqjWͳ~V\mafƩqD0t*L皭fKZY5~;ZmUj/n˔G/rYꩶ.5-z&nU s;+SGp;+6nz D13z:17=e\vh(B5ҎV3D> stream xڅj0~=JPd=@hKMې?ЗjXFQ@HFB !4 g/fu1)F pnm||\ WAHBLZ |_Ʀ 2RڳzUR61ܜ AEjPwh3O%: 3Ra|ɰi$-?pq*hjnM&I{ܟV ws-L~sƕ:XLl]C5k}y endstream endobj 339 0 obj << /Length 1326 /Filter /FlateDecode >> stream xY[s6~ϯ#f E!ѷMěLNȶ\W m/n_,#wn9xϬ~FĂExjA j,KmRUB< Zy%vadA7U!L$l"!+F~+볃[1auJ%gyѓ|-z/ )& [;y/C(×A[&ɭP՛VL?WYˆkh)`}H4ikQQ7 [,B`oiLX&&DRôdw&=g!0:.(`(:zV2[4Abatϙn7u(z4e'L ,DE(0ɑ{ӖЀs]3fYޯf`"&aT{v{ 6iQ!$7AH+MlN6$> stream xMs6X쾻R譼л7{<3ŝ8DOFGCk9 *46)niSmm?z.~ٯh0|E1=Q[B]6MZ5ۍf[# j&-y9 ۷2p:L~6MKRh{Cb>­!v_n.^4_i^z˱O>R.oޫppT@곻6<3=>Q"qز7;( Y=oWJ#ʀ(0tY~M)ruS9*P HVI#ҥ]@B<u]p// jO/{FɯۻJ~d#=R%rbլ#"1.A}/T0 Bx?:m>noId\EN<#˶zJf2w3sbCJԌԡ 7hotņ)F,f܄sWߒ|I% )abnOFh!=0u 8j7rxM?uL rg,;!]E_Yuy\t2}B5c5m֤jQiPpr*B0{pNvmfz_߫gI&lA, ( in&""Ul"bL`2sY&?~Ӯ{;m:j@(#ؘT[pԁrtݡ<8A HD VG Dž_) endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 862 /Length 2247 /Filter /FlateDecode >> stream xڵZ]o:}c8CEpvs-P]yp51Y[Fgdi>j[!V&SŰ`cpI3Nq>c Ɖǻ=ޑ0#b"<eC\_c;ak8P $8<#F71w̍!8YQd?d<^)ь%UL6a,78gQq29=pQ"?;1'q1d MNU@2cWag%iƪt2Jg{\Vqʹ \C0SD¸#f!dv؋q 3ղ{rXD4dHUlPCDHș w,92>G&8 ] zYLxO&.$Pch8C}DuqI@AH14J$!TJTcUVi$ҟk=EY*& Ei!!fZ /af'ֻ~$m~yP343ev#S3+S26ۏ[Zj랛~={{y~q<rK^n\. 3id۶?q5zۍZw _m~Z|4mϚu7_(İC|Ki:܌Z(ϰvc!Z|_]/' 3o X6E7xw1?Ոi_ϸgݺ;};_#᧏8v]xO/]RX4g=M`c`z~eŀ\Ǜ?ҐZ&n[ޘssniY˷f]}Y6 N=^A#`mNLuNuѬzsݘ->^N"ΜU'f]5*^iW_͇/Bh)΀h?aWwר~ެ}>o=t}Zz]B9gG[#1~Yh?W/wտN^߳ˮ.VTvўc9xTs8Vx!$(U0勝wgE]70fm?4 !!fDv/N k}g48Ij7J5\k9Ž4hBydHBAYX?R$,"N%x5-V$f8S6ỳ(G֏0L{])iQ 2Aa@ڟwu~Oc=\&Ȱ\^qQ7(=L 7M -2TւZVԦ'MQ988_DSM$ ߸LWMxis_ye>wKQ_o &%/|i2eK +-8_ZpBi҂ /PB /PB'O <)xRI'/Xb/Xb-âÂL&. NLD& IT<$y 2]^};ASr?1%v846A3% XHBS" fy$x>A+@)}BaBp# ȉ3>is뇂tس'N$OWh< endstream endobj 388 0 obj << /Length 196 /Filter /FlateDecode >> stream xeA 0 9զmқxWlNt]佐|/*P$[% ܢͦH>D)G@sDƁ/aPTV<7r޼zwuԡd?K_M1H1kG7N_S I>X=`xn/\+lBY$Yͬ4y2G AJe3O–H endstream endobj 395 0 obj << /Length 1574 /Filter /FlateDecode >> stream xXo6_!I*>,-]ҬCh@KF JJ~w<ʱShv};RwI,X,> stream xڕXm۶_4JXLi>(9v;.8x(Λ4ӬAA)/N5?&+`{[e:pCp9MRd%iCGrfVzd?w!^t86Pp3! qK/V''=]c}KlIv7m{[6nF4;D Upb[oC5nš/ vŊ߹;=SP3 #yp(ep}X:zan ,T;je!#2l9+Rz>|Iβ@Gǃv!Y$ DͺJ)$9aя% 4mS&zFLj{Nj?ƞ/UDן8|}:,\h }oZIʖI#J7Pi(vp~us3^?=i!^ii&2$q]od-_05 }t=RJcdN&M oSF͊ϵq{=[Wij@}?}z4bwpΗ2=+m_> endstream endobj 419 0 obj << /Length 2117 /Filter /FlateDecode >> stream xڭɲʁ I{V˦n-q<.d1Ѯޖcן?? /ZSU+-RM ! `;'x$ +$~Q^"&:c-bqG7?]y$2 H{X|`L$@xQ/{xlFfZO;>?M+YXYuc+>rFxw}_3]gdbǾ-.e8`KD5^502l ߭mmoFf6|B~`6m܉"qn 8iݭqw7+>nuu)b*@gZK>cw 1[72%$1f͘  HK$]Hws )̓L2̿9T$+-p)1XO5,.`X!i8&Bt MK v 0Pt\ր-ɐ&˱ ҩFiznJd@F8+ :9p~S/n$ aњu[6jI,Td2S!$|kJ^|iƚKO QCo!p[ӟ9YY- 5븾cB9#J׋<&׾ƝK,>n1F. 9PA?n8@JJ"ts!5t9pGƏ8.k >DAfȶ֦ASE5=: ؇ӟ3+TIK*DWgACm92U(0rYj^Lu;>r S1ˡ]9Po5} EWyp= $9)BbY$(?*D@kM_~EXfܭ^I)dÜ)x9g2D|Ac)'$9UfUrHQQP:RBC~=t tM]%i&[]='+; ,yv\ AsʫITSla(b@@ QAH++8蹈ԅ7jð8`GB3\Hx2`TLijQ:FfuwCy 4)&r%-.+*X{4kv}#/"¡a.);zk3~ޥŢ:ez0{r4dD3R>o̱u\ScV\/ jjr%b޺׵QY=⫯tZRᗞC)o}͍ Oiֆ^_zoޭOkR{iL{M9v{`v#/g$0԰4I͏oۺj޶ߘ~Z+6{O (7ƾ'7/\FG 5yd;pAc.:>5*C?2~<"*Q \?+\/ȗt,R vħS֝;i>~B SW߳fa"[~v茧U`#he%~_3kX.sD4 {5Ƶ#_7x cc"ԷgJkFq3H#6u8B"#/9x 옭;yB0P ]~ 5$gݛKޖ]w0=Xƫ?MvNSXFRw2 }S9CHi\%BKY4[ub`twwP 6~L8Wt|pm#'kzW9.'xuHߵ Iry:qgTRi,G[Lc3ni<3=XgO2:R).\9|D {t\E%#.D@?% endstream endobj 429 0 obj << /Length 2131 /Filter /FlateDecode >> stream xڵM6_VhRJOi'}vΛ롓 KVʖ7MA)9nWx8<6J"ˢM*PQy6[? w0mkA}jmqԘ쾃HS{K֞="NY KC H!BRJx T5nP K0媘A$9kFQ?qY4iW D r"gVকFЛK#o hR26`ltag@{4#2fw{y"u_[[Sl15~&EWהR+?HD$~ ȲošYՄN>Rn.h~'Zi e 4|` KDE ّ@<{rv: Ќ4rCϣ&S3AXVHrW;5e^~V?nJWk."'k) cCL7S!'[h;kxy.!{kO%BȧVVp=p6Fm^m>XDD;2|K+B@@g͚x`SA0 F"V,|,⭯ zPmkcS wͻ>G ϴK7<1WQAhХD9"hӼ/uy61CPҌi yJ ~*ƀWL+2H=, ) P[NԖ  .B4y>.X'X ̚|z04tc( csb_UBw6`$n1csQxX}RxH:iOl5Q/<#F?r&PZgH:=ώs%y.8Pqx(U"a{#ZDGeeQŒ$PjJJ8}8q ?4ufځDBS QBoe> stream xڥXY6~_P &@G&5Iv]oL>yLwWhm]*z X% >SZفrD`mGF끩#x*'Z.d^gHR+=?WTD 1_&.#9eM@u_НdI4FcnaC:T'0XH=p Dm3/]0;$78_`r9}qƗrkP[$I#U -0yd+ uN[0pQ'38#g9 p[,7]?%VO'#7~}}Mi+q%![CW?ě:#mw^k,x; ;/z:.|Kr/mVA6ͨf-a#gĆe7݃iH^9‡l endstream endobj 473 0 obj << /Length 2353 /Filter /FlateDecode >> stream xڽ]oݿBv?+8w>"u+\0mII%,eID; h9;;;dxt}9;/EBn"!-K,Ll}?\~L01ÿd*eupKm:yKE `K u {DWd+g?<I#+$Kه_CWtp$%k(aNj|z)i"Ч.}Îɮi{>lĨ6b`$yg_*ʼ)mIwAkvѽ|no>6XHivŁi- n9IBs:85A$xnן%h`%6x)$8t w" `竼 NBB Z]}i.e'/f'L7aew=Ţ}0>FP=5Nы2N mA~VJaf2!:A@i@nknyއȮpq'?||YRĿ9>z88WF/tz? T6mmn$ol=2|[@GrGVC.3Fd!22?,kՊct0O'N\L8 {D߇a:nG)|/>6jzq5Έ:Bk&}(eB&BA K{(s NlUWR2! h%V'0+ຣ'YŔ;:>-{ FD_j_'"($"PK|ᕷ^\(Jt@T NwQDw.,9A 1aw^<Ƀxpb{:g?:qQx3 ,̊IJ=C7 t_P%E^$X7z~ ~? ; L3t9 h֊Og`J rbRFO *㝟w8~|;nr sTMsC$jQC&P=d<1$,M1W&W;X2.k1Gs阏%fY㍘qwp[@'PT7 4G}sKRc͏de"YIǒ \}*ŋC#Jm(My^7MZZ,M~7 4'vҞ V0)$[GS<]Ӆ^ k6j E$^<;6 endstream endobj 384 0 obj << /Type /ObjStm /N 100 /First 889 /Length 2710 /Filter /FlateDecode >> stream xZ[o~ׯ`їC80nvha,m%%Njl7ids4Cr}Γ2y,Kˊ^1ImT!I%Gh)&\Xe)LC+ l∋l2<*.")*/YFEGVQi8y1Y9r'b$܉2>!~x(9+8r _ke”SE̊l3l'd FBF4et#O(paQ.HyAxa*f V^o MP3ؒ XYf蚁f >$U9 H6)b<转(ڌ*-2 ȫdLT"LɎ Iͨ2-Jг/K ob ERBɳ3r-@۲rG A^edL i@JP ȲDFĕ` {${(c k<0k"քDLr`E1C!%LD:Uk}+I.FՇ^frT_/Of_F/4N[[G[~wx>Z|wIgHXu 5AWHUUCxvN/?o@,Ěa{Hs޻M۱`FCpFC6&5c/n5\nSn9ԿTY"囃J/Iz)"/r$)HiX $_NY,Bf $NX9X2oC]n~G7?ЀԀrݭ[ڠ -QpK`Elb*@Rөbb証zUz_oOUuuuVᲙN'\ΫO(J͐ #05gs6Y]}y^ͦm}HL/m7v3y\賶=6z^tO] =g;S ýr%a|´kO+Ӣ[@6Jx/ ҷ@{]T׿}׆>E~d;[gpc*݀L8]OTsaȩl#hYg ͧX X7xpr!)D=pIM-q}1,*ݽr4I|oTJKR؁#p rţϧbXzC:n )-YN{e ?̺Q<+ס6ݿԫi=;X|h3) B %retɩ`rYvOFga3l:#g-^ԶWg)Xl `ʍM a;i{aچ~!RD|VNDdYbl 7ϫyo\T9W/zGz~]ƄܯYkP>pG"=%WtQ9ꨜ!pº V VJrC'{G$+j\TS OTVo(`)hTX]> stream xڥr6_Fx7dBߧ/PL۩/j4F 7c} c'fk3:S0tgs"H$9˧Fo}`۶6%ωIgm03y;b)zͨ]?t5>@O@_zYoPDs/FEn8,;PX3  Z$k?{ubc g/9y`jAwwc]GZ$Cogu n4GFM43l;@[IŠX$0 lOte^揯M.)w[Q^H'O S+]Kb*$ p(")8?'vEFIch *6!$+ 3?q>Y ۜbt^HlNuBɆ€KoP4%ݛ9?mm8IKMk^{1YyCpza_VF{=d5ۯm3fX*Y1YBxUq?Qul䙧Q0l PMiϮ1 T2P'7=׌H3J*ص6 /zΫr=0)ݩbA-翄($*jӴbk9W.jưPS6-!2P%i2# ɿZCXt 'D۔.[\.33 Me69BqQbnR,N:d[ `4MKO >aY4 E*?llţ3;"Ԍ"L32( 57͓9RO]%Eh. 0XgagW9@/ήH,w8~ʭ#k4 = ~ -[tYG DMCM aT5,7+(Nr.dڶҰysovX{~b")h$`̊o`poi*V x;g#PN9RY /45̣dq+SDbk7 aιQCRd|U&UI h_)fwE![l.l 5$4vO\Y?\j%C?7E;s՘JB<*{eP*{I^ewy9KPݚ{c80J"åy$ESE=RRNO`RwQ(ѠT2Qm*z"4$ ~xǨ126o14ISSRN 4qYV6?CӾOc*6n1 'R\2#$ԏ-@o6٪4??J)/!QlMٻ{#',E@7xM-::e2! $ƷQh> stream xڥn]_Ae)`EynEu%@ H٣!c%Sሲ }TWu8̓뫳_}EQ\ TNSpݱ)MEnoem&we=?e f[AX{[Ry޿AԦ9Rw4'?Ta37 q-(v xj-qq`@"~( %ܶY1=E|;ƙo@ #M(QIa'w3,ؾ0[Uc^)E[2݋+jl&Dҩ?] djqM= SbL/\g5z_~q0*^{w害o/ {3E\۴,'#2ixwK Y{#?13KYQ؝+1>=mڢ} 9xH<4&G=P87kb Mq Fw{^%jp NbJ%9j-Ǝq9 8)0"Y*kc[H įmkԚk{Dy34;2 =v|o+|Ep z_-Wсoy$g>V1w%~Ϥܷo;G R^a:LT0)?F=7a޴2<.^t`dS|E>CeNhA@Z #k5*w(V1@|_TT/1B,TM;&{K D91K"%x;PSyPP<7N!:BpmQbuX$p$oÈA٭wcWln'r纋vzӀ/U0^uޠ^%|hSm#_/={YLQҗ.DBf2{Ni\2"ӉCfښiK mCXB$Gr3ozW\"<_ Z4BaK:7]9^6nM/o`$8t ؜*}>5Xf=NdKv Y 9+X@d> =V\3V/Bv~j X"yИZlCEƩ̹u!hncŴ+>E +A%x~^ j~%E:d^p5 ,5j|ISd/$jr{9gƆyH]6E')๘--pfJ7!}k]g _z޿㵱+75;m~ 'ӯ/D~I+'K5|T!æ 'O5Pz>n2qiALO8W s-),٭៎wxp,(pPmvUFb_4{?MU9 0PxCc endstream endobj 511 0 obj << /Length 2267 /Filter /FlateDecode >> stream xڭYKs6WHUȞvj줲[98s%Hb-Z}ERhw>htn`DO7<|q*w@GFe H+m~<Kpӵ5S̄ޫjr<>i~S_P ӥ<-L>a"?*k֑q־hBö[Y(&ED0k߁+}3_uEp,KRoycF7,,V]L=5.,:x8K0*y "NT‡8I"" sBf9)Ne(/s22־]Ʒ>bUuq3 XeyzIt@OfⱬJ6(B(b_pb7g!Vɵp0?-œ\\hrd<nxxQ0\Q$x x=+!L "/e1t] 0 p`P5&tE'X"Cf?kT ,q_T䎧+@1̤1qQSB:]a$xJk+%JxFryD." Yedl|^81dt"}*TS#l.1'i-gRHNҁ6VF90jU<|5UgͬV:2 h"1;ݟD$WΘkD;ˍR+'UxqW\Wډ)22p:@-*EGI=ք`1)ob3H ~$'03hd0#u' T"u|OWJ<}TH,>%x,bHpmԮQA&ٮd f٭mjw E)nOYwwaq7pBz_?3IgT+v=kO fC=}dv:R/]qRf~x'd4b5>1쐀\i:Ш^Gty/)F<ı?7$GNܳ԰\Ȇ(E:|*iԦ—c S7ð MPJx|"-rT֌6큫&wLUirpOm&H0:fqEds.up"=\B%cﬦYf!%l endstream endobj 520 0 obj << /Length 2353 /Filter /FlateDecode >> stream xڥYKs6WHUE4밇jlj׵T` XC)  6JoR=H2=l",mT*Qx\"~9vO ?b9(Rk((HdERγũ{}Z,mgug0>~u˜UL|s*OBw wn*Y-MeS5/C=`a辠QY:4ve<6/,whZf:sYLAe,c57]/IQƷk3*G+k2v h]JRdzx,gy|ܦHI;@+M$?_Ѝ{pi`mG8x"KIAE{7Җ93 ~3.vZ.f "^AkpQs?HN1B`J.avu=f*B4^ӡb ; Rt m*oelbRƟPs)S5ѥر$)PqoϰcG&|?Y~فWރkK{W|"1Ѐu{8\Ge;wlFXBJʀX(3*GL@{"eg <~q?@/m/$:~ Tf}KXV' ƽE5 ?!PIl/JˀMwl`_ՌV(7GX[gv$( fv@qsqjjW;. "b^ 5w[ Bn-=Nz@ Il.HZ#)a$")Xcc427=csX`ʰ K+\lNFW<T|GuNziLA<6ֆԈ fcW ׁi)ZFˀO~E~.q@ Q\GB9.v4, Yp"#k,.];qE05Gp iS,j_ǟ-+de&N\'_6 kIԊBaҖ gp~`b/5!kifvk^H !MTt0 BېȄR7B.BtZ-q,*<- ;|@ #w#5U|1{"&O]7c  8}AP -2_ۀ< pTp & .= k,!zºNأ#\(sF1 ʼD"F0 01<4pG)YC gHfs"o ECL>"JoV0|%zb~<] vt^Z Q(N+t6G9E( ¹Yە`uxR "MDNWL~_YN̺[N.Uha];j ڼܓwYI^+XXtW) #9vxM_okBK,ʁ'M⽇ ҿt(Ҕ5CsPz{>tKd"?t{jXgX}il5!>#̉žfTͿyaJP ߋʽ0irt́ z*^aR:x( G#N׊Yp}װiqYl *;An=^kѫmZ\k^rZ;WZBAPd-Ͼʹ erU\'BP`+`Gm%ɵko0k˹zK0Q.X֐rމq%)e4CQH\=!;{|9Y/G恾U_þ֢njI',46˅i؈DQ@nI7ܪh\UYB ڤ X^͠ endstream endobj 525 0 obj << /Length 2104 /Filter /FlateDecode >> stream xYݏ6߿Bo#~Sz%h;lipeZ,9|ga[dދMșoQgeU_\xdF)d]FKF.)d7]^7^L|NͶuKIf& _a$ׅ,Y+wgaId.>ۗ<"+7~ DMAagݪ&߰ " vNK#ƀq9|ڎz[I~%)HЖ8+d|L <V/6zu&q [,mnj`W<.4|BoӵØiOsuf>zza49HĤN854âЙg*a4ypIۦm+t6`hBy4W.La`!dll*ڦC.Zg9 wv,0c*xCQ)p,`[.'7Xx74  lPp'k빺J-Udɂ?n>5F>w}$t'WcZ˨mu5nq}XD=pYiF^>@:A%XM{]H* Gw7Wۈp9gR3*՛wl/A-+=U6{{0*aWiݹXH$es _d9#013[0¿mr(.dܢ=(qddFXg0& لQhjek_jLK0{X75xq#K mޑFy8r)1,#Vr4]r0~(sG!r_.ᨦ'>/$Ctsihn3R . vPx-Hn"V~anmEvKĈD C@d'*5l$RQ'|V슼SsN1#L/C5}^pn9?8 KcW< Wc$]rޫ~BKgDjt5Kf&$7ZލJj1kB~ Qә3C01hKG3w4&5?.ۅ$KRƟ h*89O&D]A|ˈ5 \16xZ. I(HXil(Ai&^0(vX(ja 8vv_JƖP2#DSz: i6}4NviS_h._eu8{ɹb']t~LUCË$U"ѣ&f~oaŹؓ-3À:2Av8 vJCPAmGje<{i954?,h!$zI7pgNRLVJi1Ux:KU:myvbDm1hH'lco[#P4\@<#1cvCF]lb#D>54;jwnMMn Ec\|8/94/7x J >Dd2M_hE">'Yd$`.no:6 ($ +nV{4q}Msݾϊn ҇vS81'52O H] endstream endobj 537 0 obj << /Length 2342 /Filter /FlateDecode >> stream xڵYoܸ_!Z≤HIฉS_^E"9Z+V#;á,۽pH9;\Epb9s4- N&zڥhpmp!X? gJBg&]UGU~MM&zcrtFɶ"6SI$'$022Cu.[iu^i뼼YoDl&vBؙ6 e%;Yw_"hĕx8i uU]g-\!.Z&ח6f03tѨQ@lsT}ӛ5ٗ.+h ~2Uݝ-Eυ NJEXuZ]F>76f$oc$e ZY_{x IfvOZMSfMK>wyϭQ'Rc_JX[[_9 8Z`;0vF?J6EX*D"tZfTu@~b1a}Ì8C1YP ÔS|K<8P]L\Xjdr͡c4mmlDi<$z\{ZѮ g9䇢Η̟W(ōWjx$".Yc7As1H L* 1rI<_W*Qjֺ|=OWƙ{3!LM;@Pcj+,+ud,uEmbQ3O<14`^VCbJjMG;]eb\8r FE:a 9)tYv℃vi| ILR;W]aGTj{J]j">Cke/b%{KRY RY ēK|{(Q *?6 yq5}ӾWt1-׿&]ؗ7];s.s^U Nq$p.vywsfx+r¥G@p;9@E\+" >UY*mC,-5H+$D, $D"e<8/L6  K7#n.⩵I5>d:Obm=r~SBoPj$T,a‚F\+z./MwE 5 ~#)b׭MΑoBLylk;i윆*"J2(PGT-׸5*"mhzHCx IFS^ھo'+XDX'+/I`HBDL;` FUF|lY6r.7 (|Yx 4"Ckn''Tg>ށ`ʧ~X`3)Z1Rn(F3++YܔM6Q:d6a$ I$ =8 u_CMGD&C`g#is|{YSV%[i{ !iÐ\Oʾ~q BiE- `WOsz<y-[=0X|mBGKBN˨$h}8]w(1 *ࡘ…G^=,FuiHC{S?dϛþSI{pۅVUsbOI]U;x1uQ: gcYz2 endstream endobj 541 0 obj << /Length 1608 /Filter /FlateDecode >> stream xڽXMs6WHuL ssmZ{DL-6"TҴRL'b `xo0\7~?D*$(BQY,go`/X2"A&^f~\ίA4XQ  S U6MlA/rN2VѺʨ ]QW狉d#,&cmh/.e>h;3** "CrgFT;n"7"q.¾qONß}c\c6Y~";uB(c=9.!M~L{!\F),OK1qL{a{Ti1!՛҄{!OcBxD NA}cpH<һ.q4$bZguW\Wkۘ nuqM).m]od: 7A{4m4Re,~g ]zS)phD7,ZA`Xy3`^-c*t]Wv=pB/TeQQ,鞄@G*)=B{6LhϦzRй(ah YJ14Q[JRzJizDSw gUh6r8Rgrqr_"p>3 ozHte5mv{Xk2;(uz Ͼ=~XDIFHBLBZ,4iQ맛Y9bH˔mP%=ԾM;T2(5;ş3[6P,\-P=Juk^GXsCN6y*T9/V,šGucg3ݴ^cys5t@HOR5e@3gdL@s\G&i1YNNtp|<J9> ʞx$ďO/˳,_La Wcd&ֺ ~'T j`!l6eZ4u{P6NM2O)?p|\o#|0JdWɽQ#ICҏY1)u>|k$Н4kZ=m\]ws}mH51]\> stream xڽZKs8W(WEA9[sdjf;`X( I%n4![]{1A CwiI׫4\k|ž-5k):D9i6R|!X 3H =kpb,, hN=E'Λmt۰/w(C.2e\%K.ʯHSTvEyEە; 9 }A醖0֩@ ,՚xzpQAadDm03-O3Ä=ѡ1~ Md3(12VO_d ')˭I{]3e*x 7^^,5d6Z& fOmK̈́Ⱦj[\AR7'zؔN_iޣ00çNuArVC-CrOW87D\+w ^2m?՛*N=V3qT9@EQ>Pqf~b2 e\m%VFR,c~]T"< kmk$7k,Q3+,`*{rL\HA5:$0&2*mt\>4%5lQDJ EST_.OUvXHFkk;) RWq0_u?v̡Isoc..2[5 Y<{a2s 8>❣G$ CRHM<VQн!갍9KU"0ܸDŤ1,?wo+Z W1vC ׸]ѡ)Zgt*|<%smSfq3FjxH.)]J- 貅e +O\olp=#o;ۖ-D J:0umm3_i!5bXս$W?=c[D0H@I+OhB Au ~ek\7u mӅtaG>ߡ#vՀsޟCT!-ԔfB@yW׆ vH/lW{f_GCqQ&"_R#`4dQ^.+AIo Ý2\Z.| Vó:w0ME 75x,;L:)jW]SFQۑS0(p?jvJ3T>lxH}\rE+c39ךPS;j4EN[zP_Ǣ^AG)V]/w4M!ď?ejg:UɇkAY A@m0gXe15:FL hM>~}}kr][thM]r>E{ 'oEsK^u.>aS@ f_`w!|oA0vngTB:8T= )}(Vd̈́wUL8/_QbfH&jvphۢ 15SԂ̹ GcVE鶘-C X-CJ:T'ac!l0^Ñ# vX+48%-!aOZ + bJkߑH;TU<` //aVϝ=Ov$|lDh談G>C/0Fd^4oME'=UH80"ֱh=h(Y`/w4D8Pyi[ =Up5 WG=$W~_VcF^~S}/-]Y "tA|;Rɱu "fV'5LlBJch%gz\d32!iqJ8468̠MO`}gf\psVdu]X-"vcFh3089nPsӝ1d)3;ӝ1B>wY x<ÂxF.K\,],Y/H?}5qĉX c/~tHL %vZۖCfa/XI9T3*ƨv0"obTtPEG#!J\b]3-?eY,|*D4124`(ܪ7P@jkQE̫cP%_mR U 9mL^m{mTžUO+ 㦐oK.:f3KHc,|lRdp2i"baEsHK3ga߁z>~48NQ$:@888S_h]Ew ׌vCW\r_ j#`^q</ qv˭T8ҙ>)y$t4QFhWdž z~w8vL gQPk0\Z%`19_n' endstream endobj 555 0 obj << /Length 1790 /Filter /FlateDecode >> stream xڽXKo6W"FH*CS$E6hzHrw^Z#?%K;^#83d\qE߯/p2D=<,1 C՛(I-d56<,*/iDB{[l)?ѪǾ6y^7EwO2/*~(UQWP;Ifz2Hyʠ D|XNμm~چcL_]k&lK?sMc4oe" #Ỻil kCyYWWDCU-+[MjgNܙP1/(>xc e SТȣhW$UX7aHG[ rm[8O. pUu"t4[֎Zo k_WvKV}Ms: &kl0˦P =_IqMsea}m1ȲhMS˾%iQnS&t4wt ^0͛q̘j3LQSٮ2tn ^ N{DTCS&2?u s^%҇fW!@3f޽]_$31!t)>Z$2CLef`VP"۷}^&@m9I AzV+!sQHtwT73]Y!8Ød<ø0S}7I i<̠Awؙ3̢7 TToڜy؋ۋ/pm@ VqRtS'$8:o)HX2x'5-ͤKv4XiE,b$sf"]g\i&3 5x 8V@_SxYu*upN4#H]޸J<#lidM:WMv's}ט,|govvPEٶ)mӘᢚ>ORIfl_ȃo%^ʧ",^<;N9vz~<`\/>cǮlV l;EbD.+Hilڭb\M++N@alH"xW!/&$Yt8@)d„Zw({uˠsvH :<"kf28c= kZ*Œt8$D <ՄuDvQ}d][.B! $4\d%P,wqMyj@brh^% 31C0]TϚΖ;E]G+[ZPR Wh,/ +C nWA=13͈ F endstream endobj 562 0 obj << /Length 2256 /Filter /FlateDecode >> stream xY_s[ @}k$%Lr)-kRԑu@ډ5L_l`w ݅dd y닫VEJZ]FJKaTB]OZ_^xN`bkmO+v}BGF`YXHyb\/~EF+`H2Hf>^=12=hWcZyZzljVhꭶcمKM2p)~./eq)`e\wH.r ++6-6L%:(%'LTI$I ԧ"꿟UzzӯK tmp{_jƶ¸<ёN_zq0Zo/TsS@F m;/ŏ9ub|\) PK,;5*ei[vKf@z п9ߨ @i6k0ɶ9l#PVBƽ Ӑ_ ȨPw7L,,9{@R&7X!3M:}Nx_=ežǪ Z=DJ"ZD?{pOʮz6(0qh8 !<6}piW'urRdz؀ 3SaM;Bn}sPu\d0z IB 4BX \}* ;vg[?^LCF]u­n4[f1gddE6n3(4)Y@j.~:Y2ʴ7i~c:4Cԉ$Kc Z_CŸMw=lS _vܔ=ISADUh+~@CR&B?ln]d&ÆQZdc$+7JMy좚=e-0n;",񁚾VaX-pъ`A~F*y\SW ZʰXsFxֆpz:$f3硲 A m %=% @.כp$Hw5mXޗ~IyPK)ѼBQVZTӃm"_U m!]J+|x|#|*~q//8:p.-f=L07]Xޱ>\4=іQE2!M3|TѽC犉uѐWB6*}X̾<~V&|@hrPVP| 0$=%=uEp7 endstream endobj 568 0 obj << /Length 2295 /Filter /FlateDecode >> stream xڽXYܸ~_!%j-#@^^#< #^O~}ԇ5dC7bK""J\n^22*V&JDILH&ypS[%כ_/)e"%ھ^mq@^\v%aY2P"2)8ɂrWTK ȃ{ں(-X|s{~/%Bsq]cr[$R:1 YT$9ӵZ:ʡI@ w$u%< !œL<%Z猧o>{@TM]? ;(t8Zea[[Wg TNgƦww+rw;kLz)8X}X%ޚn"ccj,[EuDx?kǺwt共'56 p9<ݻaҼCG;rGBσH"A \~GIld:@*|v[O/Gixjm)&HJ܏{G &\&Fg_RT_pp Qwh*9¡k5hZ`aunނY#d /O 1zpp/['\Hg5$I+Ɖ<|OFwu{NWY=qT1$ O,(w!AV1:ncJ$%$@hT$w3Cu#*>i"*{WVCUPy|~qreQhnNZ@j̊BHq kd!ܚCR[cL'"HMQd$*oLj? U98dth穜&cŹ03!/Y* ׽#jH"tXWb;=n1o͞dm[ a~Q 7I7FO]ۚ Z0Q;R^"s%ovW?pu6w$.63jD[km9%w0ΞFK9V*ļנ^t-@1&~ȳ!C זOab99=YZ-f (HAkxW!a]v3P fќ0ĵagyz.v~qo~ ̂_0T{\vBNN$Ϟg 7EjA*  Kz@nI"-a;sءAj8>z2BO. ߲ \"l\ 9ȅEvrSg {GcIl>l)I.\ھ'P Sa-É+M 7LQƩz@wQ C_J2N/R\ΒB-(xZBqOj?pz%" P(8M{Cۆ[M9Im\ \>IP}l2Be0K0DSK Ê/*ʤj*(s_sJ^< }ЩdtaJ WPk]0=XL Eoǎk$G!U<|ޛ~06eILcear<,Z_|'=> X@Z|^> stream xڵَ]_1ȃe?cɑahĐ ;!LjMj(#/~buuuUu`w^_~w/$= \ CغvT{^&ogPZn)3F_O>TdkGx#{A@r^n 6aUػHzNvjD\}ۖ]ŋ>X>2PRJ#N5E_~o2eW6϶Yn@_ -QYt*TgLept`.;9wͳFDm+OyM8!36x(NU9ںr`,JF$iGәM!GlGH9T/ah^;C4yg$95XNA@p7`T#^>ЉL9ށ!$QF9oS:pPLRw/G/۞QNT {rWad3ȩi0v2}yϑ_WGazvc#>-L7StIJ&L$`Lr1VS\_z4#Yz?bX|@0/D7{IQ ;d9 ż!=Iȁ[jޓk?q(qgM} &y /5E3F6@$}9rhQ.s5eWWu<9HcS֗vaGa%aAD4!2HpTr!:*>d30s(?~;P,Kʃ ~o4=pBk=0 "0K `Keȕ5\z S?BDv@Ia (c}|1QUFg vFW"t"~:uyk?_ClBЪ-%'P6(TticGy!)ҢP0 `j#ҊX9DKsO䳧}_ߓ F,l[#*=oqKK9$WDʂѩ*Q,Aj$O -E-9c^ϾP+՘8PǸd!di(o ̌O,c%DD[uJ>:ʎaCә$tf*LGS+{3qChxqEŻECAҾ>Bg0X 09_~7%Bq,4kz4)F+CC簒85RJߚ,' F h7nGr+,QC> stream xڭXm8>"/zˇ!vsV(Ni)ʞ$\fMI"A<'_7x<, 77 |?̳t32ay]~?g7߾ 9̖4K8i)6[ >FϏQu.7ogHKt9$YA,xd#*L/+~^DT"Z-\1yKi8a" GE,~VQ?ӌg,3Tyi0W:&l2' 1Ɠ ~d<a=>Aeg_x.y_{Fa}2NOb?K5SٕXt1֭-x0Ǭ=U,x jAMjݍQ6΂T>\fBDLru!5*!3T$BASD$,QiH.U ,uڊ, >Nwg\F8Ky%$Ц w>]KxD<i kT*BDES״ѾPg%5~Z4@"19yIM[4T'ݺ”}/*t"Uz\3yN h^/i=Un9y=R{Pr3}\1/x|*ك3g6r :&xUQ{Uqoz9˵ K%wj_H$ m2ſ%/H &6Ԉ،x޲75G>{ GRAPb +G <`]jjjK닆xYv^-\9WlWv 1KAm q0춰%CaXgjkhrcyKK}mi <Շh4o$Yۦ!)v ‘&\4Wp'.iĦV#3/aIB LDlY@ eCzZDқ@ѪxHm8"E d _#j ƼB&IHRm k0 /btU SY(V#-㦪!Ӎ2_&~e3[5jžN%'~ʢ9?Dd]4)™: ${%Q &2ޡN[ 9fے|O.dV R:0 wC/0.X:i]O0ҝ¹{o$z3~uv;b$گaw?I rvfnY_JΒE>]})ܚ fi nU([۰ДG9j\o_ A.x6R~GvUWw`m w`Oj[S7 뼿1 ۹G& omjfI ܹC# \e^g$Ve?k1|^GyvW^9TP}Ò\›&;FeW[2 RHEetw7Kr8|6M@ܺ^dm^lÅ٣/ 0uXHkU EYb@``Rͼ4!K/=k9f5}rUpU7%*>(AC޻9E{7W #j0wk V~7 l%v:1/HF!‚mX/Z@srbCX좩?u%U|e"I:*2H4EduU.hwWn#ҿ Cnh8Z'!l> stream xڭmoGSx>E$! *%W xH%|goK{ˬwg]qف7u:t)qu:~9x5S7 )x$h.c~lp!Fk/W?{t($|շG)^$%.|rXtADiJ  CQFTb"y`!2?PD%,}fYm^w5_on?f|hX` yY\,"~'.hOzpRS~%(*:Ǥc~BԭN!8~\IśO_zq`I@[e%AP\vsJ;@SY)q{GzC1(#0ש֘=p8%ZX L^+ciB1*AYDACҸS(e1O~`UQJZPNx`P>Gȕ UR2J PfEWRY)L4J̊JPDM>H%d=SVE݆6iS)̚ XJb6b-(-MiD'ب|?)brt!04ijֲ\)>CdvJ" 9Xa۾%'بZ8i}b4TUOP5J gD#TOb\jމ>6YNeFZS:6YX-X@n vMDvK-7jcݥN%G1Cra7&&I]'{4`uUڳOҕK!AW}Y2鮑& ڛ> stream xY[۶~_鋩NA8;ǵ6;3%Tx)Qީ:׃>hf̮{^ | XY,j^-1b*1Ovv7F]^牢?ZΖ7h&~YH_\yOo:]Y=_H$ޫnUdUoWϖH$(1:XaFFW>1Fզ t`p'2yL+",^ʪsp"|(\czF:_0Hb锢"Ukj%--TAd'}^(" A8P(䴢bl%>{ .6N'@BD2:?iD/ԥ]N:Wvem5 /kPՉ _jyHPf< >ߦNڏF}~h#HB2LNu` 4_A`Nh Ƀ5>;6 /о O=OFF˯~p|Dqܥ.iuJ{4{'UgAp*jR է!)16}@7(*䃒b{<6޿(huxj?<>OH_&?#D> ,#B$s-#Rxd,YS%$>.!_@?cx P"#Lc\Fk\s]{G||Dֹ͂ˌ0(0 Є~-D:>M 8obeqO2q*R2T95F[S|'&cO(JuCL",O J͋aIŠhrȟ/ 6s]K?@yӮ6uZ)/ j~e;)՝siMW|׮-"[OU|ĉ]lC6MWun!&Bl!/"Nl8(xje}o3nLZA<BG,rRU :d;O_ش6mUZn͜DW@&z3`Y Vn^ZUW~4miƥ%Q˽ n5w=8x<[[Njt[kq< w/+y jk oRz\eW^uJ:UI2CT>hT,?VE~[Q_ <iq[WxMfnGE1/dP:!YmmRo/ǵeH! aR0u b2F.e嚫|X*a(ޜ1횶c޴Tk^C.]{=׬cM_U-uFG x ۖ͢i}*`"M|[x6ݹ DLm8И;#u/ $䈗clwK UZ-vrЮBXx.FʪuuҩO;ƚD mU醂 1*>zwq l [1h3K0Sb4u!}{r ִh*tP[[Q<˜GcMǣn_3k'^oN&ޜ (Qx߫$Jc?'}v] @fSc(~'*+J2},=w|fѝ9N%=o&6Xo-|s}5{j$=9n!wzڵ{D=W_%Fr}{7pD,@̕8ArDž?2R@m)Z&y{ol kX츷O[NJY)Fڮ.yv)5_YbP)8\rSx758D eU4\{#=']UL0ؒyҵ6QI*ӭ2 H6G}jTIKtmuH1BHu|Β*7!漁 =>exʹoQmQ9dE"ag~  ,TXj)@ƺrW4FCתy-\Fz^PE\̘uC-2 >M;՜<RՖk7 8s1!eV2Ja`f\ +uya 9ZM?w[8Ó1{ 2&, un+뵛ކB^A > stream xڭXْ6}`K* CgŎ{ʉĩ [bN TK:qBIU߮8I#-2J`Y"M}/I7QdfneI2i>zsW&4$Lk]F\(&`:69̻|3jmjuլxܮnoH2C\1e@"xRnU`$쓍 F26eS:}IRKyS5)>bN\uŸ Eeb:Z݆505vl,ˌ}S vQe*U/jt2žjEi&m$ k>_2]yai:Y lQ}ay]J>?&V@@fD:b$,/x".2`@z9m8|]cnNݢPx*D%1(sZ|?y尗[8,[.s)˄3ń1sT̰Tfze0LyeW<dd?_s?l6[[ Qtr')ˎWʊ; ̛ Dq Km8/j=jթ@r5OQubǮ|"Trƍ/ vR9B87F=ső3rz~ {c'yxL](.(-QI T͒J"ko$S.O:'ؿPky״H#'bNl\!5[\,\ZRj2N6 B\P's_O)7 aՇX*(lv= ĒӦ'aɽWx U~e\>l}w"p=t-=E)š ڮ+)Z'4C3ճ] NM}n٪H9E&m@HYk/|v%7tgS'iڍDk%T"Jظ js: 3T.f^ wEHNiu ZΏxc,[7 užxE?3-tTaL7η7m{k?Yb+N""h{I NɆ}A/胐EŠpof}b#[CҼh{{H`g|wyaCKaCX;y_ghX3#eE1m2Zs.42F9˷7m]{VFg_a!WhE\vxoJsw#w~| Ņ>U@:r9K޹WeTb (]2L41#|?c|nM"G\TkN~zvP0ug'ECN#J -l<=36LìӬ<Ѵ7?vG <@ PA*-&=vNp4iǮ/ 1q?yCB=M릂` Cpz(u%(3-2?H>AKPRC= z =A5 ZLΠ%*HQKó%fFJ3T5 lr)S2u$9p qpnaC.aJW7ߓإQaM7SP_4tI w1􈺞Ծ@ jpMT.hnBcS1q(sW:ޜ`>a):Z/b \@ endstream endobj 489 0 obj << /Type /ObjStm /N 100 /First 881 /Length 2321 /Filter /FlateDecode >> stream xZn}WKOWWW_aN6Hv$ =PXM/95$% )l3{87 W6> b\ň\LHd0frG20dC d0. 82k%g({Mؽ$V.&GD=E'.a # #֫g57oL4mYՃl[O fabEַϳ撚FD v8}--F`%Is&^6i"Z1K@p:@$!=fR[bjm"->(߉CNz.4}DjBV]Q҆UCjϦ~տ>-_PU7}}?whm-*Vm0I;jݏSjNc5dȖ5Ō. 漍Eb ciEV<nL]8  (} !)M`ۤPyp7pZػzZhb#R-fJux?cPD}S=(iӟ=LѾslLhƴHlv_pV+FbƬ,7 |Ðn5Φw\ɓa5`N0OW <#ƸTy)rG@hQex<ebuZ bAhUO[t:Fm &RkO۬gLc*aTDRT]c6&PӘ)=$SczL>jx1{Hci !(Jg1b\5*0QE@t9\! |*R ga,-o v+mς'hB:iBZsVBG-Y_#-ȶT 2~5[n'Ɋcљ<pegB`Z@{g㴃WP%}]s:hnI{ ;d$/tۡ]s\kv :rF+TuKyO!vd }kQrCj4SaSa jzX.ב3!HRU!8E񠥄뭱(<' Dұ^mqw]ܩ1x:0kFF*Brv۷o9Jj;HguzXtPa?_"n5uƾOM!x-;PHeL2~RB/u*:'g8qޞ\δZڞhb}7sdOF@FKR2WkeW՞5 =B¡D m{ioD8{uc9oۚ A~g[LN;igVOO^TNWB{r]ژ~_ endstream endobj 608 0 obj << /Length 2324 /Filter /FlateDecode >> stream xڭˎ>_ L+Iv'X#9dsPYHvfCY˳\,"Y|\Vw?yz%tJTl+Q ݬ6?T;!)><;UOk%kӎ lq,՝5ieq)ZE`_?~}ם::t}^ =Ga-`; G^2LQ^P֖EW20=O×;{sZtg==>ғБqb*?W"+*XI] ՀNqe vE[M*V֟rPv}+]-H 48 _@KR[pى+X~/A't[VVxRJxxE#D!2|NKRRKΩLw\OtS7,-XFUB}OZ^ ^xv9-Lue4֤SkXϙڢp{;"ۺWբe{"~Ybho\uCYozàeƅ싯.fR{B(˧at ΃IB6=8Ӿ_N: E%E1X-ueXQV9a!7,~(u鯾-ڲ6;TMJ+TKw`?R\n:$͉Äd9 h˄Nߨ6jXh=}`~pE)6Dcˉ^\kPpqXrJzoJ,R'Ÿe_UjcMReÜkTa"!*Xp:;hgʺ"$!Rm*cE<,]`\ FKJ|gͮ⍃@hLփAXL#w|ߦ0Ok+Ma*r$(?H5L?džd݂.}AHCS+~]#72RӶ%mvяa^Ly-4;<wqZbN N Zr!pr8wۍ 4P)MkED0e!lصˉ* j~Ǚf\ܱeQhZrO3&, 5Zr|PLt$37q-8y1?!ȕP[  h"tKbA/.dZeh0UZb(Q! *C:&Me`XdrRTY֦ :&aKQJƃYj:  A&RSQ*9=!pm7o]6% xD+$6Dk`Dx4P}n_]czfFj:'#8xc̸O{y>2S?3YQ7svBn7b7w<mݠ"ʋYv%vuWP9Qϛw+ endstream endobj 616 0 obj << /Length 2513 /Filter /FlateDecode >> stream xڭr_n*cdrS0UEb Ejyߧ/PMoR;`h4 G/ {};z* Lh~PF^@Eֻ/O~īR:WYhj_DJr)/JL$ RyէCE\`2=3Al$ ʈVlb>~W2\G6^RZf|j*u۶CB5(}-_EIg|CctW1I`rúꇞg-#l ,O&4s5fvGW/}9H;+?Ƽ+xE~ؔBneA!U@=o%Md޹kC~Pb@Ģ8Ŀwkg׷; iL(;-\rcL+ sΣk^)"xn.EH0hi[ .T5^]8ZQ!C"?CHy/A?Q%Nv%RJR9i8]&Il)%.k% )X yv,eB' ؝'^(cN% <!C]0a(Rya94%1>t~p̤P/P.)Eʼ@ZLdJ4[!y4Ds Gm@;<72-d}W.-% 4R/yԆjjՔz2QAi皮qT t`ŰD X9@1IPsɍ *cwM=T[ *Eej?;bXT;B{6v,Pg˵.0FB7_oU1qBE}Uiũ UWIhT: `dM}ׇ #rdF +EjR2Mʯ+>?I`\QI$j:凪ɻtM8XB tΘSaQP½Ñ?FL^0ADŽn =n2;] {a(aNP\U* ㌃p-6lΎK5-Շ\!ajb:'CB\<=!@kyg<|-sE^pp"(kE;sR͞P!<=WP}Ox^ 7>Whx,Pr9>nSEĊ8TD4V]8v3Ǽ*ZLPk֥2M,5cT_mBJ/74Y%joWBzb`]H1~?>0 tp~=LYN Bd`)D!A/$ endstream endobj 622 0 obj << /Length 2417 /Filter /FlateDecode >> stream xڵZKoW O6sKl51KB|)S1\gU󫑳>ɒ߿\IsVh-gY}+]mw/rZ|!V2I2-wm,B0qfE.l_5n\ il w}뎴cUn]ﻕbK)buKh{W>{꫰V=ҋV?ahzOfõfF*xAUӥ}3NKoDcIө-T5} VL?`Yt_f! * },!5eSĶuYӘDf;M]˿g:잡3| \JڰDRL1bNB~@:Π7פzvO Œ^Dl[iG򎾷 qWo 2:ZU'VB7{:0~$6|0܅Db8<.yf8G} |)%$@ʓL> zE4ܩOAOFizlp = No {H;*pQ6-ڎmN!D 0@C8!_ @M[췽ǀ@=@D8c,m8ujk|{X j +6 NLo&maSSs=`4"PAJ%<b[g !8e.j3Gqw\OKbB|,72*Je{kJ>R bɲ.B'l`GIV6x6o]=U.ȂyzVdYPPYz_^J&3nT#C /V|k؜)Ep>ǶueZ) G5:N ai4ggJ} jPb,8 (QI @ ͍S!/iX_"mnQ 0qf 9u d@9sDgt Bd,7>)XGWyDJ@L>maMW$]  hĔс* cXe,--fQdx&efPO Ό&(hXؕh JqEX]uG`Qh:YGb+W F/xNbHN !.bEć_nafў6#$&S 4̀JiAĭYċ!$s,dWUqݻ7D>pace)`ʸ4NEj/=c.2b;98Q- nW&b3FEqs .{='8Z,U >m+οun6n[h9%@m( D },k뇎 k'Uo#}mx>R68R Imۖ5-| 3tgH|J}z<@dAG:'òR}p1L!_ʻxl:> stream xڭˎ>_!DK.E6 FlĉaGjIL(R!}MZ3E~Tut]_߽V+3߭D*k*OE"]oW<ױDBG+kJD:΄~uTqvWyS5[*'eCW6<|X~ʒEJ1káuڬH c82Y>e=:BDe]kiu~8Wx tE~gMu Wu5~"POLu::pa<N] U0E_<^|Q9X~U"աe) =9$P|"Q. b8h@ݒ$N4[VN@ӚI@䌸ɆyhQW[9Or TjX*)D>x_5Mi5%G)-Cȡ"]_ qJ4z* pcmpP6 SoR DXe=or}G9#ʲGB/4y JD;>"  xVԦ^Ҭ1wf@ Cq|_]/Hwn`puDp7)v(! M0A?`#K&yBx_xeF:Qe쒢Y"\w(y#!X6YR^%mbafˋ/IE^$MV'-ݣ5P+!A%]J']I^U,RCTkg3~1٦(/ T ݡCndJ#ȟ\DQ3ן]] TR:\$`ƚ75J0܌w@B[QSgec? 7hDQ :AW̰xh# BzyRٷgX&:ʚ~`8SF_e* $<xAU AhG-CJ=3^_;ZxK<*i\&GүXeZ",-艔a%nW̄ P&1`4#-ܗEdw_B„\5Q?uh97E?AZ+;6 &-sw|1ZK|Q>e.ah Frkmn ʼ6xPvEO8=eRXi`\ ¤><pI NM=[+xѭ={s `/9!3/f|)1O)k& &r3 [ۥ)5R@xq|0blJ2"Yqix6êbIWbBd)E>IbOn(+X__VZMw"ic^53'Х1YR;jTe!RyPm}PSw@ǯ/W<;G:NZW-)oJ P:"s/^VC E0VVDvQ 5^1qOBO?R #j:Y1 ixy6r|cX $X ͨk+ 쿑5r~ιܱ:ޖ!=Usϐg3玡w/ s۲"VA@|5w?Îd4~=C~i=d߶B&윽fyX`<5E.!ct fi6хp5R endstream endobj 638 0 obj << /Length 2795 /Filter /FlateDecode >> stream xZY~_!!V}Lv6 ~H=c$*RLyH^b_UEū*^߽Rv%P21pάl,4nu]ZJD?շ\kDGs菴FߨQԗZFoopWZmR ǫʄ}SZj)/q翇hd%Ȓd[ Zx km+__*di]jz憞ո6:52ж6ﹷ˫*MƤ k#u@T[6޾Vx!.UD k52oB`<&g"<`|bG^8_ IZZM{ 0O |y$aޫ(~K'&m_4$sՄUjOu@pE8y;l(ߴM1cdH%+< (ʢ'[^>vtvF` ]S#2L84ueCGyϭKN9ka{X٣LI&p7=ܜniߌ0wd!GTby jSh~q*K+OO -qFP;}~ G(XUWhe1XղldP$7~. ˳83,m.3L~غ=:\3  h 079$@ƻDM'Fڎa2)*TvH {x\%I6jȔ# P#6Z .Q.lNA tN^PT<H9/؀ \YA" Yxj32ZOIGIXoӴar-Debɹ,'Rҁy{':j,䦓48`iget;t0`;JEFn8M%,ā~(P\hi]S-!z&Tjm !a\ Y&SEכ@sh ) 21};q \7OSxs"]PN(8.iYYj¶$\ڤ<*6O ̟3CyTRn]\tn>C~ZzNj7@>5=TK}hjO޾Ko4m7 }Ps%WᷯsoxL&D\Mix54JEさzZ.aWua+f{~B]2 UT>ī- `.Vo$&տ.InZPd3Yd"KSD8g=+POR? eWGFH f ej RO?]ԍCtv.8ALNF}3t@s婨 Ԡ endstream endobj 649 0 obj << /Length 2572 /Filter /FlateDecode >> stream xڕYKb H=Z6w#ۀgF=fȟW1KX,UzˇX}dWf{|KLKS{W.Iw/??&70ͣejiMO0X Ѝn.Af%<6_><=!)vYV⛂\xh?,MfD'S 5L6|ij<ȷiJWt'nN2 2z0xڷӎO{Ak˨(u5 Ǡ]ܺO0PxIWD]K@W,l j:`US-m`A#wdPSJ9~]FE״޳h3Ϥ[Zݰ z'=2r9ۨt6r"|qlƇ+iˬl(1'rؼIjG?Q5_?ĸ$wER\+P 06^A(#,k _K 8 N#vptf?i\x*Ms,6G]i=f A++"lnvMAöApC&F 6\WC,|;BlflqT0vn۱Z* لzk(~J(^q2̊Q Il湿?~KA1DZ)๽l~ ]~|C8BbNKbv_2qѵq ı[Z;ڭԡ$ضNc1ӌ6L\*Ě^Ҙ .tD|./Qy$ўtK\V|q`j b~O `)*X(eFE%w $WbҼx|ɌY{)E9/i!+ b_ڙ/[ɲ[E׏, wthi/A,^$ kS/,\IVtbhAKzd,"p/|_]'~z]z芑 M9@s%/!ȍ h}}f9ā{7jە&gG!ScCߗfq ʇi]]QǶ:bti[0Ruc0Yn&_peE*ƃhPйMP{K1wR;Eܨod'̵즠EfEf-n$PO5JnPr]5ncCf#uHFᾫ^e&:qw@.">kg5$WYPItFvMnvȂMd(e i6t9!6x需b/4g q |-H2 r-v6Pֳ{Bћ 3=R{m&:zc J?cDYs* inE0$k) 28 K r!8ɨmF4낭Xjz/0Ib[=4憛I'e&il2ͱՑia7d>S Zi^pHa'kJ <;&?:y1ћ :DZF#/%":~MlUܐgz!i`)i~58.>v\SWrq{ &JJ#@' rSUF*pY֔7{g8dld #,(.M6uM@N]ف 9oj#vZM!^OX5$o/LDQ?/R[ bB.Wsgs*r5 kahPKNF[ OqEsS@۽ 2ũE5 O|I=Gi$+A@6| %?hYˀ\U;ʩz)zV" PS*cyV:Vp$M3!ɤ olB܊_Pmr=b!Kyї: r RՍI[jWkWD j*\,lzmX,!7o\&LތzL§ZWڅHCΨS#"e=o7[iTĘ2RX)@Hbyl(܄J'VH† q]&<=6_:U2pZ ^FF呶XKEp($C_'nerQ(?eWOjiKjnfgmʃp,ӝɳkɽJLų$0v7Y,Q&=r %C(kN Sr24z iL^4 Z:YoNPbsj]T7O׭eLxO&8 endstream endobj 659 0 obj << /Length 2688 /Filter /FlateDecode >> stream xڵ]6=sOڛEJC2i榝r􁶹ZYr%9\^$IWUUo^}.IWR"MJƉs2R竻޵IL߬U,d޵uǽfӹ#"c7-9 ߻ډ{ 8vo5Mp䑇om|tL?BR 3V n$Q6,[|\\[=:[nfȃ46cSW:Tm$i?>H; @t[:(ߣ6SIGߗ[>6c*T[\ nZ[obiUd71@˺!a]Dr@=nxm#mmu&;ZHz^4\WiBۧ&՝ v`ެԱb0?dA .t~C֯-> b^1~1< XVʄ393ʧSn^}, wIiѯw?=?XZSvĎ|{ D5Z?? +qJ4}:h=YG/UE2)ATGu8S/Bgc*<UXgV/)5C{7w8Y endstream endobj 669 0 obj << /Length 2652 /Filter /FlateDecode >> stream x]oF=Bm{y޵ PE{D[$Β"<4y1ng?G])5*#R0TRvc4bV%߮H9!9AGܢixYoBH׌̽*E;ťLrlv|**ZuA[ZrAHMҎ#nj-dMUk !UY4bPZ0AfT/{T; 2ƵӺ(kqӓzuWU$e;Ч- |_|aHQnMXݑ@m;v|_"TЮ) /?\Ldɧ]V ^Vw˼"(h^?΍Ij_4 qD/&Q(a?8)ccivNB.hEE!pUx7Y#8\-jY7n,Ȑ6^֯ r6D8l* JbEr lR=U%@ bh b!5IdeTS-J05 .0宮ۮ(ksۢ{o]XЌ_J[ReN!Mfݔ[bfɦ{1 }F%8y z\e^2%Ϭ]|rCq $uI!nUPг$NdEaʃ)+ ~ ##TT6~<f_dR;TY҇#mb/.¿b|>bB 02.*]@+0~ut8J{W:b㥥5i$H|M5+'Z.w7QAM`sY$'Xӟ Ϝ!@q&G-"$`##B@oI7]E&,9x v#x0XwA:(NݖJc b OY`%Xʩ 9Dk !9 |8p]a> /c=Fu| W3aqaIyRP>Wp\Ę xH`ڵ[O")єfhTi@}~WR`` W.ZkCѦ1; 7(p**T2jwշ hm+ˏa32lfM3c]ByBo^x& ˄OGs1n{FPt:U 6F`P2B!z }a0!.? |Xz񒀱!JkD=Dd2S](XКdr7yy QUԔY%2l֍W4r9^H5 UpT.A*S"͠9gI&WIaǍG23R?ƽ;"c*SJz7܈J~`C" f Lp[4 ;&8[dY Ob/b?7;)Z>튞";&{P; (֦gG3zރvt~** v/cTp1N>qj's +s IR==g:ӟ2w01-gC,? JYXPJKAW$2;b>>e؉N9=OϋS}~H%2R8q̡N_kzhq*%gň'1~۳n,?,W~Ғ}Jpcء!(՛{s~V9~?4W)ĘaE=)3l"YLǀSmPk=[!sB@W:3_E.ܷ6+jӵͥg 7Naw;cvբnxP,^Ův+~u.g 1Ȋ`:/(1 T?4{T6v`gkP@g*uTX\pM~>s 񜣊q9v:'*<1ĭ|S&v0^ȰN45b*?!* jHl=7K endstream endobj 674 0 obj << /Length 3453 /Filter /FlateDecode >> stream xko~ xiM]Ң@$"ʶz=;áV.%IQp^MGtE~#si-F7w# ٔ3f:!y|(\?[JfR wa |2)&9i%M+t|ԛu[ϰ p ˽,,K`|1'*k&q)~ˊ@ѱLy ,.MsoQыͬ&|3IT夨`åpI1i͠o`u9+oZ(*bJB殂ybR5|ROߨYޔ" <9`CNj&6Kz)rn1+k) 4ӱTvFU+"פE0p"a10L+{e2*?:d_ ^$t*LhGw8l%Ƨ^bZNraޭ*Mh=j~b.¾k?+hrxޖrF0+[ M͜f]Kȶx;iF _;gNC1VoSn"fI>Y3<'ؙ?\-)u=k/xOHpF zW~+ٱ#7֊ 7%e.NJ;8:c85aG$T=u~״SPWFKia' ̩I+`Uh̰Wdx@nnNVbT[20v(A@VY`Ϥi1@R:\M.eƪ])p ̓dp`}[xM7hSNVKZ:UQiEYҍry04}J4Md,@!qB<@M3:Qd $">;WJ~uw'E4U,U[ON92"ɼYWÇ^uf!c*]ɾzy+Y|N<$iUgILsfTZ 9 1LndFV;S}x'ngr29Ue~;[6}dT-cdt?c48 @ LHqcI!tNcG\>F]nq! lg8]>11C=Jk;%x^8h|WĒ[ {\dzb/ Kf%tx|@/pz(G4؆E`(l+1I@ӥvPL&C>:).Yuy; C>c7 F)Ѐ/#:i4HB-~b%CU4AzӤ>hEDgCK@ b[ԻeZX9ԺW%e88_y`p%xK44$$k@Ma1mAOЀ/p8,(̀qf s@J|9푺=ԙ=G0ϺUh{43p||Iߡ^utRHu0zXg:J9ҎX)0&@P"**ɿt0/ *3Gjyߖ[dtx<_|cVc܉[S,4 ^ =igK3 эmߍyo0xwlUd a| (Iތp7#`,Vͼ PjՀǂpeoF+,ثl>)D枨m䬝s/~BC傇v!2C &~JGSx$S֍9̔;tfo/Ig2X8K]㿎)Ղ)ڊ` L9 oD{:[^3HJ 7OP =MA,͉gӴC BvH_"F=qI_ |A..?pl~~4% $͊@}((%Y=!@WYUXaɯx"n9}T-m=d٧yYXHg$/hYz.t{huԸ[Vs!|'`Y!h\rW cì) yb1Xv˷djB!>&˅/sE9*h=.Jv߽/rc2F§DsW?:CڌqSLl< |f>G(I_k+Nm).v;B֐dl]K[svOt+YL#0,ȷ@OYxkZ <#iwX|,;lˑHRbe; T{  6D% >UR=nWoaOZ@4KP)D*ȚTICHvT4fTL>@x`xg`jj=hQt[@ʰ/0s6`e > stream xڭZs6߿S5I:v7wmnV]eɕnʖƛK"~? 拻_^z1 !3F.oKf^\0z-[_]הpO14 Kj/yvsEVUMO"qjxV{Ell6*㲭@jWoVB3s-~coS__dv m@C@]"/#w~=]$< R#х*o86ԉK *n2#d"=ȡo=uA=.m=Q J*I0cC"eU/8֒=g 1Y}EZ>~}](:6X ڏarR&m @|緻 9Hv8 kB1h.u&f8L}bhi jˤ,U~f?}.~*8"` J+;[5W@XM>Rd\q%*"Znm[Z~]b~9_{}Y/_Lά#c2I'pƾi| "k6m~ʍ<))i.rGH쮖jw HHohxh-|F}yTh 5~͆@<25zF( V(3 E$3wT'l"<{{a4` HYL#qaBaSo!v+4A 2|NH=8m[a۶a7eMUi?ou\ӕ~ozȿCITC@- fO0xI!pt 4۶ f;gJsKqJC8]?(=h}ޔ8)czSAS""1W@u`@9坃 rK~tZ׾sALQų0|o|*hdoWBqJ9?]|(w/f ;y%oU6%=ϨuY%A'te }0QP1/Pׄgm՗,;P>̤xʜT5'T_E4ex:)Y?sRP=ᛟT1C:?,1}/ij`o!.xzFgLW1'T"<*LD&U"ܼc fOD@Xpd3P JT ܻ,ϝP 8aQɔgJ%+9 \%E eON8Eyt2e҉>K'LDAj()rlfL/_ҳ>)5x'Q ?%GYn> $y~j~{T9ei %Ɗ|cm,P(RR:u:q,l1\=՞S>ئ >"`ZճpuC5PbAC 6DP}{I`I .PN.;E-TCp`%H1X#h' A(9p`5P D6J-Z,; f<:Vd(OAXS`ގ?*N6-Vg,>y5?]u-:Yuv'>ew?운6ͬ%2V/GECRXSd SEr'#.nS8b?VbdY0qiSs cmZjV~T& GE$WIЋD~Ogm7p,x \2+x*͞A㳬y>/e-CL v!G&J vuW%-Z9Nk4PH'}_xa^#j|ߖ힊*$;)Qd_cʀ 1@zT㳎5XH;8Κy9HNP<e0慕AvxE}#@ڰ6ue?0aJ t0:qp+qWOp+ܣoz"h>*0>0o(!+&?z?࿏!3Bm6?!`Sڌ5D+wnʦħ;AmcKTpܝ_R[ŨN!_`W)cc DLA~G 8Չ||" ?eM)碒s"T ˍx+VE_Ǵ (>}DŽC sh3` zZA "5\6qyx'ŨSZqFF ZTx O`T(9W:ǁʮqd88P(0m_q|c/U_kU=K#0 $8 abICp wEO:^ƂgNIR endstream endobj 683 0 obj << /Length 2611 /Filter /FlateDecode >> stream xڭZOs:Sxrg^6۝Ӿb+fd %9۹D$ȀH?};f?DJ1)#Lr5y=gJ8ϯ.ot*IV;s˧Hl[y;= i\1+,|%s%ʀ_ BJdQuhv,T5ERFQ"w֮ܛWiM,_*̩Һ !ԃ5A@_{Hr J ,h [9;S?'ԛɚM뿡h/~\0،QN38g׿l ^)F?hJ bexиr (1Zzݿ̯#'M-@WbI cHWEjLKKXO13NXHxq&&ZZ)lМHʧW$ՄG/P$ 'TLhvaTÚl iqg'[^IkkׄK%&,߰"9 ^wɊIEڙ3 w}{_3*y~Y?PSF;^Qrb,X-ˮ}I1I&Ca^MV͛ݚRX ƔAYtۧI&0(HP*Diycv}7FfCK a>@<h}+rHY`Uiǵ*~:0()F]?<%YxK !9-AbX)Yy4hOGqEYj̓q׃ݰ1F"FwBkYsWwcA+xyƑ V@PhSd?6v{R휤iR!ڥ4 )@tdy[=`|qC=^Uat֩c"',XU v <݊;q~a37r; yH,``߼?cb1 @D'89E1!A*]ft\)(N(7'`$ JYN7lhʪd-lDXpEy̶۲{eu_Y\ .H /kO/<^Ki 1&b M8'ڰFcpW«DCm;;hCb؇zJr꧳>B N0[%_B~aQt\rI]k|0 _K4PGqK8yOWpM^<# |4x|4Gr* 0pK_:l'GD[hf34\㡧&̰$;vѦ[M?;' gNg!8slڥfO؜8^@<}\rG/45ް[ެ+=r{}:$bق4?0L4pL!45?NnMp\0}s{_xmC 5 NyJ~qui!'Ն8>9E'K4ȂO8[sa+ҐcEA~&yVa8 @cY biwXr5GsY 9Uyg5G>W>˸24޹cc%HC(Wo n72q?5ͨ ?[ČJ(ïׇA1ٹE7Vk?~~b9ʥiO^:\hfˬJXt*Kq ,_պeuH\Ͱ B! [do& ? endstream endobj 689 0 obj << /Length 2750 /Filter /FlateDecode >> stream x]۸}'DCdHAkgIwC}9b{7š/6I{F!ypn.._(Q$@pɌA7cX:a4ݶL¥]s^Ӗ e8-/˥]zZnuXp#\ (ĪS+%ѠxFms-$H(.,TvQQ^Wf)O" Tf"XƸ$Sڻ9|b4`g4#߯--oY3¯y@#>Xbά3TZ6[z-Ah%uF)B1e Dɱ,+/Gɓ,[wE0yumLSqx+v걯Vbnlب=& j>tv>Ábgn3s\lKA@@ ;U4uCV yf9+^ZQ 9JxAFt~297h**Xl.>΃%{喯mQ=eZ5֨"T)5%}(L("h^E na;\gSŸʨRi'8 /EF>1g2*<Hz‹#( ~ ^]`J鏊 \đ6ӐNEqi&k)aezcl4 x~ֹo,^g_Bn/]?Jig01LhDـdϗyU|^<{ T3 XQ041N(iԧyHI׍&J:硖q|PS|ɣOr}S"N\^)q'j8 Et,Uŝ0Px)<' 9 y2Ȑ y*}M|RA)ҧ >џ#yTMPej(LO)=%Ltϣjz(_Ί2R#H}'d+%Sa(Z.8XQt  'R"w;g+M3QhbÉ`"&XG/ $ɨN _EXqYDZ=嵭u'5Ka\oƕ \\GE$^ ~kUӷ*ki.yλ7Gdt6S"ƫe:_}yWK 'mO?ﮉEٴU ۝&t${IuXFdp t& Wْ?Y[@Ng*[[3xYлCS:Y%8By;v;26]W'aedVOMs|Qp~?;afDL7M'F)O1{B8 /F}r^wZnzAe F`o3Q^хM&:q0Pb*\A}Sf endstream endobj 694 0 obj << /Length 1854 /Filter /FlateDecode >> stream xڽYKs6Wp|17LC:MLJ|L-2tXmJ,OO}a| *޵//N_I cdt%\2u`B">Ɵo_eY3pbzvڢ-*/  O,2?ٙt1|Q͠mAx2;SEkU2FhǴrwbMie^moEғ(E NOj:S1Ut&4EQSRg(rڻOĭƅ4~RX̰Plvfͫycl|JLxAʼjM,wIkGie04BXbq|xzȍE>1(AL2ІXy.T ^ OsCyz)5WWdxn'Pvf 2Z0Cؑ.[P( WM=? )AΪt??eͼ̋`6ekw]v S3Ɇj{L"nu p2oNX됕E>?}W:˾;|Gfd<\NzGJ9tvGA6OF!͎({h)|v~InpZdwBZcN#DP`?n9BDU[Q_ַ-\Xm 0f cE]y}Bw8@Uޱ~a)X @eeyKQı]OŀF@9Bخy PR%*72dhj0- 89o4C΂:lZ|^"x XA0ˆX,gOp·Bz"*yK&o;t7K  # ܨ(XQiX$ǰU1+y B(˛^M @o]c= /:+Ap$  /n5H\&J!ҸEJ')5dUjs?U"Xp 6m\*;"uBZP= pך;p;Zy^J3^h}~W&%J+ܣMaNFJʽ]ǩdF:cɃ,J SFE*l#tn/"W2a1'"V(&w"KXy2'<#g,;J4E8aXIOj{c`2477ۛA(- u\u8tuuտ/#~8GK3: H*'I l3,oc_T拪8?@;7D.8ê$R&wtL'bAf^o^#8|"!髺˄U`@DmQ++Qeh!]tzP ?ǯgV+JP&$6@ z @XWAȷbǵsDNg};̻͟;Z \40't#Ȕ endstream endobj 699 0 obj << /Length 2229 /Filter /FlateDecode >> stream xڵZKs4Wxr`Z .]0CY&n {K=Gؽ8fˊttc'O N~+NHB0EZDaWbu8YŸ?%1f*!D#̠Y&\~Bd!cBDD`2+]ϯEt=7ݙ)cNFJv܏Nj˝~}78FŇ!&&'m> AE43d}4 qsF㰸Q)%"F)њ#E3FI-5=v|#,A'u|M]l}I{FA DqjF EBR׼xznr[|$3c*ʷSZe_'ߟnq^[KJ$CœأYdNչŪȻn;0FHtSWP1_twʈAXvuV-CFCQ5/݌ <1 $L)SDGLi B2ʾ @?4<A©2 O!2ƾ `%k3@NHWg6f2 CX!`OIWi>Q0FAs$'\\f=7{nx DȨ}V ؇a1(: )RhfʵDFK" x&s]MXWy7?-U v/^e^,ˬP:ƖFLv!I.Ē${JoWſ6?`V!@kmh90a\LSW1~na609  +P9(oozs|A94cR]&qjf_'B9r*u5$I:*MB2qE"P׉dW4)\چnm8Ogt'D{"ܑz:6(19RQ$>qPu$V0υYJ2u D PK @Dt1`肿| @إFڬ?ň& H_HqN z8YB~yi:*u0ᕿTgn-jC?R_s"9Iv5!&@010k(9`zwkvDfM懭u]3:nmx޹ꃀBFQ!LsFO,5nA=h4eﶄ同4+l8@e4P+,ڦ̬om,25w(MVC%[ܝEJ&r7Bٶ0%V4[l;+ԖǰK*a% Pp$e5!gsu;L>} FmVeH=jc{5$װ܌!:ji ҋ$00k3/I% 5WpN/,&k㪯ZG 6O%iXRNⅥ#RAق֟D/H ׻z %A OHKKz]mJhobapBFt"NKZaP?= Mk4'mTIz™r؝BRPXtڞp0پMm\w&{fۗ يXSml}t!m6Q}ֲ-`.oA5f@քt@ y%M P4%> x2y&;z{ endstream endobj 706 0 obj << /Length 2203 /Filter /FlateDecode >> stream xڵXo6_aIfVHЇuk [`>06kՇ'Q-Gɺ{#y<"^|{|_\={s+%1R-3.rx<^a\ ,% kjZomwv#Sv5>{%Ա"!8٠-WRdOD(KjF8v[*[q JI+*gƑkѺi[+Pԛ&y\ŇБ-]:jMG3Lze}\*h0R@VSZSYg[\F<[Σ ٗؗF:gmG͖dt {IoɄ:pl _M?LٌY}g=/RmUSiD8];yMmۮ7;[FR\96ZQgk )W+ @{B1%ώ!-2 #Hc< P Bc;b 4z;nK-ЍوlD7(4 `#JX{= >7%4Vɀo'݁7ߞN&^/?_Y½_TTOwuH13 ܈Gum}BL"B:.A!egv :XmObu#nؼ'ޔ-},6ڞ Kh`G6THc(uW( W@LʐMn"[ "v6.3.f0A KI$bIr%Vvβt75r->^AI&j6|ا2ŖuC}vtb/\2ۂ`D  @4QQe{D 6?q}a(Q2TYHH${cRs,.LvYs&)Œ$ bD,ryL^VC,,D{wHbaRe$l-Xҵ'k$GBkb,r-^*!hy3qݾw$=E]c멤@ad26ʝDG!؀n_l8siɸ?}ή?< ]H$gg)$B]71Rr$7 Ռ_ oT:}-17>(b0 fx?rVL>VhTxцG6-Io 9UTLvŧ 8 7 gOt7bTM O7:̣@.sxYsĢb >H3S$P;#1ɁUO*Q걆F 8\7T=y3eB+j213Y\o7nuSa{$ +=*,ˑiKs8 eR%=A> stream xڵn_AP9, 6m{cR%|ϙLѱhV}޵x/O酤$yGY@ ("K`U~E ŶN7iLMRMn'u$0dJJgU2ALb<&1 [`d:!|LgquY5(7kQNgLEV\LgBL>T.pt$T%(ӚhPEiI좕!AQy^԰vQ݆OI8 l@J:Y2d麰0K{jE99]̌%CB].gq[r55*E/E9i:4VU͛7?YYvV2j֞NLkWim@">vqt*ҋESjp: [P j|~ h)`$%!^y'ss1Q4ޞ?$bj/7"87 HLʎc׋b]]y Ipwy$'`#q! `FLyJ(H3X!$a4/qdA@-l8Ƙ%|֚"}Avj>®to(UDUp.&s:q6M RIbDdg`P^bD^S8#lf1raV>v>;O_SH]r G8D{Rz< g?)?DMDHED|^B=&">Th 1+|K]']"\ZAۘ~\>)PQU\ 2u ʍ>h ӽT!1+ r`,w`,W-µձ"seUWa,{jWH,+^GbdgW/֟~/"j~jɏ?/1s^/wTu,q*~~cȒN5K NJ7[Z .*zG1/}= |FXN0fs}]_A߬ 6xa[;Er;>+f2ޘy0~ `df:Qk=zBaë7i^"u=R$] 1-KN(@M3m,l@JæAiFCLԿVJ <n2hs0c$~WzRKAK ;pJv.QMdٸ bezU{QO7vpYPUUuQiȠ{&ђ"5WY􇹨vI\{5B}]g 4G.Ji ^7\t.۲ egg٫4Kr9TIR4 A?yYvP')׃ TN[e!XR))4󙙡gf:=Dnj@UTh€qAΕpJ%;飰(|ev)Вv*ۀ>YzU x/l[XWt+dάeٹu|rv3iKpa'd'ف`^ lKnVe6lNK=-˻ﺷ 2EBv\MpY"8W_EDP 0@i6L"628swb{e7<#(gT,m]ou Z'bh4=U/AU 6Z/ii#5D>a_BY5y ?TGO Z:-0*PDޞ&bJњN겲).@ߔﱤl^O$k@u ۊ$k@  ZQ+t0Zyչ_Jú V@m|qb"j\ʱ}v#(Lǩ 7SQ)r!ޥ?$n endstream endobj 717 0 obj << /Length 2325 /Filter /FlateDecode >> stream xڭZKoWvx (&"6I3T?(rKH6U_WUW}<&8rﳋT$ #Mf q "\'EGzrBrݴ:/S`,.3L1p+hq-VY[yCJ#wav^/TպX_µ _:μ/_-uoiՔLֈ* 7V&U,%\qkf3oڲݴenNpi^﫵dg&_U[.0lMS,]OVPG1"bz]CA̭1$õgMW-`$.Y[vt# j; .eH0`Y٥WoBBw˦#1};櫆!*ĘIlv2p'ӬMšs-WeSע||jEs.92d x6zQ+8tLü'rJw>0Oqb<[U q0(ZeO'hPWBAG?j(uq8zdF2c\h:p!R>. nv Ҵ[$_WIgV41J:M1aqX?fMz=D/\q>4^ͦv2:k =~ 94|ϰ YuQppnBf[Wy Tua#4F>B!B9 )&S8 Sx>r8rFG(BّQ rwμ;)y Be PPPv4 U)Tn> stream xڵ]o۶=BtfHmwph[>%R諦].7/ه3r|fɸ$Rh9ag닦~qI6E¹,>qFOL%r`k,nm[£n,[M .+zۚv2#ZvP^3[34B+.^Op?V$qZ[Qd~osCQքzh8[M nnʲA_zէYSg4^6L 3L@݀m?˃Hhmi5ũHY`x@)*̠N-7I)e+$q^t}DnAsS#J ʄXf#j ?r)elܔ=AY->6UQ޾YlLU;ܭ[?0ErX:#;c>89RJPl0x@;U&<Ș7)N&lpEx!kwo9rҩ:| G /ЭޙT(cm}!]C7Rzj?;;&-Cha-6zBVCivб0f}lK$|x g!M!ʓl8ŹKƿRe> stream xڵZ]o}ׯ.wf?f0 -r[$hoahHro{}ESE pI wg|DLr3E0{\ME!M J&$aJ&%b9^LI*/!F` 'ސw:(/ OPb%\)A%P]b Bֵ"Y"Ê>y af L =QdXX9#K .y1a`2 'x bjF1 И fM0U,jJ `*02'gC0C.q%U`uRg`Mq]*dTPZ$Q` Su(׋+Z%"@}%J_BP O4}U>~L O,RT=Aիۘ4 VnVܴ?/̪zծ>T?V?U߿F],G\MWZ [SykU$$!D15uNiq}Ǡ8z]wHYSoϋO%ؖ;`~G2%aA]z v埢g5szQ# ( Zlj,SyJ4D(VT@?NQHo}E+a ٌmn^Fl0CaP1'r# ZT..WWEVyfsMU]nkp몹>>קfu^ƺJʒ-X FT< =`[1#B!'#eCGƆs"sy:ɏ*R=I;En2+`ۖEs.e.rl/0n̏.*RA$?~j -=~LT afzA<N۫3KStdsh-nɅG@'3v]'4eXݷO.!kvnn_nXmq<?wb۬+~'=L ?'$.}vw7v|'~"̨ 2:@v>k}+X;_?l=Ud-}nJQ  (BOgEHrys7F3І 1nf,Z%M*b)vCѧrgjf]/oy348J8 ?h@MgglX'VC,uwT-:6r{&=wHS琼ak endstream endobj 729 0 obj << /Length 2406 /Filter /FlateDecode >> stream xڽZYo~PئK6 ^l1fMBRbQmGVnI:>H'F}?E[?ߜ]^kpREpsp1t`"θJE1$xt毛ř4||wkZ2o\^ ='5JvIn§[[>T"Pv1R1M-oP ##D7cb5?_0Jzm+̄Xu0 INc[$ TXb&LX-ɀ ZYgf¶-I-켵 zAV4L(0iqupSչ)JΖ5"b06&J%!7ڌ?E:jΊRiͮJV|BEކQ?[[Cėշ; 1/"" $D%?4SX.K"w0Ema &omCx!jp3 r̘>fq*q {n>H񃘄h@§]H^_$<;߃TX/oa Xa,E?L5ZPdmsUfx,fSDby^յm,w6GiԾm9mCsٗ3ݢ*,I|}{QFdO2E "p/ QiQNYM<#N-WKZ^/T1eKh׶#%|﮸LQ1؜#CG" ROɈ$NJ9"9\U 1R0%$X[PF~*-&HLkLX 3bK&(rŻG"([F5/~ɐ S5?d{2 U^efܾ2o;;r E.&I|D* r}DP @s@zqycx4f%y뀨T(NO@"Do$f 3${hn8l~i n ˖ym̾nsTˊCijÍ"I&XX&MkvpUnjj9ΈQ  K#Sx',/=>w781yu9OLy{1b[Noѥ(OI´caz@n5fڧ$lb2 +zf%><<ߵ6,Ar,˱fmuRrzw9wE >3n2k3I)kɺ[*,+4KO.iD& 8 ܀Kzo>="Q? .yb$U퐃9e*D z)4͋i #V.1~j]FB#RRƮc#wnr1pӱe,C aigss7aYѳ{GFMYcruyx8 iU8% zkVڹm~=]Ɵvu-E(D\\R혿n e70BёOIJòܠ_F"<}|u3h =Q]^9V<[AM3CafuR[оy폯S#Rp3-S[Y"@%&}#5rlw!H{$QLh=`xd:Iv!2JaY'!:~7מMp>7͠Jt >lqgX0Ow42X`yIs-cދS@*9E׸/E1>ng(x6b'E#pV243Ӏc(3SFHW?ENr}@2t6S4!W/Ew}3G7$|FВI)OA; Tlm35ßjSqzO4BqP* l,zkfQ!t}pȞu < r?86rF8g#ĩ!رˆxLv?|?<ԁx8-۾}#9ӾSGJ#IρσՏy':oe(BOS08fۿW"*Qv%CEElTY]ѡ;"H!hiK/WT%r/FN32PfrO̝%mVio8>[#]x::iTM_)kl@I>ܖNH~m^mN,#Ozxěk6KhTW猢JcEoͺĀǯQ> gz[gUf"QœpKq_Ynܡ#G`.wx`K(= oʡ endstream endobj 733 0 obj << /Length 2479 /Filter /FlateDecode >> stream xڽZKϯ zI6v ؉%X/ZF)RKR?>U]MԴ8{sznf| ?^_\L#gכYg1Lh;^~[xOWo`hZ Ɠhen6ʬv|Lj햧:DSD[˿:;G1L~K% BoMfi)bQDQ#tƈ<13'E>HO͘2n"ce^]b!IQ,Nz^,:mVgAu(fcѭQNk/ovQmsjCR"uDz%#xdr>p 7/P[86+7d;|l4p&'Eo-y4ѯl!||lL9wjAFFr5H˛-G)X™h}͋aD)yȟ iw`N%ohVEJ0vP 5W ߬s4v9?~W4lRWrSU4^S6L$IBCuImZg4F8i;?0C|QhfbتVUOEet,vinp>6| `h"h 'g0b2D:Οjy!| !h42mrNZ=K"#*J`A%B"LgbZzŠnbʈ`+O\~X\vҢ^K?azA Wʗ j#+ hmԘ Ӈ˿M`,P1:1Lj)(L F,_%n. WS|B}K $4I1y̸"2_e*yh - endstream endobj 737 0 obj << /Length 2840 /Filter /FlateDecode >> stream xڭrF]_K8ƜRr&+-NU r$hݟArD DO_0ط:yN,Z̮nf\L)9KbθJgWчl.36yy~6W\Et6EuKjqϫ__(d8߁^_mcmi״{D0ywL$Q!lC&U::09 GJ1sKp~9idKݭ,ҫ{ g<“hiKZ[-u З3ؖ7E~]ZoζdREilq@ /fQ0Ļz[.a5OO1WMѠSpP:`8|)v 2LB4 3 qڣY 4=m4W {N2\.$a)ũ .L,@3!plY$&L@ψI<$%q~.#8IG2e+瀵;bPқb%? 0G390c&Nʁ:?=™/#@TEǾ־9Y|C^^`Xva~ 4=߅!#C G2Bљ`"^H 92" GRL0s#i =82=2 GK0$y<~.lq:v{oAnuQ޿9UQ}+EkY^nV{O\# {>AnAaKicA<ʱ`ɛӪ>j^Dl=!;B~‰Oђy#)#*o>9R#()L-7| XSl[']ʴ U;]P~ IgL,!.,V9V9^} {P%4 ^Q3}M0RhSu "ns.$0G8̀"d!)qrL l&dŭ,*K\g! I%=m+ t~31h#;o ʎ16I mFy`Ꜥ+,76 )PG *_7e@;lӸlm淖jIyQXcqUnuK+'v赫5vz} 琙K- `Ƈ- X.`e_Q6C?b D! ʐzsL˅ϦA!DŇ8_]Jx0q< WI\!~Iq\ ^p\pH Z7XA=V<nHfu.C#5K=zDEܞCW`zZQDt|z'q\CmR=d<> stream xڭ[]o۸}ϯ04?Ejb 7mqLd;6~"P)ز_R"gΜ!G2G#<>g+*FT:LR|$1AbybBXr4zazx+.&egl*+u+{{`/7Kw:+/ȸloM{nNV7360ZO. 8O,Vy]鉴5WT_>Ϊ<HyQ֫0EMB•j]ځ 4Y4ţ܄pC,U˜P>8"()i q4܎)/7fTZ]C`cC2! bBńEJSE 1:(2i( KZ2KB^q՘ )nЇ :ۈi 4Fh-IG*PJ88;TnXD:VD=4F}N ETX5 [ p2T$Uӣj#D^F9xX)I9R,dƔBAz“!)x9^!u1!֢o2a<фRDWk'gP/mݥYynwid\_1`i;1o3s?*<Gqw}fb{ʰ8 eַ}3=wlWI6At._+ ^1'Hѝ8JZ V6֍ޞW_vl|8=roh[\ʺuHA `+ endstream endobj 748 0 obj << /Length 830 /Filter /FlateDecode >> stream xmUK6W9Q@EiIAC"AJET]^gȑk'qSjGPxܛ[2^5D.@4,y!  f4/!礄e/Ko4n.!Qh|/J_-L^&`#3/(p1G_!h瑭ZGUz?Hvu2؅! NNBoBOhd#n8q P}[ʽ 7V,){v,ǯQj< y~:.AMf5ZY7zK/=.G;xXY.w)xϿ?Qcnˮx2[$x]Eeu,hhZ% SܘْEQªn Ylm) l(~l ^&PfMbf \ endstream endobj 754 0 obj << /Length 2554 /Filter /FlateDecode >> stream xڭ]o+T_%@Mb袛Ev;B+,g#r>eČ,uR4zhu?.|҈Er22!MOO%jEČ!Bs}/beccEH[Kb~q7՟.~ &G\_ 4.&LYqbc i<>*{#E1L>6CKC:w1c<"dfTCL֎9]?2.I6͟޴mAyz=UH7}=Oզr5z%DXຖ1dp+S8,(mᔟw!9x\+DfUEUza9.?d??Ϋ .KK qHb3KKK}6~u!RiEf1Cq`)Cl 'y\oN%KA8i @ "rrUKNiAJ>d 9p7)[<֟/I%EZ7qt6ɊNΥ_fABLĤ*Q^Nˤ=ezږ~ZsEYt]f5Hc]k̷P )aP-rKd g1 <4z.~bF\z rUn1K9a|3E0Xdlq.DH+#~VZX!B F Ubfϻ1?鹀ʨ61YdMaW_\v- 1Sw,G|4B` P+[ dg)T(\ H B>ěJ= E|(wj(( )"}(5r(( T |z!2EP+ŹP\ N'ca^\Y% mNfKW`eMV s.ۉF<1,s 8o,j000B!> . 5 }C C0(0\lENz*I|҂尰XS{8Y4n H Q>_}jUøbx1QaV7_;^҇b4y|*~殏D$[@A5VeMs3wc z ≯!d?`&_DZOrܞÍV5,|{ˉ RaET]VkB[JIVq5,էvqX1Dfl!Y0Di}ηk?3M6t}<q?A4G!;t$/q:Ooh}|zN/ϻNDbY37΍+E~YR$حɑlYpש endstream endobj 759 0 obj << /Length 1438 /Filter /FlateDecode >> stream xڅWK6 ϯQ&oAP rYAc+Jr'KtoSE}|+갊W1=b Ӭ&͢xF$?7y_^יm:}JP؂g@uD(I*;ZlɊd1cx}~Y{g!mbGo1j0ir#JO ,t 5/p99Y/ZLgto] KK[s!.,Zctno_OUⷞ"(>h,&6CRd\6i)zD?-aZeiA MӎG8 7Tr:7[第:i?-cZh 8.v8Gs3?hg RLƍ^ƅתB'E.8TtVkQ%~pYoq ^52`#+ !aDgݡI͡KagadIJRT%i8H`|(MKh \%Hq=.@ryN$&O؞LX2E0q/Vy`&T8.T44OĻGRAt3vFYtӏtxbC,Ս'(D7;j,$e=)2{?(yF(F{9 M<cNœ@貌rx/c˲igA=q7H퇮Όde< z j=i 140 k ']@W!Q4#׫P)u¸eg=uzGebfz6hD=^& "1J%ٲib<$ӦӃ7-k]$ZwZq-*1SӀH pЍp 0;u`d&GBA>{xB O0rx r䑋"qu1 ;t3'4;w'kix?~,8leh)V6HSJ +gd~y~) =Q?X̕S҃h _R& )"#H`:/[1`06`o7Ool C/ mp oyآVVUI+I~AC4>\ endstream endobj 764 0 obj << /Length 2267 /Filter /FlateDecode >> stream xڭ[]8}_)%%?=J4=ҨakJ3@*fG{Lt;7 !rϹ #rC =X('HSFzs4z(D_S7ӖX%svW7*RˢSč!*VQl-1m>O?W޼[y1" \ 3)'BHuGX*y OD:w}GҦ"CfLͿ\_6\q5=nǻ ?i^kI<'}vBʴ(&۝; ]AP0M?Gv@c)y|!ۖb%!YOEV$--&?" bDK"gO`p­c:/ qtH]XN8\.=ahx0]A+$]WGٶ(ϦMC:Vmr -!mÌ*:ljͽ KXar7)krddXE ɔ"]2H<&*ե!Nsf5-BBS|e3|)v?0tħfQ $@%tC[E )"Pm^k |DYX.c~M8iְ7"gL!0Oq|?w6;)];$![?eD0VYWbrM|e@7GDk0:A*cSqeZ=ʷp8_ ʣ|yH3qQ#+ɃX5%G #ƑG#A ; 3$GyA `bL0A'k,(%ģL;*iO4vøGj-.x; nhse2P;H>'kz7ay @\dGć )‡(2^P7Ί ؁c>">fH1DABԴ~k',CfH9@a-)(!II JӸqwBsb(ć d "}"(=&4{~)A_Hlnf$%8~^*&Lz!S(AƋ<϶Ϯ"G= 4pp-r`ÕB&(n;}bf QD s7)!ukZ!N_iqnRO;κ׉OEn91'(%KqOeVfm#ql dQ~CZqpFp\㬹>&eBʷ})A^ /* vAA5̭ݑs㱨W!yJlVml [Y=lAi()A޳Yz b~BL()A>Yw.(RT1d\tj,5ťK*{C afjiJ ב0i`ItL!&hӢ10 BӪETïz jU!7/q1R2捄M4!*y)YN7M_2Cs؍UgNYeQ]SPU4݌tROw/s!v_cϷl}mHwZoeX={m:{zk@`wVM"WLA&.I|Oť bbc6Y5J8x+lfU<1Ғh.2r)sI,u endstream endobj 768 0 obj << /Length 1459 /Filter /FlateDecode >> stream xڭXKs6W5-zh:MI[]2IDۜDw JDX.von2^4\-^>lu .:s\0VCoC,?.~[->/lȄLyyvzg6L>YbmMY3TQjA(5yn(m{3~J dRX9"L,/Go8Nj̈́,rKwߤ[uV3c#o ,䕰yN*VJQ,P\<:UrVq*5s][Zjˇ+pOV(mBh% Te޼a`_, o"[m7_zX/p[ިEH^.qm&q_@FZchXwmp*Ml~1@6ܑ.t&.>u,+S 6:f64}.dNjA,@R\svP PVGii#O>wl0'a'Kpax0 R&1&4˙4\w=PdR)s\~I,v/A8sRg(O:ߟ焔Lp3r:k $q!%9K<1p릂kzviK{j )+أᯥȊ9U9r <33WFdL`˖6aHuS_u5!S,#by70Pt+cMFʾRDw&M m:w|[]ILQKK# MӎքaJTueǪNXB0jxԬb]||하M.)~@"6 ѤO nц" EҔPvh8@} ݡ/u>ҍ>g7DGx/M=ryy1 Ox`SsvPʷ1"5JY!|K5è $0Ng endstream endobj 772 0 obj << /Length 1931 /Filter /FlateDecode >> stream xڵ[nG+<9@}Hd8A˔ĀIʎ>5-=E$[ȫWxL+D%dqv{^}Vq~u^ aY0Ϫg=<4`Q]^WRf8Ww^7f~2<[^_z~og/.#i*aT{U0ZW,`RK|R2,8gkc٠nxiP׈D9Ca^3'K+ ^2X]8Ip "n}ŬObW-|g+aO9?Tu9f3VK6']ڮK&m=FIkLIV8#vZΖ75*GrM A&xb/XWhwnv=8].mzΡЛO6Ju#pK[c?W߻>RQUIЫno4 qq !OksRaR1嚁ҒA/*}\潝M7ͷ= LŀIeEFpӽb@{ٷ)rvc?0ŏX"iEL0d ;Cb)*͐D2>2Q'a(Q86zf:_w^0kHy2Jd-8<2itl*|]O&QxC2:, ɘ Ȍ~";MۯOIloQtl ddF<"SSCҝWFzgϜ Pi}(bz!ӮCڡ֧yvs4[*.YBmo= J2g֞tVa@*H*Aa%M>]'%=`u`"S{ * ]@I53 3t)o1t]M8 Ow9.6Ȅq2t>1A[͜o7̀9$a(ݡQ1+$b6st^0k}6#lrbI@GvRبm vT>$=۶MD-w؜1&9/˗쮎܌ӻt}Cd- ~ZU!;QD wo:"b~J#P(az\a6^NsϴH;QD us]`9y'}Lon.7|g/m˸ϧx>?1n cf(4YD8T ~%WŗbI2n&rrEMPZB],xB7#z:>dJn<E;'XS^%6)3")!P^^G=I".|#zJkfc%FX5 <4GQO Ȝb#L~֝0D*2#$XU!G͂$HQ f[.bD$"2Jb[ P* «3움e2xL@gO"XN{LwX):aSs.HyόVIk?gԟrP,⪪?&]R{_* endstream endobj 776 0 obj << /Length 2395 /Filter /FlateDecode >> stream xڽZmo8_a䓌Y=n{vBX8r-y!)[J%(ÇCEtv7v،QN3MRϖ~iFH6̒$4zw7WP1n6q8I>oVߢͮ UT޺ߏƸ͛Vz_6槫oZE"bfFRCJB}'IԅL\ޅM"1f4`ʼn iG[Oa@o0bLVv1 bqy9#" ch$]:/Ym\䫷GSm~fB둝˱R[HE=5uIˎ}ٕ#UJԏ|[g"KȀǬk= ?q 3O%$) f?ԇ}vJ"7앻3_% w0U $̜a2 g//f$'jiG懆>#L tulSP9DͧO1Dc05rA&  )$ܴCqs3 i/7LagD2 )f HD% Q|cE' zQpzP50 !!*;#T6^$4^8RaLWJ!ϚvĎT\&$Tܴ#>;bJC'!H&mjP&09IVK d$Q~gE( 'JIHjC͛h^_h'Ԏ9F6/P ;]a+,~e^b:տu)c8INڪ88Ƚ,)ec)@mMr _ 'A#(Ƚ,nS*U3Bu"F/D{T 8 vqè!Du-(K1K^Иpfi)Bsyq–x-hhx{~AGL?]4H܇ & p~L {3K|Tv9,ZCeTdۻz]ᅈڻ-ctܽtr]vpaiٰ*S- Jꔅhcľ[.ͦ/"n=:jeE8x sWآrMݜEmʍo+,)o( Kyi:_GBEBxh!:2w Tk@^vUv.7jf &m!6?] 2,*levg/Io]3˼HoUCdΝ:gg谳m[ <) $2pJhx%4zWUK_uc9.[ N`Xm~{],lL;%Mѻ*a%\(f&_nW䘇Eٴ=L]Xt!Ƿ>l?ȶhun7m0 @pY"c(Q=Av&ʖRY jK av}ZA0>cqⁱ:q~2\ٷCZe1]q Rꛉv3hú̀z "j:+qtcӋG ҷ7AAT tKe7F3Iݜn_I+^~s;'Bg&o&Ub j14vc?27Cqɸ(~_cc?DL9fӥq)I1G6\R P\l5>eWoIgp,F`q.F=Ypώ~ԅ4e]I30P$LNImHE8H)o5x!RkWMv!/4eѿyf_o1rsoaw0d*$ό+oTJ%:֨:t-LO. Οfޱ~MP;$P5Kڦ^ˀeW J]JQ{v_V~"-b(Dl* cܯ6=* !UGz|$` ۣl質^Uܷ[no~\W(]tyQ8w-oAm\.Y u]Kۿmk@U˔!'?lьp #@L U jU endstream endobj 783 0 obj << /Length 1602 /Filter /FlateDecode >> stream xڭWK6 DĊ([M5N{Hr%f#KDexɏyL><6xvsz}{YRt%dLI\f"֑ΖzN։Q|FS_}ZL4&A-lQ4,u Nڭ$a k0e #~~x_:ѧ7\w(KD_ "WntlzAm͛ nj n~g> nsQQ{~MEixBMMqwapAȍ },)Z :۽0n&Sv#İ೔ʾD9;*Iq߭_"Kdq˖B$| XX6(-Ngwsu(Ɛ {paҙWyXߺ&rJƺkrA*l`$Yf4rH @/0HC:qWcL+ˋ`H'|SC3x2uPW%ZG8ضqCW5HZݎw0`'s);Zr4,Iv`h\ [хI{m;jd ! 䜥V}kek؍' YyPB^dtZ=.bf撝0 Hc W/ TV8݌"//ypµP؆.OsMDvd^H'۝%ak#|Z;ƞ!L5(J [c4M }5(" ?f= 4]j! Pp0˄߉GERlq:C/quX Ӫ1R81 p1> stream xڥXY~_!`#dı۰sԜibuJ*VIjkId,]DOQ&_7UI)4U1Eam}n h$%k<V*@бha{86Mݪ"p޷V&iw0-e vRܒ$}c*Y<5v4r2rֶi;&p}A1:owr|f6j ©"'xMU}IYþ;;Z|RÉFq )H :Ԩ =@>k/t[n!-xZFfC_Ic jwL&7 "ߢF|cCa)Z j a޿ ^)2%=}յڤěkѝ4B,|5k־4jR>j-d.ҴAHRC<qHIA>vtmDӷ4!$8ۑK[\ܤ v5^؀y>m|{6h:J#VF>G,|0jr XA *r"&EIS\~8Rϔ'0 C8i0`iTI˻e@$8!lgGKg?ofe8mxtjJЂ8BDSg?ELd//LB /͟szQJQɽr(KǫPt"/Ac;2".lS|pcCMUh5kBio>ם`gKds[p/nv/_׀zi&r}druCK䊟8MR[̷b,?Xt T>#!4FЂyg?)|&[-h}Ĩˠ%>pRa*Vǔ6XpCj=˃$;vf KUAᤉm=<wnz䖿tݰзSC1 ! _S)tѣ#瘼xp ύzGP`4x~ qU\cG|כ!ć^$B"\Yvs!"+\㞹72R %0IS %|'hMK;15I3b(ɔ(p׉Л.d0YB](ir<8hߏcho͚ - 9#_T)wP.D //o b*:i_:V6W /\˥v=f-0\%w+$'a[j/ȡ["oMŏp R /7z3#^ 96;?!` MqN0` T@ iyq}b.( 48##E& fʫu#nm!bU3Ya y6fUݪ Y6 l ,>oV'q S(Y-빋'-U ʰrq=RՒTP.ͬ+Ut MJX]nTPw昅bfވf^=q4p!~Q:&шX-Z /Ʌ)shC䀿- hV \C3*]" !<&F4:i Cps5]H%T"Y1M&xH endstream endobj 792 0 obj << /Length 2914 /Filter /FlateDecode >> stream xڭZYo~ׯV1`/b b+HDC$g5vmh뫦awo7W_}gNV#w;!9Lh=~.I~w0%cwMvjpWIP&K?mzZsvbZzDjZͮocF@L㑺=bk'C1U%3 A:}Q^GU }?~0i DE?ںkS CFA-J`Ę2 ;>FbF>LRc{P-jj$&0DUϮ9|xCۛ0Zkz&cZw`³R̕3ưYuʅ˭O 7j٨8]➚nq,px9nL{9TgneƊ?(dzJ)ƭJqeًq1:KW&$ V2'L:e7g]s&fyǥ͓.><>+/-q#)|ft$=y 4 *0n_$7<.%hnK<)Ycc*ru=XCV} +νN[V`8\^"u!79~Džf+~׳kËTc>d efȇKKb4l-4pF]bJhX9v@/ 1a=l@GgZ3E_ BdF|KpQ/&8 ܩBbC8SY!Cqy:SA \QR- ,ꭓxx9%qȱh$j[hr,88VLq 5@ӗ󮴰97j ʼn_8[Uz𾮒B7vx6 9;[-3/9f$/w7?j;>5AgF!,;/A-}@q8q®w9x"+CUVk,X"D;2[HICe |$2T -XFF@# ` }M'|ΈN`rN-;n gX}F[\(yU# LL!r9 x;@웳 Ҡa֦*jLrp8@dJ M8P15c1OF]5J2Z?f)A))6&Q1P8.+&8kkRp֦i]9>KdK<@Sϣ̪*M n/^IAį@3)@lAjjyQH0i ՟cA80Q`jJ'cFؘXc!C4DNWqҒL%8A?׋-\ |1&H@1x5FRz$IݗFR`Y bS0І+62s>3n<ڰX ,L 3Įڢ`9Nؽy h.ѝegFչ߄̌Lsuh,xM3=tG|ہw8]#i} Hn,]'q"i"#8VRƇzZ'HهHHH[E}@ʇ0d`@EW붻aHӳvh|S4TL Ʌ|{ ?}xPw rh 0չ{Y:6HɨS5p^dHż7!ReYh1LE dqy[!cIh,%B7T+.OB`ZA_8SR7sΉqf0wٲMuKx])8aX@疗x]TIEE fƒe-Pw!=Ru/|CUhfӛ;Luf`~1"M/(|; d@E>Vǧ&uHDغ&[K|SOǶ{خ/Ag@A PP̖b ZH"d*W=Nj5 eذL.P3I`y9喉ukQAq|#RQVOmӐc!~5rP#֮CP-S 31p\ůaYp>LM i0z4MP冼H8W(l)|qR3n铟dX%mpص#OM}ĘWkz}g>o_RP:ipJA:aLKTUSvbbbpo01 Sj0ͼ.fތw=p:Qq$A$LhVx'LJ$Ka{72-~Yn|g<%Hޕ&D t>De #_axQT:Y]1\S^o4;Pd8A 9? pY '^oaItcsK6 j3a%aXM‡"viy J]s{1=b aGk灺5fbY\P] _@ z̋ g>ĪCt?=Oy Mu /͟lɚ)dBuHtL3HZ:IQ+s7|SRԁ>9}:k~n roVA?|9 endstream endobj 797 0 obj << /Length 2061 /Filter /FlateDecode >> stream xڭrv+1#Tѹ88x\l-6DJ#Rۧ)dCmD? FO~A 4b##MRGho~(D>ZD1¹e??]̯U MK-#,1@kpx{~X//W?~~ n/sow/>yֆ(,8ƾkBڦqӿ'#Eqh*(}m:DdH0o&mImqu׶^ok eB{ _or X xN,j>YwoUAMl R  M<zu>XiČH*%EYBc1m]YvP`J"v0' M/1?]^G&s^W%}tI(O#$$MCic L{ .ZfN%yYipݬuwkRXv[W{5fs TAJSmJl,vDy!Ff*`2B[(*D=|mQ͉ʩl`q{6qV:!nJAh5'AUf-Ov%i p4]lVU^e>eU=, 8C2Bv't%^4f0GզHhQ*HA(TEҒvTy`+iB쑊Cf@{^vqH-Hl@RY; ?hҌ"7:|{0E !dj T/1 P >d >G;(dT`imT8$w&8*eFMMC{OXO3yӪʊe[ g)n;2`O"&tSQ}̊,>|8]ʗ)vd^eHMt9QqX9$!SR!>?q/Gi4xs=]c"^o7q,n =xa,tVOyMK» $8O~֔_@ cCrݒ.p$dOn q\B>RNďym▷0A&ȅ8?9&_Z&d H{#BL#"vZd >$?&J1D !E@QI߱vD`cGXTDV޷կ?N endstream endobj 801 0 obj << /Length 2468 /Filter /FlateDecode >> stream xڭZKoFWs73=H$@vC$X-H-I[ݔ3t-`_UWU[":" ^PhID#JXBc.(^V)"1Oudn#JiX*_w?J$┤4Mc5P#1~ldr<}uS^R$&u"0FB:XגxYj"c-]:aj ZΔ|/4qP1 TZ"P8sOvZComuzk0Ff$T>ȇN@&SƷ<$&aP> M,gxs}!YO*}Ueay$4b:7 &>w:J5a"[ЫI,5{T I(PG >e) ބ9\6} u_yJr'7{DR&8|#KTwFDLbnKN}YW<ǦQlj}mp-z<gK+j.m/aegۺqYd"Ïg<,^|.(v[օ>Ue{Hk+}hPGy$BYy .+-\/ͺ>6]WV89*):;c_ ƒB)˦-o_+Aǥ a"d'ze۴MS5LjTbDCc#8 4Y%]oHb1(W`D|CQ` gzv`Ma}~ʭ۴Gfsgdq j.J7S銼A'0}GyamUv,~1[{,h;Pp3FQ'i]ߚȴr )9/{ Cϸ0';l.$hGC#^~0Mo1kk߇ @!;f88 x&P_?.j"A~B;+^ "Q #Ym] G1;Duv eP/Jn`@',Md! AǢeaӝǽW+;,8Ƙ+NLR{P-!0wqlKx*k16MCVl ~ʝ6Id7]A$6`lLd3b{{i;Gvc{ n=W n@U@U@ĵ L78asxl`3LQUWwmź8~(lMiS#0@ߵ 34`AՇrbf Ժ4AD?d ye`w%cJl v Y"Ky)!Vv}l1nm]e7.bŘ1aBDSCZ|8.aD^P!v۸aTDSc{1` 2\rT(SRq欃K#a.ݥE:oXHyo(e:Neuz$G!IąCVqb 9:Wxl3/\TebK Ӥl֖AXU8HQCn2e1ɰB xGzpM&= N*<.F%'؎kH1O?WgWs:iȯ1FSw] B&aG?߂lX05j'>_FWXHWāh endstream endobj 805 0 obj << /Length 2546 /Filter /FlateDecode >> stream xڭZ_oϧ0. Ds -z;m/b+ZYr%ys!)[ʴIIf8Cg3:tE󧻫1FR|v0cc,0ifwٗy-5y;v#N~?״\dKRvv$R{^0EyҼ.^|_iڇ^3zdvi2>rY06k|1}^M/a2~UeZ@0w']Z :s&["@?n_s5w2eE,Oo nNHxM&_o?SVgN*F`B"xzv%(K4u; ͏KiziMwXajn 5b(HWLJvHB0O/E"48TќdZjՀ:-i[.0>w3:Zh5"um?T˛HBY\#Zl2&>ggmI)TD1rM@Fymo6_^m;` pK!Bg#&GW# =KE f{ӈ` CA!/$f5A94'Dja7K :p?)nű: _*5?XVmhd@%`Op/3be4n"LCzrwWBmۅ!e$8]6[| #šٳ-]~jJC?2 4 +] Q\ck[.M}"T/p s3"Dkw$eszNA<2v0m%N8?3(0 ?y A:e'YPF= <"EAbf<6FP[Zl ?vy&cUA @MQc_]F~## /7Ym*QAR @LQ<]U}9q%(QDC$8|45`s1Ib=*,{IDX(CMG+)L- aD S geTh8u1Džv ;tq LCA4ӃhDB:0St0QiTI_d ݗA2ES=FZdmR!ղӮ r 0Z!_]OtG]AQ NuDIkЊ,iX[:1֡0g_b\ n߅ u=c%EV jzpqlA@(k': >dX\s0d,O/ْ"IjFx_}9+k LD} ˆn@9DwU/9!P 1v!5/ѝ>ߞ? 5~< Ɲ&Le i'aLgٛacQ`z ue(}̺RĠEG}vй/?M_ a-/u~qy3 &ա'*u?)aD-3珟?UXFjtHz*5u(PTkӺWկJ={Kϱ2s8U`+2xX56ц;-ƃǪۧ58K-8˼9u L4!gHh0#TP]$9JDp0e=ۢߗX]~^"ʬ ;C<fIIp~ endstream endobj 816 0 obj << /Length 2817 /Filter /FlateDecode >> stream xڭZ۸/բYHŢ9\94@rʵiYr;JlelǐoƎE*ߟn~x҅¤Zܮ2V(EK!bqZ~eŭo,:?9Ιe>_*{rG}-5{؝\lxNuVwUM0$xwuctkv[ěo^2eMn7y&a]T7>,Q95([EՆoAT_a̾&'N2\#l(}9Qi. H Fc պtơJda'?\ Y cY)@{$b6 o6]h]л,v<\*iB}vZ:.ZZni;n R%KWS.a oW?^}B 9z"Kbz!^V{[T -oWd?f0xgx1FX-ּ~pm܆Nb!cvqz-B"HR"0K$F o_t"&3zP@E!"gM9Mshm|U2@~{](ѳ͍Lx38^=aOe6}%336}'־t/;[c^</?{@Qb)D3Z{/t0۟@*QDDOYpS1e88;] Di,8@=)ڳ{_LUDyiY1(,˚|& a0s# @+2 p4 .kuIklA5͢ڷB9 |W3i9D+",tYOJLDiܦ/m&q>(/0M}A!v?ܢ'a$<_k~1ƒl 7͇DF 0l]h<31́LP1hod8M3gDcAb _,@jL'qpDf߷d(Agh\i@aЎ !`U1H1ĕp%S0׮qkQG%a!s#@l,7`3Θ;:?(Y p=z~CDx(a֠:-V8 /YdqqzW-a}iC0 K){!LT !GeH&5#sΣ}9Dl%Y׺%x.>sA)a@fĿ~='i8y;~@=7Wԣ⁻rk &Ӭ۔㨪#w l xܺ-N*C #?M9;ˮ0-V%)9no I5NRva6 [ՒL'!gJ AQxm0 4@Oj)kFF/h eb RTps '%iN :M2@bLdz@_ !XA,|`#9@dՆgS&m(̥\n]y.($`Sp"Z*ˎgݻw} E*aykfHLz54l4%BtRTD^ǎ,Le @V3#< %qF;Sd-5 x*#0łEw ^Ԙ@2T}ĺ8s-آo &d3ji@L_@;R%`n @ dMFmIW'UqGY;֭{ _{.v!@x*]Id /qNzYKU&7Xъ1eX97Uݸnq+gli/!QO1dQ:Ţ[]frm=!X<$,ma.$Oaڝ=&)3[:&ںr-CX>CEY0j88AS)ΖG@Ew\ ЩOuN"I) {.K-L欅RG뇌inoi M IAnY^t,> stream xڽYY6~_7D2Nl Zfw 11HmMūXWEܜ7rÍto7߇zȴ7FPoRfܼ K-;[Cy B[mwq*~4Uǰcst&K,tб2vri|(*rj__ɱ3 =4 vF7Tqe_ 3Vl걷GP5 Qb .7[>W>u{$3%g ?~ nx6Rhض;o<! T8N2 wno6q([a"/`.2z&/>c1 # 8 IcpjH}>/y#` =η+j(3d.+F 92AXp RIg,6 ӵ}_i5E=p" &F>dA37 Q[[Py$C!ڼiJ 8 ű]'FID[ŨL-) ,w |Еs %;|aC2Rnޮ"D44 E^T"g_Q0YSY[H Ql"5yDF֛H$Ϊ6oo)*P$QƑ$߱qNCgmko5Egm)b4U\VyhI87.#Uٻ.k,FW]#K>0jѣU@4}Fn{`γ=aYH v ?7%>%zl]D# dTG@0NL҉V%;\h))V#Dksd2Pi@xs\Nx־nP$@ȡ( "bf>(*d!21\"XLBG/T\e(o<\v6 lmfc[s W~QzLmv_ k8EgKA:P*I;_:=FO-`eC$U}4a=za99e!(hXvmi8uu$oޮI)Ã#mΟ~&̬s3%G6S(df͵@Bz[~|Ft$ YLW}#3 t,w8p^ !]+".-@^Ӵh_g*Ԑ"Ij`F88Љ(F,V3!'1#ou=¤ Bu0G!q ryW 5՚豙yX]Rv;?JS:Tal =( J/L$GlCvPZE˺Uym{ddl@L]g#ЗY_]]I,qPCYUL = 311˂ O_y;X^bKLiY\AU%rHˬXrU'3~8,( $aݰѲծ(OWUj]w| {]V.r, ڭSrzUe5sgc`kj~'WqwVB$BA=1T t\<;۸=KJzJb+'~n5 vįAw_:M.9O9hSщr>Wi{^!q n:_bLW 5sf3dnFf2` E{>.0@ Aiye5tNHLu&ɲLnړTf>&ƹnϾFX>QBlB}6!l⳧5 E O#yHNO9X׽@ХnC E!s< Atwdq5PfnX1~#[ kp6[ky[,A ?$H˪Mݟ Tl8[U,ba8- nGdt"R_'b endstream endobj 827 0 obj << /Length 1638 /Filter /FlateDecode >> stream xYKs6WHD0|ftɡ/$ZdNPp],H2ɖ;M/"o?,v!<]7k-fO{\IH 5E|u=9 jsgj)_!:IcrnIy]A2d_|0&Џ\ I#-9dacoՀe]"DU$x%h_L!dNixP#^F| 5<(5Lk<a8ʨ㟏)ƞ L 5^ CGɁe[rCUmm>w\gΩU(ct׶}2 q2:1 /eJ!o)l\/cDɼdlp0W[.`6OvH>7_2fti4,?p;8CD0d̜!pH dS~3.HִgƓ!?HVb`Lq 6[wy!;'rQu.y 1 Ku"x@#GA'F~,:~.H rR2b$/͖@C"%.,WWLg\( H5 =Qh:C5IW8k18M 2u7#y*tfpmk@2q2"J{ Ut(^od%U8>kiPر^}"Ndy7Sڔy*nTTM^}~wo޽!Ee }qWRc5gz;r'tb b d޲{ endstream endobj 832 0 obj << /Length 2747 /Filter /FlateDecode >> stream xڭZmo8_!A>,_-{^>dBXWYJ7álQd'"3C{ኻ7WoK bcws ə `BGһoVtJ׋*4Tey9Hu5rK*'-pM[Sݔ:dNTY-ӊGo.BfL t HMU1+@ZD&/P=l^`Ӈ+־]3ae+COnxRuVHJԆr^@K 2$Q>{[oXf`{AK^2} axAS ajlʒacHφ EAieꉃ̀ϋ,YB%[>Pud0thi_(ȶERx &Cu--@`蔎aEX_~?z8m׵Pz|4,,7+=k°Xi=i^1@ge7 9sNqd +?/q?IP1iJ5` %ۅ362vx l[$btSaήD@9Y:kGH*ׂ/: bqKp|K>+w ԰ӫ{pk(s>>fqpHispCq{pV4EdiB:XhԢ$%<vvG~0eHXjD8ɸ}k@vt`Zs?fRFg0*x)  JPW$PiDOl≫C `U- \﬒ m̆ o͠قBY y[hnDܡ<k<wDCno;'v)QV+*bG;AcH6_ uW$ uiOD {+ c7 OA.|Ui:7,),#dJ:xPScl5Ej5&[OCLW̭L%)Az*FICq,BC",J-%V+g( ! `_BL&]ꯐ5ߛɬN7ד :z` -GY3鎹۲&-:lUiu}s W)5T@|5#ŏ}^yZ<4+|ZT#vpF/x W$.Pw@Hbqkr ,ʙyIEfgr&[X#.(hFB; .uIp 2[0{RD:F=&>"n<>G >e~=d˓ F-M;YA- zzDetK{yƒu|K^={ˠtG .Np{0Ƣz'o ~" S7\ ěw0ql|Ό($ܳbd.4+})TʋY5ȠJ`8J!}lTXKaP(/?.‡9{-ͳUY.ݦ/kG<%u9ɢեވc\ڔz-e&b$VJ{#LzMˬp{NI\n+FrkuZ3$AGv\1YKeֽ_Fbeg+pGx1-=EH9b] dha،6aEӹ黬!Mop{s)zd)^6o5 ρ dϽc?z ҧ/KGw 'Yw]`V]/T4=ԬJOFl))q04JAޯZR236<\1*X>E p>wu5[f$M{7'K4HQGH53\,h?Ps۬K<]|bB~3~ (&F@LΕvvtb5o8k$?Ya;l<䮱s),`ВУiAvjkN:uY$8t<n`Ii@' bP p2U endstream endobj 725 0 obj << /Type /ObjStm /N 100 /First 886 /Length 1948 /Filter /FlateDecode >> stream xZk_͇jDQX7m $)6( uߤ}czf6@K=C6{g> PbCgm'sį.Ll2(uo(s0c|&S23r QC>b)LK^d!Dً Z QFKяQxbRY?! Ol|DsţP(C GB ;|'a 0B4̪)(CNRBg:GΘG0GH.@KAMpPP r(@,h3!f&!<РRAq("HXbfeyL`FStʐ'BǠZ(Oj`;C(BQJ(L%`B @¤I}I?IB MQYRJZpq41pÃ@:] r f-E z\R/s֚> iâ0E@U`*)A] K񣋋QS=^,zOşzz~[X} 2^Lj}'@bK>csqaaji'櫫Y=r5?2~;?y3/L˯ZS`3%rR NE݈Ѥl=mV3;6| .k*zZ^7S=T&ksɨ2LZpp4=\-?D@V >^a r3Cc5"ܗ@xbpi u)bȂ{[ḭ gsVL}l |C 1ACAL]@Lmgƣ >jc[9cKӑZN!0A!tp(g[\Ҍ(m#NFoİOT/.Wl^V?QSU>|zz;h~2#7za1_q=^Ouny=+A?3[3* aDA[4c *!?,J.* _s_1CjEws+NbyU!b@6=F8 m9^ճ|YDtA4h#^ zP MC ovl0z[otIJCN̽e| Ü9 >^uLmC't&5v:l=k&z ~.YO,H^Wẃ`O:$a.. .iK{1xٽ ^ڻGqa/\bqCwXLybk"Vu,tԧqml .QdiA {J P^^6#JEnI>[HjuΤ%{^;LA"P PD )+`i:7g>[{g߬vgtс4E]>wm@'7Πo:TK7bYߠo/%#[Mdli'v|e7VƳ 93 ҫ5:})d=x3};^~e5kVKܙǏS^QԠ +³Ł`Yo.ߤ%Ĝۻd,lf*X_5>iRDr y( ;G->. em?p knPa|Js CxT5)S8h7f5v;oG8U&Y endstream endobj 838 0 obj << /Length 246 /Filter /FlateDecode >> stream xڅPN07ƃ]svAL ym${\Q: KO<2ϋVJ˲$den7Ea+K,%6O=^YKbm).=lDY/Q\x˶a[.HQF +edEenǡ_? wDfWƁffI},q"H&/]F7zYJ꼩7Ioc\Qg' endstream endobj 829 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./fig/phytimetrace.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 840 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 841 0 R/F2 842 0 R/F3 843 0 R>> /ExtGState << >>/ColorSpace << /sRGB 844 0 R >>>> /Length 68187 /Filter /FlateDecode >> stream xMnMo%6~=LyJU6 ݯMہNl\Zu1v9]R-I/~o~V̟?cQ/l>Ϛ?l?k=wY; BtY>{ٳ C]/cQ짃ɧ6{20nTzm1r .2iF΢GmvN+﵍[iG^to`r v~oQ%6OXFs`|B!]bɎvEN=`7~0 Eʰ['mA G[]s*~` A)T\RqM,jO[H\d/h]`'U`5(cXj4 h<.\ ؊A7+!g]>|Ђ bﹰ'ׅ#OAL_mu?=Vb`W%৿~|~J~O3P1K3[ ৿nl.iFmdWq?үlF`g4,56[U,k\>0үl}^Y'>TOK1nmqU >d__oKڋìUs>OG S ~*}[rb " UmǬn3D@f}"Wĉ~F+έ] ~>Z̍pcOy?tb`U֯j1Z|__}Pmϭ] w>:ⷭ.(TXgYp?}m"ՆWߝ6>=;HK8_}CqPJ[qvo$`+ڏ6NЯ6~EuCi~56 &!řۅ˜R/٣~Ѿ.C `#@A6K*[ABpB$+% D ܭtQla,e fw/;P\yz*hP&!`[Yiָԟ֯Yzdگ_N(6/Ow?<ih;w8j)eĞ\IhX/N95;Emĥ$aTӐbn> (p> \[I#[Ϗ+Z-jjSlQ+=[`m9aC=[Ρ%X_ (`3o>"nT3(͒?2gGVz5PjX}{f.r?0_TEݦh곥b0d+ #'[h#iր,jkNW-A9m+ TBq1neПOiq|q;,z:&NaPw*SNv-l,֯~֯dS-2lIт\(0sNEMX 8"jNh``x~tتl QV2q o'f0y`4FV6-Xwhr؂@ σь^ &4~ۂw@?pwQ=1 a81EGԯ~K0@}r"*(.̶%a`WFeLUA`0 ͗F$ P\y<+o>p?_?lJLW}"g|zxcү*F i vn j`(|9~WMjr. *Y0 g08iP &lبf<|j]Eϒ|c,WZm`Ʈ`БNί]UW0t4%!+<55 A -rH ~Pk6د Ǯa/0'&ZT_67!n7ȃ1 vUÒv-hP\l1q0 W9+MCg:t LIԆqJ;p)'!! WqeQ4 B*Ƣxxm XMzq|X0hfGɊXTbbm?]VG7ѹA{N1 ~~Zzx_}GE毳U{}-G7j${tk:@\v/7>,9`o'T(X밸:n`y8P{ 2+#\X(8nNmۂ n^J˦Csaqۅ*gb\yW٪GiBW ,oÒu Y\|.^ѪhշBQLj WR]'O@]@ VhVCX7ͺ5&CjXT W׀q4`pabiâJZZ %7_Mقڻ9M(|-Y~7[âJgsm%e\HR\ȍ fĒpϋ/;~ɗ+ 4CҮϝ0 ,AJ ֫$8\D3>p|ԋ?vE1{xߋM:g XQ@q}ӽ Kxnx~EN͡&O> {*uCs*{\5χW/? XZ|@] ^|mA25)``LkNA){x5~HjU`-X{j|`>yUS'K6^ A-ƞ ͒ *yū;M:07cPJ=;_0u ŕ2 @Os\=;;P }~iQw7 aQOL+?" 9O@CEG1 [{3^.tϋd _߂8=o k{^`AVuM7Wubp`3`EژV` 5;;O6oyhb :TB'[6zMX\7| IqEQ/c0 e$Ӗ⊒|o&Gc9P]o"9E\wF` >sGnCcX(Fڋ$U~o_ax cp<KNvOysɃ6X16kX\ɓq0u>TѢۀ^uڛ24*Y!E966;cqQcP$O?, Å18 '/wY\1˚iKzuB,vBvu=XFTLk8@t~WAj}+8ĂR\uZi 6#0Ud **JV_ d0u w0b~?A 42$T=`,@cp$W`AMCTLtބ~6qN110UTĔ~oSE8q"_aIX\ Ozi,`o7毱 }X(,Bt` ΟP\d b)nz7 cLcPxtPz\}L`A-p\I2 2筈W FJߧs-xPGu|7 c00,6U*q, dVGSʻa J1x%ص84ţt9h 0MjnRPA]F, WݮGFf >70kjubl` /"A}YRUV+<s8" 06X\m~th-~ue 0#oQ%cxm3u` :I5"6n0D1b_//>m+5cpuقjdWp5-}?T17ͧ_( aWӄE %o18` G笭_A0zK`Y7a΢ * G>D}i)6A )KP1xwɣfU1XYv7ڛ&Mc z>DzƠ8P 0㰸N6Y ˇ˵08 zXt0Ehl,*Tp2R"X:;Xӛ2q*L6c$hƠ綹G:R`Ơ<łC#Uf=үVR5sƠi݈+IXIbƠX%X/1b .R|` Zrjb-CAKB18h3`m:~6TLRcZ`\!01hNm(ghyGcH 0^` luӡ;eBKm.4#RWeARt%6~0aUsV)rɧy^`18xO` >aV0_T1) 57yN WET\Ռo5XY%{^f ,~P+j+Iy+?wG$c,ya?\'1TrG;tRy9dJp>Hmb6@f18 h8,Ycpү *2~5 ֮s*@?cp, WY:'CcrB*3W^&e .>5 ^7YtcPyfjk. ˁ{0t \o>-~P0ŬN0 YG XlapėK+{ $cpaK2->ڋm0R]ؼ$<[˕)ߓpx>,9s!&~(čX/ I7$cPklM9d B&ӉwIFwr$$cZ0o[` ^T*V{YIk^)lU̯ 8 }2M7N"WI:q sJ1vr%^,TL 5Lg0:,/ m%o14*R0b"ETQrb}ت_ё+160(+EAU1dɣ \`Qcp8tcpGm#L]nBh u NXF=PlZN0Pg9霵9=6AS2MOdz4| H  sE&$C~u+,E eX]7&Ht|`aA0K>_*iėOz\]%Ga,m#I ~-*WH` 0e,0 *EFWS>â6퓄T\'_&az} !* Ҷ8/'+,#)",)Wbu /܈` 9P.kKaN>e oi$9[EX&uE0ep͒I*_ɊBt` 犎-!U۫6fD~E>ORק-]y.'V=X]yEQ`AUraz0j'1u ߦާ'3-*V{ [%Ly8CGT}7i/ i/.cq{qOB6BܘMn1Ƹs'j$N=MX?G=Iꋃ>kH獥6|ߘ?\c-j/y|j\x8rTy@7h2ȯ`EZo} C=%\p06&)cƣJ*|epRO+vLP<=ߵ,}jъGoe2wb*"^tKKw+`5Ƕ&8Nph!}%;(M*#oͶ=d7=>(ƷD% -9Kv{Ӯ/O=oPU0Wp_VrzΪħV/qX SM0^Kt ]X F(6E )s|C'}2/ӧ7'}"$75_qRMܴopUSKʉۭ M1 "@ߎkhfOFзsףiy"mտ ./[Ț{|3Jq5h". -5ذS*y;C ߣy&/:M3݆%) ݵ~,׿3gƟ+31}"ۻW>M=S]dKWŧ!./{R9㭿䝏{?ڛ)Vljz>NwD>F-' E!yg__ p: ?Uso8[ ۦ附qSoʧ}oJy&2ϩ\<}՟7pm-H~u_k{;SAo{75} ki2F<6z?_^1PP{HVH4ۭ*LB 17nb[O!7Gt[ I<ח= )ä t=')Ut=y~AW,pltPL3'm KsqP۟$c0REٟR/FP`ΡX&#LNoE?/>_dܜ"o}lPʋr>p:ztXI9M?aߧ|@1܏q? eߣi^j/9BG~q~G~s&zNT{#ǭsY?q|Ŵ7:1=Ӹos_hK/\Ƴt:H<@P7 :GߗK)2_,%Mu~5]|%0Uso8A)d_uMu172ĥA#W}KrVCG(~(J:}&W^AD>]}mS>y|wMbS1V}-OAL Ƀ|?o+OoI~ k Cb.U*`qp }d?)+y*>*07m7C1>Tx%m'p~Izk?~G|K/ {߽`.uG}"Ub&j|{W^C7|/3E x}>L|cꯓ>ԟrn %[fR(5fp$&|sG(oߪq篡蹦i"U5ws0?_ Ӂ}?hy!I~O'bMKmͧ]SuS|TyO[qV.SKXzf-~b싿w^٘ տ1'+$K~.aG5՟~rw?k\ s,<_˜o/[}"uj7)WsSo?T}íM0KSޮ:D}.y0OP[_ڗ}}_)}T)}Kٷ)5/}gTේor*S+o~_UXX OY4V޺T>#z%/|Ii{ 7X푽|/#>=:L1[])yollGLSH&_g&T{KSSy%%4dtHơo~?Jy~ßߚ?~_|oPyo3 ,ȟuq r 伽-~M_mo_RO??Wmu䋿?=_o_vky٭/S=Xk|ϟsy{¯L9tżaxEkVkw4GW>."GcorPlXv|`:JWxuV-Ɖ/_~4}3_00̂}mV?_)ӛa,52%v⊟͍H:'ԉ!  :;hm6(' $3b'l3IoA_zԲͨɓnuNDP_kG9Nʫ0|әqЬ7qZHv;rII_ۗmiZv/F2TބGy-A7[z2[]~ nuL~~e96Mյ[/5!m>SQvl7KJy8^h":N9s/L3[Z&`i=H$ `V44H#dh|C__܎Vg|h)„!Sn>9ڭ?ԲC3\nCZvFf¿&ͺj}n^<&Nأ1) Y^na>u*\>.;ۍ,˭]`5ڄ[}'v_A5 N)k rvz^>ۭΔpi{^5Dz4[CSf :[yOUڟ6ߚy#O4H[ߧ+?eud'zԖ_4*' }M4&ey7c6N_'5>o{Pnuk jߣ7G~8z;~ ;kŠG +y)/NxT>#4CZbU-# j<_v|^ڭn=/o*h?Nf݉8VwT &7 :S^ >3U.ygjkdi[]hHíjo{ npM s'/qU 7Vgr{/\yۭM;VW\§ۋIL[s'OM7*4YVZS6LdgtDT~{= ٚU7T ;ΕW Aqa$ ^t;-]+f 1ywVoXߘ[4HS :Ck#n [5VWA֯ I:c(xgKa &vA:4yyRhW'ªnзqvþL;Y*?{Otv!(Ola\;Jǩ/N$j|zmmG6Ե[Y<߀YՅ')\al/n.ώ3m8:?ӭ 4Vwd_}ފx[ 40>җ>íC h$Bld\e?[ϐz4Z?VnU`V Sr:Y[Yc؛oyoWhI[]W>K[~@ |6]nua@̭h>Ξ=>}U};%yj~I\Hqt_N@|Oѭ..{:Vw=YU۾6U}7\3]cq/}{hgj 5'F 4m6"t 87 i#nuq^!mD{8V 4Im=7 7 };.F[y)\έnu?2 ; q?ݲo_$:/Эgֆ_ս°<ʞ_[]//ίaV6b^Bo}:mu|+󲷞_y cƟW}l=o{ZGj_[ns9?k|6Lwoo VW8 q77;8ZGڈ%n;Cڈy۷CCڈu;rU .69tkmnu.>Bڈ4pK'VS|1}:~ͻ"mľR|ql1­lo~ө|޷/oWVG t{'~Bڈ-VOX~~x6輺Ǯ,) {RoGՅ! i#vS:xSz:=p%4aHw gչq7&KKt닏_]l?a~:LP#nMh+7oyeHoݿZ]{)BzLo~kWaЭQ MIdXWts5-[nu[ߐ6ujH&y*~!mD8Kե ~~`Ci Ww p߷k? [rc7­!mhktCtۏ~둽6bowՙ,t|?Ø wyo#ٯ 0nu&O>f8oqۣ>q~y4Vw~kN/>n`K|b+~vL;o:Эni4V/ghí.]/?`Mqҭd7[/q}Jq٧>h}pK(ե~k,i#'cj?ep; .z~6"V~ҭ.{CxNӭ.[aؓ0j[Fk"cQFCڈwkBOX:FlzG|lkū8_Z[oo=>7؛=w6[$ 5q]즍QN}O/~@ &>!mD2lCcycI~C5yI&._| xj~k~λ~k:mD3o}qY|/5o j찗N! CڈgEGn(ɯ}RVߪN ,<H!V(<{ZސƄ1`}5/>_2>jo-D?'[9o} HU^~coxLi#goJ?>O~I_ M7G|G|ྜྷaIcHL;L)}Ha -mگG}FڈðaoYz?K; 3Vmq>HLܘ|C=3 Jc7'oM4SCK S5?䏶Z|bӆ=oa ෺mĮ^o?ZooZw\ ~C['fU>X/[?oU@ڦa'pU_zoOӶOmobؔƘW_w &| ~둿Fol8S㵉7ߦ?_;^ g}PNl}b۠-}y0|_?x3}1월/0U7ܰq}nǴNu߾-~擄li#W֣6D@T]Ξ[F~~{8i? y17[k[Y Jk-ݎr~mEl[Ň/iKV?Vz ~Iv+l[O4S_ӮLL ^2t_owjOjOz␷?Cޏ֓Vk~xu/ҧ8y~݇l5.=j_[~[ ~#&Ui# 3[ݯoHqHv߰}[qi#R_;oo_t_t{6bOq1|D{Gge[7wK ~kKi#owoѹ0υ''W~Mi#R*^& i#R;6V&{S7_6Ÿ7X6FT;aoFڈ%DZ`-?>_ꃴ0q DԶW1j6Ծ<gȟ i#B9gO"5e;}Q;և~} mJ7ao9Mɛ5fX _<.UDKP;m3o3/1x9!|;oA ǙзS-5߄xbKR> a';*i#ς?7l{nGL}i#}<7/>ݷa&\~^TۏwϏ~mߤ0\ߐ6l/2Lwc> ţ9෦i#r U~Y6vL҆[j۷u>8>:HqB1ȿ A_֟˟ mDv6@p>)F|5x5\򥿤ӆKٖM1;CMg8^ lF[S|~kv6"~O~kL}'Q~XTp< Fz1?8v~Q= Kp 췷oV?Aڈ%r3Vփ&5x#UF䒾 ~i#`v^o~M¥ooFl@;=jA<;B%8Q_ UNOT>w'/_=?HqzB7}=/F|o>I~k,HqG%57=HOvo=.ɥ~k~oz7o}o@tj.otC}o]j#m?ෞ10~ôlao>#8FCOo?O#moM;[ `خxⷚ9k>N|5BAڈX{۹fx:OͿG)IR~} {/}8_U2&zO&mil Hb#_pt{MNIzHrHݷ9>B "K8[:F_5W9?S˷~&ַp>/ z:F}I߆~HW ;D}/ ~;7yq[6"u?@_ . GWU8R~OS8H&}A^ZL}[!^>'Nf1ޟ i#L_oCGڈ /97_Oo}ԾU [;{ &>q?@|Fnɫ@o5i5B8z|[_{!^Vުp|51Ϸj%(Á}[q ?5e?wKg_*|bN~]m?~oz'~~Og.ߪx~/vbO5o== \L> t[M~}yL?_8O#^5'O[+ ghj"dox!~{+6xvao~~}s>A->_a bCXD8BM~[qM@l5X ?z~o[y|H K{T^ۺqŸL þ@~K~_<|V{KIX O˥>~k෺=!o#Vxi[﷾m-:op[}'}O,~{V+OvfELyo /1dFWG܏[-]xiQe'_zc>*u* _쮇pxtзζd6W|8sAU~[[bO"~a/>#\|[ [=1$[e?%Oji3o]m7};$8(V෎7&~OncE+/F)g| [mV7-=/{^o{J.~|zL'6=wăz>6ĆN՗*u~ේǡ}zX~b=HTϧg\w|s;[k`~~ේjX*?/Q'~O,姀t'[G]>/yoۿ}[MMߺO"L|7\@>z7_|bR@~[hC!{(p[ o9#>O[=(d/ ٲĆ@>=w[śD0d| K-_V2d>oݲ'[@y%o}m&g:~OuO ֛$d)~P\~kS| O*o~8os=n{$)wMq7AΩOBA<4э} ]'}]oE_?!Q;?iU_{>0M]X|v[]3}o{:%@~!HOqT~oX_7t>ʟ.c@L\-5_@>_ oy{^?.oxhUexS;oK q3o]_ٷM#`V~Hݷs?N|T|u,-~]jG"^ZJ_=o74J[]|do}~"%_o}֐> b{_bxQ}eۃ_:Nu[b}FD'{Tx`><d> ~떿Sط埅Ď/%gTy[}῍|bsO&py2S-{~䷮?_|$xJ[CΉ| G5o֩6eOV gaȉxH[U:!'!o{zzxK'D>TܐR.߹Yʗ{~| /ෆLZ_lސcz}5M5տO&7?G7(|O9:/%LPIYw<8/%K@/};[/&> M [u^J[^45 rmߺ?$w[uේO@==o&,/t_^~"H(Yߺ_ 2'ʍ7AˆKmP|l~cV>8V"?D_IوM\r#^% JෞgCߖ%yuGf_}to|ۺO[o><w#[]CV/!<'h7T{- !o=Fuߺ[_S<5| -灾}wRJ̋o|\|b}o෺O:GJ[oE/O෺♤|վ?oZ!w! _{hȟ|VO-oUVnH(`xo%D>>/"Q˛2)ou{۳o| 7?Bz/Z_/>~Wmo]?6ouw&m-%s1H/_6=t_ƑJ~&%eJ[=7ۣlM}#tߋ@}'վ^+UŸ[5?#P_1+[ O>o|L VK`֯|y1SQ/>ʣp'T~bzG^R|bW95D.r<-BRP} ]#ao| x ^U~oo}YL1~m/Ym_ ^ID>-%;/w aoI<@|ig/P} ~"L 1b~'~wqx@=S;~@>5{zL @|c4'mw}{N-o7 2|}@1soϱ=O//?>{ߚs[ܘ+q;oͻ>q#}:|῾-T1^z3V~56iߺ+w,_s Wo$Q慁z| ~S7 ~_L?(~Q 7o~Ch5D~#I{rZpg4遍@ :2H2+vWW_èiscZ$Q{y{{wh}{K|@ }bKt~NKk װ}+dF/.ǖ'>_,yy[ŻoʹTzC:_/gQ[o}Vo  }{P܎J1+o^~+5}ظ!~7??;/%6!ߞ4+O='e}&[/KW/5?tܡgqo큭>W1\p#o%0x]0#~USדu/zQDL_~xaa=}_?*l=1NJYUoo!?S/uxD=a犗ˬзz=fSsзBZ-z2~C@}~~l}k|t:F/u)s~ob={[W_?/?~՗=K߯~_4~x>~+})EճV>-_  M9N/ܳl-~_~7>T? ˣG5w??|׻.&ߟ~I/Fqpbiۆ/x ћ_h;a_/γ:61ܻ\]t_F}FOm/ۑa/WMc,lfyha _i uaxM ^27y0i%O,}GBbL`x_of w!6 cj^H,KKOlXG>vn 7+LxfYa#=7?xQ{+U+nWo%<3.0W_0ר?ԟ.joP_=LjoR=7w+JX2^0Yȁ򥌩QS{Bz~ԟIϿ󒽡¼nW/*̄Fi0ש?}fqZS{:oiFxf|KƷUV'c.0 /Nxe\q*Q{=񿆨WƣOjoR&?+7%%3.F8Qf Kƭ:ש?ރHO =ޢ,j/!'do!'-$3bOBBBBdIo'Io'IdIo'Io'Io'I&I^E^{Y{fQ} S:ש?-"-"ދ͢Woַj9BKϢnܨ?YTߍ;'ۢ'ޤ,zlomK87[NfQ} Sר?o[T_ԟķ՗PڛԟI?EI|Q} ;[2''ۻ!/AB gOjoR[3{+ٻfr{+;[KƍkԟJ]3yU17?R{%lo8񿷑5dL%6wַ*AB gR{ޝV2ެoUL%f}ƍkԟNuOo'{g}ףjoR&??;[όUӕGƉmLUO {g}bjoP{'7??[ [ ?!{ ?!{ [ [ ?!{ ?!'do!'do!'-${O=L=M=M$>2M$7M$7ޓ=M$-"ދ콈'8ެo+WƷXxP{JzbMwMIw%=$kyB:ޤooM:ރ7[+[ {7[+[Q!I[ԟlo!{ ٛUޤoB7[IZIZMJ*doҷV!{ ٛu'I&}k%}kdoҷVҷI&}kdoҷVҷI&}k%}kdoҷI&}k%}kdoҷVҷE&}k]dE&}k]doҷVҷE&}k]dE&}k]doҷVҷE&}k%}k񒭑=ލnomom/HڞlFFd{7ҷ6ҷ'ۻ=ލnomom/ٛ%{doҷ6ҷPӨF%^7[&}k{/H^7[[[!{Qd#}k+doҷ6ҷB&}k#}kxFV%߷7ҷB&}k#}kxF֍󓾵g{g{WjRۘԟZ%{̷K6ҷ~IMϤ_^)^57[[7kom/H;ש?}A 7?[ԟEϟMFޤomMFޤomoݘԟN OS{BzIMϢ_doҷ6ҷn<2NoNKocjQNxF6ޤomoݘ[ԟEϟM֍gƙ ٛ%>+cOB&}k#}ԞPڛԟIϿH&ٛt%,g7ޤomomZ 36ͬoh3ZPN2cjO?IOf֓)N;ό+3$}k[doҷ6ҷ|pƒ3==P{3ooOw'}k'}k;[ݟlN֞lܩ?IڟlNd{'ۻ?ޝ!{doҷMNII_7[K&}k'}kޤoo/ٛ%{7[;[{!{7[;[{!{']w!{'ք'=gg{׬'֌G5{%{Wwz^ޤooMN^ޤoMN^ޤooMޤo-l_@όƉ_@SbϤ&=3Ɖ\dl_dUʸQ{Mg;ٛII)^7[;[ {S'N|{cjQ7[;[ {7[;[ {7[)^ ٛ]ޤoBxN.doҷvҷv!{Sd'}k7[;[${'ƍ8ۛ}II)^O7[;[${O7[${/7[;["{^E&}k'}k_doҷE^doҷE&}k'}k_doҷvҷ\Dd=H:H:r=+oƍӨNI֑l_hݗo?Tf/ujJ4B  M9Üp|ҷ_]=fglo)`>E4}|/_&N_&?_k"~S#-?_ NJ_X _4&z yZF??riH6/~]~E|okqGo+xAhy _ 6"{]>m"57;?}|&nSg?VajhbͶԿ_?GYg?~6ѣ _7xK7*ש).Z﫩ߩ6.fُ]ٛzJS(n96*/䱀M_ip}B+m|ǫl,~Ƿk5`k|D/R𧻓*!x*J:C+(o`}Tp2wwsq* Pn%?(UXu6l[ m?:=wCU >QU v/oif5Uo;w7t )4ԫ* Uz+\%UuPuN~ΰd]P* : ~Rm6$UPu)vڭz*cxz?zYtqw_[CۮE#=" pH4?*_4IOrWdžj(S™d\8SA gj^=$;K/K?! A6lf ,a=` ;U'𓫜ѭr3BU'wEtvK5*Ucc/ǟac<\RpU;`SKvt!^zMA(=N oՋq}ͿeNx!Y} ?ղWnO0ԮH@ 6BUp&YCv"~v[STՄ[gV=‹k%ۮa*U#N.Kw,?yFJ^Y6QTpVIMgOXeDBxܫkЩM6^)l?ؿ܆լw- *>xe Z{ N՘׀UۗMnMuz [6_ڻ&lׂ9^}BϲuB736P1 afGva^+ qUۮHޮׂCĴGvWgڂ*-x_OL͛QtMb)WU4LP=ZV>?UOp&*&x6ꛯ* khs nM_(S5k/ՆoOj}`aps+y@6bM+Ӯ`] Ԯr+Qخic> nKj״XF;w][bkXەSG`خׂt ߮°] ik.Ki_V]aP ŎuyJ`2 &WsaGJb*to&Wyz7 (۰ε澊+K~EO i ^ j[uW]@̅*BWU2uY* X kʫ T D|W{SVW5ԘNi j;d< 36֋M|8CPEwWg~P+[$!Ùrz4 *gՊ膞_zgQY8yz7y4r큲Oî&oeITA=t?lV5Xh'N,gM]/+(k m:kzcToVJl]SXšk{^`Y~mץQN Zr?6ۮwq횺*Pכ ]/yt?o[5kL]/Ϥ; O]SVOz Rz nj崥7pV}4[Upѻ\&?,]/tSu?WTWDokUXCocL; l 3}>]SSѯwpV8=;/T,}AM@9tٟi5u^o새u? P |l]}y#MEu^}mYC۰ +zM,g W>>XjTqPET/+So6azz;oqrwg8*:G,:1V;vK3_`X#]z},Z}\i2=k/U!zg i {޲IPYMe \@kz,zފɣ޲05ɡg`j;z١1ڈ4];X^4 p>l[j{<,*.Ij<22w]ukxk;sC,pءIkCSDWshxCDPbk/|v/-#o=nÆq43T,ALiձ kФPq/|@ueЄP-jX? M|ch6 *vgfPq&VOCc+MU(: D MuEͯ|w'>j,F0 |>T4Sf~:SR?ogW; M%ہ7МOW}hƧn24y"4`q.zEծn y4OzFȨ f]rfx V;Ե@;4Fh l[c]lW>3th`ngЬNqjNxwK"kshLfs:L_ݫd؆ 朞\z1٬y޷\:dsA(H0A|u֨ AC7 B!;o~5uSG2؆Ah0ih^7r7+-N8״rc~ ܸ ɚu  N3+*9 =t=l@"# ܸ:eXк1`X; g:*v׵c){n![agq:vNnlX.%DdzHW+>Hmq%0ɡ[S*p `X`zf!WokNC }|Mwbj35Ry:|NcB#0lp wL[j'd[2y>oUӘ=mɘ୾PL+gWvpo<*/+_4RК ʹtFMNN/,V 4Yxîh׮\roQcƂ_trgez@N7:Uu :.^#v>~AGZ'7gͨK5u-ژ+Ds)jC]3_h",F)WH0Ut !P R/ƠĔ@)讠Zuэ@tTfJd(\*$秶_XEJAwnI`<@y>0DT0ާ*:R #{v I٢i+2RAק(:RAw8 /D {=j=}! OW؍57!&T鼵뢄zl1@+ ҄<SZ`u0Jd+[^m^u'jfZ~E~ mZAIĭbZA_ ZAhð: vtfbA*:' X4y|-@,TQ>! `^+[ba>!bA\OM}y AdG \Cq› kB,轚OrNN!7!?m!dB,`jĂ6pj 4lc V `XRys&ĂNF&Ă>%WWbA8Cqy봟8]&ĂiL<_t* /˄XЏS  ƨ ;?&Ă"jX<d"'T`Lɩt}:fʄZ07Ԃ1TrF,Ԃa U ƙu" `̅4 W^/|j@.\7ꞳMð0(DLVOWIPzmLB.sBjՄ\Џ S;kdO}%(HXCu_VcV+V =UGzt#6t6=+^M>DPՍU|aVmA ƈ5?Qa}^OzAgAY1S`̈́^0Vx^MtTL}p^zA- =ߕK4)" q6w_yCsZ nv_Me9 ?g^06/V݉+Ɔf9u/˯05OP oSۃDza2ǸOPT˦ Ӽ Zfq%h_zA?Þ?~s azA;ZMWG;@A/@TV tC>S^]Ps@czAWLD acOQZ%O rA֜ u&䂱i&8XNeK0[N`Ӯ_&>5OhNn&rȄ\0 GɄ\0' j)p :T`&&bC.G9uB.|B./e"x<2Sq* WDT;¦1Mb*,Rrp yznA=}˾+54=q/5!g&0l_VWcKYaozB.聽s0@.; ~rbx- #,֮1&. VMr\08J: `pOc-_8 y²uC.讂[ /'0&w K²\ tZL.h=[ :YOa»Ǘa.Ƙ8L maA.BXZa. ^ sv r*E-n(gA^ z,Æ#rF76\gA^or_- +rzAlBur!,˅> rAߜ7W-tC9'oK>Vr$~A-UO+vԂw9Ԃ˾{ *.cVA-+jA- Ru}wz7f?U?dgW]hUiA-ojA_q.X.RW`׊mtKՂqtη* \!46L.x;(O(>䂱 A.XF<[K<Ѻ 6܇ o߂\Y2vs~$huYYJt܂%- uY˥%1ag u\ ʂo&[*` rAg@hT )~h!0+f ~:|\0NTng\0A~V͞܂KW]8,ݭ ta`gcE\Йچ_Wf,\Й>.T [M ^^mk[зA]" ur@ rxev|yA.]ô2O\H!t,s7/?W28 ^ iF!-cB.WZ6,ϮS],`KZЏ;k<( qYz-x}]0iw]9rA o^쌊ƛd(V|mzr\KxFخC*ƣϭy4K9tD8!]q? FmAv'&m)϶[nEQg~( )hXrn7֣~>%M:9(9%t!墸u\{0y[hr,#^{ne>p؁L<6rUx+6~!43.evϧsۗ^b~Bn _ 6o7!mѡ~9>}T0x) I+^=0l2㿂 ~X[l,-.^*tW3}(|6E}cyR6ωWU?Hߺ{ nd=ܸ<(M'!vmJrl4O\qT|۸> d,]^j('~bEڀ|o|4Ы]}Խ/g8BSLŻ.ƽCKzMK J׷ 7E^0uG5æIKb8={td7\bڭyr5?s )N65]n(nG+x;ǕpGӲ{Ayv[*.ȕJ̳:#].fC# X}a$\ޝ!ЌꋼgDG/4gwpBw@7"5@bA3!<=~rM {DhܱgG8ܼl۷"~_6n!w Btln B\5f,'Wkics3 %:^zlq#b,ra^H9LH튯mp o?Gȳ3do{ UY.l wd?<3\/Uջ-7{_ԞK|!Lϣ0 X:uP|2'yX d/Hw3rU/#M'%<>e﵋m'|l𫀢92*o /|{{ťw i\ xPwկbJ.-BU2Ԡ:ԳߏL A *;덉Q7ex==S6T\}UDg~\yo@zgT Q25MEWE^(2ӧC倳>@bb=D~ R=+SЩA<5*+;Xq|eN3Rd\f ~[C؊[ۏtOI\U Y!l崪C듕 PZT[UB[}=+N5 aklu6k}VTHS5a/G5 ›W!l oO5*񵾞'+|>2χ ak*jo:"E%̬W<8~ akۊq^!lLZ/gz5a a/*7BъZg>"0;PJ\O7kX akxG+jW -8UjCZ$ {U@yprWokmY5ݙ_!l]ȴtAcMkе-)_.]cӂ G7۠k _Ev[y6׺f56 jеY6yZd _t^>QFuSf5(j?+> H}  N{rƓ`ڭNx}tXMJ1$wovOAGRqr;^ 2mT Qo_o"YWB(qv'Dد8WNCVO79(6w`9H'̍;({͟g@e< ԴI#pXu}u.p6G _УT>dG1L9OGx_qAj[oj!~b^{%m. b'o>M ObnˇlX;Pk8Cz"-kqdk ^Esп=}$1Bǃ#t{G^[}h}:AEjjC]> D/k#I_],8`\D7Vc@4]RHRܢ¥QͿ=uOEUyaBo+ͭ U|DQqփ;j֦16jD&X] 1v8+wv {9x> @TH<-JP9vY{_ {ե"cE Ȯ5'yP,a<>+ZA9} ~"kpƮ ޝAYO M6])FZ눱~*'04 bAvǞ&l+_U}-ÂHYYŖGB]/*/o17 R q ,PLᰴ,yzw,ÿO=C.wm"E]yOﯠB" U@Y+m7\=ły7ެ\e~ W|?IE~"_y: jmQvޔ T￀eL|> -(Ӣb|ǯśAUp+EE1/SPtYKN}*!1 d1 J/T2+ez| .Y$ 6ܞT߼?2.V[^gُ" 2=YUy= y˶Y_+~Qv^ix(-(_cEI,xe*ߧ^@نfSE+/E cAxkP <8~2foh8Fa>]h|Qv}|@,JaZ/C_֣e秲RqOj5WĢ@^r g lEfo,2nj6XΐbQvw'm8Pj ߿aYzqz /Fi^d\|zX]Ҽ΀*COKsr<4Ckx(L܆:x,ǁ=שߢߔl?^uFC(rRg_s|{Zej{M峵=E[[XEMK`#.t 2Kz/~hQvez`ȰGy_Vexױo?+r4ok=xg=,r P׈k|d70- ܮG,z(.^Ay2l ~(" TPG;3Q_q%=xFݜ@ng~E=[|{}@%2[]xa Wɺ"(^ l~'yLE=OOh+?7x3Dٍez}:.Edq,(Q QvGy8G}~>%"06}X>^kVBx/y]3TQ?B9LfwH)?favTԏ[ }.yQͿILx^ê#Kxz{EŲ0\l|{kB[u7X]V"c,f0^ a䪶Vԏ r.?[[dW۵Y]Ⱦlam}\Њ_=ϓ#x0zaH#kavqޫPF~TG?o+G08V(#~Z]MS}m08_: u^+%#׿?_[YM:fj# ave#b?0ި2r03L}EYOV?+*#˳}!.ίUGEQQ?֚c$V`yVd-#nE8TH#z^>"ww%V?#fwg⸔_;ncjxQQ@[h0;xD]ugͷvX2 _fwil~D(6D7-̮-VnavgD=}ewIE0;?ﰺvw0o0Pl<.mEx6^-vE~Zm:_1ųb= (Ȳ;$javg>Y $NZ4oo^!Q+$~08OrBoP@مnյϡDLza?K%`av$[] ><~Xϫ\:oqcavߪ( gfD* HB&PgWJo"j;ϻ ?D-.η$Bќ|_h H|cןPC" m}jHyjZo{~jxmk~lVCUԐ[݆+G|;a;AziAz!Q\ObxX/!qCV6o=֐8|5*rs^o_7[CPDG[}k_HNJHxG"1œֺܳMZu<{C@"з}DjhӚTߺǯ]+"m@^9=?'==l"Nr=aHkvG7WTZ^Kæ Vw6[H?kZ"+ޟ?5[PD/ӷ^L]syAz"HZ }kߟ5hAfV}kD}do g>v`7}:?oGq("z}kqU~G8 6︣/c;z j0Qo=xZ鿷u[D(}k*:H>CnU$[}"HUͿBm^}ouT8~~"C|[ Ӛ?}`Ggu[M*'зzߡo=W|S˼AHqS{|y5L*Ο:JX}_}b?U$q7z|.+~C^ܿ]QU$~W/lm{?o=ێ*`(a"?Di͢}jֳ>T??tTVT=H4[ uT8 ֻoG [?oxU$p^눒A"8=zx^nU$\՛뷻QU$Bԡo=*VErYzX,ⱳI :H6h!o yK.ox 1[ o|5va!퐷<\NmֳݣD֐r?nE$Lx۞ܩDq:!o 9\LG񂽶Cڋ/("ױ֐Kt[]m~É:g;O`˝@mEn5 u'O~i,'("*}G|Bt5yk\{nE$\!oi^`z]IGItw.)N!o͎*CzƋU*됷Cz'VE׺:HJyk:Hx/g "yk\_w"}y8Y-VEݯֳ@*q!o `G.7g v= $$[`t Vժ(JiU/~)pDd[stǁfqMH0 [6hحn#[9'­_Bu^% O<ktɨĦ J.o V: ,ɏoϯRitINO OGE>_u#-67q5B p(v@E8ޚ*,/H0<*-{?kx[$n(-me<\^ ?T$ V  ǂtICV#T$.BOOq5 NW%"bQ;S"Q\'oxhh+d$X_xk}>v}B$9D̷2/x+2'~ xk1VHAǔBF"]ޖPHlW3n[_RHp[پ2?om# Ncݨ[VH)V.)V1~),?HПR[NSHPݽg5[9x+sP!$Uf}}~MZW+ޤl !شo`|HoBHؾuBk]Wh*VSkM5w(֬=p +Vp ! x+w"zB{,oN[($[>otI I&:nAr}Br}H!$uuJ-*b;l8:u5@/ŦٟoeI.gSf{.!쟁fzuUUߴ5 NMw oxͱFo @'6%f{o{ Opbw_Ǒ 5GJ'\nس*V: UTo 5Ct585}Wrv;Kōxk'HdoS.Mr}J>*o[GUMG߰]?gjl߅jȈ/ArI5x|\͸xk'F,g\Ok::ڲ9-O>.˷otoQtI* x+8-YZ=D)/Wv\o2/B',ଡ଼_A0xkЉ/|k˷oJ|uAVHg[9>-]#dJ{q5׈C|rUYa|bA_V BaoƃV7,p.֬(uM [JׂHo[s|r5txA5ǻw"]<-T3%# ۷zIl!ؾ!d$ϳ$xכo,A:Y Z ܾk[[9\!18s%,6g:o|+/Oa5d ]K'8g% r 96sKg/u}kA۷?2=p8ۑ,"}%s{8^7?uo߰r=qo%_Vl+Vn >r>Vl&Rm ˂׻V7@,}VxZH'<}C7-a75@v$=l߾?ȁdޱ{/ȁpeߚ@L[+u{6^.Ǝ퉽sor ol?V/|k 5۟D|{} Og?o-[u{ 5@4gkY[9ݐ |+ 5'K;ߊ[boe|e;I'8>ío7ڕo.|\O{O_|k[C +eߚO v5"ϯn鿭.V6@|3?ZY۷X}盿E{r r ^l؞X*/v7l[M5lW|[s;m%,nVDط%R^[!(zk]z<߀\=ox|7[7#7g{1T~k]. /Ca}o6 c":oMηk1<5{g?- ..c~5S>揙-<ەOfv_3{g~l'cyoc}ْkޥ?2{xavٞ?ηJ<@y||oOpx`v.cb|kWfK#--َ2w[7{ұvlc]ْEox;c~ӈ=}oogNح:t8/|AK>ٱ=x/|Ǔ-GOtl$Oȁc̖䭎 pfȱHxlw_1?@7{|F8CŸ|kGV7ya%yc{Gɧ6{~Ǟ[#_RW.-“=3I^첾cv{=V-|I̞3}|kG;E_ٚ˱Ge{cϒOa;e-/ȁ˱o~d|62o*"15<(=2^l63η+Oǖ73͖O5_3f䟏+_}?_/v:/Pշ7zvr>yAa㻯D~C1@xM(/__||2=cAs>dsϞ|{#o4^?Ὃ/'Xoo#bUWX>D(%0$+%tM(1zKr+J< $u-@ಫņ)))w+5V\ tU<aw8x^u!la)wHf}_P;ֿ{ݞ>!}.W)wv.m[ GH}Hx>mjm YrGmUG4gk_|7>%an^gawIZzB\r ެ"YϑT׷\}V3^oͲ$)wxuԘb/(J%H[ƒ‚4z]i\`^E |ǖ 3߁ HXq|bIRӷql9297ɹ=(1=n|>K%^OgK%yG ^Hf8$)w+XzS))"f#Lz? ϛozHsHLxi HcIi (A݊"9/^3B^_!)מrbml,,1>ċc~?HJd{@ʝn$%[IxStykr E1S{i9o!;֧-9 )χ/RmD%I٣~H ~G S>>HHdϐ߁HB~ D )χ;i_H!z)0#?{?[.ۂ%'R!)/Rr"$%ilqs_{ Y>辅E+%}ڿAR"-Z,َ7'HJX>{-opy~Vb8;og@$oHJFhu0S8n !)17H+D_ܐdHlHJp)wVC7c)g 'Y;µȸMPb rxD1?+bhv-\+$nbD'zOoGLiv]QkѳX#-G&!QO,̀mG}ϲ-)6}buv=ZXЎb ۊk,dy>hGd_ܺ\`![۽pك \w\Hs\H Z!џhH{Gǯ~mԺ?Q}Zןh@!WZ (dK牞Zx yRS8/@!?qO zSތxj, k>~JbC:x9ާ7qy># ҒSϫ?QZ|i@6#B:϶boԺԕC< wtG@!ۊWyNy?/^~B:"@j;wl:V6?Ժzϻ쑣@je?/ٚaxj]̖͏-Ou}Ou ?ػX~{tH33@?lϋԺ/ùh>:=<.;Ժ.^?ΰԺw?͞6|<-m/zw>qEjd#Z @Sz 2c= Oؽ̫̞ .cuulF}Cj]ubaU3#?ZCJ< Ժ ߿}>Hձ-YHu=wc={͇ɛu.qu11jJ.ixj]xfk뇧eyU=W!nz*ٻ~?KG|/.ѢGx~Oy-իګo l!RS;S#Btxj| 񺔸ْ뱏?#?!KOZ1#ސZ9#".!w?!џHo Ժ~kԺ}.r`kU~u[uY~ؽ[S?/x鈈#Ou$uu?A:lٿ".ck70_*G ;'El~Equ_cvHvx5KGp|ǚͺcϷ琎Hu=RY_!)RoekvO[Տm6Etjwy#.fԺx|^Oc}jR4HGyjgulTb?[N-8OGڃ|ȈԺ_ k-OK/S\:bZ5Q]MOc{@:Ժ8hqi R,7?{rfyyZZl|<[lWo5pe>uX95HGyj] +5OڽZk֗7oOgo=.#8֬oX! k~/p1 O[_HG?kolk=2C78,?HG0i5% k?HG9_=.u~r<Ş]9o?FYG4;C k8ּM5B:q]'#h`?]_ۏ\o6[KB:"H>k=b3&9 @CTvI̮ vo/#}2|بm_ GPh_`A= yy|75`31G+k/d#} }  +_0Yȉʵ2V{M6" 5#X"'k/,\Fʵ +cy6+V +9Y`Xv_FdZ~Y&=zE ^g9nxSڑfv]i~`ͻA3񄵁 YxЌkkfZOco|+!c>4)cu6Ы5#23I37ic~фArE5r5PT3c9}mDYifn5n5pQ3ć`lLX󔯃fJyh(DufH]  ٔm<G?WcؗSg>X 4m& QC:jW-}e\*p5;?4ӄ؞/j*8qe z{C"qY =:I/8fG=ˮ/ 7U^AdG* YЃH'jvN݌߷,Ѓ5DЃYJ8uE*z\txrDy?q5f/YBj/UBFAv|fVfudrCYqrY rf!`V8 AZ_W]Z_2|5 f5iR`V9gx!`Vz+b3:`VfB"*׌^0zcf5}pAds9 f5h_09GZo9Իb ݿw}5j^j>/r rf׻b/լ`V7ʛsgV]쾜Ye7Uq_01~4?0}C" ww0u0ugV~ݙըrzAW1MlΩ; 2+ 'Au0.F? 6~K:ˮFG#c~*4zf߿Yc*c:*ct0Y =v0\S됃`aV{5`V_uA[.XC퐃༰=-{ r\`V/jyuC~ k*cbݙX.k*cnr;r9^u0Y>.Qlk*_j_rt:|]9jG0Y!5f5*ǫ`V?wA`VvgVj r2rd;z}e됃`u9_x۝YaPu2^1boO`V!AYWFٳW0#{瑷*wDyx_k6*9l_`V9`V#gjtଳYԡA#:aw5!wGVc8{ݡAwY{݁{vӁUzPہpdށ5f%Rļɗˑ՞{y{u j}Yցf5nr:ӁDv@Vܡj6_ \P3dM̮L# ~z/t fi|fwxY@Vzj?լP f}47g%dd7 Y^@V| djٽXBduxZ{|AV; =qdv/#l@ Ye@V9 Ap|D@jlo÷^=rPǵ"jR {P`dY?6Y:@}@V9@fy,ޫz A0|4;7rv 2U㽶5"jgA04㫆R }} U[Y?f}G${Ѯ)ɟv/[+ş@V.<,WI,[+@ꆱ=Hd~֫Wnf{J` 1>q& ?YYe{o`Xf@VY%2*O{>>;7Y@HYq}߫wdUUM0?ZS?շd5/"Oor8ҟ@V?}aY;D/||8;QO #[?(㩠Y_r3f/%6)o;Uj=VDvYMjGOd d׊ [~w :j"M j =mo@V~<;Οu3}nϑՖd>Fshz{U ˑUo#\<z`jY%k2 gCOӨ'74S 3 X%1Y0-nYj%?Ln|f|H86@U>'Sm_aW0.Xrf~>9ד$7p>0>5 !TLptKEF.׻bCПRaNզ1ds&TJR&T"R\Hqd{@RcG/g6$5p $T'TkR'R:I zcB[p 86&:tI%4ϑHJrI%768 4l:0t$5P,Nn'2@RGQ˅1i=y&7Ie~I/:[l_YЌ kT%[ ښ޴1ƴ!Skڸf>Yqӧ#d7DeS&[K9?¤9NhdA qkJ S:x(D2#:1{ģ&;i5]44A,km͈iM nd,F\٦OLjL8lj<'cFʛO鎯hًQ1sO3fO=i)GOK`i^y#<6o#6qW e>cO9Þ39$H>O$2zN'-|]=)ʤ)72XDZY-eӑ 3 nZ0fܬ{@hzKDiG F &xTF&7kMQ9Ø߯ZgKQ\|7qxo({TLRFD@&T&Mߐ/HZ캉{ 5# @*#(@*gIO7Q. 5|_o00f{o r:" 3 @lEa:3Qƌ~B|#GD-BZOu@j@jOʁԈXMRy}od  57RFHZ@*WLo}fĮ xDqDaD! @*T'w﷯oX? "a'bjJIL|#7y"BG;B*HZd#RnZ"Rͺ@|&EoIHeLuEZ;B*Rٿ 7yH-  P C -RB"H  |_o=K "z?+` @| ˮD  F(@*# ^n|DE#FnF]o0b*o$8|#A"ZGEZˣoe7ȗ S⛨F$R?K7@jG 5\R9 hod;FCCXҽ~YfsᎴ8_#yTv7QVO hPVmd ^H&GWC)ǯ9R}vxtɑTȎ=kyY-|$ 'H@¤j 5cZO 65L~@W~  )O Z<o,{>q@He{hR@ aZ{)TwuM+Լ~=k}@*;uM^HA!m}k,Fn7F}SRY>`{Ql/B!_:HϷj{S/59+T{ M,7?>V}oDHywHe 㹺&G59T/@j/YHw 5O MZ7z~#ÁT}O@*s&G^ɑ,W@*cu \H:oxUmvՁThrd{q 5:b'lo59"R_*ƽgH"&HVhrpH5k[5ܦz37Cu'49HMHp$]x{u~ ;gf,'UhrӺgH{%),_E/C5c䠿M_6r?}:֍=kYɑ3CF t92IBZ˸=]xY[䠳V?[㠯{}V\o!K1빓{-8>RJxA0"꼯umc=^[8u_| G_7x>~}a֗h h>xw_i\9%yy/O_}~úՇjn~ۏϟ=?߿v?kni?r4^?p P6_Nh`hZ<--{'D䲜{ ,_m3 :/gXg_?4dՄՎӭ.?Ny?|Bkl o?_?>{?> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 849 0 obj << /Length 1997 /Filter /FlateDecode >> stream xڕXK6 W rX; R mlC@vFǞח){= 9fEvMDkS*JY ,bo%cQq$ rugq ?5S2湈H%%*k>* tz6Vt3t4P~:mNG<9暙 w2޲*ʲ˷d^_ ˕ sb=y'8 8b8| Ep04Plm%0,s>"'0#趦_froOy+/Ld@Pp@*K Bv~nPCDz(Gn)H2C&"xjwR&-"= _8cb4y ʸ> stream xڭZ[o~Dd3V4m-ɢ-䁱hYITHiP7Ҧ3݄O9xߤrcDpɼO>.&?g3t&4ُZMgʙT˲~˙d&%Ņ0\nLmOD*Zg춉 &``-Dٶ) zYvCuC+u*׋e0{B ʹk}uS,iΖb[6(aɰԮ6i\}266luhMtfDlҨ*M/YXm| fj_("иl7QET3`p?m-tۏW\ 'bodVܬ~O r?yCW4o9_b8B¤LJ%;wk`;sdW rxdʔp/`b+7|"YGK\$T/^bυ4L`%,բx\[ᮧ";߂A~쑑 4DάUQF<2$UBD$+,vUn$rzE$uQs/h(>AC1;~$sV{Tg,4K>ݯdLQXI|JMgZ B 1d 8cd W2H# S9qy8sI xg(#q }hȚ#caFH#` S1*; ylUR+~ @zDB%U2 j<4#L%ә7?GW_ow= 2pI;qrΌWPZepDgy4C>e@s9=0zyt ;u(۟n9{s93N  b1iήzqE< ng=,iddzϮ^m g}x$2aN2 ü:rwX4{Z+C\\, e>X%C(`O8qLU2؃QiV>*T5 U0.ixq.Q:\X%1 %B k92p?:3€&#R |H)[_8eii_A(}#zu(oPgw[*$BCEL`iAQ4/Լ**\R yW٦`RAцE|Iu4;Uwi]}W0fQmXp4ZwsRQU<a$R5QHoK}ـAU3U1<yd>))(Ryv*@ R] @Er]66͏5J ZJ$Qv#\$l ү( Th[JU(;3=K*>'u o[Esb7iFĜhJr[l%Xm 4+ZA~D2wIӧ<4{T*KՠY}XEۖe7㤩VN^`,nZ"( }RZUݖi~"u_vH8Sd;7^J*dmo8^ֈoɘ*V> stream xڍYK6W45HG= ;" Ɠ88@8ZP=DX$U_=HE&|,ݳqXjl6qi6yqZl/޾wowIIX߻% CO/~ow<5h[fp_ UY\e23p.DL(m0i´{ rvurov*$78gw;]$LrZdUoP(5E6Ĥ:?]zj+=- 88t㞌50,3dX N*X(LcJ >[cV%Q<Dw0 @s8`l{Ӻ?xБRޞ ¨\-B?5.d/E_ 42u5w?<ݚdcYSkɂmڝ#cG4mԚS^[P|,ԍ|ERKk脠dܤ9EEбtQG5"T 8OL);Q\ZSHBO4E(Q>n!&q9Zx)s-uMwX/ ]GZ 6zh{-RgfK=r*s@7t=D9%<"y&Zq"rMś<,D< ICLV+0Wf7caR=٪@7;v}#G֐RTqq )"W@ c˩(-+>s.02)  o>ip0,XT5*mIW/@IP']tmiEi!RYG.t K%=GR9; 0r7K%Z[Nhy6,,@l1da,w/,dS]<:_1*aJ=p|BPߵ` 43ЅlOYȱ-!(w;&~/ȘZ`I;Ťݍ6ɮ.*J=uG2/pxH"[XaͶiޭ.ֺEvGe31/MS9]Z˽d102IT`J䴛rs0XC+ 9wܶǶbj:j~8m V4Uo`I,.aW/PT/gq-%tkruh/uHVFi|Cj}T2RNE9t.4 -<\ې [s_; \S3W@]#NV@ͦH3`yܳ~"ŠSIhCNثg+@$,@/NejNn0a 00KNNVreV@P}tE:v3P\bDDjC\B4츉䑜= 073F r'l^ULc?XLYzWG|liƦ*T"{#| 3H$e o2M4|‡*a$Tܤ7R:+y _ CN?qwhZ++aw 7yzѩ0G@cZ\ 7˗99?}]4'1k!p ŔCD2=/b 8u`!͡ $C~eWE<;j/cS?OܛXkZ!d$/xA%1tʖi۩s|W7_0_9(32+hT1"S CS8*(st>yW#*MյnO4lܝO>~}>9$-qkL{f+2K.\_/RYA!hQX \ > [/>716VCۚX!TP|Z<"i,iVP%' wUqḾ'DT-}^K8 x | K2NEŷUoRvtf^sQ|e2 - ߰]nMsjRxcR* ֞?#{aE}Fk[M/xXXS}.1+lSw9q!N2,8 wt(K endstream endobj 875 0 obj << /Length 2539 /Filter /FlateDecode >> stream xڭ]6}̭"ٷf&M%{MnT+km$3,g|!IlYW,>߅^q;~řU+x̕]ݮWt(F&*o*Yt-zD=Xt{1ljorXҮhvҦ]ZC~ͣ0}>\zOPXzrV]"5:--Sћk+Hti@t_h0>h;oF^68b d$?O>}9aLR95x&{M?: |iYl*QT|Q.:i $$zK3_'i٠6 GmPߛ@KeLM;DsrȚxk*XUf.&R12O]mrH"0 8E)W/n>\qV|JƄ'bUW~e5aX:{jee\e6< LB-\E/^EXO>B#(*fbEʘYOBS2JTr<~I 5bY 0;j7N\cQrB5_?h۹=M;K&N,Vqi5훼ad=+`";}9[%D,W/( r|!_n)cqipZ #k]U\ስ u)}!lXi&_n]vkQ6.F& mhar:&fRz'r\i J7u{< 4ƾ2"a 2\;Ojj8$7PmڥِwA@ӒZP0K֪ƖLaݴD 8{EYTXsbh7}-6]10kBwQI m0SJ>&>B(]ch:dh] i Tv9B}A+))qoS}'!Lu+F]vH=f39٤ ah2y5]hvőOB/a>-CqP^+6۱ jW5IT0ֈc?Y>W28Ś5%=kX 7S3u=y"!^?-4! L?5g̈́βa.6 bzjb3[IeTʧ`>(*8m $zP$ zAa~(Yvnbu!(9Cr*2ͦKmaYX1'=Eo*~D2C=! _CJ;pN(7 /{(-!Tp+ԍ4իkGoK:i9{7[`V-([c $7 ﱴ>-@w.vdE,QbqkK`F(I^ք?T,?JxH_+C,i|3]ؒʼnϰ t%M?65& tHD".BT:Ði7gʗt zk,Zc#^'a)FC(kLM-${$~dI):A?kY8q2_t =H-61!X_ Id\8㈢^'Bz*;G:=Ot,aG{w$%)]'6u_rwU#! |!G#''4!]Q7U1U,!/v-H\]W_n>#!9b!i: ]|l|P:`[gӱ$<O: ]qޑ}Nt_6;YcxosfiEl"D{qJΏ9\!+VpF qÎ2_PQJ endstream endobj 879 0 obj << /Length 2501 /Filter /FlateDecode >> stream xڝYKϯ0$#k CdɁ-mad#-z؋EdVZ|zTo46wT$&W:I7_#4,*>uylvQ6U@Ez N2q.F?jU_|xu:_ k濶S3[NgF1IN޴zoHq`Qɚ;"Ӝ.r&`[3.F0 g+'hM|fViYYckjX,0TwGi?~ݢІ,ud*Q9?] GPpOá; CGz9?=ѬޕVqek I3GӮ7$ڝ޶;5w.u!+++[<4Ғxt=Ľ-{@PV-O[I&/Ҫ&SkѾl PI3;+N1GYq^U!8/E00='.4Ȇ WQ!}P9_l9hsZml\@Q+!m04<9]&`H/x$ ,BbG9̂[S2F5&>r(bh1{^JbXA 5ø-"]Hmp0䜴aRzI:4z@]Xߐ$Y tw16mtqDR$N^^lN@R8 Ќn5Y2ߓ+WȶENCnIqa JY.=k ,ff%6r@$ >5.EQNhĴ;#~KTJ~ "('EVRgZ\0.ge2ip. e:rմV ӨXP@eRU۽9#:thIׂ+"'`" #[ÕR^.Uz p=/*+/f%ǁCJҹ/{9,2CԼO, I# mZBǔaUTMpK kF!5NZ@e5冀D+ C QʨZ` Q,L-k,WTƒ:X=5)4xO: h7vܼ_UNT'SX>q5gT8\(H2NQ{f+$'PW  7. SG>ɂH]iԘ5`Bn=||]Ae|v y뮨"Su F!wwnڼdd'CxK: bz/~ ˠi0zǐ/)O z,^Y~5Sp}R\Hq%Z(uźR*Q~e$/GW ^Tz$l*$;7rM?%:Ĥi HnƑj]ESLGR̄ͯ󴢗޽k1"Nzc璓/5~ئLfnZh{Ww87ӓpڟ ?WV30)t15GqQJ; ^"β9Q (5% ?ljO+R]o aCfR~95$_^_^GtMݽt?n>}2;z{Б.W_%]Z;"PM=fԠ3ɪp4L7r&,q-qc],mjb Rp ]'KXUIdv~ՙsHY.f$2%RmYTW5y8Xs$Sq u%- endstream endobj 883 0 obj << /Length 1180 /Filter /FlateDecode >> stream xڝWM6 ϯ0R]ki@-SzI@bחLvER³mƳ_xZ=lQh򧅓y/0 %ER wWe6`DG0r8_'*lju !hzzw459O, %˜6(DPR0B46Gv)yx26-Y! G)|4-ṧJo}냰Y)C߇VfR`%X-lYuJЇ9Ji!눳!C|_u+ߎI2G.4Tsa*J6B< 8 }##¸4YcCp]`Dq:!F[{Y1TT }׽62:(~U獱Zji뀦|]ywqxI +ǸTsx.]q b⏧}:4O c .Nu`U 5 q8$ߜUNԄ!ܼ04Y) ,if1eG3e&(YXJgUЙC^XV|کev-lrAMtR24Sҳ8c̸btrXtcؕ8҉d5&C.o bz DŽ+ґ\4!y,(ifMfr%qM#ړ9u2ညoB̷g@ ( ubwu_T)1k]OxTdseE?$|XaBQ/<)Spuc_yR{cځiNyV!Sc+į5N^A+ԡ,uQ™jϢV|0V| vB7YyX&n%ږUK=YI+Wo^)ސH/ Ա @I1Mz,$&ʾ*fK9iB+"?7#;q6PJUP]͆|Xeɪ=F1>Ʃ'?}m_1a=f4lr?(KM endstream endobj 887 0 obj << /Length 2693 /Filter /FlateDecode >> stream xڭ[ks۸_ʳ+O>v̴ivIN |(|N~|/"(~hĽ!&qN/~63X, ſ.r}̮3r=o!('r)X|,<]oÿ_~~?^ͱ@F݅x "BWxFQ_5C( No!љB{GWC#_p:m@<]G>}ds=^_7WspnuT\៹ZbFi%&c.by tmtַQDfWs[߉|V>C>6}O4$6e3,\`>+v#E$޵`qVЉ(GЅ@p  fwL6o"('j9'ʹh5KQ歀Ywmwf>(u[ԩM84 `t^\iWQ7蒲FQrY[Yc$2*I;4˥GG <顃?"4um[8d"ӖY2ʽ>!  1^Ӳy48V*bڥS@{c稈#ճrۺ|4S&3 (ہySP32GB([w4 nQe]|G~笕ˏC `Iӵ˽,(Q(/P*#_8FW}XUvi9!>93>;d@p5z?,/v7h"խYQ%4Qp2$"cR萄B 09hw-IHHwc1w!ZF{F݁j|59?kJ^sȃ(8E`̉Qg]u{5?Nw *t[?Nm4=@DkUZ(GE0 36͐0 Ae!ڟȼ]}E.ΏHh.MTW1oUCt #Q%2"%yc%fu(GqyQFvbK\[<fEK iUL6{FWUtQRCX|?0(/**rB?)GjeqD*fğՋflЎ2mG+}搊Yy&Z{&0t!g^'19*2 m/ZfkypmH*I'ןxH<dapȮ:J⛢m"e(w gbsKٙ6WI~'xB?@ SH&1RL:A5{X?8n4Ġu(LNkoI,vr7aՀ+ ?wA`?Mڄ\w.[ 69)ݑn7Vo4~°j *gӨd2@&s>DZbC9p±gd2@'ot:d &5VԙF8d%`IRWP<;f0ksCuF; CyQ6W{c_lۮic?Ȩk/ 9'ʤ` F;4G=G&[Y<>ty1Z G9oԜ3A7q&ZQ HY$k/*ScB]WiyP.»K/Ϩ@/] 5u^\E!=T>}+um9SE%ԗZtVVl X>As֨GumiGEJ0S} ^jՋM m4Ue]4*gSYA,תa~JMԥiİnSͽFU߄wRIoXfK ncwx{  d<^u$|jƨQʬ=\dzNlM_h]^Г endstream endobj 893 0 obj << /Length 1327 /Filter /FlateDecode >> stream xڽWMs6Whrf" ̩Nv&!SPQ7ł2)Kks!>o߾z> Wo?J>eRr5"dq,g*lY~,o|^wq^U}VkuQ2.u kݔf;_Dnck썾) |=* Z7u\[SEt`]# -)  D$m1@0n1X80̞N.r H[v9F|av2A;VJ[Ms@oSx;8 h@)[Вй@xt[ߴ]"4`U{6]zq"7lYn 0՞|YL(Bc:Ľm.hv4kS S|b,J1=H,M xV՗Q3&xr`hQ^<ۉM v_)L3_]9LѨ ȋzzJ#&񁣨OP; u'V Yn}j#Τcr{=3빑[%i1Ó0،ft8Ұ1p%.oiǶ$ :p;n^7)htC[ƽWGCo \ }ӕt P@_O7нAu)+G}Y*햭Ni,2;Xe2Lr kV>d> stream xڝɮ6_# <+` A9ٴE|}j, \$Hk/&|&7_MTq& ,MFAE]ř5A.)2w?t˓i'|@$ifWAQ~oKM"u,6l^Q^9a۸Puo4Uԑ`mwbnNc2n{d\ Wm<„8Nq9sjQJQN3N7ͅT3LݥI(QFQndr Qc1j0x 1@.P$ !<h^oMC1SXYyҽ .tLM_Ҳ/`sfaa9S ET/[e7TY (" <5Bg1i M]c[;mqLVFQGۚ`-ITEOhB* So78"˒MnaݦIy(@< Rqg606$i{-Wۖ7,/3EC@'`zRP#OkJ^DV KL l]=Z]1=Hq 7<' uT! QK:Zu0vEf{SQHOf体 r8?2v׌ɝ0o!Ϙ7 5 rY~$6D 8u{E>S)=ʷ(YE,0#Ӱ`a0;F]?նCwQ81dMEE iH( C,.Y/-iLpa@26Dہ!1Xx>^g"5UP_FnN<6Oց%GR{5L9eH2j<|xꋨGEgFP]G\5JG2>{$b +>}GZa;搴xCRrC<5{#7Z ԊFU_Xpt0b݁RJWcMA8\)WJO$x/xRq%F"3Cm1)9}ҖH;0HIr#" 4ϚJ/*l/(#b)Z/r;%@6W%5YH`x#yMԌ] :^(̓򚉿e诖d8}+ejJ-q衊?Ze A_GHsz]Q8S&ͤ6s n#A|)O=ف'[?TduU>AʋK}_@k endstream endobj 907 0 obj << /Length 2445 /Filter /FlateDecode >> stream xڍYK6W̑>%*TRJDR v&~~@dڵh61)~X>xJ;(ҧ)Mvqp|z9ӚO"Uut uFDE44F~r=zeE 'Aq;?H^?ێtjatf8:7yM{R(.UL ѼAߎʽ2T7^ϬϬd_eoVnWBaݯʛj=J#c{q;CLF,RF|Z+л/LǞa~`uJ%ًwCWr t4߉|| j_l'qt:"E"v6VN|[$VN.Wb;ʀ1C0hW;zti}zI/-vhΧ~i,[[|vk/7mattYwkXhYPyBaWi [HcV ӫmB`d|SnwO@& @z |lpTwh-oA[q(%=Rxm{c[6Eќ*D-mWν2a "\Q(9TTUiICNs8@|LyԻJJ3)тղwGI;)K0]RrMiqκK]CM"JMn% _@=4g1ױ%;vF*iIWO#$QQg%.êL%[_oNAl̺CqeahAFnT @XZ!Z^Gm+dB4t'e0&nlN}.F+APlA9qlǨϕ(]'G2%/p g;42x(k5$C+Mi, 9<Ɉ#5c)ÍsxZӯFY_11k7OX|WGQ)dw]S[եTtG!iACywgKF/*y Ҏ B0rQjLP/Rf‡iIr>B,>4m/P %[6HpWC\PцԷ#dYq|ϯ! =426mr7"Af! q4NJӰHvdgZZ}])B=9JUXnCr˯4ֱ6JjFb^n UWB|- &[6VAڊ3ʔRߞ4Q E5 [5n7ūErjFo&_:+O+ rFE|s"UAb~\$nh!UϕT܍Xn}~!^9WPyHI)熩v{>yM-:a ^QlÓFw @vZ,NA[|hq U)zjR[l:kP> stream xڵXYܸ~_oVnYw'Hl{Hnat)ɳ_e 2CXU_]l`]޽7& "IiFb!|Po>zG nx_IUVOnd69kiyp]$F/٧ ;ߚܛښ;؊vu`> /؅ǩY\V,Sox1;N4|P&keۆޮ0m-?ΓK"{\m6zqx&ׇëMxŧBoB#S72yi߽q.~SݮLJw!&D0n`6if8I6Uw`ScQo^D~ZЩvEQgawDXS)]d~lqj//kT:ܙ(vJQyob j>nWH_LRoRcKӶB<9=5QAq0[e_#V1l;Rcɮlmn<(,xEl8q>F."N>QVҕ!_1cGl_{+3WNbT[l?+/wVe/[RD;9 ={]Y' ;z >m-KXK`+agҭZ# 'n4 Jn _j`R"8c3ǼVޒ oQ Tfg@30I"'"Dfs ,8("8 a (Q1ɾKPcjew&yWQ|D~ *ɷ09JN%lYc[2Aϖ2Xq< NI R[7A92"- ,32jyTL_<9 A[$3c=vtR1Ӑ69[ Q8@aqS ze8rh=MoDs~Ir v-ǡ/k/:xQ.THPAl5t%+WcuMM`;2P%[?e s-TO"ۧP&d(U;d5}#[IZb_a奖c Pd'!皁H $8k9ڹvKq CFayBćCY$ ,Q8%FQnhI+o-f٩Lf$F(IjIqAT:X%hy58g[ĩu: ;rUnKau},1dCkEe2vVaxI"+0d< X=JuvE3碃"]Wj_iEgyOj^]F)f~m*h,\An5:tʏRT;MqKO r]S" )ځKa@Aν LS7bi;[_$6,gn A\@(q|vbd%Wu#)̩ڠnDw7f\4܃j}Yv^`׫;In?m>2~? ?6*Q*kʽNu~Є+m2Y'VtJN|ZAci~cZ~ fYHbua4Ddѥ%h@T&"$א0H][  LT endstream endobj 923 0 obj << /Length 1611 /Filter /FlateDecode >> stream xڵWmo6_!K!f}0i(fʢKQM_;؁S&G^{̒u%=/W^ݸXJv7_< 3zsZ2UR@;zq']pݫ,~-Poiٸ1# FðdzL |V>MfhKnޟ:YʊU"lzrLDj'DR ;04!< q>OH~=`Ҹ Hi`T@Ȼ( V}pJΡ)Hpأ|g PPBba>BQ˾ j|1V+D@Z+ u[ijW!FË3iVPF3]?$;Z{S^h~i)4?&Kx%rBW9{_k*c%"W)_-U!̥A NjNGJ%zHOUa*r60147*rzEH;C6F)MHuK?>ձ[HU;V`KGfC= q8lJo@O38& >Tnʌ‹hj|\6ĵ'J>6=?^Oc *ULyJ.(80];D3 A=F͐zp |Oě!vF6[<|৹qhʖѝn;kڨHuQufb+З̻ x3y|1 npT\:4-N#߃ӗ|(&\]c8:a}͘DV{3 &n],y:x;񜵡ܩS| ;_| R2m&``G&>B@4l4/Lkc˪H tgzG3+Wx_Fe#I@&M +g;9 v5TVEf2PH%TCTvOtWdP=Zl'Ҹ\ A%6hO֓C9QPs5ɣGav3`~-܍`NXFyR9I?Z:wCO-FfUYwmD q$Qh7s/tn0)'~>G :߶]SaEdYFItC!*O8t0!/E .I"4m>ﱚ,}g(&6._6M8>ؐ//];I (C3!Z FނV)KH$ȚJ7JӃWg,DC/4yདྷOEW {QY)z/oA endstream endobj 931 0 obj << /Length 2142 /Filter /FlateDecode >> stream xڝXrW#̚ڰEE3lǸ=Y"Kds)PN+|! Y 2_|E9[ ϟoA3 b;)EY*P6ݬf_o|O07)%887Ylf  I|jqK8Ah "6ڢNH$dĶϩ8'apfb'*㤤h[XEP07uF1*.pn`cv#"Fs,}a2OIDeŧo*=#VD3;~^oaoCLv?! MgFE/jac|MOT1P-XƓĀ]So3nPz$p^gz 4+GMd\чaiXy:4y\C*t:VI'zJk1+fTqF eaWWxŗ+ 5pX]۳[޻'#*DF$nRb/R8> 2~隸; h Ib@K͜䏆@ s1*rF2pek7خ5w]GffM|2@k{# E):]`%[*nK= ,-)d d,.׾_3+g|Og!JNT["WݺZ5+ӷ8q2M O0}A$6BI"Y7>Y؉kF8y1oD endstream endobj 937 0 obj << /Length 2266 /Filter /FlateDecode >> stream xڵXKs8WEUYE{s<7v\kRS9lBZ? (K.$N'ݫooH)jrs7ΙIJ!,&ߒoR5f4:S'Sk柩S$LgګZLgY>Ymq[Veחs]_,IQ̥ ڰ ˎ'550./eDLaLWh0yr~y,¿סN5XaA )4i1-u$FZ:&(,K8|(k~qƧ.z^Whsng2&P8.>әJepiml*-žEg֔uXk%g+K|*4gKNkT.S0`}CN,fVa eqI &sǘMŦ\Wؙ벩?7MK0sP2daenDv:͟V)vs2 (TZD6Ӄi6>i_ UQVRyty%. D't0rU圻Yl38" })&, J_ wm/W vmb ]$(Xw0$"+O?%nUwگ*6Ý9WqCWa%Kayy J:ʴFAu^?Sa3~y!%װ+ G}` }Sޅb*7[TΊGyעGHQҏ4'P"3.KPa!Py)9t 7|p+5r'F]orL / :$D}5/ 4 b! =+,Q%tD<ؚ>vzQahA(,XQļ\0h Vܽ<1eQ~Bv.Ɩ8s͉Q@C v,l)J=qΚjDNW$ѡ:҇`4~cPn"jN_|($ՍL0c?+ALBDJd=FZ!5E(|9O.=}[P)}0 dLq&.`1ЊN~6'ܽ\xKa21{iZ }$`f %bEeȶa$ʡV\ 8ه(FS_!d"Rkav 7?AMP XX. n&BЀ ͏좬TCs8$ex!w!ݴ7`@|6XAM_[aMD̡mQw\4q@ g@l̆O}l-6t6xG8ϙtfdk_3=",:/s H/{@(ظB2v ` F0Fc1SY'WE{JQB}`Qf2 `)5RDd AHq*A¡ب 3q,|Xޕ w~yE7¦kSB :M ԖQL@ =D"_ AQ@o?3r_gҐ`4,0;M'~ #O L|1O~ׯ-^[gyP?cKgQzFT*zoP9U*$Bu{a'I[AK<۪q?׎ʊLRP4s*FwٵJL eKy<y!3+< UgI&8=jR+ I-ÍV!.GL֤;-~?4-yBQ-+z*wLkI$&¼P4<*yj#A yf:l^9&qLMgV6(HastoқWO9i endstream endobj 835 0 obj << /Type /ObjStm /N 100 /First 887 /Length 2153 /Filter /FlateDecode >> stream xڵY[oF~ׯas?3 X޴vE~%V&U~C)KBJZr̹_F*D$ ":%jaks_+}'vz,6IIA$9ph13x,Nhci"{\ HG7$?1>#vP2XL J1L.k#L0Ā||!I9aU (k- :&iDq*<4+(FIpx 5(,`oiy)]_a@+ Hu|aLI40ᮤcx%O2P4Ԕ SQ0HhWm"i $ì 28^@ 1"86DL2J  s`NQMazx@ iВ`d'k1($dC, 艃 l@ MNIS!9YS4v&<%VbAke&M]Rdo@JYO eg?tXh 6ށZO`&OM=}_Vd?ݼهS+&b>\`#,&5+vߎ||+VK,fe$nrdC1ᶼ N۲nnj* GN_k=;ly'ot!~\m Z餻XUEI${o)/I0z/NAoMY=bbGі|3bT{Qu={#3v*۸֗/euU-/7CMoxZ.D u[̋eY,(|llZ6ü|VdO)#t #f%XLVu;+wgS|,~\Vy|6=oOK:߿!$Lr>? I1Am c?'asノFכ,8B>}`#H[Canĩ-B`/FCNFM}޴uTlGJrqBanPINy(拢ZEYD -G5(ؕT(O2xsyT Uh\k]\[MR:M^HQA&nt\\FrB[ ,p/FD>:X/a5:2#q}e$"g_:_G>:1ThĜ&iqF&B{[&m4.3- N(fWJ^Xa84=^'ɅvG%p?(3Aڵ~#%t(/AEV$D#^^DZ.eW UqeYoyzE?%3"95GA(ck/>pFw9j)U:)aRW | d<_:wF(?$  J7&-H"]D'u(3$|q:2@ؖqoˢQnWn4E30`I*pPb?sua;=g݌NUr9O/~`P7sDѶ>Zqn穃"kK1 7;E sW$/O{:x4cb{s|= LԶ6mfD7n'6 @XRz0 Z'P`KZh\lPiIƿ[[Ry endstream endobj 942 0 obj << /Length 2016 /Filter /FlateDecode >> stream xڝXr}SZQčݹT9VƩ$; L(Re|˾+hpxa2͎ 3.xpGYȹ>%6 >HE̘,su9xݮ&~[pr*Wqs  Nc8C!wןUOtt:q|k (: A9i*Î'zo@k:lT;Sޒ%j&Y7i8,5 pWIpg(`ASv6}Up|8TB[01m;ſYoǤ{i:^R4gnvgޛL/LaG>%`:hiXBġG Φ{VpsU:AI 9dpP =8Hj*яu3K\'|T2\q"! wY$ A_/+-;T8+(<&cLbQq`J] % t aSI+K& ^Fݦ#,!H1;, >O MŖ6jKvCiVp>+m%[oڮKƅpYd>x츫 ]}(ELfd V4}KMF'p9 V@zE)xGNz, IIz $/ qIz`J<$< 'pitF|ؒ| ʼnVP8 \@l=Yzk+[t99Tf[|WDeX(+vKc1{b bBFAwyjߴ"2*3zHd 48hH_Aczcfk_Ty]9 q >.5#Q *>O\3=i&[{ .oNܶYS}+'CҁSÜI8D NCw$в,la~uRW0?MQ~-s"(7IE4x y^2Fw x5D1'H; L?˃CotpC#g9ΰ;[ŦNEvUpZwhS=O^T4 ;5dOkPoxl0U,P&z9;j˃^Y{ NdNyxj0NRCə)iv6Q(n+e{@j9@ îMt# BW,nW¢l22WUټ_5)5hh〄$&|}{^???noalװ 7cmӦ<Sz5h(4^^'nZm1D kXP$x0ztqiӺ0fC=h҇mq(ޔd@k[D h> dgJ1F[qPe]Ģ SJ(іC*_}n% oIt pA;` vͺOzH, V$/t?:+Ϯ/b19\_围kH Zֺ aWL˒(kqp{ "k4ܜ[/}>W9;EEKz zFMYwǺaI ϸp~EK10_aфacŨⴀf1}X7 endstream endobj 947 0 obj << /Length 2045 /Filter /FlateDecode >> stream xڥX˒۶+TwႪ"xdv.뛙Mbg!1Δ~>H %*Vn stbo_G04ʤdYbbQ.g?޿'.>Dߗ)#Z\qF4#/֔Bo)')Rժv}֕ 0/[䝭־Kp[ &8as_j'B:ݹ/vK[-z]vk;ӆ!eq֝ۏ험K[6m!m$r}.eLr#j1BWne0"k4 Hr$$}F6˘ŀC̠J)+*eb'- HfYpk^"WlC߫(TxMh"K67%, PbR ֿyab:tH#G\ۘSH_ \)m)%э BSeBZS"!9!;uZ?(P;-18>(lD9s08JpdK(| L=&̳ s6_͂+]GjPg50#Ɓ<2?m^7rPmp^~i ?+gA)*[\/;{i}W^Ҵv7!GtJ]T"R؛/or?t0 }#2qs\=9l |D>`P\+?Z]y6G T0M"pXyX*NE]Ķ90(ƟAdG(0)~8t^vUGq6 įx( (T^klTm\Ex$LjNs!器3Tφ-n/]om@joܰTJ)hY3!TcWCxS%Oo&#X}N1AH"%;*MZW`Xrm]^t7MMqʠD/5Vz{-=y(tgJ 5LMF"fRؤ2)i6rfIHI3K$y Td3 ]qJ>Au}cK\U~txSp^N-t.S<< EW5rkO`I)Ŗ dģF=>9?;EvAr̜dr D핒S,J?ƏwېxjSI2Q$%tk㾣0Srs mkL-q grFT`g]6^nWu-] 'A1<5Ύ< =A{U&;`z\NJOr ͲK#4 sj\O }CP$0!ouqQ!ݎ0pԝi$曋᠜|`-,E{+un!EX )Lp͡uP*,s7 GIzz_q螹?ғC.O2F,q9p3G[S%i˺LL8v@icK9q!J$\W~!L19dþ*ĽvP;G[KK.T`@>+#l@av,$0xA يaKd$nUGO*j `#b?0pJ^y# d ^ڇfeAOtچzC79>Vsd pR93F?,|mGf<$=ɏӃ&&x$0"$ Md2;^v9bm=Z'pncF?v+m97I[{6ܹ9G8΁;dv2TB|tT R ͿaB&wx0ZLdreH9cF*0eqJçdYB endstream endobj 952 0 obj << /Length 1979 /Filter /FlateDecode >> stream xڕXr+J d'Rtl_ճȖas%oÞns﹧) 8(_^LمiaZ\\-Pi2&_\lO~"y2|?,K6{[\&Rdpj{I eq78u)k5X٢H>}u&)0U3-IE+iRc2>ply],63Oxj,]9Te] llǞhnKڟgݬVY*벻m VλI?2(cYm[A,D*v,PBPtJŽ2sܢwDA 9.b'? &Ӊba46YYOc ش .Blo=7x ;`RT 3]i qi V+.x[^Vu5<l '<Д0RR&h&wׄ 74nT,sXa]0:8&!S#mB-8WG9-rbQ8v#FB~j_7!Ư暭njؤuW%I_Fж:.Ll O Q9phQ/)'" BhYh*3Xjy֗piDd[3ōI[t-;Xcj6A6s;hʑ,{~FC@5n[`;HfaEr((3~%9h1*cAb !!5]GǠ"-p9* Ҟ!$W18KwcDrW"80H3 `v#Nзл> mz0dpƗjsp o: .ᒙ[@l6>؁d:pƎ!!]\Qg9 d K[-r? R-sdV-!LCqkKKiQBøh);2ZCr.ٶƚzRfTCC} ^&}YuT^#f{*K!UY@aKhP2N=pBbG89s2 Q5E}5\1k2pCuTq֧ E+f] y"AKRA !5H=o|؁pP3YΗ{m4B /AW7nD)ܴr߭dܣcmeMKT뗧-F]휒h_nK{tZ?gWŞ=$4K橰ߗw/ endstream endobj 1035 0 obj << /Length 1674 /Filter /FlateDecode >> stream xZKs6Whu*xǤdtnN0 lPHʵ}+" Ȥ[o>, _oVW`,X8$H)E$X nk}53Ęl+eJ@s䑭ҤFEo:)r4nhA2;?]߼Ŀ]$7s\>D-+s%_}IgnOmϺIG >i`bk/Mmꙛ_: 1 ipg.IK| lv'$=P8œHȴ 1RLX5ìk:YS1ډ ^qfNƶkKHHr+`\.o^+'q;Z| 8ո;$D6g< )sDM!-Z!y5]Pӱ籩]"Bĸ( <"`S-z[?giߕqn,TP[-uBL" !/$il$_o4Eї(JkKxH`YED٩, ɀe[SkJ ACAB>q]IHZ74.Ag6hV@%=e mvId.qݫ-qA!`]qxPcWE =óXVڔ[$bJ!E$RSUpw@,ǎKr\JMå K)9gh XXPf|vV1-1)TCу1ӽamj.FʹNx];C1D)1r8t=Yzh6u j^{fXrX<w ['**tTʢ̩e7^ #w\:B0R<FAFvi V]P  X < WSL>SKr.l\SpyI⹕xnEeM=OWSy/%(-3m=hu~~ȦyaЬbqb^SN*> stream xZM ϯcr)" %tHAcXI[vVxйlUװ_GYݥҽD^BV 3$HEH0rk̛z@.k +ѩ rR[QbkER%je@ jfetL0D#&&+02FNL1Bs8c2h78yp=8T|n {BC60X\@#WFab3sc&7_+@A!+Cs [Kd}1Xr8+-Qd1Z'=^Cd0Go=9a.dz`2JxbUuX<)1ZtU8t!l 6ȘI ܠw̯ހchr&-σSE"I8,0#Jáx#ീWAh6^/"pҍ`7(e'O^\8`8<r;{2LTZ^8)W!1]9oǯ\I|s⋳`i06aUaMj6*ܬЛda [nQmңvxq0Ǩۄ{7QIh0 /oo>/%h)z uY/0 uݫe9Cy|^_{%~{w~ɘ_W?\IT=io_b_"Y[=[3?%S|>%pnO卲`\2&,.U6 Km0Ym0K[Z{>V>9ɼ0AªVfaBۄn4ot"TUofʛjl&lNO||'Yk?ESjU)~'3R)f` (:A}iB77ZT*em4G̱Q8hsxcijg&M|'^Lx1bċ/&^LܥZ'Ndud['NVdZiEVdZiEVdZiEWd^yEWd^yE1za?>,_Ww_-mo<-Iw""-л֞/څ&/{U}}[ S~vSqF c,}ryJ(d{׃{guKiCD&AFG3r\C 9gj(=PV!es#-uEzXrr#a7FUD;@B86q.C%Se7y,R1 ǵd;ƪc@!*!ɰc!]3R\qFdp I (DOT1#S >'+25>+..7 7}N{جVaTcN@G` ؁viM׃0}r b6]GS9"Am*{I4wڹu{HvY{ #_l}g*g#(*v52L@$S}㎎N[㍢xQP]g.wqT7y\{>[Fyd%QQx ҿ>7d81,?s02U)]pxC~1屑E C:$,&fPE.lwQo`y\> stream xڵW]o0}W1F;l]!ʴNk`ʿA`h_JsfiK(<E] _geЫ/.Bf"|1!k!KUpiN$Fy+ZI䢯ԕeZ j` SR=]i~:;<%s"$b# ]p?ߩ#ui<(5<Ɖʿ@jpyU /}yhyA_fm\wKă2:D[Urqnz )t)&5ocADͅ]AMi(+#vt:o ïtN8EY^ȗ3 !NVMvqq\ӹXr.QJ%1Q{s2%[qd1-o#8q_\?a"D{+l ?gF< endstream endobj 1038 0 obj << /Type /ObjStm /N 100 /First 1016 /Length 3311 /Filter /FlateDecode >> stream x[M1pHVH@Il,tpE` 8>UW;Ćb}*rrJ9S*!#AFcZ; ;-{M< z$K32ުaV2{+2:-\XE:R PJ)N V0H>,!) ɝHQ%) - .sNz A928&2AcHDOhBm"PMR@Hu6\ 푨i&Z&Da&Z$ArLC^>JId0Q7HP9KJ;J' E{J-*&/Td[$+MDP@P Tre"уz8 {`p꠮1eސ(  "1RV Y:8*QЁ#_3)02'Uul,*Rw⧮S FcgH+Eꀆ3#D@|XC߳iy_ˣp$YApAd?㫝e D9 )L,HyJH^;,4^|<^.z,XKt[2E7ݽ /wje2թ=ܲ߾mo[-խs8wt9F٩cfΤ\':)INuRr\':)ۤlM6)ۤlM6)ۤlrۤ&6)IMmRnrۤ'>)IO}Rr'Q~,3<"!1ڢXh9x13 "E=J :mC-L{*Hy&'xXYʊG f=Ā*X;! ` e+`mvķ N pS%b,ԉlsS,nu*9 tQ'(uRlb"1!fljrY!!;f<_AjEPH1g4, >hR? dp;`Fnku1R,2U 䥕z#ȑwgRjcnvLCW^J0B@V{J-m 0mfݑ&>< "[о5nn+\'l'΃/~CҀ@@*SZDۿAeۄΫmgu37fB+#jD[Gk,- v[I5z״X~W׮ ͯ?r1K;աsƑt@s뗡m6—Zl ): 1?A'>2S;+se;[`IY AvGUB,G$`}m2j5/yՇe~M?lŅAyѣW0KC ܯQ6:iv{,.4m%+rH?VP#agGQv >y:|`:qw^"e_|/ǜ=S܏ygNmK[r#vov2=~1tVMA/ܕyva[%D=*/w.9]Ielt'" h""] endstream endobj 1109 0 obj << /Length 279 /Filter /FlateDecode >> stream x}J@H&A'B* NK E;GˣL1fv7//fTЂ*iqI%Ұp{UM+o5ƼWTbǒ'lP~_' DD4 ͆o\享[v{d3 zBRD!t-2f.bamzCξS8̐`.`LcovaW4Uu b譫Tиv7 n{ endstream endobj 1113 0 obj << /Length 182 /Filter /FlateDecode >> stream xڍN1 @\IMKxb-E;}Z'l ^aMƃѐ"2)ch \1P0V gQ9]=l1UN똢 ڜg7^nC?_Up[ ;@6D!^I> stream x337U0P0U0S01CB.c I$r9yr\`W4K)YKE!P E? 00(?;h0a$>z A?$h LF N8\ù\=Y endstream endobj 1119 0 obj << /Length 466 /Filter /FlateDecode >> stream xڽN0/`yT )@ `b@LCERބkf_f4*{nx/=Jb ZEIgsXs9$r|vxM'Y5%* J)?$Mϭ,\濬 Y/d}ɺ۪GY~e]zߺ y\[ endstream endobj 1127 0 obj << /Length1 2383 /Length2 17575 /Length3 0 /Length 18970 /Filter /FlateDecode >> stream xڌPZ Cp~pw'Kp=;Bp.ܹ3;WWT{u %UaS{c  #3/@T^3 +B;<ގ Q' &f"d\m,lN^.^ff+33N1#7KS<#@ O!jdin_&4.mN&Fvy# - @?),\\xlh.3 h e-߭1S,,vڛ9 jg tT@rt+ݿLLm<-f6@ =/=(Dэ#PřJYTh ,& =}vvAfvfang 7dc388y@GĂj9Y2zvwZA?ཝ܀'W?YX&.c 3o 'K3hX}7=Єx늙TTEԴ""o6+  Xi;3{#{ 4ͥ`\ Ϡ2s0=ͿF6f&]TM߫+boc}.F]3@S%Ko_fciTwi003hLAχ3h&Kۙ؛e#''#Oxf(rpY@h ]@!Ps3{'n$o `L7I0q1$  `L')AzEܠzJ P@յx@L"6l倬(俈3],YlmdkLAd1/6h:-/]N';;HK O ? ? H(@P6 Ql@PRqB@?H?Afg4#;˿N;HMYћԹ?, - ?dpΠOE& '?.Ԁ?@tE+(@^@scb_=h zMWM>XՇt< 3MSi0x:u>!ädrNC]Z#~>nm oKVny1HTk_.:n$#`PyuhstFV*@ph,1_)R>X@oC @Kenc;L"I,[&kJ5V\r\mBۏ"2ޥe¢/5 t9בtOo6-Gٙ 7Qަmۅ1dŠY+j!)XpT5G|91(8Q)dRUSjdTY@n~SrD;8[6۴F4gV|,TJ=BbH&&vΒ]\81s-ÈŹ\@ȗ+?zB] R!h3'q;,SY۪΢`;]{K#yn̶h1Ɯ>A^g_ 2Ԃso|R}9BWgR&d!+CНHBEYb܈j~[B~/Ns 1TO.C锗:"bw`=e0K[_f1M<ʱ pQg}\>O&ٙ NUŻ\1jR%T% ޚ=gJ[;>$.!p4HZ6L,.)]..bdJGӸ̪pO!cTkā_{ꂑ^M4 r= Q뢔M@ug;\'̐_4Ĩ|˲莽80:cpxжhl _!P[&񬠥)ObI31((*\ =x> [80 ʼn)M;恰l/Aw =H ݼ%:䓹3&KV򬻆Nr׼8 E#OU]~o&y J7#Ix j|a%VS``ٓ;adpNqp+Fj>n@`J2`M/Ce}HͰfsK);Ю8V=L&)fFp'~yo!cz3!L! ۔c`3{9T;:IgLZq"fTݕ8mDՙ/6- ZFRZڞWsEmno+>M2>I1;}c󑕧.`x4])ʱ6KǒߛH>tگDiL>wbrY\ &TBa5[StlHՉW&pO$|fWFna/f)]>EpBG<=tKI72\{`4d[rUGKcfs ,c(+z=I'ezY8wR:b֢4~j,HQ/ƄSڦe  e;߲[%V-scoJzd>]O>sY-B+  zu:/(&|n(J`ſ`h|TVŖ$= ц|׵ |sO6:"=ߥr0qV3PDoڥȈ4탿s 3PU[BN.L ;~cэw~/nsSB [#}-Br{ĭ9ZPwW244͓Y7O^nkSƇcXͮ`#n2R EkBK qeAJyJnC ^K#H>Cvxw[9i<^{!=$95á$WLH/gǃ+ ݈:?bla4eԵ;ڸ)dw:@J^LxkgΉfR0=O_=:*W5cGHӎ4 LjG}|1:?5$[SJ:cWMMhw'٫i0T _~ȇy=5x޽+#ֶ"YuмܥXzޡ|ʧAg}.ɶ9( ip>ֳ8[O XВDF>[M֮T5_=$B6Y0Z|i7ED<3 F:ؿ~|N3? aiӸx4& `65N0k;}0cԟN>]Mi^1K7 \Ĭ}w8U4d93gH;ȥrv魕J 8x#@wG[anO]g&ַ vOn˘4)?ғvN8ga_*t%nO4 l)cVk/$+:V2ނ[}됇wga6S& I )8}۸\@.gEXyrp4ʬٱoXʎSoل3BӀny:}*43N+LGV so2^aQMQ[KVp ~^rގº`*s4Ѽ^ 2r?= s '~O" SՆ|RbQ٦/p' qo0dR_FͲn&x(uuLv]ת`[c^Qk,Kĕ~%vLRc <]/+y;q3iD[RIuȪF-PlY(^|"Al̨ea;o>{L;&*a[v$;W<Q (jG,MĔgP"}Wi% ت0U}3W|Cy(:`h;A7Č!8TMpFH~ ; y^aWwc awҀ%-°(:&Y? {<.,MLtMvߡ1}䟾UP`s:kyG5#<yZ}j&+F5˥GLrHC4'[7EgY2EF~{1G^g'Ƨs4Z EҖ~`*dIUUa7!gv"BuMJ9=]~1<:@1AP!V$ht=2'ϕ:apC޾AAhm;tzo+wB(eI]~T']..\s@eȻ}BE~opa%k_fz-^v+Yp1( A jNt"nz"f5,Lg֥B&+1%aHM ׍.vmPZ-qz&Y\sX<ϔ +]O Suk8 ^5/KWONwUgFs;<Nבcg 1nZ?e5?(sB[ڗ&I5$-hCVPwI)^[`@A RZ,S뷸Yc&[fiQ ?@g{Zm=W)d(oqj;vN]\{.٫,g{.#i´dHa۬5<.9z-iO?4 ׽洏M;YX9l\ACG6k,  &gp 9(aIoNlp6]nW/Rb/Droj Vr* [kze8wy# `WP _WM缌~SUaྀ+4HMu3=-S7¿wCͿ;[LnuQ {mz)]*`s=| j{sT7=8=VJ0k'82ޡ|ۧLfۗm}9gI[9Nz " D;^,"9?M1:1SMIzO Pdg\l NXvHS©2׫S1?1Nj.iTnqqLҧd7=U| CM-Z~N~e"gQ_zSNvg,:LB cdqӧ-ț6ߊY[mQ;fr YJobBҗoh30#R9 Qhm3ul0[&Bv ||Ɔua"BҤ沟r5!l[~hGQ}W:tޔ`ޯg+GZx V<pdX˥N-.whr45AL }gĕx#F\X!d I 3f][ztqP>1BƊEz+F_$k["rqSdۇQ#,U2֌jګ=C}P,l+TunN c<Mڷ+T̊*\Fޏ2k!wVhOG.fvm5\q~0vm=XqQC5{%AF^ Zx0s#=6 }2mFP mqf* iteTkU=RvF.Q?k'Hm4i >{ζ &"ʼntUAljЬ(2ڳ N"&[Qu%QkF6}wjtlʏܫ D`;QRhRgo(>} m0kQx BE"d]a,q(t Nk $JGYwGgt%_ևJD8ڹәֲz[3[0Q2)P,:geT4-"-ᬵo?>LIp=^XCĭдÝ5/YR*2"]M "q2qXoOժɺ}UՊ*g1CU6YVr?hr7*}P }~~uio&%&!{ʐZ #=,q銯W"wׅ|h sL?5G}/-uVA)b&_&3YFt˨i!SG=jn_a 6}\4.~*Y9_SS_KN!%q!PG#":}7Eʃ*Hx#tUjUXa❦Gj?ᓦ`~#pgh`~7U`bjAGi`;llj)b,277#.>PGc`\a`O@rǩ#&wJvBWG9YrY5(:"qNl.蓥[&%yƦz|V}YZ=e`;yf04!nRp!XU' 41-tdwϜ4-OB#1 '!]~Mtb{WS) \Boao a) MXc4ʉ3Ĺ@& Ĭ5eK嚒iK{0aȯn|1/}8#v6x>dY\m(+4FI+֐%eҤ4RZ͐% _z:bGl:RFTkorFʰu0(H~__]֍ͷ)rɶ@ ,Nkã|tvC_#RP~0{p~}o|gqV@ ?7AگXTСrɟk0Mixs#6i g~ϚSClo~g7RÊ(ⵉ T+?&<۳ 䩰ԷU~ m<8{:{A^ ?96X؝qHAx;9at#![hg9(ƅFL">u|hxnj*+r;`mj^k"l8ƨ09; ~%l3CZjźؙ컺d>ި]}ÔvՈ[P,1UK!cW)8ode@]6o]ߋGuwsd)B#G󋐁sp҈OΡ78{t3qTW!#̬9PP N6si0*G80 {͌]FqI Pl1Ն˸A8[~40̟h,t> oWԤ^f_KRM(.iW2-Dp/Gڭ;I`1ᛸEi:_I ϱ-?4kۤ#yKRF"-0$%?ЂVP 1}T(% K%2:wdlPA/M"ܳ(FJD8]MK3'v4(d^)>NsM(gu&D*@po툄q-Qќ+&;Xp3K]`IeCP-5렂A<~zTLp6X =ʲ ߩנu) >r}LJÙ& _+zmFt{e׉3u۽jtkϾ}O}74bN! m*4 ۤ0Zۙ"kkr/8̛q~DZͭFF8ZZ2Q\FUNqAf(*|֞ .9s-@! Gz 1*yrܐhD(Hӥꁞ 1ȶÉ~p7l? n"S+-݋[r3`6'/iPc>AаL9.=uϋӎDF1tjd3FBFZ'J(_:<šض+ " >􃱟Cp3ʲpDR@Rq*5LngcU~Gp')-8̆(z̪t qRK׋ |5xZ:Oڝk"ؙe3ѫD3w{Ue`#1݂l :~h2DBɸǤ;N nIPg0EB<|usBbm&qpCЍƖ(mc 8=ӏ^ѠT,j̝~O7+gz qZ0{A$RSu焿O$zB*hjsO[{7 7+f wQk͈8ЬmE3@|Z wW "ףs#w1K_cQivaXH00 )fѳ'p{'>,xFYw6c.Ds>bf}*&KNdYxd9BTW)?ђ ` =W \f4Mabq^A_a"n=Oc(]j]SH ݦ-n-KWyh-157z3m4b❮,XWyoʱÁFpGUxgNr$l~P+,~EkG"C!RVf, ]g;ކVgSy21wB[e[BYIIJZ&-,k!=R>)w}002I\Q-Ivj_ڏ0K` zI{fr| Ż_\ _?jrCmPpT̖M)] ~ȋWV[*f*_Hxٻ5E Ѷ5(Jxޑyuf@$i7)8yKbhook.óQu3nX-:߫QXfcu=g_.a תyEَ%Zvc }]O_8cH]j/E7qsF HOـ V-W *d& UG]csBnA_I0^J |D \*`;Lk~/}6\=H~Ǧ~-I5eq 8m0aA Q$kA@W[cݳRe 8fNu?;5dJQl#~f7 ƷpUA'D"Ӈ ->nG@-ů:xœK(mgA0ЍŤ}E?w{[+3mx*a9r8R_wpE.xim^ Yo[2Hw22eRٛg2xV:ы"][=%(ԕP~`H|9\%Vxj$y.Khc2Qa/(dn%6ET =_p6O&׎zFnd3"*sosHߣ1n'ߏr;pOn&\N$Ŕ/h-#Z F93:QIF_giؔMfŏ{( cQd& ʹbc?toTRb0c|z CW]T4Zթ.au_e340֕Gk8&"!+1Z_EԮCưrlP},%0DIku'H+D&)|(YX󈄀{jVAGp(oN œg 剺) T , -ꭰEl² oMMq ogLJkpQr1p5нx?!z>i ! pwь)sf>tIIJFּ#S3k(Fh }fqQi ͥ RޱHl?}F.$4&DY7cdO$)-8 60 }b?4;\iɊd{KB2,?Z;U5h%ǣ@VwJM/ԟuK$VEQ.B}($םp(b^-,淄5#pw_(wd*Ļi[sDià3 @:F0K꨻9h`[Uw$YFz3 Ե"'RY s D+xؓiU<Ӱ3 omȆ Vp-J-͝_`}3>$%ӥ[a ^rR7t8i؁-_0eJ%}-v%` z 6Mtn67})}e_q~YOqEJlj}/}!ɾp!45\y9OrUnʦF=(3S.]lO;l]:MEwyTSLZ SksxZHv=deLBHnlz[O 8$CihXp:^~2>&?N!?ING#]+Jz(,k!`Sݡ\S^Uo_% C?ny13yת]^h­u Bu5 c'^d_ @.qw|1QЊ¤̨A]3L}_v9=hsNdj.[G?},2+wEi5}@sW'{zw}&;Qv08 !/ɩj־ ӱw9(ZA%-HAi!KD=w|\>+fS⭘gl$gw\vb%o}LIsd"Wiȁ0{ 23dKM$'n p3衣m?Ȅ; r4SBj՜VDץ>̏#ڧ%3fgNTFB5\ jG(1v.!.n}!dyUDJQֲJ~YOI3;XLEܬB[ uHۄ%+lj4D(-I!oyY?yoZN~\-3@gK%Oob,^v`[Rgʕ5ϗ7%H-H%ׇepv@o8C.N!˦0_BMU ' yne_ [SzmZϴT gaO<\DFol6T,4T ʉ&~۫!~FE_bE ĚBth,CMABZ_:?hs&d[(eCgzA{$ޱ7{jU\0^`[GzH!Pg"%ދԨA8kLWGB6Hq>gCU=<EJݕ m6ItJn;@! \RF;fQ"x;U$RyKj) Y 2P4~u0?مd;S Xec`@0m8qh'v% FoBbw{ Tx_!2ԏIa{[#9D:BԎE;WӘ9pU% Mʥy˽|<:S"F4p>ݟF-ȍb .D!\-PɔSMD%B&$Iwǫb攪B=,g0XbmRz(/xxtNvI E$wK_λHx4uֳ$y$P 53Q$îΧDbK9t`u9E1F='5B|Uw=h d촙ǏDZ>u'Kd79I?ɰ9dڸ'm:3]X0AV&xQ*c? 4ߨJ8Yzk13EKSn5AZ:0{Ɓ61/X)8Lx ϦxsrOfqoeV+MH`l)|AC]7ۗ K:zP(2C_% +!<-J$(T  D3fQcݹBQ,{ֿ>arr5wFK ‰TvnTM\n ^W(Yw:A+_,(9c66oKU|l ]έU=s`g3( bB}&u#򫠶f]̴ id^'ҫl|nHy qL7>!\T: uq-r{ _f7WD"9MX%Mʏ$$i3 1WhŒ~́R*ƧEqB= Y#M@23ڎ؈B$Qͪ) @rJ,QY=uk6csu >$Z޽Ѡ_E,Q]?QؒSzڎ>29|fnP7Wǥ]͌}w%Q~p;^0ݕ0}(ewMIz^Mx?&oW=L ў*k RWRE!"#w>`} iւp1q'HK_K&0DF-5՝Xw>DiQ}xMZ٧E]=BA;=.d«J56l`BildjJia5dy &gx BN6(٪yns 2m}Kȣc[0"2i餧y5L:YeFlcN97ǬߎRwan0Pl}]kE'{U՛=l8 "o⿬y^qRȆPM+x*Ih4m:M9|ˣuV`Ȼ>~9EXo)8qh2jTt)UOx˚=t "dN:~ګ_wirs*NYvND\5pZi*^oSUI Q {]lJɞa#f檣A$9q(DF!S}Bk37 C[c7*%D3ݵp"2'{=w Tziӂl.zCN1A\-F:RfXͬ$Dz l15JyCҥD [f<?g NJ0NsӍmv Ώ |9_=2GI?G=AҵqϽοNق.N9]8KKVFmA.yYsMUycS^B츳 x=HȊZqud#zmJ5Jpl,)c׈}tŕ6Xu f<´s%OO19hz~Jt$sL|Hyҝ4ιI܏="[̞s<՚5#Yqנ0.vnLq 9a1)> stream xڍtTڶ-AzGZizE. B"E#X] MQ*d9k=b70TvD8@5p H(PU@(BeCCsA0\?H(uS8;$ IȀ$e@(7}a]!=M̥ @œ]P %~=H Q.P!`w1QW{x ! |?`"}_#? sL\`' \a(:Ewk=:ܟ_`` ';#G p_D7:  [4  AzE*D7K/}R}ÑE/fŧ-a`;>~OzIO;sO&VoU+-̏׳n,L>EQ*,`^PifV-maBNEmHM}34tC ķx%-qwC 㞅-"7>qZ~rC{s}ޭc~r3D/<, |^Tz ~ɣE;qIU*oG)r(3bI:g1{n6n&0~zDj=N{n,Z7AtH?t*u`y{ [,ul o6 ,;dz#h4ڱ3檬@fA0^+n˚ŷ$ LBµCR9_"nK ~tV-&/o/:V8:d! nO^ސw`|ϹER״ڃ8j ODBB|ŀUgo6l}cwg>qjmW`H;6Lݻo_oUn.gt*-Y6ZAUpv'I|}Zguc7L^Xwlt2]CDRNTuZA UV8a.O|+MMT;DӔW܌՞u^YzU`:݈֮LZ{95} ۚJ~k4;X̙7Bd% 8GܟE3_Z`Nw >4䀀V,&g"4PYyOsj Ƃ uV=;2I^1g3ν^PW={g5VgOr曮6{x :ܠ:F]9 Cw J AlzYJ_˄}^LU_qrSe!/ʚgL6MX7*ڋ ؓ%afUqѰ{1: N3p49d@3=?ȭIE[A5PG]j<-[Ge<ũQi f*$~\Bá<YC KU/*XGܲ8^Sy8-D_nA=IVK<EԻy_f`ٗ#}y)ŝAmu3"&Qk/)KLCrd&3ˮ(hmկ<87Vz!F|dY,;şwltݲ<ʕsN}HvRgYJ#v`.sF$Kz{Zimy}!; >aUD VK}{Z⢙Vg=k܍Q6%D#)qrLbon'b#d'Q_YѺQ21UOl*gɟil+ȗ˼Y^z 0Ӝ>$!mPc;XTm:Q.廫Z75aag^\V }! m&%al X0t j-Jt$ȺkM c~VBL&ETOz-x1zȂeɗAS׵f[Ճվ:x&71RevP.1c쭛yM" BăWе45PO/Ki8mcco_ph}afl22zlxRt]!p)*X@#|fݡɈQ*oP,IDFԮڷy1R܋$8v$踳͕sIl7izJ k19ñJ4QN|J8ځa+]Dw2،&6.T]k8|_f65bvr9d& 2ht|}bd"ڔ}|*Ml%[68.nTc\2G)} .:'zS\qS9uz8L7MTOm-%L"# /3}e Ҭ]:SprETZȡ$J #}Wh'6GT ~d]O~VL[j 4ͼBA=|uP[êZ+W NZhqc(v\~Ē0qWW\,wbw^ K!M->R1 :ru4JJٰH9)$!uId ~ֿ[U^,椐q7H,h$g\o˂lXSo;45>g6 } gƟ6 MA:lڠ'}ioaQkߺbBUc.~.6DQkx kgxC^9jr2DEv!Ѷݫ(%>xUݽ$;V#үV_d&{t? c/<7Mz3l[EU.cEJz$HA,7ȱ\Q8pE>^lJwOU#O(DHX~AH'$)C\O 4xߓ(ڿBJf; lNx[&R/6˫&H\t76p%aybMzUFUJ6$Ձ!6&>~B ShwXkK^Տ/ x%1`d$H)B28ZcyyEUUFzaIx{ HHmgL #Bz 6Us+}#5eU)m(5<ո/:. en:hQaayۈz]ਸw> 5PQ+sv{6?yg<#4??lԡ3V7aP$Ed69+ZL sC2W5όSNϊ-Rɪl/\ӈj3=20V9?.7<etts+abƫL^,bOdQOy8oL\*¯8 _eQΪɘѡejHS$ קR>.lzSFsk9Q7tX'Ϛ;3}"@T9gGBȾqZ=`f-gLY{.ԚmVGTAenw̜ylݼg&O<:? ?}Hf'RUPOn>H~%ΌjxnA2U|,8d08X,Ļ|1'^ ldJN^lk@Z?*&sIOܵQ)߱eM/Pȃm>̟%n:E. PT -DPŜi@@ { ͏c P#7, WۊF7*EmRlWŠX\o_-O) n4RcXɨрR^eT L@KlK.Ǟմ0 !`W^<zlEWa$Q|.&O"d.S|r*bo<.Ik+EJY׮I4JW9OammtMv9އ L(Gţ(lCɾ`*`[~TghIEJ?PM%{/̷'!B pRmbkX0]ipמjg`GZ,!+F T*,XJ1, &kSV)ԬvAS}wW\u^gHFy&f-N|gr`|z Zf<'H/}" ~=i2N춼I^vN]X,>.ܰD{<Kd?]0&<% xL\i;k-fqRyhM @_%Hݯv+:/Ȟ-P9 &'VBl/W JBDed0;;[N,r 3_~R`$0 ]ifg[@.Kςt endstream endobj 1131 0 obj << /Length1 2211 /Length2 18035 /Length3 0 /Length 19366 /Filter /FlateDecode >> stream xڌtk 'sձm۶mN\\lMv @h/c}8F:_,lv64675ZXb2t4C[ > ] - > N &09;Z;;9YXU#_a>YDhW~"@sZڹzZؚU= PR6"?233 tݍ"PdKQ= )pvtxS`ba 0Y! ܿ;@ a&vbzy!5Y -_;@`d`bz_*Cs"&V6 Vǘn= f#_ K/^Ћ3 F.}ArE| })A,z?]`W>v?v"Ώ\?@ohmoG#W#?XB?=#?GfCiG1(jBZ IzkC#?l>m|da#k?An;L8|o?Oy;?1}܎? 'kC'|p򑂳?3 g]?& 1'@c;c ZA7  &ډB=hxrbzrB^{ ,i Ďb%x-|nSO*qQ@71P&M^߿FT]*C4SSlGɹhXe&yΎMLnNX\:4O#l[ )׀+oȢø",P5jk/9%(^FʲyJ:/Pa ;RY9RrB½LxŔZCFg0!Fz)2+Ko| *GXVkҩP~P3ݷ3gޤvsZ,'p|9ڃlT\2ihPX[ 8sMT;q&B%&%b\x5'ĘdgAO;a>ܰ;:# yn7L!n{N9|>}HhCQ e19Gm.̹Y% ai+&;y7K "cgC#ykzH49SIrN1oY+J6u@g]k+Ý9G=A8WtEtȧ4z# (ScC쮱$c=7lhN&'g)eߨOg)Ң=_/Q$SLT6y t٪E $-(%;Vþbr̤ʠR-m{X"ĉ_,1V 'f!*[ml,/$m+pC^XR^Q, }QvR kj G E@dHPX=rBNU9}jI;q ;R8\I D+JU]_ B@E:@o>f4() ؤ$ϦJ5$1tsR WbY@>yڲ;۟coxٰB& P212}T }3Je n2a,|?af 4?=Fv#.#4<@1 rpZ W1QNK0y@d"o(Ji-hZx9Vm.NsKRيI3|@/֒W9˗P54DNHiq7]39t+ qHQ*5[uO+5eu AJ=\[oy08IьzWch|낻5Ύn"v+*j0h>Gkkޜ:s*R6V;R*-Zp0>ON6'v@!idžx:DXYlT>eIL3+z+h.V =quTgJ(}iwj6>܁kqJf]^Iin҈TMwo! "c%3/"YAqqouMi˒sp~}S}a"x?lzSǡoiB\ݝoek[ВqbܢZXqk.;He7k5K)LN[+Pwț(BwFÑY1VO轔TY,kMê=ؼMB>ri~-.G~#D[yelŗ(͏AGW{Kb,'7ŐrI:ͥC]Ɔ'f׃]Q%Tn3lsߛ'H׃,hfn EAnW2kzV<U>3F3&,Y$u)ppI;JZl'M&>J4F;cM}8Ir )Z:A?Gp Fw!1V٤8J}~a'`J9{{snN9vCDw<< 71pJ=hY`Y.V,ݵbp'vt;) ljc!lv^?/AYoI" M?QkR<]FZתO*gQMyj4o{C*+~؆Ʈ$`?/ j%US )5we[ZȽT"%(>˻#f@<-(*1 HZ-%x5r]U^3,n}?9e!,ofX^q%Re;az3 DzKI+kt kV2siAyPCy= 5Gg9P:u!(0&ʢQ~2&O@) >5Y9=Hֿ(PJ[c` ZuKbT TAWk~A]k54?ENL_Ts uiƂKo/z^_7o.cIa0Ȫ3fpOoNE5gd&5۸!!(BMD [-TKϟ2Qil}ºCXGu9{uw>Dqvi6r3Zۈ2UMaC+o~zZDdž'q}eaeiK w/m]\@)\\h .j FSaȸRמኧeŎPs1󡾀jta1<1p? e'TΣ :$pdCEr D4⭡n[\za("6m"0=̾}gg ^ [. "#]li:ɥ {i'nsFxWcBXksY5>DB߈>AJ.?N~+wO/a6bU:YN_ Lj.ziDyBFsAfW-WXx#>D#qjS]Y|/a&|tɪwAX.: SGBf.a9J?6DQ)?ԡ5!k}|_Ex_~ӧI[mq*;K/ӸgcL0hZx#YP(2kJJԝ{a-/Yz0{`u#>#,.>ۙ \r{yk xtK ϶BL;tUWW"/Y SB$)K[^g7Ȑ˷J$[r)ߏ,VO/!„Z)pWzBy^7 .?dV")_ K![8I6"Uc>"]9cfQU ˳Q]~C+۠3X036?(~pw\KkE&BshahbmcpFRCZ )* )xr1n(E b^C'V ^R]˔#> de4هlU-׫:+9-=Y~{ cfS_99K_ߗln%a˝rs؂2>euŐSbJ* ( rKa!/^mEY`~'ծk+ߗ`OΑg ePtdԩ,(sWA g*CeԿAFK ޹_e< bFp*:,눋 8Vt1ջ7.WWvWA[ > ,&N)Ԗټ򞩵KTy]|H_h{{[z"NZ|n)xv]ZzEyٛtou.凎 āAĄHQ[ K;V/9`''CPg#(t-ϰmE1F? ^'!Rdl}I Y ~Btk(@qd5P'ϯl4h4WvaLPQE]*߱YQx&p:!3j࿊A}ЗT} VdWV΀Iu,oug;_8P]:NY-'ǯ"eG yeY9>Y1e],IHrƟ8TXvUuZ(aèRߣhFg Y2'aH,wH5u*-Eژ VDK:Я?L5cT\ gȒ$DgIstLi Y )E)i48ڵ_Hbt'"yνQ{56𩸗 3 ZJqlT8&&>q:v tw_`J&,G&!Jb 0cu1a3Y189ňpXeI<',1sL$ ҨޝjPP~ߤُۄ%WxEo,t}].exo/ (s%,걌1[@Wq[4<4;'t.Ma爮3}^ 5|z9Yӫa5/!oʣX^Q]I{Ƀ+7r;qIDI_J`2+Eqf>9@˜PL`.l/9rpM15(sɘlſXMnIc^\DzoX~DOO6`/!MEZ;L&ȍM׷OCQY }0j1z@Im1"8t'_{F|>Y%qүBJ)`"}Em]};bRl.Yx]BLV^<`YLdj}o<*jA#C:vF}L)o8(_+I*ax@|FG~g"!s1=Y ao"hV#rG@-5[2%LȉTfSP /g|3!pF}7IJ rOW7C1q~ԙ$sK4L^{@났7E h`1[TNwý>j3> }'Q|?Έ" @i2IH'wҿm=9^u&QG<(1l;zi[3 ٺ8&#G HYgX̯EINA_0lF)z8oZ|[<}D% @_& a t?x? hɾgskgu``_~ z%E;2Ҫ]T/ SX?y܁TN3:cHą줎yVE75)$ScQ5tP<"uɊ->Ƿ%&[hя3l8pϓunssPsOD-4F[ShK{g2| |QrGBtXFT. Qxt뜴lEbT񇢱UQLjc)&jS Lp0ꕍ^WN!ݗ#5jS"f:7Q\Vf4wW!Jmw]ymW+}R&EQǹZ{vJŝN-B%ܦ 5y*UÎ,&ɕ6^ d^5P0̀A_NL]kD39NLw!JmMvZm`QYz3^B`zZ.íA{9EkSNXD`=sPʠ^j>1Zf>MǫʙFZ~SJ= Z?eӳc1FwIWR$cnճMM.fzxH*k`>v!^ʲjX@>qO&; @=ޣ%@lR(IYɆC!y[-ll*ڬ#ɏ.|^Ys$ԅ'`$n0Cs:̆,"]WFYS:uFۻ[Hx5I{W4 Q1o]"շFݽ xn5Xѕ9c3M'}mdS3kԃZs#t`LH\9.JNeUHxd.x.&nSI L#*癭ogK`d*q'^< Art{r7 Ip!-&)<>IJ6_ӬQlt\ӕ4+-a{iUD$B;Gk?gT8i T ߖΨgryޜlٔ = dUg!y-|Uml *@!OHfD*sC:De dnW£4i&9!@otAyH˚s= >~pms| '={wb4S{o݉-ux*d}:yVfcͯI_$ }AL]i_Z؍d ++ Kx zjNI6L@ L@V0"ڛu$p9rodAolkD5n1ֶU7hy ȁ UE8#˜vOM8qX?4m`\1kxT<S1z k\P NjDr;g1w :(kQ._Z][͹a~sF5Hx4|NQ^–Q3^t.SLeBC)%&Lþ&pU4Ʋ.]~69}(zL.}^3$&-js=ܤ "dVNdȍw- Y̎rMrGUz_&V1i^p;lDX?ZZ C5kZ%ooahՊ%6d) #rO 6x>o ո\ 2&i{n{*8 sU`_%Qgֈ(V"MϴyX@=6U5EbUMsI)4Ks,1fUV0iڨAw̦w~O9-K- ̇؈dENvJ&n`umGWxBRmNk3{j4hE fzbvtwA@WdB#{+;u9U@MGl!`{>se/YM 97SU#ԩ=k٬nOQbq1;HȁƯV/ C3Kh.đ'甭rLgʁ%m餉BQ4Q3@>u)cwe죧-#'z ֏O܂^ %M. 4s}Q5 Vr:ڃ|y5AhB}aFO@|o_1/|ŏ WFbr{Z!F%. `Z>!Xe8,u:jQo+c ;Rucis$uƛWG&4WݵdB vsyouqm 8*дA5MR_Q-:KlnV ~'QG}?%ǿr4}:'[tp2)50E̊MvHf-l^Fɱ@+W^2A[YiT D~HQ& C0h:ofS O{Tډs7%\=hNu'֨j9R8Θ*>" k먝u!]\ƒʷ%=.v}ٜg|Xa>vS|mS ~~ڵ/wMn5"jK%s#OIJhTV0Wᆅckw49CU=:)IKt< "e6E5 /v-i:0k|\.U~Ta& %OO%2Y:btvK=|Ճj8 ɟ(9~|| v_af"}m*|$lXgW:l&ohpAJ-8[B@]n3GZCtH^tc]{'=FÛt(v,JNW-4Aeد>+@Y"y%f(ǚ6;R/ X31 "=jx<6wV?c@;OCZ$WEQh5KOkTtp<_5R@aʼn=u叻$x:viߒF`rv;_oW6U꣐$e>HFKkMҵ ҕ9yprB.!7Ctڿ:JƭlF3׳PazhwV"DdHSxÑq(M1p3Pi&'nV۷"* 4C͍~[ÆyXeh.!і,4Hl #GȐX ǔ;8h}? 'j@LE;8m53ꋗ҉> #zc5Z*;LR-GZs[b%We1iFH룵N&g֘_mkɀ"rW7V$2!QSLC¨V& w G 33=eq F{iZm&[sBtҲc MUtү$Y=Ue?vmČRziV&E&3~l:(<.,#Xٻe KY# E)9cnb=mɰx\_No}p.:NB RX)ST~XlsZ1XaWT?l?{v]%{9 b$LR]v0>_ A|884?_SрFGVn㧎90 4So dXv)-sDQ&z;(,a$.3F;D'#SvI5C>bK+q fLՓJ4q#r\Ij&vc=C`QN{h[V9Ƃ>QAA.x,w$gџ /TWv>Ǝ\Lt T5^L~뗼oJm*|xttKt(cZq fq R>}lVO؟O2YxQ<;Ʊa(Mщ :"=ΧT5'PTsԝ) }Z@Ca#v\g9 @x~DUJN/sGSYF|>): 3VuWCi1e]jzL9uLDxGj}}:k?SGä p `ʤ|m'< p:D?;#")>M ؠɒmF% Q@,UVMZ !#K]HB mFNc9y|}čȥtaْ&xyWІhI JD9\>ۆ%ru_nSDQX&ɏ{fr`ڜZʥ9gUy].t.jYV9ΑI[,x=M- rmVjFýo n"[|t_]Eb'3,]P8}Gζp |lŘ]uEcB"h4z>E<\:>@~r!Z &-qK~ڲ6;-ж`_`k;6ZlZYtzD7 rLx-5p-X2aԲl VyW|~['pΏmdu ܬ4g̈́=_]|D޿?].僚G E3Xi#PfdسV;\G;?|PŪ!+vݬ{?t#)= 1W(-  fI;W&)6 HL!IYeMgX\'߅OP &>UxDF"#q*{<%~td+kپf@89\(7 c~8$Pg4z.reԅ24t@J)uF݀ k9U&CmT'YjIjlM7L6 +u4=Df|N_Ay[391;LAFCl~"hp⃲_I&ʚ7HCmM+ZťRox'I*=8 n̟QRM,ILύ\9hq QؾG3;*8Y>#L94%o+;tfh 4XUMV'BEG"iR 8P@J7Ց4[l=Jk9;5 W ~ԉSgV3#uNC[n$6-4aOp݂S`u86'КvYp'>b,PF+ޜYD>`|0W!!o084ȼC+yǽO l1ČQ6Y=`toAԸ|^ PU1 w*yp͖!fM򻓀Mդp3d1CW*TCMQb05˷5U`E }ʀPGG-mPJA+LHeo\A*r1V ţj D) y# ^9g:7I\K^e+;Pcфߨ?__2[`<. p')- U'FY©;}l{ẗ́QS:e[nfiXfln%@ kWZTU_! ţ)tyoZk8fve +Y#ZC=?%P#Y{czxv>H `COQBWKՈ?L}z*NQp6Cx8 F۷:n\+7|ߩd;I\f~c\d_FO0s DN?n6s6z×ߖPE; 8m>%W@ QҫO>WIʣȏ;kmRKGmq9)eTP6z`oX̗.ɼt$)H\c#dD4eD#DpWkǒrb~?΋ut ñ T1/Az0]W)$g.j}Y:\݌vi*9.P*s9J;zݻlA?W[BU,F_QsnZpRvL/A;I`dR'x4"ElP {xJK,Em iSQE4FLwx^NXttKn,]yU<lV [#aVvӗU1QMBzBs:1|jtZ?埏cwѱnGUIkaU^Ij6fU3Sd25kTف:ipQnVPaY-\32^ G= ??3b%+Ꭺm5m 叼o;kZ('$W cRd(.ՈҚtu*ς%Y oƙkS/7lyY$ު4‰x YICuTI= YѾsтf ʯ_uxW͢4ׂ?# |vξM9}50?*_$ZQlRL׏]4jv;hc OOlWLa .2,isQh.VGh Z6<p#ݝ4v`ufgbhǑWJ A_2)M$ZZrGkF"jΊ)o8R^s%^e%04) ag-cM9Nw(ə.o|ef'^kho4cTA]FWZȐ^@kJFxn!`1P)]?<ݾXzV5 -v臣 m7x㪣Cd7@K]W_ɻ@KTWo띟oPU F[σLit -|?} 3|[ ԙhȸbIfh-R^sm$ >!3g6N» *[6:@mU&#$6!hpz K>M̑4]FXoྎZ$7C^M/1|E-REa=|x#7?+(: R[zԀϿ>ޕg!Q7 IZEiy3_%6oU6G{.fB㢩5C vb1$ -h>{JrDV_[칪}=]|[rm#_}B}V`Sb֍\GH! 6{TgCuPc1/s,GzbTu <y+Kݟ`AϾ0?gPNL7󽺅^uA[%;XPF"gdu ?ij5#2y5* ՟.h 9w#j^>EFU~}KNcqtvOIXښ "7P! ?7X11 gE=sCݳ' HߘKͧYI| ] C co6apmwS,:"7.媍)c]Aݥ!^>9|hÑN:SaZ`ќqꎹ 1t;@0Jys=}Cxg{c˝_F7$x4n%-yN݆Ml)pXDMN"ԍB]7>=0Di,^"k2j:_K1mk~\D%Ckc i)>"iA>3d՞@).C8@LV #a+cx망פ ^6"I;ށZސw!*3tYaH=zqMx_a]%io2zXCa7V(5G^h [_J$ zq7(&]-;xW'+̑\s}b!YJ$zѬ!טػ'?[L*;/;YL >_l|mjB=11:k ,O~pQUYIZ 9Cce5QcBi, t`tj\j@,hdv\I%Iiq.gU`'0uE+uS\Ǹ2po+d$/ċ0(19S|z8D!S2hXt4lIbCK[<F|1e_*w*p6(`RW\5 =.C /,dg,F/po",3̳GJvRK-4q d6؈<1- 1tMFx($K3wSjn (IlS@E.?1]ȫCu#mB%< .nt*\ BLguaQ)*TB"}mt8w"Q,^\! 5i܅ݞP*[&K{ [%i펴 P4ԯ1˫zPx:eX "Xe*6:B0}s޵8ue%I|qΔMIlԎ:N|6EUɹP #摆¦@v d;gH Џ&J{cd3xt1?f';dT2%2/v`V |72j{_/"tRGX\- [ƄZ EEZ6FQbZ ~c#NR80۰JK/}y s*\VK endstream endobj 1133 0 obj << /Length1 1385 /Length2 6147 /Length3 0 /Length 7095 /Filter /FlateDecode >> stream xڍtTo7t3FJ`$QJI#H ( <9{vwu_ϣo( !4N ԠP-$ $P8'_5   t0Aݝ`IXF,+$@ 9bu 4ҍ_ Eeu`99Yg$PL9 1pB8'`프E(=. @"&RQn[' N(8FpG#X8PKpAn` FJBgآ;] ' aNnB<r~w@T 0€scQ.87׈nYP8;#87_H8ڽlDlQh!.h;RK AEݐ ]H/F.j~.-aIuy 8;)Q  Phd'd(/=0}W\{Dbb XB %E?Zh[ -ձ_%00"B%H'|PC,/wCw'f sF9yu G C]MH E"PmDPA,Qn@՜Ph> m!D@e# Hx?cȆ_2@cx'!-a0o* 4 "^ 18B0f0H G^;K(B©f1pꐖ*bÊvӎ$Ć>h[-'fg!`v=Uo~:lqMO&q\m 7MQ/sF^yEy acOPk&SDV;EgYLr&+wq6F,+α,S2(P%xV]Y蟿1B?y| :_Mz5&Ch>]~]S^r3pD-ւ"{L@ꉤtgkO"| mo 3^XDjY(}GoT #*b@<4}~7uO8Qt/-T^<p9yēOILZ^MSX/5p9r*3+TY}Lu$btӂ"vU]84f:ɦH;y>,;E EϢ^ڥ+4p)1i`mf㸮¡xB4=6xhp6Xg|RϽRBՖ0T$``vUZW| ]% oY}ogUň>NtP t&}P>I@mO0HSi,p- oSelss{6N{[}/ϲ`>W[R~%xG'ծgK;dE?h+diR++LOKGzi.5Zs19lN4R[2x;[s斆 T5F%&ۧE=7ƫc)xބuG矁Fūndl<{)9ZCj*Jbq{yд =W?N9Gg'XE^.o,o-V3zIwH>nbg3E)K.s}ndwT Xs1Ś勉7Z) Kռ3)<GMIkcF2N?M؃T.Hהxd'vv^>Ml}A֓^&/?!$=ωB_rJo 0DDڮwz{2֨N;c8z uٿk80K.6_/<Dnc8 ͩ.5Yj̔t^p[(9~#QomDUb&`;q%Me. iȵ߰7[|َ/omM;(udrykNN,T|Fka2ULoKd@w=1:8qۃ-Kg}7dooG< ;Q4 =b^Q{ߍktO2^2`6b Nx[A脍)i GXʨ3W:PUKw Mkkc";DC ;fNx`RӚklzm̮B;z5NgS{yR,U_KPSSƾ)ܐ5_ιQ>BxI86H=i:NP+K u:%Z~4?֞4cYoÝ&dSc^U8Xa@Jղ/ĸ1Klʒ׻J}4o/jO9]M׸/r("|N֫&&?8;qϩ[+n s?'wONs/ ].ve:ICНxuuTLڲjRBɥʩ7U;G S&9r&b_P|MyIbb&hJ6zsVppnLB.XkJOt6Ó0.rc GZߢ:C `BAbk9GmBƔ}.Y5$ _k{G^AOhz-~%vėAfW_Iy{ۖGO|xo|P3ߵy]*cř"q;9GYqgUaOf$ a61ElEG.J2il4})Y 3B5fk^Pٓ z5,+7bRt uω5y{!b Uĵ{DXN`6I0hԤEI~} PH b|}!׻Ҝzl]#z8v̈́ףq/o,d6P n7.k}̘z&SE\ ce2tBUSiwg| /# ׇP]Cw!F ;>|q,2ܵ ֚0(?ՔxJ}:`pLZĥDnL>~O~]-<>'>}ϩIE?kOBm/ҍ5yܔ-܆m(#H|[YIOjT Szq[z "@hp^hJF6lĹs~bBPecɨJCѕ{G4l*3Z~аNHG|bڸw]кɁ~:P!3qΝW%4*(] ]&c>,t 0С.|"&TL{B 44,"lۗW2yo%Ao]Y|-Udg1"ifxeGaNУHQ,bv= q{O=bO8U|ۤ/GʡOjk[Ds?Q`]:gyƼ[EodHq\k c!,FX-<4ak(2 \ λVɖ#撏"gfplLbf 9 L ~<7j4ʈ~_hm.ZZIw^7`3ӓ(tr~ XoHl)5n1xb^ai׹ } MKw5%2RuM2<( ;3u J_ adRP o EЄ}*3={T+['ĬO0@zSDۘ;'oخ([LphO'"+Y"MR8#<2FB}۠[NHH!QU˽t}2qvę)l:Pa\ZLQWܷΖ˝;آo~6*sa1ErxдYR@A,e>۠Ԝc3-ir Dccbj9 n7Y|B;Sϻ%o1RiuV7 7mA-HRx"yH.pK=DڤGɝFuE$6&=vfpBݬŨ6Uu/ߧߖ*Csw֙?iP2FѪ>k&4_^>Mu9^''okCkb`IВ\*{ ώ;-L>6,H2t6_-}Y5]~޸Rߐ֕2iryMʲmLJU?56gj Axؕ<[[!g^\6n '.l- )ũ#鎼o=/'}:?K J-(_q(5?\z*[o9V^CmQT7`4%nF1_:^~T= - ZŬ?K/gnp,j-_a +555OZeM^hwD\[eaJ2'fߓCOL?~*DLj$\r-hI 1AݞiWf]cj6Nwk4xDPmO5ԏo V4H2|]H-hȾ0t/$#e$HPWCv k%gB3fn[4c ]},98,=R A:-S5N8Cu̷žBMN ^{wm\ '5<ֳ[, >}ƪgDn=\ج+gA=|}JIniaΦZTI^SllVŕ)iOK$h.~,s>~k;[T%GV. ) O?w6,7ipMl1deD@k;A\Ys> stream xڍP\k- nkpwwfݝ8'O⿳T uwrf-흼&<*=o语UYۻ;oq$jfaeA0+4]9كA1 _r|@e}6؟cAuȀ ֿ`fx i8cg? 1 8 ~^?$pXXVA|7_ a/ |_1?Q"c Hqd d8um dA9̸b+1EL'k,)U.rʚ:tJ^}?jj`ݵL{@ysIN3ۂP&I)TևNׅ.fmۧEPi'rY~ŰvՎe"rAVm3 焐Xt,%kdC1AG/a2<5E8weY>rRDZ*Ԛ$RE)$w9Qv1Hp?e}+_sDFXjvG M_. m9avM1ڽ-? ЊqȨ2dc+0{Z1/[8Ey}%'aB:vKW|'^攞Opw% -uRgN4CK{ז(Ī u q6T]hEdgA )5̭Wye!h,橭!ьlM5Sruå2?͜ZY;/D>ٚ{ 9o]\v& 5c2.:zXIuZxO7IcSBO?P*Tk-}dXV(@.oFB!<)Ɗ DyrTaB^?E&]c$uKb$Ö.(+FHfaH Q}GwwqG ~}2 T6QxX_cLҹ\dCF="Cwe|MV$ d`o|'o~奧aX}k?NzCۆ<2鐹?fȼ"ZL}Nr ׃['~>/LJHЉ'i^jxLM~$_7у͏Nz^xBڿA Fo[GNy*r_!U"wgD2xj%"l/'2 v_wH*H= Xoɞ*8-g+RW5TV,d'YW&fҊxyd>)wdbۂwzv}oli[C4GHLODc.4׺u'9^1מ?d.EĘhʞ6 |~J>&{pjx)4-Mgd2| .kLljօ?X,oZc)# g/Kj+NP:sX$mfYry׾E-}RH$5qi"\þҢ,1C#3-3=NB;| P1I5cY׍BGy7ayΖcYmD{[DΚy% !4̆=CyT7ΐ'%7Cכw*coOlg.r34viH߆51ȣ ;d]_U"8UF,0,Z'ᳬ5W " }yv6'Ҙp!~<@PZhMM.M`rCJ(x L*}~sſ@[[סNy ɍR8I: gGf~l' KևǕtI|" N׹g_|òTP͒D?wSUEi@2N2kX9m>E\FQ+ dM+þd>ɽIȉ3yij7p Q8Y߿J?X;]q;]jু&F]oV|htBT.ci1~дatV 9m5|:W͎!ͯYjzpǾx79m gd'הJ/uzʵ*R w]`3|sEܶE2h$gs,VyAa{P\Õ޲q.)Ƶg1tkFG瘗.3 7St\blsHBv)Yל{ 7TA_YG5ni_jzҏ[ ȥ \o+*a_g~렳O0i8@&>OM?? 6dbGdQ T\B!N-Ui8pFHQzLE5%{=jҠœ@F)p4a둋d5iQPtZT&Ms%0U`a/qhV9Qe44OԻ,%9ՉJT΄] Ho٦N@.p$\9O[sќW_BDNu߽b(ebMIKBK}{ٔa GZ'LǑW`Քl[)Nf:E.GԾdʔ%TiQ9˛> =CBY8r\U?, ^Ysg j洕/~lMe,O# 㳙$Л]p1yl/cHQ.iz6ZĂi$ Mgp @HZ<"G[7uzÆ-UG&o pрor Ǽ3Q$q go{הT*CG>LvntĈ)ꉷV 9"@ko-O/cUp 4FlW8#5:adDiu$i[Fn#9$MbSq/ip廿얤6lX綬(NFiB]?^d@0%c3ckNнrbn7cʥd+-Lje'w3KP1 sl3t^$9ևNFUW!`N1]>eO0UjbuR=l:. 8"˞NGp P0߄'q1rAOWKZl)x<ÌeRl,ceޡgc7K6H=|j^)IQ!ڛ#q&js(S-6pDFd=a~1iZrpId턥[3=@#S#\kI׺ ?\S҉Mkyz6 |8Ip&rO(ws~yF4<LeT3lP&q๭tBBD]pU@dѬ2@ښ zC(vuĬQ݊ࢺdgEȒ`+z"wۙr*1+T,(fCl߼[P(4(])q5.B Z'j"Lԫ (^2![qo!?u(`Zo>9Q (^ߏ} 9[w5j Rïb+̧zÉERD❄dE0fEwVlI"ުXSs ڬ4r"}%f jQD+FBy8A#S<2BjI3þgo[~A rU«B|éH'uKFY1447M(ށFl냟P}ԅ߇qp-jr=a}ÖZu%%깱*3`5RV""O(-d.=#X4&ٛHH |͖݀-"#Bs|G9c(7)I~ki`Ч13.BRL҃M+%=us Is<]=aN j=c yN/ͩeN73s{L(42/O2b[}f2Vfo^?R#SL%= kk]"0$lJ&K^/?LJJrV"o%9,RԠƱ uS.О!o [u4K8zuG ʉ^  2u./wLeϪfZjN[Uy2h ՅY,!5M`^$lpU6*ޝjHm⍤(R{ò6e sqڼl=C3=;˾ 7吿9~D AZ!q=9a~U/CAB<`I+4[Ik=mW\Ғ$7aΧopϊQcR@rH:^:0J_@e/Jjߔq,6߸ ǰRVg6;f铝q T|_rfHPPE>?pTqag ]LT™Ӥ97ɬԈy7]$uM;g"YsRHwӲ`zyUW)bTc" .7 r|N6:2IgW{IM!JɻV-lҒQslHfM2TSj˲UdeS;i"R$SJ pk٪w.KFYgxꁐ_YH 6A.TM~bi0w6Bͭe߼ Mޱ`cX!~Y_k2JJQs&U,g}bZ5ύcOo*QmO@f(TYq^m ~ z*͗m #NvE eFQS_4Qh_Xs{Q8'T5Iy|F ؑ=ujn9bb{N[߳WL!I6^ޭ :v5"XZm0C[8}ӿڄ2Ki*`@NRxc/fϬmڢ3M?!_;J4&XPt;ш&적I+ Lz#r`N}Ɓwl *׋5v{}1.l#R|BDuTh879,Q!q"rDCzUų9;Zf iO1eM:iimn+R.woi~'"(z&l7vVBY 04tgߡ {"rvUeLx`DF3 D9̙}9)&uH\DD&E:UZH'8J2Ry>j77uE+atO b')[r8|nb{997L" G|2C \ wiH*&'2jq/eORQUUQf/Ѓ:mqtiRc*Ȯ,z,E#fqUu_2/ .`g&-U;{twC0^w()I'~B*[6][x@\ ʈjr0*x{j;! /h'JBdlqߙCXsHi0]eN8dC{oPE_P̟#חIOxNV q]I^dp|͡Tܵ:[; zjOaːsKd ܲ%oE}Ri*M5 k2tA x< Y"כj;YPP+Իpaq`%̉2|ʑCGhiHw|G},)fč9 :%Zy!7O 0{tVN#fgOi `bMߥ~mf+WNN U_RП3&qˣjk+`@1\t>Y"y+r!#v|u =?4 endstream endobj 1137 0 obj << /Length1 2137 /Length2 16997 /Length3 0 /Length 18293 /Filter /FlateDecode >> stream xڌP-k .];  -wA\;{kwW?$J ¦vfv gFf^ 3B lco3QG3#w{ b`app23Xy'Α f 43d@fNv@ Kc@mB`W:@hb9[پhbdP39{5=/ = l P1s2st53%`dk2F %o`419gLTf7F;/" _F&&vF  `1(J1:;@8ٽmU@BX`.LNN@$2Eeq Āf&m`fAvn s /.L ؿCMlffff.6Ē/z5{9Y2+񲷳0!x9]|o08, ?f3;:`'2x 2IK?>;w;3אq?7e#Wdn6OŮ/ ࿹ާ @gu9M?R&/ې$\ll6x;}h]@} @;T凌73o",lFT lbmWkl 3%;'_/jX:G_.#A&v+'}M5&F{ ]0 eqD n I?q NN+*q3)A,;Iz/U?<?gbgeg]w5V?B,OsK{K3?"mwyl=><𿫱s{߫~kv.O3\Lml;GX!duI&g73\d}v|ǟS=2qqt|}}ai΄/Ȫ6Zߍao,Şf* גc2lMUF/q;ezq*{mSX'u jB/_![P8p#+?I,)Wq">0DG~)5Μ!qf Et8wk-{X&4&kZS.9gB;iJ/d^Ņ-H) (U@HPSoR'nN }7 T ݹڌ\dFU 2L`IĿw}HJpNf`  N o:a t8D4 k3Q0Wv3gn^1sK9ԟ6nhzo o?R./ p- 3BsŻscjK.7+J<9 ٥%{~VGxX=3kT}W&=d?l2$pWY>摝e[p̖WPnxvbp$^xc35Wۦ؏jvƻ?їJQP.z/-V a5v(>P}@Y_$3nҸzWU{#93C2:CeS[ J$fuTīyD󺺛p2AM܀l3ĩ*c]m!!j3S8Sn:p'.mp 10cgΤw\e`]`Bbi9V0o;~4$QZp&p`;TCW*Jl$A 5TS2jEe&dK({`r }ј:_Od*AiF*vF]N`"qз?.퍿q1c}r='h:]pP+ `,Z']eG$>δfGY#E߰꥜+jg}~y-Qn8\붶+KU_U=cD1o] ~LTіe\9ǖ2 ,"Ձ@DB!K˪|ߥ{i~Tx_UD @ʹbBwQʟ 5i·TTخS0/B>~;MH`2ʹPg%Qc/:@/߸ϴB&k]ԂIēEq{,ţvaSh^B z#/̦hnu yqw9g )2eI\'6y|9%eMҶs2JͦGF jQC$VS@+Ԫ >zх V3VaGD diR&aԴw -0T[*$5;Gxe@G?˄AQt6^xpf _ ̱96\=q1 1>іFU yPf:[mEFBTdTҷss-[d)D*$+k;5SK EewLEIa|ˣ2 v/gAho}dB놃?(] ՋA,uD(+ tU댔!R&/Zol8=Cec%eN cqF\Cgl(~S-Mi.ORv1b~cf\zD< <ur[לY]*J3? O2.%ҙK p, jIH|wu qѴ%8+W0 V[%.?4Or0޸Н,>]yOS صUmC1:. iHOl,^m5<Q3I<}qR]2 C~-3:cE+DYKMB"esflHW25ȗ7 ,QPSh劭SI[8q,LҾG?v0iY$Pyt0!.wzu9+5Q*AGMgݷ.b> P#mF+*-G4&( RF. :Y gtBEDʥuzP*_nŨ@=9 uBncu?=%V) gy6Sݥ]:W"(q  }fl⦱}R)9ôtJ9~Phm?xs>1%7ҙO zzoԊxVfܲ ε@ߴ 7'Ɲ/EH^ űp["E{ړP ΆHxY8*O'Nt%a~9KT 3.i\ -0Q nOA_z:w@ɑ)X+ YX|цDSgŲ"뗜f}ݫUq6?BfiB3 `Uq>:CX cS3KMb(;@Ĕ &ZQ\feu-|qeIp 8s)"9"JEKd6 :V&,<dC}5@Gj6dk!bMӻn!\e%ZGAm1 :`d4Y;d\nN{x6WФPw'1i=|U{l+%re6^㫇@^I[d~*@d[ +2X?~mc!#N17iXL*4e 3}5aG`yj*w:r٦2`[W] tæ&i0!U)d7s(3W7LR aޫY:,|KIׅ-&s;%ɨTNӰsZ/>Ͽ~RXHu^D*J <6FN\m4"~[%C _-B%j)#?H煰lJ('Qy?FIDȑ&xRĪ.v!MylD{P+m77}©:lŐbe 'Z|2źY$ŕЖj\uGml++݂h]EQ~c d:C_7Ƕ/6kX*@a|aK-x, . gZ$eq AJ;:\ lh]{v{;/NgдQ~F/BQ?0~Ǡn5*-nܞљ+ryS=ᑍ BS-1"uNhT نpw N~kB+*2i$"FW֦MRwo?uߒY ˃7T)1jaeNs,߆Fh߇"t&"P g:ij{O?z匂|F~GܿlM:Ť2hl?xD&E 4p3MS5S&睯v*lum}\xQ*V06[i\ʲ#^*Ro87ڍR/3ߋ\Z>D1d]PU+{Էj3Rn|?Oq ܤIfAWsy3:>:}m#uo_1 6}黖iQ2IT/)̊*rײ6Q! !̒-mphhr9]kUԴQVp*R'&~>I`jH-`9aKl358B X3HY۽ڷCE!+~MK]0yo[fgb2)Z}D#Ԇq^ R|#Hge͒Mĩ4!K?%@A"wyt\8ߔ_R2نɚcnUxKQV(e`Fr35ֿU l_dw7d>BruNI+PSK"tkoxτ%.aUטki,75`tH5YƮ0.֩ABO3|^>+4cNV#j#F@5xdkEh\t>{}0Ŗ5HwTҊo )KtKwX7İwZif]REL 6eρa] sȱ;a 3h*/-#F1x7M [V1,a 3ڝZd!%bwH+B!K=|U# yKmۋz.b.UY>-ԙ6-&p|욮|q%LX5!9]9^gu_[*`yEЄf B۪*OC`wxtiiB_FšQڮqf? u--9 3"*a'XCıW۳01OTZߐ)SwKD,;Yܟk{J¥T}X}OuS3cSRJ\UDgڻ hq? og]R+oCZoV-z~w">xս@>z7 vΰ7ڕ Tt" ^49KM*H~ Ub"V6Q8-1A5kՉXŒj0}VФ7TNjYes%f}66s\9DpZZb86Y<|l)) J=?0JI2ĤJZދUiYYԿ\[ Լh쪀 2Y} Q6;98g{qGxإ!Ecט2;w~ihJP*0 &Sא2DV>m>T^} Y$d{џ.0yȤ-7Dzgms=О.p:ju_>)]$k$Szzw^!cof t*m ڴg=q' wW~ wN7W;e"uQEUP& BJh8XLW<$bhЈ*VF?m ;ruH]d2ʆ5}a@¾˚E<~%lɶjfx =Cfqqis$ago5kG 󉐞PFtUQ&7o>t<EC`PjХ􊈪59eNoWPngC!-j})=ɩv/!S:a̪jIDk4WI3ڍlf,v yEY (23NϬVcF\JnyO U񡀬+-Z:\#ǷUGn\1I'pM8B\1L7G 20/ܠK/u[lhS [pU197,"ڐ.VwpT:\k/Dʙ iw]CݵZ=H`H20kJgXZ{VCh$o͔pK9Tq+;[Oj N޶7e^RMHoHc_mihoVkUw ?9XD0h|QL )蘄&t;-f(s^XRJ5wcņ܌Zk~2:r9 9j;%ƒF/{hB>܄w4_y_ji׉ ~{X\rͮ"z[WI_0pSLzGX}l_/h0m43{dD<&x Q&o…x,"U 0&>yuK5 Ps~Yu 65"2&U*o>zn7Oik5TBӂIͱ^ uJ{p*6Y](C=la|7|脫+d{(ek "»B'^-rr3& .j*H !5Z|rzcDU ڽ)ѴZ¾@kORPPIyZS$w!(͛e+~C%Eocj\\Ҿ,[?G|i*Z9%#IKu+ !nW̮{4Bc{ųͧi_'tBZ'lq18J_4O#S\ wFrwdK-"f)svg 9vT:tl~xI/v2R{jܼJUM͝l7AW<_-t7D]GA  ϋȠPU+3wbB!ra?%V1'OoFtO:%2S hueh_j>3bo"I9 @-ĝ~^wIQVs3grig٬{DhWO4v=y̆$fjkb4꯺DΖ]u$o~= tjfDEy׆W5G!Nm$?6gs̯W`M3F=s|Bȱ)nƌ݅ 9!+pY>*72HW4^R2CݯP`0',~} c*EBbk[quNc([֞R+agyIJ&4h+$Acq`l)€U63k6$Ϻ,0kQ9]d! T?sQGP3 ,zֆЧj*FMгoXſXbW1B&q% ";EtpcC,mv$ZZ"[2G-Ӯvԫ'`<26 P-`ȟ4Oկ|~W\VBneEl:3O㦡wM'-/5@E+ [} r/栠>_=\[ygX0FF>ɗ˧& 7X]sk$i[挩ECL']ɡ54J!_p~eGq_HZUer K;bӗf{c9pe:62kuӴe#ec}Ɋ{D*c1rϴ9ݱPSC4t+<(tѫK ɧ[^S;.i$yN3ʠBc1-qK;*;x=:_<2L 9Z EҀd4HBWT*Ȼ_^ǨT<4ZO(%I3+rY׹'PyaNֽ>'ISJ^C ,^ X #7ӉbZv^pp݃#Eq\|(bkE@hhRe$~n<$ G̘DVz5o8R2QE2p1=5=G_~vZ\)ᛟkeLTma`R篏";S97zj:J]Pyy?{rm{b2E~h,?q)WwvfaXJs8Q(sVUkA r0 @cGҟy@;Ii}Ta֥;  qBg5Yel+X`pBVtܦB`k1R SGd=ZN.\R8o`9oT8s kxL $g//-5̞`]`\JTblU-Hz^E.Lx'\.IZ4L3j䊱zFTS[)v32w?_~v'd6!9)rZ1QPq5VMt W1oȏgëQlΥ|7[=nDoUK ÷"v\zwf!0f!uY*h<-!)%րb +u8[OOIZ[k3lEc}AiJ2FVN)BEJAY%וh P"Кs@nޟ~dhQ:oK1F)Wwy:Rhʠְڡ}.=XNo"h®遫[ɬHqHzЙ(|}\dd`Dz'}^"̏Jg%=>On)9 ?ȑpۅ.nE>R3 7M`10ZϻաuB80 3zk1"b[BL|}Fm y '*n0xɻ3^.޶MxBmۺ4WнKafcPg8e p!n->[4}thGl SvAmG݉:[\ਪWOLiIQAFTtdkg͖t_k p4|qE*hR k25:.eq4<8Z9r7F4ܟpʯx =|  IO׋bZ*(9N+Y(a০षoa tAwbM8&r(0apnze:q<攷>O{zZik=U{w4Xgɨ,IgmqhKTtE[tcN6;j>_,%ePoϫ Xf閏 Y&4ʘJ)PW&n|]61!( 9 w9;),A>S/[Yh k%tq69F N(kEW!p"%U&"_ŏ'`w6@bA^dn6{؇Evn:4I8<+7H4?yÄ=DoKs{J^QGvzv6wF󛭟Ԝփ>s"R) a}{p.C!d-7'n#/b0"M^ |wa(KL7ǥS9tC ihLͩ_7k_AIn^f7 K4 n#IOQN%SV|Eydș]^"OƫDz(Oi]S,}"wu[Lè.mGhUc`G<@_2:N/R.O$bPMRbFdSyQҐ1 G2l$s:]S@R]? 4<'=Z'ݡb2vFCWw'`#Zc(Ti]z6:Z؎~1KycM87?Sg(uS*_&"=hMb( U$\ds>t~]ΝENp9zaOUKC$}ohVEȕCS!jE\W?#2ne|~j?:mfM9Ӄ)Ƕ-cv|Ю T`c/_ O YRzUE<=Ωٚ_avFmSvD0YZ WFPɗGR ܠXJTlLXb_WB<#q| F.~- Q&yD+t|^=U󆮥%8ywLwzGf*`U 'R̯ neua_kqLGQ(W;MwfI]ޗA_o a8z~S  / ܎v'#1!:Le_n˰qK k[1e;qZ7ZQIn^m[cH'XmsMY5&mVesUltݟ8>6Z]X%I~Ei=ͣNm|XY:ߜܾ, b~dwwk/$VP^X+x]SDSӊeqUV,|]T.*VGZ 46~jŋ,"]L"fO{/xsو. 1v/7uYD7b̘C=|hٳ#4&(F396|>EU:=!. (At`-y 杺=ioiSVوܗ`Xh>nO#a[H f!H9:`V v -}4=ǛE=ZtN t9Gqٯ?4Rޤs}A@[fL`D>Yz.9saλv>=1c`uԜ l+17wX,uӮRJ u tSQ;rOxS²)89X^Lr;ݯvZ'\VkMEg81s º];|% <Ś!eqr!tR A+pE\B[(y5+OId?(C$5ʗ1ka|yRAuJPKVr!E~n/^s6pL7iˑjXfuY>d,h>x@ POʷ5^qXlA*]Ly7LY:#|X\IKOAlRN:mZge@rib y=M|F"RKe[vOuQA*deg$$-.'Qtyp_E2n`(UUKʁm'=w%j /Z5YʨaY\Cy3&q>5W~$!ytKUcCc.m*gX{8AnKNXr,$/]QTC̈ mm*jL<1бx2{߿;ԥxC~Sc?[}̕1>'/3,aByW ŒcÕbDz G\dhzc#u:ơ Ͽ$}z!suD`幀VؠDž U<|b{JVL_ (_§Gy;.Ua4Ua,V&~z-m{]xzP*f'g-+>*G;?!|}~V=[KABF*RU:hhv>O}]|xyRM<4pxmC*[)^Zy1d5Jo*;z[`')$yM32i]o&kk9* $BGzDI[ӓnH3)`1t4PC9Tn48U˯b{ͣ/A1W)3;d|5И endstream endobj 1139 0 obj << /Length1 2883 /Length2 22126 /Length3 0 /Length 23736 /Filter /FlateDecode >> stream xڌP #CNpw%ww o_{E0so2bE:!;#3=#7@DNB GFjl GttAh :l.&;77##vQCW =@G&bghaf *Jc*_!-@hhlh P3:{'%=7?- t:M jn]-N[#T"% P,-MODzXؚL-qYzgwgZ/GCk';P/q!%!s2vwvw"ï4)ٚm~pZڹzL-lML5abϠfkdm3:9X@؜WzU{_L̠|&>@?8/'CW `4dAhai o yZ{vkeei5aa;w + `c7?,Jٚ&  *sہD PF6FcgO࿲iwkeC k@uq_t l3+4pRΆs dkf--܁&oگCfma Tsud[n'"ZKۙ:alCGGC8F^LhtKz[;gPԞ׎~F߈ qDEL v6`q0#Ŀ$ahc; ~#Vob+@a6F&@#]'o)F2*obةF .o/q@q;bykP&C{Ёu lRT WԤ:km/b%3ߚ,/=3A%3ɕ L̠ :կнoǿ܍ m 7ŘYA?ʀo &/w;?~C$ LV,=́xl0bt? lP[{\J.6Fl?ovD1eP {H j$H ?A߻ /3?uA/ٿ Gן~ meM7C6P"gtc+@I@/6O 31X. ztpbA@Pz? hɁ2y.w#?6 h 4ogdY~W-F77CJEDUx#4܃#Fy-LuRښ<850Qx$TOK@*o)M‰~'^_22_.T>Md,(kڙ-5ڹ; Z+t< q4K&sgUf.\R\mBk)r/ ^E)sXc[6Sz+9#'aĐhL)!Nf:_pbD``QǦ ϵSV:T3ȶ-<)`l){àFC3aK߶Yf*셴t5q@ xYCC֤QxH,B|(I-, {GTU` U}D-os]G ݒy ɿs9LLEAvBL^ W}/ wL+58\@ЫWo8`9ԯ|^v7ѡÒQ/(VB08aC{XڹN>k;&jpArKF/__^9fќ`3Cg`p\~Q'N.gxYTpM:+ {e9PG^wQ0:_ɋ4FedKիضk&`yd+ΘezV7$~kRݻseiB rwcXANKe`o:o};mPbCYBp> t.E)|C= L)"MƂ{&k‡ӈ f%gBŵSzMб\XlI4Q_ܫ W'δ|&>VM:Z=`zR: < PmyLQ]Itt B!Ze|#w}D\ *.\H}Vj!,)z y39q-O[l@wzV*1{D"zzУ>ˍt\SuXb&7Dc ELl^+6*rAIĂ&eI6_f0h ǨW ?Gه#ʫ LB#'!W혰z{\%(g2a@&Ix&bFoRݼj=b;uyž*2IׯzM|5g9 c7D(Wn#Kvȭ0jp+x03 9S_! $9:DZe8W- +kƈ% w:՛fVbiW9A3$k8^ Y5;+פ}z.p *J?p""Էɺ(45W옗ɸG,VԪeٽlʋt:ݔb_YB?V F_ʇĜ姢l'/WB{f~f+u'Wxڦ"uXV:h-%=;PߘYZk:3wƏ`f.r^X O#vq :C:nA)Ib}0JpCגNةBg'%=x@v/ʲ^u7 :;yj(lgM]W,{?eBtPomb~nb 5ӧM6Ѭ Fxi72+=,{?k+'Jи\sfTϺDGF+d_x]=}QL{v $@Te&߂Sz (}ӶC[BT5H!urleUΏyo~M۾wu,y˹! pX >gXUdC8-Sf1#Bdٳ!ZeE-!>Q/qLhwkλ._z/ 1`h2ڲ$IWRLνÜ QRy90`# opCSyijowً}ڸ:<{)htDJwj 'B9Ń>e\9jn{g~ϡ]xh r11Fc; 4Z:%7U_\7`~ &wGd$3{ok2膺oKdb7kGt[|Ɏiw"`]\T\RQ(ӽ}M b\nF*N0q[C fO(+cF0ƎD-?W5|H6l5G/XmeDʶN4F)^|Uw/;sb\Kň}JH H/"$X#o_SEgQ-qd1b<'~g0-B%\KzEi!%Mq)q-#uZuj@ {Ef?:觳x6-?e&w%P˜/ң|ʿA& G"GZ7u@jSjhDe WB;aЉ I SPv`?IMy=TY*~8\Qxvgic ΒCztm{bI\FWg^M-IaJ)r3 P{D"֯0PjOvE94u$Jd|}j`.M)7#6udm9uE|VWg1ɏ y5 PERwQJ 7Dg@bmoDI8[L?k ˸[VIKrB%+"rz>!&.͔nC9 ijٯ*ьE:,dS0RoMv׫ {,8B#X8"O85ՄY}~u'౼zv@ECi7Mgx=.)9&9 Rx'2ʙy-&<&FI0<]y\f +#o@@Oy+,iQ#$w[ ķ{?`3M*b=saY[+j D"?r7lv¤x#=9^snl Zp uWv/TUO;{8dȵd -{;8֦BV0yh9[ D>aM;PeTPӣiI-ʄ<]ߜ|j oܓgli[06m7@rsiӪWF[~ ]4otFui&Ya¯Gjr$ۑzuU#~4@͋.t*@8簜gh0n 5r9J{ZN  }_?O[-KNOJWY34k1cĦ (_+:MkXQM"l wFr/{ Mw)b*hI1s=Rf3z z-'TpKtU\<75"T!/m23^giG ̋g-Z3}^*v? v.Z3)9ߜ1 8>0L%beH0?2\uDZVn}͛2sk0wB!(Qѳd1\H$(IB1Q<DА$7c,7oKF%\/6D3I,JGlk!֎MW ;ګDAWt:p@rqugBehBר}ߤ?"XW{[Q賈;DZcj֫ɇ?߭g F2hΜ?K|?-[ -Mdg, [G p\<=24hW LDQBNKEi0Ӊb9KrN\kKq\y >zHh&.#b$ur0 X#MĶ B@L-sVI |,Ze<ձ@aA:)nEvRf+ftV*bK%ъ%H> E~xx&jcLΛ)!_I vq8׵|K:1|M_h)0f7Q%Y\Sᤐ i./g;<vj}xen|uErL=aN8kS\1d b1Zz\2Y.z琴!B#׾2O۹!wEIE@'{aŸZ3.p5sx_<8 i| }T㥻ىlt g>[[|׌+O[1m᳻ChdX1+Bf/lvCvܚJn2yZy*OCd&a{_j'pWiHmoW+4_HGy@@->'fa!Lh HjD= ~PsiO{Df:N"\XZ9/6| DnY _IhHH{[oEI+)ͮWOP _!L\~LTry-0hܘR Zd_#e㢂dZ<E'^Z$Sb-2pljrfTYXM7D: M{r I(UѺ=$DJ>ˈ#4crKt*U:^ty |} x7U,4p":j*̵̎@0F9fgcMgOAIZ}wX"6;91i3Ի.H5e,v}K?iOEd{j6OjՔ$y iHC= "jCfjσ2ǽДUsTC>A+0QiFFq慦!6=A[:;Z' ,[2Z>Sޙ ] Ng=2[~"[DNj4tZy1S.fľIAiDhvv 4L`]n8DUue5Voz?d3`ő,8O=E܂DaLM0Olo`g W{~Ա4DaXxklꜯAa&_R*23 禴5M<ǟyo5[Y%ZEUa k|\ o lOnaљuB->9/zy4f)j'NUweR%wa~XK gbYƁS]hprBRndOjp4N=M_{h>P#.pd݊lh;p1hi$$auHÁ3L,},VיM;J?ߝOPw>)>).DkѭqTBZdXOhsdUX0ZL0ϭB~4;l>XB,ũ{h9 f:OD[|"I9My-izvDZehaRշh tc]/̽,aA#shSb P_^l?"V=@\umWw?ajXKɋH8Rl0xe,NvwsFN `? ^u/{HRZRk# ufLwVvB~xiOi.- ޭj6e6֭GQ%׋tSXizҳ DKǣ8Cm҄UD)eU4rF*8e\_U I:8>pyrN!#}|>&h(PР!L붷 V{~#[_C[ve(͙ˤg֟[z%m1}j2V(xp[ѓ^F2Qb[x >a ,n~ Ohou<9 -c^)t%jEU½Z5Bt+$;be3k70ZJ5Ωe=U%xsc ݍ`5Ned:PISfuqš%869!ʻeҎUs2 Fn!z' t$b uvIgE8*ׁd[?p-8:Ç8MZ[,'$)ɑ5+aCO;if3hz9R|5e}Fn=  EE^ݬ`r=S ϔ 6nTW)xw)Nݚ9>5 <ڂkŝk˖0 >UE~Ym cZ!wWV= 9ޞ!ivf<|ۣN^wL^r'( f^7;xt3x4ol;ŷ*8tf' "|2n#X 6(r=JVbo9 hd`2( utvA/G^h+E+;CЭs9!O,ǁ~v XU'4e+6ķ|B<:8qԦ֑sۄXe=$Ô^w(d#t1_USZUYV7TA6S,+Գ S# 63@vnKv F Z ʹV }a9Q&n\ )>,F.R$JYcHNؑຣX0c;S,~G'@R s:ʔJg Y/Sjm&eGR#b##[RrмFHPw2!~r l?3F6 Q馽Y>NrߧwH7eB-k6Q}#=^"8=cXV|["IPۮ0"~ZlsJL"kڒ|}mǵ3l 8?$Zt ר}-l/HS&fx'eO{F|fAl~ إ@xkocϱqf< i .na+fZ1\ jL6 聨K"yg7Ƭ:33LCSy0A4C%'7r$Yۻ?#s$XQx0M2?Z&˨xaMN#,\,sXPQ"E6QOa1dUˌd m8OJԚ.|v MJ0jZTmu$Bye>8"IdE^NH_Z#$`-ވܨ OҍlSwivIj5%}+}C-"3޽㴂)DV!_]%q#Jj <7aK$Ja|5lB t5EcuCapß{H3Zy1P5j,y;dz1صp6 ?\dL s$C3a_m JaI /PE#2<%ҵ@dm{x5檷&Բ횄揄/>Tq3,)uHVB}83O=Dfu=x-xsќMP;;ZpeZ;hw3gs$5H ?׌S[%q:oA4,cx7ך@d'fnR7g\[yZ f*lU = M B5ܻm/.Rn"ZBS:[Ŵ^WO ItNtb8FH`KJkS-!#z}u!aqC1(5- iRG,2QIGYM؉pPPf0kX(hU P1QqY,E(\BGPU(1rN^qoi@lCEy*e¦L).>_9XYaS"7G80jH1EY5?13QS4C":^ ZnyG`NeT5 љmm4kg8hwX~>ƌVٱ|o!t7:,8cf?ѹ|DU@C!ؚI@FU|&LsTJ#JD >a{ӼYO2lbyMohm2Dcf)C|`cx:x P2m{š:H=LFBʉg~-G (_@W^ gvmhFaIڕAdoFo#ZU_1_cK:;8[9}6HHZ"}(5Rg{/v:\o#IaY<{lAO6®Ȣ]0ǽp+tf-o:9 tQL=}Žd⸡OPnxgI&}G5ZeQ(]Q f{4Cwqf1dNrۆ[/jŁX4>Z[WEDanQY3Pč$|Ŀi<wJii&i{WAez?8ıl"J.SD6<6Uk '勐Rb[Y7~J7K|R9B_sGb;D6*e \xߵO p56Yyt1Q {AXW^fׁ$ a7?U1D9  %}8{ބOKSpBU!KRʅ%a[,=WH'O闹_&to;My<:s&VqzߛX m`]I1* M7hkԸQ-Fw L4de2-a1:`E u'c],D'Yrƺ y_ !QGc`lxʝ@>MTK 2U #V q,Zq"DW%HJB|M9> @ie00%ګS;wF-w?4B`3lirWcGS[.}dSd1>)6ot`yCnH[-ley>hő?Ůҁ=r3[2і~j_ʯwX{u2caoi\CpD; ]A&_ry̥!kjPYdEZĿ#vϹHт. u0u.\ʎf{ߟӠb,-EIF?Rrk⡭ܵMiZ3Q[d9D".j4#DeGT7#DDCCpZ4I,0' Z;'2gݒʜ>L@Okn /=[*}@$ߗ,RB譺Q=lXcN{-FiMANUڱ"CKŚ-۰(+Af%|*()N%gN7-q>ۻokZՏHò%W2r_L T`GxaF_DP+D}Â:*  Щ=@{Jix+׎W\\o+wԐ^fZ,pX5RJz EL6w{ w.V=\ؑp,M6GNv 8Rtlh,rݩ*ջorI/__T<ˊBRt5٨LcsT>6xgkVSu޵)_ ޮ/Q!h)S X01iFDqDҥً+5L+79UHö-O0\cw\0ä姗kW3AZ;XiV<}([zuEuق-%P G91 ܱ»Ab+ %s^\ɲF_"[i!t^0Ve%\{Ό|j8G~J0лhejU[ ,s86Fgol֨P'YҦL~`)Q`?'7 UQ_#XvQp7Kj_mpybz]“v K-lG k/&+w6s;p2unNþx^J;O,C&g;.oӌg>oL}ug)+ xҶeD8Ww䷷g;IFvfiԢPJ*a@*|+fG~6tr͎}LzZ]|ρ&Sۤ>0mS$Xo*֥KDľ2iF;DC]`8[D1|މJ 5(IC,MJ;DI&OIgH"G* xp8T˶ˆ <Ҋ .|Įjqå ZX8:x5 Pn W5# Ț+hpDY?f},(- %'Ծ4ZXqί"=,?Nse/s>B(~>TW{n*' uxEg歵;^l'5.BNzR^ӝr`CDZa4#/ˠR^aO)I'DmEi-&x6 U{= --j &uUa=NLf*/}(mYw`ypAe-woXң{QIBM<˼p~δ3b| uBgGaj_x3MOt Kǁ#yB֌ ܕwe⡤vrJ9,J~GfŎ5sw )=3o=#jFw=x4g2fҵJ9hv>kRnDX| F0 Di5]2c4Ar{vX ut-zO?:X?T}O(P1aN2khu.<9I6 KGq !1Ɏ,CXQfͻnXKe($0rDܟ>/6Irox!"3WK'#(;ڒ͠顔vqYEv7 QټbCgƌԣ߮N9n ?:p OjO  %G _LֽBUup1K0ϝEl\\?uj'xY4 >J2^SH֙@;dϑ=M'Ye&?I+^hl}s$mA)3e-x0Nu>4Ίk7`CCVq{4е+c&3^dkEs;dؾv|j^`h$ۡo*zc yRgNpO|u#Jo#qN =^}QЬc5#/\xbSϒ$CqU(+u ].#i}#S[NHX>.`.z֓M<^6T#{$/1.F90{RnbI/lx0ܑIZSܡR2^$TzHtYդK $j3h \>U ׫]WD| ?ֆcc$'ȦTޱ`J-&".(lۍC& l؁RЧ{9{!Wb,h$Œj  kȱ).Ck崤5yIOsa9t2,XR) i],z5 k L,\\߿l|9Ei3a5] sfR}f4ctcm Y񦰸j-bR:[l@M2qϑs+l0w*`eD瑐7-G#B'ˣYl$힁1#}kH$`*|Q, n?˺<׷X oCvw'h|\#9׮`愵o$I._;lXya#7E. bbR}5nc"#Av W>l m|X66,@'E-Y[jg3V34f'at WTX;,x<)yE>4aPx6v.6=AH`y:ǀ_AB>٬$J"tzCN^Vp,"eOzRţE.A 1Fٞ+zۛ0C*:x=&ÝJ)7_TSP;-V̝j߹f;BI>l=T q0[p{Un p.+\E1C9Iŷ@G~l Әu#vU1ƿ Ϙ,=1ZSL6)xx۔Jm&iŢ.U>h",!EgP:[sYFI4AD쏉()<)|Zԟ2V8RbT yGބG9Nm]_h Ù"wLʶPdtM7Δޘ8ynF%@>Q¤QDPy,llL0L"h|tmתTGzс`KWCwKT!c3-F;GYb-7Յ(;0 T9BNu.})\)S62%o\!5R=H-cU|xUXzt?"KUc+=ꖼpڦ']_ZpW9aVsĝzRcE"[$!.jޠ4H om{dy ,,T2Y&ҁ= <i_62zL*#kOifTwEfhiE<}PR5z8 S:I]{`jgM?VğNKo]35'%&[l"נ[T-^OyeNi%Jl |4o*` D#d} {ރ,c1m/C*a#5GeHَ?ϜyG,-i)0d@]0R}?Xd?#:)] 47)+ A]^@R V-pA IB:owF^&RQgeLg SUso  t~Ζ6rルE+/{BY2[)@ 9nA2jcT+e 8(M13  `,DWK/So &CsM.D[Q_| (IBt~YCF!&*P fu*Mt;hSv@#xH,Fg 䨮f :W R<_g s!i]*v40DބcU|ob4Gq" uuGfPjp<$TmWFkd휳e:"Ym)Dn{%2Lڃ}>+Br[~I~DCχn5Yk#*qn( #0l̵d1lJL[A2sbѠX+G3V0}RiN'IvTV:8]+yTku-*d6}&Xs#TU&ߒ? y-+Y] a͍Z# NU^*왂y3 .hseb)c(`vu3*.uŒ);Iu,KupǔNsKkiZv"kҁg<?үK*9=-P?ա|IߟghsO{ Dt!zYVd1>!(X7 PQo7Qboo 7wrerg(x 3ZT &h#/@x€2 UYoQ+907D!–jo"`X,>|j)eOnoСRV-=6?Kp ",'yðPKLK /aeqjT,52O/c9 װg/<~| sGN!Iě*k<'QpFהIkx)v'4.7I6|'f`i"\o{[߮ʝZ*8Q=.Y) Tqoe@ȵ7 ˼<-k;`?8,wn߭SWQiTJP9ﻘQ*&(g(]I74r`Lр%ūf,Q3oO* X$'>!W:%z|`gKN~}`,Y{BSZ$XL&'sɝT|ޅrѴnF\LQO@#.F2Qn䶐lkTτPX~f#+_SC<.QXeƦM#gJ=?ToВxygo J~ߨjn$Ƀ.޽*(@uc4:%|xU%ד7g{a_ƨFr@ϡuɉ]6{\s0MDyp8j$:4csslңP!߿hq*m͙flӻOߏ~ǂ%c>LJ@hj1J!\6}[sD8ʊ$qa&Ylh42V[+~",irBC=;' aҩk('0+ x)-Wy`Jp ͗U,cEw s#1Tv~dw~240% ߬@2"81ŶLBa{ 36ruߑv6P03y}TvLիBuP9x)*w>z;ʾ&A,C?_<&D 0s\-2PaӖ9 H$q?" Ҍ =i2}SB֖}V:Wy{v(5䌉kcR∠̔uRET+= Eu ~<cQADIvUd \JL`# ^7枋g܂x'2ͨ*6 d;Aztbdsmwrv`iX 2>rR0'L 80KW@{#=y~iQ;=^x2a d$:tR}W>bivYX' Gb7ϒ3)9+Ca׮nDQVN S#`=mK%0O7%}j;׽Oz&TWZĊ:? _U:}Y&kK0 ^%Mm^Ԅ?'&]FfN;dC l1lQNZj̲L ɑ۾7.~e.瓌~P:qZ>GP [X8;Gxie5USlv<"2Mʳ.q9H:,6*?cxنϸI,gfIRD .[+rބ.nP#*)ЯPTlW4(=qvx\zQ23VuUhELrx_m8bX{Yqb,hi9Ͼ O&e'FEhQAWS ȧ sGA-ʈNpw1f%(xѯ`Efo\5uc5jLxH^=Լ=ɨY} JQsma0) sBS]JC2\ zz4*2s\׬%Y~tWNߏUTj&,8.2wh'V[e?dgze:~9|[jDmPQ/PRQuө8?2n=;qj0L†;yoiK⩿Ĕ z+Su_O.ЅeAϞv=k:,<%4)b}Т7}Nuwd؂.I!%nIoyuXBx,(> stream xڍP. ]`AKpwww`|pw =!'['Gv_^Q5u>_:*5Mq+Pvc`eH*kpٹX9Q@n̨t:@W,/ &eS .^vv';; Pt'/1 `dp2w,es7[M%_)lܜؠP(++F4@wsGlA5!nPs ]#V@My%'YO38X9NWD 斖G'sl92Jnnso+9`nLrs:st9~;VGG w}R ؽY{0 XVֿrwb݁RQMlnvvv^~e^ ?' psq`tXm@`?wy ٟ`7gyYA^_6e%e=-vOB apy΢f B>O?{u #s@E 0q#vvg'Yo߂dp3A^5e sgV wʻ?81\e@@+5bӮ{@`Upy,_gE>/) X0N7ss/Tg!q|8W l`s=?5r~@|ol:#~^߈ЎX863O瓜b/ .\<Og1ٺyHlnPȿR7O YC =sKPжjqR(4ݮn#ϢK&R 㧬u+miK%GH-I  ㅇu(d,Zb|}u>v*}pvTǻz/F|vQP ]E,5 92OO˫i'Jר~Go| 68ngW+8]i .qG&_HW )-nfT6>B]Pb0 SF:ڈ~ ov臈[M9ngp:$yUͬdI"ccstKT|Tw~ ?m\z$q1զESd?`#,v`fvK11E>kk%}+,t;'u?ST,bfg~@=4JZo3ޙ?[ ҧM'F&\#}ϫmكK+&-۩ury{'D)\:{_&?>S>=@&V#kezvĆ2kRZ|A6[cҲF$}s`uG&#&X>P9K36:uؒ uOGl:,Sq$~O r#ViCQjmj>e ,yJkƧ'_tڼ^2/&|fTеto| ?E7jG 1AgeƔUp FhEI >Ѳ_o=YD1q<5#Xb+ ǵ p~8]~Sa\fptG_J[Yw%ʞZCg2IQoOv$â Ŕ@hF%2Yyy)m*0`(vm#0N(5^Lq|E?ɘ1W(x*< ˏ"%~VQKu$_\9<9;X7w2qPM;aeD&>|t㕦զ\RY&o" E|/ _VݽP!-cn3##,T{j<u C "p3Ʒr2R:A4|*a1s<#QAC;ע7i:b?1e:0++~uPP4ؚR -Yx+6҉M@Ժ?KP!K B;G zlB7힍XzO'zJ]"eiypl2HPS`v[KZgEdه 1?cw8ў]^?ο/q!hןҍP]=Sꊏ4쨺UXK*fP#?I>Ie-&euHl3{u.yc6' 겪UclliH jfN|4\C&>ljorO N|Xbv#9@[ƔSYXb<=KbLF č' NS'+|PMN!{EpOgm#ΝkXCtyt\|]mIF6jYM^G ؄(L葢6tI1Qg%h*o%1{҈^0Oį7>0I3LirDWm7ps}dq^F'$uQ_.m!7bL=cMW>Fn_ ϭ\X%t1Dzv n a/4/3$:$%pAt N>NVbqL ҤnluRp\@+}/|b%O)R$TQz٣]ynG SES̿Vs мj&<"[h[9bv_.Xx Rx]h~50Ãsbz5;ױř"2s M]ve `lWuuB+ǦVU䒛Q<08FBYH p?Ad*mȌ2oZ@YE8r|T7BD*XS:,@k}B+pG 7-Y19V#HC7<쓁`AEa1}a^_9HQzG}uKxk{|샇A*bKԠ&<>u$G6gF# )IT2B9М|]#B%tQR?z4yLЀrޥonivSPtrZ3kUY}ɼꟙؕu"PԆ)q]OV`ѷBԕG>rD+V=_k# 4pAaSa: (4Jl%v ?BМz3=׷<+4:BK_0b64@D n@pJ8؍eX!=(5 A8aJrĆ<.R]uS4vhoˣ71daoSlR|Ob8-xYesA4&d$'jwE$O2B>G$W\ۣW<c?3=:\+iSd ;׊1R:%UuwhWizx w2D5n#de:-? $z HZ2L\t($ ?yC((JiJL!30ZO_uccZhP׈).Wl,;5Y3wa؄߷x7ax|M XGziOk:kG$G¶ Dy`UǐidpLx7c xXwNM`Uc= VBH6^!\G/,ouk0j_v|Ng]F!x~peD2fKF׹R//2_n|J? zJ;CK޷˔/7ߖ0(>2{8e<.~ Re8{DcEׂ&9EӎK'U/LB$3?azƈRh`N6j  uS1Ԟ;DPѱxehN ĕ`mdfӍf0S՗i:P ] Zw4x'12D|78,Ei2 W$k.~ l->G !꥜ gԏ,2>heN7YMi/K9Nh0M,WQ9SCɃ= :Hz r uK;9g̞L?<>,3i\8'ʝuX[+⿾2ϠiI⼊Z&^p蓾#ކ[-5И:Ecq7掁l4/OA [A?\!?["k4/kKL9_ps Vkr?ETX=~4Zv2->x<S祆=zwE봃f2^DsҞH vPY0^{GaYz;m G h[)[)&'BԏLzz RU/lm`~jb&omT#a =B6?hϲ*^>Oɗ@FtL}Lt昬[%F3 [ _>t\!$ RuHYkܲ~)%Ա'F|j@L ?VIaҒtDu40P3Mߜeǒ0{#wػo7^?nU,9 rČDo*lR5)Htx)WEܷ֞ݨZm~!eO҈r 0!nt5 0<Q"-扙4 Vkd0c&%B+Y9܅:Lȋ:QJ(L7J,` RD}{ ȞC3(i27+{}µ ( U?'Нs _-oeI20\D7yM3CK s6HhZ]Ke+jqyӐEg6~瑸sޯ>6/K⫄!oFx#cގ4 -9KHC;znߝtE>@"ohJd'{\q 7r/$[*ߡ>;nFb{_J\ILMATZy@X,_!RO `;|/NcIؤ㴁E[Yi< 垅'QSP>˾Y @F׈_&2}$xE fGw7ТwCJ!*>ݎn:=Š(.) -vKW®}>!+FƐ_pOB)3h7'R7 f#'r31`p@9'ΪR;Rw0"X=Ta3lA?x9ipq}5-ǧ@b^γIH*6z\TP5{0}*o mu Ҧ7x.8p,jH&hH (vgr3՟c7 XC^8Iʿ>*,6fgDz.]`Ɔ0iu5M,/[ =.~yRɴv2U&ɺ16dU)u(h'%PL,8=N6:l豅o7ݶ׮gT> )ᐶP'D1q HKI9<>WbPJ#{U"1eWU93<u͠uk\UK%q<1)]_ʃ[ZiѨ`ؖD8N#Q=IC/E2xR)mDKŐ q*wI˽*#`r sw!gy>9B3md !Rj>Fy$8UJp'x;WHs ܲ( ;D:[8ktz̖k[?OIPn=.?ZwTt#Nr^yc!B+/ k"Ƹc mv'Zo,=c wjS"WzI0-OK &u\"CĖp fr3U*a'v=wsX9nx!ivV[pwPab %&]OɏOb(>I#Wgn_}.+u ȶ&%9GMu7oGlk $rFoS 8[%U6+‡d@uh~d1.WG2k+oposG4Xyl>}Fm-ۙ?זl y}BAԿ PEe̾HI$%~.tgKbN8 .trɮ.I޸ՃRhʯ[R}A>(/RV0.xgY.Kp5+3dkŝp6/ fuE0[#"Po'TC7 gWS߽O-q3|ܰ^KHQ;sTIⷾژiou7v4p,iG "F2_DpOvi.{04"+w]T@ٷi*k Rz[oF$>n2lѪ$ؐ\"]Ӏ׊(&p 6 PKHÄ(pɚm1o2peLv U{jP|b/tl~~N*އgTƈ6rwPŀ ."~{8?0NB(6.h  >7nd$c[R*6@|G j~+!xa<[i#ov ؞5]hH_M ='c!Y_d"mrl85{4"޹H{Ķrdc'>3&X3LS@_(30v\>+Tឿm|CB#9iʓ2w">md+[P(s7-_kt-Pg9&6 XL.%k-kb(j&0| wKm"1?/L^z{]Idai56kUРjj_2Rdf)<Q(LYudE;G$6B"Jع3UtcsJz Dp$O!8k{ F-._::HŹ ?3EmLeE1+(ɶ#N1}ǂVnzPY=US8PBY|kSYvbbj3CT9=$Oouʗk,<:,}$9t-60=:D2W9T5WYP*,)XᲛQ3B}Ӥfl6s r#mRɅfI<:j:8"}/}w6,# K"\>e7tngu[%wu!Ezu1#}=߫MipziJr֌l%9 QoM~q=Č> stream xڍT6Lt#1t3C7Hw#0ݝ҂tH4RRt+HH|{=5kͼxְ1;*0(O$ P6@B  ⱙTp-)"f0(@   apI7ЀAxl0w?8?G=@@BB;@ BڶgF{[W!F+3. ۺyN\`ý_tl c9C<0G- @{0uȻZ]w0^_ /_ ζ07w[p*Z_/! ~'n P":O{8 qU!Wd0770+?%lX]0h#/w1VW 9$&.{_`dA0w#p p/pP+-   ':;C| $_OVHn9~.XA^O^w`>AOP!Ag + ?PG@O.'a₩bpKd,-A" {3W 7/WZ_ W/0@g]/ժ#l; urO/AwC?s@z0Oȯ'U.G*0ri}2kEDprHI \CoP@p~S$  B KAݑ9#z߈0AoYD8u1 +u GYl [KE>nh÷Afm4/`;>?|C>sx2كO7{1O_ N3x7?A?^'==.у@0vn "/qB w/W-Fno֋j_WM%'ZU|d++fBp}<1MZ8~Ǩƃ$T`&|9\c$CJcNM~F::A5l>=Cf[6|#vqINj :zBjZ[S:pƪ7v;O^tȝXFt9Ӧ9!壽|ʲB)UD )ɷe% uJt.|^>m -Hd㻍YusG4C̶)g{5JeGb6y=v3`p(T08aLBV}Ocq؜uv*0wiMpSnלoW60Kr]r̪1yw!|lWǐeiځ#_>ف6 T9Tȕ dnLaY19t!/bl־HU޲9Jڴ6>!s*81#mc{dsX( ,qԬ 8%j7K5+[RcLH\(ȝ5]OPÀ Uuh^Yq\GO:/C%X{̿8Y"E$2yyòd䚡lSo,9D_(SL9cYµuFZD?s)KvM(Ӕ>8Xpnsk$!/6 Rc!Qeqiޢ_=Xs\_@3ڊ\OQ5XXa$>D f~FT)~s܇VVc`VU+0+׷yVѯ4C͗Rшڼy'UOø[mx'Q ﴆ/&1-$"U jMivR v9*>T)#fس>;ݩ.a9M7ҰYk8`)T`jL=̞L/盼uPp3=$>p$> izceeFς%]/dάMP.W

}:[VZ"~]pT4tEUV1UVFC|qv6QͩY%{E_KK/Ls4_"z:5((kb'DΈ=ڴQq'x& F\lC,3q/XDTX6K iѥŒkEՌ4 [bli$Gh-`u`i`̖K%P(Н[y] =mͭ`@˕xCY (b ]9܋ ߠp72bxnkc0.3;ÚqޒaѴ\aњHK{E*7ݛ4^ޤV&/V- Փ6 C =q=DẟPCQw@ߓ4MW@<_do~}uWl&̷?ռuXc4Ic[/}eL{6Zo dhvת{Ti][w, .xlŗ??z`^rB;ȀvowSc'yԴ5Vt 64'2z~>;]5Zh%Y7n,7xxQ;fOC;'Y'kCO12ngڼstoцi^'G,z3ph`MzԯEA߸(%!48撮;SU>byĿw[OY<,v!}?F+SQu}HJ2ܛd5V(@ǃkfK?ca<Q5+]]Dj¹ ^jd1C^,٥{:>!,/j@[{pmZ[;uJ7߮tw_EHr)uUjCZYX4b-%!2(dO YI^9rZSJ䣷}Phd2YZ2E} }aa#Mًi p-;@Z}=!ٮ8wo OsFl?ws랝 n(qyS|YXDÓ/2cS^ s*zȩ>F(R"#:-}PIMł\uh&U*0\A]ᦜ{z/=q CpoE2vg u`Y 0A7՗*m~0)ЧPcũE7 YZd# &nڋ KCڛb,|E~aЫwOWN/L6F6|4 >%;>1Ei4uHss%0 81/v;#6fŧY}GeaؼLǢG u>HPT5k'/55+S|3k/*'o򯮜"%L2;>{K70%DwL;2~iφ+Uk,]™g$lT1#].͎"N'e>$;(-bVξNj ӿ'F3WQTmrNx̤r-]ت{dX % :!"sy_ >|Il{'/e^nh ԾHiCɄ+w깯wx\z`Tu9DCީh~"}NPr>[dI)Ip❖,Hȋ=TI$aQ9;@V 9\co&|}, IQ:)PfR@!?옢,!J~J R'AH}$htA" ™ON\'naR&&̐^9qwR_ :ގef%w֜Ĥ9u ĦHFoB8]ȸx}͟_ᐔ]f<ZoXxTyE\E:P~LٸPE_@u啑>~ %2e 51" !&6gp!#dջ7B]7G-I{"yp+PW)Vh㚄Ȇɤ?o@w}h%?v*qޔTVO3hj \X I+t&ƞXLUٱi+Y~&FN" * Q |g?9+"=8LOt?Np;O{D >ev\0q*W yBv S =#R!(ÁNtcsV77)uj.SU0?YNjl3m<_}9g4Q?))Ɉsܪk|K]er lcϰ.6Fu$h>}ٹv->̑xbm?SRwÛb'^om  ` &lq?q'<2Ia߻?_W[%1f#ݣZ sw@+wI!Ѻ${ 朲;w1 xLEpѐ| i |+ͬڂyǹP@!,-O GK/mdƵoo3cX;}Wxk+0Hҗqmtze͵ODFO2.A-1WUSFFLUj$krY p©+a=徹5tvi O2XmϥWR,9g71\U ]M\g|tk+U)!Z)5D6*P~fdYh-5U`Jw:8*z<rXIU[ rGAD{q4ne`/5FZ,Ecg-!{:ۢq'\7X`ԫ]xF7)Qj8X>?P3}Vxzc 5l@g"-{+__v'1I^CTh;'<|?Z[OPc3+-/ 2d♿Tz~[vFV4mplSqBR)vq0hV嵼Z ,)وQBe >ԏ3,e'xz9M}2%t+>0pI}54QQY*39_2N]Tu^ KTYOqnacy>SsCV<'Y.:lNLzn^j 跊\F7y3GZ(}4*/mB^L܅-WJU+K=Ќ&|o{ϱӯ?m-*hil<τ=*3|qmNz+Pux];ucL,2ki2}9Ci/޽*i v`~W8O]M T֣:Օ&He=- paҔxL0Wz]%[]q9%8NJ[⩃@rP𛰺y(eYzՏ L@,W#Qs85ڴzHGPHDq:ITd[qNƊADbfTn\FL alo<]j]s#J8 8x9!pJs#oٓnל NkAaIP~wJ9}.M#`1pW90NeSzwr!{I]y Ye,|}UH!@K*YId漀hC C _R'QM۞f5>K}GU!Gtóx|Ψ#/ks;BFg~) Xi8Aǘ ij 97oL_H3VXuIkH=ߦڮ_ZRNKFa]Mpu9$Ώ*ePwcZ=LېdVVٞX8Hsqjcd.>x.+qPpS7)#j5>> SSfEQs!U\ veYvT8-LUOkxOe1*dtm.aT$}tJw1N9d>П {[lXC]M;ܑYM_?l}t 5#`oHeV-;y`UNNVg.ϻDMw9+M3X6}xfMGtŝ_ O+?'+Gsg~8qz[K`/¶/?s%:S$Qp;› endstream endobj 1145 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 1147 0 obj << /Length1 1577 /Length2 7948 /Length3 0 /Length 8992 /Filter /FlateDecode >> stream xڍTk6 ")]CJww4 3 ҈tHtKRHzsZ߷fg}ofz}nY[5H Epyz||<||8`a60ؿn +SB 4aP;ŀ"b||~>> V`[&@ qa.n`{26vPTT;@4 gdF+@f!+"c 灹Ks<r~ вrn`avO+7 @6 (m._W@`og+ ؁!  2aH++0ip+. _m.8 !0KVÜAPW} `7 ֽy 9ہvZuw}T@B8` @OD@^6x~+}]`.;d  n +[`d ɻ|H|~̑ܲA!.>Vn~!>O !>L.BGehH#ׄ!7OAUd vw_* P{ߗ+@:`Z0 ҁ7tȭqB>p$@ȥPXYy G@ڂ~3!.d{;ίyx~A%a ꎜ!I~$sw" [EJPпH|H @! ;?(/W;/Q1Y7пJEBx). }@680PǺжY*Oqi歧ܾn?1S٫˦'\Pd;YonhImLқjp_@f0 S91N>ɥgW}_hv)'f3̯s>R0` i8fΧ_Mѩ%q 5Y叿\ad4A;#dypη͊hG5 dgKKm %/jLJ b9Kj+^E\/w:|vv{JWWZ@1Jp9wkɥÀF /9*nqlQ6$^; cqpTsiT~:h.Z6dMUcggr5= IED^^Rmxru9UVb7Qs<"1ʬ*dK$Τ'+zv|Ttr~dE:O󧽫4IBǣD+aV:{5UCC:a6D0 \UfLPwGI _J{dNYHiW;[5Qh |d /|Aac^$Z4󃌙y%Q(6R;w(2ޞ!vy: 3욕]aXWǕ~yD_hn?NY'nLf&_3*KhhǞCh7t6s ^!;ﱾDdB`5m2BhF&AL矁B/4S`ܣ.]H8,"(~=,}O`42yĐpSo*P%[!ʄK g)GdQMJZl-m2$rZ+Fg `=Oj^Ѣyl"焤tФtS7( '(;=-g 9505a蕑·ET³xЂ&YC:3.nמ=^Om=Z8BtdW9Bޭbȧ`{3Ya2,_'F8"qfO+ItҽCc}@\,Tv4rcWs,L3>5 VNK#&j*}|ڧ\qqi =꟏1rӈw28pv*%];85'oI^(#dv.Lq.aWPM#} + ~[UYٗĆw "[يl ,Ϲc }͜~&nqK!`Nu;~8'a?y>(kӅE1l\ۢ X#N!"-.6sԋ)!tEmjuJձM ^ZQF|%:nl~@KBV[G+fbtܚ66XWv^w؜PQYRP%Wjʒ٢h-ه# Ya  O+htN^oGڳf:+&% ZXt7'c(~X2OA"iPcW ޿Bh|o{NQ2g E3@nK"'odmZ8>v ҈kM6` /tV٥Q=/Io(# U}횆M 4VAbC%TK`mCn#ʠyL$o4&ZB?wE*bA8s \LChz( d`.U+MD{˙{@iJANƖ ~|Eq`P)'sT;}>(]YVS T9аڷֈlEed~ 9ԚƜ]7h0L7K\=,YW'yFoJWOdFU-sŇkF1Mly57JEh[~zgByGvG~$4ն7zxBT]ۃAvQgxU8JlI`= 'y<\AqO]Ƀ~4$B+8jqʹggq*?nImC ]mӕ}E+.mVOVUykwU 3̹{&(5baPhL kZ}٣,jofز;Ӏ徳ePcu,* U7όWf[eւNk] Uʣ_ E&*m(5 JNߔ?MHԢU–Xp":D*1GWԒ pE'|GⳀ\Bf@'&, I!<&7A?0[5` ǛNkK;)^ {$ELd7ۼ,ڧu (g!%6*Lor+[G>Sd 0(8rѲ]3Oq|卵qTcz 8oWGE 턯zCbY<5)Z0/zrs 5`N;p[lר@pÀ-VXy(o <)fJJ'{:TE)Jbˉvc:}}tfe J؊e"!~/8|;9%4ɉ.;;L]-m pW+ڐ^$|b,in6"2r׺PU{2''#WB_S1K:=ݐs 8u+YqS󒍡=KzC4^NK'p#p57oy0*;?59vsl;;BRfojQ﨣V*1~VϮԸSu.^|l5TJѮՋ''튆`^n Vc|ډ>)>cs{N+ĺ5[*iUϖ0RXELgMXxJi?2+ z|';d{Mio=]h^;}ȧ QwԾ\,/>?VɌ;~~Z(\0G$2ιᙝkH$p\c@Uxp;Imվ*%*yEES/"Vw/ G >fZ?'gIJ܋*}-?\JS< tkf< Z94fV]A.,z3P?HE8^Ptjt*r;j\LX'k2n@ZřFec(4kqgzՔwt~kַj'$.Len"cap2!-7{-9,_c gxEMT7?.TzrHzqm~ڞ&p<_ rlgV)hf#U}G$;{_$jCQf>ET3}8x33V9"W۠_boTUyR="+Nxŧd;:<!_ e;aȬX JyN9RR:UWI.(w; /Q龜;2ny)3,^R!_ƈzbyk60Ot/xXg0y4iNTG*"6+Ys]3$2>m9 T [{uǼv~v " ԘB/yk*]C`AZ_kf {GA }ZjϞ!ux)={~ճ4}Osdl,{W5U#Z= ~|DR wLU%AKOfl fۛ =B=uO 6 tq-.%x Yg|g]R+ 2fZ`o; =pB$ -Z*#z_0~oA{|dAFQMH{+&C;{&ݓUv[07(p`);Z`Qաu}wo]7⋽g>'E؉*ZJL'q*(p# _B2^|eZ(2r`5nkʱ'Uڮ1pbgh,^n ƪ7[A7ڡgFH0|{j|VQQި}wreuNpu Xo\oOMN!npId˙T>}O6N*ܥ9. >׃,җ <[0"K} _λAp 睃Gf:\j mgYZ$C8$(Mn뚈cm/#1x'*X \k5(z%] t t8i7iUdfLߍ?TVX7JߛDns6kCy<h5oJDv)CQE*ߤLmҒ=jraAD|غe!#X#lҮѺ+s%f N}d c`tmr5<:kifK#Nï{kXϼgLjy[W+URNĖAY}[e+4^8c`6/Bz~}Pz f@[sE=d*'Y2Ijk>ڙx[ 5N/jz!a{H&C3QܑJBmTBoc& LKN'?X0s{db|]Ά.eS8anz=gMjgѶOe#cv|ٿ6?(Tt'=fz͕B^%I ޏǾjYp YG=Jt5{|Θ+PS)F03 7xA5_#͕}F̪{4K{\٧c8Yo,{SQ gHJ,mY=#ҹa\|jjziT+KMjJЬ?Wsmd۱ڝvRw4L&6/z.;;97S> stream xڍTk6 (!Hw:4R-% 0CHww ҍt+)]Rtw9Z߷f{_~f #$us9U nn^NnnLFFm0dPa!2#0s8PPt ssnn7߆Ps7@u0N.`[8"_O-Y@!!I b9 2ZCZPK0_!NϹ9`P1v;n @.n +?qb2mZPk  `K# hr jN ǿ2`9O?޿;[ZB=6k0PS{V !0( 1@. '0Gt? ㄁!zq̲VP#> q\kuw[;ZYjՉK Rc0l@p??r<,m~%tV=z;Aֈ6@`kf]\Ao X- d `ȍ7cìKSOV۟QJIA=d/ȅ#Kp ~;`R، kP>4dNԛ ݮ*m8hS(ђ9( !#4Wm{Hp̵T{7uØ_?f+TWy) ' g)6K B ,}oumQR{5Z^:2ƅM֜n^ Xmt5v\ yHB@\2 -.6PF*dk,:#c, Xy+ůq|' `$TWxJk:Ly\$bcPw ሚx?N#cw/I.,?Vie;PS^]./n66R#pJ>W hM|jqYF vKI RnK[bUfE8p~ݎR?S’WFc./s%^B“MߎPw쏡J{?q ŐBHyc,_~p~sf Ƌo6LvT9Kp烅x+U^3 y?|'})Hm>3ȉdk݈WLo_w+trCKqAaw7u/+\j=%]G)eTZ -4Ό˞(`UB_${cI=ȉ]}ڠ7WzO53dΊ[bQ.3%A$1SGѴVXUBoEO1ܬgldY*O|!TKatG&~[e!xAJejS1 XQ}&a N9MpxJ_g)&y~ykλ)Wyy.` BOrMl!@]h][kAxw]᤬Z/bAFt3H'5Q4 fibLK gvD[XC%nMP2_x? G15Pg4V: ~|4jPݞwu!v0ݞ+ȥMmnAJW5>|> PFȂt6<#`$i$6횧-3%%kJ="%\CteφCUEOzkCɽ5.xM) i AƁm[Щ1mjhFXUfɍpHg؋uz8k4Ⱥs( FI,.z8z}y8 |[ϧP꧝vFOV*syy d!/ԶM0%?^b(5aPTBdԮZP.; fL׍Ћf e4'*W?U>*m,]&#/ډ0ַViTOG G+g}J6_X&8acu_]|ywM16f$:+2k+5hSQl8ꋡBG%yr>b9ݢ;D**ۗD}+Ǡt"-^}o^4Me^"4}xa"}u 지'j9ڥ4ci1GGBՔ/;3.)S[F%0' Q{q>b,`Sĺ篯ԍ|D3#ǣq$Ee]pɽasHfnS%[Lzo|A֓:{wS>?2g|{v`B41l6Nk?ؕKd^XX¶lQeRpHVLC2tHb BnJWM'{ҙxTϛ,UWl$’>΢cj}ao^q( _VOh4Vx;K $5;A屾NI{ elI8E^y2;DuvhM;Q5?_n0f3'p<S_9|-zaMLjaTnAu'spԾēqΛ}Q&Qc+=j 19r*DNI?f$ 5>wPfAw8[7 g=ef%wx?/q gh>L^]˿^mٻ]& ra-UV1y,|llD(J\% 1oE # aii.N5@"\9| 0`5M#B['|E+9ۭcRUxb`Wg 6% nrI}SaTxuv_+odkIpi[~aSE;j:X@FliPo"vn4ߝ͚Z/ClhjOMlCWƫe9{yh*nOHŁ|L1> =`x0Ψ1'4 ;I'Ҡ"v[?{ہ8}e[>}> Y'|F)&aiNAw6.DTvE`_LCw%LHVb89^A!m 7)K6?.6ǃ|EaL u GG rŻIqhZ:jc8v<+jbz(́HpEtͩ. *Cas8xb))NS&VBl'hVQ}gQ-\Xx9ms1ąVn(!h)W?C/vie{ճġdvBkgtl"ԏb.L4bJyuJa:=`hZVka Ie_!b M:{S5 4x#,N핛Lތ=;SugՆ+(U(`TWXņ5̻QpYOqcWN-mM6^Cٕo]b O+GױC쉗$3H0BbU< _)oΣc Fr`_{I`LzHd㋻fv9y8Í߲F{D,wo07BֲܵOD Y[qfg#};7#(vJHn^.Q'NQ~^@^eHCwIif4G+ErKLد6dFC|=vxs,q%N>U.z-31J#);m+IJlB!+gdh?Zg>p7.M6{Kc+Vh`M-m1v0W" LdL/ `Ţ _Ӿ` 8QTO= mO-:Ry!<`r")e!P em=A( tapuc{e.hȇVl;w}4iO[$2t&ؖ[<͒z\;O40.ܥl&r2 'W^-i 3Fs\JU7IIt޿MN õzYv4nޗё4bɂnzj`/Ϙ)0j[/V-4Q\hArq^nHxK^1r*yEm߭_tyEUH,D+ϧ(tx&asp4Z_N?cUi|ngTnte~~0`Ot_ ɀ,$²\D2WHD*9^e^rTW .i{8'w* 6q,CP1/ҜZpsٱ 5*KLo5 *Ol[_Ndpv(2tLtե]>X`g;IZdK>i"rl`Jhq v&Eۼ@bN4z-1*]7oQpդ|K!ͤCox-4Yx:*kKƁ;_;MWr e7XKOrK`DoiDQnLS[} G/4@ 4( *,q,Wx3.;5GP/AElR$x?M[Et'YOq B )-^̽T'f2mWGN+W:L6D} Aꊾ[~΋|hk&ŔF(UE*?NmN W$H2$Q`ccofvKzʞ Gͥԝܤb0..>QLGvySȿb*>?ѱ3$*X,4'aܠB%J<=uR-ōᬛkhf+fQ)mb_.,on|h(zw{g7!vW=@;~l-Z [`%=~x19h i">JAxy ^YGHN>F=XBzBXlcxM@WWDq8:CBX8ra.Ap$o/6staRܳya bP3nښlUBo.; 'RS ~2~a\ ZXy /RnL/s=ַBJu%ׅ.~De0k[ k%~ Fw13OlAS:#{3Uk9P0i?oB8YUj =tf1R c1Z)/kՀ/#\&;$އ&w_IHQ?}Æk٢1 糣`{c3,J[jEoգ콊M};K94KemZscGh t=U@BųQ|Aw 3\>PJ43d/ wAG^j&J(լHJȭR<,ߏ&o!C<;%ƅM@B,~ナi*ѕJ^m,!FĊ{K>@IiT}'"'M."-TM#_q𿬌h$Wİ|A6{ #f-ob,Hja&Eb[e&%T[%\x 񨒉+ow#W26P$>{QcV>\J0 nPi;K,2I#p@B)g;G'>. B^65qt DMqE`*i v0Ϻ؜hfEg"! 6%A`cBtjGo8}<|>glNGWڌ$Tʮ_P߷$-z$yHʝCs~hv$Y!w66n%M D\f%!V:Hw5N4R'k%\u_ {rt|1h6E[XLj׀v :c|כ>8?\oQf%pۈuf&cp9YfFHR:'yp->Y,SZ_wy Ϭ(*"QowmJhޅnzZtԫ G9׬ ڌ% sMڧoGj[)^1l  GWv"[}K(e*bg^1G~7mW|Da(셾MC;vUq,|C0AV=wӴ/;'XE8U!gU+l{J1 Eux@IK$T ɍnЧB4_&3(58aN`:߹)l@D^y,MQX ^JF Q̅le86ʾjs+ /vQ|nuZ'{aG ԔyFzģ满@ϧI(1a뷪c|&JͤUf-;V. 'oYo[T% C=B>}Mg*w/Oր鍖% o-:GO|w6-)#gsn : (MY! Gr_ [M6ݗtb9G42[m81>@nv7Iϻ-4h] Y.8U P72(]7Tsvp!I<1o=*)GFOJ\A[9 4ڐ+" ? endstream endobj 1151 0 obj << /Length1 1455 /Length2 7066 /Length3 0 /Length 8061 /Filter /FlateDecode >> stream xڍuTk6R"4H(CHIwwt#030CwwJ(% " "HwYk׎{}_38epkkꙈxxxx?և  !H(&!@Sqp@',PBM.A?#?Y< }ܲ*ʊOLONp xyE¢Bj\U  [ӱ_`Klz G`<< 7ݐo7o:B< @&-AV8WD Af&3'TCPeAHw :|h}$]|}"  AӉ}^hA! QzF ׵ ~A,aߖ[o DEڣo] sA PF!VoRGC@spx7ͧղ4n߇q~k7 D1ϼӸ<$ \`0U{$t|ڛ}tݼ#+K+bϲ.gA-Nm;*L NV䚩&PxLDBnČ2g`bNKl梯j0z=k:X6MПۓʿU%TJJEF=GEր`X1M'#ȡ4\E.W*V6P963Sս44JZZKL8Z>f )C20 #-z u>9O#c7䥈-qPx>Ht\Tޑػpodt̂؆=^o ulɂש>5ctQZ/&sI뚽bٳjs77h^qɗha+WൌI'> w8]5~$EarYOQ1o{yK*vÏ阷z"qz$D1+&>Wy} ?Xud6{6'#Lq2y&I. o8f)*EsHdNTf*5cHo)- gd#׿rvM啴47>*ʬ8=H3?Eoˀ΢.FlBf ڳKou;Ĝ9fFxkQ }K$> : ܑj!י pFA{B-Sq~3b)<O2yXL0ElYX>7J"T{Og{ vHL(C&hGnC:?~<\v _x_t;NexR o;<1KM2TǨ_UUAZr-\O5nk{0,Hl3t[X6yX9:.g^/|J_搔Ͻ/^Ck  p`HE@n B0tt~d=:cy~1Slˉɴu.t7_T\/{fG/,߰,[GGڒIMLt <29?珬oߘa`(S,.10*42NG{5;X @X?A\:)HYf#NYb¾ g'uy*c`$jo|Vo#lYoOZ~`:,R fdF}'0ATa )ϯ^b_b-/-}ETh(:wJ8%Zvc:??` j!)?kYIͯӴ-ikq+@%LRw}_^p0 *rԫ_. NM%N `k* ^S{T߉eЇE3(,I2:Y0ҍ)=|LKd(> X{@WUq9͛^ͰBQP>PJ s}!c “W$L Rns}adE;bl ߹u6f3 ]"i {DՃp':X,uۙu$6a m; >o JogkZ|Dq(ٷHB@@&,"yL%Z2k xEӪouWڞwiوEޡj4l$L 3!Y*T,:Dw9ͼz@jx B L߉#ypM={Y[īʐTNcwJ M ,?P6NkZ@ael)^WG| >UW9r,nAaTW.K4d]ĵ&Thw;iJ4@d0mwA8[FE\e5V{Ŕ_x{ߐYܭAr9 'zjSΞħ[uR^>&q?p\(,%VHx?]T7{/FlDUM<3Hp'b"@r݆XxA!&o T1/`3v\-3$ܼ)$?5褕 1k?*n빩ZEJ2He,pg!}Ii{ltYY{DOsL{>ӷɗظEec6Gn\'(4= DO>]!2IQ_:Ee/Jl{Fw,^5&2ypKnK(ŎOTX=ƬSgOcپۙfjZC|#8Fnf5<&[?'$gۑ`Čc3X &,><_m/ Q  #!ȑ`/qQ6L]_kX?%3z!) 6{\À-K,6mcBw-o)Nݢ:SzH/Gz R)kW>4#~ŵ UJNZx79T?)]֊z~j"X|ٮ=B1PD{,2Ձ&]T ]VTb~m <>Xp@gNݱTOKU`;[;ˍAjOE!y"yoD.^5~n;&*9Ջ!u_Rr4dF $@&LWk^V p2"vz~VHj/}e0`Ap1!+D{^|$ˑGy|qdy YY;UR?HBr WboJu鵿?Wuƚ-|9)wz˜Y!oQ]e1Nt!.g GV|חϠM NSVp܂cseqd~ЮoٲԾ؉Oq #Z f2iAl>u^z:۲_6<JA &!Y^ OCGp PT]"2rVb+Z2|;}zc+ fJU?Ugwf/֎R:iFD˅@,7S}gP 5k"-ewf}zŦK20Rp^Ҿt%FkLiTduO\튐?N2a* u`VYcPж!ݭ'jb\'qQ`D~b,yc/8i{iyBbwTOLB>Dɵ@fxjG2OO7\yL}j7 e#|Iкs€o(4gBb(U\)Jn\K/Jj2+t'AiT9e׼ S/T؇DS,p#zs9S??*yn}/y9}7T-pͽÈoʹZi+$-~"dE>ggofTip `G C0Eg˵ :ʬ* 4mϊKŴք$G΄BE)y`/A38C œհNnAV<'}%Gg7 Jҹ.U寋s%d0MdFw놐(5<Ib_n_JѢ2ܟّquqM5Tףq'613t=G=l+zvS) {B-ABҭQXv7JYsX (E~6(a F=K4^^Ṇŭ:${Q_i4EeTXy>F.T7q 1ڮeS2D":bYAp+ҍHtܪֲ O5qtLb*w"}!5TS tR-5>=T%*-H{NtZs;L ocڰ}Unb\ROI{>d&axo7kJ^En%^ٸm-|P_~W&ȸUS_OhqHy٢!mZ-aPE"d ~j{^zs-_1  oT}푛Xa@<7)gFH>(6n])9X]i^&uէ ou[7#ؙxy(>;Ða6:|viuYI"q#W0oY;P]\xU'S9r/` 01/a"c kP Ng@PT_r)g` DƧ)tCPíG-A~,_ 8 VWѠ2&t)ۍǓ7̼dW{NTU(N60  a1kXqlƪje]qjO[09xo_RHz2US%0={_yc5u{.ekAb\ ?XJҌYxePbj,m*N[(Z]i=lB QKNxV'R싱.ez}Ee x[;^-p>kRWBf(RW+CȰzۮ c8C !u8?I_-`13\Ŧ;lЃ9ɤ,Wc5nnȘ Ko5waʎ f3<3˻k$ h!ف'K+VFKe\T=`|mԃL޹l*ZanC"x]]QFST&}s}wQ&MJ"u̘&0h$4#ji#;ug\TNYk]W& 0gp[k1EO~.ZT' wA>;^]0m@3KPގɣ{7̳4eRF;%w6e"M酣9hX75##KyIƆ&6EL~_|!W~CƠ&JO(s}+ZG; ZZSQh1.Imj]7UBH&.Ù>u;Wi2  oZ^=9Ĉf[ S8m.y[LQ2s8w;)~{?Ȥ+keUnzr3/ BH62sG&:?tR@81(/k ʻ,c[_L-7ReYζEMQIRUCh5 rLRa_:SBCݩ:T.t?us."jp،n.- w.M$zqʍ܇9qɬɴJh\f[U(W-IiZ$!2oh*T%)obw4He91{|"cq 6gFb4wD3 endstream endobj 1153 0 obj << /Length1 2281 /Length2 17865 /Length3 0 /Length 19227 /Filter /FlateDecode >> stream xڌP\ ]{pww wwww8J*ǘ>לkɉUL.tL9U)&f## =##3,9xXru3'g+{ ?4Ď\>8Q#E9{ @`bffd032rGމ jfe H͜aE<,,]>'ʄA9@3r4hbd P72sT.. FvNԴw+K)௒Fvf.ji/21:M͜*R3࿔e@ wsLLuoY6621s0zZ-VfqYzZ/E#[g{#7#+[#S7 )>*w}&NV.V𗛏6MÈ.ΰ'jdfwO dn45 SW5u>(? `00d+B|eX}|z;\\|)_02qYXax?1~Lƿ>1a@[?1_@`bbdp1|׏տ`c+4p+ݏ>'eտ?& @guM>0MM_^_f$jk_ ?r#;+[k|LjkuL\TcMJ/YT_S/^});[u|X12ǒ|"c7ecfc99y2~L3c+M<f=Q eg0E   `> 1$ f`X Gt?#]_]}S>AxG"ӇcR˰|dgd]r`+"DZaeGy`0?GZ~-=,̀?aQ?GLE`ßT>t>>@[3s?,ӿ]?h?ep3!W3Wi㍉)Nps$B#+ |$? ?G?r?ý)._viބ'غ.Fϝnoa:FcW @)P jQ{v?qFFKF7RC;ITgYW}.mCE/[j,Zǫ# ^J hSzx(hlNNx*ZN)2k$njf2ZP cc^v\I ns8o0Pӆ%L7ɘטP~5^0-vO[G L~? NXLQqsvJcaLށm}~ONB.eQ`1!辐d \a֑pAAhsykiK\i SMڵ#qBvo¦ZEP{,>&^zۘ*S'VcEMJMA|A^؛G1,lx/}PƖ"Q s\S(v$X֮%KJpoC⡃ "Gݒg < 8ZqWL-= {KwP!+vMVB'? jP@ׄ)V3#Zl\9!nA ]1(TX8Wftc-ש3fktHj=/#",CM&_>;#tyAǐ)-0-->I/4oh. ax5c̝w/D E3sl6E5;kO7!D~ءk_D&GcZRuʽ@'4=t"@;Вd`⎻V$\&#eh\0tҀV( *N!5;z1F`I~j1fsR6|{/(V}GzڝZ;$^> m׫m@gY| aR/*(zP0?e|dAL}9[@o?f(EeMr)*ප7*~/!Cwߨ{o?Bʾ%5\rKK&2uxDdu|JK]wW•T_-W4o3, 0/TyUgM8lKrMn#Bc29z`y^qs ԤgM#m,Q(C˯fw+AFE!t~ d r>Fb"lT&!efoRtEuvHҞ-fŪxp&7Gs{*9#|&;IKφ\T Yd -RHOɾG~7J) "|Ѫ- [:dEZdE'ʭTXxq#M\ _܉EO0_OtTW (K dqYH6xa2kB]xIruF{SҕR6KeO.gީ:g42amYGMP+m$-]#'SַzR}fg&C7ԃfa|XZW 夃M3S0$,%RpM[K-`RfzD^X@jr8w@tjeVJX+MPAKe.'@h?qw+v9{'=9p`{1NCm9ޜ^V L%?D^nҹGzcln&y~i3}~-Bh`h=nRmDjGgܱ% hBʺ8ͅ˛51҉-U0k:we[SϽ^( F.[WDs&]x*M.H1122(m8> pqn`3 188)9]\;rgb#oUSGtU_NW/DK۬5-:92:w4dk 4vw]#R^^zT_TgFtӫJ K=b3&h  q`G i^9T9Y -1۵y}"%eSbaQ|̷O -l UlXh#61tg8EXïHL꠰J5Fp? tpf1g%ګ){Vj =$ـq|Nݕk\C|H{~{tژ_S%do*JX{/;z,lK hiZCЬ ']ַrI]={;y'EwUBO\o.,:L&{K4 .V.WS(}kًx.Mt/OWsp䶞4 ۋ.ʗmI3>]} St+ʇځBCF9C=B*Q{Wxvy9,<#?8;X:'{}@ .ӈT;Y 4 :Iir,%fЋKoQhK:9aw_ (FJq`T vs@ ]+5grčq:b]P{B={ ¨>gͼRtV T?ύI^)UިA1R60}-&[Yߩr!qr[bElDFx.fԴ*RˋWk}x}ʻ8~.jا!?Ƚ5o=43('=FKE?|7>] jo2L>%"-;J|#&VgVL~ϔٌX2ayI>T #_՚NIA6LW;]<\v1%vsw \n~*'QxTd.KȇS֪_b1Wx.pVYՊsU+pfLn:H֚k<,}fsҢ%w;#&%na;K(I闭\KZsY\ `SklC[FLXqߦ4YL 2[j!-x~ͳN 0(Pu<{VM+HH'CM?QP3^E[ywd;lB,L$~dqv􄧩cyLD-q탂{+S40)e .]A)(d~Uj&1ZEۣԼC t:e!6BM7Dy>ܥ9ő+>4#C.Ěi=h lU8hQR2(#y?D0V^ޱj`]T_R @1lH'HL4NKNh{| ~$d q1&u˄`!%4Fdk\÷tJ)s D o?Qi?"XPDw.}\ 6h)ko]MCIQ0fr.\ntvSC|M>lfSTDNz6Tί[df9Jg̯E!,Bʲ![%cД ~xh\`}QhDC UDxv}sǓtLnn#KBHw,@%taYn$`Hjvbrb/|\,F ׮ 4FrUFXd&:şuiҺ7\ \L >d;bx1vp14Ɏ1{}w.]\]!`80š6nAkq0 J:Pn5airwiUg%-P݀ )9V?}\vػJͮ9?ל0j? 鴛 ,9f,4mʻ^[Vu*rT bUƁDA0D@CebJG]D>$6hݷ@uzyIy{8jv5euQsP&hqnjI@ՎKnTo5gʍp9PwHTq86gAE4L(N1w Y HDv]`.E[\ \[آک;B-UC=fH)" x(mP L\ #sWd2G=/C5JF8ePtS.H&rru;hEqLs2[d *b) 49jBr%U;FK_y3BR =H:|;*CkT\+ +ʊRT?c =Dې]vy4nRBC<6Sv-@e H P"7]Tx3_-!ӲA&0qSE:6 ۝2]WC̦3VQ $mw3 V$KU["񤉻ˤ4MDPe6ZKO񪒨 tqt v>eŋDxo$+ I>=J͡ZVjIS0Nuj>}=-΋N$ܽ*^%N//z#JY֥JY†M$JτO*/{ hCT82.oBǺԴ\8LIQ{/4hZqcy3HTxNF)֠P>NS.!r T,tac{K7'h+Bik07j)ԯ;uw٫ށ K_[1;ҪDg+_4b[)8LgJw|@O#瓢n1Z2l.hP"/%Q:/ǼÁo@k3Bѳ U 빉}M#EK) SVWm@s .c$^;\ĖBwtYMMvyNWIbq=ww~ G;n*<o4pqYGq *,&FEJr~Q@)uݴR IOgpy1Sn?qEv\(S_CQ&C^_/TK[ihöwO?AGE~7ȗ^%$Qp`mrX:2#L*^澕 ɟ  TJx Y;DV#1B5έ>OɈv *8-ؤGm>Re; !L3`[Ae$KRz'UXVfJpneMz 6y]J%tqx_x7+>3V9RvfrI 3 SxTh7 WJ1ELk3/ =aw{".\ÄK}SL=ϴ|NJMb/v%"L No*!CDP5ɖj.`yWb'-I]c6}e7׿-'~2`h dl!S &@zW4j 6]0@j^/5 zvΛ_eN֓uʵ=q귱T]xW>`:u_~Р}WEalT3چxjΐKBCg-~L剌 L[epGйWɘS.ȞΕdnEBV*fQs3`R8_'XyuT?8ѠxU.0ʍWI̝_9a)UXVMd%ڙi}RVx0[M}~;D r#۸ uCяʃ~n龂88b:/đ9ٷ_~h=EV!@X[07**8y*G^BGoSٍ /q֊|G]ۈBl߹Z#Kwϭ0=e%YNńm@_*&9'|FÜOAp"9ڕ;Q]ΏmT vYen)}K)3MD$IDa߬_5`d_a-CyH7@:,W k U}_M䄡򐆠:H)iҼaEнxPs "sNG$sνMU% 2e5C}l>E4lto?ұ?I9Gw߷aTox  랹1l ޖ/Iٸ F"JD>WjKkjqOsXDD-0PK=fuC7fFOB:уQZͺWӭ9h)V 29냧}8xll_96/T_iTo``er˨y.i-H~+Us/Vm|;iWb>\6&lqD*hP:q[XX:z;OGF@.RMYH>[A2 ҃FtUY@P3 !4г@%P]E2)/:-0CTJ A-pf-/u[ܩlzv$RuDf mk7Wy[w>r ()O'z*-bnQ <֜E't `wŊpM 6 *ïKo痆v|&M[y'Yl'+,ZA۷ /QM/yA|d`e(sK*#O*٫iLf8<;jF-t_?:Mp2o4lVGKR!DP\߄ԑRY$1rez2ĭ?< [+xW1!vӸ\ZQ&|shiho8] ~wM?E0%f,X"L6j7 zHLk3Oԇbz򂡐kH9:PXd'X`;%Zޡ0,ք|MOC:~?Hư}ߡ0 QvqgD]kUȔtS V"*ur+_W'2S:* z/z*.ԐkeHT 3몟ȇ<ȾWW;º`ɮq_~͌:ڼ Xz+fܪՖC)볺yn:Ewd ?x3^ŁLr.UP6h@(tBqhX-K? C)2]Fuo!b wSG2>sHgfg~6e0S*#ab"i]~| W Q+h'_殁- 184+Cװw2Ql(faE?,T0iM8="[АD;J6:̱ 2-:s0' (BNClPVkhZէy0ak>5~ˮ9w|2᭫Z?EY(HVoQǜ!WKJ2\[}̠ϰ ~/koW5 +=+s /ׇ$HeoʭyJr>G;O.p.^|?"d\FLU.u?BOפh8Vhz=R)b\i]^gߤ<]~\ 49[s/cr[VIRwxJ&'w*[/ܝx|4ŀC@fnۧϑ l+;PuB+~Pc(V~_lݡs`Kno5Dљ Gŭh&_*Ok^#"jLe>9/ÎUqk,ϩ^UŸlB#BT(( $) T#.dI%281 ~WQvdx I$ONJb+ǶjB{uZk(l@pR&:'GLr dBZ?>XphTzHDz#O32߭};UGg:gp( 疼,_baa|Dgë@׼Jꘪ1i%|/-9MBVLܑM7 *d?DS]^0f76>kݡN0\U- ْ/?&*cT}_#F7ұL?"Υb6T tH%w}Ho Ի^-q/Q/ĝ$ Ԉ d{UQ_+n/80j T'b8qF.Ycg+jYJ~NqN,YQ,Xd|g |̋ai2xXH,e󾷾@*x(t`0Qz҄ŷTS:I(l ͐,O)uU730dA/I$JnEFʧNsIOLiH~fp",:IOR<4T*f>q k>\hAv0-f5^K! cǎu8gr[Xs_ ;R۳9կ G[[-P0]|/`ưUÎDWr<ay8LL٧rO>A{) YLbrܷ}w\5cwm* pLsڑo *N] Wx Bc07i ";@ߤ5GB@PBHbśC:BJd:AeNި]ԛd82"{#di]dBI|P|5ˁ=TL* 5y$Ulx}4u-73ш-7ӜfSNpU ^^lL x,G ?qH c#>ԂVUP݇,Jfd䘟lϷܔckpslډ@NKҥɇsPFREp&So8˗lU!85{òܟGoSw-rι(Yd5!ȥ?i~LOaɥM#͖ GYdk(zhzu˗K}b؝-P.>3 dPHÃ9!V/+qk ZAԽh 6ofLha Q춘y,_+4hI6>8 "XlM]WeP lB 3g1S>!-GwL/\(ʪI_xlqO,^zi]u2QV^ѻ|˩ʰM %0#<u\ }~JK%@8_EoBwy &MCS=]z|@Z҃OGZ8qن̼ 7j8ѵ Nf ƓV=S,&n3<%~>b ;as!:fwMBSeV8_@'DKש~n[IwYZ ޓz^0kdR~s g;g47u^Яvd9,^O{MB2߽i<5b寃v`p6C-đi@=%rO4l ~|YK$̎P ^8<>: R̓*!izin@@Iz_2bۍBns\kQrw(U Rg-5M\/c< %yy bS"{ë;xDeyV[ pk{Pb/ƈP';tF?gN)A;JwO/$^\6Vzݏ<nn} 9hI $-Q2=ܓd/2zv?V6x(jEud=aV%2Y MH.Q[y'F$`!fЉT[ Lo$/XDOܪ 20-J#LIqfmB4D;jhfѼ*UVSD[V/v&N+~5lw(zlּcl=U3eOU1PRc_U'ui[?d\q8vI]n gE ]JkGo鞼4wShŚfIډ#7)w *%͝~ !wԄsj/R4ڒv#.*C5xTl3z獻?'`qqʝXD'*EXeʌɊ hCUl̄#I[jϋO؂S2q|@Yр2]5UslÔ}ݔNfk:PRRz|UBH(GwϿ5_}0xGz쏱&P74is=nI/<=VtrlH< \K-H:Dnٰ߈~8ϕ._%EvAB%|y vvFm>hĽ#+ХKNϴ`d_άf,ǀxO7;+y_6ˤ;/M;8KWNo˜4h3.[y#B 1T2B~>p ӗ=&7Z@@ &U~gФ];z<t2v0"T0YkU2dei褁j(JI\ހx9t.A >He2}v2”aM:60Xu*.ޔ>+*j2_Nծr-98@>w^}yt[/~:?1/XWäb0l,WiQnOp fa ]rn Z+$6{{D)V ĿxTT7ps⺧aw7iJAy,@aMw%ʜ2fп!H_}=D'0 ]\lōebS(}<(Ă?6?/-:ګ8'7P!h!-M!Axo! z{4a=TvԌq ?_hoghP(ȥ#iex */f u)0wͅ㳓QpȭR<~&CN0khm|H2b -MF6HQ+i,RM,gj}Dfۭ-S-b:@8ρjVW ͡b?p1Otu͘i@ >>OJ b([6u|a) 7߲o-D yc-1]p\8tkwMqZwV÷zӦstݧ7*jf& ){WFV&>:+ R?9"& qg, rnVv++7 | @ `rAwprt߿SZ+//7_Q;)tف3mjV Wtuucf`ڹ098[2<\- ; dOiLuK+j@g,2ٻ]@pv@d `eb7?޿Y 45us{Y[̭lAe)&WOW!tZMQD ՅW̿€,io&`gwuAOd ?kca?dneof 37Gf {+'7?6`o9@̿{9RkqtpY}\ O"++`G,l c+Ͽ'_G̬+&*#MO*<>F6vv';7 (*@X)ko,K#Rr-@{Y8YLX?_.fW1lmmYzc[7W(:7j^\Eʺ joao#\YZz9Zˬ`@]1?*_̿SqcكwL~ݛP?Ic: .Z9X99yrhGO/N@.E2%tpn[&H˄⏃b7N 꿳ql +৆X89b!'&ǚzY~zN[|d=+I 'qi?غ.FЃqgBprG+gɹ>:+hZ4e}e[Jd稵>-mQN;dh}?1Ȯf t+deJ֭Gg}\H_c4Kf)M\_ay^]`N%#ǰnyVPC_aMS[)-^\aeX'~s§ b+=F^!kGؑuCJ@pw( &ܙL=^gws JJnR{D| q gYlU)[rǷ:箧Z@*"|aJ::VaF7pU->B5o gZae)oLN'ci<D^ɓŲ&֦ͤ '8P Iܹ|"r>LKC+|6*0 ?l:kiN"TŽa^Э(/O%/ʋE؟F Ƽ9\I*WqxZWB5] b<^@mF%-H|KoKҒA ژgEϡ躰@-* L*Ɲ9~2^;/yk&QU:O9]OcB+(L;X>,=\"{]SL%0k5vY׆+TZ+xQ>$gOvR}WTg7v.ϥKqs(>(F2ǮGˌ[j%`Zh_I.Uv|lw/&Q},v|b )>;qwCFN6[-/#[L6閈(#)*!!|dAyee?ʎ*$ ]ogR{K+38v'l* 1ZceJ&5Ur2kjtA+uRS/zp _l Q $hQ2@AzxY]=N^&ds<"K1v`Z*1|FBu""O{XVҘ'_Ij\S}Kqӈ$|'.o122l˖ddՉ5@9fAIFOmyv^134É?]_Ͷ.nh#"iZ<1͇>\9~辘Y_KhYs!Eh|o)x8@lE3t?;]:J-Ss`,~K^MOų@L<E\S'_}B xm]ӸٞR< <-,Ss8  ti@[m@^ΠB?P7Z_ko3 VǁE4"' ΎX:!3dB߅`io}.]%EʼnBظ]XW> k_n4i)07mFV;>q58;}},ϝ,a@5T!N-7˜tRGmH\DC!$݁HLF#oUaW|T! Ynw&cncӃw_+ [Ц'X3*K^4WҔy_81h{QJQz{"ɪGP{}+Mu wߋ4vm?_rL;9 b1dqA,Cld^NKQMV̴1b 4RիE Qu2sh2aMv UjWA)Bah %-7xm,g͊Q,ޝ\8~Z;V[\{O] Țz^D}V s?FɆRmqX5Z$ܨ?GdT 0;U!SSdɆ3Mr''x|WIO欭oAF؄3e _$՞c}#̷aו0eMEpZ7H;#4YM8Ffyw~V/b!ʳt`&s !fArƫ@VC53Kcު>>H [UL))O6g&92Ifh?o"bJ,tt.}W)dxɰc8nj9*hU&I}Eir?hsG,#hTIA zOyGy_~jR)mԞQ)?n%8d"5 „60qۙj6 q#>As ʑ_W%Ʉ@l6ڷ`MM<2u޿q}xڇSP"Y³04Jm OgmE'sxcw}PisESTMeR=EuwjO˻ ZsS.esQi~~ހ/;<i8agF.+0$E֟iR23*яVs橙\j$ [ :򓂁j;Gf"Fs2.AW+8[mQc6Dn%?G͟QsئL%Uw)ˮrdN2x{19{wcr˭Oϟ/4emS&!h=2i,1Q1y?Ȓ_xܛp[vM0(r"c}1@*48郏7Y} YVa:tEKńBl665@])Tmvn١\~L&sF쑚 yp dqĸuSg(erZqZ}tidEv&͔| vҊ &\TTQ»Б) y,lY*æ pXέ1'E}W 1PmlO̓38T^ kPj~V\@vh;j@QL5YIWdo ='3q,YoJ` &i~|wS)ăn0D"$5B0KP'!1rwT[ 2^nPu t铁 6 S췁䎈~:zAw ]37i?TUHUln!w Q6]'U2l}YԑI(ĖwaYS ^NjQ$Jp;B@L9;{՜PmY > sUfSA+o <SvvQ% d|ԒzkjÚWC%g %;{5=h{Wuwۀҋ`5.Tܻ3P7t-`jpՁiAP8gFɬl>륷?M/%Tzн-KU[P1#ݳU:[3+Æt3/'bYg/2"ͼeV9,LA0uy:-HQL}NS(4sV{T8=3n:̟w|arMk4҆} ՞*p[kx7tuB$Fn[)͛IR30ZG;?fQoѫ|s=oyF)nc?Ғ_YB *b'Y @4m K!>7Mb:{nk5hԦǵHfI 6eV^7~~\UA*Ώd9Z;sdNc".]آ |ފz;tވűbwVdRtL0%?O8`{&0 M]=̵N eG:9{ ݐPJsc- Iq%͐2h'}X7"LkC <X[ad(+I9pwD`5q]r EI(f@TVRCoZ!*%6򱋋+  &`+G6]S)ڻe/7AT`brXJz]z7n@`\#U)Kl֢#ȌT9T @8b?MrN0qG]bI"+)·u5T42m];'gWH0I; x9M0$nHI=zQP w0R 'L3[ Be?Gn 29áJ*SliH9*AM dP L4ںR\z4#rh?m aZ@Y';u.[Rǥ™>5)l6vݎ*JAk,ʶwmUu@s`τ&2s@8d"Z u7Qk4h70쭞}z΀0yG.m|>_x%xWŶ]ȏ\!'L*>Mzjycwa_`4K"hk1KQ~d0>q=1~)AN۴ QZ^IAN/=9OJi}9"oZ%S%Ċ{PoY3!o>5C9XN9OUg*jT8x.7]eÎ2>ZV=D$kWA<_mPޢf5tWkH,!@&{'/mooq4c%=Uj{K,vR'S17UiFk׮n_ Qggб|ӆ\N%,X ؞]y=eHlɤ ILHE6!3GlT-\ bWqʅ,~:EZٮbȧ ҫwjU!X1x%7I_A|2t՗緍#e!NۊkY|fnU 79 +GKK.l5Jn'|9A߶\f(f 1uSûW^|BSyjT9:M2N~k\KֺXG7r##By9}rv^ 't~0ULڣz8 W7H)Ȋ$kaѐːW![ݧ-129>h(>ikWT+1\?; t {37IH}vс, ǯύ.RCr8lƇK-_2cPw^ Vn8@γ" h8u>1\ynp˳ އvfs}A>ߺ-ʒ_m99u͎`}obb4^N',+)Խlli_=Y9[en*P\žxqK͵Af䶜HqLHD5l26r@c.DZ; $x%j ~z-ADj e76WĖIo1+]ۿ秱QG^4`biB\8YZZ!|Vjߙ`D/ ռV(;NjU>Z8T#(sYl!2\txۼg}~4cqe~bcXĄ9T::`wEE%sb7_P#b 1~]+7I.gi˄m{ؑMw1)~'"Bkٟ5%TA!$Ȼ[0/IGQ!n0(byi2L_=orkN32J?FNh3+EF>Yv%ZMGx׆ھ "E̮w䨙h{a=Cݝk.k{zx2{ڋ /*2VZ6FZmyQd2e"Ks_|\9 [-74 ~G&vġSxJN}^duslޓi_P$p -n(yc冐59Bq%NMRoq7IQ*IH ISi.Zw•e$z:j`gVK1}tkJ~vPܧ'2ZIEce^0BNn.3[:q[4b5BZȦ~)Α5r8p?ix$,A!;$hn~Mb֏H;qJ{zRbA\,-cөmLHYYLcEv\pkD46J}&G6c/$0\H>!8p֍Z})g}㸗w|a}zE ؋'gi8,=pFM<;>ئ9juKǏ1gӄÿ/WO9ɍJK5}٥/=aY΁,cƏ?~r1.aO-2@Ixe Wl;K- RƟP',71К\SZpkлRC} F3s_6̨!ʱmׄQa@) q4r$5}Y,;0!?fKfɸ$n$ip@6J1h\դIOš:?QnMsk Z+KjKa+%@XЬhOpx$vM 9Rq㋮g" ZW<@FVl&2+Ctm͔y|zeF:h1N)00ksz򃁏Fn kܩHi||\ P BR.q\ ٝi: J Qbp7.F~6~%4yo_Q$eh?8NcQpCMN)=FK@CڤTjeτd<戞0nwe([Fעh&@j?aZ?Qy|nFC9ll;CF:قTZ:=iBlm皣;hU`?rverBVHw}**C57#wUe.kDgIN 8${8e6HD(wЀ.ecCt+?$ppV3]$zC-a,^A2%ǧ8q}g[B-qS'tsO2=o.=(JGH]3.:c6Jrqu<ڎktP*0~R-KNE2<5E dY\͹&6kL='0ֹP[,ҜQ?H8fFphCmFaQ [q[FՓ-bmZtX.tqc' 2N){z9˫G9mp3=6xt qL!%7&!1:T"Puq._N-_羴=@Zd4#[\k)#bУ[W_%ƣ6eKa.nn=bסC<'0c3~g)c^u_-ʼnC I&J6jɰM1iub ƙMxb@C! G;sI0Jiݹ:QBKW&䝾o]pkfJϑ[htH8c5#;S0+/k&:;#L5LitE['C `&?'4_’h"x i❕)gӐ PU+#JZ㩙[3NtLCϭBJ )zQ)Z䮍Fab#~?vinF.›JQ@3W/ì02;ɏ=U yˌpa? 7( c'i _RC!Lzq1rY_KrG,h Pu6J߬'F fApj߲g%foV!W4bC uF#k0mr5v%r-p&%QsLcVj,((qz'c?*){N"g}`&ػ.0|~l*]Ĩ*j# $Z\̃IKYiT=<[0ߓ_XEq`E'Ӣ;LV"6+ѶFv(gvLrgZ6eeK6!Zo^,E#leDNm8&y:ƞ֙'w &cZ9W9mS0i~O!T%(aT /:XBGF iSn8WG8 Q&𧽒Omʺ?ylg[PL\z7ϑɷcf1?ҮU֘-v`_UoiD5 O{ow_;K[sGv * PgƺK5RMvJFt{4aֻؼd[BPbl;⣼ ^߷{f]"jUXLXvڧdzt=鴦u kFGmLo!l-M?x("h*'ǖOk fl)ՐpG].tߨ4CvG)ٓ0lHpp_]Dڥ ãN)yK_drCQa]<8}v\j*SwXZ1\#z[KUڛOѕﲆ2I} "Da&$#q>\9X7ȘS`aE+Y+ԷH$rf $|'?G8HwkGuYMnPis#ُwҚ(jX)tW2 qExz8$_2;g;Cͥ^ ~]=eGo,/HNSLNm7TJM+ݑiFx TN_+-Ї<}? پcvmsA.[-ls3tw UWѻjM]-;wV9tx91UFCcn?*vQf? ;L1$?;Cl(兒's ׻k8mjN鹎dYfIw|kDFEo".]NVu22g'!mz5X,qv7`uw=IҠ| sJr|PV6vPj5WKY4?7cM; .}M&>.[\ӎIp鯙;?m5ND;B1W~EaD;d:UDU57:-}3]<,ّӛdgXz|Q(&gӖKGsvȞmBևb$8}<ɗI1sIMe(YMW}v@؏a]\`MTGi!lx/2b )W9p A>UØ.G:W-u إF,e[cw'_z (*Bx2U45>x 6ӝ~rlICOFE0%ϵP0mgQ5Ƿ%Z[A.cux;vLt_?BZ O5ZXZ kyc):ɥO.Ӿ+ .*3rwOXP¶5 G8)_hdc0󤠉RzJ.+U#[L:N"͜{GZy8Te=HQUK0}"]NS!6DkUDAcI[LР`kMDO`%;|]V؞k4}7 ʼeT+NΚO;F%kv3Q/ن: ǷuhWoW!\'hETUMq~Cjjy1C=-z;cJ 6nם1>"r(A38'܅ϩT]Ӻ/ 7{icMkU4>. k≨< j/2׾Z_\#5@/ja&ޥG.df#fȞcżGFBԷ;YX͡7-}s<3$#͛<ړC;,As L_DO|dڝbDj4-Zg3𥟦{&>n>W&B{.3bUs@uB$PztKXAx] gl-rbLbxj4}`9TD MY(-"b>ZC#[̃85q5~<uQ}*՞8'rǟfvkϫɚ0.6'@&bc'b&j&[[Jmg-g.?yq׻OpTLzȠsuMm!mb)gT]6+o ]ٶgGik\M틦"o dnmIg9J`HOzVvIl^u:ηjOҤ1og+|ѧkrn{WYa?dzW/{Dc)/J|⛭r,b1XӺ_i 5LjA7EM>!_mRᦰʫй"Ul3(o8NxfF7 ;zŕDz"0@a~=\>H>fq-su Mv:aȣh]5pa ^[򖎏m]˧4T؋FT1L .F+{W{Qr--:J9NPHI^vX1k3[,E:CȃoA-YOWҍ>@2nBSWwP#r_Mt,o~+jw3cS}K(^:4fb1A Gl. F\e$,=RtQ(cy|ϖ^yyݺ)Qκ=) u'v/gCB% -yXe ڬj'M(6-PXi`$jn0]'ѷReSr;Ȍ*_J8g}@yyHسf;Ԉ$fMAjdAfv5͍"}|jߒggy\Z->KDJ"XBu/xov8RfVU" z٘7b#ɯY3EIӗmBeK+y Z@W6wGe0(!aW2a 6uI+1J7?>+#c(n9 N@K:%K.SrɵiXM`zOvM*PaJfFT -]h/œ c:DиmEuߞwP]"Dx - Z7ˢ6yQLR>r]U3)+'ud~i"rhBnк Yϲވ5(Q0?迺g{Kѓ=hruDm ӋG>X{re:a:wb]6/U<ىv\|䠕;<uSӑr+s'8<_BeduE8-&7/1ЙKJRh6fvݰ,ϝ"FpQ~R+Umm|Hߛ+],@PrnCiz_͈w!6@=:_$ځ%i*{wcէRZ*m\$pIөv$ѕP5E8vˣh'aB\hB4ƨ Z8xR|]MUdST˺Qju< ̜*mJVUi[1$6%hTX%8 ;+U5NV9v~ޯsHx?-rj ;X7EY]vͻ1vx D]z,8GNTFل?m3)Jnteya}1ogTűзIz'L6&l fj}[V/ ) ,n)W/̄ed)ך9>ȵuu,s`ːs@l9Rt!&!hr"0>>yl81 KpS%ix^ѕ,+Ғ(=x\d{8Gn@n6] = .+]B-H?s-'=hH_bl_. S~e GQi-:UٻpaiBAGYtE U ;k^E'XWw ęIL!BCF-2$K%3!bhY} xF aL_՗6"\~iU֝!!A :y}e̍V7{w;ІmZ)vtʴ3֖4پӻ~zIA?2-5KX,4?˹AÙ¶MYoqcr ӵ=EEeE8-" l/'mqcymiݲUC>#0*8f|gYݏxM5yS(ʋW`(Q3%A+{M"v!< vvhSGNR+ }ugDA4']$H)GjY:5|Z|_eXUYfw5PP{fD9Ȏ=@v$eȎy㩿X$)m sk2u?7r_{vnQh/~(x}dE>*0oSfLg|=ɑ$lMߜE$̛s<_ss7r1TESǴ:h8ؾ*Rvuׁ8mr$9* x;0H9aIcPZS3<:9.nPϏ3E!*G7B9Cѵ' hVuz,sZ{zv.+{ƜK^h~`L:lݴCp1 ]QES-Ⱦn Xk[fyB=~DZ f-ھc,L n#'|gD&ΓUWAff$ k/Ӳ_fY#Rn?N1k3m, 5R}gv '-6ޑV*Ջ7!6XDh]sdu 3@olSe;^'NJD ٍs[ BWwA9I6ǎtŽ\ʶ +|293$;{- HSX$,:'ZKG5X=Ɩtӝ*AŊ/#0`.{(Vy$SKDedoID8ufF5+Y's}jg+7g*]u\Mn qQ#~DQM$/k -FN7 (fG{!,&UΪe%ɦ-~耴qjhYv&kO%yZIWҩ:72'K]x!v]nP]NHSBI`D^5n} + {|3/]k]s sNÔ8:TՠֻgC#,潑Z}y>)QtJIYV e ~dš07fQJUq'-J$ΊAgVUDbia+_GәUYHҦ~v"55aV G^$r A^c`{}eZH99k( 1ޭ?ﶦQq kRnZz2֚’wSzA58_"٦n5/m'5vB@ec˯(akh eDŽD"2wyO땪wuCkoV/3獂:M41oɉZ|2 ռu>X'I$)Ck{!Y|Ȥ8xe6nt$wNAtIks ;Ceu\@C>K+ { $2X>sܝ}U=)/t~`dlXbW$5[±Ur"]gvȠuzha=m4>SB A9j> СV8hF;j6赡*}հ~G]S=À;lx Ke_nX]uf;3d rT6!'ˬ[=3I*^ idF`آM&Ma;SKfa3ue6#iڃXď[v:b)|랁\El4nEԜ޵W>]وQo\\cSP:꒷KZRlO6(ْmvum2@|Y?p%I뫆x;o\{*V MH"bO ^-C_B%r8mC.FVD<Z o> stream xڍT H Cwwww#=C "-!)tH#ݍt7x<[}׬̵~4-@2Wfv6;Z jZva! BeR@Wf` 8g,-,Zle :sz;??/_q{3(]AЌ@;9tB֮,@{g+z&r9,KAƂJ вtt:PqA,@hv@Xo&?߁@bہ2J,L !tfP2 s1w;~;  I{{7?)3w/C,,aȪ ;PdV W7''y[NK[ ` - AP}\ O*;;l 0Y!Oѡbz`Otl?2N#fUSUdfv3' o5 lOKd]a&7tnA17df3a<Q_2qKOh:nPvn^\ej]]XH dv5k6k3;0}\:@oFi%^lICXY P:_3#xO*RO*/eUrHp:D;“@fER@')g TUH \n4#eTu[qtO8Y\qsǓϜLS77y'=qP$ѣC~|Ia -vMje^q0ShM!Na[9hZ5n2k%:a%X*AχQJJq*Ev5X"Ӑ``'4)B( zȡ ?-M@grI>OrUiUؖI&R+82B52=`[b"=qM΄g<10poYɮm:iqZ׈$Ź?y%L4O&TBD*lĈxQdEIpቌQWז%tF , \y5YM7cMrtcOnQFZ00Vg[*__*tg:辽j^]c-t L"?1o572"NS0d5sgdM;yNSX{]r`%RJQ5\#&Ta6ld IwĖ$gQqZ.Jo9{U R]%)O(^oyS¶wjT);mfMP/Kc5 )/sM`_u߿qʀ^wt=^ZY ߸O5GfJ'A~sa&eNvq[hE;&)_C!88rژ9^7NbwqftpAF5(!9 foL^x'E6w [&wY2~EvCAy($JJv*7 _, imjUN-D4:]}Z'%zW0YZ?_Yun#Pklr}8ֿ)c1)a卋XF]')ޢ xMU󺢸+lװGUk-gu|S=\^EÚ25Cϝ1@ThjE~jtaՕ6*:(o)H.blj)_,6,1%7*|k!lV9bJ3ĕ^)>"VT 櫜.Gq7wGw 5o4z <& Tҟaf17C9G0#`{ncQѯꨯSN.٫|G< X2y*H6Qc!~١m]nPŢWE$l/DI5ǝѷV|UyBϵ75wݷ0.}:]nJޯfdǒnB5Dv*g]e/::[\nH?9=,[YFŗ⦹%> h|$0tf#%18ۢof hE{̕bg͝z}I}o[@OΗoa$uEEUl`{bk및 tVr_YRlu1%kn}ugl*cLKj7Ӝ.*$.+|`Gh9Gp|pMM3yqMb@T>sNzTUKn t"-y3vlT/WgC_o'^ε/;VnsxZizNw>٤2?*$ݣaQzXP h[*ѸM1`{-n>t6i+Uns\k,S׍4I PF GCpa` <&Esb9;2%4y_\J(wi~n:q91UNvO|^h |VKqB ͿoqG(BBހ 7z34< #AVTxO|;-%HO^o$B8b=UAZ ް6\ܭfȶn)WoIŕJH;iPupЋk x_U[;WllRre0'hRBǛ>(YgI)D J.ZSb`²A^if漵Wt((yߖCsHM9{pC&(3뇉#F/zHyƥlhǖ#ԩ(Csz#wt{KבY"ַJ]t&u NJe`-tޢ?mAWaDj/W娰BjB~d`22cyjQrPJ8)+wG{TԔ=i #(t2>pqA|ˌ$\X̋/mq S82\и~|F f- qbsyݥ̢S|ס#y4Hhql.^nfFWQELKϵQ:6_idyNga>U9jnyeqTlPK/Ǭʴ3l&[ӷS"+Y/LZչg&ۖ$a(̋o vcR)dx]=Z뽙x0q)aܟ fN GB[,~㥯>y%l#оKk9)2#u~FhNC>5r)?ȱ#w>Q;Zy/`} :β2)L>[xEQh|C Z6[/"6[ 7qvq 2^M:kyYi%}rz,!tj78,FxxGn/ifOڒkɐ;sP*:QojVDҗ]MoF gŊpw65|XӃ9?:'OordI"Hj(u{6ܞCfK4߆T_.:ީSˈpF;8s=6N{=B8ԿPKp:6<mKX ak[ {-V7 r„띑9߶E`Z;o o28'M^mzKߠ:&/4ĎTW ؈>L@SM%A UN W=&FM#ytɶ Wrϭ J +_tA//o%DM 2/3J^wm\jؚ5,.(qYSSlf\3ؔ7/qּJӚG5Ҳ{[ìr8g u6zIzߌc48J0:7Yl2n"wX&U^-4H+Z%?v@D1N텏d*Yqf73t;K~t@G@f bsj9/>N4Mb^:+o`,%f )q'wa,'<&8o8! `^ T s'$݅-0*pQйř"hDp:t-ʰQ*95JECȅ0gst{?]2v|K7a.Q",˾7yBi$!a{yccYost*EE*a"Zg1'|cxtfYA9A|8<|Ee ԤNGIQ†+{ Gr| 5wA5bիxH2v^I%S5ֻ9u_#C,)&;!U2o[lzr lЕcҩ6ROO|!j7-r!=TybX*ybZzـXXnvJ=%u+hܭqj3`2J\b~@iѮ[$F9}}¾\nzYԾ6zW~X}3ϛү9l0T.Q?ަ|D5BvP|E)gk Z|**sL.Ha1qt, Ty+FǛ` 6xyIocUZ+0:k c3쩖$l2Žѿֈ4z5P|qv |:Es'GB}S]l)\JrpoK M?v}AcKI/#C1B}V j`nvz3J=+KP"L|^X9 uBSc/ҾAy.dЮ>z!uP[1@+~t33"~Is> n?Gxp A)[T:m1&{XIm,]ޝ5KP*DjxYz>nWryU{LaDl"1]HƎQix-%UB}UxBB}uX^&v'芘4 ܆0_MQ$~}cfBc>զTR[`T#;2r[iB+I!1;ɻA7B,O}7JX%SחʁܵĊf0>pXH`-_AwD#Z-i}-_?0l#3ʿ^I?+wp*Lp2Imlf֐DtSD:XG.+= AAgy!gN4R"&x)m46O#X"GmbMoEĉ.NfQ g1W6Յ5Cu^[tM8޴TtD_{dQTv槩$ H)iGNG[\ٲQt wmFkB^Řu%xt|"apzrJ[tîZKIlWƷcl[%fw(t+,92IIY ԋ4{ , giG^ ehZ76'iI|Bkо%5˶T<쐼aUѾ'?jǯՙoc}pE6] py#/ v6aM"TY} PicsP`+gKHVn'vu=1N9C -pOx iSrzf 6<4 ?,"e7SB}"0țL!]7k`J3* 'HlwT s8 &oDlG}4<ŐP\}xw']4s*w:WZJ#*QG[Zp1kQ1u_8Q MVACs\)ʚ0t9-=))#iWJ%5@v"dcNP83&&e \Eλ nC\X>D5vzEk瑬j& iU +#ꕬ] [NI%pHW3&{%r\kF7~Fߛ$ *B Bz%,ilAP r4 V̂S?ΆZ i?x_b4\tA&"(|6cWM*B-8T%n7tOP2KčβQX#-R?02ۡ)Uxq]\!>B * *Y||Fijo_+QLF) +j$,ZeX%vp%y2>"֮0|ĐߣOJ2[~:nJguFcڳN OAZnb4#v%Za_- +Uf*8]^٨,٣0kԼ8}6Ws?vklhB-ѩyņo؏xB}ڷf݂`2dYpOCڗ `cm^}Ys+\:iWcuM,t0ōX\?.YrĚ#˸}_Y=h1xm :5@Cr|=F4UD@JC13dfwʴ!?D 3Ɏxnoqt9N-9if ʃzUe^MRa Ix+4r)|Neӽ}19]g=\ۍV$՟1U]Y+ ?- ʚ]#VVm[}|x#|mu{|UcEA.7ZGeClSޕ6ycǏ]^1u9k"9eɢw^Td5_B5qK[ińNI$D6A;P oGJYqephgS{=/2JϧK@ZR>ƒ]֧FăF.[4 'Pv[OuvWf.*"fMcDG_Z@Bx9rLr[$(H=g2!hqvm(~o~!R`߬εwwx%Q#[YAf$癡2 W zee)gyW:|(pf/UC~ILEjKcM{ƋKLz/AU3Ȯ@1rs⋶*`c2-M[,æDӟ^\y' MA~ӀNghBU,:2f ^z|q)U]KM]GG0߮2 s-EFgB8_ gJ.GOշC󑿽3\/EbGnꜺ"mFH/ra tgڛ]WTOةU'H3%ZhYt;@?5ߵkNbY&=B86NsY>糒 n~CΧ7LqK. 7Ngz⺌ mM ; =n $2Nd'}b })].,vW5{t/C|] W ܐ2-oIx?ZI av4ޢP}V`\bTY# 3+A2Ɏ~N`(}R-f"wGa) զƾD:n_!qGD _yMp þ\{3VD;? g3)kμYFzj!V#Y*HT` L=3xH>jVV%bJ[mxzpchDGe761NAYtzN:ŧՆ9}@9 a 42Qڟɧ#rZN'^ éUHfW[ T7{L_.b*k/>HݔcMxJM=>6ް5.ʮ/J.4d6)jbϫD !62~+.X>A֬]^QwCAٔPGJ3Zblt;RҪK=* 8^j^r{啰mHµi擽JzV:I|&:*oxM"\`\~\6z=.DqFUhUwY=s &S (̰O1THjtU~}_zjվ9ly|,WG~Vwc IwN`I*Z`g2sg.K6 GoW&|j6"/Vmwuucq*Z">,Eg Sܟl+hj&K] #o*SdE%yTlB4C,j#_4AEi Xbrx{QVG> Zwyϥ+?r0tGRZ.twIz[! nuP - AESn G2 U3+X )+(ũ84UqI'zQ(?Qdk8H`rrG1T#myV@#65vSZ1'O!UִX a$qgggv]nlJ/g 6h43ݮHX&3}E|vnzY.^j-<BưImmh=cBm i]W;*~?eY0 '.p_ t9p/k; &> stream xڍuTl6 J ҂HJʲ,..- %H"!%!)) H)! H>=kf{5 D`EE@2e-i$.qs1?f2n# G"d PF Mi!;Qq '@-$&VF:{v1 D_E(:Pp(Ђ``NG> a<,@"H0S0@L``G#m0 58¡0pEXP}uM3 ;XwOo"E@H'gaUMFAX 8X> wXa~U*@CCQpg Z w)3 ˷H''&Y b };#m~vu".0u?!XمA 8sDi']h ز1ȿ6tb2N/7_uEaEc~=E5oAɦ&P*+Cb{Q$Ɵn RqUd[ewwGҁ)V2OUoL%>v[9A15*ROoS/Y͟ZgY{תqAV7'pZ:9, ^T FiYhz늊0=J˷bCA|7tbS],Oq!b%v|6@=۹]Y2,wV gMG.Z7hΚfS_X-c^sCm Btv9ԥb9-?h> ܡ#sFy\$@8 E=:7س=/,#O[%iu' GX_}i' zLH=tE Ty 2Dg=oֱp:'fy ([ R  mڔx%7P-XuՒm6o(瓼4+/[S=4arVt."*Q\+C TCgs^ysW+[z_ub̟g'FM wkEܥuI SKVw=/#ǷZ 4&˟3IliN>9f|K36 b( r:de݉;{\ų4lT|W6_8{І brÆLdžDJ#Jkj%v'6hf[&SGmj/1}/XFƚ1 @ղ[-XtK(/O__fJG/TM tt(MQ3Nj|JoAɬ)xzL~M*5Au_'aC["@X655,!5O Cɮ+LP,d*qC]8֊L wh&X6L|b9v7Y?eQ5% ]~9~6u:Gf?ʙBB?OEmPӳ j޴ݒsYck2yMٙ;ǀ[qԥq{Ge u k@<NY8ӝpd5`,x}>`OhJiņ^.R7Ǘ}5>8b{)VOӲ8|vId' dD+s))ew++[;Z5ܞMSޤ 1%! }73h9Zz8htCo!A^$] JBDtٳB#T@문C&;j-oEwP5Fcob~vᮦEIʗ]lʏǬ(M)xe窆^f}&JY-wGP13j|(7ҨT!g%cMO>9_fi]raP<ڰjX:5\7uZLY~G<Ȯك \S6aY4r:CMd0ZŝǭZy10Ct)1h"CzNFÛd|Tx4Fc*58r4NLmі'\4Y/V0+:g#uDs8⬟ک8D[ 1h]T8E"ОmeKI*ĻS>?L.HO q{>=]z5ɭ4kvD]GQUu'#VA'<րWX+mA3Xzh}}[ӃXL&ےdv<>|6<`*Ql~kNJDƒSMNdFCqߦ021[dVwv;e)9aW !k.$ -T4|)me x%ʝhRÿxTq!p  >'| 9攞ynXYjqM 3JIrRws[P=sz8\ ~*1IcS,܌g`J*#N0,}?r^CbĞ8YbͶܰ{~̼ٺ痛gd$|9>ՃCgqhZ@$ )¯;f8z\,bw7oɂnr|)}7wugm4ES1:b\V@C5@xfcOQ=! ~+HMOBx5-򣐲nh)Ol'c$N/GK8SA,]6CP36e=%{ 0u9,Jͩ_|8;;]½Y̳8Vo$Ov1<]C2#xSɷˏXd+udž/8P F{ɤ.o$*n(pKdzQ3W"vhfk[пP"h>P4泸U~h a~x]i)kv0Wq0)÷t~09t}x3Ѯ\WscTVicuT;=(,K{+qpq=wBUƧ"l$tg[ty~SHI9|oߺ!dT>t*!َ{C: }Ap)^8`o+@0jZ뢉(J\@jv4fig٢3Ğ}$p$V8%<]jhwѷ4HּTwA:_2m|)7F#MCfEۅ[*@l{1Km/=島7ܫdʔCz}07Rͦu9 c K UP7qSr/QPKG`pSQj?dmƸ_`­IJa"6agE:j2Apiw%gqKxkwOeD࢟=?FDOcq|S J9 (*I}ybΛfFBJU$zOO1\5XrB:(3SY#tc_*Djin+gpcۺ>o}ƕGsADxfra:ZJ"s2 $X@%kյ7yz'}PO:[[X g#G\/G,ůpv߶6.E_bO>#[w>rLs* =&lͺ/%TE~HR%؝;ӸENU-^Bn(G*wcdC&$F^nO ed-C8UeAaZ6΂N$9a%Ƚ &1̗@O1hܪ@PXku fDZzjs%\a`+JjE1T;zþ7;ɠ>ʵ}>M>y<4-2r[F( ]ͺh݄@p-% w˽-/+, W0=N]&ln{C[D[ٞȄ sٴW3RG(/" 3ih9ޛU2dooBY2#oGUD `\g)V L{nvF $B^=LkLq4%S- MU' W'',-/c~N<9+TTb^z|I!^]Aaj\wvMl-<}{D/xaTDžFWdsJv;mPk+<?R;"%.Tt͖3$vg6͡͝"sR.팃tn 3E0Eؗ$Q]xtϠ>' O&)kbk{۸⊄=&S/I۶C$ޕh$c.ZN.ιùywJ0?!­1]fՌSQKO[ѱe>d_o-|NĬlWeD!z?밙F# #ȣiл`qy^RI3%kTv :DG2fjE&xz4íG.d έlK:98UjSھC%1a ޖLϺDmVuE4s1x_gi78f? ~|RnSh(J>ݼ5V@'a#8.&T*E _ qW|gQ;Y'$$D ,!#UaQ >F g2P”_sj;@_/trgSa s٭O60N}o9^"\!}B%Q*堐$n?@Aɱڝ1>QKJ7<ۓS<՜E&[xN?| ,PPv!|ݼXRs"cEP^ʮ9vCXOWBD6 lΌ\SS6PL\Q[L4z#|sxBS!|x? endstream endobj 1161 0 obj << /Length1 1306 /Length2 1362 /Length3 0 /Length 2203 /Filter /FlateDecode >> stream xڍSTVy*FqwEQA EH%(y:T2$2̤L1& \dzCEQ@ (bW"bC oXs;9g~oLNT'O*AR$ /v2X@0;p¶@ >J116߉Jt* ;P "ddIr$J;G`ŷ4Gt*B?` "@zH+ǥNJ"CGXVX%HF&YQ 81!0 b D@o?D `-li_  D jBD %l?2聐X|(BP$Olץ"*O#R\AV b}}H`W-F0軚28hS/7! 2J)%EdJ{ 0٢`0 :e(xj)D Z!QE0G(r%|z#h@q G!([t H,N(Lb7x)\אe>KtsbƎvtB {p$ڡq82w\oT}r̠ ʅ7QT>r7O[)$X=PaD)CQCl$p/I&?1~ML吚D%@'$ce(d *q-br~$7+rb;'G޿0 I;9yuQG]TvFi]˟zLi^WzkMxI+^aB^pt'ݱ#Ol^Kܷ"$ Lޔq/ݴl+kv;œ5aћіFmJ=eƸn7oXT*s: WGvI}[]vr0nZ<ғau:9*RQ󵬸9')I},4qanF[׏nX:kՅُ;p3"+xcw,}םVkϡ=Q="3 9d6ˣ֔[tpo_4W&8 kR0V]3 UE{7Tuh:yQw&ӼВ]{%78{-0ocUA]rdhq9}I)ܬ.pK:9RfXB ѝ{퟼ Սo͙OJ4h'gNnpس= ]`afbe}ژ{S2Y. o,[Lfd8:ySWGTHaڰ7,^wEd]}< 5J̺̓ˌo2yNjnHᵽi'p}rL܋_4PG7ժԷ_+[9{7\#g}s}Nf?5ÔoS<}vpUk_m6Fg>- g>>ʺrD-uZVlt|<,x|FkMmOI+tow{}WMXiOwUӗde?47eY7Zu*zR4*lAκdͽORzdSs=fLfj]6/cGwL]+W{`GlYS'l i@yŞ#z0ӡud龹q܍[ׇo^/:3[.q9Yi7Ԑw\$|.1I^ 6~uLJZ{0|JM1WdS%*T_|M r jMa s&{'}>oهAڮ0ΓEFnAWy3 ٛqR ši025N~|}H?xrOznum QiwVX[,yl?ӯُ5H8*W0fgo̕b[l(JZ(aEܫnJ  _~/%L3~Qsygz e΃_X%&uȒlG^oU>6 Ob ϊ}{1ct,U3eUKme/Ls7Z endstream endobj 1107 0 obj << /Type /ObjStm /N 100 /First 1002 /Length 4530 /Filter /FlateDecode >> stream x[Ys8~nmE3Ǔdc3vd#3n"H%ev2AFBp[B mu(D@&0}R; ca wP^#BB%<7N0Xl>>IK\%Z@pD#:< 㱏s#Qhx ~#RAeMYz׍ ttZasär6('Bf.QhyZ^;hs^N{ugpI  8A ~ck^8iɗ- 4Y%y-OV-VEUSOV5 98҂xIgBG j !j;qSlcn.=6q  MKup0>-.[h8y(~`'j ɳ{u]^Vŗb20X^-b&Ë=v8=]1G/brπg~*cسoռxe_p:.&t_vFL 1ц!k s+`8%忇ɵd$]@ڜRQa1>cR#P,|ޖMN {RDڡLڍ8e)Bey]NjZyM6^$w74GFaU,}D14PD 3IU:Z3{MOZ@zc,aҷgL{g,h\jC+S57B>9FF!vّX@4Vq]Ck:ThzQ[D(S^jq>,g ӗgࣀIy(t,>1 E:9Ht{$Hʛ n=lW =jYNIU@nY]#=1 :&r=c9{^WgvN;v~eJV^TE9`_9;MfS(Kv*F X5(W67u%bW?n)ل])7즄sR}[ڜLn6g wd˫yU_3vdw5=| (@E7O? @RNXH@<3|pyU.9x޿M 7)^@Z,oo ǍW3%PZLЫJ6JlgG?'ZE 4`8@a]6O4! ƒ & NEZM89 A۽rog넂t}4EzVGP`q ?wGgLM|Pb`с`u~\@|/~5/rGXp?n CdCfp_mOoT6KMNBwsqԭYW޴n_U[wG^WRq?g{{*rW(Wjn8UzE׃}cv naL(ʫYB*W=/|+uzC֘Qpqtբɫ7gPEXzMrqt)5EhEnځaOû3P<s A 3|l3(SV糿ΖW+ܾs*֧x=BP,7lZ]RGIU &z<) /_8$A0[ ]x ܆]9`vZas;3l{lxc7WQ[ls^67&gX}kt>c<b{` 4`" v`332ޮ %s,]M{%o &$oٹIy5m]7m{xv;9gjl=p4z=3 po1-M$o;:j#r5 Ƿ `ِEyMʌW kgV)qx(^Ô~vx©mg ƒyZ ha[+X\T?o߬'/ZI|a{@g=>蜂nrAm/@' `Z߈MA.w>Iy o9_TαZٷ_oϾscs?j@}i>y_5.=[==ӹi>;M `6iwv=r{/s;8^wc|a+Ow}Jй;d'BtR.7O<\'@[o~_'eiv1ӢňŢ_-tuA{jצBt 1&FݘqCa; k\!O9ap M`%\.tnIVM>/"~&ɫ|ܿ^kjĴ$qa>x& |7aEH^OlpM3xA.O4Y2]&7ۑ ~gkHs emSp wo$ S[y oI [$MCI}72y'}ZqpqKoTbrE̅D˭|3ڬxuu3ZlT$jb&mV؋'˳޶Ү6[q됷 &F4ț5XQ~ V-X˶IQMc 6ЊlbNA@&WPZO+^+nVaX-kAWKbA}LRSW5+itzA3 Q՘AZʯK6fj#Q:("l%ZA A[lD[\D؈=oa/a/i:yv:mrvTe"j&" agk6MZS%b!d>_s 0 endstream endobj 1168 0 obj << /Type /ObjStm /N 100 /First 926 /Length 3219 /Filter /FlateDecode >> stream xڥZn6}W1^ /@ Hb/O<ȶVmt'OJX`_f"YuTRKЈFxGЪFX@F Hhޙwkl4iFxCiy#t#kb?6ʥ4JyG@Jk$ Z#iqFB58A.&:`5drFDH%oJؐ?JICJQFQUY?ʑQ?*("RNh -&N9Zf&\65ʀnVAH6:}#.ICamK<*-I'LZk,.ɂllІl_C*L>F(Bep4kK#"0MqQɈx()$E[^ޅ.6>Fhi:-l`z hd@۔3‘ %%C2 .ES)#tH%(EJ`MJbL!-)eLU 07aORga rhdšDTM￿yztNuHxMGg}JG9Ls=κԮ.QJbKN|e*(}']fOa>(Kp]yռr3fH|m7Ԯ.v̶ {,cض3RLWm;mw65̽~]cl6휝ϗ oe뻟N[49E͂bjAsP,(=E=]Eׂ栨Xt-DjѰ[Վٖ ^"p98K)H5w)v6 Y ܞ***1A=UEQ"öȒ_T?N,yďqwYjlnˌzRCa'KPE b@4c)?FM;j^kws]]ӕ+>7EejX7{J͝vhNfk]vnՔżfӹ:PfJ2%pD1 nZvMAY4Zփj lwqԹ.:*Si M͔)#Ts#]QvMt2s ac4_ưe|Z+W+ܴv[?V:Tv)C92${}]}_r!hӇz<]-:5H|!0FqKM I,%$Cx0uazZ0Icyĕ /%PHЛB!K`ͼ`s 8]R ([j%W*"s;Y)Z]{oL0?BeZɣ\cOZAS6Sȧf6zEQwRtcԝǎ@2å;^][Lt-iZc{Ylҕ|ɚLxKH;2~= ."PffRwҟpĒC{l?u|[+Љ†ɞT/8!˪+3喺+G02$C9#WR XRz8P6Xzr:TpU)~yz;/U/T|qBeWz2&ʒsPJr_ttȅrMBx&MіU+%I W !R9&0p!aP܄X$/ppbU,BBin˕kw?)2Ul$K9#6_I!Yki*1V{ɘHV؊<Õܥ7"-K)5dhUEj+-b!eecb ;MtmU" DRBڴSR̡T-$fu'SI15gARķܳꍯ@)Sѡi^2"4qu4n쬺XelwKԭi[o*gt*áڇ/N؜Fg6UsCX5c}y5բ/Գq>d9ewd4~k5}G_p: [Z _,T̢XMRiwPΎ+ $K~6HRlc)A@?GNUBcI*t> endobj 1223 0 obj << /Type /XRef /Index [0 1224] /Size 1224 /W [1 3 1] /Root 1221 0 R /Info 1222 0 R /ID [<19D432E10B059BB6653E75C42F6EC21B> <19D432E10B059BB6653E75C42F6EC21B>] /Length 2954 /Filter /FlateDecode >> stream x%[lG;;qƗN|ع8%;vr$N8q[ D BXi *A} Z*q)E]$}+ԪK"Zo?<=3 Lç 5> r QYCA맚h@%i^U`(1A5$Z=MZj΢Z.4]C;D4]G릺G Ѻ6RmmhhTvB'avz@4ݦ?6FU/~MײַG[z6~hj#)hZI0Vn#hh TOh{ţ` MROuLuix΀InZS,Z/v̠C9p lQ.USdK2 ]T;hU0VBz \G&+/2I"XBˢi&n[6Z րViu4*ZhQͅ[T{h_I>Dcr/OO=4~gyИUW19CCA שһ~U432mm**}qEB[|f"& ?}CM&z43~h72{| 2nі2k};=d=wDA43!4 uLv^Lv߃BSe^4>LvϒE37?V%} GٟSO&LS09 `J/t2`+@//ҧ95uY4YFL#7f)3 v5˲@;Xh*VU@{ni~T ={vF}f kقWB- ʈ SllYzZZ`l -hK4Ȭ4!Kia `'8fAׯap aXF`܂tV ΁. Fu]8N~cս`` wTZk` ``H1HAR b! )fHA*ܲ`3<Ǭ5J`0Yy X*A.ńi3ŧ)Ĵ΂7Պ;S|bT!N/u?o?NIqfMT1MO~E5,e'~S5ŵ*t9zߧcx2=jO^/C`ЂgvGwp LjQ=u{c`UsI0΂3 v8B(M(}Qݦ1g?۩@Q~Zsa]*U;l6P <֫A42[zOsf6^Ty~w,P@zjU̪TjʫuSZ̾ՠ4Ę[(dV%B X,}sg'K].IǛCҖ jy|Y%~f/Z?O1h 4:?wU$'i2q54Rt{VwVĄLzJ #n:'9=<$ %=p]sy ) KINZDx7Qw[d2daCMr2y5`$ڒ_Yfrg<=o$ @83tNf6eFZfi+K%%pY{VlXɗأve6UD\ՐZ٭e|1UƊlwE"]1>]Wv[AE@q{#쳵OQj 7Y#U@I@Ӫ]A>xCwteHwE=}N+RqY7HS]t([oU7(8˾; i4VAѲųXdK`βKƊun e]w傂Z,wdxUuZeJ V^u}] }л ;c:'3@M1_z-f(b._FL7s~j?#b:"#b:"^Z:"5`Ƅ1`L8ƄA:6fĜugڑXpݎ#t$\%GtqaG88:4}ՑqL\+hlю|#}Y{zrSR q&qlꎳGa15`=u1 >8%a@qvzlunpq'GvMVV۱ " 88ڎl K#[8G͑VrgqG Hinei@A)ԯn 9G"ϑs쿎|J|Vx)实S GXOՀ-BlbpP ZE4Q["ԊYou{-2a^Pi,yY~nROfsoU4|RUG6*'Q*ay:PyOVXR ^W |N%ʼnJ(`x oHIO,aKEX*R1*1L4T"eVY g,aKEX*RR* $/BT"wURI,aHh,aKETEx(CT2X_<)g-+󥲇0?o endstream endobj startxref 515310 %%EOF phyml-3.3.20220408/doc/phyml-manual.tex000077500000000000000000005440321422404706600173230ustar00rootroot00000000000000\documentclass[a4paper,12pt]{article} \usepackage{fancyvrb} \usepackage{amsfonts} \usepackage{graphicx} \usepackage{tabularx} % \usepackage{color} \usepackage{xcolor} \usepackage{psfrag} \usepackage[hyphens]{url} % \usepackage{vmargin} \usepackage{cite} \usepackage{caption2} \usepackage{hyperref} \usepackage{makeidx} \usepackage[fleqn]{amsmath} \renewcommand{\captionlabeldelim}{.} \def\thesection{\arabic{section}} \renewcommand{\thefigure}{\arabic{figure}} \renewcommand{\thetable}{\arabic{table}} \newcommand{\hl}{\noalign{\vskip3pt}\hline\noalign{\vskip3pt}} \newcommand{\hrf}{\hrulefill} \newcommand{\tc}[1]{\textcolor{black}{#1}} \newcommand{\dc}[1]{\textcolor{green}{#1}} % \usepackage[none]{hyphenat} \newcommand{\rep}[3][1] { \psfrag{#2}[c][c][#1]{#3} } \newcommand{\x}[1]{\texttt{#1}} \newcommand{\sfv}{$\Lambda$V} \DeclareMathOperator*{\Ex}{\mathbb{E}} \newcommand{\Var}{\mathrm{Var}} % \setpapersize{A4} % \hypersetup{colorlinks=true,linkcolor=blue,urlcolor=red,linkbordercolor=000} \hypersetup{colorlinks=true,linkcolor=blue,urlcolor=orange} \renewcommand{\baselinestretch}{1.} \makeindex \begin{document} \sloppy \begin{center} \thispagestyle{empty} \vfill\vfill % \rule{\linewidth}{0.02cm}\\ {\Huge \textbf{ P~h~y~M~L~~--~~M~a~n~u~a~l}} \vspace{-0.4cm}\\ % \rule{\linewidth}{0.02cm}\\ \vfill {\huge Version 3.0 \\ \today \vfill \normalsize \href{https://github.com/stephaneguindon/phyml}{https://github.com/stephaneguindon/phyml}\\ \vspace{0.4cm} \href{http://www.atgc-montpellier.fr/phyml}{http://www.atgc-montpellier.fr/phyml}} \end{center} \clearpage \tableofcontents \clearpage {\par \small \noindent \copyright Copyright 1999 - 2008 by PhyML Development Team.\\ \noindent The software PhyML is provided ``as is'' without warranty of any kind. In no event shall the authors or his employer be held responsible for any damage resulting from the use of this software, including but not limited to the frustration that you may experience in using the package. All parts of the source and documentation except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. } { \noindent \setlength{\baselineskip}{0.5\baselineskip} \section{Availability} \begin{itemize} \item Binaries: \href{http://www.atgc-montpellier.fr/phyml}{http://www.atgc-montpellier.fr/phyml} \item Sources: \href{http://stephaneguindon.github.io/phyml-downloads/}{http://stephaneguindon.github.io/phyml-downloads/} \item Discussion forum: \href{http://groups.google.com/group/phyml-forum}{http://groups.google.com/group/phyml-forum} \end{itemize} } { \noindent \setlength{\baselineskip}{0.7\baselineskip} \section{Authors} \begin{itemize} \item { St\'ephane Guindon} and { Olivier Gascuel} conceived the original PhyML algorithm. \item { St\'ephane Guindon} conceived the PhyTime method. \item { St\'ephane Guindon, David Welch and Louis Ranjard} conceived the PhyloGeo method. \item { St\'ephane Guindon, Wim Hordjik} and { Olivier Gascuel} conceived the SPR-based tree search algorithm. \item { Maria Anisimova} and { Olivier Gascuel} conceived the aLRT method for branch support. \item { St\'ephane Guindon, Franck Lethiec}, Jean-Francois Dufayard and Vincent Lefort implemented PhyML. \item St\'ephane Guindon implemented PhyloGeo, PhyREX and PhyTime. \item { Jean-Francois Dufayard} created the benchmark and implemented the tools that are used to check PhyML accuracy and performances. \item { Vincent Lefort, St\'ephane Guindon, Patrice Duroux} and { Olivier Gascuel} conceived and implemented PhyML web server. \item { Imran Fanaswala} interfaced PhyML with BEAGLE. \item St\'ephane Guindon wrote this document. \end{itemize} } \clearpage % \section{ML in phylogenetics: the basics.} \section{Overview} PhyML \cite{guindon03} is a software package which primary task that is to estimate maximum likelihood phylogenies from alignments of nucleotide or amino-acid sequences. It provides a wide range of options that were designed to facilitate standard phylogenetic analyses. The main strength of PhyML lies in the large number of substitution models coupled to various options to search the space of phylogenetic tree topologies, going from very fast and efficient methods to slower but generally more accurate approaches. It also implements two methods to evaluate branch supports in a sound statistical framework (the non-parametric bootstrap and the approximate likelihood ratio test). PhyML was designed to process moderate to large data sets. In theory, alignments with up to 4,000 sequences 2,000,000 character-long can analyzed. In practice however, the amount of memory required to process a data set is proportional of the product of the number of sequences by their length. Hence, a large number of sequences can only be processed provided that they are short. Also, PhyML can handle long sequences provided that they are not numerous. With most standard personal computers, the ``comfort zone'' for PhyML generally lies around 100-500 sequences less than 10,000 character long. For larger data sets, we recommend using other softwares such as RAxML \cite{raxml}\index{RAxML} or GARLI \cite{garli}\index{GARLI} or Treefinder (\href{http://www.treefinder.de}{http://www.treefinder.de}). \section{Bug report}\index{bug} While PhyML is, of course, bug-free (!) (please read the disclaimer carefuly...), if you ever come across an issue, please feel free to report it using the discuss group web site at the following address: \url{https://groups.google.com/forum/?fromgroups#!forum/phyml-forum}. Alternatively, you can send an email to \url{s.guindon@auckland.ac.nz}. Do not forget to mention the version of PhyML and program options you are using. \section{Installing PhyML} \subsection{Sources and compilation}\index{compilation} The sources of the program are available free of charge from \url{http://stephaneguindon.github.io/phyml-downloads/}. The compilation on UNIX-like systems is fairly standard. It is described in the `\x{INSTALL}' file that comes with the sources. In a command-line window, go to the directory that contains the sources and type: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure; make clean; make V=0; \end{verbatim} } By default, PhyML will be compiled with optimization flags turned on. It is possible to generate a version of PhyML that can run through a debugging tool (such as \x{ddd}\label{ddd}) or a profiling tool (such as \x{gprof}\label{gprof}) using the following instructions: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-debug; make clean; make V=0; \end{verbatim} } % {\em Note} -- when PhyML is going to be used mostly of exclusively in batch mode, it is preferable % to turn on the batch mode option in the Makefile. In order to do so, the file \x{Makefile.am} needs % to be modified: add \x{-DBATCH} to the line with \x{DEFS=-DUNIX -D\$(PROG) -DDEBUG}. \subsection{Installing PhyML on UNIX-like systems (including Mac OS)} Copy PhyML binary file in the directory you like. For the operating system to be able to locate the program, this directory must be specified in the global variable \x{PATH}. In order to achieve this, you will have to add \x{export PATH="/your\_path/:\${PATH}"} to the \x{.bashrc} or the \x{.bash\_profile} located in your home directory (\x{your\_path} is the path to the directory that contains PhyML binary). \subsection{Installing PhyML on Microsoft Windows}\label{sec:install-windows} Copy the files \x{phyml.exe} and \x{phyml.bat} in the same directory. To launch PhyML, click on the icon corresponding to \x{phyml.bat}. Clicking on the icon for \x{phyml.exe} works too but the dimensions of the window will not fit PhyML PHYLIP-like interface. \subsection{Installing the parallel version of PhyML}\label{sec:MPI}\index{MPI}\index{bootstrap!parallel} Bootstrap analysis can run on multiple processors. Each processor analyses one bootstraped dataset. Therefore, the computing time needed to perform $R$ bootstrap replicates is divided by the number of processors available. This feature of PhyML relies on the MPI (Message Passing Interface) library. To use it, your computer must have MPI installed on it. In case MPI is not installed, you can dowload it from \href{http://www.mcs.anl.gov/research/projects/mpich2/}{http://www.mcs.anl.gov/research/projects/mpich2/}. Once MPI is installed, it is necessary to launch the MPI daemon. This can be done by entering the following instruction: \x{mpd \&}. Note however that in most cases, the MPI daemon will already be running on your server so that you most likely do not need to worry about this. You can then just go in the \x{phyml/} directory (the directory that contains the \x{src/}, \x{examples/} and \x{doc/} folders) and enter the commands below: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-phyml-mpi; make clean; make; \end{verbatim} } A binary file named \x{phyml-mpi} has now been created in the \x{src/} directory and is ready to use with MPI. A typical MPI command-line which uses 4 CPUs is given below: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} mpirun -n 4 ./phyml-mpi -i myseq -b 100 \end{verbatim} } \noindent Please read section \ref{sec:parallel_bootstrap} of this document for more information. \subsection{Installing PhyML-BEAGLE}\label{sec:install-phyml-beagle} {\em Note: I haven't found the time nor the resources to make sure the code of PhyML stays compatible with the BEAGLE library. Please do not hesitate at all to contact me if you'd like to contribute here.} \\ \\ PhyML can use the BEAGLE\cite{ayres12} library for the likelihood computation. BEAGLE provides provides significant speed-up: the single core version of PhyML-BEAGLE can be up to 10 times faster than PhyML on a single core and up to 150 times on Graphical Processing Units. PhyML-BEAGLE will eventually have of the features of PhyML, even though at the moment the boostrap and the invariant site options are not available. Also, please note that in some cases, the final log-likelihood reported by PhyML and PhyML-BEALGE may not exactly match, though the differences observed are very minor (in the 10$^{-4}$ to 10$^{-4}$ range). In order to install PhyML-BEAGLE, you first need to download and install the BEAGLE library available from \url{https://code.google.com/p/beagle-lib/}. Then run the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-beagle; make clean; make; \end{verbatim} } A binary file named \x{phyml-beagle} will be created in the \x{src/} directory. The interface to \x{phyml-beagle} (i.e., commandline option of PHYLIP-like interface) is exactly identical to that of PhyML. \section{Program usage.}\label{sec:phyml_new} PhyML has three distinct user-interfaces. The first corresponds to a PHYLIP-like text interface that makes the choice of the options self-explanatory. The command-line interface is well-suited for people that are familiar with PhyML options or for running PhyML in batch mode. The XML interface is more sophisticated. It allows the user to analyse partitionned data using flexible mixture models of evolution. \subsection{PHYLIP-like interface} The default is to use the PHYLIP-like text interface by simply typing `\x{phyml}' in a command-line window or by clicking on the PhyML icon (see Section \ref{sec:install-windows}). After entering the name of the input sequence file, a list of sub-menus helps the users set up the analysis. There are currently four distinct sub-menus: % \begin{figure} % \resizebox{15cm}{9cm}{\includegraphics{./fig/interface.eps}} % \caption{PHYLIP-like interface to PhyML.} % \label{fig:interface} % \end{figure} \begin{enumerate} \item {\em Input Data}: specify whether the input file contains amino-acid or nucleotide sequences. What the sequence format is (see Section \ref{sec:input_output}) and how many data sets should be analysed. \item {\em Substitution Model}: selection of the Markov model of substitution. \item {\em Tree Searching}: selection of the tree topology searching algorithm. \item {\em Branch Support}: selection of the method that is used to measure branch support. \end{enumerate} \noindent `\x{+}' and `\x{-}' keys are used to move forward and backward in the sub-menu list. Once the model parameters have been defined, typing `\x{Y}' (or `\x{y}') launches the calculations. The meaning of some options may not be obvious to users that are not familiar with phylogenetics. In such situation, we strongly recommend to use the default options. As long as the format of the input sequence file is correctly specified (sub-menu {\em Input data}), the safest option for non-expert users is to use the default settings. The different options provided within each sub-menu are described in what follows. \subsubsection{Input Data sub-menu} \begin{center}\framebox{\x{[D] ............................... Data type (DNA/AA)}} \end{center} Type of data in the input file. It can be either DNA or amino-acid sequences in PHYLIP format (see Section \ref{sec:input_output}). Type \x{D} to change settings. \vspace{0.7cm} \begin{center} \framebox{\x{[I] ...... Input sequences interleaved (or sequential)}} \end{center} PHYLIP format comes in two flavours: interleaved or sequential (see Section \ref{sec:input_output}). Type \x{I} to selected among the two formats. \vspace{0.7cm} \begin{center} \framebox{\x{[M] ....................... Analyze multiple data sets}} \end{center} If the input sequence file contains more than one data sets, PhyML can analyse each of them in a single run of the program. Type \x{M} to change settings. \vspace{0.7cm} \begin{center} \framebox{\x{[R] ............................................ Run ID}} \end{center} This option allows you to append a string that identifies the current PhyML run. Say for instance that you want to analyse the same data set with two models. You can then `tag' the first PhyML run with the name of the first model while the second run is tagged with the name of the second model.\index{run ID} \subsubsection{Substitution model sub-menu}\label{sec:submenus} \begin{center} \framebox{\x{[M] ................. Model of nucleotide substitution}} \end{center} \begin{center} \framebox{\x{[M] ................ Model of amino-acids substitution}} \end{center} PhyML implements a wide range of substitution models: JC69 \cite{jukes69}, K80 \cite{kimura80}, F81 \cite{felsenstein81a}, F84 \cite{phylip2}, HKY85 \cite{hasegawa85}, TN93 \cite{tamura93} GTR \cite{lanave84,tavare86} and custom for nucleotides; LG \cite{le08}, WAG \cite{whelan01b}, Dayhoff \cite{dayhoff78}, JTT \cite{jones92}, Blosum62 \cite{henikoff92}, mtREV \cite{adachi96}, rtREV \cite{dimmic02}, cpREV \cite{adachi00}, DCMut \cite{kosiol04}, VT \cite{muller00} and mtMAM \cite{cao98} and custom for amino acids. Cycle through the list of nucleotide or amino-acids substitution models by typing \x{M}. Both nucleotide and amino-acid lists include a `custom' model. The custom option provides the most flexible way to specify the nucleotide substitution model. The model is defined by a string made of six digits. The default string is `\x{000000}', which means that the six relative rates of nucleotide changes: $A \leftrightarrow C$, $A \leftrightarrow G$, $A \leftrightarrow T$, $C \leftrightarrow G$, $C \leftrightarrow T$ and $G \leftrightarrow T$, are equal. The string `\x{010010}' indicates that the rates $A \leftrightarrow G$ and $C \leftrightarrow T$ are equal and distinct from $A \leftrightarrow C = A \leftrightarrow T = C \leftrightarrow G = G \leftrightarrow T$. This model corresponds to HKY85 (default) or K80 if the nucleotide frequencies are all set to 0.25. `\x{010020}' and `\x{012345}' correspond to TN93 and GTR models respectively. The digit string therefore defines groups of relative substitution rates. The initial rate within each group is set to 1.0, which corresponds to F81 (JC69 if the base frequencies are equal). Users also have the opportunity to define their own initial rate values. These rates are then optimised afterwards (option `\x{O}') or fixed to their initial values. The custom option can be used to implement all substitution models that are special cases of GTR. Table \ref{tab:modelcode} on page \pageref{tab:modelcode} gives the correspondence between the `standard' name of the model (see \url{http://mbe.oxfordjournals.org/content/18/6/897/F2.large.jpg}) and the custom model code. The custom model also exists for protein sequences. It is useful when one wants to use an amino-acid substitution model that is not hard-coded in PhyML. The symmetric part of the rate matrix, as well as the equilibrium amino-acid frequencies, are given in a file which name is given as input of the program. The format of this file is described in the section \ref{sec:customaa}. \vspace{0.7cm} \begin{center} \framebox{\x{[F] ................. Optimise equilibrium frequencies}} \end{center} \begin{center} \framebox{\x{[E] ......... Equilibrium frequencies (empirical/user)}} \end{center} \begin{center} \framebox{\x{[F] . Amino acid frequencies (empirical/model defined)}} \end{center} For nucleotide sequences, optimising equilibrium frequencies means that the values of these parameters are estimated in the maximum likelihood framework. When the custom model option is selected, it is also possible to give the program a user-defined nucleotide frequency distribution at equilibrium (option \x{E}). For protein sequences, the stationary amino-acid frequencies are either those defined by the substitution model or those estimated by counting the number of different amino-acids observed in the data. Hence, the meaning of the \x{F} option depends on the type of the data to be processed. \vspace{0.7cm} \begin{center} \framebox{\x{[T] .................... Ts/tv ratio (fixed/estimated)}} \end{center}\index{$\kappa$}\index{ts/tv ratio} Fix or estimate the transition/transversion ratio in the maximum likelihood framework. This option is only available when DNA sequences are to be analysed under K80, HKY85 or TN93 models. The definition given to this parameter by PhyML is the same as PAML's\index{PAML} one. Therefore, the value of this parameter does {\it not} correspond to the ratio between the expected number of transitions and the expected number of transversions during a unit of time. This last definition is the one used in PHYLIP\index{PHYLIP}. PAML's manual gives more detail about the distinction between the two definitions (\url{http://abacus.gene.ucl.ac.uk/software/paml.html}). \vspace{0.7cm} \begin{center} \framebox{\x{[V] . Proportion of invariable sites (fixed/estimated)}} \end{center}\index{invariable sites}\index{proportion of invariants} The proportion of invariable sites, i.e., the expected frequency of sites that do not evolve, can be fixed or estimated. The default is to fix this proportion to 0.0. By doing so, we consider that each site in the sequence may accumulate substitutions at some point during its evolution, even if no differences across sequences are actually observed at that site. Users can also fix this parameter to any value in the $[0.0,1.0]$ range or estimate it from the data in the maximum-likelihood framework. \vspace{0.7cm} \index{gamma distribution (discrete)!mean vs. median} \index{gamma distribution (discrete)!number of categories} \index{gamma distribution (discrete)!shape parameter} \begin{center} \framebox{\x{[R] ....... One category of substitution rate (yes/no)}} \end{center} \begin{center} \framebox{\x{[C] ........... Number of substitution rate categories}} \end{center} \begin{center} \framebox{\x{[A] ... Gamma distribution parameter (fixed/estimated)}} \end{center} \begin{center} \framebox{\x{[G] .........`Middle' of each rate class (mean/median)}} \end{center} Rates of evolution often vary from site to site. This heterogeneity can be modelled using a discrete gamma distribution. Type \x{R} to switch this option on or off. The different categories of this discrete distribution correspond to different (relative) rates of evolution. The number of categories of this distribution is set to 4 by default. It is probably not wise to go below this number. Larger values are generally preferred. However, the computational burden involved is proportional to the number of categories (i.e., an analysis with 8 categories will generally take twice the time of the same analysis with only 4 categories). Note that the likelihood will not necessarily increase as the number of categories increases. Hence, the number of categories should be kept below a ``reasonable'' number, say 20. The default number of categories can be changed by typing \x{C}. The middle of each discretized substitution rate class can be determined using the mean or the median. PAML, MrBayes and RAxML use the mean. However, the median is generally associated with greater likelihoods than the mean. This conclusion is based on our analysis of several real-world data sets extracted from TreeBase. Despite this, the default option in PhyML is to use the mean in order to make PhyML likelihoods comparable to those of other phylogenetic software. One must bare in mind that {\color{red}{likelihoods calculated with the mean approximation are not directly comparable to the likelihoods calculated using the median approximation}}. The shape of the gamma distribution determines the range of rate variation across sites. Small values, typically in the $[0.1,1.0]$ range, correspond to large variability. Larger values correspond to moderate to low heterogeneity. The gamma shape parameter can be fixed by the user or estimated via maximum-likelihood. Type \x{A} to select one or the other option. \subsubsection{Tree searching sub-menu} \begin{center} \framebox{\x{[O] ........................... Optimise tree topology}} \end{center} By default the tree topology is optimised in order to maximise the likelihood. However, it is also possible to avoid any topological alteration. This option is useful when one wants to compute the likelihood of a tree given as input (see below). Type \x{O} to select among these two options. \vspace{0.7cm} \begin{center} \framebox{\x{[S] .................. Tree topology search operations}} \end{center} PhyML proposes three different methods to estimate tree topologies. The default approach is to use simultaneous NNI. This option corresponds to the original PhyML algorithm \cite{guindon03}. The second approach relies on subtree pruning and regrafting (SPR). It generally finds better tree topologies compared to NNI but is also significantly slower. The third approach, termed BEST, simply estimates the phylogeny using both methods and returns the best solution among the two. Type \x{S} to choose among these three choices. \vspace{0.7cm} \begin{center} \framebox{\x{[R] ......................... Use random starting tree}} \end{center} \begin{center} \framebox{\x{[N] .................. Number of random starting trees}} \end{center} When the SPR or the BEST options are selected, is is possible to use random trees rather than BioNJ or a user-defined tree, as starting tree. If this option is turned on (type \x{R} to change), five trees, corresponding to five random starts, will be estimated. The output tree file will contain the best tree found among those five. The number of random starts can be modified by typing \x{N}. Setting the number of random starting trees to $N$ means that the analysis will take (slightly more than) $N$ times the time required for a standard analysis where only one (BioNJ) starting tree is used. However, the analysis of real data sets shows that the best trees estimated using the random start option almost systematically have higher likelihoods than those inferred using a single starting tree. \vspace{0.7cm} \begin{center} \framebox{\x{[U] ........ Starting tree (BioNJ/parsimony/user tree)}} \end{center}\index{BioNJ} When the tree topology optimisation option is turned on, PhyML proceeds by refining an input tree. By default, this input tree is estimated using BioNJ \cite{gascuelNJ}. The alternative option is to use a parsimony tree. We found this option specially useful when analysing large data sets with NNI moves as it generally leads to greater likelihoods than those obtained when starting from a BioNJ trees. The user can also to input her/his own tree. This tree should be in Newick format (see Section \ref{sec:input_output}). This option is useful when one wants to evaluate the likelihood of a given tree with a fixed topology, using PhyML. Type \x{U} to choose among these two options. \subsubsection{Branch support sub-menu} \begin{center} \framebox{\x{[B] ................ Non parametric bootstrap analysis}} \end{center} The support of the data for each internal branch of the phylogeny can be estimated using non-parametric bootstrap. By default, this option is switched off. Typing \x{B} switches on the bootstrap analysis. The user is then prompted for a number of bootstrap replicates. The largest this number the more precise the bootstrap support estimates are. However, for each bootstrap replicate a phylogeny is estimated. Hence, the time needed to analyse $N$ bootstrap replicates corresponds to $N$-times the time spent on the analysis of the original data set. $N=100$ is generally considered as a reasonable number of replicates. \begin{center} \framebox{\x{[A] ................ Approximate likelihood ratio test}} \end{center} When the bootstrap option is switched off (see above), approximate likelihood branch supports are estimated. This approach is considerably faster than the bootstrap one. However, both methods intend to estimate different quantities and conducting a fair comparison between both criteria is not straightforward. The estimation of approximate likelihood branch support comes in multiple flavours. The default is set to aBayes, corresponding to the approximate Bayes method described in \cite{anisimova11}. The approximate likelihood ratio test (aLRT) \cite{anisimova06}, Shimodaira–Hasegawa aLRT (SH-aLRT) statistics are the other available options. \subsection{Command-line interface} An alternative to the PHYLIP-like interface is the command-line interface. Users that do not need to modify the default parameters can launch the program with the `\x{phyml -i seq\_file\_name}' command. The list of all command line arguments and how to use them is given in the `Help' section which is displayed when entering the `\x{phyml --help}' command. The available command-line options are described in what follows. \begin{itemize} \item \x{-i} (or \x{--input}) \x{seq\_file\_name}\index{command-line options!\x{--input}} \\ \x{seq\_file\_name} is the name of the nucleotide or amino-acid sequence file in PHYLIP format. \item \x{-d} (or \x{--datatype}) \x{data\_type}\index{command-line options!\x{--data\_type}}\\ \x{data\_type} is \x{nt} for nucleotide (default) and \x{aa} for amino-acid sequences. \item \x{-q} (or \x{--sequential})\index{sequence format!interleaved}\index{sequence format!sequential}\index{command-line options!\x{--sequential}} \\ Changes interleaved format (default) to sequential format. \item \x{-n} (or \x{--multiple}) \x{nb\_data\_sets}\index{multiple data sets}\index{command-line options!\x{--multiple}}\\ \x{nb\_data\_sets} is an integer giving the number of data sets to analyse. \item \x{-p} (or \x{--pars})\index{command-line options!\x{--pars}}\\ Use a minimum parsimony starting tree. This option is taken into account when the `-u' option is absent and when tree topology modifications are to be done. \item \x{-b} (or \x{--bootstrap}) \x{int}\index{bootstrap}\index{command-line options!\x{--bootstrap}} \begin{itemize} \item \x{int} $>$ 0: \x{int} is the number of bootstrap replicates. \item \x{int} = 0: neither approximate likelihood ratio test nor bootstrap values are computed. \item \x{int} = -1: approximate likelihood ratio test returning aLRT statistics. \item \x{int} = -2: approximate likelihood ratio test returning Chi2-based parametric branch supports. % \item \x{int} = -3: minimum of Chi2-based parametric and SH-like branch supports. \item \x{int} = -4: SH-like branch supports alone. \item \x{int} = -5: (default) approximate Bayes branch supports. \end{itemize} \item \x{-m} (or \x{--model}) \x{model\_name}\index{substitution models!DNA}\index{substitution models!amino acids}\index{command-line options!\x{--model}} \\ \x{model\_name} : substitution model name. \begin{itemize} \item {\it Nucleotide-based models}: \x{HKY85} (default) \x{| JC69 | K80 | F81 | F84 | TN93 | GTR | custom | r(ac),r(ag),r(at),r(cg),r(ct),r(gt)} \\ JC90, K80, F81. F84, TN93 and GTR denote the ``standard'' substitution models. The \x{custom} option can be used to define a new substitution model. A string of six digits identifies the model. For instance, 000000 corresponds to F81 (or JC69 provided the distribution of nucleotide frequencies is uniform). 012345 corresponds to GTR. This option can be used for encoding any model that is a nested within GTR. See Section \ref{sec:submenus} and Table \ref{tab:modelcode}. {\em NOTE:} the substitution parameters of the custom model will be optimised so as to maximise the likelihood. Also, it is possible to specify and fix (i.e., avoid optimisation) the values of the substitution rates in the GTR model by passing the corresponding five rates to the \x{-m} option. Commas are used to separate the five relative rates and no blank space should be introduced here. \item {\it Amino-acid based models}: \x{LG} (default) \x{| WAG | JTT | MtREV | Dayhoff | DCMut | RtREV | CpREV | VT | Blosum62 | MtMam | MtArt | HIVw | HIVb | custom} \\ The \x{custom} option is useful when one wants to use an amino-acid substitution model that is not available by default in PhyML. The symmetric part of the rate matrix, as well as the equilibrium amino-acid frequencies, are given in a file which name is asked for by the program. The format of this file is described in section \ref{sec:customaa}. \end{itemize} \begin{table}\index{custom models} \begin{center} \begin{tabular}{ll} \hline Name & Command-line option \\ \hline JC69 & \x{-m 000000 -f 0.25,0.25,0.25,0.25} \\ F81 & \x{-m 000000}\\ K80 & \x{-m 010010 -f 0.25,0.25,0.25,0.25} \\ HKY85 & \x{-m 010010}\\ TrNef & \x{-m 010020 -f 0.25,0.25,0.25,0.25} \\ TrN & \x{-m 010020}\\ K81 & \x{-m 123321 -f 0.25,0.25,0.25,0.25}\\ K81uf & \x{-m 123321}\\ TIMef & \x{-m 132241 -f 0.25,0.25,0.25,0.25}\\ TIM & \x{-m 132241}\\ TVMef & \x{-m 102304 -f 0.25,0.25,0.25,0.25}\\ TVM & \x{-m 102304}\\ SYM & \x{-m 123456 -f 0.25,0.25,0.25,0.25}\\ GTR & \x{-m 123456}\\ \hline \end{tabular} \caption{Nucleotide substitution model names (as defined in \cite{posada01}) and the corresponding custom model code used in PhyML.}\label{tab:modelcode} \end{center} \end{table} \item \x{--aa\_rate\_file file\_name}\index{command-line options!\x{--aa\_rate\_file}} \\ This option is compulsory when analysing amino-acid sequences under a `custom' model (see above). \x{file\_name} should provide a rate matrix and equilibrium amino acid in PAML format (see Section \ref{sec:customaa}). \item \x{-f e}, \x{m}, \x{o} or \x{fA,fC,fG,fT} \index{frequencies!nucleotide}\index{frequencies!amino-acid}\index{stationary frequencies}\index{command-line options!\x{-f}}\\ Nucleotide or amino-acid frequencies. \begin{itemize} \item \x{e} : the character frequencies are determined as follows : \begin{itemize} \item {\it Nucleotide sequences}: (Empirical) the equilibrium base frequencies are estimated by counting the occurence of the different bases in the alignment. \item {\it Amino-acid sequences}: (Empirical) the equilibrium amino-acid frequencies are estimated by counting the occurence of the different amino-acids in the alignment. \end{itemize} \item \x{m} : the character frequencies are determined as follows : \begin{itemize} \item {\it Nucleotide sequences}: (Model) the equilibrium base frequencies are optimized using maximum likelihood. \item {\it Amino-acid sequences}: (Model) the equilibrium amino-acid frequencies are estimated using the frequencies defined by the substitution model. \end{itemize} \item \x{o} : the character frequencies (nucleotides or amino-acids) are optimized using maximum likelihood. \item \x{fA,fC,fG,fT}: only valid for nucleotide-based models. \x{fA}, \x{fC}, \x{fG} and \x{fT} are floating numbers that correspond to the frequencies of A, C, G and T respectively. \end{itemize} \item \x{-t} (or \x{--ts/tv}) \x{ts/tv\_ratio} \index{$\kappa$}\index{ts/tv ratio}\index{command-line options!\x{--ts/tv}}\\ \x{ts/tv\_ratio}: transition/transversion ratio. DNA sequences only. Can be a fixed positive value (e.g., 4.0) or type \x{e} to get the maximum likelihood estimate. \item \x{-v} (or \x{--pinv}) \x{prop\_invar}\index{proportion of invariants}\index{invariable sites} \index{command-line options!\x{--pinv}}\\ \x{prop\_invar}: proportion of invariable sites. Can be a fixed value in the [0,1] range or type \x{e} to get the maximum likelihood estimate. \item \x{-c} (or \x{--nclasses}) \x{nb\_subst\_cat}\index{gamma distribution (discrete)!number of categories} \index{command-line options!\x{--nclasses}}\\ \x{nb\_subst\_cat}: number of relative substitution rate categories. Default: \x{nb\_subst\_cat=4}. Must be a positive integer. \item \x{-a} (or \x{--alpha}) \x{gamma} \index{gamma distribution (discrete)!shape parameter}\index{command-line options!\x{--alpha}} \\ \x{gamma}: value of the gamma shape parameter. Can be a fixed positive value or e to get the maximum likelihood estimate. The value of this parameter is estimated in the maximum likelihood framework by default. \item \x{--use\_median} \index{gamma distribution (discrete)!mean vs. median} \index{command-line options!\x{--use\_median}}\\ The middle of each substitution rate class in the discrete gamma distribution is taken as the median. The mean is used by default. \item \x{--free\_rates} or \x{--freerates} \index{command-line options!\x{--free\_rates}}\\ As an alternative to the discrete gamma model, it is possible to estimate the (relative) rate in each class of the (mixture) model and the corresponding frequencies directly from the data. This model, called FreeRate, has more parameters than the discrete gamma one but usually provides a significantly better fit to the data. See \cite{soubrier12} for more information about this model and an illustration of its use. \item \x{--il} \index{command-line options!\x{--il}}\\ \x{il} stands here for integrated (branch) length. This model, described in \cite{guindon13} in the context of molecular dating, provides an efficient way to implement the covarion model \index{covarion}. Under the integrated length (IL) model, the length of each edge is described by a distribution of values, instead of a single value corresponding to the expected number of substitutions per position along the sequence. Let $l_{a,s}$ and $l_{b,s}$ be the number of substitutions at site $s$ along edges $a$ and $b$, and $l_{a,t}$ and $l_{b,t}$, the number of substitutions at site $t$. Standard models have $l_{a,s}=l_{a,t}$ and $l_{b,s}=l_{b,t}$, or $l_{a,s}=\alpha l_{a,t}$ and $l_{b,s}=\alpha l_{b,t}$ if rates vary across sites. The IL model has instead $l_{a,s}= \alpha l_{a,t}$ and $l_{b,s}= \beta l_{b,t}$ with $\alpha \neq \beta$, i.e. substitution rates vary across sites and edges. The IL approach is somehow an analytical approximation to the covarion model that, unlike the covarion model, does not incur any computational overhead compared to the traditional models. A notable difference with the plain vanilla covarion model and the IL model however is that substitution rates are not autocorrelated along the phylogeny under the IL model. \item \x{--codpos} \x{1,2 or 3} \index{command-line options!\x{--codpos}}\\ When analysing an alignment of coding sequences, use this option to consider only the first, second or the third coding position for the estimation. \item \x{-s} (or \x{--search}) \x{move}\index{NNI}\index{SPR} \index{command-line options!\x{--search}}\\ Tree topology search operation option. Can be either \x{NNI} (default, fast) or \x{SPR} (usually slower than \x{NNI} but more accurate) or \x{BEST} (best of NNI and SPR search). \item \x{-u} (or \x{--inputtree}) \x{user\_tree\_file}\index{input tree}\index{user tree} \index{command-line options!\x{--inputtree}}\\ \x{user\_tree\_file}: starting tree filename. The tree must be in Newick format. \item \x{-o params}\index{optimisation!topology}\index{optimisation!substitution parameters} \index{command-line options!\x{-o}}\\ This option focuses on specific parameter optimisation. \begin{itemize} \item \x{params=tlr}: tree topology (\x{t}), branch length (\x{l}) and substitution rate parameters (\x{r}) are optimised. \item \x{params=tl}: tree topology and branch lengths are optimised. \item \x{params=lr}: branch lengths and substitution rate parameters are optimised. \item \x{params=l}: branch lengths are optimised. \item \x{params=r}: substitution rate parameters are optimised. \item \x{params=n}: no parameter is optimised. \end{itemize} \item \x{--rand\_start}\index{random tree} \index{command-line options!\x{--rand\_start}}\\ This option sets the initial tree to random. It is only valid if SPR searches are to be performed. \item \x{--n\_rand\_starts num} \index{command-line options!\x{--n\_rand\_starts}}\\ \x{num} is the number of initial random trees to be used. It is only valid if SPR searches are to be performed. \item \x{--r\_seed num}\index{random number} \index{command-line options!\x{--r\_seed}}\\ \x{num} is the seed used to initiate the random number generator. Must be an integer. \item \x{--print\_site\_lnl}\index{likelihood!print site likelihood} \index{command-line options!\x{--print\_site\_lk}}\\ Print the likelihood for each site in file *\_phyml\_lk.txt. For $\Gamma$ or $\Gamma$+I or FreeRate models, this option returns the posterior probability of each relative rate class at each site. Such information can then be used to identify fast- and slow-evolving regions of the alignment. \item \x{--print\_trace}\index{command-line options!\x{--print\_trace}}\\ Print each phylogeny explored during the tree search process in file *\_phyml\_trace.txt. This option can be useful for monitoring the progress of the analysis for very large data sets and have an approximate idea of what the final phylogeny will look like. \item \x{--json\_trace}\index{command-line options!\x{--json\_trace}}\\ Print each phylogeny explored during the tree search process in file *\_phyml\_json\_trace.txt in JSON format (see \url{http://www.json.org/}). This option can be useful for monitoring the progress of the analysis for very large data sets and have an approximate idea of what the final phylogeny will look like. \item \x{--run\_id ID\_string}\index{run ID} \index{command-line options!\x{--run\_id}}\\ Append the string ID\_string at the end of each PhyML output file. This option may be useful when running simulations involving PhyML. It can also be used to `tag' multiple analysis of the same data set with various program settings. \item \x{--no\_memory\_check} \index{command-line options!\x{--no\_memory\_check}}\\ By default, when processing a large data set, PhyML will pause and ask the user to confirm that she/he wants to continue with the execution of the analysis despite the large amount of memory required. The \x{--no\_memory\_check} skips this question. It is especially useful when running PhyML in batch mode. \item \x{--no\_colalias} \index{command-line options!\x{--no\_colalias}}\\ By default, PhyML preprocesses each alignment by putting together (or aliasing) the columns that are identical. Use this option to skip this step but be aware that the analysis might then take more time to complete. \item \x{--constrained\_lens} \index{command-line options!\x{--constrained\_lens}}\\ When an input tree with branch lengths is provided, this option will find the branch multiplier that maximises the likelihood (i.e., the relative branch lengths remain constant) \item \x{--constraint\_file} \x{file\_name} \index{command-line options!\x{--constraint\_file}}\\ \x{file\_name} lists the topological constraints under which the tree topology search is conducted. This option should be used in conjunction with \x{-u} \x{file\_name}. See Section \ref{sec:topoconstraints} for more information. \item \x{--quiet} \index{command-line options!\x{--quiet}}\\ Runs PhyML in quiet mode. The program will not pause if the memory required to run the analysis exceeds 256MB and will not output the progression of the log-likelihood scores on the standard output. \item \x{--ancestral} \index{command-line options!\x{--ancestral}}\\ PhyML calculates the marginal probabilities of each character state at each internal node and each site of the sequence alignment. It then uses the ``Minimum Posterior Expected Error'' criterion to infer ancestral sequences. Works for both nucleotide and amino-acid data. \item \x{--leave\_duplicates} \index{command-line options!\x{--leave\_duplicates}}\\ PhyML removes duplicate sequences by default. Use this option if you do not want PhyML to discard them (even though leaving these sequences in will slow down the analysis). \end{itemize} \subsection{XML interface} \begin{itemize} \item \x{--xml=xml\_file\_name}\index{command-line options!\x{--xml}} \\ \x{xml\_file\_name} is the name of the XML file containing the information required to run the analysis. More details about this type of file is given in the section \ref{sec:xmlio}. \end{itemize} \subsection{Parallel bootstrap}\label{sec:parallel_bootstrap}\index{MPI}\index{bootstrap!parallel} Bootstrapping is a highly parallelizable task. Indeed, bootstrap replicates are independent from one another. Each bootstrap replicate can then be analysed separately. Modern computers often have more than one CPU. Each CPU can therefore be used to process a bootstrap sample. Using this parallel strategy, performing $R$ bootstrap replicates on $C$ CPUs `costs' the same amount of computation time as processing $R \times C$ bootstrap replicates on a single CPU. In other words, for a given number of replicates, the computation time is divided by $R$ compared to the non-parallel approach. PhyML sources must be compiled with specific options to turn on the parallel option (see Section \ref{sec:MPI}). Once the binary file (\x{phyml}) has been generated, running a bootstrap analysis with, say 100 replicates on 2 CPUs, can be done by typing the following command-line: \begin{verbatim} mpd &; mpirun -np 2 ./phyml-mpi -i seqfile -b 100; \end{verbatim} The first command launches the mpi daemon while the second launches the analysis. Note that launching the daemon needs to be done only once. The output files are similar to the ones generated using the standard, non-parallel, analysis (see Section \ref{sec:input_output}). Note that running the program in batch mode, i.e.: \begin{verbatim} mpirun -np 2 ./phyml-mpi -i seqfile -b 100 & \end{verbatim} will probably NOT work. I do not know how to run a mpi process in batch mode yet. Suggestions welcome... Also, at the moment, the number of bootstrap replicates must be a multiple of the number of CPUs required in the mpirun command. \section{Inputs \& outputs for command-line and PHYLIP interface }\label{sec:input_output} PhyML reads data from standard text files, without the need for any particular file name extension. \subsection{Sequence formats} \begin{figure} \begin{small} \begin{Verbatim}[frame=single, label=PHYLIP interleaved, samepage=true, baselinestretch=0.5] 5 80 seq1 CCATCTCACGGTCGGTACGATACACCKGCTTTTGGCAGGAAATGGTCAATATTACAAGGT seq2 CCATCTCACGGTCAG---GATACACCKGCTTTTGGCGGGAAATGGTCAACATTAAAAGAT seq3 RCATCTCCCGCTCAG---GATACCCCKGCTGTTG????????????????ATTAAAAGGT seq4 RCATCTCATGGTCAA---GATACTCCTGCTTTTGGCGGGAAATGGTCAATCTTAAAAGGT seq5 RCATCTCACGGTCGGTAAGATACACCTGCTTTTGGCGGGAAATGGTCAAT????????GT ATCKGCTTTTGGCAGGAAAT ATCKGCTTTTGGCGGGAAAT AGCKGCTGTTG????????? ATCTGCTTTTGGCGGGAAAT ATCTGCTTTTGGCGGGAAAT \end{Verbatim} \begin{Verbatim}[frame=single, label=PHYLIP sequential, samepage=true, baselinestretch=0.5] 5 40 seq1 CCATCTCANNNNNNNNACGATACACCKGCTTTTGGCAGG seq2 CCATCTCANNNNNNNNGGGATACACCKGCTTTTGGCGGG seq3 RCATCTCCCGCTCAGTGAGATACCCCKGCTGTTGXXXXX seq4 RCATCTCATGGTCAATG-AATACTCCTGCTTTTGXXXXX seq5 RCATCTCACGGTCGGTAAGATACACCTGCTTTTGxxxxx \end{Verbatim} \end{small} \label{fig:align_tree} \caption{\bf PHYLIP interleaved and sequential formats.} \end{figure} \begin{figure} \begin{small} \begin{Verbatim}[frame=single, label=Nexus nucleotides, samepage=true, baselinestretch=0.5] [ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=20; FORMAT DATATYPE=DNA; MATRIX tax1 ?ATGATTTCCTTAGTAGCGG tax2 CAGGATTTCCTTAGTAGCGG tax3 ?AGGATTTCCTTAGTAGCGG tax4 ?????????????GTAGCGG tax5 CAGGATTTCCTTAGTAGCGG tax6 CAGGATTTCCTTAGTAGCGG tax7 ???GATTTCCTTAGTAGCGG tax8 ???????????????????? tax9 ???GGATTTCTTCGTAGCGG tax10 ???????????????AGCGG; END; \end{Verbatim} \end{small} \begin{small} \begin{Verbatim}[frame=single, label=Nexus digits, samepage=true, baselinestretch=0.5] [ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=20; FORMAT DATATYPE=STANDARD SYMBOLS="0 1 2 3"; MATRIX tax1 ?0320333113302302122 tax2 10220333113302302122 tax3 ?0220333113302302122 tax4 ?????????????2302122 tax5 10220333113302302122 tax6 10220333113302302122 tax7 ???20333113302302122 tax8 ???????????????????? tax9 ???22033313312302122 tax10 ???????????????02122; END; \end{Verbatim} \end{small} \begin{small} \begin{Verbatim}[frame=single, label=Nexus digits, samepage=true, baselinestretch=0.5] [ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=20; FORMAT DATATYPE=STANDARD SYMBOLS="00 01 02 03"; MATRIX tax1 ??00030200030303010103030002030002010202 tax2 0100020200030303010103030002030002010202 tax3 ??00020200030303010103030002030002010202 tax4 ??????????????????????????02030002010202 tax5 0100020200030303010103030002030002010202 tax6 0100020200030303010103030002030002010202 tax7 ??????0200030303010103030002030002010202 tax8 ???????????????????????????????????????? tax9 ??????0202000303030103030102030002010202 tax10 ??????????????????????????????0002010202; END; \end{Verbatim} \end{small} \caption{\bf NEXUS formats.}\label{fig:nexus} \end{figure} Alignments of DNA or protein sequences must be in PHYLIP\index{PHYLIP} or NEXUS \cite{maddison97}\index{NEXUS} sequential\index{sequential} or interleaved\index{interleaved} format (Figures \ref{fig:align_tree} and \ref{fig:nexus}). For PHYLIP formated sequence alignments, the first line of the input file contains the number of species and the number of characters, in free format, separated by blank characters. One slight difference with PHYLIP format deals with sequence name lengths. While PHYLIP format limits this length to ten characters, PhyML can read up to hundred character long sequence names. Blanks and the symbols ``(),:'' are not allowed within sequence names because the Newick tree format makes special use of these symbols. Another slight difference with PHYLIP format is that actual sequences must be separated from their names by at least one blank character. A PHYLIP input sequence file may also display more than a single data set. Each of these data sets must be in PHYLIP format and two successive alignments must be separated by an empty line. Processing multiple data sets requires to toggle the `\x{M}' option in the {\em Input Data} sub-menu or use the `\x{-n}' command line option and enter the number of data sets to analyse. The multiple data set option can be used to process re-sampled data that were generated using a non-parametric procedure such as cross-validation or jackknife (a bootstrap option is already included in PhyML). This option is also useful in multiple gene studies, even if fitting the same substitution model to all data sets may not be suitable. PhyML can also process alignments in NEXUS format. Although not all the options provided by this format are supported by PhyML, a few specific features are exploited. Of course, this format can handle nucleotide and protein sequence alignments in sequential or interleaved format. It is also possible to use custom alphabets, replacing the standard 4-state and 20-state alphabets for nucleotides and amino-acids respectively. Examples of a 4-state custom alphabet are given in Figure \ref{fig:nexus}. Each state must here correspond to one digit or more. The set of states must be a list of consecutive digits starting from 0. For instance, the list ``0, 1, 3, 4'' is not a valid alphabet. Each state in the symbol list must be separated from the next one by a space. Hence, alphabets with large number of states can be easily defined by using two-digit number (starting with 00 up to 19 for a 20 state alphabet). Most importantly, this feature gives the opportunity to analyse data sets made of presence/absence character states (use the \texttt{symbols=``0 1''} option for such data).\index{binary characters} Alignments made of custom-defined states will be processed using the Jukes and Cantor model. Other options of the program (e.g., number of rate classes, tree topology search algorithm) are freely configurable. Note that, at the moment, the maximum number of different states is set to 22 in order to save memory space. It is however possible to lift this threshold by modifiying the value of the variable \x{T\_MAX\_ALPHABET} in the file `\x{utilities.h}'. The program will then have to be re-compiled. \subsubsection{Gaps and ambiguous characters} Gaps correspond to the `\x{-}' symbol. They are systematically treated as unknown characters ``on the grounds that we don't know what would be there if something were there'' (J. Felsenstein, PHYLIP main documentation). The likelihood at these sites is summed over all the possible states (i.e., nucleotides or amino acids) that could actually be observed at these particular positions. Note however that columns of the alignment that display only gaps or unknown characters are simply discarded because they do not carry any phylogenetic information (they are equally well explained by any model). PhyML also handles ambiguous characters such as $R$ for $A$ or $G$ (purines) and $Y$ for $C$ or $T$ (pyrimidines). Tables \ref{tab:ambigu_nt} and \ref{tab:ambigu_aa} give the list of valid characters/symbols and the corresponding nucleotides or amino acids. \begin{table} \begin{center} \begin{tabular}{lr|lr} \hline Character & Nucleotide & Character & Nucleotide \\ \hline $A$ & Adenosine & $Y$ & $C$ or $T$ \\ $G$ & Guanosine & $K$ & $G$ or $T$ \\ $C$ & Cytidine & $B$ & $C$ or $G$ or $T$\\ $T$ & Thymidine & $D$ & $A$ or $G$ or $T$ \\ $U$ & Uridine (=$T$) & $H$ & $A$ or $C$ or $T$ \\ $M$ & $A$ or $C$ & $V$ & $A$ or $C$ or $G$ \\ $R$ & $A$ or $G$ & $-$ or $N$ or $X$ or $?$ & unknown \\ $W$ & $A$ or $T$ & & (=$A$ or $C$ or $G$ or $T$)\\ $S$ & $C$ or $G$ & & \\ \hline \end{tabular} \end{center} \caption{{\bf List of valid characters in DNA sequences and the corresponding nucleotides.}}\label{tab:ambigu_nt} \end{table} \begin{table} \begin{center} \begin{tabular}{lr|lr} \hline Character & Amino-Acid & Character & Amino-Acid \\ \hline $A$ & Alanine & $L$ & Leucine \\ $R$ & Arginine & $K$ & Lysine \\ $N$ or $B$& Asparagine & $M$ & Methionine \\ $D$ & Aspartic acid & $F$ & Phenylalanine \\ $C$ & Cysteine & $P$ & Proline \\ $Q$ or $Z$& Glutamine & $S$ & Serine \\ $E$ & Glutamic acid & $T$ & Threonine \\ $G$ & Glycine & $W$ & Tryptophan \\ $H$ & Histidine & $Y$ & Tyrosine \\ $I$ & Isoleucine & $V$ & Valine \\ $L$ & Leucine & $-$ or $X$ or $?$ & unknown \\ $K$ & Lysine & & (can be any amino acid) \\ \hline \end{tabular} \end{center} \caption{{\bf List of valid characters in protein sequences and the corresponding amino acids.}}\label{tab:ambigu_aa} \end{table} \subsubsection{Specifying outgroup sequences}\label{sec:outgroupspecify} PhyML can return rooted trees provided outgroup taxa are identified from the sequence file. In order to do so, sequence names that display a `*' character will be automatically considered as belonging to the outgroup. The topology of the rooted tree is exactly the same as the unrooted version of the same tree. In other words, PhyML first ignores the distinction between ingroup and outgroup sequences, builds a maximum likelihood unrooted tree and then tries to add the root. If the outgroup has more than one sequence, the position of the root might be ambiguous. In such situation, PhyML tries to identify the most relevant position of the root by considering which edge provides the best separation between ingroup and outgroup taxa (i.e., we are trying to make the outgroup ``as monophyletic as possible''). \subsection{Tree format} PhyML can read one or several phylogenetic trees from an input file. This option is accessible through the {\em Tree Searching} sub menu or the `\x{-u}' argument from the command line. Input trees are generally used as initial maximum likelihood estimates to be subsequently adjusted by the tree searching algorithm. Trees can be either rooted or unrooted and multifurcations are allowed. Taxa names must, of course, match the corresponding sequence names. \begin{figure}[h] \begin{small} \begin{minipage}{\textwidth} \begin{verbatim} ((seq1:0.03,seq2:0.01):0.04,(seq3:0.01,(seq4:0.2,seq5:0.05):0.2):0.01); ((seq3,seq2),seq1,(seq4,seq5)); \end{verbatim} \end{minipage} \end{small} \caption{{\bf Input trees}. The first tree (top) is rooted and has branch lengths. The second tree (bottom) is unrooted and does not have branch lengths.} \label{fig:trees}\index{Newick format} \end{figure} \subsection{Multiple alignments and trees}\index{multiple data sets} Single or multiple sequence data sets may be used in combination with single or multiple input trees. When the number of data sets is one ($n_D = 1$) and there is only one input tree ($n_T = 1$), then this tree is simply used as input for the single data set analysis. When $n_D = 1$ and $n_T > 1$, each input tree is used successively for the analysis of the single alignment. PhyML then outputs the tree with the highest likelihood. If $n_D > 1$ and $n_T = 1$, the same input tree is used for the analysis of each data set. The last combination is $n_D > 1$ and $n_T > 1$. In this situation, the $i$-th tree in the input tree file is used to analyse the $i$-th data set. Hence, $n_D$ and $n_T$ must be equal here. \subsection{Custom amino-acid rate model}\label{sec:customaa} The custom amino-acid model of substitutions can be used to implement a model that is not hard-coded in PhyML. This model must be time-reversible. Hence, the matrix of substitution rates is symmetrical. The format of the rate matrix with the associated stationary frequencies is identical to the one used in PAML\index{PAML}. An example is given below: \begin{center} {\tiny \begin{tabular}{p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}p{0.33cm}} % Ala & Arg & Asn & Asp & Cys & Gln & Glu & Gly & His & Ile & Leu & Lys & Met & Phe & Pro & Ser & Thr & Trp & Tyr & Val \\ &&&&&&&&&&&&&&&&&&& \\ 0.55 & &&&&&&&&&&&&&&&&&& \\ 0.51 & 0.64 & &&&&&&&&&&&&&&&& \\ 0.74 & 0.15 & 5.43 & &&&&&&&&&&&&&&&& \\ 1.03 & 0.53 & 0.27 & 0.03 & &&&&&&&&&&&&&&& \\ 0.91 & 3.04 & 1.54 & 0.62 & 0.10 & &&&&&&&&&&&&&& \\ 1.58 & 0.44 & 0.95 & 6.17 & 0.02 & 5.47 & &&&&&&&&&&&&& \\ 1.42 & 0.58 & 1.13 & 0.87 & 0.31 & 0.33 & 0.57 & &&&&&&&&&&&& \\ 0.32 & 2.14 & 3.96 & 0.93 & 0.25 & 4.29 & 0.57 & 0.25 & &&&&&&&&&&& \\ 0.19 & 0.19 & 0.55 & 0.04 & 0.17 & 0.11 & 0.13 & 0.03 & 0.14 & &&&&&&&&&& \\ 0.40 & 0.50 & 0.13 & 0.08 & 0.38 & 0.87 & 0.15 & 0.06 & 0.50 & 3.17 & &&&&&&&&& \\ 0.91 & 5.35 & 3.01 & 0.48 & 0.07 & 3.89 & 2.58 & 0.37 & 0.89 & 0.32 & 0.26 & &&&&&&&& \\ 0.89 & 0.68 & 0.20 & 0.10 & 0.39 & 1.55 & 0.32 & 0.17 & 0.40 & 4.26 & 4.85 & 0.93 & &&&&&&& \\ 0.21 & 0.10 & 0.10 & 0.05 & 0.40 & 0.10 & 0.08 & 0.05 & 0.68 & 1.06 & 2.12 & 0.09 & 1.19 & &&&&&& \\ 1.44 & 0.68 & 0.20 & 0.42 & 0.11 & 0.93 & 0.68 & 0.24 & 0.70 & 0.10 & 0.42 & 0.56 & 0.17 & 0.16 & &&&&& \\ 3.37 & 1.22 & 3.97 & 1.07 & 1.41 & 1.03 & 0.70 & 1.34 & 0.74 & 0.32 & 0.34 & 0.97 & 0.49 & 0.55 & 1.61 & &&&& \\ 2.12 & 0.55 & 2.03 & 0.37 & 0.51 & 0.86 & 0.82 & 0.23 & 0.47 & 1.46 & 0.33 & 1.39 & 1.52 & 0.17 & 0.80 & 4.38 & &&& \\ 0.11 & 1.16 & 0.07 & 0.13 & 0.72 & 0.22 & 0.16 & 0.34 & 0.26 & 0.21 & 0.67 & 0.14 & 0.52 & 1.53 & 0.14 & 0.52 & 0.11 & && \\ 0.24 & 0.38 & 1.09 & 0.33 & 0.54 & 0.23 & 0.20 & 0.10 & 3.87 & 0.42 & 0.40 & 0.13 & 0.43 & 6.45 & 0.22 & 0.79 & 0.29 & 2.49 & & \\ 2.01 & 0.25 & 0.20 & 0.15 & 1.00 & 0.30 & 0.59 & 0.19 & 0.12 & 7.82 & 1.80 & 0.31 & 2.06 & 0.65 & 0.31 & 0.23 & 1.39 & 0.37 & 0.31 & \\ \\ 8.66 & 4.40 & 3.91 & 5.70 & 1.93 & 3.67 & 5.81 & 8.33 & 2.44 & 4.85 & 8.62 & 6.20 & 1.95 & 3.84 & 4.58 & 6.95 & 6.10 & 1.44 & 3.53 & 7.09 \\ \end{tabular} } \end{center} The entry on the $i$-th row and $j$-th column of this matrix corresponds to the rate of substitutions between amino-acids $i$ and $j$. The last line in the file gives the stationary frequencies and must be separated from the rate matrix by one line. The ordering of the amino-acids is alphabetical, i.e, Ala, Arg, Asn, Asp, Cys, Gln, Glu, Gly, His, Ile, Leu, Lys, Met, Phe, Pro, Ser, Thr, Trp, Tyr and Val. \subsection{Topological constraint file}\label{sec:topoconstraints} PhyML can perform phylogenetic tree estimation under user-specified topological constraints. In order to do so, one should use the \x{--constraint\_file} \x{file\_name} command-line option where \x{file\_name} lists the topological constraints. Such constraints are straightforward to define. For instance, the following constraints: \vspace{0.2cm} \begin{Verbatim} ((A,B),C,(D,E,F)); \end{Verbatim} indicate that taxa D, E and F belong to the same clade. A, B and C also belong to the same clade and the two clades hence defined should not overlap. Under these two constraints, the tree ((A,B),D,((E,F),C)) is not valid. From the example above, you will notice that the constraints are defined using a multifurcating tree in NEWICK format. Note that this tree does not need to display the whole list of taxa. For instance, while the only taxa involved in specifying topological constraints above are A, B, C, D, E \& F, the actual data set could include more than these six taxa only. PhyML tree topology search algorithms all rely on improving a starting tree. By default, BioNJ is the method of choice for building this tree. However, there is no guarantee that the phylogeny estimated with PhyML does comply with the topological constraints. While it is probably possible to implement BioNJ with topological constraints, we have not done so yet. Instead, the same multifurcating tree that defines the topological constraints should also be used as starting tree using the \x{-u} (\x{--inputtree}) option. Altogether, the command line should look like the following: \x{-u}=\x{file\_name} \x{--constraint\_file}=\x{file\_name}. It is not possible to use as input tree a non-binary phylogeny that is distinct from that provided in the constraint tree file. However, any binary tree compatible with the constraint one can be used as input tree. \subsection{Output files} \begin{table} Sequence file name~: `{\x seq}'\\ \begin{center} \begin{tabular}{ll} \hline Output file name & Content \\ \hline \x{seq\_phyml\_tree.txt} & ML tree\\ \x{seq\_phyml\_stats.txt} & ML model parameters\\ \x{seq\_phyml\_boot\_trees.txt} & ML trees -- bootstrap replicates\\ \x{seq\_phyml\_boot\_stats.txt} & ML model parameters -- bootstrap replicates \\ \x{seq\_phyml\_rand\_trees.txt} & ML trees -- multiple random starts\\ \x{seq\_phyml\_ancestral\_seq.txt} & ancestral sequences\\ \x{seq\_phyml\_ancestral\_tree.txt} & ML tree with node labels as in ancestral sequence file\\ \hline \end{tabular} \end{center} \caption{{\bf Standard output files}}\label{tab:output} \end{table} Table \ref{tab:output} presents the list of files resulting from an analysis. Basically, each output file name can be divided into three parts. The first part is the sequence file name, the second part corresponds to the extension `\x{\_phyml\_}' and the third part is related to the file content. When launched with the default options, PhyML only generates two files: the tree file and the model parameter file. The estimated maximum likelihood tree is in standard Newick format (see Figure \ref{fig:trees}). The model parameters file, or statistics file, displays the maximum likelihood estimates of the substitution model parameters, the likelihood of the maximum likelihood phylogenetic model, and other important information concerning the settings of the analysis (e.g., type of data, name of the substitution model, starting tree, etc.). Two additional output files are created if bootstrap supports were evaluated. These files simply contain the maximum likelihood trees and the substitution model parameters estimated from each bootstrap replicate. Such information can be used to estimate sampling errors around each parameter of the phylogenetic model. When the random tree option is turned on, the maximum likelihood trees estimated from each random starting trees are printed in a separate tree file (see last row of Table \ref{tab:output}). PhyML estimates ancestral sequences by calculating the {\em marginal} (as opposed to the {\em joint}) probability of each character state at each internal node of the phylogeny. These probabilities are given in the file \x{seq\_phyml\_ancestral\_seq.txt}. The bulk of this file is a table where each row corresponds to a site in the original alignment and a number corresponding labeling each internal node. The different columns of that file give the probability of each character state given the data observed at the corresponding sites and the estimated phylogeny. PhyML also outputs an extra column called MPEE\index{MPEE}\index{ancestral reconstruction}, which stands for Minimum Posterior Expected Error. This column gives the state, which can be a single nucleotide/amino-acid or a combination of more than one nucleotide/amino-acid, that is optimal under the MPEE criterion \cite{oliva19}. Also, it is relatively straightforward to identify which number corresponds to which node in the tree by examining the information provided in the Newick-formatted file \x{seq\_phyml\_ancestral\_tree.txt}. \subsection{Treatment of invariable sites with fixed branch lengths} PhyML allows users to give an input tree with fixed topology and branch lengths and find the proportion of invariable sites that maximise the likelihood (option \x{-o r}). These two options can be considered as conflicting since branch lengths depend on the proportion of invariants. Hence, changing the proportion of invariants implies that branch lengths are changing too. More formally, let $l$ denote the length of a branch, i.e., the expected number of substitutions per site, and $p$ be the proportion of invariants. We have $l = (1-p)l'$, where $l'$ is the expected number of substitutions {\em at variable sites}. When asked to optimize $p$ but leave $l$ unchanged, PhyML does the following: \begin{enumerate} \item Calculate $l' = l/(1-p)$ and leave $l'$ unchanged throughout the optimization. \item Find the value of $p$ that maximises the likelihood. Let $p^{*}$ denote this value. \item Set $l^{*} = (1-p^{*})l'$ and print out the tree with $l^{*}$ (instead of $l$). \end{enumerate} PhyML therefore assumes that the users wants to fix the branch lengths measured at {\em variable} sites only (i.e., $l^{*}$ is fixed). This is the reason why the branch lengths in the input and output trees do differ despite the use of the the \x{-o r} option. While we believe that this approach relies on a sound rationale, it is not perfect. In particular, the original transformation of branch lengths ($l' = l/(1-p)$) relies on a default value for $p$ with is set to 0.2 in practice. It is difficult to justify the use of this value rather than another one. One suggestion proposed by Bart Hazes is to avoid fixing the branch lengths altogether and rather estimate the value of a scaling factor applied to each branch length in the input tree (option \x{--contrained\_lens}). We agree that this solution probably matches very well most users expectation, i.e., ``find the best value of $p$ while constraining the ratio of branch lengths to be that given in the input tree''. Please feel free to send us your suggestions regarding this problem by posting on the forum (\url{http://groups.google.com/group/phyml-forum}). \section{Inputs \& outputs for the XML interface }\label{sec:xmlio}\index{XML} \subsection{Mixture models in PhyML}\index{mixture models}\label{sec:mixtures} PhyML implements a wide range of mixture models. The discrete gamma model \cite{yang94b} is arguably the most popular of these models in phylogenetics. However, in theory, mixture models are not restricted to the description of the variation of substitution rates across sites. For instance, if there are good reasons to believe that the relative rates of substitution between nucleotides vary along the sequence alignments, it makes sense to use a mixture of GTR models. Consider the case where substitutions between $A$ and $C$ occur at high rate in some regions of the alignment and low rate elsewhere, a mixture with two classes, each class having its own GTR rate matrix, would be suitable. The likelihood at any site of the alignment is then obtained by averaging the likelihoods obtained for each GTR rate matrix, with the same weight given to each of these matrices. PhyML implements a generic framework that allows users to define mixtures on substitution rates, rate matrices and nucleotide or amino-acid equilibrium frequencies. Each class of the mixture model is built by assembling a substitution rate, a rate matrix\footnote{the rate matrix corresponds here the symmetrical matrix giving the so-called ``echangeability rates''} and a vector of equilibrium frequencies. For instance, let $\{R_1,R_2,R_3\}$ be a set of substitution rates, $\{M_1,M_2\}$ a set of rate matrices and $\{F_1,F_2\}$ a set of vectors of equilibrium frequencies. One could then define the first class of the mixture model as $\mathcal{C}_1 = \{R_1,M_1,F_1\}$, a second class as $\mathcal{C}_2 = \{R_2,M_1,F_1\}$, and a third class as $\mathcal{C}_3 = \{R_3,M_2,F_2\}$. If $R_1$, $R_2$ and $R_3$ correspond to slow, medium and fast substitution rates, then this mixture model allows the fast evolving rates to have their own vector of equilibrium frequencies and rate matrix, distinct from that found at the medium or slow evolving sites. The likelihood at any given site $D_s$ of the alignment is then: \begin{eqnarray*} \Pr(D_s) = \sum_{c=1}^{3} \Pr(D_s | \mathcal{C}_s=c) \Pr(\mathcal{C}_s=c), \label{equ:mixtlk} \end{eqnarray*} where $\Pr(\mathcal{C}_s=c)$ is obtained by multiplying the probability (density) of the three components (i.e., rate, matrix, frequencies). For instance, $\Pr(\mathcal{C}_1=\{R_1,M_1,F_1\}) = \Pr(R_1)\times \Pr(M_1) \times \Pr(F_1)$. We therefore assume here that substitution rates, rate matrices and equilibrium frequencies are independent from one another. Note that, using the same substitution rates, rate matrices and vector of equilibrium frequencies, it is possible to construct many other mixture models. For instance, the mixture model with the largest number of classes can be created by considering all the combinations of these three components. We would then get a mixture of $3\times 2 \times 2=12$ classes, corresponding to all the possible combinations of 3 rates, 2 matrices and 2 vectors of frequencies. % : $\mathcal{C}_1 = % \{R_1,M_1,F_1\}$ $\mathcal{C}_2 = \{R_1,M_1,F_2\}$, $\mathcal{C}_3 = \{R_1,M_2,F_1\}$, % $\mathcal{C}_4 = \{R_1,M_2,F_2\}$, $\mathcal{C}_5 = \{R_2,M_1,F_1\}$, $\mathcal{C}_6 = % \{R_2,M_1,F_2\}$, $\mathcal{C}_7 = \{R_2,M_2,F_1\}$, $\mathcal{C}_8 = \{R_2,M_2,F_2\}$, % $\mathcal{C}_9 = \{R_3,M_1,F_1\}$, $\mathcal{C}_{10} = \{R_3,M_1,F_2\}$, $\mathcal{C}_{11} = % \{R_3,M_2,F_1\}$ and $\mathcal{C}_{12} = \{R_3,M_2,F_2\}$. \subsection{Partitionned (i.e., multiple-gene) analyses}\index{partitionned analysis}\index{data partitions}\index{multiple-gene analysis} We first introduce some terms of vocabulary that have not been presented before. A partitionned data set, also referred to as partition, is a set of partition elements. Typically, a partitionned data set will be made of a set of distinct gene alignments. A partition element will then correspond to one (or several) of these gene alignments. Note that the biology litterature often uses the term partition to refer to an element of a partitionned data. We thus use here instead the mathematical definition of the terms `partition' and `partition element'. Phylogenetics models usually assume individual columns of an alignment to evolve independently from one another. Codon-based models (e.g., \cite{yang98,yang00b,yang02,guindon04}) are exceptions to this rule since the substitution process applies here to triplets of consecutive sites of coding sequences. The non-independence of the substitution process at the three coding positions (due to the specificities of the genetic code), can therefore be accounted for. Assuming that sites evolve independently does not mean that a distinct model is fitted to each site of the alignment. Estimating the parameters of these models would not make much sense in practice due to the very limited amount of phylogenetic signal conveyed by individual sites. Site independence means instead that the columns of the observed alignment were sampled randomly from the same ``population of columns''. The stochasticity of the substitution process running along the tree is deemed responsible to the variability of site patterns. Some parameters of the phylogenetic model are considered to be common to all the sites in the alignment. The tree topology is typically one such parameter. The transition/transversion ratio is also generally assumed to be the same for all columns. Other parameters can vary from site to site. The rate at which substitutions accumulate is one of these parameters. Hence, different sites can have distinct rates. However, such rates are all ``drawn'' from the same probabilitic distribution (generally a discrete Gamma density). Hence, while different sites may have distinct rates of evolution, they all share the same {\em distribution} of rates. This reasonning also applies on a larger scale. When analysing multiple genes, one can indeed assume that the same mechanism generated the different site patterns observed for every gene. Here again, we can assume that all the genes share the same underlying tree topology (commonly refered to as the ``species tree''). Other parameters of the phylogenetic model, such as branch lengths for instance, might be shared across genes. However, due to the specificities of the gene evolution processes, some model parameters need to be adjusted for each gene separately. To sum up, the phylogenetic analysis of partitionned data requires flexible models with parameters, or distribution of parameters, shared across several partition elements and other parameters estimated separately for each element of the partition. The likelihood of a data set made of the concatenation of $n$ sequence alignments noted $D^{(1)}$, $D^{(2)}, \ldots, D^{(n)}$ is then obtained as follows: \begin{eqnarray*} \Pr(D^{(1)},D^{(2)},\ldots,D^{(n)}) &=& \prod_{i=1}^{n} \Pr(D^{(i)}) \\ &=& \prod_{i=1}^{n} \prod_{s=1}^{L_i} \Pr(D^{(i)}_s), \end{eqnarray*} where $L_i$ is the number of site columns in partition element $i$. $\Pr(D^{(i)}_s)$ is then obtained using Equation \ref{equ:mixtlk}, i.e., by summing over the different classes of the mixture model that applies to site $s$ for partition element $i$. Hence, the joint probability of all the partition elements is here broken down into the product of likelihood of every site for each partition element. As noted just above, any given component of the mixture model at a given particular site is shared by the other sites that belong to the same partition element and, for some of them, by sites in other partition elements (e.g., the same tree topology is shared by all the sites, throughout all the partition elements). PhyML implements a wide variety of partition models. The only parameter that is constrained to be shared by all the partition elements is the tree topology. This constraint makes sense when considering distantly related taxa, typically inter-species data. For closely related taxa, i.e., when analysing intra-species or population-level data, not all the genes might have the same evolutionary history. Recombination events combined to the incomplete lineage sorting phenomenon can generate discrepancies between the gene trees and the underlying species tree (see \cite{degnan09} for a review). The phylogenetic softwares BEST \cite{best}\index{BEST}, STEM \cite{stem}\index{STEM} and *BEAST \cite{startbeast}\index{*BEAST} are dedicated to the estimation of species tree phylogenies from the analysis of multi-gene data and allow gene-tree topologies to vary across genes. Aside from the tree topology that is common to all the sites and all the partition elements, other parameters of the phylogenetic model can be either shared across partition elements or estimated separately for each of these. When analysing three partition elements, $A$, $B$ and $C$ for instance, PhyML can fit a model where the same set of branch lengths applies to $A$ and $B$ while $C$ has its own estimated lengths. The same goes for the substitution model: the same GTR model, with identical parameter values, can be fitted to $A$ and $C$ and JC69 for instance can be used for $B$. The sections below give more detailed information on the range of models available and how to set up the corresponding XML configuration files to implement them. \subsection{Combining mixture and partitions in PhyML: the theory} The rationale behind mixture models as implemented in PhyML lies in (1) the definition of suitable rate matrices, equilibrium frequency vectors and relative rates of substitution and (2) the assembly of these components so as to create the classes of a mixture. The main idea behind partitionned analysis in PhyML lies in (1) the hypothesis of statistical independance of the different data partition elements and (2) distinct data partition can share model components such as rate matrices, equilibrium frequencies or distribution of rates across sites. More formally, the likelihood of a data set made of $n$ partition elements is written as follows: \begin{eqnarray*} \Pr(D^{(1)},D^{(2)},\ldots,D^{(n)}) &=& \prod_{i=1}^{n} \prod_{s=1}^{L_i} \Pr(D^{(i)}_s) \\ &=& \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{c=1}^{K_i} \Pr(D^{(i)}_s|\mathcal{C}=c) \Pr(\mathcal{C}=c), \end{eqnarray*} where $L_i$ is the number of sites in partition element $i$ and $K_i$ is the number of classes in the mixture model that applies to this same partition element. Each class of a mixture is made of a rate matrix $M$, a vector of equilibrium frequencies $F$ and a relative rate of substitution $R$. Branch lengths, $L$ and tree topology $\tau$ are also required for the calculation of the likelihood. Hence we have: \begin{eqnarray*} && \Pr(D^{(1)},D^{(2)},\ldots,D^{(n)}) \\ &&= \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{c=1}^{K_i} \Pr(D^{(i)}_s|\mathcal{C}=c) \Pr(\mathcal{C}=c) \\ &&= \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{m}^{\mathcal{M}_i} \sum_{f}^{\mathcal{F}_i} \sum_{r}^{\mathcal{R}_i} \Pr(D^{(i)}_s|M_m^{(i)},F_f^{(i)},R_r^{(i)},L^{(i)},\tau) \Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)}) \mathcal{I}(m,f,r,i) % &&= \prod_{i=1}^{n} \prod_{s=1}^{L_i} \sum_{m}^{\mathcal{M}_i} \sum_{f}^{\mathcal{F}_i} \sum_{r}^{\mathcal{R}_i} % \Pr(D^{(i)}_s|M_m^{(i)},F_f^{(i)},R_r^{(i)},L^{(i)},\tau) \Pr(M_m^{(i)}) \Pr(F_f^{(i)}) \Pr(R_r^{(i)}) \end{eqnarray*} where $\mathcal{M}_i$, $\mathcal{F}_i$ and $\mathcal{R}_i$ are the number of rate matrices, vector of equilibrium frequencies and relative rates that apply to partition element $i$ respectively. $\mathcal{I}(m,f,r,i)$ is an indicator function that takes value 1 if the combination $M_m$, $F_f$ and $R_r$ is acually defined in the model for this particular partition element $i$. Its value is 0 otherwise. In the example given in section \ref{sec:mixtures} $\{R_1,R_2,R_3\}$ is the set of substitution rates, $\{M_1,M_2\}$ the set of rate matrices and $\{F_1,F_2\}$ the set of vectors of equilibrium frequencies. We then define the first class of the mixture model as $\mathcal{C}_1 = \{R_1,M_1,F_1\}$, a second class as $\mathcal{C}_2 = \{R_2,M_1,F_1\}$ and the third as $\mathcal{C}_3 = \{R_3,M_2,F_2\}$. Hence, we have $\mathcal{I}(1,1,1,i)$, $\mathcal{I}(1,1,2,i)$ and $\mathcal{I}(2,2,3,i)$ equal to one while the nine other values that this indicator function takes, corresponding to the possible combinations of two vectors of frequencies, two matrices and three rates, are all zero. As stated before, our implementation assumes that the different components of a mixture are independant. In other words, we have $\Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)}) = \Pr(M_m^{(i)}) \times \Pr(F_f^{(i)}) \times \Pr(R_r^{(i)})$. In practice, the joint probability $\Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)})$ is obtained as follows: \begin{eqnarray*} \Pr(M_m^{(i)},F_f^{(i)},R_r^{(i)}) = \frac{\Pr(M_m^{(i)}) \Pr(F_f^{(i)}) \Pr(R_r^{(i)})}{ \sum_{m,f,r} \Pr(M_m^{(i)}) \Pr(F_f^{(i)}) \Pr(R_r^{(i)}) \mathcal{I}(m,f,r,i)} \label{equ:weights} \end{eqnarray*} The probabilities $\Pr(M_m^{(i)})$, $\Pr(F_f^{(i)})$ and $\Pr(R_r^{(i)})$, also called `weights', can be fixed or estimated from the data. \subsection{The XML format and its use in PhyML}\label{sec:XML format} The few paragraphs below are largely inspired from the Wikipedia page that describes the XML format (\url{http://en.wikipedia.org/wiki/XML}). XML (eXtensible Markup Language) is a markup language that defines a set of rules for encoding documents in a format that is both human-readable and machine-readable. An XML document is divided into {\em markup} and {\em content}, which may be distinguished by the application of simple syntactic rules. Generally, strings that constitute markup either begin with the character `\x{<}' and end with a `\x{>}'. Strings of characters that are not markup are content: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=XML markup and content example, samepage=true, baselinestretch=0.5, fontsize=\small] content \end{Verbatim} A markup construct that begins with `\x{<}' and ends with `\x{>}' is called a {\em tag}. Tags come in three flavors: (1) start-tags (e.g, \x{

}), end-tags (e.g., \x{
}) and empty-element tags (e.g., \x{}). A {\em component} either begins with a start-tag and ends with a matching end-tag or consists only of an empty-element tag. The characters between the start- and end-tags, if any, are the element's content, and may contain markup, including other elements, which are called child elements. In the following example, the element \x{img} has two {\em attributes}, \x{src} and \x{alt}: \x{Foligno  Madonna,  by
Raphael}. Another example would be \x{Connect A to B.} where the name of the attribute is ``\x{number}" and the value is ``\x{3}". In practice, building a mixture model in a XML file readable by PhyML is relatively straightforward. The first step is to define the different components of each class of the mixture. Consider for instance that the fitted model will have a Gamma distribution with four classes plus a proportion of invariants. The rate component of the mixture can then be specified using the following XML code: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=$\Gamma4$+I rates, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In the example above, the \x{} component completely defines a model of substitution rate variation across sites. This component has a particular identity, i.e., a name associated to it (``\x{SiteRates1}'' here), which is not mandatory. This \x{} component has six sub-components. The first is the \x{} component, followed by five \x{} components. The \x{} component defines the type of distribution that characterizes the variation of rates across sites. A discrete Gamma plus invariants is used here. Two parameters specify this distribution: the gamma shape and the proportion of invariant parameters. Their initial values are set by using the corresponding attributes and attribute values (\x{alpha="0.1"} and \x{pinv="0.4"}). Also, PhyML can optimise these parameters so as to maximise the likelihood of the whole phylogenetic model (\x{optimise.pinv="yes"} and \x{optimise.alpha="yes"}). The following five \x{} components define the rate classes themselves. The \x{id} attribute is here mandatory and must be unique to each class. Note that one of the initial (relative) rate (\x{init.value} attribute) is set to zero. The corresponding rate class (the third in this example) will then correspond to the invariant site category. Having specified the part of the phylogenetic model that describes the variation of rates across sites, we can now move on to build the rest of the model. The component below defines two substitution models: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Rate matrices, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} This \x{} component sets out a list of substitution models (HKY85 and GTR here). Here again, the different elements in this list correspond to the \x{} sub-components. Each instance must have a unique \x{id} attribute for a reason that will become obvious shortly. The remaining attributes and their functions are described in Section \ref{sec:xmlratematrices}. The next ``ingredient'' in our phylogenetic model are vectors of nucleotide frequencies. The \x{} component below specifies two of such vectors: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Equilibrium frequencies, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Now, we need to assemble these three components (rate variation across sites, rate matrices and vectors of equilibrium frequencies) into a mixture model. The \x{} component below defines one such model: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Mixture model, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} The \x{} component defines a particular partition element. In this example, the partition element corresponds to the sequence file called \x{nucleic.txt}, which is an alignment of nucleotide sequences (see the \x{data.type} attribute value). The \x{} are sub-components of the \x{} component. Each \x{} has a \x{list} atrribute. Each such \x{list} gives the ID of components that have been defined before. For instance, the first \x{} refers to the five classes of the \x{} component. The ordering of the different term in these list matters a lot since it is directly related to the elements in each class of the mixture model. Hence, the first element in the \x{} attribute of the first \x{} added to the first element in the \x{} attribute of the second \x{} plus the the first element in \x{} attribute of the third \x{} defines the first class of the mixture model. Therefore, the mixture model defined above has five classes: $\mathcal{C}_1 = \{R_1,M_1,F_1\}$, $\mathcal{C}_2 = \{R_2,M_1,F_2\}$, $\mathcal{C}_3 = \{R_3,M_1,F_1\}$, $\mathcal{C}_4 = \{R_4,M_2,F_2\}$ and $\mathcal{C}_5 = \{R_5,M_2,F_2\}$. % Going back to the different components of this model, the XML code dealing with the substitution % rates defines five classes with names {\tt R1} to {\tt R5}. The initial values of these rates are % set to 1.0, except for {\tt R5}, which is set to 0 and will therefore correspond to the invariable % site class. The {\tt } tag that follows indicate that these rates define a $\Gamma 4$+Inv % model, with initial gamma shape parameter set to 0.1 and initial proportion of invariants set to % 0.4. These two parameters will be estimated in the analysis ({\tt optimise.alpha} and {\tt % optimise.pinv} attributes set to {\tt yes}). The two rate matrices have names {\tt M1} and {\tt % M2}. {\tt M1} corresponds to a HKY85 model, with transition/transversion ratio set to 4.0 and set % to be optimised in the analysis. {\tt M2} is a GTR model, which parameters are also set to be % optimised. {\tt F1} and {\tt F2} are two vectors of nucleotide frequencies at equilibrium. These two % sets of frequencies will therefore be estimated during the analysis. \subsection{Setting up mixture and partition models in PhyML: the basics}\index{mixture models}\index{partitionned analysis}\index{data partitions} Mixture models are particularly relevant to the analysis of partitionned data. Indeed, some features of evolution are gene-specific (e.g., substitution rates vary across genes). Models that can accomodate for such variation, as mixture models do, are therefore relevant in this context. However, other evolutionary features are shared across loci (e.g., genes located in the same genomic region usually have similar GC contents). As a consequence, some components of mixture models need to be estimated separately for each partition element while others should be shared by different partition elements. Below is a simple example with a partitionned data set made of two elements, corresponding to the sequence alignment files \x{nucleic1.txt} and \x{nucleic2.txt}. Importantly, the number and names of sequences in these two alignments have to match exactly. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Two sets of branch lengths (one per partition element), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Mixture elements with names \x{R1},$\ldots$, \x{R5} refer to the $\Gamma4+$I model defined previsouly (see Section \ref{sec:XML format}). The \x{} XML component defines a mixture element that had not been introduced before. It defined vectors of branch lengths that apply to the estimated phylogeny. Two instances of such vectors are defined: \x{L1} and \x{L2}. When examining the two partition elements (\x{} component), it appears that \x{L1} is associated with \x{Part1} while \x{L2} is associated with \x{Part2}. Hence, branch lengths will be estimated separately for these two partition elements. Note that a given partition element can only have one {\tt branchlengths} instance associated to it. For instance, the example given below is not valid: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Invalid mixture, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In other words, mixture of branch lengths are forbidden. One reason for this restriction is that mixture of edge lengths sometimes lead to non-identifiable models (i.e., models with distinct sets of branch lengths have the same likelihood) \cite{matsen07}. But mostly, combining mixture of branch lengths with mixture of rates appears like a deadly combination. Consider for instance the following model: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Invalid mixture, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} It is here impossible to tell apart branch lengths and substitution rates. Such model is strongly non-identifiable and therefore not relevant. In the example given above, the same $\Gamma4+$I model (i.e. the same gamma shape parameter and proportion of invariant ) applies to the two partition elements. It is possible to use two distinct $\Gamma4+$I models instead using the following XML code: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Two distinct $\Gamma4+$I models, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \x{SiteRates1} and \x{SiteRates2} here define two distinct $\Gamma4+$I models. Each of these models apply to one of the two partition elements (\x{nucleic1.txt} and \x{nucleic2.txt}), allowing them to display different patterns of rate variation across sites. \subsection{XML options} \subsubsection{{\tt phyml} component}\index{XML options!{\tt phyml} component} Options: \begin{itemize} \item \x{output.file="filename"}. The main output files of PhyML analysis will be named \x{filename\_phyml\_tree} and \x{filename\_phyml\_stats}. \item \x{bootstrap="nreplicates"}. Run \x{nreplicates} replicates for the non-parametric bootstrap analysis. \item \x{run.id="idstring"}. PhyML will append the string \x{idstring} to each output file. \item \x{print.json.trace="yes|true|no|false"}. PhyML will print the estimated trees, the corresponding loglikelihoods and various model parameters at multiple stages of the estimation process. This option is useful for monitoring the progress of the analysis when processing large data sets. \item \x{print.trace="yes|true|no|false"}. PhyML will print the estimated trees (and the corresponding loglikelihoods) at multiple stages of the estimation process. This option is also useful for monitoring the progress of the analysis when processing large data sets. \item \x{branch.test="aBayes|aLRT|SH|no"}. Calculate fast branch support using the aBayes method \cite{anisimova11}, aLRT \cite{anisimova06} or SH \cite{shimodaira99} tests. These branch statistics are much faster to estimate than the bootrap proportions and usually provide good estimates of the probabilities that the corresponding edges are correctly inferred (see Anisimova et al. 2011 for more precision). By default and if no bootstrap analysis is performed, branch supports are estimated using the aBayes approach. \item \x{quiet="yes|no"}. Runs PhyML in quiet mode when \x{quiet=yes}. The program will not pause if the memory required to run the analysis exceeds 256MB and will not output the progresssion of the log-likelihood scores on the standard output. \item \x{memory.check="yes|no"}. By default, when processing a large data set, PhyML will pause and ask the user to confirm that she/he wants to continue with the execution of the analysis despite the large amount of memory required. Setting \x{memory.check=no} skips this question. It is especially useful when running PhyML in batch mode. \end{itemize} \subsubsection{{\tt topology} component}\index{XML options!{\tt topology} component} Each instance of the \x{topology} component (there should be only one...) has the following options: \begin{itemize} \item \x{init.tree="bionj"|"user"|"random"}. Starting tree. Default is \x{bionj}. \item \x{n.rand.starts="X"}. Number of random starting trees. Default is 5. \item \x{file.name="name\_of\_tree\_file"}. In case \x{init.tree="user"}, this attribute is mandatory. \x{name\_of\_tree\_file} is a text file containing a tree in NEWICK format. \item \x{optimise.tree="yes"|"true"|"no"|"false"}. The starting tree topology as defined by \x{init.tree} is to be optimised (or not) so as to maximise the likelihood function. \item \x{search="nni"|"spr"|"none"}. Tree topology search is conducted using NNI (fast), SPR (a bit slower but more accurate) or no moves. \end{itemize} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `topology' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt ratematrices} component}\index{XML options!{\tt ratematrices} component}\label{sec:xmlratematrices} Each instance of a \x{ratematrices} component have the following options: \begin{itemize} \item \x{model="JC69"|"K80"|"F81"|"F84"|"HKY85"|"TN93"|"GTR"|"custom"} for nucleotide data. The default is \x{"HKY85"}.\\ \x{model="LG"|"WAG"|"JTT"|"MtREV"|"Dayhoff"|"DCMut"|"RtREV"|"CpREV"|"VT"}\\\x{|"Blosum62"|"MtMam"|"MtArt"|"HIVw"|"HIVb"|"customaa"} for amino-acid sequences. The default is \x{"LG"}. \item \x{model.code="012345"}. For \x{custom} model applied to nucleotide sequences: set the string of digits that define a custom substitution model. See Table \ref{tab:modelcode} on page \pageref{tab:modelcode} for more information about the model codes. \item \x{ratematrix.code="filename"}. When used in conjunction with \x{model="customaa"}, \x{filename} is the name of the file that gives the rates of substitution between amino-acids as well as their frequences at equilibrium using PAML rate matrix format. An example of such file is provided in {phyml/examples/X1.mat}. \item \x{optimise.rr="yes"|"true"|"no"|"false"}. For \x{custom} and \x{GTR} nucleotide models only: optimise the substitution rate model parameters. \item \x{optimise.tstv="yes"|"true"|"no"|"false"}. For \x{K80}, \x{F84}, \x{HKY85} and \x{TN93} models only: optimise the transition/transversion rate ratio. \item \x{tstv="value"}. For \x{K80}, \x{HKY85} and \x{TN93} models only: set the transition/transversion to a given value. \end{itemize} An instance of a \x{ratematrices} component where a GTR or a custom model of substitutions between nucleotides is used can have a \x{rr} component associated to it in order to specificy the relative rates of substitutions (see example below). Also, the {\tt ratematrices} component has the attribute {\tt optimise.weights=yes/no} (default is {\tt no}). If {\tt optimise.weights=yes}, then the probabilities (or weights) or each matrix in the set of matrices defined by this component (see Equation \ref{equ:weights}), will be estimated from the data. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `ratematrices' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt equfreqs} component}\index{XML options!{\tt equfreqs} component} Each instance of a \x{equfreqs} component has the following options: \begin{itemize} \item \x{base.freqs="a,b,c,d"} where \x{a-d} are nucleotide frequencies. Make sure that these frequencies are separated by comas and no space character is inserted. \item \x{freqs="empirical|model|user|optimized"}. Character frequencies are derived from counting the number of occurence of each amino-acid in the alignment (\x{freqs="empirical"}), given by the substitution model (\x{freqs="model"}), user-defined (\x{freqs="user"}, only available for nucleotide data) or estimated using maximum likelihood (\x{freqs="optimized"}). \end{itemize} The {\tt equfreqs} component has the attribute {\tt optimise.weights=yes/no} (default is {\tt no}). If {\tt optimise.weights=yes}, then the probabilities (or weights) or each vector of equilibrium frequencies in the set of vectors defined by this component (see Equation \ref{equ:weights}), will be estimated from the data. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `equfreqs' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt branchlengths} component}\index{XML options!{\tt branchlengths} component} Options: \begin{itemize} \item \x{optimise.lens="yes"|"true"|"no"|"false"}: branch lengths are optimised or not. The default is set to \x{"yes"}. \end{itemize} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `branchlengths' component, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{{\tt siterates} component}\index{XML options!{\tt siterates} component} Each instance defines a class of relative rate of substitution. It has the following options: \begin{itemize} \item \x{value="val"}, where \x{"val"} is the relative substitution rate for the corresponding class. \end{itemize} A \x{siterates} component generally includes a \x{weights} element that specifies the probabilitic distribution of the relative rates. The available options for such element are: \begin{itemize} \item \x{family="gamma|gamma+inv|freerates"}. \x{gamma} indicates that the distribution of the relative rates is set to be a discrete Gamma density. \x{gamma+inv} indicates that the relative rate model is a mixture of Gamma and invariant sites (this is the common $\Gamma+$I model). FreeRate is a model that does not use any parametric function to describe the distribution of the relative rates (see \cite{soubrier12}). Under this option, relative rates and the corresponding frequencies of these classes are directly estimated from the data. While such approach is slightly more computationally demanding than the $\Gamma$ (or $\Gamma$+I) model, it often provides a significantly better fit to the data. \item \x{alpha="value|optimised"}, where \x{value} is a real positive number. Use this option to set the gamma shape parameter to the selected value. \x{optimised}: the parameter is estimated from the data (see also next option). \item \x{optimise.alpha="yes|true|no|false"}. Optimise the shape of the Gamma distribution of relative rates (or not). \item \x{pinv="value|optimised"}, where \x{value} is in $[0,1]$. Use this option to set the proportion of invariants to the selected value. \x{optimised}: the parameter is estimated from the data (see also next option). \item \x{optimise.pinv="yes|true|no|false"}. Optimise the proportion of invariable sites (or not). \item \x{optimise.freerates="yes|true|no|false"}. Optimise the parameters of the FreeRate model, i.e., the relative rates and the corresponding frequencies. \end{itemize} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `siterates' component (discrete gamma model), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Setting up an analysis using the FreeRate\index{FreeRate} mixture model of rate variation across sites \cite{soubrier12} requires a bit more work. As in the discrete gamma model, the FreeRate model relies on definies classes of (relative) rates. In the discrete gamma model, each class has the same frequency. This is no longer the case with FreeRate. It is thus necessary to specify the frequency, or weight, of each class of rate in the XML file. The example below illustrates how these weights are defined in practice: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `siterates' component (FreeRate model), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} Note that the weights do not have to sum to one. PhyML rescales them before starting the analysis such that these weights are transformed into proper probabilities. The relative rates themselves are rescaled too such that the weighted average (relative) rate is equal to one after rescaling. \subsubsection{{\tt partitionelem} and {\tt mixtureelem} components}\index{XML options!{\tt partitionelem} component}\index{XML options!{\tt mixtureelem} component} Options: \begin{itemize} \item \x{file.name="inputfilename"}, where \x{inputfilename} is the name of the input sequence file (in PHYLIP format) to be analysed. \item \x{data.type="nt|aa"}. Specify the type of sequences to be processed (nucleotide of amino-acid sequences). \item \x{interleaved="yes|true|no|false"}. Interleaved (\x{yes|true}) or sequential format (\x{no|false}) for the sequence alignment. \item \x{optimise.tree.scale="yes|true|no|false"}. The sum of edge length (or tree size) is optimized. This option is relevant when different data partition elements point to the same set of edge lengths so that setting \x{optimise.tree.scale="yes"} will find the optimal ratio of tree sizes considering the two elements. In other words, the different trees all share the same (relative) edge lengths but the corresponding partition elements have different mean rates of substitution. \item \x{tree.scale="val"}. \x{val} is the value of the (relative) substitution rate. By default, its value is set to 1.0. \item \x{print.site.lk="yes|true|no|false"}. The likelihood at each site (and other information) will be written in a file named \x{inputfilename\_phyml\_lk}. \end{itemize} Each \x{partitionelem} element should include exactly four \x{mixtureelem} elements, corresponding to branch lengths, equilibrium frequencies, substitution rate model and tree topology. The ordering of in which the \x{mixtureelem} elements are given does not matter, though exceptions apply for the $\Gamma+I$ model (see below). The $n$-th element in the \x{list} attribute of each \x{mixtureelem} defines the $n$-th class of the mixture model. In the example given below, the first class of the mixture is made of the following elements: \x{T1}, \x{F1}, \x{R1} and \x{L1}, the second class is made of \x{T1}, \x{F1}, \x{R2} and \x{L1}, etc. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `partitionelem' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In general, the ordering of the \x{mixtureelem} elements does not matter. However, when the model has invariable sites, then the corresponding class should be first in the list of classes provided by \x{mixtureelem}. For instance, in the example above, if the rates are defined as follows: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of `siterates' component, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} then \x{R1} corresponds to the invariable rate class (as \x{init.value="0.0"}). As \x{R1} is first in the \x{mixtureelem} (see line 6 in the example of \x{`partionelem'} given above), PhyML will print out an explicit error message and bail out. One way to avoid this shortcoming is to define \x{mixtureelem} as \x{R4, R2, R3, R1} instead. \subsection{Example: GTR + $\Gamma$4 + I} The example below provides all the required options to fit a $\Gamma$4+I model to a single alignment of nucleotide sequences under the GTR model of substitution using a SPR search for the best tree topology. The \x{phyml} component sets the name for the analysis to \x{simple.example}, meaning that each output file will display this particular string of characters. Also, the tree and statistics file names will begin with \x{p1.output}. The tree topology will be estimated so as to maximise the likelihood and the topology search algorithm used here is SPR, as indicated by the value of the corresponding attribute (i.e., \x{search="spr"}). Only one vector of branch lengths will be used here since only one partition element will be processed. Hence, the \x{} component only has one \x{} sub-component. Also, a single GTR model will apply to all the classes for the mixture model -- the \x{} component has only one \x{} sub-component, corresponding to this particular substitution model. The next component, \x{}, indicates that a single vector of equilibrium frequencies will apply here. Next, the \x{} component has five \x{} sub-components. Four of these correspond to the non-zero relative rates of evolution a defined by a discrete Gamma distribution. The last one (\x{}) defines the class of the mixture corresponding to invariable sites. The \x{} component indicates that a $\Gamma+$I model will be fitted here. The shape parameter of the Gamma distribution and the proportion of invariants will be estimated from the data. The \x{} gives information about the sequence alignment (the corresponding file name, the type of data and the alignment format). The \x{} components next define the mixture model. Each class of the fitted model corresponds to one column, with the first column made of the following elements: \x{T1, M1, F1, R1} and \x{L1}. The second class of the mixture is made of \x{T1, M1, F1, R2, L1} and so forth. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Simple PhyML XML example, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsection{Example: LG4X}\index{lg4x} The example below shows how to fit the LG4X model \cite{lg4x} to a given alignment of amino-acid sequences (file \x{M587.nex.Phy}). LG4X is a mixture model with four classes. Each class has its own rate and corresponding frequencies (hence the use of the FreeRate model below, see the \x{} component). In the particular example given here, the rate values and frequencies are set by the users. These parameters will then be optimized by PhyML (\x{optimise.freerates="yes"}). Each class also has its own rate matrix and vector of equilibrium frequencies, which need to be provided by the user (Note that these matrices can be downloaded from the following web address: \url{http://www.atgc-montpellier.fr/download/datasets/models/lg4x/LG4X_4M.txt}. They are also provided in the PhyML package \x{example/lg4x/} directory.) \vspace{0.2cm} \begin{Verbatim}[frame=single, label=LG4X, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} In order to fit the LG4X model to the \x{proteic} sequence file provided in the \x{examples/} directory, simply type \x{./phyml --xml=../examples/lg4x/lg4x.xml} (assuming the PhyML binary is installed in the \x{src/} directory). You can of course slightly tweak the file \x{../examples/lg4x/lg4x.xml} and use it as a template to fit this model to another data set. \subsection{Example: CAT-like model}\index{CAT model} The CAT model \cite{lartillot04} is a mixture model whereby each site may have its own exchangeability rate matrix and vector of state frequencies. In its original exposition, the number of classes in the mixture was also a parameter to be estimated from the data. PhyML uses a fixed number of classes instead. This lesser degree of sophistication facilitates the interpretation of parameter estimates. Examination of the statistics and site-likelihood files produced by PhyML under the CAT-like model makes it indeed straightforward to spot sites with peculiar substitution pattern (e.g., sites that sustained only certain types of substitutions, for instance between purines or between pyrimidines). In the example that follows, the CAT-like model implemented has six rate classes goverened by a FreeRate model. The first and second class share the same GTR matrix (M1) and vector of nucleotide frequencies (F1) (see the two leftmost columns in the assemblage matrix). The third and fourth also share the same GTR matrix (M2) and vector of frequencies (F2) which are estimated independantly from M1 and F1. Finally, the last two classes of the mixture share M3 and F3, which are independant from the other rate matrices and state frequencies. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=CAT, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsection{Example: multiple partition elements} The example below gives the complete XML file to specify the analysis of three partition elements, corresponding to the nucleotide sequence files \x{small\_p1\_pos1.seq}, \x{small\_p1\_pos2.seq} and \x{small\_p1\_pos3.seq} in interleaved PHYLIP format. Importantly, the number and names of sequences in these three alignments match exactly. \x{small\_p1\_pos1.seq} is fitted with the HKY85 model of substitution (with the transition/transversion ratio being estimated from the data), combined to a $\Gamma4$ model of rate variation across sites (with the gamma shape parameter being estimated from the data). \x{small\_p1\_pos2.seq} is fitted to a custom substitution model with the constraint $A\leftrightarrow G$=$C\leftrightarrow T$. The nucleotide frequencies are set to $\frac{1}{4}$ here. The model does not allow substitution rates to vary across sites. \x{small\_p1\_pos3.seq} is fitted using a GTR model conbined to a $\Gamma4+$I model of rate variation across sites. Note that the equilibrium nucleotide frequencies for the fourth and fifth class of the mixture are set to be equal to that estimated from the first partition element (i.e., \x{F1}) . The initial phylogeny is built using BioNJ and the tree topology is to be estimated using a NNI search algorithm. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of PhyML XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of PhyML XML file (ctnd), samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsection{Branch lengths with invariants and partionned data} Accommodating for models with invariable sites applying to some elements of a partitioned data, with these elements sharing the same set of edge lengths can lead to inconsistencies. Consider for instance a partitioned data set with two elements. Assume that these two elements share the same set of edge lengths. Also, consider that GTR+I applies to the first element and HKY applies to the second. Now, the expected number of substitutions per site for the first element of the partition is equal to $(1-p)l$, where $p$ is the estimated proportion of invariants and $l$ is the maximum-likelihood estimate for the length of that specific edge. For the second element of the partition, the expected number of substitutions per site is equal to $l$, rather than $(1-p)l$. While $l$ are common to the two elements, matching the specification of the input model, the actual edge lengths do differ across the two partition elements. Please be aware that, due to the programming structure implemented in PhyML, the program will only return one value here, which will be equal to $(1-p)l$. \section{Citing PhyML} The ``default citation'' for PhyML is: \begin{itemize} \item ``New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0''. Guindon S., Dufayard J.F., Lefort V., Anisimova M., Hordijk W., Gascuel O. 2010, {\it Systematic Biology}, 59(3):307-321 \end{itemize} The ``historic citation'' for PhyML is: \begin{itemize} \item ``A simple, fast and accurate algorithm to estimate large phylogenies by maximum likelihood'' Guindon S., Gascuel O. 2003, {\it Systematic Biology}, 52(5):696-704 \end{itemize} \section{Other programs} PhyML is software package that provides tools to tackle problems other than estimating maximum likelihood phylogenies. Installing these tools and processing data sets is explained is the following sections. \subsection{PhyTime}\index{PhyTime} PhyTime is a program that uses Bayesian sampling techniques to infer phylogenies from the analysis of genetic and fossil data. Edge lengths (and node heights) are expressed in calendar time units as opposed to expected number of substitutions as in PhyML. PhyTime can thus be used to date past evolutionary events. The main original features compared to other software for molecular dating are: \begin{itemize} \item a model of rate evolution whereby rates can vary along each branch (other software consider that the rates of evolution vary from one branch to another but stay constant along any given branch) \cite{guindon13}. \item the opportunity to accomodate for uncertainty in calibration information. A single time constraint can apply to multiple clades with corresponding probabilities as determined from prior analysis of fossil data \cite{guindon18}. \end{itemize} \subsubsection{Installing PhyTime} Compiling PhyTime is straightforward on Unix-like machines (i.e., linux and MacOS systems). PhyTime is not readily available for Windows machines but compilation should be easy on this system too. In the `phyml' directory, where the `src/' and `doc/' directories stand, enter the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-phytime; make clean; make; \end{verbatim} } This set of commands generates a binary file called \x{phytime} which can be found in the `src/' directory. \subsubsection{Running PhyTime} Passing options and running PhyTime on your data set is quite similar to running PhyML using an XML parameter input file, i.e., a typical run would be launched using the following command: \x{./phytime --xml=./dating\_example.xml}, assuming that the \x{phytime} binary file is in the same directory as the XML control file \x{dating\_example.xml}, which happens to be the current directory here. The main differences between PhyML and PhyTime are explained below: \begin{itemize} \item Unlike PhyML, PhyTime requires calibration (along with genetic sequence) data as input. The format for defining the relevant time intervals is described below. \item PhyTime does not allow partitionned (i.e., multigene) analysis yet. \end{itemize} \subsubsection{PhyTime input} As stated above, PhyTime takes as input an XML file very similar to those compatible with PhyML. An example is given thereafter. The first part of the input file (up to the \x{partitionelem} block) corresponds to a standard XML input file for PhyML. Note however that the tag name ``\x{phytime}'' replaces ``\x{phyml}''. The second part is PhyTime-specific. Three new tags can be found here: \x{lineagerates}, \x{clade} and \x{calibration}\index{PhyTime!calibration}. The \x{lineagerates}\index{PhyTime!lineagerates} element is used to define the model of rate variation across lineages. Its only attribute is \x{model} which can take the following values: \begin{itemize} \item \x{model=strictclock} or \x{model=clock} implements the strict clock model, i.e., all lineages evolve at the same instantaneous rate, at any point in time. \item \x{model=lognormal} or \x{model=normal}. The logarithm of the average rate along each branch is distributed as a normal distribution. The mean and variance of this distribution are the same for all branches. More precisely, let $R_b$ be the average rate of substitution along edge $b$. We have $R_b=X_b\cdot \mu$, where $\mu$ is the ``baseline'' (or average over lineages) rate of substitution and $X_b$ is thus the branch-specific {\em relative} rate of substitution. The lognormal model has $\log(X_b) \sim \mathcal{N}(1,\nu)$, i.e., the logarithm of the relative rate is normally distributed with mean (mode and median) set to 1.0 and standard deviation equal to $\nu$. \item \x{model=geometricbrownian} or \x{model=brownian} or \x{model=geo}. The logarithm of the rate of substitution evolves according to a Brownian motion process along the tree. More precisely, the logarithm of the rate of evolution at the end of edge $b$, noted as $Y_b^{\text{stop}}=\log(R_b^{\text{stop}})$, is normally distributed with variance $v := \nu \cdot \Delta t_b$, where $\Delta t_b$ is the (calendar) time elapsed along edge $b$, and mean equal to $Y_b^{\text{start}}-\frac{1}{2} v$, so that $\Ex(R_b^{\text{stop}})=\Ex(R_b^{\text{start}})$. Under the geometric Brownian motion model, the average rate of evolution is also random. This variability is taken into account in the calculation of the transition between nucleotides or amino-acids along edges. See Guindon, 2012, {\em Syst. Biol.} for more information. \end{itemize} The \x{clade}\index{PhyTime!clade} element is used to define a subset of taxa. Each of these taxa is given in a \x{taxon} element. The value that each taxon takes is a string corresponding to the name of one of the sequences in the alignment file. In the example that follows, \x{Gymno\_Araucaria}, \x{Gymno\_Ginko}, \x{Gymno\_Juniperus} and \x{Gymno\_Juniperus} are three taxa that define a clade called \x{Gymno1}. Note that this clade may not be monophyletic. In fact, it is not considered as such (i.e., monophyletic) during the inference. The second important element is \x{calibration}. It defines time intervals corresponding to the time of diversification (i.e., the time of the most recent common ancestor) of the set of taxa the calibration points to. In other words, a given time interval defines the calibration for the timing of the crown node of a given clade. Each interval is defined using the \x{upper} and \x{lower} tags. The upper (resp. lower) bound for each interval is a date expressed in any unit you fancy. \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Example of PhyTime XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \begin{Verbatim}[frame=single, label=Example of PhyTime XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] 40 60 50 200 \end{Verbatim} \subsubsection{Accounting for calibration uncertainty} It is not always obvious to determine with full precision and accuracy where in the tree a given fossil branches in {\em a priori}. For instance, a first morphological feature of an ancestral (fossilized) species might be shared by species A but not B nor C, while a second feature might be displayed by A and B but not C. Assuming for simplicity that the true tree topology is ((A,B),C), then the first feature calibrates the most recent common ancestor (MRCA)\index{MRCA} of A and B. Indeed, this ancestor cannot be younger than the fossil itself because, if this was the case, then A {\em and} B would display the morphological feature of interest. In a similar fashion, the second feature suggests that the calibration should instead apply to the MRCA of A, B and C. Therefore, assuming that the fossil was discovered in a well-defined geological layer which age range is known without ambiguity, there is still uncertainty around the node in the tree this time interval calibrates. In the particular example given above, it is not clear whether the calibration constraints applies to the node corresponding to the MRCA of A and B, or the root of the tree. PhyTime accomodates for this uncertainty by giving a probability to the two scenari: with probability $\alpha$ the calibration time interval applies to the MRCA of species A and B and with probability $1-\alpha$, this interval calibrates the age of the MRCA of A, B and C. It is fairly straightforward to set up an analysis that incorporates probabilistic distributions on calibrations in PhyTime. The section of the XML file below gives a simple example whereby the calibration ``\x{cal1}'' applies to clade ``\x{Gymno1}'' (i.e., the smallest clade in the tree that displays the four corresponding taxa) with probability 0.8 and to clade ``\x{Gymno2}'' with probability 0.2. Also, calibration \x{cal2} applies to ``\x{Gymno1}'' with probability 1.0, which is implicit here and thus does not need to be specified in the XML file. \begin{Verbatim}[frame=single, label=Calibrating with uncertainty, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] 40 60 50 200 \end{Verbatim} Note that in this example, it can be the case that both \x{cal1} and \x{cal2} apply to the same clade (\x{Gymno1}). In that particular situation, the actual calibration interval is conservative and derives from the overlap of the two calibration time intervals (one corresponding to \x{cal1}, the other to \x{cal2}). The MRCA of \x{Gymno\_Araucaria}, \x{Gymno\_Ginko}, \x{Gymno\_Juniperus} and \x{Gymno\_Juniperus} has an age that falls here in the $[50,60]$ interval. \subsubsection{MCMC settings}\label{sec:phytimesettings} PhyTime estimates the joint posterior distribution of the phylogenetic model parameters using an MCMC algorithm. This algorithm relies on sampling values of these parameters iteratively. The default number of iterations is fixed to 1E+07 and values of parameters are recorded every 1E+03 iteration of the MCMC algorithm. The burn-in period, during which tuning parameters of the MCMC as adjusted, lasts for 1E+04 iterations. These three parameters can be modified by setting the values of the attributes \x{mcmc.chain.len}, \x{mcmc.sample.every} and \x{mcmc.burnin} in the XML parameter file accordingly. For instance, the first line of this file could look as follows: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=MCMC settings, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} The majority of analyses will not warrant 1E+07 iterations to converge to the target distribution (i.e., converge to the solution). I thus recommend monitoring each analysis by loading on a regular basis the statistics output file produced by PhyTime and interrupt the analysis once the effective sample sizes of all parameters have reached 200. The MCMC algorithm implemented in PhyTime relies on multiple operators that update different parameters, or the same parameter in different ways. The weights of these operators, i.e., the frequency with which they are applied, were adjusted for the analysis of the plant data set described in \cite{guindon18}. If you think these default values are not suitable for your own analysis, please feel free to have a look at the function \x{MCMC\_Complete\_MCMC} in the file \x{mcmc.c} to make the appropriate changes to the values of \x{mcmc->move\_weight[XXX]}, where \x{XXX} is the name of the operator. Alternatively, you might want to send me an email (\url{guindon@lirmm.fr}) if you are unsure about all this. It is generally very useful to compare the posterior estimates of model parameters to that obtained from a sampler that ignores sequence data (i.e., the Bayesian sampler only takes as input data the calibration information). Such analysis helps quantifying how sensitive are the marginal posterior estimates to the estimates one would get prior collecting and analysing genetic sequences. The attribute \x{ignore.sequences} used in the \x{phytime} tag permits to run such analysis. The first lines of a corresponding XML file would then look as follows: \vspace{0.2cm} \begin{Verbatim}[frame=single, label=Sampling from the prior in PhyTime, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] \end{Verbatim} \subsubsection{PhyTime output} The program PhyTime generates two output files. The statistics file is called `\x{outputfile\_phytime\_stats\_runid.txt}'. It lists the node times and (relative) substitution rates on edges sampled during the estimation process. It also gives the sampled values for other parameters, such as the autocorrelation of rates (parameter `nu'), and the rate of evolution (parameter `clock') amongst others. This output file can be analysed with the program Tracer\index{Tracer} from the BEAST\index{BEAST} package (\url{http://beast.bio.ed.ac.uk/Main_Page}) or Icylog (\url{http://tgvaughan.github.io/icylog/}\index{Icylog}). It is also possible to process this file using R here. Section \ref{sec:phytimeexample} of this document gives more information about the statistics output file. The second file is called `\x{outputfile\_phytime\_trees\_runid.txt}'. It is the list of rooted trees that were collected during the estimation process, i.e., phylogenies sampled from the posterior density of trees. This file can be processed using the software TreeAnnotator, also part of the BEAST package (see \url{http://beast.bio.ed.ac.uk/Main_Page}) in order to generate confidence sets for the node time estimates. \subsubsection{An example of PhyTime input and output files}\label{sec:phytimeexample} The directory \x{phyml/examples/phytime/} provides a sequence alignment (\x{seq.txt}) and an XML input file (\x{dating\_example.xml}) that can be used to run an analysis (using the following command: \x{phytime --xml=dating\_example.xml}). The XML file is very similar to that described above and will thus not be discussed further. The columns of the statistics output file are as follows: \begin{itemize} \item \x{sample}: the index of the iteration in the MCMC algorithm. For instance, a sample value of 100 means that 100 ``moves'' in the MCMC have been applied so far, one such move can correspond to an attempt to modify the tree topology, or height of some internal nodes, etc. \item \x{lnL(posterior)}: the logarithm of the posterior density of the current model parameters. It is this function that the MCMC attempts to get samples from. \item \x{lnL(seq)}: the logarithm of the conditional probability of the sequence alignment given the current model parameters. \item \x{lnL(times)}: the logarithm of the probability density of the phylogeny evaluated under the birth and death branching process. \item \x{lnL(rates)}: the logarithm of the probability density of the relative substitution rates along every edge of the current phylogeny. \item \x{birth}: sampled values of the birth parameter. Histogram of these values provide an estimate of the marginal posterior distribution for this parameter. \item \x{death}: death parameter for the birth-death branching process. \item \x{clock}: mean rate of substitution. \item \x{root}: age of the root node, i.e. the MRCA of all taxa in the sample. \item \x{tstv}: transition/transversion ratio (the substitution model used here is HKY, as selected in the \x{param.xml} file). \item \x{nu}: rate autocorrelation parameter. \item \x{rr0}, \x{rr1}, \x{rr2}, \x{pr0}, \x{pr1}, \x{pr2}: relative rate of substitution and the corresponding frequencies. The mixture model of rate variation used in this analysis is the FreeRate model \cite{soubrier12} with three rate classes. These columns give the values of these six parameters (though there are only four free parameters) sampled from the target (posterior) distribution. \item \x{t(calib:cal1\_clade:Gymno1)}: sampled age of the MRCA of \x{Gymno1} when calibration \x{cal1} applies to this particular node. \item \x{t(calib:cal1\_clade:Gymno2)}: sampled age of the MRCA of \x{Gymno2} when calibration \x{cal1} applies to this node. \item \x{t(calib:cal2\_clade:Gymno1)}: sampled age of the MRCA of \x{Gymno1} when calibration \x{cal12} applies to this node. \item \x{clade(calib:cal1)}: the clade id (\x{Gymno1} or \x{Gymno2}) calibration \x{cal1} applies to (0 for \x{Gymno1} and 1 for \x{Gymno2}). \item \x{clade(calib:cal2)}: the clade id calibration \x{cal2} applies to. \item \x{br0}, $\ldots$, \x{br41}: relative rate on all edges in the tree. \item \x{t22}, $\ldots$, \x{t42}: ages of all internal nodes. \item The remaining columns provides information about the acceptance rate of various operators in the MCMC and the corresponding tuning parameters. \end{itemize} The script below can be copied and pasted into R in order to produce the plots in Figure \ref{fig:phytimetrace} (assuming R was launched from the \x{phyml/examples/phytime} directory). The two plots at the top left and center give the trace of the node age of the MRCA of \x{Gymno1} when calibration \x{cal1} applies to it (left) and that of \x{Gymno2} when the same calibration \x{cal1} applies to it (centre). The plot on the top right gives the clade (which of \x{Gymno1} or \x{Gymno2}) the calibration \x{cal1} applies to. The analysis of these plots shows the impact of applying the calibration constraint \x{cal1} to \x{Gymno1} and \x{Gymno2} alternatively. When \x{cal1} applies to \x{Gymno2} (i.e., ({\em Gymno Araucaria}, {\em Gymno Juniperus}, {\em Gymno Sciadopitys})) the age of the MRCA of \x{Gymno1} ((i.e., ({\em Gymno\_Ginkgo}, {\em Gymno Araucaria}, {\em Gymno Juniperus}, {\em Gymno Sciadopitys}) is free to wander towards older values compared to the situation where both \x{cal1} and \x{cal2} apply to \x{Gymno1}. The age of the MRCA of \x{Gymno2} is here bound to fall in the $[40,60]$ time interval. When \x{cal1} applies to \x{Gymno1} instead, then the MRCA of that clade has to fall in the $[50,60]$ interval, while that of \x{Gymno2} has to be younger than the MRCA of \x{Gymno1}. \begin{Verbatim}[frame=single, label=R script to produce traces from the PhyTime statistics file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] file=paste("out_phytime_stats_June2018.txt",sep=""); d=read.table(file,header=T); idx=floor(0.1*length(d$sample)):length(d$sample) par(mfrow=c(2,3),mar=c(5,4,2,2)); plot(d$sample[idx],d$t.calib.cal1_clade.Gymno1.[idx],type="l", col="red",ylab="Time",xlab="Sample",main="Time Gymno1") plot(d$sample[idx],d$t.calib.cal1_clade.Gymno2.[idx],type="l", col="red",ylab="Time",xlab="Sample",main="Time Gymno2") plot(d$sample[idx],d$clade.calib.cal1.[idx],type="l",col="black", ylab="Clade",xlab="Sample",main="(0->Gymno1, 1->Gymno2)") plot(d$sample[idx],d$lnL.seq.[idx],type="l",col="orange", ylab="log(Probability)",xlab="Sample",main="Likelihood sequences") plot(d$sample[idx],d$lnL.posterior.[idx],type="l",col="orange", ylab="log(density)",xlab="Sample",main="Joint posterior") plot(d$sample[idx],d$lnL.times.[idx],type="l",col="orange", ylab="log(density)",xlab="Sample",main="Branching process") \end{Verbatim} \begin{figure} \begin{center} \includegraphics[width=13.8cm]{./fig/phytimetrace} \end{center} \caption{{\bf Traces from the statistics output file produced by PhyTime.}} \label{fig:phytimetrace} \end{figure} % Important information is also displayed on the standard output of PhyTime (the standard output % generally corresponds to the terminal window from which PhyTime was launched). The first column of % this output gives the current generation, or run, of the chain. It starts at 1 and goes up to 1E+7 % by default. The second column gives the time elapsed in seconds since the sampling began. The % third column gives the log likelihood of the phylogenetic model (i.e., `Felsenstein's % likelihood'). The fourth column gives the logarithm of the joint prior probability of substitution % rates along the tree and node heights. The fifth column gives the current sampled value of the % EvolRate parameter along with the corresponding Effective Sample Size (ESS) for this parameter. % The sixth column gives the tree height and the corresponding ESS. The seventh column gives % the value of the autocorrelation parameter followed by the corresponding ESS. The eightth column % gives the values of the birth rate parameter that governs the birth-rate model of species % divergence dates. The last column of the standard output gives the minimum of the ESS values % taken over the whole set of node height estimates. It provides useful information when one has % to decide whether or not the sample size is large enough to draw valid conclusion, i.e., decide % whether the chain was run for long enough (see Section \ref{sec:recomphytime} for more detail about % adequate chain length). % \subsubsection{ClockRate vs. EvolRate} % The average rate of evolution along a branch is broken into two components. One is called ClockRate % and is the same throughout the tree. The other is called EvolRate and corresponds to a weighted % average of branch-specific rates. The model of rate evolution implemented in PhyTime forces the % branch-specific rate values to be greater than one. As a consequence, ClockRate is usually smaller % EvolRate. % In more mathematical terms, let $\mu$ be the value of ClockRate, $r_i$ be the value of the relative % rate along branch $i$ and $\Delta_i$ the time elapsed along branch $i$. The value of EvolRate is % then given by: % \begin{eqnarray*} % \mathrm{EvolRate} = \mu \frac{\sum_{i}^{2n-3} r_i \Delta_i}{\sum_{i}^{2n-3} \Delta_i}. % \end{eqnarray*} It is clear from this equation that multiplying each $r_i$ by a constant and % dividing $\mu$ by the same constant does not change the value of EvolRate. The $r_i$s and $\mu$ % are then confounded, or non-identifiable, and only the value of EvolRate can be estimated from % the data. {\color{red}{Please make sure that you use the value of EvolRate rather than that of % ClockRate when referring to the estimate of the substitution rate}}. % \subsubsection{Effective sample size}\label{sec:ess} % The MCMC technique generates samples from a target distribution (in our case, the joint posterior % density of parameters). Due to the Markovian nature of the method, these samples are not % independent. The ESS is the estimated number of independent measurements obtained from a set of % (usually dependent) measurements. It is calculated using the following formula: % \begin{eqnarray*} % \mathrm{ESS} = N\left(\frac{1-r}{1+r}\right), % \end{eqnarray*} % where $N$ is the length of the chain (i.e., the `raw' or `correlated' sample size) and $r$ is the % autocorrelation value, which is obtained using the following formula: % \begin{eqnarray*} % r = \frac{1}{(N-k)\sigma_x^2} \sum_{i=1}^{N-k} (X_i - \mu_x)(X_{i+k}-\mu_x), % \end{eqnarray*} where $\mu_x$ and $\sigma_x$ are the mean and standard deviation of the $X_i$ values % respectively and $k$ is the lag. The value of $r$ that is used in PhyTime corresponds to the case where $k=1$, % which therefore gives a first order approximation of the `average' autocorrelation value (i.e., the % autocorrelation averaged over the set of possible values of the lag). % \subsubsection{Prior distributions of model parameters}\label{sec:prior} % Any Bayesian analysis requires specifying a prior distribution of model parameters. The outcome of % the data analysis, i.e., the posterior distribution, is influenced by the priors. It is especially % true if the signal conveyed by the data is weak. While some have argued that the specification of % priors relies more on arbitrary decisions than sound scientific reasoning, choosing relevant prior % distributions is in fact fully integrated in the process of building model that generates the % observed data. In particular, the problem of estimating divergence times naturally lends itself to % hierarchical Bayesian modelling. Based on the hypothesis that rates of evolution are conserved (to % some extant) throughout the course of evolution, the hierarchical Bayesian approach provides an % adequate framework for inferring substitution rates and divergence dates separately. Hence, in this % situation, it makes good sense to use what is known about a relatively well-defined feature of the % evolution of genetic sequences (the ``molecular clock'' hypothesis combined to stochastic variations of % rates across lineages) to build a prior distribution on rates along edges. \subsubsection{Citing PhyTime}\label{sec:citephytime} The ``default citation'' is: \begin{itemize} \item Guindon S. ``From trajectories to averages: an improved description of the heterogeneity of substitution rates along lineages'', {\it Systematic Biology}, 2013. 62(1): 22-34. \end{itemize} If you are using mutliple calibrations on a given clade, please cite the following article: \begin{itemize} \item Guindon S. ``Accounting for calibration uncertainty: Bayesian molecular dating as a ``doubly intractable'' problem'', {\it Systematic Biology}, 2018. 67(4): 651-661. \end{itemize} An earlier article also describes some of the methods implemented in PhyTime: \begin{itemize} \item Guindon S. ``Bayesian estimation of divergence times from large data sets'', {\it Molecular Biology and Evolution}, 2010, 27(8):1768:81. \end{itemize} \subsection{PhyloGeo}\index{PhyloGeo} PhyloGeo is a program that implements the competition-dispersal phylogeography model described in Ranjard, Welch, Paturel and Guindon ``Modelling competition and dispersal in a statistical phylogeographic framework''. Accepted for publication in {\it Systematic Biology}. It implements a Markov Chain Monte Carlo approach that samples from the posterior distribution of the three parameters of interest in this model, namely the competition intensity $\lambda$, the dispersal bias parameter $\sigma$ and the overal dispersal rate $\tau$. The data consist in a phylogeny with node heights proportional to their ages and geographical locations for evety taxon in this tree. An important assumption of the model is that each node in the phylogeny corresponds to a speciation {\em and} a dispersal event. As a consequence, this model does not authorize a given taxon to occupy more than one locations. Note however that the converse is not true: a given location can be occupied by several different taxa. \subsubsection{Installing PhyloGeo} Compiling PhyloGeo is straightforward on Unix-like machines (i.e., linux and MacOS systems). PhyloGeo is not readily available for Windows machines but compilation should be easy on this system too. In the `phyml' directory, where the `src/' and `doc/' directories stand, enter the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-geo; make clean; make; \end{verbatim} } This set of commands generates a binary file called \x{phylogeo} which can be found in the `src/' directory. \subsubsection{Running PhyloGeo} PhyloGeo takes as input a rooted tree file in Newick format and a file with geographical locations for all the tips of the phylogeny. Here is an example of valid tree and the corresponding spatial locations just below: \begin{scriptsize} \begin{Verbatim}[frame=single, label=Valid PhyloGeo input tree, samepage=true, baselinestretch=0.5] (((unicaA:1.30202,unicaB:1.30202):1.34596,(((nitidaC:0.94617,(nitidaA:0.31497, nitidaB:0.31497):0.63120):0.18955,(((mauiensisA:0.00370,mauiensisB:0.00370):0.20068, (pilimauiensisA:0.05151,pilimauiensisB:0.05151):0.15287):0.78769,(brunneaA:0.10582, brunneaB:0.10582):0.88625):0.14365):0.80126,(((molokaiensisA:0.03728, molokaiensisB:0.03728):0.71371,(deplanataA:0.01814,deplanataB:0.01814):0.73285):0.34764, ((parvulaA:0.20487,parvulaB:0.20487):0.40191,(kauaiensisA:0.24276, kauaiensisB:0.24276):0.36401):0.49186):0.83835):0.71099):1.38043, (nihoaA:0.05673,nihoaB:0.05673):3.97168); \end{Verbatim} \begin{Verbatim}[frame=single, label=Valid PhyloGeo spatial location file, samepage=true, baselinestretch=0.5] nihoaA 23.062222 161.926111 nihoaB 23.062222 161.926111 kauaiensisA 22.0644445 159.5455555 kauaiensisB 22.0644445 159.5455555 unicaA 21.436875 158.0524305 unicaB 21.436875 158.0524305 parvulaA 21.436875 158.0524305 parvulaB 21.436875 158.0524305 molokaiensisA 20.90532 156.6499 molokaiensisB 20.90532 156.6499 deplanataA 20.90532 156.6499 deplanataB 20.90532 156.6499 brunneaA 20.90532 156.6499 brunneaB 20.90532 156.6499 mauiensisA 20.90532 156.6499 mauiensisB 20.90532 156.6499 pilimauiensisA 20.90532 156.6499 pilimauiensisB 20.90532 156.6499 nitidaA 19.7362 155.6069 nitidaB 19.7362 155.6069 nitidaC 19.7362 155.6069 \end{Verbatim} \end{scriptsize} In order to run PhyloGeo, enter the following command: \x{./phylogeo ./tree\_file ./spatial\_location\_file > phylogeo\_output}. PhyloGeo will then print out the sampled values of the model parameters in the file \x{phylogeo\_output}. This file can then be used to generate the marginal posterior densities of the model parameters. In particular, evidence for competition corresponds to value of $\lambda$ smaller than 1.0. Please see the original article for more information on how to interpret the model parameters. \subsubsection{Citing PhyloGeo}\label{sec:citephylogeo} Ranjard, L., Welch D., Paturel M. and Guindon S. ``Modelling competition and dispersal in a statistical phylogeographic framework''. 2014. Systematic Biology. \subsection{PhyREX} \index{PhyREX}PhyREX is a program that is part of the PhyML package which implements phylogeographic models, i.e., models that analyse geo-referenced genetic sequences so as to infer the rate of diffusion of lineages in space along with other parameters of biological interest. Previous versions of PhyREX implemented the {\bf spatial $\Lambda$-Fleming-Viot model} \cite{etheridge2008,berestycki2009,barton2010,barton2010b,veber2012,barton2013} or \sfv\ for short. This model can be thought of as a structured-coalescent where space is considered as continuous rather than organized into separate demes. Under the \sfv\ model, the spatial distribution of individuals in a population is uniform and does not change during the course of evolution, as opposed to other models such as the very popular isolation by distance model proposed by Wright and Mal\'ecot. The \sfv\ model does not suffer from the ``pain in the torus'' \cite{felsenstein1975} and clumps of individuals with increasing densities do not arise. Also, estimates of migration parameters are not sensitive to variation in sampling intensities across regions, unlike ``mugration'' or ``discrete trait analysis'' models \cite{lemey2009}. PhyREX implements an original data augmentation technique embedded in a Bayesian sampler to estimate two important biological parameters: the neighorhood size ($\mathcal{N}$) and the dispersal intensity ($\sigma^2$). These two parameters are closely related to the effective size of the population of interest per unit area since $\mathcal{N}$ is defined as follows: $\mathcal{N} := 4\pi \rho_e \sigma^2$, where $\rho_e$ is the effective population density. Instead of the \sfv\ process, more recent releases of PhyREX implement various versions of the {\bf Relaxed Random Walk} (RRW) model \cite{lemey2010}\index{RRW (model)}. This approach relies on a Brownian diffusion process running along the phylogeny that governs the random fluctuations of 2d-coordinates during the course of evolution. As opposed to the \sfv\ model, the RRW approach is not mechanistic in the sense that it is not built on biological hypotheses about the migration and reproduction process at at the individual level. Yet, it defines a flexible framework to model the dispersal of organisms and is able, at least in principle, to capture important features of the underlying processes. \subsubsection{Installing PhyREX} Compiling PhyREX is straightforward on Unix-like machines (i.e., linux and MacOS systems). PhyREX is not readily available for Windows machines but compilation should be easy on this system too. In the `phyml' directory, where the `src/' and `doc/' directories stand, enter the following commands: {\setlength{\baselineskip}{0.5\baselineskip} \begin{verbatim} ./configure --enable-phyrex; make clean; make; \end{verbatim} } This set of commands generates a binary file called \x{phyrex} which can be found in the `src/' directory. \subsubsection{Running PhyREX} Example input files for PhyREX can be found in the \x{examples/phyrex/} directory. PhyREX takes as input a XML file (See Section \ref{sec:xmlio}), in a PhyML-compatible format. This file defines the models and various parameter settings for conducting an analysis. We give more information below about this file. The XML file gives the names of a sequence alignment file in the standard PHYLIP (or NEXUS) format along with a file providing the spatial coordinates of the corresponding sequences. An example of the coordinates file is given below: \begin{Verbatim}[frame=single, label=Valid PhyREX spatial location file, samepage=true, baselinestretch=0.5] # state.name lat lon |SouthWest| 0 0 |NorthEast| 10 10 levosl 5.082206 4.133893 kmgcwv 5.914294 4.603446 uhfwja 4.990937 4.445124 ndmwkc 5.178017 4.442268 jpadex 3.747484 4.571090 lqcdcw 7.081925 5.133123 wnsbtg 4.164588 4.720346 ptwgnn 5.711159 4.462993 jhqdsm 3.539525 4.537706 vlnoes 4.613251 4.470530 pfrnpk 4.117791 4.489819 elwdvr 5.649958 4.824092 lptxiv 4.563302 4.005124 \end{Verbatim} This first column in this file gives the sequence names, the second is the latitude and the third column gives the longitude. The first row in this file gives the names of the columns. It starts with the `\#' character signaling a comment. The second and third rows define the limits of the population's habitat. At the moment, this habitat is assumed to be a rectangle. The position in space of that rectangle are determined by the coordinates of the bottom-left corner (\x{|SouthWest| 0 0}) and the top-right one (\x{|NorthEast| 10 10}). The `\x{|}' characters help identify the terms in the list of coordinate corresponding indeed to these two particular points and should thus not be omitted. The geographical limits of the habitat are considered as data under the \sfv\ model while they are ignored under the RRW model (although one needs to define these coordinates such that all samples are located within the corresponding rectangle). The following rows give the coordinates of each taxon. Every taxon in the sequence file should also be listed in the coordinate file. Below is an excerpt of a XML file that can be used as input to run a PhyREX analysis. The phylogeographic model parameters are estimated using a Bayesian sampler which hyperparameters (number of samples, frequency at which samples are collected, length of the ``burnin'' phase, etc.) are set through the corresponding XML attributes (see \ref{sec:phytimesettings}). Below is the list of the main options : \begin{itemize} \item {\em Evolution of spatial coordinates along the tree.} \x{} component. This is the part where the RRW model is parametrized. Users need to specify what probabilistic distribution is to be used in order to model the variation of the spatial dispersal rates across lineages. Using \x{name="rw"} implements a ``strict'' random walk, i.e., the dispersal rate is the same throughout the whole tree. \x{name="rrw+gamma"} and \x{name="rrw+lognormal"} implements the relaxed random walk model using a gamma or a lognormal distribution of the relative rate of dispersal respectively. The modes of these distributions is set to one and the standard deviation is fixed to 2.0. The dispersal rate itself is a composite parameter that is estimated from the data. Each spatial dimension, corresponding to the North-South and East-West axes, has its own dispersal parameter. The prior distribution that applies to each of these two parameter is an exponential distribution with mean defined by the user through the \x{dispersal.prior.mean} attribute. Finally, the \x{sampling} attribute is either \x{survey} or \x{detection} (default). This attribute specifies the spatial sampling scheme. \x{detection} corresponds to the case where sampling is proportional to the underlying population spatial density (i.e., the most densely populated areas are also the most sampled ones). \x{survey} corresponds to the situation where sampling and population densities are decoupled, corresponding to situations where some areas of the habitat are easier to access for instance. \item {\em Substitution rate (a.k.a., clock rate).} \x{} component. In case all sequences were collected at (approximately) the same time, it is recommended to set the average rate of evolution to a specific value (\x{}). It is also possible to apply a lognormal prior on the clock rate with mean parameter and variance defined as in the following example: \x{}. With serially-sampled data, the average rate of evolution can be estimated directly from the data and setting it to a particular value or using an informative prior is not mandatory. \item {\em Variation of rates across lineages (a.k.a. relaxed clock\index{relaxed clock (model)}).} \x{} component. PhyREX is similar to PhyTime in the sense that substitution rates and times are separate parameters. The rates can vary across lineages (using for instance a log-normal model: \x{}) or not (strict clock: \x{}). Finally, it is necessary to give information about the time at which each sequence was collected. This is done through seeting appropriate calibration constraints. From a technical perspective, these constraints apply to clades where each clade here is a single tip. \item {\em Tree generating model.} \x{} component. Using \x{model="coalescent"} fits a coalescent model to the data. If no other options are given, Kingman's coalescent is used. Using \x{powgrowth="yes"} fits a coalescent where the population size varies according to a power function $N(t) = N_e(t+1)^{-g}$ where $N_e$ is the effective population size at time $t=0$ and $g$ is the growth parameter, which is to be estimated from the data. Using \x{expgrowth="yes"} fits a coalescent where the population size varies according to an exponential function $N(t) = N_ee^{-gt}$. The prior distribution on the growth parameter $g$ is exponential with mean set through the \x{neff.prior.mean} attribute value. \end{itemize} \begin{Verbatim}[frame=single, label=Example (excerpt) of PhyREX XML file, samepage=true, baselinestretch=0.5, fontsize=\small, numbers=left] <-- File where 2-D spatial coordinates are found --> 0 0 10 10 \end{Verbatim} PhyREX generates correlated samples from the posterior distribution of the \sfv\ model parameters. The estimated distributions and related summary statistics can be monitored during the analysis using the MCMC vizualization software Icylog or Tracer. Most of the names of the sampled parameters are self-explanatory but some of them (listed below) require more explanations: \begin{itemize} \item \texttt{lnPost}: log-posterior density. \item \texttt{lnAlgn}: logarithm of the probability of the sequence alignment given the current tree. \item \texttt{lnSpac}: logarithm of the probability density of the location data given the current tree. \item \texttt{lnRate}: logarithm of the probability density of the substitution rates along the tree. \item \texttt{lnTime}: logarithm of the probability density of the tree given the tree-generating model. \item \texttt{substRate}: substitution rate. \item \texttt{siqSqLon}: diffusion rate along the East-West axis. \item \texttt{siqSqLat}: diffusion rate along the North-South axis. \item \texttt{nEff}: effective population size. \item \texttt{growth}: coalescent population growth parameter. \item \texttt{dispDistAlt}: effective diffusion rate (average number of kilometers covered in one unit of time). \item \texttt{rootTime}: calendar time corresponding to the MRCA node. \item \texttt{rootLon}: longitude of the root node location. \item \texttt{rootLat}: latitude of the root node location. \end{itemize} If you are unsure about the precise definition of one of these parameters or have any questions regarding how to interpret the results returned by PhyREX, please do not hesitate to contact me (\url{guindon@lirmm.fr}). % \begin{figure} % \begin{center} % \includegraphics[width=13.8cm]{./fig/phyrexlog} % \end{center} % \caption{{\bf Statistics file generated by PhyREX and loaded on Icylog % (\url{http://tgvaughan.github.io/icylog/icylog.html}).} The traces for the neighborhood size % (top) and % the dispersal intensity (bottom) are shown here.} % \label{fig:phyrextrace} % \end{figure} \subsubsection{Citing PhyREX} The ``default citation'' is: \begin{itemize} \item Guindon S., H Guo, D Welch. ``Demographic inference under the coalescent in a spatial continuum'', {\it Theoretical Population Biology}, 2016, 111:43-50. \end{itemize} \section{Recommendations on program usage}\label{sec:progusage} \subsection{PhyML} The choice of the tree searching algorithm among those provided by PhyML is generally a tough one. The fastest option relies on local and simultaneous modifications of the phylogeny using NNI moves. More thorough explorations of the space of topologies are also available through the SPR options. As these two classes of tree topology moves involve different computational burdens, it is important to determine which option is the most suitable for the type of data set or analysis one wants to perform. Below is a list of recommendations for typical phylogenetic analyses. \begin{enumerate} \item {\em Single data set, unlimited computing time.} The best option here is probably to use a SPR search (i.e., straight SPR of best of SPR and NNI). If the focus is on estimating the relationships between species, it is a good idea to use more than one starting tree to decrease the chance of getting stuck in a local maximum of the likelihood function. Using NNIs is appropriate if the analysis does not mainly focus on estimating the evolutionary relationships between species (e.g. a tree is needed to estimate the parameters of codon-based models later on). Branch supports can be estimated using bootstrap and approximate likelihood ratios. \item {\em Single data set, restricted computing time.} The three tree searching options can be used depending on the computing time available and the size of the data set. For small data sets (i.e., $<$ 50 sequences), NNI will generally perform well provided that the phylogenetic signal is strong. It is relevant to estimate a first tree using NNI moves and examine the reconstructed phylogeny in order to have a rough idea of the strength of the phylogenetic signal (the presence of small internal branch lengths is generally considered as a sign of a weak phylogenetic signal, specially when sequences are short). For larger data sets ($>$ 50 sequences), a SPR search is recommended if there are good evidence of a lack of phylogenetic signal. Bootstrap analysis will generally involve large computational burdens. Estimating branch supports using approximate likelihood ratios therefore provides an interesting alternative here. \item {\em Multiple data sets, unlimited computing time.} Comparative genomic analyses sometimes rely on building phylogenies from the analysis of a large number of gene families. Here again, the NNI option is the most relevant if the focus is not on recovering the most accurate picture of the evolutionary relationships between species. Slower SPR-based heuristics should be used when the topology of the tree is an important parameter of the analysis (e.g., identification of horizontally transferred genes using phylogenetic tree comparisons). Internal branch support is generally not a crucial parameter of the multiple data set analyses. Using approximate likelihood ratio is probably the best choice here. \item {\em Multiple data sets, limited computing time.} The large amount of data to be processed in a limited time generally requires the use of the fastest tree searching and branch support estimation methods Hence, NNI and approximate likelihood ratios rather than SPR and non-parametric bootstrap are generally the most appropriate here. \end{enumerate} Another important point is the choice of the substitution model. While default options generally provide acceptable results, it is often warranted to perform a pre-analysis in order to identify the best-fit substitution model. This pre-analysis can be done using popular software such as Modeltest \cite{posada98} or ProtTest \cite{abascal05} for instance. These programs generally recommend the use of a discrete gamma distribution to model the substitution process as variability of rates among sites is a common feature of molecular evolution. The choice of the number of rate classes to use for this distribution is also an important one. While the default is set to four categories in PhyML, it is recommended to use larger number of classes if possible in order to best approximate the patterns of rate variation across sites \cite{galtier04}. Note however that run times are directly proportional to the number of classes of the discrete gamma distribution. Here again, a pre-analysis with the simplest model should help the user to determine the number of rate classes that represents the best trade-off between computing time and fit of the model to the data. \subsection{PhyTime}\label{sec:recomphytime} Analysing a data set using PhyTime should involve three steps based on the following questions: (1) do the priors seem to be adequate (2) can I use the fast approximation of the likelihood and (3) how long shall I run the program for? I explain below how to provide answers to these questions. \begin{itemize} \item {\em Are the priors adequate?} Bayesian analysis relies on specifiying the joint prior density of model parameters. In the case of node age estimation, these priors essentially describe how rates of substitution vary across lineages and the probabilistic distribution that node ages have when ignoring the information provided by the genetic sequences. These priors vary from tree to tree. It is therefore essential to check the adequacy of priors for each user-defined input tree. In order to do so, PhyTime needs to be run with the \x{--no\_data} option. When this option is required, the sequence data provided as input will be ignored and the rest of the analysis will proceed normally. The prior distribution of model parameters, essentially edge rates and node heights, can then be checked using the program Tracer as one would do for the standard `posterior' analysis. \item {\em Can I use the fast approximation to the likelihood?} The suface of the log-likelihood function can be approximated using a multivariate normal density. This technique is saving very substantial amounts of computation time. However, like most approximations, there are situations where it does not provide a good fit to the actual function. This usually happens when the phylogeny displays a lot of short branches, i.e., the signal conveyed by the sequences is weak. It is therefore important to first check whether using the approximate likelihood is reasonable. In order to do so, it is recommended to first run the program without the approximation, i.e., using the default settings. Once the minimum value of the ESS of node ages (the last column on the right of the standard output) has reached 40-50, open the \x{phytime.XXXX} output file with Tracer and examine the correlation between the exact and approximate likelihood values. If the correlation is deemed to be good enough, PhyTime can be re-run using the \x{--fast\_lk} option, which uses the fast normal approximation to the likelihood function. % Figure \ref{fig:approxbad} gives an example where the correlation is too weak and the approximation % of the likelihood should be avoided. Figure \ref{fig:approxbad} gives an example where the % approximation is good enough. The current execution of PhyTime can be terminated and then % re-launched using the \x{--fast\_lk} option. % \begin{figure} % \begin{center} % \resizebox{14cm}{8cm}{\includegraphics{./fig/approx_bad.eps}} % \caption{{\bf Exact vs. approximate likelihoods.} The correlation between the normally approximated % (Y-axis) and the exact (X-axis) likelihoods is weak here. The exact likelihood should be used (option \x{fastlk=no}).} % \label{fig:approxbad} % \end{center} % \end{figure} % \begin{figure} % \begin{center} % \resizebox{14cm}{8cm}{\includegraphics{./fig/approx_good.eps}} % \caption{{\bf Exact vs. approximate likelihoods.} The correlation between the normally approximated % (Y-axis) and the exact (X-axis) likelihoods is good. The approximation of the likelihood can be used (option \x{fastlk=yes}).} % \label{fig:approxgood} % \end{center} % \end{figure} \item {\em How long shall I run the program for?} PhyTime should be run long enough such that the ESS of each parameter is `large enough'. The last column on the right handside of the standard output gives the minimum ESS across all internal node heights. It is recommended to run the program so that this number reaches at least 100. \end{itemize} \section{Frequently asked questions} \begin{enumerate} \item {\it PhyML crashes before reading the sequences. What's wrong ?}\\ \begin{itemize} \item The format of your sequence file is not recognized by PhyML. See Section \ref{sec:input_output} \item The carriage return characters in your sequence files are not recognized by PhyML. You must make sure that your sequence file is a plain text file, with standard carriage return characters (i.e., corresponding to ``$\backslash$\x{n}'', or ``$\backslash$\x{r}'') \end{itemize} \item {\it The program crashes after reading the sequences. What's wrong ?}\\ \begin{itemize} \item You analyse protein sequences and did not enter the \x{-d aa} option in the command-line. \item The format of your sequence file is not recognized by PhyML. See Section \ref{sec:input_output} \end{itemize} \item {\it Does PhyML handle outgroup sequences ?}\\ \begin{itemize} \item Yes, it does. Outgroup taxa are identified by adding the `*' sign at the end of each corresponding sequence name (see Section \ref{sec:outgroupspecify}) \end{itemize} \item {\it Does PhyML estimate clock-constrained trees ?}\\ \begin{itemize} \item No, the PhyML program does not estimate clock-contrained trees. One can however use the program PhyTime to perform such analysis but the tree topology will not be estimated. \end{itemize} \item {\it Can PhyML analyse partitioned data, such as multiple gene sequences ?}\\ \begin{itemize} \item We are currently working on this topic. Future releases of the program will provide options to estimate trees from phylogenomic data sets, with the opportunity to use different substitution models on the different data partitions (e.g., different genes). PhyML will also include specific algorithms to search the space of tree topologies for this type of data. \end{itemize} \end{enumerate} \section{Acknowledgements} The development of PhyML since 2000 has been supported by the Centre National de la Recherche Scientifique (CNRS) and the Minist\`ere de l'\'Education Nationale. \bibliographystyle{./naturemag} \bibliography{./ref.bib} \printindex \end{document} phyml-3.3.20220408/doc/ref.bib000077500000000000000000005431141422404706600154270ustar00rootroot00000000000000@article{lemey2010, title = {Phylogeography takes a relaxed random walk in continuous space and time}, volume = {27}, number = {8}, journal = {Molecular Biology and Evolution}, author = {Lemey, Philippe and Rambaut, Andrew and Welch, John J and Suchard, Marc A}, year = {2010}, note = {Publisher: SMBE}, pages = {1877--1885}, } @article{oliva19, title={Accounting for ambiguity in ancestral sequencereconstruction}, author={Oliva, A and Pulicani, S and Lefort, V and Br\'eh\'elin, L. and Gascuel, O. and Guindon, S}, journal={Bioinformatics}, pages={https://www.biorxiv.org/content/early/2018/09/05/409029}, year={2019} } @article{etheridge2008, title={Drift, draft and structure: some mathematical models of evolution}, author={Etheridge, Alison M}, journal={Banach Center Publ.}, volume={80}, pages={121--144}, year={2008} } @inproceedings{berestycki2009, title={Survival, extinction and ergodicity in a spatially continuous population model}, author={Berestycki, N and Etheridge, A and Hutzenthaler, M}, booktitle={Markov Proc. Rel. Fields}, year={2009} } @article{barton2010, title={A new model for evolution in a spatial continuum}, author={Barton, NH and Etheridge, AM and V{\'e}ber, A}, journal={Electronic Journal of Probability}, volume={15}, number={7}, year={2010} } @article{barton2010b, title={A new model for extinction and recolonization in two dimensions: quantifying phylogeography}, author={Barton, Nicholas H and Kelleher, Jerome and Etheridge, Alison M}, journal={Evolution}, volume={64}, number={9}, pages={2701--2715}, year={2010}, publisher={Wiley Online Library} } @article{veber2012, author = {V{\'e}ber, A and Wakolbinger, A}, title = {The spatial {L}ambda-{F}leming-{V}iot process: an event-based construction and a lookdown representation}, year = {2014}, journal = {Annales de l'Institut Henri Poincar\'e}, pages={in press} } @article{tilman2011, title={Diversification, biotic interchange, and the universal trade-off hypothesis}, author={D. Tilman}, journal={The American Naturalist}, volume={178}, number={3}, pages={355--371}, year={2011}, publisher={JSTOR} } @article{gernhard08, title={The conditioned reconstructed process}, author={Gernhard, Tanja}, journal={Journal of Theoretical Biology}, volume={253}, number={4}, pages={769--778}, year={2008}, publisher={Elsevier} } @article{ayres12, title={BEAGLE: an application programming interface and high-performance computing library for statistical phylogenetics}, author={Ayres, Daniel L and Darling, Aaron and Zwickl, Derrick J and Beerli, Peter and Holder, Mark T and Lewis, Paul O and Huelsenbeck, John P and Ronquist, Fredrik and Swofford, David L and Cummings, Michael P and others}, journal={Systematic Biology}, volume={61}, number={1}, pages={170--173}, year={2012}, publisher={Oxford University Press} } @article{ho11, title={Time-dependent rates of molecular evolution}, author={Ho, Simon YW and Lanfear, Robert and Bromham, Lindell and Phillips, Matthew J and Soubrier, Julien and Rodrigo, Allen G and Cooper, Alan}, journal={Molecular Ecology}, volume={20}, number={15}, pages={3087--3101}, year={2011}, publisher={Wiley Online Library} } @article{fletcher10, title={The effect of insertions, deletions, and alignment errors on the branch-site test of positive selection}, author={Fletcher, William and Yang, Ziheng}, journal={Molecular Biology and Evolution}, volume={27}, number={10}, pages={2257--2267}, year={2010}, publisher={SMBE} } @article{degnan09, title={Gene tree discordance, phylogenetic inference and the multispecies coalescent}, author={Degnan, J.H. and Rosenberg, N.A.}, journal={Trends in Ecology \& Evolution}, volume={24}, number={6}, pages={332--340}, year={2009}, publisher={Elsevier} } @article{best, title={{BEST}: Bayesian estimation of species trees under the coalescent model}, author={Liu, L.}, journal={Bioinformatics}, volume={24}, number={21}, pages={2542--2543}, year={2008}, publisher={Oxford Univ Press} } @article{lg4x, title={Modeling protein evolution with several amino acid replacement matrices depending on site rates}, author={Le, Si Quang and Dang, Cuong Cao and Gascuel, Olivier}, journal={Molecular Biology and Evolution}, volume={29}, number={10}, pages={2921--2936}, year={2012}, publisher={SMBE} } @article{stem, title={{STEM}: species tree estimation using maximum likelihood for gene trees under coalescence}, author={Kubatko, L.S. and Carstens, B.C. and Knowles, L.L.}, journal={Bioinformatics}, volume={25}, number={7}, pages={971--973}, year={2009}, publisher={Oxford Univ Press} } @article{startbeast, title={Bayesian inference of species trees from multilocus data}, author={Heled, J. and Drummond, A.J.}, journal={Molecular Biology and Evolution}, volume={27}, number={3}, pages={570--580}, year={2010}, publisher={SMBE} } @article{guindon10, title={Bayesian estimation of divergence times from large sequence alignments}, author={Guindon, St{\'e}phane}, journal={Molecular Biology and Evolution}, volume={27}, number={8}, pages={1768--1781}, year={2010}, publisher={SMBE} } @article{guindon18, title={Accounting for Calibration Uncertainty: Bayesian Molecular Dating as a ``Doubly Intractable'' Problem}, author={Guindon, St{\'e}phane}, journal={Systematic Biology}, volume={67}, number={}, pages={651-661}, year={2018}, } %% Created for guindon at 2009-04-21 13:11:50 +1200 @article{soubrier12, title={The influence of rate heterogeneity among sites on the time dependence of molecular rates}, author={Soubrier, J. and Steel, M. and Lee, M.S.Y. and Sarkissian, C.D. and Guindon, S. and Ho, S.Y.W. and Cooper, A.}, journal={Molecular Biology and Evolution}, year={2012}, publisher={SMBE} } %% Saved with string encoding Unicode (UTF-8) @article{matsen07, title={Phylogenetic mixtures on a single tree can mimic a tree of another topology}, author={Matsen, F.A. and Steel, M.}, journal={Systematic Biology}, volume={56}, number={5}, pages={767--775}, year={2007}, publisher={Oxford University Press} } @book{bailey64, title={The elements of stochastic processes with applications to the natural sciences}, author={Bailey, Norman TJ}, publisher={Wiley}, year={1964} } @article{lemey2009, title={Bayesian phylogeography finds its roots}, author={Lemey, Philippe and Rambaut, Andrew and Drummond, Alexei J and Suchard, Marc A}, journal={PLoS Comput Biol}, volume={5}, number={9}, pages={e1000520}, year={2009}, publisher={Public Library of Science} } @article{gillespie2011, title={Long-distance dispersal: a framework for hypothesis testing}, author={Gillespie, R.G. and Baldwin, B.G. and Waters, J.M. and Fraser, C.I. and Nikula, R. and Roderick, G.K.}, journal={Trends in Ecology \& Evolution}, year={2011}, vol=27, pages={47,56} } @article{guindon13, title={From trajectories to averages: an improved description of the heterogeneity of substitution rates along lineages.}, author={Guindon, S.}, journal={Systematic Biology}, year={2013}, volume={62}, pages={22-34}, publisher={Oxford University Press} } @article{arnold01, Author = {Barry C. Arnold and Enrique Castillo and Jose Maria Sarabia}, Title = {Conditionally Specified Distributions: An Introduction}, Journal = {Statistical Science}, Year = 2001, Volume = 16, Pages = {249,265} } @article{arnold07, Author = {Barry C. Arnold and Enrique Castillo and Jose Maria Sarabia}, Date-Added = {2009-04-21 13:08:07 +1200}, Date-Modified = {2009-04-21 13:11:32 +1200}, Journal = {Journal of Statistical Planning and Inference}, Pages = {3249-3260}, Read = {Yes}, Title = {Variations on the classical multivariate normal theme}, Volume = {137}, Year = {2007}, Bdsk-File-1 = {YnBsaXN0MDDUAQIDBAUGBwpZJGFyY2hpdmVyWCR2ZXJzaW9uVCR0b3BYJG9iamVjdHNfEA9OU0tleWVkQXJjaGl2ZXISAAGGoNEICVRyb290gAGoCwwXGBkaHiVVJG51bGzTDQ4PEBMWWk5TLm9iamVjdHNXTlMua2V5c1YkY2xhc3OiERKABIAFohQVgAKAA4AHXHJlbGF0aXZlUGF0aFlhbGlhc0RhdGFfECcuLi8uLi9teV9saWJyYXJ5L2NvbmRpdGlvbmFsX25vcm1hbC5wZGbSGw8cHVdOUy5kYXRhTxEBmgAAAAABmgACAAAKSGFyZCBEcml2ZQAAAAAAAAAAAAAAAAAAAAAAwttWiEgrAAAALPmGFmNvbmRpdGlvbmFsX25vcm1hbC5wZGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4bJbF7sAUUERGIAAAAAAAAgACAAAJIAAAAAAAAAAAAAAAAAAAAApteV9saWJyYXJ5ABAACAAAwtqtyAAAABEACAAAxe4JRAAAAAEADAAs+YYAK4iWAABLwwACADpIYXJkIERyaXZlOlVzZXJzOmd1aW5kb246bXlfbGlicmFyeTpjb25kaXRpb25hbF9ub3JtYWwucGRmAA4ALgAWAGMAbwBuAGQAaQB0AGkAbwBuAGEAbABfAG4AbwByAG0AYQBsAC4AcABkAGYADwAWAAoASABhAHIAZAAgAEQAcgBpAHYAZQASAC9Vc2Vycy9ndWluZG9uL215X2xpYnJhcnkvY29uZGl0aW9uYWxfbm9ybWFsLnBkZgAAEwABLwAAFQACAA7//wAAgAbSHyAhIlgkY2xhc3Nlc1okY2xhc3NuYW1loyIjJF1OU011dGFibGVEYXRhVk5TRGF0YVhOU09iamVjdNIfICYnoickXE5TRGljdGlvbmFyeQAIABEAGwAkACkAMgBEAEkATABRAFMAXABiAGkAdAB8AIMAhgCIAIoAjQCPAJEAkwCgAKoA1ADZAOECfwKBAoYCjwKaAp4CrAKzArwCwQLEAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAtE=}} @article{boussau06, title={Efficient likelihood computations with nonreversible models of evolution}, author={Boussau, Bastien and Gouy, Manolo}, journal={Systematic biology}, volume={55}, number={5}, pages={756--768}, year={2006}, publisher={Oxford University Press} } @article{boussau08, Abstract = {Fossils of organisms dating from the origin and diversification of cellular life are scant and difficult to interpret, for this reason alternative means to investigate the ecology of the last universal common ancestor (LUCA) and of the ancestors of the three domains of life are of great scientific value. It was recently recognized that the effects of temperature on ancestral organisms left 'genetic footprints' that could be uncovered in extant genomes. Accordingly, analyses of resurrected proteins predicted that the bacterial ancestor was thermophilic and that Bacteria subsequently adapted to lower temperatures. As the archaeal ancestor is also thought to have been thermophilic, the LUCA was parsimoniously inferred as thermophilic too. However, an analysis of ribosomal RNAs supported the hypothesis of a non-hyperthermophilic LUCA. Here we show that both rRNA and protein sequences analysed with advanced, realistic models of molecular evolution provide independent support for two environmental-temperature-related phases during the evolutionary history of the tree of life. In the first period, thermotolerance increased from a mesophilic LUCA to thermophilic ancestors of Bacteria and of Archaea-Eukaryota; in the second period, it decreased. Therefore, the two lineages descending from the LUCA and leading to the ancestors of Bacteria and Archaea-Eukaryota convergently adapted to high temperatures, possibly in response to a climate change of the early Earth, and/or aided by the transition from an RNA genome in the LUCA to organisms with more thermostable DNA genomes. This analysis unifies apparently contradictory results into a coherent depiction of the evolution of an ecological trait over the entire tree of life.}, Address = {Laboratoire de Biometrie et Biologie Evolutive, CNRS, Universite de Lyon, Universite Lyon I, 43 Boulevard du 11 Novembre, 69622 Villeurbanne, France.}, Au = {Boussau, B and Blanquart, S and Necsulea, A and Lartillot, N and Gouy, M}, Author = {Boussau, Bastien and Blanquart, Samuel and Necsulea, Anamaria and Lartillot, Nicolas and Gouy, Manolo}, Crdt = {2008/11/28 09:00}, Da = {20081218}, Date-Added = {2009-01-30 16:18:39 +1300}, Date-Modified = {2009-01-30 16:18:57 +1300}, Dcom = {20090113}, Dep = {20081126}, Doi = {10.1038/nature07393}, Edat = {2008/11/28 09:00}, Issn = {1476-4687 (Electronic)}, Jid = {0410462}, Journal = {Nature}, Jt = {Nature}, Language = {eng}, Mh = {Adaptation, Physiological/genetics/*physiology; Archaea/genetics/*physiology; Evolution, Molecular; Genes, rRNA/genetics; *Hot Temperature; Phylogeny}, Mhda = {2009/01/14 09:00}, Number = {7224}, Own = {NLM}, Pages = {942--945}, Phst = {2008/03/05 {$[$}received{$]$}; 2008/09/01 {$[$}accepted{$]$}; 2008/11/26 {$[$}aheadofprint{$]$}}, Pii = {nature07393}, Pl = {England}, Pmid = {19037246}, Pst = {ppublish}, Pt = {Journal Article; Research Support, Non-U.S. Gov't}, Sb = {IM}, So = {Nature. 2008 Dec 18;456(7224):942-5. Epub 2008 Nov 26. }, Stat = {MEDLINE}, Title = {Parallel adaptations to high temperatures in the Archaean eon.}, Volume = {456}, Year = {2008 Dec 18}, Bdsk-Url-1 = {http://dx.doi.org/10.1038/nature07393}} @article{dereeper08, Abstract = {Phylogenetic analyses are central to many research areas in biology and typically involve the identification of homologous sequences, their multiple alignment, the phylogenetic reconstruction and the graphical representation of the inferred tree. The Phylogeny.fr platform transparently chains programs to automatically perform these tasks. It is primarily designed for biologists with no experience in phylogeny, but can also meet the needs of specialists; the first ones will find up-to-date tools chained in a phylogeny pipeline to analyze their data in a simple and robust way, while the specialists will be able to easily build and run sophisticated analyses. Phylogeny.fr offers three main modes. The 'One Click' mode targets non-specialists and provides a ready-to-use pipeline chaining programs with recognized accuracy and speed: MUSCLE for multiple alignment, PhyML for tree building, and TreeDyn for tree rendering. All parameters are set up to suit most studies, and users only have to provide their input sequences to obtain a ready-to-print tree. The 'Advanced' mode uses the same pipeline but allows the parameters of each program to be customized by users. The 'A la Carte' mode offers more flexibility and sophistication, as users can build their own pipeline by selecting and setting up the required steps from a large choice of tools to suit their specific needs. Prior to phylogenetic analysis, users can also collect neighbors of a query sequence by running BLAST on general or specialized databases. A guide tree then helps to select neighbor sequences to be used as input for the phylogeny pipeline. Phylogeny.fr is available at: http://www.phylogeny.fr/}, Author = {Dereeper A, Guignon V, Blanc G, Audic S, Buffet S, Chevenet F, Dufayard JF, Guindon S, Lefort V, Lescot M, Claverie JM, Gascuel O.}, Date-Added = {2009-01-19 17:02:10 +1300}, Date-Modified = {2009-01-19 17:03:31 +1300}, Journal = { Nucleic Acids Res.}, Title = {Phylogeny.fr: robust phylogenetic analysis for the non-specialist.}, Volume = {36}, Year = {2008}} @article{lartillot06, Author = {Nicolas Lartillot}, Date-Added = {2008-12-18 09:36:03 +1300}, Date-Modified = {2008-12-18 09:39:29 +1300}, Journal = {Journal of Computational Biology}, Pages = {1701-1722}, Rating = {5}, Title = {Conjugate Gibbs Sampling for Bayesian Phylogenetic Models }, Volume = {13}, Year = {2006}, Bdsk-File-1 = {YnBsaXN0MDDUAQIDBAUGBwpZJGFyY2hpdmVyWCR2ZXJzaW9uVCR0b3BYJG9iamVjdHNfEA9OU0tleWVkQXJjaGl2ZXISAAGGoNEICVRyb290gAGoCwwXGBkaHiVVJG51bGzTDQ4PEBMWWk5TLm9iamVjdHNXTlMua2V5c1YkY2xhc3OiERKABIAFohQVgAKAA4AHXHJlbGF0aXZlUGF0aFlhbGlhc0RhdGFfEC4uLi8uLi9teV9saWJyYXJ5L2xhcnRpbGxvdF9jb25qdWdhdGVfZ2liYnMucGRm0hsPHB1XTlMuZGF0YU8RAbYAAAAAAbYAAgAACkhhcmQgRHJpdmUAAAAAAAAAAAAAAAAAAAAAAMLbVohIKwAAACz5hh1sYXJ0aWxsb3RfY29uanVnYXRlX2dpYmJzLnBkZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPmOxMsHU1BERiAAAAAAAAIAAgAACSAAAAAAAAAAAAAAAAAAAAAKbXlfbGlicmFyeQAQAAgAAMLarcgAAAARAAgAAMTKXpMAAAABAAwALPmGACuIlgAAS8MAAgBBSGFyZCBEcml2ZTpVc2VyczpndWluZG9uOm15X2xpYnJhcnk6bGFydGlsbG90X2Nvbmp1Z2F0ZV9naWJicy5wZGYAAA4APAAdAGwAYQByAHQAaQBsAGwAbwB0AF8AYwBvAG4AagB1AGcAYQB0AGUAXwBnAGkAYgBiAHMALgBwAGQAZgAPABYACgBIAGEAcgBkACAARAByAGkAdgBlABIANlVzZXJzL2d1aW5kb24vbXlfbGlicmFyeS9sYXJ0aWxsb3RfY29uanVnYXRlX2dpYmJzLnBkZgATAAEvAAAVAAIADv//AACABtIfICEiWCRjbGFzc2VzWiRjbGFzc25hbWWjIiMkXU5TTXV0YWJsZURhdGFWTlNEYXRhWE5TT2JqZWN00h8gJieiJyRcTlNEaWN0aW9uYXJ5AAgAEQAbACQAKQAyAEQASQBMAFEAUwBcAGIAaQB0AHwAgwCGAIgAigCNAI8AkQCTAKAAqgDbAOAA6AKiAqQCqQKyAr0CwQLPAtYC3wLkAucAAAAAAAACAQAAAAAAAAAoAAAAAAAAAAAAAAAAAAAC9A==}} @book{aarts97, Address = {Chichester}, Author = {E. Aarts and J. K. Lenstra}, Publisher = {Wiley}, Title = {Local search in combinatorial optimization}, Year = 1997} @article{abascal05, Author = {F. Abascal and R. Zardoya and D. Posada}, Journal = {Bioinformatics}, Pages = {2104-2105}, Title = {ProtTest: selection of best-fit models of protein evolution}, Volume = 21, Year = {2005}} @phdthesis{adachi95, Author = {J. Adachi}, School = {The Graduate University for Advanced Studies}, Title = {Modeling of Molecular Evolution and Maximum Likelihood Inference of Molecular Phylogeny}, Year = 1995} @article{akaike74, Author = {H. Akaike}, Journal = {IEEE Transactions on Automatic Control}, Pages = {716-723}, Title = {A new look at the statistical model identification}, Volume = 19, Year = {1974}} @article{amrine03, Author = {H. Amrine-Madsen and K Koepfli and R. Wayne and M. Springer}, Journal = {Molecular Phylogenetics and Evolution}, Pages = {225-240}, Title = {A new phylogenetic marker, apolipoprotein {B}, provides compelling evidence for eutherian relationships}, Volume = 28, Year = {2003}} @article{ane05, Author = {C. An\'e and J. Burleigh and M. McMahon and M. Sanderson}, Journal = {Molecular Biology and Evolution}, Pages = {914-924}, Title = {Covarion structure in plastid genome evolution: a new statistical test}, Volume = 22, Year = {2005}} @article{anisimova01, Author = {M. Anisimova and J. Bielawski and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {1585-1592}, Title = {The accuracy and power of likelihood ratio tests to detect positive selection at amino acid sites}, Volume = 18, Year = {2001}} @article{anisimova02, Author = {M. Anisimova and J. Bielawski and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {950-958}, Title = {Accuracy and power of Bayes prediction of amino acid under positive selection}, Volume = 19, Year = {2002}} @article{anisimova03, Author = {M. Anisimova and R. Nielsen and Z. Yang}, Journal = {Genetics}, Pages = {1229-1236}, Title = {Effect of recombination on the accuracy of the likelihood method for detecting positive selection at amino acid sites.}, Volume = 164, Year = {2003}} @article{anisimova06, Author = {M. Anisimova and O. Gascuel}, Journal = {Systematic Biology}, Pages = {539-552}, Title = {Approximate likelihood-ratio test for branches: a fast, accurate, and powerful alternative}, Volume = 55, Year = {2006}} @article{anisimova07, title={Multiple hypothesis testing to detect lineages under positive selection that affects only a few sites}, author={Anisimova, Maria and Yang, Ziheng}, journal={Molecular Biology and Evolution}, volume={24}, number={5}, pages={1219--1228}, year={2007}, publisher={SMBE} } @article{anisimova11, title={Survey of branch support methods demonstrates accuracy, power, and robustness of fast likelihood-based approximation schemes}, author={Anisimova, M. and Gil, M. and Dufayard, J.F. and Dessimoz, C. and Gascuel, O.}, journal={Systematic Biology}, volume={60}, number={5}, pages={685--699}, year={2011}, publisher={Oxford University Press} } @article{atv, Author = {C. Zmasek and S. Eddy}, Journal = {Bioinformatics}, Pages = {383-384}, Title = {{ATV}: display and manipulation of annotated phylogenetic trees}, Volume = 17, Year = 2001} @book{intro-algo, Author = {T. H. Cormen and C. E. Leiserson and R. L. Rivest}, Chapter = { 17 greedy algorithms}, Pages = {329-356}, Publisher = {The Massachuset Institute of Technology Press}, Title = {Introduction to algorithms}, Year = 1992} @article{seqgen, Author = {A. Rambaut and N.C. Grassly}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {235-238}, Title = {{S}eq-{G}en: an application for the {M}onte {C}arlo simulation of {DNA} sequence evolution along phylogenetic trees.}, Volume = 13, Year = 1997} @article{bailey02, Author = {J. Bailey and Z. Gu and R. Clark and K. Reinert and R. Samonte and S. Schwartz and M. Adams and E. Myers and P. Li and E. Eicher}, Journal = {Science}, Pages = {1003-1007}, Title = {Recent segmental duplications in the human genome}, Volume = 297, Year = 2002} @article{baele06, Author = {G. Baele and J. Raes and Y. Van de Peer and S. Vansteelandt}, Journal = {Molecular Biology and Evolution}, Pages = {1397-1405}, Title = {An improved statistical method for detecting heterotachy in nucleotide sequences}, Volume = 23, Year = 2006} @article{berry, Author = {V. Berry and O. Gascuel}, Journal = {Theoretical Computer Science ({\`a} paraitre)}, Title = {Inferring evolutionary trees with strong combinatorial confidence.}, Year = 2000} @article{kumar02, Author = {S. Kumar and S. Subramanian}, Journal = {PNAS}, Pages = {803-808}, Title = {Mutation rates in mammalian genomes}, Volume = {99}, Year = {2002}} @article{kumar96, Author = {Sudhir Kumar}, Journal = {Molecular Biology and Evolution}, Title = {A Stepwise Algorithm for Finding Minimum Evolution Trees}, Year = 1996} @article{nei97, Author = {Masatoshi Nei, Sudhir Kumar, and Kei Takahashi}, Journal = {Special series of inaugural articles by members of the national academy of science}, Pages = {584-593}, Title = {The optimization principle in phylogenetic analysis tends to give incorrect topologies when the number of nucleotides or amino acids is small}, Volume = 13, Year = 1997} @article{nei98, Author = {M. Nei and S. Kumar and K. Takahashi}, Journal = {PNAS}, Pages = {12390-12397}, Title = {The optimization principle in phylogenetic analysis tends to give incorrect topologies when the number of nucleotides or amino acids used is small}, Volume = 95, Year = 1998} @inproceedings{abf96, Author = {R. Agarwala and V. Bafna and M. Farach and B. Narayanan and M. Paterson and M. Thorup}, Booktitle = {Proceedings of the 7th Annual ACM-SIAM Symposium on Discrete Algorithms}, Title = {On the approximability of numerical taxonomy: Fitting distances by tree metrics}, Year = 1996} @article{adell94, Author = {J. Adell and J. Dopazo}, Journal = {Journal of Molecular Evolution}, Pages = {305-309}, Title = {{M}onte {C}arlo Simulation in phylogenies : An application to Test the Constancy of Evolutionary Rates}, Volume = 38, Year = 1994} @incollection{adachi96, Address = {Tokyo}, Author = {J. Adachi and M. Hasegawa}, Booktitle = {Computer Science Monographs}, Editor = {M. Ishiguro and G. Kitagawa and Y. Ogata and H. Takagi and Y. Tamura and T. Tsuchiya}, Number = {28}, Publisher = {The Institute of Statistical Mathematics}, Title = {{MOLPHY} Version 2.3. Programs for molecular phylogenetics based on maximum likelihood}, Year = 1996} @article{adachi00, Author = {J. Adachi and Waddell P. and W. Martin and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {348-358}, Title = {Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast {DNA}}, Volume = 50, Year = 2000} @article{almagor83, Author = {Hagai Almagor}, Journal = {Journal of Theorical Biology}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Pages = {633-645}, Title = { A Markov analysis of {DNA} sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 104, Year = 1983} @book{alon92, Address = {Chichester}, Author = {N. Alon and J.H. Spencer}, Publisher = {Wiley}, Title = {The Probabilistic Method}, Year = 1992} @dea{andrieu92, Address = {Montpellier}, Author = {Guillaume Andrieu}, School = {{E}cole {N}ationale {S}up{\'e}rieure {A}gronomique de {M}ontpellier}, Title = {{M}od{\`e}les {P}robabilistes de {C}onstruction des {A}rbres {P}hylog{\'e}n{\'e}tique}, Utilisateur = {Gilles Caraux}, Year = 1992} @phdthesis{andrieu97, Author = {G. Andrieu}, Month = {d{\'e}cembre}, School = {Univ. Montpellier II}, Title = {Estimation par intervalle d'une distance {\'e}volutive}, Year = 1997} @article{arisbrosou02, Author = {S. Aris-Brosou and Z. Yang}, Journal = {Systematic Biology}, Pages = {703-714}, Title = {Effects of models of rate evolution on estimation of divergence dates with special reference to the metazoan {18S} ribosomal {RNA} phylogeny}, Volume = 51, Year = 2002} @book{atlan, Address = {Petaouchnok}, Author = {Henri Atlan}, Publisher = {Herman}, Title = {L'organisation Biologique et la th{\'e}orie de l'information}, Year = 1992} @misc{atteson96, Author = {K. Atteson}, Howpublished = {DIMACS}, Month = {november}, Title = {Workshop on Mathematical Hierarchies and Biology}, Year = 1996} @incollection{atteson97, Author = {K. Atteson}, Booktitle = {Mathematical Hierarchies and Biology}, Editor = {B. Mirkin and F.R. McMorris and F.S. Roberts and A. Rhzetsky}, Pages = {133-148}, Publisher = {American Mathematical Society}, Title = {The performance of the {NJ} method of phylogeny reconstruction}, Year = 1997} @article{bailly03, Author = { X. Bailly and R. Leroy and S. Carney and O. Collin and F. Zal and A. Toulmond and D. Jollivet}, Journal = {PNAS}, Pages = {5885-5890}, Title = {The loss of the hemoglobin \hbox{H$_2$S}-binding function in annelids from sulfide-free habitats reveals molecular adaptation driven by {D}arwinian positive selection}, Volume = 1000, Year = 2003} @article{bd86, Author = {H-J. Bandelt and A. Dress}, Journal = {Advances in Applied Mathematics}, Pages = {309-343}, Title = {Reconstructing the Shape of a Tree from Observed Dissimilarity Data}, Utilisateur = {Vincent}, Volume = 7, Year = 1986} @misc{bandelt90, Author = {H.-J. Bandelt and A. von Haeseler and A. Bolick and H. Sch{\"u}tte}, Howpublished = {preprint}, Title = {A comparative study of sequence dissimilarities and evolutionnary distances derived from sets of aligned RNA sequences}, Year = 1990} @article{bandelt92, Author = {H.-J. Bandelt and A. Dress}, Journal = {Advances Math.}, Pages = {47-105}, Title = {A canonical decomposition theory for metrics on a finite set}, Volume = 92, Year = 1992} @article{bandelt92b, Author = {H.-J. Bandelt and A. Dress}, Journal = {Molecular Biology and Evolution}, Pages = {242-252}, Title = {Split Decomposition: A New and Useful Approach to Phylogenetic Analysis of Distance Data}, Volume = 1, Year = 1992} @article{barry87, Author = {Daniel Barry and J. A. Hartigan}, Journal = {Biometrics}, Pages = {261-276}, Title = {Asynchronous Distance Between Homologous {DNA} Sequences}, Volume = 43, Year = 1987} @article{barry872, Author = {Daniel Barry and J. A. Hartigan}, Journal = {Statistical Science}, Pages = {191-210}, Title = {Statistical Analysis of Homimoid Molecular Evolution}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 2, Year = 1987} @article{barton2013, title={Modelling evolution in a spatial continuum}, author={Barton, NH and Etheridge, AM and V{\'e}ber, A}, journal={Journal of Statistical Mechanics: Theory and Experiment}, volume={2013}, number={01}, pages={P01002}, year={2013}, publisher={IOP Publishing} } @inproceedings{barthelemy84, Address = {La Grande-Motte}, Author = {J.-P. Barth{\'e}lemy and N.X. Luong}, Booktitle = {Colloque ASSU.}, Title = {Repr{\'e}sentations arbor{\'e}es de mesures de dissimilarit{\'e}}, Year = 1984} @book{barthelemy88, Author = {J.-P. Barth{\'e}lemy and Alain Gu{\'e}noche}, Publisher = {Masson}, Series = {{M}{\'e}thodes + {P}rogrammes}, Title = {Les arbres et les repr{\'e}sentations des proximit{\'e}s}, Year = 1988} @article{barth88, Author = {J. P. Barth{\'e}lemy}, Journal = {Journal of Classification}, Pages = {229-236}, Title = {Thresholded consensus for n-trees}, Utilisateur = {Gilles Caraux and Olivier Gascuel}, Volume = 5, Year = 1988} @article{bazykin04, Author = {G. Bazykin and F. Kondrashov and A. Ogurtsov and S. Sunyaev and A. Kondrashov}, Journal = {Nature}, Pages = {558-562}, Title = {Positive selection at sites of multiple amino acid replacements since rat-mouse divergence.}, Volume = 3, Year = 2004} @book{barthelemy91, Author = {J.P. Barth{\'e}lemy and A. Gu{\'e}noche}, Editor = {Chichester}, Publisher = {Wiley}, Title = {Trees and proximities representations}, Year = 1991} @article{benjamini95, Author = {Y. Benjamini and Y. Hochberg}, Journal = {Journal of the Royal Statistics Society: Series B (Statistical Methodology)}, Pages = {289-300}, Title = {Controlling the false discovery rate -- a practical and powerful approach to multiple testing}, Volume = {57}, Year = {1995}} @article{benjamini00, Author = {Y. Benjamini and Y. Hochberg}, Journal = {Journal of Educational and Behavioral Statistics}, Pages = {60-83}, Title = {The adaptive control of the false discovery rate in multiple hypothesis testing with independent statistics}, Volume = {25}, Year = {2000}} @article{benjamini01, Author = {Y. Benjamini and D. Yekutieli}, Journal = {Annals of Statistics}, Pages = {1165-1188}, Title = {The control of the false discovery rate in multiple testing under dependency}, Volume = {29}, Year = {2001}} @inbook{benzecri, Address = {Paris}, Author = {J. P. Benzecri}, Chapter = {TIB No 3}, Pages = {119-152}, Publisher = {Dunod}, Series = {L'analyse des donn{\'e}es}, Title = {Description math{\'e}matique des classifications}, Utilisateur = {Gilles Caraux}, Volume = {I~: La Taxinomie}, Year = 1973} @article{benzer61, Author = {S. Benzer}, Journal = {PNAS}, Pages = {403-415}, Title = {On the topography of genetic fine structure}, Volume = 47, Year = 1961} @phdthesis{berrythese, Author = {V. Berry}, Month = {d{\'e}cembre}, School = {Univ. Montpellier II}, Title = {M{\'e}thodes et algorithmes pour reconstruire les arbres de l'{\'e}volution}, Year = 1997} @book{berge70, Author = {C. Berge}, Publisher = {Dunod}, Title = {Graphes et hypergraphes}, Year = 1970} @article{bertrand04, Author = {D. Bertrand and O. Gascuel}, Journal = {WABI}, Title = {Topological rearrangements and local search method for tandem duplication trees}, Year = 2004} @article{bertrand05, Author = {D. Bertrand and O. Gascuel}, Journal = {{IEEE} Transactions on computational biology and bioinformatics}, Title = {Topological rearrangements and local search method for tandem duplication trees}, Volume = {2}, Issue = {1}, Year = 2005} @article{bg96_boot, Author = {V. Berry and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {999-1011}, Title = {On the interpretation of Bootstrap trees: appropriate threshold of clade selection and induced gain}, Volume = 13, Year = 1996} @techreport{bg96_quad, Author = {V. Berry and O. Gascuel}, Institution = {LIRMM}, Month = {july}, Number = {96-044}, Title = {A quartet-based heuristics for phylogeny reconstruction}, Year = 1996} @inbook{bhattacharya, Address = {New York}, Author = {Rabi N. Bhattacharya and Edwards C. Waymire}, Chapter = { No IV Continuous-Parameter {M}arkov chains}, Pages = {261-366}, Publisher = {Wiley}, Title = {Stochastic processes with applications}, Utilisateur = {Guillaume Andrieu}, Year = 1990} @article{bielawski01, Author = {J. Bielawski and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {523-529}, Title = {Positive and negative selection in the {\uppercase{\it{DAZ}}} gene family}, Volume = {18}, Year = 2001} @article{bielawski03, Author = {J. Bielawski and Z. Yang}, Journal = {Journal of Structural and Functional Genomics}, Pages = {201-212}, Title = {Maximum likelihood methods for detecting adaptive evolution after gene duplication}, Volume = {3}, Year = 2003} @article{bielawski04, Author = {J. Bielawski and Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {121-132}, Title = {A maximum likelihood method for detecting functional divergence at individual codon sites, with application to gene family evolution}, Volume = {59}, Year = 2004} @article{bishop85, Author = {M. J. Bishop and A. E. Friday}, Journal = {Proceeding of the Royal Society of London}, Pages = {271-302}, Title = {{E}volutionary trees from nucleic acid and protein sequences}, Utilisateur = {Guillaume Andrieu}, Volume = {B 226}, Year = 1985} @article{blaisdell85, Author = {B. Edwin Blaisdell}, Journal = {Journal of Molecular Evolution}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Pages = {278-288}, Title = {Markov chain analysis find a significant influence of neighboring bases on the occurence of a base in eucaryotic nuclear {DNA} sequences both protein-coding and noncoding}, Utilisateur = {Guillaume Andrieu}, Volume = 21, Year = 1985} @article{blaisdell91, Author = {Edwin Blaisdell}, Journal = {Journal of Molecular Evolution}, Pages = {521-528}, Title = {average values of a dissimilarity measure not requiring sequence alignment are twice the average of conventional mismatch counts requiring sequence alignment for a variety of computer-Generated model systems}, Utilisateur = {G. Andrieu}, Volume = 32, Year = 1991} @article{blake92, Author = {R.D. Blake and Samuel T. Hess and Janice Nicholson-Tuell}, Journal = {Journal of Molecular Evolution}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Pages = {189-200}, Title = {The Influence of Nearest Neighbors on the Rate and Pattern of Spontaneous Point Mutations}, Utilisateur = {Guillaume Andrieu}, Volume = 34, Year = 1992} @article{blanken82, Author = {Roger L. Blanken and Lynn C. Klotz and Alan G. Hinnebusch}, Journal = {Journal of Molecular Evolution}, Pages = {9-19}, Title = {Computer comparison of new and existing criteria for constructing evolutionary trees from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 19, Year = 1982} @article{blast, Author = {S. Altschul and W. Gish and W. Miller and E. Myers and D. Lipman}, Journal = {Journal of Molecular Biology}, Pages = {403-410}, Title = {Basic local alignment search tool}, Volume = {215}, Year = {1990}} @article{bledsoe90, Author = {Anthony H. Bledsoe and Robert J. Raikow }, Journal = {Journal of Molecular Evolution}, Pages = {247-259}, Title = {A quantitative assessment of congruence between molecular and nonmolecular estimates of phylogeny}, Utilisateur = {G. Andrieu}, Volume = 30, Year = 1990} @article{brauer02, Author = { M.J. Brauer and M.T. Holder and L.A. Dries and D.J. Zwickl and P.O. Lewis and D.M. Hillis}, Journal = {Molecular Biology and Evolution}, Pages = {1717-1726}, Title = {Genetic algorithms and parallel processing in maximum-likelihood phylogeny inference}, Volume = 19, Year = 2002} @book{breiman84, Author = {L. Breiman and J.H. Friedman and A. Olshen and Stone C.J.}, Editor = {Belmont}, Publisher = {Wadsworth}, Title = {Classification and regression trees}, Year = 1984} @article{bremer88, Author = {K. Bremer}, Journal = {Evolution}, Note = {Donne une bonne facon de tester la robustesse d'un arbre infere par une meth de parcimonie : faire un arbre de consensus strict pr les arbres de valeur opt, puis un avec aussi ceux de val opt+1,... et noter a quelle etape disparait chq noeud}, Pages = {795-803}, Title = {The limits of amino acid sequence data in angiosperm phylogenetic reconstruction}, Utilisateur = {Vincent}, Volume = 42, Year = 1988} @book{brent73, Author = {R. Brent}, Chapter = {5}, Publisher = {Prentice-Hall}, Title = {Algorithms for minimization without derivatives}, Year = 1973} @article{brossier85, Author = {Gildas Brossier}, Journal = {Math. Sci. hum.}, Pages = {5-21}, Title = {Approximation des dissimilarit{\'e}s par des arbres additifs}, Utilisateur = {Gilles Caraux}, Volume = 91, Year = 1985} @article{brown99, Author = {K. S. Brown}, Journal = {Science}, Pages = {990-991}, Title = {Deep Green Rewrites Evolutionary History of Plants}, Volume = 285, Year = 1999} @article{bruno00, Author = {W. Bruno and N. Socci and A. Halpern}, Journal = {Molecular Biology and Evolution}, Pages = {189-197}, Title = {Weighted neighbor joining: a likelihood-based approach to distance-based phylogeny reconstruction}, Volume = 17, Year = 2000} @incollection{bryant05, Address = {Oxford}, Author = {D. Bryant and N. Galtier and M.-A. Poursat}, Booktitle = {Mathematics of Evolution \& Phylogenetics}, Editor = {O. Gascuel}, Pages = {33-62}, Publisher = {Oxford University Press}, Title = {Likelihood Calculations in Phylogenetics}, Year = 2005} @article{weighbor, Author = {W. Bruno and N. D. Socci and A. L. Halpern}, Journal = {Molecular Biology and Evolution}, Pages = {189-197}, Title = {Weighted Neighbor Joining: A Likelihood-based Approach to Distance-Based Phylogeny Reconstruction}, Volume = 17, Year = 2000} @article{buckley01, Author = {Thomas R. Buckley and Chris Simon and Geoffrey K. Chambers}, Journal = {Systematic Biology}, Pages = {67-86}, Title = {Exploring Among-Site Rate Variation Models in a Maximum Likelihood Framework Using Empirical Data: Effects of Model Assumptions on Estimates of Topology, Branch Lengths, and Bootstrap Support}, Volume = 50, Year = 2001} @article{buckley01b, Author = {Thomas R. Buckley and Chris Simon and Hidetoshi Shimodaira and Geoffrey K. Chambers}, Journal = {Molecular Biology and Evolution}, Pages = {223-234}, Title = {Evaluating Hypotheses on the Origin and Evolution of the New Zealand Alpine Cicadas (Maoricicada) Using Multiple-Comparison Tests of Tree Topology}, Volume = 18, Year = 2001} @article{bulmer91, Author = {Michael Bulmer}, Journal = {Molecular Biology and Evolution}, Pages = {868-883}, Title = {Use of the method of generalized least squares in reconstructing phylogenies from sequence data}, Volume = 8, Year = 1991} @inbook{buneman71, Author = {P. Buneman}, Chapter = {The recovery of trees from measures of dissimilarity}, Pages = {387-395}, Publisher = {Edhinburgh University Press}, Title = {Mathematics in Archeological and Historical Sciences}, Year = 1971} @article{buneman74, Author = {P. Buneman}, Journal = {J. of Comb. Theory}, Pages = {48-50}, Title = {A note on metric properties of trees}, Volume = 17, Year = 1974} @article{cao98, Author = {Y. Cao and A. Janke and P. Waddell and M. Westerman and O. Takenaka and S. Murata and N. Okada and S. Paabo and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {307-322}, Title = {Conflict among individual mitochondrial proteins in resolving the phylogeny of eutherian orders}, Volume = 47, Year = 1998} @article{carroll76, Author = {J. Douglas Carroll}, Journal = {Psychometrika}, Pages = {439-463}, Title = {Spatial, non-spatial and hybrid models for scaling}, Utilisateur = {Gilles Caraux}, Volume = 41, Year = 1976} @article{cavalli67, Author = {L. L. Cavalli-Sforza and A. W. F. Edwards}, Journal = {The American Journal of Human Genetics}, Pages = {233-257}, Title = {Phylogenetic analysis models and estimation procedures}, Volume = 19, Year = 1967} @article{cavender78, Author = {J. A. Cavender}, Journal = {Mathematical Biosciences}, Pages = {271-280}, Title = {Taxonomy with Confidence}, Utilisateur = {Guillaume Andrieu}, Volume = 40, Year = 1978} @article{cavender81, Author = {James A. Cavender}, Journal = {Mathematical Biosciences}, Pages = {217-229}, Title = {Tests of Phylogenetic Hypotheses under Generalized Models}, Utilisateur = {Guillaume Andrieu}, Volume = 54, Year = 1981} @article{chandon80, Author = {Jean Louis Chandon and J. Lemaire and J. Pouget}, Journal = {R.A.I.R.O. Recherche op{\'e}rationnelle}, Pages = {157-170}, Title = {Construction de l'ultram{\'e}trique la plus proche d'une dissimilarit{\'e} au sens des moindres carr{\'e}s}, Utilisateur = {Gilles Caraux}, Volume = 14, Year = 1980} @article{chor00, Author = {B. Chor and M. Hendy and B. Holland and D. Penny}, Journal = {Molecular Biology and Evolution}, Pages = {1529-1541}, Title = {Multiple maxima of likelihood in phylogenetic trees: an analytic approach}, Volume = 17, Year = 2000} @article{churchill92, Author = {Gary A. Churchill and Arndt von Haesler and William C. Navidi}, Journal = {Molecular Biology and Evolution}, Pages = {753-769}, Title = {Sample size for a phylogenetic inference }, Utilisateur = {Guillaume Andrieu}, Volume = 9, Year = 1992} @article{clark92, Author = {Andrew G. Clark and Thomas S. Whittam}, Journal = {Molecular Biology and Evolution}, Pages = {744-752}, Title = { Sequencing errors and molecular evolutionary analysis}, Utilisateur = {Guillaume Andrieu}, Volume = 9, Year = 1992} @article{clark03, Author = { A. Clark and S. Glanowski and R. Nielsen and P. Thomas and A. Kejariwal and M. Todd and D. Tanenbaum and D. Civello and F. Lu and B. Murphy and S. Ferriera and G. Wang and X. Zheng and T. White and J. Sninsky and M. Adams and M. Cargill}, Journal = {Science}, Pages = {1960-1963}, Title = {Inferring nonneutral evolution from human-chimp-mouse orthologous gene trios}, Volume = 302, Year = 2003} @inproceedings{cohen97, Author = {J. Cohen and M. Farach}, Booktitle = {Proceedings of the 8th Annual ACM-SIAM Symposium On Discrete Algorithms}, Title = {Numerical Taxonomy on Data: Experimental Results}, Year = 1997} @article{colless67, Author = {Donald H. Colless}, Journal = {Systematic Zoology}, Pages = {289-295}, Title = {The phylogenetic fallacy}, Utilisateur = {Gilles Caraux}, Volume = 16, Year = 1967} @article{colonius81, Author = {H. Colonius and H.H. Schulze}, Journal = {British Journal of Math. and Stat. Psychology}, Pages = {167-180}, Title = {Tree structures for proximity data}, Utilisateur = {Vincent}, Volume = 34, Year = 1981} @article{crandall99, Author = {K. Crandall and C. Kelsey and H. Imamichi and H. Lane and N. Salzman}, Journal = {Molecular Biology and Evolution}, Pages = {372-382}, Title = {Parallel evolution of drug resistance in {HIV} : failure of nonsynonymous/synonymous rate ratio to detect selection}, Volume = 16, Year = 1999} @article{curnow89, Author = {R. N. Curnow and T. B. L. Kirkwood}, Journal = {J. of the Royal Statistical Society}, Pages = {199-220}, Title = {Statistical analysis of Desoxyribonucleic Acid Sequence Data-A review}, Utilisateur = {Guillaume Andrieu}, Volume = 152, Year = 1989} @incollection{czelusniak90, Address = {New York}, Author = {John Czelusniak and Morris Goodman and Nancy D. Moncrieff and Suzanne M. Kehoe}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 37, Editor = {Russsell F. Doolittle}, Note = {{P}resente les meths de branch-swapping sur un arbre}, Pages = {601-615}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Maximum Parsimony Approach to Construction of Evolutionary Trees from Aligned Homologous Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @book{darwin, Author = {C. Darwin}, Publisher = {John Murray}, Title = {On the origin of species}, Year = 1859} @article{daubin03, Author = {V. Daubin and G. Perri{\`e}re}, Journal = {Molecular Biology and Evolution}, Pages = {471-483}, Title = {{G+C3} structuring along the genome : a common feature in prokaryotes}, Volume = 20, Year = 2003} @article{day85, Author = {W.H. Day and F.R. McMorris}, Journal = {Bulletin of Math. Biol.}, Pages = {215-229}, Title = {A formalization of consensus index methods}, Volume = 47, Year = 1985} @incollection{day87, Author = {W. H. E. Day}, Booktitle = {Bulletin of Mathematical Biology}, Pages = {461-467}, Title = {Computational Complexity of Inferring Phylogenies from Dissimilarity Matrices}, Volume = 49, Year = 1987} @incollection{dayhoff78, Address = {Washington, D. C.}, Author = {M. Dayhoff and R. Schwartz and B. Orcutt}, Booktitle = {Atlas of Protein Sequence and Structure}, Editor = {M. Dayhoff}, Pages = {345-352}, Publisher = {National Biomedical Research Foundation}, Title = {A model of evolutionary change in proteins}, Volume = 5, Year = 1978} @incollection{debry92, Author = {R. W. DeBry}, Booktitle = {Molecular Biology and Evolution}, Pages = {537-551}, Title = {The Consistency of Several Phylogeny-Inference Methods under Varying Evolutionary Rates}, Volume = 9, Year = 1992} @incollection{degens83, Address = {Berlin Heidelberg}, Author = {Paul O. Degens}, Booktitle = {Numerical Taxonomy}, Editor = {Joseph Felsenstein}, Pages = {249-253}, Publisher = {Springer-Verlag}, Series = {NATO ASI}, Title = {Hierarchical cluster methods as maximum likelihood estimators}, Utilisateur = {Gilles Caraux}, Volume = {G1}, Year = 1983} @article{delsuc02, Author = {F. Delsuc and M. Scally and O. Madsen and M. Stanhope and W. de Jong and F. Catzeflis and M. Springer and E. Douzery}, Journal = {Molecular Biology and Evolution}, Pages = {1656-1671}, Title = {Molecular phylogeny of living xenarthrans and the impact of character and taxon sampling on the placental tree rooting}, Volume = {19}, Year = {2002}} @article{delsuc05, Author = {F. Delsuc and H. Brinkmann and H. Philippe}, Journal = {Nature Review Genetics}, Pages = {361-375}, Title = {Phylogenomics and the reconstruction of the tree of life}, Volume = {6}, Year = {2005}} @article{dempster77, Author = {A. P. Dempster and N. M. Laird and D. B. Rubin}, Journal = {J. R. Statist. Soc. B}, Pages = {1-22}, Title = {Maximum Likelihood from incomplete data via the \hbox{\it EM} algorithm}, Utilisateur = {Gilles Caraux et Guillaume Andrieu}, Volume = 39, Year = 1977} @article{denis02, Author = {F. Denis and O. Gascuel}, Journal = {Discrete Applied Mathematics}, Title = {On the consistency of the minimum evolution principle of phylogenetic inference}, Year = 2002} @article{derchia96, Author = {A.M. D'Erchia and C. Gissi and G. Pesole and C. Saccone and U. Arnason}, Journal = {Nature}, Pages = {597-600}, Title = {The guinea-pig is not a rodent}, Volume = 381, Year = 1996} @article{desoete83, Author = {Geert de Soete}, Commentaire = {Ceci est mon commentaire}, Journal = {Psychometrika}, Pages = {621-626}, Title = {A least squares algorithm for fitting additive trees to proximity data}, Utilisateur = {Gilles Caraux}, Volume = 48, Year = 1983} @article{desper02, Author = {R. Desper and O. Gascuel}, Journal = {Journal of Computational Biology}, Pages = {687-705}, Title = {Fast and accurate phylogeny reconstruction algorithms based on the minimum-evolution principle}, Volume = 9, Year = 2002} @article{dickerson71, Author = {Richard Dickerson}, Journal = {Journal of Molecular Evolution}, Pages = {26-45}, Title = {The structure of cytochrome $c$ and the rates of molecular evolution}, Utilisateur = {Gilles Caraux}, Volume = 1, Year = 1971} @article{dimmic02, Author = {M. Dimmic and J. Rest and D. Mindell and D. Goldstein}, Journal = {Journal of Molecular Evolution}, Pages = {65-73}, Title = {{rtREV}: an amino acid substitution matrix for inference of retrovirus and reverse transcriptase phylogeny}, Volume = 55, Year = 2002} @incollection{dobson75, Address = {Berlin}, Author = {Annette J. Dobson}, Booktitle = {Combinatorial Mathematics III}, Editor = {A. Dold and B. Eckmann}, Pages = {95-100}, Publisher = {Springer}, Series = {Lecture Notes in Mathematics}, Title = {Comparing the shapes of trees}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 452, Year = 1975} @incollection{doolittle90, Author = {Russel F. Doolittle and Da-Fei Feng}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 41, Editor = {Russsell F. Doolittle}, Pages = {659-669}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Nearset Neighbor Procedure for relating Progressively Amino Acid Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{dopazo94, Author = {Joaquin Dopazo}, Journal = {Journal of Molecular Evolution}, Pages = {300-304}, Title = {Estimating Errors and Confidence Intervals for Branch Lengths in Phylogenetic Trees by a Bootstrap Approach}, Utilisateur = {Guillaume Andrieu}, Volume = 38, Year = 1994} @article{douady03, Author = {C. J. Douady and F. Delsuc and Y. Boucher and W. F. Doolittle and E. J. P. Douzery }, Journal = {Molecular Biology and Evolution}, Pages = {248-254}, Title = {Comparison of Bayesian and Maximum Likelihood Bootstrap Measures of Phylogenetic Reliability}, Volume = 20, Year = 2003} @article{douzery03, Author = {E. Douzery and F. Delsuc and M. Stanhope and D. Huchon}, Journal = {Journal of Molecular Evolution}, Pages = {S201-13}, Title = {Local molecular clocks in three nuclear genes: divergence times for rodents and other mammals and incompatibility among fossil calibrations}, Volume = {57 Suppl 1}, Year = 2003} @Article{douzery04, Author="Douzery, E. J. and Snell, E. A. and Bapteste, E. and Delsuc, F. and Philippe, H. ", Title="{{T}he timing of eukaryotic evolution: does a relaxed molecular clock reconcile proteins and fossils?}", Journal="Proc. Natl. Acad. Sci. U.S.A.", Year="2004", Volume="101", Pages="15386--15391", Month="Oct" } @article{dress86, Author = {A. Dress and A. von Haeseler and M. Krueger}, Journal = {Studien zur Klassifikation}, Pages = {299-305}, Title = {Reconstructing phylogenetic trees using variants of the "four-point condition"}, Year = 1986} @article{drummond03, Author = {A. Drummond and O. Pybus and A. Rambaut and R. Forsberg and A. Rodrigo}, Journal = {Trends in Ecology and Evolution}, Pages = {481-488}, Title = {Measurably evolving populations}, Volume = 18, Year = 2003} @article{drummond06, Author = {A. Drummond and S. Ho and M. Phillips and A. Rambaut}, Journal = {PLoS Biology}, Pages = {e88}, Title = {Relaxed phylogenetics and dating with confidence}, Volume = 4, Year = 2006} @Article{drummond07, Author="Drummond, A. J. and Rambaut, A. ", Title="{{B}{E}{A}{S}{T}: {B}ayesian evolutionary analysis by sampling trees}", Journal="BMC Evol. Biol.", Year="2007", Volume="7", Pages="214" } @article{dudoit02, Author = {S. Dudoit and J. Popper Shaffer and J. Boldrick}, Journal = {U.C. Berkeley Division of Biostatistics Working Paper Series}, Pages = {http://www.bepress.com/ucbbiostat/paper110}, Title = {Multiple Hypothesis Testing in Microarray Experiments}, Year = 2002} @article{edgar04, author={R. Edgar}, title={{MUSCLE}: multiple sequence alignment with high accuracy and high throughput}, journal={Nucleic Acids Research}, year={2004}, volume={32}, pages={1792-1797} } @article{edwards63, Author = {A. W. F. Edwards and L. L. Cavalli-Sforza}, Journal = {Ann. Hum. Genet.}, Pages = {104-105}, Title = {The reconstruction of evolution}, Volume = 27, Year = 1963} @article{edwards64, Author = {A. W. F. Edwards and L. L. Cavalli-Sforza}, Journal = {Systematics Association Publication.}, Pages = {67-76}, Title = {Reconstruction of evolutionary trees}, Volume = 6, Year = 1964} @book{edwards72, Address = {Cambridge, England}, Author = {A. W. F. Edwards}, Publisher = {University Press}, Title = {Likelihood}, Year = 1972} @article{efron79, Author = {B. Efron}, Journal = {Ann. Statistics}, Pages = {1-26}, Title = {Bootstrap methods: another look at the jackknife}, Volume = 7, Year = 1979} @article{efron85, Author = {B. Efron}, Journal = {Biometrika}, Pages = {45-58}, Title = {Bootstrap confidence intervals for a class of parametric problems}, Volume = 72, Year = 1985} @article{efron87, Author = {Bradley Efron}, Journal = {Journal of the american statistical association}, Month = {March}, Number = 397, Pages = {171-185}, Title = {Better bootstrap confidence intervals}, Volume = 82, Year = 1987} @book{efron93, Author = {Bradley Efron and Robert J. Tibshirani}, Publisher = {Chapman et Hall}, Title = {An {I}ntroduction to the {B}ootstrap}, Utilisateur = {Susan Holmes}, Year = 1993} @techreport{efron95, Author = {B. Efron and E. Halloran and S. Holmes}, Institution = {Standford University}, Number = {Tech. Rep. 179}, Title = {Bootstrap confidence levels for phylogenetic trees}, Year = 1995} @article{efron96, Author = {B. Efron and E. Halloran and S. Holmes}, Journal = {PNAS}, Pages = {7085-7090}, Title = {Bootstrap confidence levels for phylogenetic trees}, Volume = 93, Year = 1996} @article{eigen81, Author = {M. Eigen and R. Winkler-Oswatitsch}, Journal = {Die Naturwissenschaften}, Pages = {217-228}, Title = {Transfer-{\sc RNA} : The Early Adaptor}, Utilisateur = {Guillaume Andrieu}, Volume = 68, Year = 1981} @article{eigen88, Author = {M. Eigen and R. Winkler-Oswatitsch and A. Dress}, Journal = {PNAS}, Pages = {5913-5917}, Title = {Statistical Geometry in Sequence Space : A Method of Quantitative Comparative Sequence Analysis }, Volume = 85, Year = 1988} @incollection{eigen90a, Author = {Manfred Eigen and Ruthild Winkler-Oswatitsch}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 32, Editor = {Russsell F. Doolittle}, Pages = {505-530}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Statistical Geometry on Sequence Space}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{eigen90b, Author = {Manfred Eigen and Katja Nieselt-Struwe}, Journal = {AIDS}, Pages = {585-593}, Title = {How old is the Immunodeficiency Virus~?}, Utilisateur = {Guillaume Andrieu}, Volume = {4(suppl1)}, Year = 1990} @article{elemento02, Author = {O. Elemento and O. Gascuel and M.-P. Lefranc }, Journal = {Molecular Biology and Evolution}, Pages = {278-288}, Title = {Reconstructing the duplication history of tandemly repeated genes}, Volume = {19}, Year = 2002} @article{erchia96, Author = {A.M. d'Erchia and C. Gissi and G. Pesole and C. Saccone and U. Arnason}, Journal = {Nature}, Pages = {597-600}, Title = {The guinea-pig is not a rodent}, Volume = 381, Year = 1996} @article{estabrook72, Author = {G.F. Estabrook}, Journal = {Ann. Rev. Ecol. Syst.}, Pages = {427-456}, Title = {Cladistic methodology: a discussion of the theoretical basis for the induction of evolutionary history}, Volume = 3, Year = 1972} @article{estabrook76, Author = {G.F. Estabrook and C.S. Johnson and F.R. McMorris}, Journal = {Mathematical Biosciences}, Pages = {181-187}, Title = {A mathematical foundation for the analysis of cladistic character compatibility}, Volume = 29, Year = 1976} @inproceedings{fk96, Author = {M. Farach and S. Kannan}, Booktitle = {Proceedings of the 28th Annual ACM Symposium on the Theory of Computing}, Pages = {230-235}, Title = {Efficient algorithms for inverting evolution}, Year = 1996} @article{farris71, Author = {James S. Farris}, Journal = {Annual Review of Ecology and Systematics}, Pages = {277-302}, Title = {The hypothesis of nonspecificity and taxonomic congruence}, Utilisateur = {Gilles Caraux}, Volume = 22, Year = 1971} @article{farris73a, Author = {James S. Farris}, Journal = {Systematic Zoology}, Pages = {250-256}, Title = {A Probability Model for Inferring Evolutionary Trees}, Utilisateur = {Guillaume Andrieu}, Volume = 22, Year = 1973} @article{farris73b, Author = {James S. Farris}, Journal = {American Naturalist}, Pages = {531-534}, Title = {Estimation of Amino-Acid Substitution when Back Mutation can occur}, Utilisateur = {Guillaume Andrieu}, Volume = 107, Year = 1973} @article{felsenstein73a, Author = {J. Felsenstein}, Journal = {The American Journal of Human Genetics}, Pages = {471-492}, Title = {Maximum-likelihood estimation of evolutionary trees from continuous characters}, Utilisateur = {Gilles Caraux}, Volume = 25, Year = 1973} @article{felsenstein73b, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Pages = {240-249}, Title = {Maximum Likelihood and Minimum Steps Methods for Estimating Evolutionnary Trees from Data on Discrete Characters}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 23, Year = 1973} @article{felsenstein78, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Pages = {401-410}, Title = {Cases in which parsimony and compatibility methods will be positively misleading}, Volume = 27, Year = 1978} @article{felsenstein81a, Author = {J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {368-376}, Title = {Evolutionary Trees from {DNA} Sequences: a Maximum Likelihood Approach}, Volume = 17, Year = 1981} @article{felsenstein81b, Author = {J. Felsenstein}, Journal = {Evolution}, Note = {({\it construction d'arbrtes par le maximum de vraisemblance})}, Number = 6, Pages = {1229-1242}, Title = {Evolutionary Trees from gene frequencies and quantitative characteres : finding maximum likelihood estimates}, Volume = 35, Year = 1981} @article{felsenstein83, Author = {J. Felsenstein}, Journal = {J. R. Statist. Soc. A}, Number = {Part 3}, Pages = {246-272}, Title = {Statistical Inference of Phylogenies}, Volume = 146, Year = 1983} @article{felsenstein84, Author = {J. Felsenstein}, Journal = {Evolution}, Number = 1, Pages = {16-24}, Title = {Distance methods for inferring phylogenies : a justification}, Utilisateur = {Gilles Caraux}, Volume = 38, Year = 1984} @article{felsenstein85a, Author = {J. Felsenstein}, Journal = {Evolution}, Pages = {783-791}, Title = {Confidence limits on phylogenies: an approach using the bootstrap}, Volume = 39, Year = 1985} @article{felsenstein85b, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Pages = {27-33}, Title = {The number of evolutionary trees}, Utilisateur = {Gilles Caraux}, Volume = 34, Year = 1985} @article{felsenstein85c, Author = {J. Felsenstein}, Journal = {Systematic Zoology}, Number = 2, Pages = {152-161}, Title = {Confidence limits on phylogenies with a molecular clock}, Utilisateur = {Gilles Caraux}, Volume = 34, Year = 1985} @article{felsenstein87, Author = {J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {123-131}, Title = { Estimation of Hominoid Phylogeny from a {DNA} Hybridation Data Set}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{felsenstein88, Author = {J. Felsenstein}, Journal = {Annual Review of Genetics}, Pages = {521-565}, Title = {Phylogenies from molecular sequences: inference and reliability}, Volume = 22, Year = 1988} @book{felsensteinbook, Address = {Sunderland, MA}, Author = {J. Felsenstein}, Publisher = {Sinauer Associates, Inc.}, Title = {Inferring phylogenies}, Year = 2003} @article{phylip1, Author = {J. Felsenstein}, Journal = {Cladistics}, Pages = {164-166}, Title = {Phylogeny Inference Package (Version 3.2)}, Volume = {5}, Year = {1989}} @book{phylip2, Address = {Department of Genetics, University of Washington, Seattle}, Author = {J. Felsenstein}, Publisher = {Distributed by the author}, Title = {PHYLIP ({PHYL}ogeny {I}nference {P}ackage) version 3.6a2}, Year = {1993}} @article{gaucher01, Author = {E. Gaucher and M. Miyamoto and S. Benner}, Journal = {PNAS}, Pages = {548-552}, Title = {Function-structure analysis of proteins using covarion-based evolutionary approaches: {E}longation factors}, Volume = 98, Year = 2001} @ARTICLE{gouy09, author = { Manolo Gouy and Stephane Guindon and Olivier Gascuel}, title = {Sea{V}iew version 4: {A} multiplatform graphical user interface for sequence alignment and phylogenetic tree building.}, journal = {Mol Biol Evol}, year = {2010}, volume = {27}, number = {2}, pages = {221-4} } @article{haydon01, Author = {D. Haydon and A. Bastos and N. Knowles and A. Samuel}, Journal = {Genetics}, Pages = {7-15}, Title = {Evidence for Positive Selection in Foot-and-Mouth Disease Virus Capsid Genes From Field Isolates}, Volume = 157, Year = 2001} @article{henikoff92, Author = {S. Henikoff and J. Henikoff}, Journal = {PNAS}, Pages = {10915-10919}, Title = {Amino acid substitution matrices from protein blocks.}, Volume = 89, Year = 1992} @article{hordijk05, Author = {W. Hordijk and O. Gascuel}, Journal = {Bioinformatics}, Pages = {4338-4347}, Title = {Improving the efficiency of {SPR} moves in phylogenetic tree search methods based on maximum likelihood.}, Volume = 21, Year = 2005} @article{huelsenbeck00, Author = {J. Huelsenbeck and B. Larget and D. Swofford}, Journal = {Genetics}, Pages = {1879-1892}, Title = {A compound {P}oisson process for relaxing the molecular clock}, Volume = 154, Year = 2000} @article{kuhner94, Author = {M. Kuhner and J. Felsenstein}, Journal = {Molecular Biology and Evolution}, Pages = {459-468}, Title = {A Simulation Comparison of Phylogeny Algorithms under Equal and Unequal Evolutionary Rates}, Volume = 11, Year = 1994} @article{felsenstein96, Author = {J. Felsenstein and G.A. Churchill}, Journal = {Molecular Biology and Evolution}, Pages = {93-104}, Title = {A Hidden {M}arkov Model approach to variation among sites in rate of evolution}, Volume = 13, Year = 1996} @incollection{feng90, Address = {New-York}, Author = {Da-Fei Feng and Russel F. Doolittle}, Booktitle = {Progressive alignement and phylogenetic tree construction of protein sequences}, Chapter = 23, Editor = {Russsell F. Doolittle}, Pages = {375-387}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Nearset Neighbor Procedure for relating Progressively Amino Acid Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{fitch67, Author = {W. M. Fitch and E. Margoliash}, Journal = {Science}, Pages = {279-284}, Title = {Construction of phylogenetic trees}, Volume = 155, Year = 1967} @article{fitch71, Author = {Walter M. Fitch}, Journal = {Systematic Zoology}, Title = {Toward defining the course of evolution : minimum change for a specific tree topology}, Year = 1971} @inproceedings{fitch75, Author = {W.M. Fitch}, Booktitle = {Proceedings of the 8th International Conference on Numerical Taxonomy}, Pages = {189-230}, Title = {Towards finding the tree of Maximum Parsimony}, Year = 1975} @article{fitch81, Author = {W. M. Fitch}, Journal = {Journal of Molecular Evolution}, Pages = {30-37}, Title = {A non-sequential method for constructing trees and hierarchical classifications}, Volume = 18, Year = 1981} @article{fitchfarris74, Author = {Walter M. Fitch and James S. Farris}, Journal = {Journal of Molecular Evolution}, Note = {etendent la meth de Fitch71 pr les acides amines, car il y a pr ce type de data qq ambiguites.}, Pages = {263-278}, Title = {Evolutionary trees with minimum nucleotide replacements form amino acid sequences}, Utilisateur = {Vincent}, Volume = 3, Year = 1974} @article{forsberg03, Author = {R. Forsberg and F. Christiansen}, Journal = {Molecular Biology and Evolution}, Pages = {1252-1259}, Title = {A codon-based model of host-specific selection in parasites with an application to the {I}nfluenza {A} virus}, Volume = 20, Year = 2003} @article{foulds84, Author = {L.R. Foulds}, Journal = {Journal of Theoretical Biology}, Pages = {471-474}, Title = {Maximum Savings in the Steiner Problem in Phylogeny}, Volume = 107, Year = 1984} @article{frommel85, Author = {C. Fr\H{o}mmel and H. G. Holzh\H{u}tter}, Journal = {Journal of Molecular Evolution}, Pages = {233-257}, Title = {an estimate on the effect of point mutation and natural selection on the rate of amino acid replacement in proteins }, Utilisateur = {Guillaume Andrieu}, Volume = 21, Year = 1985} @article{fukami89, Author = {K. Fukami and Y. Tateno}, Journal = {Journal of Molecular Evolution}, Pages = {460-464}, Title = {On the maximum likelihood method for estimating molecular trees : uniquesness of the likelihood point}, Utilisateur = {Gilles Caraux}, Volume = 28, Year = 1989} @phdthesis{galtierthese, Author = {N. Galtier}, Month = {novembre}, School = {Universit{\'e} Claude Bernard - Lyon I}, Title = {L'approche statistique en phylog{\'e}nie mol{\'e}culaire~: influence des composition en bases variables}, Year = 1997} @article{galtier01, Author = {N. Galtier}, Journal = {Molecular Biology and Evolution}, Pages = {866-873}, Title = {Maximum-likelihood phylogenetic analysis under a covarion-like model}, Volume = 18, Year = 2001} @article{galtier99, Author = {N. Galtier and N. Tourasse and M. Gouy}, Journal = {Science}, Pages = {220-221}, Title = {A nonhyperthermophilic common ancestor to extant life forms}, Volume = 283, Year = 1999} @article{galtier98, Author = {N. Galtier and M. Gouy}, Journal = {Molecular Biology and Evolution}, Pages = {871-879}, Title = {Inferring pattern and process: maximum-likelihood implementation of a nonhomogeneous model of {DNA} sequence evolution for phylogenetic analysis}, Volume = 15, Year = 1998} @article{galtier95, Author = {N. Galtier and M. Gouy}, Journal = {PNAS}, Pages = {11317-11321}, Title = {Inferring phylogenies from {DNA} sequences of unequal base compositions}, Volume = 92, Year = 1995} @article{galtier04, Author = {N. Galtier and A. Jean-Marie}, Journal = {Journal of Computational Biology}, Pages = {727-733}, Title = {Markov-modulated {M}arkov chains and the covarion process of molecular evolution}, Volume = 11, Year = 2004} @book{gamerman06, Author = {Dani Gamerman and Hedibert F. Lopes }, Isbn = {1584885874}, Publisher = {Chapman and Hall/CRC}, Title = {Markov Chain Monte Carlo: Stochastic Simulation for Bayesian Inference}, Year = {2006}} @book{gareyjohnson, Address = {San Fransisco}, Author = {M. Garey and D. Johnson}, Publisher = {Freeman}, Title = {{C}omputers and {I}ntractability - {A} guide to the {T}heory of {NP}-{C}ompleteness}, Year = 1979} @article{gascuel92, Author = {O. Gascuel and G. Caraux}, Journal = {Pattern Recognition letters}, Note = {({\it Estimation d'une probab {\`a} partir d'une fr{\'e}quence}) }, Pages = {757-764}, Title = {{D}istribution-free performance bounds with the resubstitution error estimate}, Volume = {13}, Year = {1992}} @article{gascuel94, Author = {O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {961-963}, Title = {A Note on {S}attah and {T}versky's, {S}aitou and {N}ei's, and {S}tudier and {K}eppler's Algorithms for Inferring Phylogenies from Evolutionary Distances}, Volume = {11}, Year = {1994}} @article{gascuel96, Author = {O. Gascuel and D. Levy}, Journal = {J. of Classification}, Title = {A reduction for approximating a (non-metric) dissimilarity by a tree distance}, Year = 1996} @article{gascuelNJ, Author = {O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {685-695}, Title = {{B}IO{NJ}: an Improved Version of the {NJ} Algorithm Based on a Simple Model of Sequence Data}, Volume = {14}, Year = 1997} @article{gascuel00, Author = {O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {401-405}, Title = {On the optimization principle in phylogenetic analysis and the minimum-evolution criterion}, Volume = 17, Year = 2000} @article{gascuel01, Author = {O. Gascuel and D. Bryant and F. Denis}, Journal = {Systematic Biology}, Pages = {621-627}, Title = {Strengths and limitations of the minimum evolution principle}, Volume = {50}, Year = 2001} @article{gascuel03, Author = {O. Gascuel and M. Hendy and A. Jean-Marie and R. McLachlan}, Journal = {Systematic Biology}, Pages = {110-118}, Title = {The combinatorics of tandem duplication trees}, Volume = {52}, Year = {2003}} @incollection{gascuel97, Address = {Providence, USA}, Author = {O. Gascuel}, Booktitle = {Mathematical Hierarchies and Biology}, Editor = {B. Mirkin and F.R. McMorris and F.S. Roberts and A. Rzhetsky}, Pages = {149-170}, Publisher = {Am. Math. Society}, Title = {Concerning the {NJ} algorithm and its unweighted version {UNJ}}, Year = 1997} @incollection{gascuel05, Address = {Oxford}, Author = {O. Gascuel and D. Bertrand and O. Elemento}, Booktitle = {Mathematics of evolution and phylogeny}, Editor = {O. Gascuel}, Pages = {205-235}, Publisher = {Clarendon press}, Title = {Reconstructing the duplication history of tandemly repeated sequences}, Year = 2005} @Article{gaut92, Author="Gaut, B. S. and Muse, S. V. and Clark, W. D. and Clegg, M. T. ", Title="{{R}elative rates of nucleotide substitution at the rbc{L} locus of monocotyledonous plants}", Journal="Journal of Molecular Evolution", Year="1992", Volume="35", Pages="292--303", Month="Oct" } @article{gaut95, Author = {B.S. Gaut and P.O. Lewis}, Journal = {Molecular Biology and Evolution}, Pages = {152-162}, Title = {Success of maximum likelihood phylogeny inference in the four-taxon case}, Volume = 12, Year = 1995} @book{gill81, Address = {London}, Author = {P. Gill and W. Murray and M. Wright}, Publisher = {Academic Press}, Title = {Practical optimization}, Year = 1981} @article{geman84, author = {Geman, Stuart and Geman, Donald}, journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, keywords = {annealing, mrf, simulated}, month = {November}, number = {6}, pages = {721--741}, posted-at = {2008-05-07 06:09:28}, priority = {2}, publisher = {Routledge}, title = {Stochastic relaxation, Gibbs distributions and the Bayesian restoration of images}, volume = {6}, year = {1984} } @dea{giordano91, Address = {Montpellier}, Author = {Jean-Yves Giordano}, School = {Universit{\'e} Montpellier II}, Title = {{R}epr{\'e}sentation arbor{\'e}e des {P}roximit{\'e}s et {A}rbres {P}hyllog{\'e}n{\'e}tique}, Utilisateur = {Guillaume Andrieu}, Year = 1991} @article{gojobori82, Author = {Takashi Gojobori and Kazushige Ishii and Masatoshi Nei}, Journal = {Journal of Molecular Evolution}, Pages = {414-423}, Title = {Estimation of Average Number of Nucleotide Substitutions when the Rate of Substitution varies with Nucleotide}, Utilisateur = {Guillaume Andrieu}, Volume = 18, Year = 1982} @incollection{gojobori90, Author = {Takashi Gojobori and Etsuko N. Moriyama and M. Kimura}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 33, Editor = {Russsell F. Doolittle}, Pages = {531-550}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Statistical Methods for Estimating Sequence Divergence}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{golding83, Author = {G. B. Golding}, Journal = {Molecular Biology and Evolution}, Pages = {125-142}, Title = {Estimates of {DNA} and protein sequence divergence: an examination of some assumptions}, Volume = 1, Year = 1983} @article{goldman93, Author = {N. Goldman }, Journal = {Journal of Molecular Evolution}, Pages = {182-198}, Title = {Statistical tests of models of {DNA} substitution}, Volume = 36, Year = 1993} @article{goldman94, Author = {N. Goldman and Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {725-736}, Title = {A Codon-based model of nucleotide substitution for protein-coding {DNA} sequences}, Volume = 11, Year = 1994} @article{goldman98a, Author = {N. Goldman}, Journal = {Proceedings of the Royal Society B: Biological Sciences}, Pages = {1779-1786}, Title = {Phylogenetic information and experimental design in molecular systematics }, Volume = 265, Year = 1998} @article{goldman98b, Author = {N. Goldman and J. Thorne and D. Jones}, Journal = {Genetics}, Pages = {445-458}, Title = {Assessing the impact of secondary structure and solvent accessibility on protein evolution}, Volume = 149, Year = 1998} @article{goldman00, Author = {N. Goldman and S. Whelan}, Journal = {Molecular Biology and Evolution}, Pages = {975-978}, Title = {Statistical tests of {G}amma-distributed rate heterogeneity in models of sequence evolution in phylogenetics}, Volume = 17, Year = 2000} @article{goodman65, Author = {Leo A. Goodman}, Journal = {Technometrics}, Month = {MAY}, Number = 2, Pages = {247-253}, Title = {On Simultaneous Confidence Intervals for Multinomial Proportions }, Volume = 7, Year = 1965} @article{gouy84, Author = {M. Gouy and F. Milleret and C. Mugnier and M. Jacobzone and C. Gautier}, Journal = {Nucleic Acids Research}, Number = 2, Pages = {121-127}, Title = {{ACNUC}: a nucleic acid sequence data base and analysis system}, Volume = 12, Year = 1984} @article{graur91, Author = {D. Graur and W.A. Hide and W.-H. Li}, Journal = {Nature}, Pages = {649-652}, Title = {Is the guinea-pig a rodent?}, Volume = 351, Year = 1991} @article{gu95, Author = {X. Gu and Y.X. Fu and W.H. Li}, Journal = {Molecular Biology and Evolution}, Pages = {546-557}, Title = {Maximum likelihood estimation of the heterogeneity of substitution rate among nucleotide sites}, Volume = 12, Year = 1995} @article{gu97, Author = {X. Gu and J.D. Zhang}, Journal = {Molecular Biology and Evolution}, Pages = {1106-13}, Title = {A simple method for estimating the parameter of substitution rate variation among sites}, Volume = 14, Year = 1997} @article{gu98, Author = {X. Gu and W.H. Li}, Journal = {PNAS}, Pages = {5899-5905}, Title = {Estimation of evolutionary distances under stationary and nonstationary models of nucleotide substitution}, Volume = 95, Year = 1998} @inproceedings{guenoche00, Author = {Alain Gu{\'e}noche}, Booktitle = {Recueil des Actes JOBIM 2000}, Editor = {O. Gascuel and M.-F Sagot}, Pages = {181-191}, Title = {Quelle confiance accorder {\`a} une repr{\'e}sentation arbor{\'e}e ?}, Year = 2000} @article{guenoche87, Author = {Alain Guenoche}, Journal = {Math. Sci. hum.}, Pages = {21-40}, Title = {Cinq algorithmes d'approximation d'une dissimilarit{\'e} par des arbres {\`a} distances additives}, Utilisateur = {Gilles Caraux and Denise Levy}, Volume = 98, Year = 1987} @inproceedings{guenoche00b, Author = {A. Gu{\'e}noche and H. Garreta}, Booktitle = {Computational biology, LNCS 2066}, Pages = {45-46}, Title = {Can we have confidence in a tree representation ?}, Year = 2000} @book{gilks95, author = {W. R. Gilks and S. Richardson and D. Spiegelhalter}, publisher = {{Chapman \& Hall/CRC}}, title = {Markov Chain Monte Carlo in Practice}, year = {1995} } @article{gray09, author="R. Gray and A. Drummond and Greenhill S.", title="Language phylogenies reveal expansion pulses and pauses in {P}acific settlement", journal="Science", year="2009", pages={479-483} } @article{guindon01, Author = {S. Guindon and G. Perri{\`e}re}, Journal = {Molecular Biology and Evolution}, Pages = {1838-40}, Title = {Intragenomic base content variation is a potential source of biases when searching for horizontally transferred genes}, Volume = 18, Year = 2001} @article{guindon02, Author = {S. Guindon and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {534-543}, Title = {Efficient biased estimation of evolutionary distances when substitution rates vary across sites}, Volume = 19, Year = 2002} @article{guindon03, Author = {S. Guindon and O. Gascuel}, Journal = {Systematic Biology}, Pages = {696-704}, Title = {A simple, fast and accurate algorithm to estimate large phylogenies by maximum likelihood}, Volume = 52, Year = 2003} @article{guindon04, Author = {S. Guindon and A. Rodrigo and K. Dyer and J. Huelsenbeck}, Journal = {PNAS}, Pages = {12957-12962}, Title = {Modeling the site-specific variation of selection patterns along lineages}, Volume = {101}, Year = 2004} @article{guindon05, Author = {S. Guindon and F. Lethiec and P. Duroux and O. Gascuel}, Journal = {Nucleic Acids Research}, Pages = {557-559}, Title = {{PHYML} {O}nline -- a web server for fast maximum likelihood-based phylogenetic inference}, Volume = {33(Web Server issue)}, Year = 2005} @article{guindon06, Author = {S. Guindon and M. Black and A. Rodrigo}, Journal = {Molecular Biology and Evolution}, Pages = {919-926}, Title = {Control of the False Discovery Rate Applied to the Detection of Positively Selected Amino Acid Sites.}, Volume = {23}, Year = 2006} @article{gusfield91, Author = {D. Gusfield}, Journal = {Networks}, Pages = {19-28}, Title = {Efficient Algorithms for inferring evolutionnary trees}, Volume = 21, Year = 1991} @article{hamming, Author = {R. W. Hamming}, Journal = {The Bell System Technical Journal}, Number = 2, Pages = {147-160}, Title = {Error Detecting and Error Correcting Codes}, Utilisateur = {Gilles Caraux and Guillaume Andrieu }, Volume = 26, Year = 1950} @article{harshman94, Author = {J. Harshman}, Journal = {Systematic Biology}, Number = 3, Pages = {419-424}, Title = {The effect of irrelevant characters on bootstrap values}, Utilisateur = {Vincent}, Volume = 43, Year = 1994} @article{hartigan72, Author = {J. Hartigan}, Journal = {Biometrics}, Pages = {53-65}, Title = {Minimum mutation fits to a given tree}, Volume = 29, Year = 1972} @article{hasegawa85, Author = {M. Hasegawa and H. Kishino and T. Yano}, Journal = {Journal of Molecular Evolution}, Pages = {160-174}, Title = {Dating of the {H}uman-{A}pe Splitting by a Molecular Clock of Mitochondrial-{DNA}}, Utilisateur = {Guillaume Andrieu}, Volume = 22, Year = 1985} @article{hasegawa87, Author = {M. Hasegawa and H. Kishino and T. Yano}, Journal = {Journal of Molecular Evolution}, Pages = {132-147}, Title = {Man's Place in Hominoidea as Inferred from Molecular Clocks of {DNA}}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{hasegawa89, Author = {H. Kishino and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {170-179}, Title = {Evaluation of the maximum likelihood estimate of the evolutionnary tree topology from {DNA} sequence data, and the branching order in Homonoidea}, Volume = 29, Year = 1989} @article{hasegawa94, Author = {M. Hasegawa and H. Kishino}, Journal = {Molecular Biology and Evolution}, Pages = {142-145}, Title = {Accuracies of the Simple Methods for Estimating the Bootstrap Probability of a Maximum-Likelihood Tree}, Volume = 11, Year = 1994} @article{hein89, Author = {J. Hein}, Journal = {Molecular Biology and Evolution}, Pages = {669-684}, Title = {A tree reconstruction method that is economical in the number of pairwise comparisons used.}, Utilisateur = {Vincent}, Volume = 6, Year = 1989} @incollection{hein90, Author = {J. Hein}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 39, Editor = {Russsell F. Doolittle}, Pages = {626-644}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Unified Approach to Alignement and Phylogenies}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{hein93, Author = {Jotun Hein }, Journal = {Journal of Molecular Evolution}, Pages = {396-405}, Title = {a heuristic method to reconstruct the history of sequences subject to recombinaison}, Utilisateur = {G. Andrieu}, Volume = 36, Year = 1993} @incollection{hendy82, Author = {M.D. Hendy and D. Penny}, Booktitle = {Mathematical Biosciences}, Pages = {277-290}, Publisher = {Elsevier Science Publishing}, Title = {Branch and bound Algorithms to Determine Minimal Evolutionary Trees}, Utilisateur = {Vincent}, Volume = 59, Year = 1982} @article{hendy89, Author = {M.D. Hendy and D. Penny}, Journal = {Syst Zool}, Number = 4, Pages = {297-309}, Title = {A framework for the quantitative study of evolutionary trees}, Utilisateur = {Vincent}, Volume = 38, Year = 1989} @article{hendy93, Author = {M.D. Hendy and D. Penny}, Journal = {Journal of Classification}, Pages = {297-309}, Title = {Spectral analysis of phylogenetic data}, Volume = 10, Year = 1993} @article{hendy94, Author = {M. Hendy and D. Penny and M. A. Steel}, Journal = {PNAS}, Pages = {3339-3343}, Title = {A discrete {F}ourier analysis for evolutionary trees}, Volume = 91, Year = 1994} @article{hg01, Author = {{International Human Genome Sequencing Consortium}}, Journal = {Nature}, Pages = {860-921}, Title = {Initial sequencing and analysis of the human genome}, Volume = 409, Year = 2001} @incollection{higgins96, Address = {San Diego}, Author = {D. G. Higgins and J. D. Thompson and J. T. Gibbson}, Booktitle = {Methods in enzymology}, Editor = {R. F. Doolittle}, Pages = {383-401}, Publisher = {Academic Press}, Title = {Using {CLUSTAL} for multiple sequence alignments}, Year = 1996} @inbook{hiv_epitope, Address = {Los Alamos, New Mexico}, Author = {B. Korber and C. Brander and B. Haynes and R. Koup and C. Kuiken and J. Moore and B. Walker and D. Watkins}, Publisher = {Los Alamos National Laboratory, Theoretical Biology and Biophysics}, Title = {{HIV} molecular immunology database 2002}, Year = 2002} @inbook{karlin, Address = {New York}, Author = {Samuel Karlin}, Chapter = { No VII Examples of continuous Time {M}arkov Chains }, Pages = {189-209}, Publisher = {Academic Press}, Title = {A first course in Stochastic processes}, Utilisateur = {Guillaume Andrieu}, Year = 19} @article{koshi96, Author = {J. Koshi and R. Goldstein}, Journal = {Journal of Molecular Evolution}, Pages = {313-320}, Title = {Probabilistic reconstruction of ancestral protein sequences}, Volume = 42, Year = 1996} @article{koshi98, Author = {J. Koshi and R. Goldstein}, Journal = {Proteins}, Pages = {289-295}, Title = {Models of natural mutations including site heterogeneity}, Volume = 32, Year = 1998} @article{kirkpatrick83, Author = {S. Kirkpatrick and C. D. Gelatt and M. P. Vecchi}, Journal = {Science}, Pages = {671-680}, Title = {Optimization by simulated annealing}, Volume = 220, Year = 1983} @inbook{hillis91, Author = {D.M. Hillis}, Chapter = 13, Note = {Preliminsaire a l'article hilhuels92}, Pages = {278-294}, Title = {Discriminating Between Phylogenetic Signal and Random Noise in {DNA} Sequences}, Utilisateur = {Vincent}} @article{hillishuels92, Author = {D.M. Hillis and J.P. Huelsenbeck}, Journal = {Journal of Heredity}, Note = {Examine la distribution des arbres les plus parcimonieux : gaussienne applatie}, Pages = {189-195}, Title = {Signal, Noise, and Reliability in Molecular Phylogenetic Analyses}, Volume = 83, Year = 1992} @article{ho05, Author = {S. Ho and M. Phillips and A. Drummond and A. Cooper}, Journal = {Molecular Biology and Evolution}, Pages = {1355-1363}, Title = {Accuracy of rate estimation using relaxed-clock models with a critical focus on the early {M}etazoan radiation}, Volume = 22, Year = 2005} @article{holm79, Author = {S. Holm}, Journal = {Scandinavian Journal of Statistics}, Pages = {65-70}, Title = {A simple sequentially rejective multiple test procedure}, Volume = 6, Year = 1979} @article{holmquist72a, Author = {Richard Holmquist}, Journal = {Journal of Molecular Evolution}, Pages = {115-133}, Title = {Theoretical foundations for a quantitative approach to paleogenetics {Part I : DNA}}, Utilisateur = {Gilles Caraux et Guillaume Andrieu}, Volume = 1, Year = 1972} @article{holmquist72b, Author = {Richard Holmquist}, Journal = {Journal of Molecular Evolution}, Pages = {211-222}, Title = {Empirical support for stochastic model of evolution}, Utilisateur = {Gilles Caraux et Guillaume Andrieu}, Volume = 1, Year = 1972} @article{holmquist83, Author = {R. Holmquist and M. Goodman and T. Conroy and J. Czelusniak}, Journal = {Journal of Molecular Evolution}, Pages = {437-448}, Title = {The spatial distribution of fixed mutations within genes coding for proteins}, Volume = 19, Year = 1983} @article{huelsenbeck93, Author = {J. P. Huelsenbeck and D. Hillis}, Journal = {Systematic Biology}, Pages = {247-264}, Title = {Success of phylogenetic methods in the four-taxon case}, Volume = 42, Year = 1993} @article{huelsenbeck95a, Author = {J. P. Huelsenbeck}, Journal = {Systematic Biology}, Pages = {17-48}, Title = {Performance of phylogenetic methods in simulation}, Volume = 44, Year = 1995} @article{huelsenbeck95b, Author = {J. P. Huelsenbeck}, Journal = {Molecular Biology and Evolution}, Pages = {843-849}, Title = {The robustness of two phylogenetic methods: four-taxon simulations reveal a slight superiority of maximum likelihood over neighbor joining}, Volume = 12, Year = 1995} @article{huelsenbeck97a, Author = {J. P. Huelsenbeck and K. A. Crandall}, Journal = {Annual Review of Ecology and Systematics}, Pages = {437-466}, Title = {Phylogeny estimation and hypothesis testing using maximum likelihood}, Volume = 28, Year = 1997} @article{huelsenbeck97b, Author = {J. Huelsenbeck and B. Rannala}, Journal = {Science}, Pages = {218-219}, Title = {Phylogenetic methods come of age: testing hypotheses in an evolutionary context}, Volume = 276, Year = 1997} @article{huelsenbeck99, Author = {J. Huelsenbeck and R. Nielsen}, Journal = {Journal of Molecular Evolution}, Pages = {86-93}, Title = {Variation in the pattern of nucleotide substitution across sites}, Volume = 48, Year = 1999} @article{huelsenbeck01, Author = {J. Huelsenbeck and F. Ronquist}, Journal = {Bioinformatics}, Pages = {754-755}, Title = {{MRBAYES} : Bayesian inference of phylogenetic trees}, Volume = 17, Year = 2001} @article{huelsenbeck01a, Author = {J. P. Huelsenbeck and F. Ronquist and R. Nielsen and J. P. Bollack}, Journal = {Science}, Pages = {2310-2314}, Title = {Bayesian Inference of Phylogeny and Its Impact on Evolutionary Biology}, Volume = 294, Year = 2001} @article{huelsenbeck01c, Author = {J. P. Huelsenbeck and J. P. Bollback}, Journal = {Systematic Biology}, Pages = {351-366}, Title = {Empirical and hierarchical bayesian estimation of ancestral states}, Volume = 50, Year = 2001} @article{huelsenbeck02, Author = {J. P. Huelsenbeck}, Journal = {Molecular Biology and Evolution}, Pages = {698-707}, Title = {Testing a Covariotide Model of {DNA} Substitution}, Volume = 19, Year = 2002} @article{huelsenbeck04, Author = {J. Huelsenbeck and B. Larget and M. Alfaro}, Journal = {Molecular Biology and Evolution}, Pages = {1123-1133}, Title = {Bayesian phylogenetic model selection using reversible jump markov chain monte carlo.}, Volume = 21, Year = 2004} @article{huelsenbeck04b, Author = {J. Huelsenbeck and K. Dyer}, Journal = {Journal of Molecular Evolution}, Pages = {661-672}, Title = {Bayesian estimation of positively selected sites}, Volume = 58, Year = 2004} @article{huelsenbeck06, Author = {J. Huelsenbeck and S. Jain and S. Frost and S. Pond}, Journal = {PNAS}, Pages = {6263-6268}, Title = {A Dirichlet process model for detecting positive selection in protein-coding {DNA} sequences}, Volume = 103, Year = 2006} @article{hughes88, Author = {A. Hughes and M. Nei}, Journal = {Nature}, Pages = {167-170}, Title = {Pattern of nucleotide substitution at major histocompatibility complex class {I} loci reveals overdominant selection}, Volume = 335, Year = 1988} @article{hughes90, Author = {A. Hughes and T. Ota and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {515-524}, Title = {Positive darwinian selection promotes charge profile diversity in the antigen-binding cleft of class {I} major-histocompatibility-complex molecules}, Volume = 7, Year = 1990} @article{mrbayes, Author = {J. P. Huelsenbeck and F. Ronquist}, Journal = {Bioinformatics}, Pages = {754-755}, Title = {{M}r{B}ayes: {B}ayesian inference of phylogeny}, Volume = 17, Year = 2001} @article{irwin91, Author = {David M. Irwin and Thomas D. Kocher and Allan C. Wilson}, Journal = {Journal of Molecular Evolution}, Pages = {128-144}, Title = {{E}volution of the {C}ytochrome {\em b} {G}ene of {M}amals}, Utilisateur = {F.Catzeflis et G. Andrieu}, Volume = 32, Year = 1991} @techreport{jiang92, Author = {T. Jiang and Ming Li}, Institution = {Mc Master Univ. and University of Waterloo}, Title = {Some optimizations problems related to molecular biology}, Year = 1992} @article{jiang94, Author = {Tao Jiang, Eugene L. Lawler, Lusheng Wang}, Title = {Aligning Sequences via an Evolutionary Tree: Complexity and Approximation}, Year = 1994} @article{jin90, Author = {L. Jin and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {82-102}, Title = {Limitations of the evolutionary parsimony method of phylogenetic analysis}, Volume = 7, Year = 1990} @article{jin94, Author = {Li Jin and Ranajit Chakraborty}, Journal = {Molecular Biology and Evolution}, Pages = {120-127}, Title = {Estimation of genetic distance and coefficient of gene diversity from single-probe multilocus {DNA} fingerprinting data}, Utilisateur = {Gilles Caraux}, Volume = 11, Year = 1994} @incollection{johnson90, Address = {New York}, Author = {Mark S. Johnson and Andrej Sali and Tom L. Blundell}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 42, Editor = {Russsell F. Doolittle}, Pages = {670-690}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Phylogenetic Relationships from Three-Dimensional Protein Structures}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{jones92, Author = {D. Jones and W. Taylor and J. Thornton}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {275-282}, Title = {The rapid generation of mutation data matrices from protein sequences}, Volume = 8, Year = 1992} @incollection{jukes69, Address = {New York}, Author = {T. Jukes and C. Cantor}, Booktitle = {Mammalian Protein Metabolism}, Chapter = {24}, Editor = {H. Munro}, Pages = {21-132}, Publisher = {Academic Press}, Title = {Evolution of protein molecules}, Utilisateur = {Gilles Caraux}, Volume = {III}, Year = 1969} @Manual{R, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2013}, url = {http://www.R-project.org/}, } @article{kaj03, title={The coalescent process in a population with stochastically varying size}, author={Kaj, Ingemar and Krone, Stephen M}, journal={Journal of Applied Probability}, Volume = 40, pages={33--48}, year={2003}, publisher={JSTOR} } @article{kannan95, Author = {S. Kannan and T. Warnow}, Journal = {SIAM J. Comp.}, Number = 3, Pages = {511-519}, Title = {Tree reconstruction from partial orders}, Volume = 24, Year = 1995} @article{kannan97, Author = {S. Kannan}, Journal = {Journal of the indian institute of science}, Number = 4, Pages = {353-364}, Title = {consensus of trees : desirable properties and computationnal methods}, Volume = 77, Year = 1997} @article{kaplan79, Author = {N. Kaplan and C.H. Langley}, Journal = {Journal of Molecular Evolution}, Pages = {295-304}, Title = {A new estimate of sequence divergence of mitochondrial {\sc DNA} Using restriction endonuclease mappings}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 13, Year = 1979} @inbook{karlin, Address = {New York}, Author = {Samuel Karlin}, Chapter = { No VII Examples of continuous Time {M}arkov Chains }, Pages = {189-209}, Publisher = {Academic Press}, Title = {A first course in Stochastic processes}, Utilisateur = {Guillaume Andrieu}, Year = 19} @article{karlin93, Author = {Samuel Karlin and Stephen F. Altschul}, Journal = {PNAS}, Pages = {5873-5877}, Title = {Applications and Statistics for multiple hight-scoring segments in molecular Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 90, Year = 1993} @article{kashyap74, Author = {R. L. Kashyap and S. Subas}, Journal = {Journal of Theoretical Biology}, Pages = {75-101}, Title = {Statistical estimation of parameters in a phylogenetic tree using a dynamic model of the substitutional process}, Utilisateur = {Gilles Caraux}, Volume = 47, Year = 1974} @article{kaslow87, Author = {R. Kaslow and D. Ostrow and R. Detel and J. Phair and B. Polk and C. Rinaldo}, Journal = {American Journal of Epidemiology}, Pages = {310-318}, Title = {The {M}ulticenter {AIDS} {C}ohort {S}tudy : rationale, organization, and selected characteristics of the participants}, Volume = 126, Year = 1987} @book{kendall73, Address = {London}, Author = {M. G. Kendall and A. Stuart}, Publisher = {Griffin}, Title = {The Advanced Theory of Statistics}, Volume = {II~: Inference and relationship}, Year = 1973} @article{kidd71, Author = {K.K. Kidd and L.A. Sgaramella-Zonta}, Journal = {The American Journal of Human Genetics}, Pages = {235-252}, Title = {Phylogenetic analysis: concepts and methods}, Volume = 23, Year = 1971} @article{kimura72, Author = {M. Kimura and Tomoko Otha}, Journal = {Journal of Molecular Evolution}, Pages = {87-90}, Title = { On the stochastic model for estimation of mutational distance between homologous proteins}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 2, Year = 1972} @article{kimura80, Author = {M. Kimura}, Journal = {Journal of Molecular Evolution}, Pages = {111-120}, Title = {A simple method for estimating evolutionary rates of base substitutions through comparative studies of nucleotide sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 16, Year = 1980} @article{kimura81, Author = {M. Kimura}, Journal = {PNAS}, Pages = {454-458}, Title = {Estimation of evolutionary distances between homologous nucleotide sequences}, Volume = 78, Year = 1981} @article{kimura87, Author = {M. Kimura}, Journal = {Journal of Molecular Evolution}, Pages = {24-33}, Title = {Molecular Evolutionnary Clock and the Neutral Theory}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{kingman82, Author = {Kingman, J. F. C. }, Citeulike-Article-Id = {3431666}, Journal = {Stochastic Processes and their Applications}, Keywords = {coalescent, ebsp-paper}, Pages = {235--248}, Posted-At = {2008-10-20 21:06:45}, Priority = {0}, Title = {The coalescent}, Volume = {13}, Year = {1982}} @article{kishino89, Author = {H. Kishino and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {170-179}, Title = {Evaluation of the Maximum Likelihood Estimate of the Evolutionnary Tree Topology from {DNA} Sequence Data, and the Branching Order in Hominoidea}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 29, Year = 1989} @incollection{kishino90, Address = {New York}, Author = {H. Kishino and M. Hasegawa }, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 34, Editor = {Russsell F. Doolittle}, Pages = {550-570}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Converting Distance to Time : Application to Human Evolution}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{kishino90b, Author = {H. Kishino and T. Miyata and M. Hasegawa}, Journal = {Journal of Molecular Evolution}, Pages = {151-160}, Title = {Maximum likelihood inference of protein phylogeny and the origin of chloroplasts}, Volume = 31, Year = 1990} @Article{kishino01, Author="Kishino, H. and Thorne, J. and Bruno, W.", Title="{{P}erformance of a divergence time estimation method under a probabilistic model of rate evolution}", Journal="Molecular Biology and Evolution", Year="2001", Volume="18", Pages="352--361", Month="Mar" } @Article{kitazoe07, Author="Kitazoe, Y. and Kishino, H. and Waddell, P. J. and Nakajima, N. and Okabayashi, T. and Watabe, T. and Okuhara, Y. ", Title="{{R}obust time estimation reconciles views of the antiquity of placental mammals}", Journal="PLoS ONE", Year="2007", Volume="2", Pages="e384" } @article{klotz79, Author = {Lynn C. Klotz and Ned Komar and Roger L. Blanken and Ralph M. Mitchell}, Journal = {PNAS}, Pages = {4516-4520}, Title = {Calculation of evolutionary trees from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 76, Year = 1979} @article{klotz81, Author = {Lynn C. Klotz and Roger L. Blanken}, Journal = {Journal of Theoretical Biology}, Pages = {261-272}, Title = {A practical method for calculating evolutionary trees from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 91, Year = 1981} @article{kolaczkowski04, Author = {B. Kolaczkowski and J. Thornton}, Journal = {Nature}, Pages = {980-984}, Title = {Performance of maximum parsimony and likelihood phylogenetics when evolution is heterogeneous}, Volume = 431, Year = 2004} @article{kondo93, Author = {Rumi Kondo and Satoshi Horai and Yoko Satta and Naoyuki Takahata}, Journal = {Journal of Molecular Evolution}, Pages = {517-531}, Title = {Evolution of Hominoid Mitochondrial {DNA} with special Reference to the \\ Silent Substitution Rate over the Genome }, Utilisateur = {Guillaume Andrieu}, Volume = 36, Year = 1993} @article{kondrashov02, Author = {A.S. Kondrashov and S. Sunyaev and F.A. Kondrashov}, Journal = {PNAS}, Pages = {14878-14883}, Title = {Dobzhansky-{M}uller incompatibilities in protein evolution}, Volume = 99, Year = 2002} @article{kosiol04, Author = {C. Kosiol and N. Goldman}, Journal = {Molecular Biology and Evolution}, Pages = {193-199}, Title = {Different versions of the {D}ayhoff rate matrix}, Volume = {22}, Year = 2004} @incollection{kruskal71, Author = {J. B. Kruskal and Isidor Dyen and Paul Black}, Booktitle = {Mathematics in the archeological and histor. sciences}, Editor = {F. R. Hodson and D. G. Kendall and P. Tautu}, Pages = {361-380}, Publisher = {Edinburgh University Press}, Title = {The vocabulary method of reconstructing language trees: innovations and large-scale applications}, Utilisateur = {Gilles Caraux}, Year = 1971} @article{kufels94, Author = {M. Kuhner and J. Felsenstein}, Journal = {Molecular Biology and Evolution}, Pages = {459-468}, Title = {A simulation comparison of phylogeny algorithms under equal and unequal evolutionary rates}, Utilisateur = {Vincent}, Volume = 11, Year = 1994} @article{lanave84, Author = {C. Lanave and G. Preparata and C. Saccone and G. Serio}, Journal = {Journal of Molecular Evolution}, Pages = {86-93}, Title = {A new method for calculating evolutionary substitution rates}, Volume = 20, Year = 1984} @article{lake87, Author = {James A. Lake}, Journal = {Molecular Biology and Evolution}, Pages = {167-191}, Title = {A rate-independent technique for analysis of nucleic acid sequences : Evolutionary parsimony}, Utilisateur = {Gilles Caraux}, Volume = 4, Year = 1987} @article{langley74, Author = {C. H. Langley and Walter M. Fitch}, Journal = {Journal of Molecular Evolution}, Pages = {161-177}, Title = {An examination of the constancy of the rate of molecular evolution}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 3, Year = 1974} @article{lanyon85, Author = {S. M. Lanyon}, Journal = {Systematic Zoology}, Number = 4, Pages = {397-403}, Title = {Detecting internal inconsistencies in distance data}, Utilisateur = {Vincent}, Volume = 34, Year = 1985} @article{larget99, Author = {B. Larget and D. L. Simon}, Journal = {Molecular Biology and Evolution}, Pages = {750-759}, Title = {Markov Chain {M}onte {C}arlo algorithms for the bayesian analysis of phylogenetic trees}, Volume = 16, Year = 1999} @article{lartillot04, Author = {N. Lartillot and H. Philippe}, Journal = {Molecular Biology and Evolution}, Pages = {1095-1109}, Title = {A Bayesian mixture model for across-site heterogeneities in the amino-acid replacement process}, Volume = 21, Year = 2004} @incollection{lausen86, Author = {Berthold Lausen and Paul O. Degens}, Booktitle = {Die klassifikation und ihr umfeld}, Editor = {Paul O. Degens and H. J. Hermes and O. Opitz}, Pages = {306-314}, Publisher = {Indeks Verlag}, Series = {Studien zur Klassification}, Title = {Variance estimation and the reconstruction of phylogenies}, Utilisateur = {Gilles Caraux}, Volume = 17, Year = 1986} @incollection{lausen88, Author = {Berthold Lausen and Paul O. Degens}, Booktitle = {Classification and related methods of data analysis}, Editor = {H. H. Bock}, Pages = {367-374}, Publisher = {Elsevier}, Title = {Evaluation of the reconstruction of phylogenies with {DNA-DNA}-Hybridization data}, Utilisateur = {Gilles Caraux}, Year = 1988} @incollection{lausen89, Author = {Berthold Lausen}, Booktitle = {Conceptual and numerical analysis of data}, Editor = {O. Opitz}, Pages = {481-488}, Publisher = {Springer Verlag}, Title = {Exploring homologous t{\sc rna} sequence data: positional mutation rates and genetic}, Utilisateur = {Gilles Caraux}, Year = 1989} @article{lawrence97, Author = {J. Lawrence and H. Ochman}, Journal = {Journal of Molecular Evolution}, Pages = {383-397}, Title = {Amelioration of bacterial genomes: rates of change and exchange}, Volume = 44, Year = 1997} @article{lawrence98, Author = {J. Lawrence and H. Ochman}, Journal = {PNAS}, Pages = {9413-9417}, Title = {Molecular archaeology of the {\it \hbox{E}scherichia coli} genome}, Volume = 95, Year = 1998} @article{le08, Author = {SQ. Le and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Title = {An Improved General Amino-Acid Replacement Matrix}, Volume = {25}, Pages = {1307-1320}, Year = 2008} @article{le_calve85, Author = {Georges {Le Calve}}, Journal = {Statistiques et Analyse de Donn{\'e}es}, Number = 2, Pages = {29-44}, Title = {Distance {\`a} centre}, Utilisateur = {Gilles Caraux}, Volume = 10, Year = 1985} @article{leclerc85a, Author = {Bruno Leclerc}, Journal = {Math. Sci. hum.}, Pages = {5-40}, Title = {La comparaison des hierarchies : Indices et metriques}, Utilisateur = {Gilles Caraux}, Volume = 92, Year = 1985} @article{leclerc85b, Author = {Bruno Leclerc}, Journal = {Math. Sci. hum.}, Pages = {5-34}, Title = {La hi{\'e}rarchies de parties et leur demi-treillis}, Utilisateur = {Gilles Caraux}, Volume = 89, Year = 1985} @article{leclerc94, Author = {Bruno Leclerc}, Journal = {To appear in Journal of Classification}, Title = {Minimum spanning trees for tree metrics : abridgements and adjustements}, Utilisateur = {Vincent}, Year = 1994} @article{lecointre93, Author = {G. Lecointre and H. Philippe and H.L.V. L{\^e} and H. Le Guyader}, Journal = {Mol. Phylogenet. Evol.}, Pages = {205-224}, Title = {Species sampling has a major impact on phylogenetic inference}, Volume = 2, Year = 1993} @article{lemmon02, Author = {A. Lemmon and M. Milinkovitch}, Journal = {PNAS}, Pages = {10516-10521}, Title = {The metapopulation genetic algorithm: an efficient solution for the problem of large phylogeny estimation}, Volume = 99, Year = 2002} @article{metapiga, Author = {A.R. Lemmon and Milinkovitch M.C.}, Journal = {PNAS}, Pages = {10516-10521}, Title = {The metapopulation genetic algorithm: An efficient solution for the problem of large phylogeny estimation}, Volume = 99, Year = 2002} @article{lee95, Author = {Y. Lee and T. Ota and V. Vaquier}, Journal = {Molecular Biology and Evolution}, Pages = {231-238}, Title = {Positive selection is a general phenomenon in the evolution of abalone sperm lysin}, Volume = 12, Year = 1995} @Article{lepage06, Author="Lepage, T. and Lawi, S. and Tupper, P. and Bryant, D. ", Title="{{C}ontinuous and tractable models for the variation of evolutionary rates}", Journal="Math Biosci", Year="2006", Volume="199", Pages="216--233", Month="Feb" } @article{lepage07, Author = {T. Lepage and D. Bryant and H. Philippe and N. Lartillot}, Journal = {Molecular Biology and Evolution}, Pages = {2669-2680}, Title = {A general comparison of relaxed molecular clock models}, Volume = 24, Year = 2007} @article{lewis98, Author = {P. Lewis}, Journal = {Molecular Biology and Evolution}, Pages = {277-283}, Title = {A genetic algorithm for maximum likelihood phylogeny inference using nucleotide sequence data}, Volume = 15, Year = 1998} @article{lewontin89, Author = {R. C. Lewontin}, Journal = {Molecular Biology and Evolution}, Pages = {15-32}, Title = {Inferring the number of evolutionary events from {DNA} coding sequence differences}, Utilisateur = {Gilles Caraux}, Volume = 6, Year = 1989} @inproceedings{li87, Author = {W.-H. Li and K.-H. Wolfe and J. Sourdis and P.M. Sharp}, Booktitle = {Cold Spring Harbor Symposia on Quantitative Biology}, Editor = {Cold Spring Harbore Laboratory}, Pages = {847-856}, Title = {Reconstruction of phylogenetic trees and estimation of divergence times under nonconstant rates of evolution}, Volume = {LII}, Year = 1987} @article{li89, Author = {Wen-Hsiung Li}, Journal = {Molecular Biology and Evolution}, Pages = {424-435}, Title = {A statistical test of phylogenies estimated from sequence data}, Utilisateur = {Gilles Caraux}, Volume = 6, Year = 1989} @incollection{li90, Address = {New York}, Author = {Wen-Hsiung Li and Manolo Gouy}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 40, Editor = {Russsell F. Doolittle}, Pages = {645-659}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Statistical Tests of Molecular Phylogenies}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @incollection{li91, Author = {Wen-Hsiung Li and Manolo Gouy}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Chapter = 12, Editor = {Michael M. Miyamoto and Joel Cracraft}, Pages = {249-277}, Publisher = {Oxford university press}, Title = {Statistical methods for testing molecular phylogenies}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Year = 1991} @article{li92, Author = {Wen-Hsiung Li and Bousquet, J}, Journal = {Molecular Biology and Evolution}, Pages = {1185-1189}, Title = {Relative-Rate test for nucleotide substitutions between two lineages}, Utilisateur = {G. Andrieu}, Volume = 9, Year = 1992} @article{li93, Author = {Wen-Hsiung Li}, Journal = {Journal of Molecular Evolution}, Pages = {96-99}, Title = { Unbiased estimation of the rates of synonimous and nonsynonimous substitution}, Utilisateur = {Guillaume Andrieu}, Volume = 36, Year = 1993} @article{li94, Author = {W.-H. Li and A. Zharkikh}, Journal = {Systematic Biology}, Pages = {424-430}, Title = {What is the bootstrap technique?}, Utilisateur = {Vincent}, Volume = 43, Year = 1994} @article{li95, Author = {W.-H. Li and A. Zharkikh}, Journal = {Systematic Biology}, Pages = {49-63}, Title = {Statistical tests of {DNA} phylogenies}, Volume = 44, Year = 1995} @phdthesis{li96, Author = {S. Li}, School = {Ohio State University}, Title = {Phylogenetic tree construction using {M}arkov chain {M}onte {C}arlo}, Year = 1996} @article{lin02, Author = {Y.-H. Lin and P. McLenachan and A. Gore and M. Phillips and R. Ota and M. Hendy and D. Penny}, Journal = {Molecular Biology and Evolution}, Pages = {2060-2070}, Title = {Four new mitochondrial genomes, and the stability of evolutionary trees of mammals}, Volume = 19, Year = 2002} @article{lockhart94, Author = {P. Lockhart and M. Steel and M. Hendy and D Penny}, Journal = {Molecular Biology and Evolution}, Pages = {605-612}, Title = {Recovering Evolutionary Trees under a More Realistic Model of Sequence}, Volume = 11, Year = 1994} @article{lockhart98, Author = {P. Lockhart and M. Steel and A. Barbrook and D. Huson and M. Charleston and C. Howe}, Journal = {Molecular Biology and Evolution}, Pages = {1183-1188}, Title = {A covariotide model explains apparent phylogenetic structure of oxygenic photosynthetic lineages}, Volume = 15, Year = 1998} @article{lockhart00, Author = {P. Lockhart and D. Huson and U. Maier and M. Fraunholz and Y. Van de Peer and A. Barbrook and C. Howe and M. Steel.}, Journal = {Molecular Biology and Evolution}, Pages = {835-838}, Title = {How molecules evolve in eubacteria}, Volume = 17, Year = 2000} @article{lockhart05, Author = {P. Lockhart and M. Steel}, Journal = {Systematic Biology}, Pages = {948-951}, Title = {A tale of two processes}, Volume = 54, Year = 2005} @article{lopez99, Author = {P. Lopez and P. Forterre and H. Philippe}, Journal = {Journal of Molecular Evolution}, Pages = {496-508}, Title = {The root of the tree of life in the light of the covarion model}, Volume = 49, Year = 1999} @article{lopez02, Author = {P. Lopez and D. Casane and H. Philippe}, Journal = {Molecular Biology and Evolution}, Pages = {1-7}, Title = {Heterotachy, an important process of protein evolution}, Volume = 19, Year = 2002} @article{lundy, Author = {M. Lundy}, Journal = {Biometrika}, Number = 1, Pages = {191-198}, Title = {Applications of the annealing algorithm to combinatorial problems in statistics}, Utilisateur = {Gilles Caraux and Fernando Carvalho}, Volume = 72, Year = 1985} @article{lundy, Author = {M. Lundy}, Journal = {Biometrika}, Number = 1, Pages = {191-198}, Title = {Applications of the annealing algorithm to combinatorial problems in statistics}, Utilisateur = {Gilles Caraux and Fernando Carvalho}, Volume = 72, Year = 1985} @article{lynch00, Author = {M. Lynch and J. Conery}, Journal = {Science}, Pages = {1151-1155}, Title = {The evolutionary fate and consequences of duplicated genes}, Volume = 290, Year = 2000} @article{lynch03, Author = {M. Lynch and J. Conery}, Journal = {Journal of Structural and Functional Genomics}, Pages = {35-44}, Title = {The evolutionary demography of duplicate genes}, Volume = 3, Year = 2003} @article{lynch03b, Author = {M. Lynch and J. Conery}, Journal = {Science}, Pages = {1401-1404}, Title = {The origins of genome complexity}, Volume = 302, Year = 2003} @article{lynch04, Author = {M. Lynch and J. Conery}, Journal = {Science}, Pages = {978b}, Title = {Reponse to Comment on \"The origins of genome complexity\"}, Volume = 306, Year = 2004} @article{maddison91, Author = {D. R. Maddison}, Journal = {Syst Zool}, Note = {interessant, grpes d'arbres relies entre eux}, Number = 3, Pages = {315-328}, Title = {The discovery and importance of multiple islands of most parsimonious trees}, Utilisateur = {Vincent}, Volume = 40, Year = 1991} @article{maddison97, Author = {D. Maddison and D. Swofford and W. Maddison}, Journal = {Systematic Biology}, Volume = 46, Number = 4, Pages = {590-621}, Title = {{NEXUS}: an extensible file format for systematic information}, Year = 1997} @article{maidak94, Author = {B.L. Maidak and N. Larsen and M.J. McCaughey and R. Overbeek and G.J. Olsen and K. Fogel and J. Blandy and C.R. Woese}, Journal = { Nucl. Acids. Res}, Pages = {3485-3487}, Title = {The {R}ibosomal {D}atabase {P}roject}, Volume = 22, Year = 1994} @article{maidak96, Author = {B.L. Maidak and G.J. Olsen and N. Larsen and R. Overbeek and M.J. McCaughey and C.R. Woese}, Journal = { Nucl. Acids. Res}, Pages = {82-85}, Title = {The {R}ibosomal {D}atabase {P}roject ({RDP})}, Volume = 24, Year = 1996} @article{maidak97, Author = {B.L. Maidak and G.J. Olsen and N. Larsen and R. Overbeek and M.J. McCaughey and C.R. Woese}, Journal = { Nucl. Acids. Res}, Pages = {109-111}, Title = {The {RDP} ({R}ibosomal {D}atabase {P}roject)}, Volume = 25, Year = 1997} @article{maidak99, Author = {B.L. Maidak and J.R. Cole and C.T. Parker and G.M. Garrity and N. Larsen and B. Li and T.G. Lilburn and M.J. McCaughey and G.J. Olsen and R. Overbeek and S. Pramanik and T.M. Schmidt and J.M. Tiedje and CR Woese}, Journal = { Nucl. Acids. Res}, Pages = {171-173}, Title = {A new version of the {RDP} ({R}ibosomal {D}atabase {P}roject)}, Volume = 27, Year = 1999} @article{maidak00, Author = {B. L. Maidak and J. R. Cole and T. G. Lilburn and C. T. Parker and P. R. Saxman and J. M. Stredwick and G. M. Garrity and B. Li and G. J. Olsen and S. Pramanik and T. M. Schmidt and J. M. Tiedje}, Journal = {Nucl. Acids. Res}, Pages = {173-174}, Title = {The {RDP} ({R}ibosomal {D}atabase {P}roject) continues}, Volume = 28, Year = 2000} @article{maidak01, Author = {B. L. Maidak and J. R. Cole and T. G. Lilburn and C. T. Parker and P. R. Saxman and R. J. Farris and G. M. Garrity and G. J. Olsen and T. M. Schmidt and J. M. Tiedje}, Journal = {Nucl. Acids. Res}, Pages = {173-174}, Title = {The {RDP}-II ({R}ibosomal {D}atabase {P}roject)}, Volume = 29, Year = 2001} @article{manske87, Author = { Charles L. Manske and David J. Chapman}, Journal = {Journal of Molecular Evolution}, Pages = {226-251}, Title = {Nonuniformity of Nucleotide Substitution Rates in Molecular Evolution: Computer Simulation and Analysis of 5S Ribosomal Sequences}, Utilisateur = {Guillaume Andrieu}, Volume = 26, Year = 1987} @article{margush81, Author = {T. Margush and F.R. McMorris}, Journal = {Bulletin of Math. Biol.}, Number = 2, Pages = {239-244}, Title = {Consensus n-trees}, Volume = 43, Year = 1981} @article{massingham05, title={Detecting amino acid sites under positive selection and purifying selection}, author={Massingham, Tim and Goldman, Nick}, journal={Genetics}, volume={169}, number={3}, pages={1753--1762}, year={2005}, publisher={Genetics Soc America} } @phdthesis{mau96, Author = {B. Mau}, School = {Wiscontin University}, Title = {Bayesian phylogenetic inference via Markov Chain {M}onte {C}arlo methods}, Year = 1996} @article{meacham81, Author = {C. Meacham}, Journal = {Taxon}, Pages = {591-600}, Title = {A manual method for character compatibility}, Volume = 30, Year = 1981} @article{metropolis53, Author = {N. Metropolis and A.W. Rosenbluth and M.N. Rosenbluth and A.H. Teller and E. Teller}, Journal = {J. of Chem. Phys.}, Pages = {1087-1092}, Title = {Equation of State Calculations by Fast Computing Machines}, Volume = 21, Year = 1953} @article{messier97, Author = {W. Messier and C.-B. Stewart}, Journal = {Nature}, Pages = {151-154}, Title = {Episodic adaptative evolution of primate lysozymes}, Volume = 385, Year = 1997} @article{misof02, Author = {B. Misof and C. Anderson and T. Buckley and D. Erpenbeck and A. Rickert and K. Misof}, Journal = {Journal of Molecular Evolution}, Pages = {330-340}, Title = {An empirical analysis of mt 16S r{RNA} covarion-like evolution in insects: site-specific rate variation is clustered and frequently detected}, Volume = 56, Year = 2002} @article{mitchison95, Author = {G. Mitchison and R. Durbin}, Journal = {Journal of Molecular Evolution}, Pages = {1139-1151}, Title = {Tree-based maximum likelihood substitution matrices and hidden Markov model}, Volume = 41, Year = 1995} @book{miyamoto91, Address = {New York - Oxford}, Editor = {Michael M. Miyamoto and Joel Cracraft}, Publisher = {Oxford University Press}, Title = {{P}hylogenic {A}nalysis of {DNA} {S}equences}, Utilisateur = {Guillaume Andrieu}, Year = 1991} @article{miyata81, Author = { Takashi Miyata and Teruo Yasunaga}, Journal = {Genetics}, Pages = {641-657}, Title = {Molecular Evolution of m{RNA} : A Method for estimating Evolutionary Rates of Synonymous and Amino Acid Substitutions from Homologous Nucleotide Sequences and its Application }, Utilisateur = {Guillaume Andrieu}, Volume = 98, Year = 1981} @book{mood, Address = {Paris}, Author = {Alexander Mood et Franklin A. Graybill}, Publisher = {Dunod}, Title = {Introduction a la {S}tatistique {T}heorique}, Year = 1973} @article{moore73, Author = {G. W. Moore, J. Barnabas, M. Goodman}, Journal = {Journal of Theoretical Biology}, Pages = {459-485}, Title = {A Method For Constructing Maximum Parsimony Ancestral Amino Acid Sequences on a Given Network}, Volume = 38, Year = 1973} @techreport{moulton96, Author = {V. Moulton and M.A. Steel}, Institution = {Univ. of Canterbury}, Number = 148, Title = {Retractions of finite distance functions onto tree metrics}, Year = 1996} @article{muller00, Author = {T. Muller and M. Vingron}, Journal = {Journal of Computational Biology}, Pages = {761-776}, Title = {Modeling amino acid replacement.}, Volume = 7, Year = 2000} @article{mullis87, Author = {K.B. Mullis and F.A. Faloona}, Journal = {Methods. in Enzym.}, Pages = {335-350}, Title = {Specific synthesis of {DNA} in vitro via polymerase catalyzed chained reaction}, Volume = 155, Year = 1987} @article{murphy01, Author = {W. J. Murphy and E. Eizirik and W. E. Johnson and Zhang Y.P. and O.A. Ryder and S.J. O'Brien}, Journal = {Nature}, Pages = {614-618}, Title = {Molecular phylogenetics and the origins of placental mammals}, Volume = 409, Year = 2001} @article{murphy01b, Author = {M. Murphy and E. Eizirik and S. O'Brien and O. Madsen and M. Scally and C. Douady and E. Teeling and O. Ryder and M. Stanhope and W. de Jong and M. Springer}, Journal = {Science}, Pages = {2348-2351}, Title = {Resolution of the early placental mammal radiation using Bayesian phylogenetics}, Volume = 294, Year = 2001} @article{muse94, Author = {S. Muse and B. Gaut}, Journal = {Molecular Biology and Evolution}, Pages = {715-724}, Title = {A likelihood approach for comparing synonymous and nonsynonymous nucleotide substitution rates, with application to the chloroplast genome}, Volume = 11, Year = 1994} @incollection{muse95, Address = {Penn. State Univ.}, Author = {S. V. Muse}, Booktitle = {Current Topics on Molecular Evolution}, Editor = {M. Nei and N. Takahata}, Pages = {115-124}, Publisher = {University Park}, Title = {Evolutionary analyses when nucleotides do not evolve independently}, Year = 1995} @article{muse95b, Author = {S. Muse}, Journal = {Genetics}, Pages = {1429-1439}, Title = {Evolutionary analyses of {DNA} sequences subject to constraints on secondary structure}, Volume = 139, Year = 1995} @article{otha93, Author = {T. Ohta}, Journal = {Genetics}, Pages = {1271-1276}, Title = {Pattern of nucleotide substitutions in growth hormone-prolactin gene family: a paradigm for evolution by gene duplication}, Volume = 134, Year = 1993} @article{navidi91, Author = {W. C. Navidi and G. A. Churchill and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {128-143}, Title = {Methods for infering phylogenies from nucleic acid sequence data by using maximum likelihood and linear invariants}, Utilisateur = {Gilles Caraux}, Volume = 8, Year = 1991} @article{navidi92, Author = {W. C. Navidi and L. Beckett-Lemus}, Journal = {Molecular Biology and Evolution}, Pages = {1163-1175}, Title = {The effect of unequal transversion rates on the accuracy of evolutionary parsimony}, Utilisateur = {Gilles Caraux}, Volume = 9, Year = 1992} @article{needleman70, Author = {S. G. Needleman and C. D. Wunsch}, Journal = {Journal of Molecular Biology}, Pages = {443-453}, Title = {A general method applicable to the search for similarities in the amino acid sequence of two proteins}, Volume = 48, Year = 1970} @article{nei79, Author = {Masatoshi Nei and Wen Hsiung Li}, Journal = {PNAS}, Number = 10, Pages = {5269-5273}, Title = {Mathematical model for studying genetic variation in terms of restriction endonucleases}, Utilisateur = {Gilles Caraux}, Volume = 76, Year = 1979} @article{nei81, Author = {Masatoshi Nei and Fumo Tajima}, Journal = {Genetics}, Pages = {145-163}, Title = {{DNA} polymorphism detectable by restriction endonucleases}, Utilisateur = {Gilles Caraux}, Volume = 97, Year = 1981} @article{nei85, Author = {M. Nei and J. C. Stephens and N. Saitou}, Journal = {Molecular Biology and Evolution}, Pages = {66-85}, Title = {Methods for computing the standard errors of branching points in an evolutionary tree and their application to molecular data from humans and apes}, Volume = 2, Year = 1985} @article{nei86, Author = {M. Nei and T. Gojobori}, Journal = {Molecular Biology and Evolution}, Pages = {418-426}, Title = {Simple methods for estimating the number of synonymous and nonsynonymous nucleotide substitutions}, Volume = 3, Year = 1986} @article{nei89, Author = {Masatoshi Nei and L. Jin}, Journal = {Molecular Biology and Evolution}, Pages = {290-300}, Title = {Variance of the averages numbers of substitutions within and between populations}, Utilisateur = {Ne Obt}, Volume = 6, Year = 1989} @incollection{nei91, Author = {M. Nei}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Editor = {M.M. Miyamoto and J. Cracraft}, Publisher = {Oxford Univ. Press}, Title = {Relative efficiencies of different tree-making methods for molecular data}, Year = 1991} @article{nei92, Author = {Masatoshi Nei}, Journal = {Molecular Biology and Evolution}, Number = 6, Pages = {1176-1178}, Title = {Age of the common ancestor of Human Mitochondrial {DNA}}, Utilisateur = {Gilles Caraux}, Volume = 9, Year = 1992} @article{newton04, Author = {M. Newton and A. Noueiry and D. Sarkar and P. Ahlquist}, Journal = {Biostatistics}, Pages = {155-176}, Title = {Detecting differential expression with a semiparametric hierarchical mixture method}, Volume = 5, Year = 2004} @article{nielsen98, Author = {R. Nielsen and Z. Yang}, Journal = {Genetics}, Pages = {929-936}, Title = {Likelihood models for detecting positively selected amino acid sites and application to the {HIV}-1 envelope gene}, Volume = 148, Year = 1998} @book{nutall04, Address = {Cambridge}, Author = {G.H.F. Nutall}, Publisher = {Cambridge Univ. Press}, Title = {Blood immunity and blood relationship}, Year = 1904} @book{nr, Address = {Cambridge}, Author = {W. Press and B. Flannery and S. Teukolsky and W. Vetterling}, Publisher = {Press Syndicate of the University of Cambridge}, Title = {Numerical Recipes in C.}, Year = 1988} @article{olsen94, Author = {G. Olsen and H. Matsuda and R. Hagstrom and R. Overbeek}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {41-48}, Title = {{fastDNAml}: a tool for construction of phylogenetic trees of {DNA} sequences using maximum likelihood}, Volume = 10, Year = 1994} @article{fastdnaml, Author = {G. J. Olsen and H. Matsuda and R. Hagstrom and R. Overbeek}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {41-48}, Title = {{fastDNAml}: a tool for construction of phylogenetic trees of {DNA} sequences using maximum likelihood}, Volume = 10, Year = 1994} @incollection{neyman71, Address = {New York}, Author = {J. Neyman}, Booktitle = {Statistical decision theory and related topics}, Editor = {S. Gupta and J. Yackel}, Pages = {1-27}, Publisher = {Academic Press}, Title = {Molecular studies of evolution: a source of novel statistical problems}, Year = 1971} @article{ota00, Author = {S. Ota and W.-H. Li}, Journal = {Molecular Biology and Evolution}, Pages = {1401-1409}, Title = {{NJML}: a Hybrid Algorithm for the Neighbor-Joining and Maximum-Likelihood Methods}, Volume = 17, Year = 2000} @article{ota01, Author = {S. Ota and W.-H. Li}, Journal = {Molecular Biology and Evolution}, Pages = {1983-1992}, Title = {{NJML+}: an extension of the {NJML} method to handle protein sequence data and computer software implementation}, Volume = 18, Year = 2001} @article{felsenstein1975, title={A pain in the torus: some difficulties with models of isolation by distance}, author={Felsenstein, Joseph}, journal={American Naturalist}, pages={359--368}, year={1975}, publisher={JSTOR} } @article{ota00b, Author = {R. Ota and P. Waddell and M. Hasegawa and H. Shimodaira and H. Kishino}, Journal = {Molecular Biology and Evolution}, Pages = {798-803}, Title = {Appropriate likelihood ratio tests and marginal distribution for evolutionary tree models with constraints on parameters}, Volume = 17, Year = 2000} @article{otto00, Author = {S. Otto and J. Whitton}, Journal = {Annual Review of Genetics}, Pages = {401-437}, Title = {Polyploid incidence and evolution}, Volume = 34, Year = 2000} @book{page98, Address = {Osney Mead, Oxford}, Author = {Roderick Page and Eward Holmes}, Publisher = {Blackwell Science Ltd}, Title = {Molecular Evolution: a phylogenetic approach}, Year = 1998} @article{pauplin00, Author = {Y. Pauplin}, Journal = {Journal of Molecular Evolution}, Pages = {41-47}, Title = {Direct calculation of a tree length using a distance matrix}, Volume = 51, Year = 2000} @article{penny87, Author = {David Penny and Michael D. Hendy and I. M. Henderson}, Journal = {Cold Spring Harbor Symposia on Quantitative Biology}, Pages = {857-862}, Title = {Reliability of Evolutionary Trees}, Utilisateur = {Gilles Caraux}, Volume = 52, Year = 1987} @incollection{penny91, Author = {D. Penny and M.D. Hendy and M.A. Steel}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Editor = {M. M. Miyamoto and J. Cracraft}, Pages = {155-183}, Title = {Testing the theory of descent}, Year = 1991} @article{penny92, Author = {David Penny and Michael D. Hendy and Michael A. Steel}, Journal = {Tree}, Pages = {73-78}, Title = {Progress with Methods for Constructing Evolutionary Trees}, Utilisateur = {Gilles Caraux and Guillaume Andrieu or Vincent}, Volume = 7, Year = 1992} @article{penny01, Author = {D. Penny and B. McComish and M. Charleston and M. Hendy}, Journal = {Journal of Molecular Evolution}, Pages = {711-723}, Title = {Mathematical elegance with biochemical realism: the covarion model of molecular evolution}, Volume = 53, Year = 2001} @article{hobacgen, Author = {G. Perri{\`e}re and L. Duret and M. Gouy}, Journal = {Genome Research}, Pages = {379-385}, Title = {{HOBACGEN}: database system for comparative genomics in bacteria}, Volume = 10, Year = 2000} @article{hovergen, Author = {L. Duret and D. Mouchiroud and M. Gouy}, Journal = {Nucleic Acids Research}, Pages = {2360-2365}, Title = {{HOVERGEN}, a database of homologous vertebrate genes}, Volume = 22, Year = 1994} @article{li85, Author = {W.-H. Li and C.-I Wu and C.-C Luo}, Journal = {Molecular Biology and Evolution}, Pages = {150-174}, Title = {A new method for estimating synonymous and non-synonymous rates of nucleotide substitutions considering the relative likelihood of nucleotide and codon changes}, Volume = 2, Year = 1985} @article{pagel04, Author = {M. Pagel and A. Meade}, Journal = {Systematic Biology}, Pages = {571-581}, Title = {A phylogenetic mixture model for detecting pattern-heterogeneity in gene sequence or character-state data}, Volume = 53, Year = 2004} @article{phillips02, Author = {M. Phillips and D. Penny}, Journal = {Molecular Phylogenetics and Evolution}, Pages = {171-185}, Title = {The root of the mammalian tree inferred from whole mitochondrial genomes}, Volume = 28, Year = 2002} @article{philippe97, Author = {H. Philippe}, Journal = {Journal of Molecular Evolution}, Pages = {712-715}, Title = {Rodent monophyly: pitfalls of molecular phylogenies}, Volume = 45, Year = 1997} @article{philippe00, Author = {H. Philippe and P. Lopez and H. Brinkman and K. Budin and A. Germot and J. Laurent and D. Moreira and M. Muller and H. Le Guyader}, Journal = {Proceeding of the Royal Society B: Biological Sciences}, Pages = {1213-1221}, Title = {Early branching or fast evolving eukaryotes ? An answer based on slowly evolving positions}, Volume = 267, Year = 2000} @article{philippe00b, Author = {H. Philippe}, Journal = {Protist}, Pages = {307-316}, Title = {Opinion : long branch attraction and protist phylogeny}, Volume = 151, Year = 2000} @article{philippe05, Author = {H. Philippe and Y. Zhou and H. Brinkmann and N. Rodrigue and F. Delsuc}, Journal = {BMC Evolutionary Biology}, Pages = {http://www.biomedcentral.com/1471-2148/5/50}, Title = {Heterotachy and long-branch attraction in phylogenetics}, Year = 2005} @article{pollock99, Author = {D. Pollock and W. Taylor and N. Goldman}, Journal = {Journal of Molecular Biology}, Pages = {187-198}, Title = {Co-evolving protein residues: maximum likelihood analysis and relationship to structure}, Volume = 287, Year = 1999} @article{posada98, Author = {D. Posada and K. Crandall}, Journal = {Bioinformatics}, Pages = {817-918}, Title = {Modeltest: testing the model of {DNA} substitution}, Volume = 14, Year = 1998} @article{posada01, title={Selecting models of nucleotide substitution: an application to human immunodeficiency virus 1 (HIV-1)}, author={Posada, D. and Crandall, K.A.}, journal={Molecular Biology and Evolution}, volume={18}, number={6}, pages={897--906}, year={2001}, publisher={SMBE} } @Article{poux06, Author="Poux, C. and Chevret, P. and Huchon, D. and de Jong, W. W. and Douzery, E. J. ", Title="{{A}rrival and diversification of caviomorph rodents and platyrrhine primates in {S}outh {A}merica}", Journal="Syst. Biol.", Year="2006", Volume="55", Pages="228--244", Month="Apr" } @techreport{prum92, Author = {Bernard Prum and Fran{{\c C}}ois Rodolphe and Elisabeth de Turckheim}, Institution = {INRA}, Month = {October}, Note = {{I}nfluence du {V}oisinage sur l'{E}volution d'une {S{\'e}}quence d'{ADN}}, Title = {{F}inding words with unexpected frequencies in {DNA} sequences}, Year = {1992}} @article{pupko02, Author = {T. Pupko and N. Galtier}, Journal = {Proceedings of The Royal Society B: Biological Sciences}, Pages = {1313-1316}, Title = {A covarion-based method for detecting molecular adaptation: application to the evolution of primate mitochondrial genomes}, Volume = 269, Year = 2002} @article{purvis97, Author = {A. Purvis and D. L. J. Quicke}, Journal = {Trends in Ecology and Evolution}, Number = 2, Pages = {49-50}, Title = {Building phylogenies: are the big easy ?}, Volume = 12, Year = 1997} @article{qu83, Author = {L.H. Qu and B. Michot and J.P. Bachellerie}, Journal = {Nucleic Acids Research}, Pages = {5903-5920}, Title = {Improved methods for structure probing in large RNAs: a rapid heterologous sequencing approach is coupled to the direct mapping of nuclease accessible sites. Application to the 5' terminal domain of eukaryotic}, Volume = 11, Year = 1983} @article{quesenberry64, Author = {C. P. Quesenberry and D. C. Hurst}, Journal = {Technometrics}, Month = {MAY}, Number = 2, Pages = {191-195}, Title = {Large Sample Simultaneous Confidence Intervals for Multinomial Proportions }, Volume = 6, Year = 1964} @article{rannala96, Author = {B. Rannala and Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {304-311}, Title = {Probability distribution of molecular evolutionary trees: a new method of phylogenetic inference}, Volume = {43}, Year = 1996} @Article{rannala07, Author="Rannala, B. and Yang, Z. ", Title="{{I}nferring speciation times under an episodic molecular clock}", Journal="Syst. Biol.", Year="2007", Volume="56", Pages="453--466", Month="Jun" } @article{ranwez01, Author = {V. Ranwez and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {1103-11016}, Title = {Quartet-based phylogenetic inference: improvements and limits.}, Volume = {18}, Year = 2001} @article{ranwez02, Author = {V. Ranwez and O. Gascuel}, Journal = {Molecular Biology and Evolution}, Pages = {1952-1963}, Title = {Improvement of Distance-Based Phylogenetic Methods by a Local Maximum Likelihood Approach Using Triplets}, Volume = {19}, Year = 2002} @article{rasmol, Author = {R. Sayle and J. Milner-White}, Journal = {Trends in Biochemical Sciences}, Pages = {374}, Title = {{R}as{M}ol: Biomolecular graphics for all}, Volume = {20}, Year = 1995} @phdthesis{ranwezthese, Author = {V. Ranwez}, School = {Universit{\'e} Montpellier II}, Title = {M{\'e}thodes efficaces pour reconstruire des phylog{\'e}nies suivant le principe du maximum de vraisemblance}, Year = 2002} @article{rdp, Author = {B. L. Maidak and J.R. Cole and T.G. Lilburn and C.T. Parker Jr. and P.R. Saxman and R.J. Farris and G.M. Garrity and G.J. Olsen and T.M. Schmidt and J.M. Tiedje}, Journal = {Nucleic Acids Research}, Pages = {173-174}, Title = {The {RDP}-II ({R}ibosomal {D}atabase {P}roject)}, Volume = {29}, Year = 2001} @article{ren05, Author = {F. Ren and H. Tanaka and Z. Yang}, Journal = {Systematic Biology}, Pages = {808-818}, Title = {An empirical examination of the utility of codon-substitution models in phylogeny reconstruction}, Volume = 54, Year = 2005} @book{renyi66, Address = {Paris}, Author = {A. Renyi}, Publisher = {Dunod}, Title = {{C}alcul des {P}robabilites}, Year = 1966} @article{reyes98, Author = {A. Reyes and G. Pesole and C. Saccone}, Journal = {Molecular Biology and Evolution}, Pages = {499-505}, Title = {Complete mitochondrial {DNA} sequence of the fat dormouse, {G}lis glis: further evidence of rodent paraphyly}, Volume = {15}, Year = {1998}} @article{reyes00, Author = {A. Reyes and G. Pesole and C. Saccone}, Journal = {Gene}, Pages = {177-187}, Title = {Long-branch attraction phenomenon and the impact of among-site rate variation on rodent phylogeny}, Volume = {259}, Year = {2000}} @article{reyes04, Author = {A. Reyes and C. Gissi and F. Catzeflis and E. Nevo and G. Pesole and C. Saccone}, Journal = {Molecular Biology and Evolution}, Pages = {397-403}, Title = {Congruent mammalian trees from mitochondrial and nuclear genes using Bayesian methods}, Volume = {21}, Year = {2004}} @article{rice97, Author = {K. Rice and M. J. Donoghue and R. G. Olmstead}, Journal = {Systematic Biology}, Pages = {554-563}, Title = {Analyzing large data sets: {\it rbcL} 500 revisited}, Volume = {46}, Year = {1997}} @article{robinson71, Author = {D. Robinson}, Journal = {J. Combinatorial Theory Ser B}, Pages = {105-119}, Title = {Comparison of labeled trees with valency three}, Utilisateur = {Gilles Caraux}, Volume = 11, Year = 1971} @incollection{robinson79, Address = {Berlin}, Author = {D. Robinson and L. Foulds}, Booktitle = {Lectures Notes in Mathematics}, Pages = {119-126}, Publisher = {Springer}, Title = {Comparison of weighted labeled trees}, Utilisateur = {Gilles Caraux}, Volume = 748, Year = 1979} @article{robinson81, Author = {D. F. Robinson and L. R. Foulds}, Journal = {Mathematical Biosciences}, Pages = {131-147}, Title = {Comparison of phylogenetic trees}, Utilisateur = {Gilles Caraux et Vincent}, Volume = 53, Year = 1981} @Article{robinson98, Author="Robinson, M. and Gouy, M. and Gautier, C. and Mouchiroud, D. ", Title="{{S}ensitivity of the relative-rate test to taxonomic sampling}", Journal="Molecular Biology and Evolution", Year="1998", Volume="15", Pages="1091--1098", Month="Sep" } @article{gharib13, title={The branch-site test of positive selection is surprisingly robust but lacks power under synonymous substitution saturation and variation in {GC}}, author={Gharib, Walid H and Robinson-Rechavi, Marc}, journal={Molecular Biology and Evolution}, volume={30}, number={7}, pages={1675--1686}, year={2013}, publisher={SMBE} } @article{zhang05, title={Evaluation of an improved branch-site likelihood method for detecting positive selection at the molecular level}, author={Zhang, J. and Nielsen, R. and Yang, Z.}, journal={Molecular Biology and Evolution}, volume={22}, number={12}, pages={2472--2479}, year={2005}, publisher={SMBE} } @incollection{rodrigo01, Address = {Boston, Mass.}, Author = {A. Rodrigo and E. Hanley and P. Goracke and G. Learn}, Booktitle = {Computational and evolutionary analysis of HIV molecular sequences}, Editor = {A. Rodrigo and G. Learn}, Pages = {1-17}, Publisher = {Kluwer Academic Publishers}, Title = {Sampling and processing {HIV} molecular sequences : a computatinal evolutionary biologist's perspective}, Year = 2001} @article{rodriguez90, Author = {F. Rodriguez and J. L. Olivier and A. Marin and J. R. Medina}, Journal = {Journal of Theoretical Biology}, Pages = {485-501}, Title = {The general stochastic model of nucleotide substitution}, Volume = 142, Year = 1990} @article{rodriguez03, Author = {F. Rodriguez-Trelles and R. Tarrio and F. Ayala}, Journal = {PNAS}, Pages = {13413-13417}, Title = {Convergent neofunctionalization by positive Darwinian selection after ancient recurrent duplications of the xanthine dehydrogenase gene}, Volume = {100}, Year = {2003}} @article{rogers99, Author = {J. Rogers and D. Swofford}, Journal = {Molecular Biology and Evolution}, Pages = {1079-1085}, Title = {Multiple local maxima for likelihoods of phylogenetic trees: a simulation study}, Volume = {16}, Year = {1999}} @article{rohlf74, Author = {F. James Rohlf}, Journal = {Annual Review of Ecology and Systematics}, Pages = {101-113}, Title = {Methods of comparing classifications}, Utilisateur = {Gilles Caraux}, Volume = 5, Year = 1974} @article{rosenberg01, Author = {M. Rosenberg and S. Kumar}, Journal = {Molecular Biology and Evolution}, Pages = {1823-1827}, Title = {Traditional phylogenetic reconstruction methods reconstruct shallow and deep evolutionary relationship equally well}, Volume = 19, Year = 2001} @article{ross02, Author = {H. Ross and A. Rodrigo}, Journal = {Journal of Virology}, Pages = {11715-11720}, Title = {Immune-mediated positive selection drives human immunodeficiency virus type 1 molecular variation and predicts disease duration}, Volume = 76, Year = 2002} @book{ruegg, Address = {Lausanne}, Author = {Alan Ruegg}, Publisher = {Presses polytechniques romandes}, Series = {Methodes mathematiques pour l'ingenieur}, Title = {Processus Stochastiques}, Year = 1989} @Article{rutschmann07, Author="Rutschmann, F. and Eriksson, T. and Salim, K. A. and Conti, E. ", Title="{{A}ssessing calibration uncertainty in molecular dating: the assignment of fossils to alternative calibration points}", Journal="Syst. Biol.", Year="2007", Volume="56", Pages="591--608", Month="Aug" } @incollection{gascuel07, Title={Modelling the variability of evolutionary processes}, Author={Gascuel, O. and Guindon, S.}, Editor={Olivier Gascuel and Mike Steel}, Booktitle={Reconstructing Evolution: new mathematical and computational advances}, Pages={65--99}, Publisher={Oxford University Press}, Year={2007} } @article{slatkin91, title={Pairwise comparisons of mitochondrial DNA sequences in stable and exponentially growing populations.}, author={M. Slatkin and R. R. Hudson}, journal={Genetics}, volume={129}, number={2}, pages={555--562}, year={1991}, publisher={Genetics Soc America} } @article{rzhetsky92a, Author = {Andrey Rzhetsky and Masatoshi Nei}, Journal = {Molecular Biology and Evolution}, Pages = {945-967}, Title = {A simple method for estimating and testing minimum-evolution trees}, Utilisateur = {Olivier Gascuel et Guillaume Andrieu}, Volume = 9, Year = 1992} @article{rzhetsky92b, Author = {Andrey Rzhetsky and Masatoshi Nei }, Journal = {Journal of Molecular Evolution}, Pages = {367-375}, Title = {Statistical Properties of the Ordinary Least-Squares, Generalized Least-Squares, and Minimum-Evolution Methods of Phylogenetic Inference}, Utilisateur = {Guillaume Andrieu}, Volume = 35, Year = 1992} @article{rzhetsky93, Author = {A. Rzhetsky and M. Nei }, Journal = {Molecular Biology and Evolution}, Pages = {1073-1095}, Title = {Theoretical foundation of the minimum-evolution method of phylogenetic inference}, Volume = 10, Year = 1993} @article{rzhetsky94, Author = {A. Rzhetsky and M. Nei}, Journal = {Journal of Molecular Evolution}, Pages = {295-299}, Title = {Unbiaised estimates of the number of nucleotide substitutions when substitution rate varies among different sites}, Volume = 38, Year = 1994} @article{rzhetsky95, Author = {A. Rzhetsky and S. Kumar and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {163-167}, Title = {Four-cluster analysis: a simple method to test phylogenetic hypotheses}, Volume = 12, Year = 1995} @article{rzhetsky95b, Author = {A. Rzhetsky}, Journal = {Genetics.}, Number = 2, Pages = {771-83}, Title = {Estimating substitution rates in ribosomal RNA genes}, Volume = 141, Year = 1995} @article{rzhetsky96, Author = {A. Rzhetsky and T. Sitnikova}, Journal = {Molecular Biology and Evolution}, Pages = {1255-1265}, Title = {When is it Safe to use an Oversimplified Substitution Model in Tree-Making?}, Volume = 13, Year = 1996} @incollection{saccone90, Address = {New York}, Author = {Cecilia Saccone and Cecilia Lanave and Graziano Pesole and Giuliano Preperata }, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 35, Editor = {Russsell F. Doolittle}, Pages = {570-583}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Influence of Base Composition on Quantitative Estimates of Gene Evolution}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @article{saccone91, Author = {Cecilia Saccone and Graziano Pesole and Elisabetta Sbis\'{a} }, Journal = {Journal of Molecular Evolution}, Pages = {88-91}, Title = {the main regulatory region of mammalian mitochondria {DNA} : Stucture -function model and evilutionary pattern}, Utilisateur = {G. Andrieu}, Volume = 33, Year = 1991} @article{saitou87, Author = {N. Saitou and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {406-425}, Title = {The neighbor-joining method: a new method for reconstructing phylogenetic trees}, Volume = 4, Year = 1987} @article{nj, Author = {N. Saitou and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {406-425}, Title = {The neighbor-joining method: A new method for reconstruction phylogenetic trees}, Utilisateur = {Gilles Caraux}, Volume = 4, Year = 1987} @article{saitou88, Author = {N. Saitou}, Journal = {Journal of Molecular Evolution}, Pages = {261-273}, Title = {Property and efficiency of the maximum likelihood method for molecular phylogeny}, Utilisateur = {Gilles Caraux}, Volume = 27, Year = 1988} @article{saitou89, Author = {N. Saitou and T. Imanishi}, Journal = {Molecular Biology and Evolution}, Pages = {514-525}, Title = {Relative efficiencies of the {F}itch-{M}argoliash, {M}aximum-{P}arsimony, {M}aximum-{L}ikelihood, {M}inimum-{E}volution, and {N}eighbor-{J}oining methods of phylogenetic tree construction in obtaining the correct tree}, Volume = 6, Year = 1989} @incollection{saitou90, Address = {New York}, Author = {N. Saitou}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acid sequences}, Chapter = 36, Editor = {Russsell F. Doolittle}, Pages = {584-598}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Maximum Likelihood Methods}, Utilisateur = {Guillaume Andrieu}, Volume = 183, Year = 1990} @incollection{saitou91, Author = {N. Saitou}, Booktitle = {Statistical Methods in Biological and Medical Sciences}, Editor = {R. C. Rao and R. Chakraborty}, Pages = {317-346}, Publisher = {North-Holland}, Series = {Handbook of Statistics}, Title = {Statistical Methods for Phylogenetic Tree Reconstruction}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 8, Year = 1991} @article{salter01, Author = {L. Salter and D. Pearl}, Journal = {Systematic Biology}, Pages = {7-17}, Title = {Stochastic search strategy for estimation of maximum likelihood phylogenetic trees}, Volume = 50, Year = 2001} @article{sanderson94, Author = {M. Sanderson and M. Donoghue and W. Piel and T. Eriksson}, Title = {Tree{BASE}: a prototype database of phylogenetic analyses and an interactive tool for browsing the phylogeny of life}, Journal = {American Journal of Botany}, Volume = 81, Pages = {183}, Year = {1994} } @article{sanderson97, Author = {M. Sanderson}, Journal = {Molecular Biology and Evolution}, Pages = {1218-1231}, Title = {A nonparametric approach to estimating divergence times in the absence of rate constancy}, Volume = 14, Year = 1997} @article{sanderson02, Author = {M. Sanderson}, Journal = {Molecular Biology and Evolution}, Pages = {101-109}, Title = {Estimating absolute rates of molecular evolution and divergence times: a penalized likelihood approach}, Volume = 19, Year = 2002} @article{sanger77, Author = {F. Sanger and S. Nicklen and A.R. Coulson}, Journal = {PNAS}, Pages = {5463-5467}, Title = {DNA sequencing with chain-terminating inhibitors}, Volume = 74, Year = 1977} @article{sankoff94, Author = {D. Sankoff and Y. Abel and J. Hein}, Journal = {Journal of Classification}, Pages = {209-232}, Title = {A tree - a hill; generalization of nearest-neighbor in phylogenetic optimization}, Utilisateur = {Vincent}, Volume = 11, Year = 1994} @inbook{saporta, Author = {G. Saporta}, Chapter = { No 5 Notions {\'e}l{\'e}mentaires sur les processus al{\'e}atoires}, Pages = {103-113}, Publisher = {Technip}, Title = {Probabilit{\'e}s analyse des donn{\'e}es et statistique}, Utilisateur = {Guillaume Andrieu}, Year = 1990} @article{sharp97, Author = {P. Sharp}, Journal = {Nature}, Pages = {111-112}, Title = {In search of molecular Darwinism}, Volume = 385, Year = 1997} @article{sharp87, Author = {P. Sharp and W.-H. Li}, Journal = {Journal of Molecular Evolution}, Pages = {1281-1295}, Title = {The codon adaptation index--a measure of directional synonymous codon usage bias, and its potential applications}, Volume = 15, Year = 1987} @article{scherer89, Author = {Siegfried Scherer}, Journal = {Molecular Biology and Evolution}, Pages = {436-441}, Title = {The relative-rate test of the molecular clock hypothesis : a note of caution}, Utilisateur = {Gilles Caraux}, Volume = 6, Year = 1989} @article{shankarappa99, Author = {R. Shankarappa and J. Margolick and S. Gange and A. Rodrigo and D. Upchurch and H. Farzadegan and P. Gupta and C. Rinaldo and G. Learn and X. He and X.-L Huang and J. Mullins }, Journal = {Journal of Virology}, Pages = {10489-10502}, Title = {Consistent viral evolutionary changes associated with the progression of human immunodeficiency virus type 1 infection}, Volume = 73, Year = 1999} @article{schoniger93, Author = {Michael Sch{\"o}niger and Arndt von Haesler }, Journal = {Molecular Biology and Evolution}, Pages = {471-483}, Title = {A simple method to improve the reliability of tree reconstruction}, Utilisateur = {G. Andrieu}, Volume = 10, Year = 1993} @article{schoniger94, Author = {M. Sch{\"o}niger and A. von Haesler }, Journal = {Molecular Phylogeny and Evolution}, Pages = {240-247}, Title = {A stochastic model for the evolution of autocorrelated {DNA} sequences}, Volume = 3, Year = 1994} @article{schoniger95, Author = {M. Sch{\"o}niger and A. von Haesler }, Journal = {Systematic Biology}, Pages = {533-547}, Title = {Performance of the maximum likelihood, neighbor joining, and maximum parsimony methods when sequence sites are not independent}, Volume = 44, Year = 1995} @article{schwarz78, Author = {G. Schwarz}, Journal = {The annals of statistics}, Pages = {461-464}, Title = {Estimating the dimension of a model}, Volume = 6, Year = 1978} @article{sibley84, Author = {Charles G. Sibley and Jon E. Ahlquist}, Journal = {Journal of Molecular Evolution}, Pages = {2-15}, Title = {the phylogeny of the hominoid primates, as indicated by {DNA-DNA} hybridization}, Utilisateur = {Gilles Caraux}, Volume = 20, Year = 1984} @article{sibley87, Author = {Charles G. Sibley and Jon E. Ahlquist}, Journal = {Journal of Molecular Evolution}, Pages = {99-121}, Title = {{DNA} hybridization evidence of hominoid phylogeny : results from expanded set}, Utilisateur = {Gilles Caraux}, Volume = 26, Year = 1987} @book{paup, Address = {Sunderland, MA}, Author = {D. Swofford}, Publisher = {Sinauer}, Title = {{PAUP$^*$}: Phylogenetic Analysis by Parsimony$^*$ and other methods}, Year = 1999} @book{bambe, Address = {Duquesne University}, Author = {D. Simon and B. Larget}, Publisher = {Department of Mathematics and Computer Science}, Title = {Bayesian analysis in molecular biology and evolution (BAMBE), version 2.03 beta}, Year = 2000} @article{sarich67, Author = {V. Sarich and A. Wilson}, Journal = {Science}, Pages = {1200-1203}, Title = {Immunological time scale for hominid evolution}, Volume = 158, Year = 1967} @article{self87, Author = {S. Self and K. Liang}, Journal = {Journal of the American Statistical Association}, Pages = {605--610}, Title = {Asymptotic properties of maximum likelihood estimators and likelihood ratio tests under nonstandard conditions}, Volume = 82, Year = 1987} @article{shan09, title={Evolution of plant {MADS} box transcription factors: evidence for shifts in selection associated with early angiosperm diversification and concerted gene duplications}, author={Shan, H. and Zahn, L. and Guindon, S. and Wall, P.K. and Kong, H. and Ma, H. and DePamphilis, C.W. and Leebens-Mack, J. and others}, journal={Molecular Biology and Evolution}, volume={26}, number={10}, pages={2229--2244}, year={2009}, publisher={SMBE} } @article{murrell12, title={Detecting individual sites subject to episodic diversifying selection}, author={Murrell, Ben and Wertheim, Joel O and Moola, Sasha and Weighill, Thomas and Scheffler, Konrad and Pond, Sergei L Kosakovsky}, journal={PLoS Genetics}, volume={8}, number={7}, pages={e1002764}, year={2012}, publisher={Public Library of Science} } @article{pond05, title={Not so different after all: a comparison of methods for detecting amino acid sites under selection}, author={Kosakovsky Pond, Sergei and Frost, Simon}, journal={Molecular Biology and Evolution}, volume={22}, number={5}, pages={1208--1222}, year={2005}, publisher={SMBE} } @article{shimodaira99, Author = {H. Shimodaira and M. Hasegawa}, Journal = {Molecular Biology and Evolution}, Pages = {1114-1116}, Title = {Multiple comparisons of log-likelihoods with applications to phylogenetic inference}, Volume = 16, Year = 1999} @article{shriner04, Author = {D. Shrinner and A. Rodrigo and D. Nickle and J. Mullins}, Journal = {Genetics}, Pages = {1573-1583}, Title = {Pervasive genomic recombination of {HIV-1} \mbox{\it in vivo}}, Volume = {167}, Year = 2004} @article{sokal58, Author = {R. R. Sokal and C. D. Michener}, Journal = {University of Kansas Science Bulletin}, Pages = {1409-1438}, Title = {A statistical method for evaluating systematic relationships}, Volume = {38}, Year = {1958}} @article{sourdis87, Author = {J. Sourdis and C. Krimbas}, Journal = {Molecular Biology and Evolution}, Pages = {159-166}, Title = {Accuracy of phylogenetic trees estimated from {DNA} sequence data}, Volume = {4}, Year = {1987}} @article{springer01, Author = {M. Springer and R. De Bry and C. Douady and H. Amrine and O. Madsen and W. de Jong and M. Stanhope.}, Journal = {Molecular Biology and Evolution}, Pages = {132-143}, Title = {Mitochondrial versus nuclear gene sequences in deep-level mammalian phylogeny reconstruction}, Volume = {18}, Year = {2001}} @article{sourdis88, Author = {J. Sourdis and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {298-311}, Title = {Relative efficiencies of the maximum parsimony and distance-based methods in obtaining the correct phylogenetic tree}, Volume = {5}, Year = {1988}} @article{srs, Author = {T. Etzold and P. Argos}, Journal = {CABIOS}, Pages = {49-57}, Title = {{SRS}-an indexing and retrieval tool for flat file data libraries}, Volume = {9}, Year = {1993}} @article{spencer05, Author = {M. Spencer and E. Susko and A. Roger}, Journal = {Molecular Biology and Evolution}, Pages = {1161-1164}, Title = {Likelihood, parsimony, and heterogeneous evolution}, Volume = {22}, Year = {2005}} @article{squires07, author = {B. Squires and C. Macken and A. Garcia-Sastre and S. Godbole and J. Noronha and V. Hunt and R. Chang and C. Larsen and E. Klem and K. Biersack and R. Scheuermann}, title = {{B}io{H}ealth{B}ase: informatics support in the elucidation of influenza virus host-pathogen interactions and virulence}, journal = {Nucleic Acids Research}, volume = {Database issue}, year = {2007} } @article{raxml, Author = {A. Stamatakis}, Journal = {Bioinformatics}, Pages = {2688-2690}, Title = {{RAxML-VI-HPC}: Maximum Likelihood-based Phylogenetic Analyses with Thousands of Taxa and Mixed Models}, Volume = 22, Year = 2006} @article{stamatakis06, Author = {A. Stamatakis}, Journal = {Bioinformatics}, Pages = {2688-2690}, Title = {{RAxML-VI-HPC}: Maximum Likelihood-based Phylogenetic Analyses with Thousands of Taxa and Mixed Models}, Volume = 22, Year = 2006} @article{st77, Author = {S. Sattah and A. Tversky}, Journal = {Psychometrika}, Pages = {319-345}, Title = {Additive similarity trees}, Volume = 42, Year = 1977} @article{steel92, Author = {M. Steel}, Journal = {J. of Classification}, Pages = {91-116}, Title = {The complexity of reconstructing trees from qualitative characters and subtrees}, Utilisateur = {Vincent}, Volume = 9, Year = 1992} @article{steel93, Author = {M.A. Steel and D. Penny}, Journal = {Systematic Biology}, Number = 2, Pages = {126-141}, Title = {Distributions of tree comparison metrics - some new results}, Volume = 42, Year = 1993} @article{steel94, Author = {M. Steel}, Journal = {Systematic Biology}, Pages = {560-564}, Title = {The maximum likelihood point for a phylogenetic tree is not unique}, Volume = 43, Year = 1994} @article{steel00a, Author = {M. Steel and D. Penny}, Journal = {Molecular Biology and Evolution}, Pages = {839-50}, Title = {Parsimony, likelihood, and the role of models in molecular phylogenetics}, Volume = 17, Year = 2000} @article{steel00b, Author = {M. Steel and D. Huson and P. Lockhart}, Journal = {Systematic Biology}, Pages = {225-232}, Title = {Invariable site models and their use in phylogeny reconstruction}, Volume = 49, Year = 2000} @article{steel05, Author = {M. Steel}, Journal = {Trends in Genetics}, Pages = {307-309}, Title = {Should phylogenetic models be trying to ``fit an elephant''?}, Volume = 21, Year = 2005} @incollection{stewart93, Author = {Caro-Beth Stewart}, Booktitle = {Nature}, Month = {february}, Pages = {603-607}, Title = {The Powers and pitfalls of parsimony}, Utilisateur = {Vincent}, Volume = 361, Year = 1993} @article{stoffberg10, author = {S. Stoffberg and D. Jacobs and I. Mackie and C. Matthee}, title = {Molecular phylogenetics and historical biogeography of Rhinolophus bats}, journal = {Molecular Phylogenetics and Evolution}, Volume = 54, Pages = {1-9}, Year = 2010} @article{strimmer96, Author = {K. Strimmer and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {964-969}, Title = {Quartet puzzling: a quartet maximum-likelihood method for reconstructing tree topologies}, Volume = 13, Year = 1996} @article{strimmer97, Author = {K. Strimmer and N. Goldman and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {210-211}, Title = {Baysian Probabilities and Quartet puzzling}, Volume = 14, Year = 1997} @article{strimmer00, Author = {K. Strimmer and V. Moulton}, Journal = {Molecular Biology and Evolution}, Pages = {875-881}, Title = {Likelihood analysis of phylogenetic networks using directed graphical models}, Volume = 17, Year = 2000} @article{studier88, Author = {J. Studier and K. Kepler}, Journal = {Molecular Biology and Evolution}, Pages = {729-731}, Title = {A note on the neighbor-joining algorithm of Saitou and Nei}, Volume = 5, Year = 1988} @article{sullivan95, Author = {J. Sullivan and K. E. Holsinger and C. Simon}, Journal = {Molecular Biology and Evolution}, Pages = {988-1001}, Title = {Among-site variation and phylogenetic analysis of 12{S} r{RNA} in sigmontine rodents}, Volume = 12, Year = 1995} @article{sullivan97, Author = {J. Sullivan and D. Swofford}, Journal = {Journal of Mammalian Evolution}, Pages = {77-86}, Title = {Are Guinea pigs Rodents? The importance of adequate models in molecular phylogenetics.}, Volume = 4, Year = 1997} @article{susko02, Author = {E. Susko and Y. Inagaki and C. Field and M. Holder and A. Roger}, Journal = {Molecular Biology and Evolution}, Pages = {1514-1523}, Title = {Testing for differences in rates-across-sites distributions in phylogenetic subtrees}, Volume = 19, Year = 2002} @article{susko03, Author = {E. Susko and C. Field and C. Blouin and A. Roger}, Journal = {Systematic Biology}, Pages = {594-603}, Title = {Estimation of rates-across-sites distributions in phylogenetic substitution models}, Volume = 52, Year = 2003} @article{suzuki99, Author = {Y. Suzuki and T. Gojobori}, Journal = {Molecular Biology and Evolution}, Pages = {1315-1328}, Title = {A method for detecting positive selection at single amino acid sites}, Volume = 16, Year = 1999} @article{suzuki02, Author = {Y. Suzuki and G. V. Glazko and M. Nei}, Journal = {PNAS}, Pages = {16138-16143}, Title = {Overcredibility of molecular phylogenies obtained by Bayesian phylogenetics}, Volume = 99, Year = 2002} @article{suzuki04, Author = {Y. Suzuki and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {914-921}, Title = {False-positive selection identified by {ML}-based methods: examples from the {\it Sig1} gene of the diatom {T}halassoria weissflogii and the {\it tax} gene of a human {T}-cell lymphotropic virus}, Volume = 21, Year = 2004} @article{swanson01, Author = {W. Swanson and Z. Yang and M. Wolfner and C. Aquadro}, Journal = {PNAS}, Pages = {2509-2514}, Title = {Positive Darwinian selection drives the evolution of several female reproductive proteins in mammals}, Volume = 98, Year = 2001} @incollection{swofford90, Address = {Sunderland, MA}, Author = {D. Swofford and G. Olsen}, Booktitle = {Molecular Systematics}, Chapter = 11, Editor = {D. M. Hillis and C. Moritz}, Pages = {411-501}, Publisher = {Sinauer}, Title = {Phylogeny reconstruction}, Year = 1990} @incollection{swofford91, Author = {D. Swofford}, Booktitle = {Phylogenetic analysis of {DNA} sequences}, Chapter = 14, Editor = {M. M. Miyamoto and J. Cracraft}, Pages = {295-333}, Publisher = {Oxford University press}, Title = {When are phylogeny estimates from molecular and morphological data incongruent ?}, Year = 1991} @incollection{swofford96, Address = {Sunderland, MA}, Author = {D. Swofford and G. Olsen and P. Waddel and D. Hillis}, Booktitle = {Molecular Systematics}, Chapter = 11, Editor = {D. Hillis and C. Moritz and B. Mable}, Publisher = {Sinauer}, Title = {Phylogenetic inference}, Year = 1996} @article{tajima82, Author = {Fumio Tajima and Masatoshi Nei }, Journal = {Journal of Molecular Evolution}, Pages = {115-120}, Title = {Biases of the estimates of {DNA} divergence obtained by the restriction enzyme technique}, Utilisateur = {Gilles Caraux}, Volume = 18, Year = 1982} @article{tajima84, Author = {Fumio Tajima and Masatoshi Nei }, Journal = {Molecular Biology and Evolution}, Pages = {269-285}, Title = {Estimation of evolution distance between nucleotide sequences}, Volume = 1, Year = 1984} @article{tajima92, Author = {Fumio Tajima }, Journal = {Molecular Biology and Evolution}, Pages = {168-181}, Title = {Statistical Method for estimating the standard errors of branch lengths in a phylognetic tree reconstructed without assuming equal rates of nucleotide substitution among different lineages}, Utilisateur = {Guillaume Andrieu}, Volume = 1, Year = 1992} @article{tajima93, Author = {Fumio Tajima }, Journal = {Molecular Biology and Evolution}, Pages = {677-688}, Title = {Unbiased Estimation of evolutionary distance between nucleotide sequences}, Utilisateur = {Gilles Caraux and Guillaume Andrieu}, Volume = 10, Year = 1993} @article{tajima94, Author = {Fumio Tajima and Naoko Takezaki}, Journal = {Molecular Biology and Evolution}, Pages = {278-286}, Title = {Estimation of Evolutionary Distance for Reconstructiong Molecular Phylogenetic Trees}, Volume = 11, Year = 1994} @article{takahashi00, Author = {Kei Takahashi and Masatoshi Nei}, Journal = {Molecular Biology and Evolution}, Pages = {1251-1258}, Title = {Efficiencies of Fast Algorithms of Phylogenetic Inference Under the Criteria of Maximum Parsimony, Minimum Evolution, and Maximum Likelihood When a Large Number of Sequences Are Used}, Volume = 17, Year = 2000} @article{takahata81, Author = {Naoyuki Takahata and M. Kimura}, Journal = {Genetics}, Pages = {641-657}, Title = {A Model of Evolutionary Base Substitutions and its Application with special Reference to rapid change of Pseudogenes}, Utilisateur = {Guillaume Andrieu}, Volume = 98, Year = 1981} @article{takezaki94, Author = {N. Takezaki and M. Nei}, Journal = {Journal of Molecular Evolution}, Pages = {210-218}, Title = {Inconsistency of the maximum parsimony method when the rate of nucleotide, substitution is constant}, Utilisateur = {Vincent}, Volume = 39, Year = 1994} @Article{takezaki95, Author="Takezaki, N. and Rzhetsky, A. and Nei, M. ", Title="{{P}hylogenetic test of the molecular clock and linearized trees}", Journal="Molecular Biology and Evolution", Year="1995", Volume="12", Pages="823--833", Month="Sep" } @article{tamura93, Author = {K. Tamura and M. Nei}, Journal = {Molecular Biology and Evolution}, Pages = {512-526}, Title = {Estimation of the number of nucleotide substitutions in the control region of mitochondrial {DNA} in humans and chimpanzees}, Volume = 10, Year = 1993} @article{tateno82, Author = {Y. Tateno and M. Nei and F. Tajima}, Journal = {Journal of Molecular Evolution}, Pages = {387-404}, Title = {Accuracy of Estimed Phylogenetic Trees from Molecular Data : I. Distantly Related Species}, Volume = 18, Year = 1982} @article{tavare86, Author = {S. Tavar\'e}, Journal = {Lectures on Mathematics in the Life Sciences}, Pages = {57-86}, Title = {Some probabilistic and statistical problems on the analysis of {DNA} sequences}, Volume = 17, Year = 1986} @article{tillier98, Author = {E. Tillier and R. Collins}, Journal = {Genetics}, Pages = {1993-2002}, Title = {High Apparent Rate of Simultaneous Compensatory Base-Pair Substitutions in Ribosomal RNA}, Volume = 148, Year = 1998} @article{clustal, Author = {J. Thompson and D. Higgins and T. Gibson }, Journal = {Nucleic Acids Research}, Pages = {4673-4680}, Title = {{CLUSTAL W}: improving the sensitivity of progressive multiple sequence alignment through sequence weighting, position-specific gap penalties and weight matrix choice}, Volume = 22, Year = 1994} @article{clustalx, Author = {J. Thompson and T. Gibson and F. Plewniak and F. Jeanmougin and D. Higgins}, Journal = {Nucleic Acids Research}, Pages = {4876-4882}, Title = {The {C}lustal{X} windows interface: flexible strategies for multiple sequences alignement aided by quality analysis tool}, Volume = 24, Year = 1997} @article{thorne91, Author = { J. L. Thorne and H. Kishino and J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {114-124}, Title = {An Evolutionary Model for Maximum Likelihood Alignement of {DNA} Sequences}, Volume = 33, Year = 1991} @article{thorne92a, Author = { J. L. Thorne and H. Kishino and J. Felsenstein}, Journal = {Journal of Molecular Evolution}, Pages = {3-16}, Title = {Inching toward Reality: an Improved Likelihood Model of Sequence Evolution}, Volume = 34, Year = 1992} @article{thorne92b, Author = {J. L. Thorne and H. Kishino }, Journal = {Molecular Biology and Evolution}, Pages = {1148-1162}, Title = {Freeing Phylogenies from Artifacts of Alignement}, Utilisateur = {G. Andrieu}, Volume = 9, Year = 1992} @article{thorne98, Author = {J. Thorne and H. Kishino and I. Painter}, Journal = {Molecular Biology and Evolution}, Pages = {1647-1657}, Title = {Estimating the rate of evolution of the rate of molecular evolution}, Volume = 15, Year = 1998} @article{tourasse97, Author = {N.J. Tourasse and M. Gouy }, Journal = {Molecular Biology and Evolution}, Pages = {287-98}, Title = {Evolutionary distances between nucleotide sequences based on the distribution of substitution rates among sites as estimated by parsimony}, Volume = 14, Year = 1997} @book{trivedi01, Address = {Chichester}, Author = {K. Trivedi}, Publisher = {Wiley}, Title = {Probability and Statistics with Reliability, Queuing, and Computer Science Applications}, Year = {2001}} @article{tuffley98, Author = {C. Tuffley and M. Steel}, Journal = {Mathematical Biosciences}, Pages = {63-91}, Title = {Modeling the covarion hypothesis of nucleotide substitution}, Volume = 147, Year = 1998} @incollection{vach89, Author = {Werner Vach}, Booktitle = {Conceptual and numerical analysis of data}, Editor = {O. Opitz}, Pages = {230-238}, Publisher = {Springer Verlag}, Title = {Least squares approximation of additive trees}, Year = 1989} @article{wahlberg06, Author = {N. Wahlberg}, Journal = {Systematic Biology}, Title = {That awkward age for butterflies: insights from the age of the butterfly subfamily {N}ymphalinae ({L}epidoptera: {N}ymphalidae)}, Pages = {703-714}, Volume = {55}, Year = {2006}, } @article{wakeley93, Author = {J. Wakeley}, Journal = {J Mol Evol}, Number = 6, Pages = {613-23}, Title = {Substitution rate variation among sites in hypervariable region 1 of human mitochondrial DNA.}, Volume = 37, Year = 1993} @article{wakeley94, Author = {J. Wakeley}, Journal = {Molecular Biology and Evolution}, Pages = {436-442}, Title = {Substitution rate variation among sites and the estimation of transition bias}, Year = 1994} @article{vandepeer04, Author = {Y. Van de Peer}, Journal = {Nature Reviews Genetics}, Pages = {752-763}, Title = {Computational approaches to unveiling ancient genome duplications}, Volume = 5, Year = 2004} @article{vin04, Author = {L. Sy Vinh and A. von Haeseler}, Journal = {Molecular Biology and Evolution}, Pages = {1565-1571}, Title = {{IQPNNI}: Moving Fast Through Tree Space and Stopping in Time}, Volume = 21, Year = 2004} @article{vonhaeseler93, Author = {Arndt Von Haeseler and Gary A. Churchill}, Journal = {J. Mol Evol}, Pages = {77-85}, Title = {Network Models for Sequence Evolution}, Utilisateur = {Guillaume Andrieu}, Volume = 37, Year = 1993} @article{wagner02, Author = {A. Wagner}, Journal = {Genome Biology}, Pages = {1012.1-1012.3}, Title = {Selection and gene duplication : a view from the genome}, Volume = 3, Year = 2002} @phdthesis{waddell95, Author = {P.J. Waddell}, School = {Massey University}, Title = {Statisctical Methods of Phylogenetic Analysis: Including Hadamard Conjugations, LogDet Transforms, and Maximum Likelihood}, Year = 1995} @article{waterman77, Author = {M. S. Waterman and T. F. Smith and M. Singh and W. A. Beyer}, Journal = {Journal of Theoretical Biology}, Pages = {199-213}, Title = {Additive Evolutonary trees}, Utilisateur = {Gilles Caraux et Vincent}, Volume = 64, Year = 1977} @article{waterman78, Author = {M. S. Waterman and T. F. Smith}, Journal = {Journal of Theoretical Biology}, Pages = {789-800}, Title = {On the similarity of dendrograms}, Utilisateur = {Gilles Caraux}, Volume = 73, Year = 1978} @article{whelan01, Author = {S. Whelan and Pietro Li{\`o} and Nick Goldman}, Journal = {Trends in Genetics}, Number = 5, Pages = {262-272}, Title = {Molecular phylogenetics: state-of-the art methods for looking into the past}, Volume = 17, Year = 2001} @article{whelan01b, Author = {S. Whelan and N. Goldman}, Journal = {Molecular Biology and Evolution}, Pages = {691-699}, Title = {A General Empirical Model of Protein Evolution Derived from Multiple Protein Families Using a Maximum-Likelihood Approach}, Volume = 18, Year = 2001} @article{wilkinson95, Author = {M. Wilkinson}, Journal = {Systematic Biology}, Optnumber = {3}, Optpages = {435-439}, Optvolume = {44}, Title = {More on reduced consensus methods}, Year = {1995}} @article{whitley94, Author = {D. Whitley}, Journal = {Statistics and Computing}, Pages = {65-85}, Title = {A Genetic Algorithm Tutorial}, Volume = 4, Year = {1994}} @incollection{williams90, Address = {New York}, Author = {Patrick L. Williams and Walter M. Fitch}, Booktitle = {Molecular evolution : computer analysis of protein and nucleic acidsequences}, Chapter = 38, Editor = {Russsell F. Doolittle}, Pages = {615-626}, Publisher = {Academic Press}, Series = {Methods In Enzymology}, Title = {Phylogeny Determination Using Dynamically Weighted Parsimony Method}, Volume = 183, Year = 1990} @article{suzuki08, title={False-positive results obtained from the branch-site test of positive selection}, author={Suzuki, Yoshiyuki}, journal={Genes \& Genetic Systems}, volume={83}, number={4}, pages={331--338}, year={2008}, publisher={J-STAGE} } @article{nozawa09, title={Reliabilities of identifying positive selection by the branch-site and the site-prediction methods}, author={Nozawa, Masafumi and Suzuki, Yoshiyuki and Nei, Masatoshi}, journal={PNAS}, volume={106}, number={16}, pages={6700--6705}, year={2009}, publisher={National Acad Sciences} } @article{wong04, Author = {W. Wong and Z. Yang and N. Goldman and R. Nielsen}, Journal = {Genetics}, Pages = {1041-1051}, Title = {Accuracy and power of statistical methods for detecting adaptive evolution in protein coding sequences and for identifying positively selected sites}, Volume = {168}, Year = 2004} @article{yang11, title={Statistical properties of the branch-site test of positive selection}, author={Yang, Ziheng and dos Reis, Mario}, journal={Molecular Biology and Evolution}, volume={28}, number={3}, pages={1217--1228}, year={2011}, publisher={SMBE} } @article{yang93, Author = {Z Yang}, Journal = {Molecular Biology and Evolution}, Pages = {1396-1401}, Title = {Maximum-likelihood estimation of phylogeny from {DNA} sequences when substitution rates differ over sites}, Volume = {10}, Year = 1993} @article{yang94, Author = {Z. Yang and N. Goldman and A. Friday}, Journal = {Molecular Biology and Evolution}, Pages = {316-324}, Title = {Comparison of models for nucleotide substitution used in maximum-likelihood phylogenetic estimation.}, Volume = 11, Year = 1994} @article{yang94b, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {306-314}, Title = {Maximum likelihood phylogenetic estimation from {DNA} sequences with variable rates over sites: approximate methods}, Volume = 39, Year = 1994} @article{yang94c, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {105-111}, Title = {Estimating the pattern of nucleotide substitution}, Volume = 10, Year = 1994} @article{yang94d, Author = {Z. Yang}, Journal = {Systematic Biology}, Pages = {329-342}, Title = {Statistical properties of the maximum likelihood method of phylogenetic estimation and comparison with distance matrix methods}, Volume = 43, Year = 1994} @article{yang95a, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {689-697}, Title = {Evaluation of several methods for estimating phylogenetic trees when substitution rates differ over nucleotide sites}, Volume = 40, Year = 1995} @article{yang95b, Author = {Z. Yang}, Journal = {Genetics}, Pages = {993-1005}, Title = {A space-time process model for the evolution of {DNA} sequences}, Volume = 193, Year = 1995} @article{yang96, Author = {Z. Yang and S. Kumar}, Journal = {Molecular Biology and Evolution}, Pages = {650-659}, Title = {Approximate methods for estimating the pattern of nucleotide substitution and the variation of substitution rates among sites}, Volume = 13, Year = 1996} @article{yang98, Author = {Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {568-573}, Title = {Likelihood ratio tests for detecting positive selection and application to primate lysozyme evolution}, Volume = 15, Year = 1998} @article{paml, Author = {Z. Yang}, Journal = {Computer Applications in the Biosciences (CABIOS)}, Pages = {555-556}, Title = {{PAML} : a program package for phylogenetic analysis by maximum likelihood}, Volume = 13, Year = 1997} @article{paml4, title={{PAML} 4: phylogenetic analysis by maximum likelihood}, author={Yang, Ziheng}, journal={Molecular Biology and Evolution}, volume={24}, number={8}, pages={1586--1591}, year={2007}, publisher={SMBE} } @article{yang96b, Author = {Z. Yang}, Journal = {Trends in Ecology and Evolution}, Number = 9, Pages = {367-372}, Title = {Among-site rate variation and its impact on phylogenetic analyses}, Volume = 11, Year = 1996} @article{yang96c, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {294-307}, Title = {Phylogenetic analysis using parsimony and likelihood methods}, Volume = 42, Year = 1996} @article{yang97, Author = {Z. Yang}, Journal = {Trends in Ecology and Evolution}, Number = 9, Pages = {357}, Title = {Are big trees indeed easy ?}, Volume = 12, Year = 1997} @article{yang97b, Author = {Z. Yang and B. Rannala}, Journal = {Molecular Biology and Evolution}, Pages = {717-724}, Title = {Bayesian phylogenetic inference using {DNA} sequences: a Markov Chain {M}onte {C}arlo method}, Volume = 14, Year = 1997} @article{yang97c, Author = {Z. Yang}, Journal = {Molecular Biology and Evolution}, Pages = {105-108}, Title = {How often do wrong models produce better phylogenies?}, Volume = 14, Year = 1997} @article{yang00, Author = {Z. Yang}, Journal = {Journal of Molecular Evolution}, Pages = {423-432}, Title = {Maximum likelihood Estimation on large phylogenies and analysis of adaptative evolution in human influenza virus {A}}, Volume = 51, Year = 2000} @article{yang00d, title={Maximum-likelihood analysis of molecular adaptation in abalone sperm lysin reveals variable selective pressures among lineages and sites}, author={Yang, Z. and Swanson, W.J. and Vacquier, V.D.}, journal={Molecular Biology and Evolution}, volume={17}, number={10}, pages={1446--1455}, year={2000}, publisher={SMBE} } @Article{yang06, Author="Yang, Z. and Rannala, B. ", Title="{{B}ayesian estimation of species divergence times under a molecular clock using multiple fossil calibrations with soft bounds}", Journal="Molecular Biology and Evolution", Year="2006", Volume="23", Pages="212--226", Month="Jan" } @book{yang06b, title={Computational molecular evolution}, author={Yang, Z.}, volume={284}, year={2006}, publisher={Oxford University Press Oxford} } @article{pond11, title={A random effects branch-site model for detecting episodic diversifying selection}, author={Kosakovsky Pond, Sergei L and Murrell, Ben and Fourment, Mathieu and Frost, Simon DW and Delport, Wayne and Scheffler, Konrad}, journal={Molecular Biology and Evolution}, volume={28}, number={11}, pages={3033--3043}, year={2011}, publisher={SMBE} } @article{yokoyama96, Author = {S. Yokoyama and R. Yokoyama}, Journal = {Annual Review of Ecology and Systematics}, Pages = {543-567}, Title = {Adaptative evolution of photoreceptors and visual pigments in vertebrates}, Volume = 27, Year = 1996} @article{yang00b, Author = {Z. Yang and R. Nielsen}, Journal = {Molecular Biology and Evolution}, Pages = {32-43}, Title = {Estimating synonymous and nonsynonymous substitution rates under realistic evolutionary models}, Volume = 17, Year = 2000} @article{yang00c, Author = {Z. Yang and R. Nielsen and N. Goldman and A.-M. {Krabbe Pedersen}}, Journal = {Genetics}, Pages = {431-449}, Title = {Codon-substitution models for heterogeneous selection pressure at amino acid sites}, Volume = 155, Year = 2000} @article{yang02, Author = {Z. Yang and R. Nielsen}, Journal = {Molecular Biology and Evolution}, Pages = {908-917}, Title = {Codon-substitution models for detecting molecular adaptation at individual sites along specific lineages}, Volume = 19, Year = 2002} @article{yang05, Author = {Z. Yang and W. Wong and R. Nielsen}, Journal = {Molecular Biology and Evolution}, Pages = {1107-1118}, Title = {Bayes empirical {B}ayes inference of amino acid sites under positive selection}, Volume = 22, Year = 2005} @article{tateno94, Author = {Y. Tateno and N. Takezaki and M. Nei }, Journal = {Molecular Biology and Evolution}, Pages = {261-77}, Title = {Relative efficiencies of the maximum-likelihood, neighbor-joining, and maximum-parsimony methods when substitution rate varies with site.}, Volume = 11, Year = 1994} @article{uzzell71, Author = {T. Uzzell and K. Corbin}, Journal = {Science}, Pages = {1089-1096}, Title = {Fitting discrete probability distributions to evolutionary events}, Volume = 172, Year = 1971} @article{winter02, Author = {K.-U. Winter and H. Saedler and G. Theissen}, Journal = {The Plant Journal}, Pages = {457-475}, Title = {On the origin of class {B} floral homeotic genes: functional substitution and dominant inhibition in {\em \uppercase{A}rabidopsis} by expression of an orthologue from the gymnosperm {\em \uppercase{G}netum}}, Volume = 31, Year = 2002} @article{zahn05, Author = {L. Zahn and J. Leebens-Mack and C. DePamphilis and H. Ma and G. Theissen}, Journal = {Journal of Heredity}, Pages = {225-240}, Title = {To {B} or {N}ot to {B} a flower: the role of {DEFICIENS} and {GLOBOSA} orthologs in the evolution of the angiosperms}, Volume = {96}, Year = {2005}} @article{zaretskii65, Author = {K. Zaretskii }, Journal = {USpekHi Math. Nauk.}, Pages = {90-92}, Title = {Construction d'un arbre sur la base d'un ensemble de distances entre ses feuilles}, Volume = 20, Year = 1965} @article{zharkikh92a, Author = {Andrey Zharkikh and Wen-Hsiung Li }, Journal = {Molecular Biology and Evolution}, Pages = {1119-1147}, Title = {Statistical properties of Bootstrap estimation of phylogenies variability from nucleotide sequences. {I.} Four Taxa with a molecular clock.}, Volume = 9, Year = 1992} @article{zharkikh92b, Author = { Andrey Zharkikh and Wen-Hsiung Li}, Journal = {Journal of Molecular Evolution}, Pages = {356-366}, Title = {Statistical Properties of Bootstrap Estimation of Phylogenetic Variability from Nucleotide Sequences: {II.} Four Taxa without a Molecular Clock}, Volume = 35, Year = 1992} @article{zharkikh93, Author = {A. Zharkikh and W.-H. Li}, Journal = {Systematic Biology}, Pages = {113-125}, Title = {Inconsistency of the Maximum Parsimony Method: The Case of Five Taxa With a Molecular Clock}, Utilisateur = {Vincent}, Volume = 42, Year = 1993} @article{zharkikh94, Author = {A. Zharkikh}, Journal = {Journal of Molecular Evolution}, Pages = {315-329}, Title = {Estimation of evolutionary distance between nucleotide sequences}, Volume = 39, Year = 1994} @article{zharkikh95, Author = {A. Zharkikh and W.-H. Li}, Journal = {Mol. Phylogenet. Evol.}, Number = 1, Pages = {44-63}, Title = {Estimation of confidence in phylogeny: the complete-and-partial bootstrap technique}, Utilisateur = {Vincent et Olivier}, Volume = 4, Year = 1995} @inbook{zuckerkandl62, Address = {Amsterdam}, Author = {E. Zuckerkandl and L. Pauling}, Editor = {M. Kasha and B. Pullman}, Chapter = {Molecular disease, evolution, and genic heterogeneity}, Pages = {189-225}, Publisher = {Elsevier}, Title = {Horizons in Biochemistry}, Year = 1962} @incollection{vach92, Author = {V. Vach}, Booktitle = {Analysing and Modeling Data and Knowledge}, Editor = {M. Shader}, Pages = {141-150}, Publisher = {Springer}, Title = {The Jukes-Cantor Transformation and Additivity of Estimated Genetic Distances}, Year = 1992} @Article{wu85, Author="Wu, C. I. and Li, W. H. ", Title="{{E}vidence for higher rates of nucleotide substitution in rodents than in man}", Journal="PNAS", Year="1985", Volume="82", Pages="1741--1745", Month="Mar" } @phdthesis{garli, Author = {D. Zwickl}, School = {The University of Texas at Austin}, Title = {Genetic algorithm approaches for the phylogenetic analysis of large biological sequence datasets under the maximum likelihood criterion}, Year = {2006}} phyml-3.3.20220408/examples/000077500000000000000000000000001422404706600152335ustar00rootroot00000000000000phyml-3.3.20220408/examples/lg4x/000077500000000000000000000000001422404706600161115ustar00rootroot00000000000000phyml-3.3.20220408/examples/lg4x/X1.mat000077500000000000000000000035541422404706600171160ustar00rootroot000000000000000.295719 0.067388 0.448317 0.253712 0.457483 2.358429 1.029289 0.576016 0.251987 0.189008 0.107964 1.741924 0.216561 0.599450 0.029955 0.514644 0.736017 0.503084 109.901504 0.084794 4.117654 10.868848 0.704334 0.435271 1.070052 1.862626 0.246260 1.202023 0.380498 5.658311 4.873453 5.229858 0.553477 6.508329 1.634845 0.404968 0.084223 0.123387 0.090748 0.052764 0.151733 0.054187 0.060194 0.048984 0.204296 0.086976 0.221777 0.033310 0.021407 0.230320 0.195703 0.069359 0.069963 0.504221 1.495537 0.188789 93.433377 0.746537 0.621146 0.096955 1.669092 2.448827 0.256662 1.991533 0.091940 0.122332 0.286389 0.382175 0.128905 0.081091 0.352526 0.810168 0.232297 0.228519 0.655465 1.994320 3.256485 0.457430 0.155567 0.235965 0.127321 0.205164 0.590018 0.066081 0.064822 0.241077 6.799829 0.754940 2.261319 0.163849 1.559944 1.671061 6.535048 0.904011 5.164456 0.386853 2.437439 3.537387 4.320442 11.291065 0.170343 0.848067 5.260446 0.426508 0.438856 2.132922 0.525521 0.939733 0.747330 1.559564 0.165666 0.435384 3.656545 0.961142 0.050315 0.064441 0.360946 0.132547 0.306683 4.586081 0.529591 0.303537 0.435450 0.308078 0.606648 0.106333 0.290413 0.290216 0.448965 0.372166 0.102493 0.389413 0.498634 0.109129 2.099355 3.634276 0.115551 0.641259 0.046646 0.260889 0.587531 0.093417 0.280695 0.307466 6.227274 0.206332 0.459041 0.033291 0.559069 18.392863 0.411347 0.101797 0.034710 0.102453 0.289466 0.262076 0.185083 0.592318 0.035149 0.105999 0.096556 20.304886 0.097050 0.133091 0.115301 0.264728 66.647302 0.476350 0.148995 0.063603 20.561407 0.916683 0.102065 0.043986 0.080708 0.885230 0.072549 0.206603 0.306067 0.205944 5.381403 0.561215 0.112593 0.693307 0.400021 0.584622 0.089177 0.755865 0.133790 0.154902 0.147383 0.017579 0.058208 0.017707 0.026331 0.041582 0.017494 0.027859 0.011849 0.076971 0.147823 0.019535 0.037132 0.029940 0.008059 0.088179 0.089653 0.006477 0.032308 0.097931 phyml-3.3.20220408/examples/lg4x/X2.mat000077500000000000000000000035531422404706600171160ustar00rootroot000000000000000.066142 0.590377 0.468325 0.069930 0.013688 2.851667 9.850951 0.302287 3.932151 0.146882 1.101363 1.353957 8.159169 0.249672 0.582670 0.150375 0.028386 0.219934 0.560142 0.005035 3.054085 0.568586 0.037750 0.421974 0.046719 0.275844 0.129551 0.037250 0.051668 0.262130 2.468752 0.106259 0.098208 4.210126 0.029788 0.013513 0.127170 0.016923 0.344765 0.003656 0.445038 0.165753 0.008541 0.002533 0.031779 0.292429 0.064289 0.210724 0.004200 1.217010 1.088704 0.014768 0.005848 0.064558 7.278994 0.071458 0.855973 1.172204 0.014189 0.033969 1.889645 0.125869 0.031390 0.065585 0.029917 0.042762 1.218562 0.079621 0.763553 0.009876 1.988516 3.344809 0.056702 0.021612 0.079927 7.918203 14.799537 0.259400 0.075144 0.011169 0.082464 0.002656 0.681161 0.111063 0.004186 0.004854 0.095591 0.450964 1.506485 0.009457 1.375871 7.169085 0.161937 0.726566 0.040244 0.825960 2.067758 0.110993 0.129497 0.196886 0.169797 0.637893 0.090576 0.457399 0.143327 30.139501 0.276530 11.149790 0.267322 18.762977 3.547017 0.201148 0.976631 0.408834 0.104288 0.123793 0.292108 0.598048 0.328689 3.478333 13.461692 0.161053 4.782635 0.053740 11.949233 2.466507 0.139705 0.053397 0.126088 1.578530 0.641351 0.297913 4.418398 0.125011 2.984862 13.974326 0.021372 0.081472 0.058046 0.006597 0.286794 0.188236 0.009201 0.019475 0.037226 0.015909 0.154810 0.017172 0.239749 0.562720 0.061299 0.154326 0.060703 0.045779 0.036742 0.498072 0.027639 0.534219 0.203493 0.012095 0.004964 0.452302 0.094365 0.140750 0.021976 0.168432 1.414883 0.077470 0.224675 0.123480 0.447011 4.270235 0.030342 0.258487 0.012745 4.336817 0.281953 0.043812 0.015539 0.016212 16.179952 3.416059 0.032578 2.950318 0.227807 1.050562 0.112000 5.294490 0.033381 0.045528 0.063139 0.066357 0.011586 0.066571 0.010800 0.009276 0.053984 0.146986 0.034214 0.088822 0.098196 0.032390 0.021263 0.072697 0.016761 0.020711 0.020797 0.025463 0.045615 0.094372 phyml-3.3.20220408/examples/lg4x/X3.mat000077500000000000000000000035451422404706600171200ustar00rootroot000000000000000.733336 0.558955 0.597671 0.503360 0.058964 5.581680 4.149599 2.863355 1.279881 0.225860 1.415369 2.872594 1.335650 0.434096 1.043232 1.367574 0.258365 0.397108 2.292917 0.209978 4.534772 1.263002 0.366868 1.840061 1.024707 0.823594 0.377181 0.496780 0.994098 2.578946 5.739035 0.821921 3.039380 4.877840 0.532488 0.398817 0.517204 0.358350 0.284730 0.027824 1.463390 0.370939 0.232460 0.008940 0.349195 0.775054 0.672023 0.109781 0.021443 1.983693 1.298542 0.169219 0.043707 0.838324 5.102837 0.763094 5.349861 1.612642 0.088850 0.397640 3.509873 0.755219 0.436013 0.888693 0.561690 0.401070 1.890137 0.691594 0.466979 0.060820 2.831098 2.646440 0.379926 0.087640 0.488389 7.010411 8.929538 1.357738 0.540460 0.063347 0.141582 0.018288 4.102068 0.087872 0.020447 0.064863 1.385133 3.054968 5.525874 0.043394 3.135353 0.200122 0.032875 0.019509 0.042687 0.059723 0.072299 0.023282 0.036426 0.050226 0.039318 0.067505 0.023126 0.012695 0.015631 4.972745 0.821562 4.670980 1.199607 5.901348 1.139018 0.503875 1.673207 0.962470 0.204155 0.273372 0.567639 0.570771 0.458799 0.233109 1.825593 0.580847 1.967383 0.420710 2.034980 0.864479 0.577513 0.124068 0.502294 2.653232 0.437116 1.048288 2.319555 0.151684 0.077004 8.113282 0.450842 0.661866 0.088064 0.037642 2.600668 0.390688 0.109318 0.218118 1.065585 0.564368 1.927515 0.120994 1.856122 4.154750 0.011074 0.377578 0.222293 0.526135 0.265730 0.581928 0.141233 5.413080 0.322761 0.153776 0.039217 8.351808 0.854294 0.940458 0.180650 0.975427 11.429924 0.026268 0.429221 0.273138 4.731579 3.839269 0.395134 0.145401 0.090101 4.193725 0.625409 0.696533 0.104335 0.377304 15.559906 2.508169 0.449074 3.404087 1.457957 0.052132 0.260296 2.903836 0.564762 0.681215 0.062457 0.066826 0.049332 0.065270 0.006513 0.041231 0.058965 0.080852 0.028024 0.037024 0.075925 0.064131 0.019620 0.028710 0.104579 0.056388 0.062027 0.008241 0.033124 0.050760 phyml-3.3.20220408/examples/lg4x/X4.mat000077500000000000000000000035471422404706600171230ustar00rootroot000000000000000.658412 0.566269 0.540749 0.854111 0.058015 3.060574 0.884454 5.851132 1.279257 0.160296 1.309554 2.294145 1.438430 0.482619 0.992259 1.272639 0.182966 0.431464 2.992763 0.086318 2.130054 1.874713 0.684164 2.075952 1.296206 2.149634 0.571406 0.507160 0.552007 3.192521 4.840271 0.841829 5.103188 4.137385 0.351381 0.679853 0.227683 0.528161 0.644656 0.031467 3.775817 0.437589 0.189152 0.025780 0.665865 0.581512 1.128882 0.266076 0.048542 3.954021 2.071689 0.217780 0.082005 1.266791 8.904999 0.695190 3.010922 2.084975 0.132774 0.190734 2.498630 0.767361 0.326441 0.680174 0.652629 0.440178 0.967985 1.012866 0.720060 0.133055 1.776095 1.763546 0.278392 0.343977 0.717301 10.091413 14.013035 1.082703 0.344015 0.227296 0.291854 0.056045 4.495841 0.116381 0.092075 0.195877 4.001286 2.671718 5.069337 0.091278 4.643214 0.978992 0.156635 0.028961 0.209188 0.264277 0.296578 0.177263 0.217424 0.362942 0.086367 0.539010 0.172734 0.121821 0.161015 3.427163 0.878405 4.071574 0.925172 7.063879 1.033710 0.451893 3.057583 1.189259 0.359932 0.742569 0.693405 0.584083 1.531223 1.287474 2.333253 0.802754 2.258357 0.360522 2.221150 1.283423 0.653836 0.377558 0.964545 4.797423 0.780580 1.422571 4.216178 0.599244 0.444362 5.231362 0.154701 0.830884 0.073037 0.094591 3.017954 0.312579 0.074620 0.401252 1.350568 0.336801 1.331875 0.068958 1.677263 5.832025 0.076328 0.548763 0.208791 0.221089 0.431617 1.238426 0.313945 8.558815 0.305772 0.181992 0.072258 12.869737 1.021885 1.531589 0.163829 1.575754 33.873091 0.079916 0.831890 0.307846 5.910440 2.088785 0.456530 0.199728 0.118104 4.310199 0.681277 0.752277 0.241015 0.531100 23.029406 4.414850 0.481711 5.046403 1.914768 0.466823 0.382271 3.717971 0.282540 0.964421 0.106471 0.074171 0.044513 0.096390 0.002148 0.066733 0.158908 0.037625 0.020691 0.014608 0.028797 0.105352 0.007864 0.007477 0.083595 0.055726 0.047711 0.003975 0.010088 0.027159phyml-3.3.20220408/examples/lg4x/lg4x.xml000077500000000000000000000037121422404706600175170ustar00rootroot00000000000000 phyml-3.3.20220408/examples/nexus_example.nxs000077500000000000000000000041771422404706600206560ustar00rootroot00000000000000[ This is a comment ] #NEXUS BEGIN DATA; DIMENSIONS NTAX=10 NCHAR=60; FORMAT DATATYPE=STANDARD INTERLEAVE SYMBOLS="00 01 02 03"; MATRIX tax1 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 03 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax2 01 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 00 00 02 00 00 01 03 00 00 01 01 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax3 02 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax4 03 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax5 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 01 01 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax6 01 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 00 00 02 00 00 00 01 03 00 00 01 01 00 02 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax7 02 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 02 00 03 03 03 01 01 03 03 00 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 02 tax8 03 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? tax9 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 02 02 00 03 03 03 01 03 03 01 02 03 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 03 00 tax10 01 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 00 02 01 02 02 01 02 00 02 01 02 00 00 01 00 02 02 00 00 00 03; END; phyml-3.3.20220408/examples/nucleic000077500000000000000000001665431422404706600166220ustar00rootroot0000000000000054 886 tax1 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C---CC tax2 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-TCAC tax3 ?????????? TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TG----TGAT tax4 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T-CC tax5 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAAGC TGG-C----- tax6 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax7 ?T-GCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA --TTGAAATC TGGGC-T--C tax8 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax9 ?????????? TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax10 ????????AG TA-CGGCGAG TGAAGCGGCA ACAGCTCCA- T-TTGAAATC TGG-C-T--C tax11 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax12 ATTGCCCTAG TA-CGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax13 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax14 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax15 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax16 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax17 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA TCAGCTCAAA T-TTGAAATC TGG-C-T--C tax18 ATTGCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C--CCC tax19 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax20 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax21 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax22 ATTGCCTTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CCTCTT tax23 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA AAAGCTCAGA T-TTGAAATC TGG-CGTCTT tax24 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-TCTG tax25 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax26 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax27 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T-CC tax28 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CCT-CC tax29 ?TTGCCCTAG TA-CGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax30 ATTGCCCTAG TA-CGGCGAG TGA-GCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax31 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax32 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CGT--C tax33 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax34 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTAAAATC TGG-C-TCTG tax35 ????????AG TA-CGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-TCTC tax36 ATTGCCTCAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-CCG-TT tax37 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAAGC TGG-C----- tax38 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAAGC TGG-C----- tax39 ATTGCCTTAG TAACGGCGAG T-AAGC-GCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax40 ?????????? ?????????? ?????????A ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax41 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax42 ATTGCCCTAG TAACGGCGAG T-AAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax43 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax44 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax45 ??TGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax46 ?TTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax47 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax48 ATTGCCCTAG TAACGGCGAG T-AAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax49 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCTCAAA T-TTGAAATC TGG-C-T--C tax50 ATAGCCCTAG TAACGGCGAG TGAAGCGGCT ACAGCTCAAA T-TTGAAATC TGG-CCTC-C tax51 ATTGCCCTAG TAACGGCGAG TGAAGCGGCA ACAGCACAAA T-TTGAAATC TGG-C---TC tax52 ATTGCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C---CC tax53 TTCGCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C---CC tax54 ???GCCCCAG TAACGGCGAG TGAAGCGGCA ATAGCTCAAA T-TTGAAATC TGG-C---CC TCTCAG--GG TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCATTGGTTG TGGTCTAAGT ---------G CCCGAGTTGT AATTTGTAGA GGATGTTTCG GGTGAAGCCG CGGTCCAAGT ---GAAA--G CCCGAGTTGT AATTTGCAGA GGATGTTTCG GGCGAGGCCG CGGTCCAAGT TTT-GG--GG TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCGTTGGCTG TGGTCTAAGT TT----ATGG CCCGCATTGT AATTTGTAGA GGATGCTTTT AGGCAGCCGC CGGTCTAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GTGTCGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGTGCTTTG GCAAAGGTTG TGGTCTAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATAGGCAG CGATTCAAGT TTT-GG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GAGTTGGCTG CAGCCTAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGTGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGGAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGCAG CGGTCCAAGT T---GG--GG TCCGAATTGT AATTTGGAGA GGATGTTTTT GGGTGTCCGC CGGCCTAAGT C---GG-C-G TCCGAGTTGT AATCTGTAGA GGATGCCTTT GGGTAGCCAC CGGTCTAAGT TAAAAGA--G TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GTGTTGGTAG CGGTCTAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GGA--G TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCGTTGGTTG TGGTCTAAGT TTTGGG--GG TCCGAGTTGT AATTTGCAGA GGGTGCTTTG GCATTGGCGG CGGTCTAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTT-GG-C-G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCATTGGCAG CGGTCCAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGCAG CGGTCCAAGT CTCTAG--GG TCCGAGTTGT AATTTGTAGA GGGTGCTTTG GCACTGATGG CGGTCTAAGT TTTGGG--GG TCCGAGTTGT AATTTGCAGA GGATGCTTTG GCATTGGCGG CGGTCTAAGT TA-----CGG TCCGAGTTGT AATTTGTAGA GGATGTTTTG GGTACCGCCC CGGTTTAAAT TT----ATGG TCCGCATTGT AATTTGTAGA GGATGATTTT AGGCAGCCGC CGGTCTAAGT TT----ATGG CCCGCATTGT AATTTGTAGA GGATGCTTTT AGGCAGCCGC CGGTCTAAGT TTTTAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTCAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TTTTAGA--G TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCTTTGGCAG CGGTCCAAGT TCTGGG--GG TCCGAGTTGT AATTTGCAGA GGATGCTTTG GCGTTGGCGG CGGTCTAAGT TTTTA---GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GCGTTGGCAG CGGTCCAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GTGTCGGCAG CAGCCTAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GTGTCGGCAG CAGCCTAAGT TTTCAG--GG TCCGAGTTGT AATTTGCAGA GGGCGCTTTG GAGTCGGCAG CAGCCTAAGT TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA ACCTTC-GCC CCCTTGGAAC AGGACGTCAT AGAGGGTGAG AACCCCGTAC CTGGCCGCCG GTGCCC--CC CCCTTGGAAC AGGACGTCAT AGAGGGTGAG AACCCCGTAC CTGGCCGCCG GCTCCCC-CC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA GCCTCC-GCC TCCTTGGAAC AGGACGTCAT AGAGGGTGAG AATCCCGTAT GTGACCGGCT -CTGGC-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA ACCCGC-GCT TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTCTT-GCC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGTTGCAT GCCTTC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATC-GCC TCTTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA TCCTTC-GCC TCTTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTC-GCC CCCTTGGAAC AGGGCGTCAT AGAGGGTGAG AATCCCGTAT GTGGCCGGAA AGGTACC-CT CCCCTGGAAC GGGGTGTCAC AGAGGGTGAG AATCCCGTAT GTGACCGGAA GGGCGCC-CT TCCTTGGAAC AGGACATCAC AGAGGGTGAG AATCCCGTAT GTGGTCGCTA GCCTTC-GCT TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGCCGCCA GCCTCC-GCC TCCTTGGAAC AGGACATCGC AGAGGGTGAG AATCCCGTAC GTGGGCGCCT GCCTTT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCCTTT-ACC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTG GCCTTC-GCC TCCTTGGAAC AGGACATCAC AGAGGGTGAG AATCCCGTAT GTGGTCGCTG ATCTTT-GCC TCCTTGGAAC AGGACATCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCCT GCCTTT-GCC TTCTTGGAAC AGAATGTCAA AGAGGGTGAG AGTCCCGTCT TGGACCGCGG TAGGGC-CT- TCCTTGGAAC AGGACGTCAT AGAGGGTGAG AATCCCGTAT GTGACCGGCT -CTGGC-ACC TCCTTGGAAC AGGACGTCAT AGAGGGTGAG AATCCCGTAT GTGACCGGCT -CTGGC-ACC TCCTTGGAAC AGGACGTCAC A-AGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC A-AGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC A-AGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTA GCTATT-GCC TCCCTGGAAC AGGACATCGC AGAGGGTGAG AATCCCGTAC GTGGGCGCCT GCCTTC-GCC TCCTTGGAAC AGGACGTCAC AGAGGGTGAG AATCCCGTAC GTGGTCGCTG GCCTTC-GCC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGCTGCTT GTCTTC-ACC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGCTGCTT GTCTTC-ACC TCCTTGGAAC AGGTCATCAT AGAGGGTGAG AATCCCGTAT GTGGCTGCTT GTCTTC-GCC --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --GCTGTGAA ACTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATTGG-TGG --GCTGTGAA ACTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATTGG-TGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG TTA-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --A-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG C--C-GTAAA ACTCCTTCGA CGAGTCGGGT TGTTTGGGAA TGCAGCCCTA AATGGG-AGG --A-TACATG GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG ---CTGTAAA GCCCCTTCAA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCAA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA ACTCCTTCGA CGAGTCGACT TGTTTGGGAA TGCAGGTCAA AATGGG-TGG TTA-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG TTA-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGGGAGG C-G-TGTAAA GCCCCTTCGA CGAGTCGAGT -GTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCTCCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA ATTGGG-AGG --G-TGTAAA GCCTCTTCGA CGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG --G-TGTAAA GCCCCTTCGA TGAGTCGAGT TGTTTGGGAA TGCAGCTCTA AATGGG-AGG TAAATTCCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTCCAT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTCCAT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTTGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCGA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTCCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTTGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCAT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCGA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCGA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAA-GCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACCGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATACTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG TAAATTTCTT CTAAAGCTAA ATATTGGCCA GAGACCGATA GCGCACAAGT AGAGTGATCG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGA AAAGAGAGTT AAAA-GTACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGA AAAGAGAGTT AAAAAGTACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AAAACTTTGG AAAGAGAGTT AAACAGCATG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGA AAAGAGAGTT AAACAGTATG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTT AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAACAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAATAGCACG TGAAATTGTT AAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGCACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG AAAGATGAAA AGTACTTTGG AAAGAGAGTC AAAAAGCACG TGAAATTGTT GAAAGGGAAG CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CACCTCGGC- -TTCTG--CC TTGGGTACTC CGCTTGCGGC CAGACTTGCC TGCGGTTGCT CATCCCGCC- -TTTTG--GC GGGTGCACTC CGCTTGCGGC CAGACTTGCC CGCGGTTGCT CAGCCCGCC- -TTTTG--GC GGGTGCACTC CGCTTGCAGC TAGACGTGCC TTGGGTTGAT CAGCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAAT CAGACTTGGA CTTGGCTGTT CAACAGGTC- -TTCTG--AC CTGCCTATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT TATCCGGAC- -TTTTG--TC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CACCCGGGC- -CTCTGTGCC CGGTGCATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CACCCGGGC- -CTCTGTGCC CGGTGCATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGAC- -TTTTG--TC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCCGC CAGACTTGCT TGCAGTTGCT CACCCGGGCC CTTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC CGTAGTTGCT CATCCGGGC- -TCTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGC- -TCTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC CGCAGTTGCT CATCCGGGG- -TTCT-C-CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TTCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT TATCTGGAC- -TTTTG--TC CAGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT TATCCGGAC- -TTTTG--TC CGGTGCACTC CGCTTGCGAT CAGTCTCGAC GGCGGCCGTT CGGCCTCTC- -TTCTG--AG TGGTTTATTC CGCTTGCAAC CAGACTTGTT GGCGGTGTTC C-GCCGGTC- -TTCTG--AC CGGTCTACTC CGCTTGCCGC CAGACTTGCC TGCAGTTGCT CATCTGGGCA -TTGTG--CC CTGTGCATTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTTTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTTTA--CC CGGTGCACTC CGCTTGCAGC TAGACGTGCC TTGGGTTGAT CAGCCGGAC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC CGCAGTTGCT CACCTAGGC- -TTTCG--CC TGGGGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCCGGGT- -TTCTA--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCC TGTAGTTGCT CATCTGGGC- -TTTTG--TC CAGTGCACTC CGCTTGCCGC CAGACTTGCC TGCAGTTGCT CACCTAGGCG -TTCAG--CC TGGGGCACTC CGCTTGCAGC CAGACTTGCC CGCAGTTGCT CACCCAGGC- --TTTG-GCC CGGGGCACTC CGCTGGCAAC CAGACTCGTG CGCGGG-GTT CCCCCTTGC- -TTCTG--CT TGGGTCACTT CGCTTGCAAT CAGACTTGGA CTTGGCTGTT CAACAGGTC- -TTCTG--AC CTGCCTATTC CGCTTGCAAT CAGACTTGGA CTTGGCTGTT CAACAGGTC- -TTCTG--AC CTGCCTATTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTTCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTT---CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACTTGCT TGCAGTTGCT CATCCGGGC- -TTTTG--CC CGGTGCACTC CGCTTGCAGC CAGACGTGCC CGCAGTTGCT CACCCAGGC- --TCCGG-CC TGGGGCACTC CGCTTGCAGC CAGACTTGCC CGTAGTTGCT CATCCAGGC- -TTTTG---C CTGTGCACTC CGCTTGCAGC CAGACGTGCC CGTAGTTGCT CATCTGGGG- -TTTTC--CC CAGTGTATTC CGCTTGCAGC CAGACGTGCC CGTAGTTGCT CATTCGGGG- -TTCTC--CC CGATGTACTC CGCTTGCAGC CAGACGTGCC CGCAGTTGCT CATCCGGGG- -ATTTC--CC CGGTGCACTC TTCTACGGGC AGGCCAGCAT CAGTCCGGGC GGTTGGATAA ATGCCTGCTA AATGTACCTC TTCCGCAGTC AGGCCAGCAT CGGTTTGGGC GGTCGGATAA AGGCGCTGGG AACGTGGCCT TTCCGCGGTC AGGCCAGCAT CGGTTCGGGC GGTCGGATAA AGGCGACGGG AACGTGGCCT TTCCTTTGGC AGGCCAGCAT CAGTTTGGGC GGCTGGATAA AGGTCTGTTA AACGTGACTC AGTCTTGTCC AGGCCAGCAT CAGTTTCGGC GGCCGGATAA AGGCCCTAGG AATGTGGCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CATGTACCTC TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTATGGGC AGGCCAGCAT CAGTCTTGGC GGTCGGATAA ATGCGTGCTA AACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTGTGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CATGTAGCTG TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGCTTTTGG AATGTGGCTC TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTGCGGGC AGGCCAGCAT CAGTTTAGGC GGTTGGATAA AGGTCTCTAT CACGTACCTC GGTCGCCGCC GGGCCAGCAT CAGTTTCGGC GGTTGGATAA AGGTTGTGGG AATGTGGCCC ACC-GTCTGC AGGCCAGCAT CATCTGGGAC CGCTGGATAA AAGCGGAGGG AATGTGGCTC TTCTGCAAGC AGGCCAGCAT CAGTTTAGAC AGTCAGATAA GGGTCTCTGT CATGTATCTT TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCCTTTGGC AGGCCAGCAT CAGTTTGGGC GGCTGGATAA AGGTCTGTTA AACGTGACTT TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGCCTCTGT CACGTATCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CGGGGTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTATAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CATGTACCTC TTCTACAGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC AGCCGGATAA AGGTCTCTGA CACGTTCCTA TTCTGCGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGCCTCTGT CACGTATCTC CCCCGTGTCC GGGCCATCAT CAGTTTCGGG GGCCGGTTAA AGGCCTTGGG AATGTATCCA AGTCTTGTCC AGGCCAGCAT CAGTTTGGGC GGCCGGATAA AGGCTTTGGG AATGTGGCTT AGTCTTGTCC AGGCCAGCAT CAGTTTCGGC GGCCGGATAA AGGCCCTAGG AATGTGGCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGGTAA AGGTCTCTGT CACGT-CCTC CTCTGCAGGC AG-CCAGCAT CAGTTTGG-C GGTGGGATAA AGGTCTTTGA CACGTTCCTT TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGT CACGTACCAT TTCTGTAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCT-TGT CACGTACCTC TTCTGCAGGC AGGCCAGCAT CAGTTTGGGC GGTGGGATAA AGGTCTCTGA CACGTTCCTT TTCTGCGGGC AGGCCAGCAT CGGTTCGGGC GGTCGGATAA AGGTCTCTGT CACGTACCTC TTCTATGGGC AGGCCAGCAT CAGTTTGGGC GGTTGGATAA AGGTCTCTGT CA???????? TTCTATGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CACGTAGCTC TTCTATGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CACGTAGCTC TTCTGTGGGC AGGCCAGCAT CAGTTCGGGC GGTTGGAGAA AGACCTGTGT CACGTAGCTC TC--CTCGGG G----A--GG A-CTTATAGG GTAGGC-GGC ATACAACCAG CCTGGACTGA CCC-CTCGGG G--AG---GT G--TTATAGC CCGGCGCGCA ATGCGACCAG CCCGGACCGA CCC-CTCGGG G--AG---GT G--TTATAGC CCGGCGCGCA ATGCGGCCAG CCCGGACCGA CC--TTCGGG G----A--GA G-CTTATAGG GCAGAC-GAC ATGCAGCCAG TCCGAACTGA TCCCTTCGGG GG-A-A--GT G--TTATAGC CTAGGGTGTA ATACGGCCAG CTGGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGACGGAC ATGCAACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG A-CTTATAGG GCACGC-GGC ATACGACCAG CCGGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGC-GAC ATACAACCAG CCTAGACTGA TT--CTCGGG C----A--GT G--TTATAGG GCAGGTTGGA ATGCAACCAG CTCGAACTGA TC--TTCGGG G----A--GG -CCTT-TAGG GGAAGGTGTA ATACCACCAG CTGGGACTGA CT--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CC--TTCGGG GTT-----GG -CCTTATAGG GGAGAC-GAC ATGCAACCAG CCTGAACTGA C---CTCGGG GG-------T G--TTATAGC CCACTTCGTA ATACAACCAG CTGGGACTGA C---TCCGGG ---A----GT G--TTATAGC CCTCTGTGTA ATACAGCGAG TCCCGGGTGA TC--TTCGGA A------TGA -CCTTATAGG GGGGGC-GTA GTATGGCTAG TCTAGACTGA TC--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA TC--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA CC--TTCGGG G----A--GA G-CTTATAGG GTAGAC-GAC ATGCAGCCAG CCTGAACTGA CC--TTCGGG GT------GA -CCTTATAGG GGAGGC-GCA ATGCAACCAG CCCGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCCGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CT--TTCGGG G----A--GA A-CTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATGCAACCAG CCTGGACTGA CC--TTTGTG -T---A--GG -CCATATAGG GGAGAC-GTC ATGCGGTTAG CCTGGACTGA CC--TTCGGG GT------GA -CCTTATAGG GGAGGC-GCA ATGCAACCAG CCCGGACTGA CGCCTTCGGG GG-----TG- GACTTATAGC CCAGGGTGTC ATGCGGCCAC CCGGGACTGA TCT-TCCGGG GG-A-A--GT ---TTATAGG --AAGGTGTA ATACGGCCAG CTGGGACTGA TCCCTTCGGG GG-A-A--GT G--TTATAGC CTAGGGTGTA ATACGGCCAG CTGGGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG A-CTTATAGG GGAGGC-GAC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGGCC-AC ATACCACCAG CCTGGACTGA CC--TTCGGG -TT-----G- -CCATATAGG G-AGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA CC--TTCGGG -----AT-GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA TC--TTCGGG G----A--GG -CCTTATAGG GGAGAC-GAC ATACCACCAG CCTAGACTGA CC--TTCGGG -TT-----GG -CCATATAGG GGAGAC-GTC ATACCACCAG CCTGGACTGA CC--TTCGGG GT------GG -CCTTATAGG GGAGAC-GCA ATGCGACCAG CCCGGACCGA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? CT--TTCGGG G----A--GT G--TTATAGG GCAGGT-GGA ATGCAACCAG CCTGAACTGA TC--TTCGGG G----A--GT G--TTATAGG GCAGGT-GGA ATGCAACCAG CCTGAACTGA TC--TTCGGG G----A--GT G--TTATAGG GCAGGT-GGA ATGCAACCAG CCTGAACTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTTCGCGC- TTT----GCT AGGATGCTGG CGTAATGGCC GT-AAGC-GG CCCGTCTTGA GGTTCGCGC- TCT----GCT AGGATGCTGG CGTAATGGCC GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATAGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA T-T----GCT AGGATGCTGG CGTAAGGGCT GT--AGC-GG -CCGTCTTGA GGTCCGCGCA TTT--ATGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTT--ATGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTTTT-TGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TTC--GTGCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCC-CGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TCT----GCT AGGATGCTGG CGTAATGGCT GTCAAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CAAAATGGTC GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTC GT-AAGC-GG CCCGTCTTGA GGTCCGCGCT TTT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CATAATAGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AA-CGGG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TT-----GCT AGGATGCTGG CGTAATGGCT G-CAAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGAACGCGCT TC---G-GCG AGGATGATGG CGTAATGGTT GTC-AGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTT GTCAAGC-GG CCCGTCTTGA GGTCCGCGCT TC---G-GCT AGGATGCTGG CGTAATGGTT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGAGCA TCT----GCT AGGA-GCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTG- CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GG-CCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCC AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA GGTCCGCGCA TCT----GCT AGGATGCTGG CGTAATGGCT GT-AAGC-GG CCCGTCTTGA AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTAAAG CCCGGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAA CCCGTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAA CCCGTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGGGAC CAAGGAGTC- TAACATCTAT GCGAGTGTTA GGGTGTCAAA CCCTTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC C-----GT-- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCAGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCAGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCAGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAC GCGAGTGTTC GGGTGTCAAA CCCGTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTC GGGTGTCAAA CCCCTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGGCGCA AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGGGAC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTC GGGTGTCAAA CCCTTGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTA GGGTGTCAAA CCCTTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTA GGGTGTCAAA CCCTTACGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTAAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGGGCGCG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG AACACGG-AC CAAGGAGTC- TAACATCTAT GCGAGTGTTT GGGTGTCAAG CCCGAGCGCG CAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCGC -----AAGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACC-G CA---A-GGT GCACCATC-G ACCGATCCTG TAATGAAAGT AAACGGAGG- TGGGAACCCT TT----GGGT GCACCACC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGAGAACCCG CA---AGGGT GCATCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCT TT----GGGT GCACCATCCG ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCCTG CAATGAAAGT GAACGGAGG- TGGGATCCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCCTG TAATAAAAGT GAACGGAGG- TGGGAACCTT TTT----GGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT AAACGTAGG- TGGGAACCTT TT---A-GGT GCACCATC-G ACCGATCTTG CAATGAAAGT GAACGGAGG- TGGGAACC-G CA---A-GGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGGG TGGGAACCTT TC---G???? ?????????? ?????????? TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCTT TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGACCCCT TTT--AGGGT GCACCATC-G ACCGATCCTG CAATAAACGT GAACGGAGG- TGGGAACCCT CTTTGGGGGT GCACCATC-G ACCGATCCTG CAATGAAAGT GAACGGAGG- TGGGAACCCT TTT---GGGT GCACCATC-G ACCGATCCTG GAATGAAAGT GAACGGAGG- TAGGAAGGCT TA---AGCCT GCACTATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGAGAACCCG CA---AAGGT GCATCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGAGAACCCG CA---AGGGT GCATCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCG CA---AGGGT GCACCATC-G ACCGATCCTG CAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGC GCACCATC-G ACCGATCCTG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGC GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG TAATGAAAGT GAACGGAGG- TGGGAACCCC TC---GGGGT GCACCATC-G ACCGATCCTG AAGTTTACGG ATGGATTTGA GTATGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTTTTCGG ATGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCGT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA AAGTTTACGG AAGGATTTGA GTAAGAGCAT GGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA ATGTCTTCGG ATGGATTTGA GTAAGAGCAT AGCTGTTGGG ACCCGAAAGA TGGTGAACTA TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCGTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCGTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA -GGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTCCGCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGGATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCGTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCA?? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAGGC CAGAGGAAAC TCTGGTGGAG GCT??????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCT??????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG?? ?????????? ?????????? ?????????? ?????????? TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCTTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCCTGAATA GGGTGAAG-C CAGAGGAAAC TCTGGTGGAG GCTC-GCAGC GGTTCTGACG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGCGTATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAA?? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAA??? TGCAAATCGA TCGTCAAATT TGGGC????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGA? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGA? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAG?? ?????? TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAG?? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G????????? ?????? TGCAAATCGA TCGTCAAATT TGCGTATAGG GGCGAAAG?? ?????? TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGTATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG G-CGAAAGAC TAAT?? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG ?????????? ?????????? ?????????? ?????????? ?????? TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG TGCAAATCGA TCGTCAAATT TGGGCATAGG GGCGAAAGAC TAATCG phyml-3.3.20220408/examples/phyrex/000077500000000000000000000000001422404706600165525ustar00rootroot00000000000000phyml-3.3.20220408/examples/phyrex/flu.xml000066400000000000000000000216331422404706600200670ustar00rootroot00000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 phyml-3.3.20220408/examples/phyrex/h1n1.nxs000077500000000000000000002112461422404706600200640ustar00rootroot00000000000000#NEXUS BEGIN DATA; DIMENSIONS NTAX=36 NCHAR=1434; FORMAT DATATYPE=DNA INTERLEAVE; MATRIX CY130177|South_Carolina|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647978|Idaho|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648268|New_Mexico|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648064|North_Carolina|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647995|New_Hampshire|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648000|Colorado|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648133|Florida|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648145|Georgia|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648155|Vermont|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAACCT KF648158|Utah|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648159|Louisiana|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648008|Rhode_Island|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648011|New_York|12_13|H1N1 ---------ATGAATCCAAA CCGAAAGATAATAACCATTG GTTCGGTCTGCATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647921|Maryland|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647926|Missouri|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647928|Texas|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647936|Wyoming|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCCAACTTAATATT ACAAATTGGAAACATAATCT KF648197|Indiana|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAATATAACCT KF648228|Mississippi|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648239|Tennessee|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648034|Arizona|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648037|Kentucky|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648038|Kansas|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647919|Alabama|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647931|Wisconsin|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647932|Pennsylvania|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647958|Nebraska|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647971|Oklahoma|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF647902|Iowa|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648002|Minnesota|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648040|New_Jersey|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648101|Ohio|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT KF648260|Washington|12_13|H1N1 ---------ATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY170697|California|12_13|H1N1 GAGTTTAAAATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY168881|Massachusetts|12_13|H1N1 GAGTTTAAAATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGGTCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY171161|Illinois|12_13|H1N1 GAGTTTAAAATGAATCCAAA CCAAAAGATAATAACCATTG GTTCGATCTGTATGACAATT GGAATGGCTAACTTAATATT ACAAATTGGAAACATAATCT CY130177|South_Carolina|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTAGGAATCAAAA TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647978|Idaho|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648268|New_Mexico|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648064|North_Carolina|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647995|New_Hampshire|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648000|Colorado|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGAAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTACGAA AACAACACTTGGGTAAATCA KF648133|Florida|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648145|Georgia|12_13|H1N1 CAATATGGGTTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648155|Vermont|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648158|Utah|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648159|Louisiana|12_13|H1N1 CAATATGGGTTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648008|Rhode_Island|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648011|New_York|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647921|Maryland|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647926|Missouri|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647928|Texas|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAA TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647936|Wyoming|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTATGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648197|Indiana|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648228|Mississippi|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648239|Tennessee|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648034|Arizona|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648037|Kentucky|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648038|Kansas|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647919|Alabama|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647931|Wisconsin|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647932|Pennsylvania|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647958|Nebraska|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAGCATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647971|Oklahoma|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF647902|Iowa|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648002|Minnesota|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648040|New_Jersey|12_13|H1N1 CAATATGGGTTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAACGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648101|Ohio|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA KF648260|Washington|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY170697|California|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY168881|Massachusetts|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAAGTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY171161|Illinois|12_13|H1N1 CAATATGGATTAGCCACTCA ATTCAACTTGGGAATCAAAG TCAGATTGAAACATGCAATC AAAGCGTCATTACTTATGAA AACAACACTTGGGTAAATCA CY130177|South_Carolina|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647978|Idaho|12_13|H1N1 GACATATGTTAACATCAGCA ATACCAACTTTGCTGTTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648268|New_Mexico|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648064|North_Carolina|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647995|New_Hampshire|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648000|Colorado|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648133|Florida|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648145|Georgia|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648155|Vermont|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648158|Utah|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648159|Louisiana|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648008|Rhode_Island|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648011|New_York|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647921|Maryland|12_13|H1N1 GACATATGTTAACATCAGTA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647926|Missouri|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAATTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647928|Texas|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647936|Wyoming|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648197|Indiana|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648228|Mississippi|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648239|Tennessee|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648034|Arizona|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648037|Kentucky|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648038|Kansas|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647919|Alabama|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647931|Wisconsin|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647932|Pennsylvania|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647958|Nebraska|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647971|Oklahoma|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGCCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF647902|Iowa|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648002|Minnesota|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648040|New_Jersey|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGTGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648101|Ohio|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGCCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG KF648260|Washington|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGA CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG CY170697|California|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGCCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG CY168881|Massachusetts|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCTGCTGGG CAGTCAGTGGTTTCCGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGATGG CY171161|Illinois|12_13|H1N1 GACATATGTTAACATCAGCA ACACCAACTTTGCAGCTGGA CAGTCAGTGGTTTCTGTGAA ATTAGCGGGCAATTCCTCTC TCTGCCCTGTTAGTGGGTGG CY130177|South_Carolina|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647978|Idaho|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648268|New_Mexico|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648064|North_Carolina|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647995|New_Hampshire|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648000|Colorado|12_13|H1N1 GCTATATACAGCAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648133|Florida|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648145|Georgia|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648155|Vermont|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648158|Utah|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648159|Louisiana|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648008|Rhode_Island|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648011|New_York|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647921|Maryland|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647926|Missouri|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647928|Texas|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647936|Wyoming|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648197|Indiana|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648228|Mississippi|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648239|Tennessee|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648034|Arizona|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648037|Kentucky|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648038|Kansas|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647919|Alabama|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647931|Wisconsin|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647932|Pennsylvania|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647958|Nebraska|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647971|Oklahoma|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF647902|Iowa|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648002|Minnesota|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648040|New_Jersey|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648101|Ohio|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA KF648260|Washington|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY170697|California|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY168881|Massachusetts|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTGTAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY171161|Illinois|12_13|H1N1 GCTATATACAGTAAAGACAA CAGTATAAGAATCGGTTCCA AGGGGGATGTGTTTGTCATA AGGGAACCATTCATATCATG CTCCCCCTTGGAATGCAGAA CY130177|South_Carolina|12_13|H1N1 CCTTCTTCTTGACCCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647978|Idaho|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648268|New_Mexico|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648064|North_Carolina|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647995|New_Hampshire|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCATTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648000|Colorado|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648133|Florida|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648145|Georgia|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648155|Vermont|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648158|Utah|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648159|Louisiana|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648008|Rhode_Island|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648011|New_York|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAGG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647921|Maryland|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647926|Missouri|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647928|Texas|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC TTAATGAGCTGTCCTATTGG KF647936|Wyoming|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648197|Indiana|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648228|Mississippi|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648239|Tennessee|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648034|Arizona|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648037|Kentucky|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648038|Kansas|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCTTATTGG KF647919|Alabama|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647931|Wisconsin|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647932|Pennsylvania|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647958|Nebraska|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647971|Oklahoma|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF647902|Iowa|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648002|Minnesota|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648040|New_Jersey|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648101|Ohio|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG KF648260|Washington|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY170697|California|12_13|H1N1 CCTTTTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY168881|Massachusetts|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY171161|Illinois|12_13|H1N1 CCTTCTTCTTGACTCAAGGG GCCTTGCTAAATGACAAACA TTCCAATGGAACCATTAAAG ACAGGAGCCCATATCGAACC CTAATGAGCTGTCCTATTGG CY130177|South_Carolina|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647978|Idaho|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648268|New_Mexico|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648064|North_Carolina|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647995|New_Hampshire|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648000|Colorado|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATTAATTGGC TAACAATTGGAATTTCTGGC KF648133|Florida|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648145|Georgia|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648155|Vermont|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648158|Utah|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648159|Louisiana|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648008|Rhode_Island|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648011|New_York|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647921|Maryland|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647926|Missouri|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647928|Texas|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647936|Wyoming|12_13|H1N1 TGAAGTTCCCTCCCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648197|Indiana|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648228|Mississippi|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648239|Tennessee|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648034|Arizona|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648037|Kentucky|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648038|Kansas|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647919|Alabama|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647931|Wisconsin|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647932|Pennsylvania|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647958|Nebraska|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647971|Oklahoma|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF647902|Iowa|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648002|Minnesota|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648040|New_Jersey|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648101|Ohio|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC KF648260|Washington|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCGGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY170697|California|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY168881|Massachusetts|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY171161|Illinois|12_13|H1N1 TGAAGTTCCCTCTCCATACA ACTCAAGATTTGAGTCAGTC GCTTGGTCAGCAAGTGCTTG TCATGATGGCATCAATTGGC TAACAATTGGAATTTCTGGC CY130177|South_Carolina|12_13|H1N1 CCAGACAATGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAATAATATATT GAGAACACAAGAATCTGAAT KF647978|Idaho|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT KF648268|New_Mexico|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATAGT GAGAACACAAGAGTCTGAAT KF648064|North_Carolina|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647995|New_Hampshire|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648000|Colorado|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAATCTGAAT KF648133|Florida|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648145|Georgia|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGRAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648155|Vermont|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648158|Utah|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648159|Louisiana|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648008|Rhode_Island|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648011|New_York|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647921|Maryland|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647926|Missouri|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647928|Texas|12_13|H1N1 CCAGACAATGGGGCAGTTGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647936|Wyoming|12_13|H1N1 CCAGACAATGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAATAATATATT GAGAACACAAGAATCTGAAT KF648197|Indiana|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648228|Mississippi|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648239|Tennessee|12_13|H1N1 CCAGACAGTGGGGCAGTTGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648034|Arizona|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648037|Kentucky|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF648038|Kansas|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF647919|Alabama|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647931|Wisconsin|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF647932|Pennsylvania|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF647958|Nebraska|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAAAAATAATATATT GAGAACACAAGAGTCTGAAT KF647971|Oklahoma|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT KF647902|Iowa|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648002|Minnesota|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648040|New_Jersey|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT KF648101|Ohio|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT KF648260|Washington|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTATTAAAGTACAATGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT CY170697|California|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACGATATATT GAGAACACAAGAGTCTGAAT CY168881|Massachusetts|12_13|H1N1 CCAGACAGTGGGGCAGTGGC TGTGTTAAAGTACAACGGCA TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT CY171161|Illinois|12_13|H1N1 CCAGACAATGGGGCAGTGGC TGTGTTAAAGTACAACGGCG TAATAACAGACACTATCAAG AGTTGGAGAAACAATATATT GAGAACACAAGAGTCTGAAT CY130177|South_Carolina|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647978|Idaho|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648268|New_Mexico|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648064|North_Carolina|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647995|New_Hampshire|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648000|Colorado|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648133|Florida|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648145|Georgia|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648155|Vermont|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648158|Utah|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648159|Louisiana|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648008|Rhode_Island|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648011|New_York|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647921|Maryland|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647926|Missouri|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647928|Texas|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAAA ATAGAAAAGGGAAAGATAGT KF647936|Wyoming|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648197|Indiana|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648228|Mississippi|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648239|Tennessee|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648034|Arizona|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648037|Kentucky|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF648038|Kansas|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF647919|Alabama|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647931|Wisconsin|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647932|Pennsylvania|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF647958|Nebraska|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGACGGACAGG CCTCATACAAGATCTTCCGA ATAGAAAAGGGAAAGATAGT KF647971|Oklahoma|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF647902|Iowa|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648002|Minnesota|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648040|New_Jersey|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648101|Ohio|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT KF648260|Washington|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY170697|California|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACTGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY168881|Massachusetts|12_13|H1N1 GTGCATGTGTAAATGGTTCT TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY171161|Illinois|12_13|H1N1 GTGCATGTGTAAATGGTTCA TGCTTTACCATAATGACCGA TGGACCAAGTGATGGACAGG CCTCATACAAGATCTTCAGA ATAGAAAAGGGAAAGATAGT CY130177|South_Carolina|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647978|Idaho|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648268|New_Mexico|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTACCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648064|North_Carolina|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647995|New_Hampshire|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648000|Colorado|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648133|Florida|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648145|Georgia|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648155|Vermont|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCATATGTG TGTGCAGGGATAACTGGCAT KF648158|Utah|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648159|Louisiana|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648008|Rhode_Island|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAATTGGCAT KF648011|New_York|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCAAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647921|Maryland|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647926|Missouri|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647928|Texas|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647936|Wyoming|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648197|Indiana|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648228|Mississippi|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648239|Tennessee|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648034|Arizona|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648037|Kentucky|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648038|Kansas|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647919|Alabama|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647931|Wisconsin|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647932|Pennsylvania|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647958|Nebraska|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647971|Oklahoma|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF647902|Iowa|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648002|Minnesota|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648040|New_Jersey|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648101|Ohio|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT KF648260|Washington|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT CY170697|California|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT CY168881|Massachusetts|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAATTGGCAT CY171161|Illinois|12_13|H1N1 CAAATCAGTCGAAATGAATG CCCCTAATTATCACTATGAG GAATGCTCCTGTTATCCTGA TTCTAGTGAAATCACATGTG TGTGCAGGGATAACTGGCAT CY130177|South_Carolina|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCCAATGATA KF647978|Idaho|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648268|New_Mexico|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648064|North_Carolina|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647995|New_Hampshire|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648000|Colorado|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648133|Florida|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648145|Georgia|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648155|Vermont|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648158|Utah|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648159|Louisiana|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648008|Rhode_Island|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648011|New_York|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGAAAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647921|Maryland|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647926|Missouri|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647928|Texas|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647936|Wyoming|12_13|H1N1 GGCTCGAATCGACCGTGGGT TTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGTCCTAATGATA KF648197|Indiana|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648228|Mississippi|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648239|Tennessee|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATAAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648034|Arizona|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648037|Kentucky|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648038|Kansas|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF647919|Alabama|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647931|Wisconsin|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647932|Pennsylvania|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF647958|Nebraska|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF647971|Oklahoma|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF647902|Iowa|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAATCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648002|Minnesota|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATR TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648040|New_Jersey|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGGTTTTCGGAGA CAATCCACGCCCTAATGATA KF648101|Ohio|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA KF648260|Washington|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY170697|California|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY168881|Massachusetts|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY171161|Illinois|12_13|H1N1 GGCTCGAATCGACCGTGGGT GTCTTTCAACCAGAATCTGG AATATCAGATAGGATACATA TGCAGTGGGATTTTCGGAGA CAATCCACGCCCTAATGATA CY130177|South_Carolina|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647978|Idaho|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648268|New_Mexico|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648064|North_Carolina|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647995|New_Hampshire|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648000|Colorado|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648133|Florida|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648145|Georgia|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648155|Vermont|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648158|Utah|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648159|Louisiana|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648008|Rhode_Island|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648011|New_York|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647921|Maryland|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647926|Missouri|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647928|Texas|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTGTCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647936|Wyoming|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648197|Indiana|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648228|Mississippi|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648239|Tennessee|12_13|H1N1 AGACAGGTAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648034|Arizona|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTCTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648037|Kentucky|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648038|Kansas|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647919|Alabama|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTCTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647931|Wisconsin|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647932|Pennsylvania|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647958|Nebraska|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647971|Oklahoma|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF647902|Iowa|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648002|Minnesota|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648040|New_Jersey|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648101|Ohio|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG KF648260|Washington|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY170697|California|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY168881|Massachusetts|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY171161|Illinois|12_13|H1N1 AGACAGGCAGTTGTGGTCCA GTATCGTCTAATGGAGCAAA TGGAGTAAAAGGATTTTCAT TCAAATACGGCAATGGTGTT TGGATAGGGAGAACTAAAAG CY130177|South_Carolina|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647978|Idaho|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648268|New_Mexico|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648064|North_Carolina|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647995|New_Hampshire|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648000|Colorado|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648133|Florida|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648145|Georgia|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648155|Vermont|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648158|Utah|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648159|Louisiana|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCG AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648008|Rhode_Island|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648011|New_York|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647921|Maryland|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647926|Missouri|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647928|Texas|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAGCTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647936|Wyoming|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648197|Indiana|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648228|Mississippi|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATGAAT KF648239|Tennessee|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648034|Arizona|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648037|Kentucky|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648038|Kansas|12_13|H1N1 CATTGGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647919|Alabama|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647931|Wisconsin|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647932|Pennsylvania|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647958|Nebraska|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647971|Oklahoma|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF647902|Iowa|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648002|Minnesota|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648040|New_Jersey|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCG AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648101|Ohio|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT KF648260|Washington|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT CY170697|California|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT CY168881|Massachusetts|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AATGGATGGACTGGGACAGA CAATAACTTCTCAATAAAGC AAGATATCGTAGGAATAAAT CY171161|Illinois|12_13|H1N1 CATTAGTTCAAGAAAAGGTT TTGAGATGATTTGGGATCCA AACGGATGGACTGGGACAGA CAATAACTTCTCAACAAAGC AAGATATCGTAGGAATAAAT CY130177|South_Carolina|12_13|H1N1 GAGTGGTCAGGATACAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGACGAC KF647978|Idaho|12_13|H1N1 GAGTGGACAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAATTAATCAGAGGGCGAC KF648268|New_Mexico|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648064|North_Carolina|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647995|New_Hampshire|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648000|Colorado|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648133|Florida|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648145|Georgia|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648155|Vermont|12_13|H1N1 GAATGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648158|Utah|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648159|Louisiana|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648008|Rhode_Island|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648011|New_York|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647921|Maryland|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647926|Missouri|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647928|Texas|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGACTGT ATAAGACCTTGTTTCTGGGT TGAACTAATCAGAGGGCGAC KF647936|Wyoming|12_13|H1N1 GAGTGGTCAGGATACAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGACGAC KF648197|Indiana|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648228|Mississippi|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648239|Tennessee|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648034|Arizona|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648037|Kentucky|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648038|Kansas|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647919|Alabama|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647931|Wisconsin|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAATTAATCAGAGGGCGAC KF647932|Pennsylvania|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647958|Nebraska|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647971|Oklahoma|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF647902|Iowa|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648002|Minnesota|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648040|New_Jersey|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648101|Ohio|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC KF648260|Washington|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC CY170697|California|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC CY168881|Massachusetts|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGCGAC CY171161|Illinois|12_13|H1N1 GAGTGGTCAGGATATAGCGG GAGTTTTGTTCAGCATCCAG AACTAACAGGGCTGGATTGT ATAAGACCTTGCTTCTGGGT TGAACTAATCAGAGGGAGAC CY130177|South_Carolina|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647978|Idaho|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648268|New_Mexico|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648064|North_Carolina|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647995|New_Hampshire|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648000|Colorado|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648133|Florida|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648145|Georgia|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648155|Vermont|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648158|Utah|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648159|Louisiana|12_13|H1N1 CCGAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648008|Rhode_Island|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648011|New_York|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647921|Maryland|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647926|Missouri|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647928|Texas|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG GCACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647936|Wyoming|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC TTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648197|Indiana|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648228|Mississippi|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648239|Tennessee|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648034|Arizona|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648037|Kentucky|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648038|Kansas|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647919|Alabama|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647931|Wisconsin|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647932|Pennsylvania|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647958|Nebraska|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCCTGG CCAGACGGTGCTGAGTTGCC KF647971|Oklahoma|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF647902|Iowa|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648002|Minnesota|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648040|New_Jersey|12_13|H1N1 CCGAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTTGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648101|Ohio|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC KF648260|Washington|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY170697|California|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY168881|Massachusetts|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGTGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY171161|Illinois|12_13|H1N1 CCAAAGAGAACACAATCTGG ACTAGCGGGAGCAGCATATC CTTTTGTGGTGTAAACAGTG ACACTGTGGGTTGGTCTTGG CCAGACGGTGCTGAGTTGCC CY130177|South_Carolina|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647978|Idaho|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648268|New_Mexico|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648064|North_Carolina|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647995|New_Hampshire|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648000|Colorado|12_13|H1N1 ATTTGCCATTGACAAGTAA- -------------- KF648133|Florida|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648145|Georgia|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648155|Vermont|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648158|Utah|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648159|Louisiana|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648008|Rhode_Island|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648011|New_York|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647921|Maryland|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647926|Missouri|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647928|Texas|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647936|Wyoming|12_13|H1N1 ATTTATCATTGACAAGTAA- -------------- KF648197|Indiana|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648228|Mississippi|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648239|Tennessee|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648034|Arizona|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648037|Kentucky|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648038|Kansas|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647919|Alabama|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647931|Wisconsin|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647932|Pennsylvania|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647958|Nebraska|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647971|Oklahoma|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF647902|Iowa|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648002|Minnesota|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648040|New_Jersey|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648101|Ohio|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- KF648260|Washington|12_13|H1N1 ATTTACCATTGACAAGTAA- -------------- CY170697|California|12_13|H1N1 ATTTACCATTGACAAGTAAT TTGTTCA------- CY168881|Massachusetts|12_13|H1N1 ATTTACCATTGACAAGTAAT TTGTTCAAAAAACT CY171161|Illinois|12_13|H1N1 ATTTACCATTGACAATTAAT TTGTTCAAAAAACT ; END; phyml-3.3.20220408/examples/phyrex/usa_coord.txt000077500000000000000000000033701422404706600212770ustar00rootroot00000000000000# state.name lon lat |SouthWest| -122 25 |NorthEast| -66 49 |Alabama| -86.902298 32.3182314 |Alaska| -149.4936733 64.2008413 |Arizona| -111.0937311 34.0489281 |Arkansas| -91.8318334 35.20105 |California| -119.4179324 36.778261 |Colorado| -105.7820674 39.5500507 |Connecticut| -73.087749 41.6032207 |Delaware| -75.5276699 38.9108325 |Florida| -81.5157535 27.6648274 |Georgia| -82.9000751 32.1656221 |Hawaii| -155.5827818 19.8967662 |Idaho| -114.7420408 44.0682019 |Illinois| -89.3985283 40.6331249 |Indiana| -86.1349019 40.2671941 |Iowa| -93.097702 41.8780025 |Kansas| -98.4842465 39.011902 |Kentucky| -84.2700179 37.8393332 |Louisiana| -91.9623327 30.9842977 |Maine| -69.4454689 45.253783 |Maryland| -76.6412712 39.0457549 |Massachusetts| -71.3824374 42.4072107 |Michigan| -85.6023643 44.3148443 |Minnesota| -94.6858998 46.729553 |Mississippi| -89.3985283 32.3546679 |Missouri| -91.8318334 37.9642529 |Montana| -110.3625658 46.8796822 |Nebraska| -99.9018131 41.4925374 |Nevada| -116.419389 38.8026097 |New_Hampshire| -71.5723953 43.1938516 |New_Jersey| -74.4056612 40.0583238 |New_Mexico| -105.8700901 34.5199402 |New_York| -74.0059413 40.7127837 |North_Carolina| -79.0192997 35.7595731 |North_Dakota| -101.0020119 47.5514926 |Ohio| -82.907123 40.4172871 |Oklahoma| -97.5164276 35.4675602 |Oregon| -120.5542012 43.8041334 |Pennsylvania| -77.1945247 41.2033216 |Rhode_Island| -71.4774291 41.5800945 |South_Carolina| -81.1637245 33.836081 |South_Dakota| -99.9018131 43.9695148 |Tennessee| -86.5804473 35.5174913 |Texas| -99.9018131 31.9685988 |Utah| -111.0937311 39.3209801 |Vermont| -72.5778415 44.5588028 |Virginia| -78.6568942 37.4315734 |Washington| -77.0368707 38.9071923 |West_Virginia| -80.4549026 38.5976262 |Wisconsin| -88.7878678 43.7844397 |Wyoming| -107.2902839 43.0759678 phyml-3.3.20220408/examples/phytime/000077500000000000000000000000001422404706600167125ustar00rootroot00000000000000phyml-3.3.20220408/examples/phytime/dating_example.xml000066400000000000000000000043101422404706600224130ustar00rootroot00000000000000 40 60 50 200 phyml-3.3.20220408/examples/phytime/seq.txt000066400000000000000000003035131422404706600202500ustar00rootroot0000000000000022 4533 Nymphaeales_Cabomba tcaaagattaagccatgcatgtgtaagtatgaacaagttcagaccgtgaaactgcgaatggctcattaaatcagttataatttgtttgatggtact-tactactcggataaccgtagtaaagctagagctaatacgtgcaccaaaccccgac-ttctggaaggggcgcatttattagataaaaggccgatgcgggctt-tgcccgatttattggtgattcatgataactcgacggatcgcacggccctcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtagtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaatacataacaataccgggctc-tttgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttggtccggccggtccgcctcc--ggtgtgcaccggtcgtctcgtcccttctaccggcgtcgcgttcctggccttaactggccgggtcgtgccttcggtgctgttactttgaagaaattagagtgctcaaagcaagcttacgctgtgcatacattagcatgggataacatcacaggatttcggtcctattgtgttggcctttgggatcggagtaatgattaagagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttgctcttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtggaggt-acccttccacggccagcttcttagacggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-tatagccttggccgacaggtccgggtaatcttgg-aaactacatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgtgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgggggcggtccgccgcctacgacgtcgcgagaagttcattgaaccttatcattgagarg-----------------------------------------------------------------------------------------------------aattaatgtgacttgtgaggtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatgggctgaggagaggaatggaagtgattgacacaggagctgctctaagtgttccagtaggtggagccactctaggacgaattttcaatgttcttggagaacccgttgataatttaggtcctgtagatactcgcacaacatcccccattcatagatccgcacccgcttttatacagttagataccaaattatcaatctttgaaacggggataaaagtagtggaccttttagcgccttatcgacgtgggggaaaaatcggattatttgggggagccggagtgggtaaaacagtactcatcatggaattaatcaacaacattgccaaagctcatgggggtgtatccgtattcggcggagtaggagaacgcactcgtgagggaaatgatctttacatggaaatgaaagaatccggggtgattaatgaagaaaatattgcagaatctaaagtagctctagtatatggacagatgaatgaaccgccgggagctcgtatgagagtcggtttgactgccctaaccatggcggaatatttccgtgatgttaatgaacaagacgtccttctatttatcgacaatatctttcgcttcgtacaagcggggtcagaagtatctgccttattaggtagaatgccttccgccgtgggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttctacaaaagagggatccataacttccattcaagcagtttatgtacccgcggacgatttgactgatcctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagctgccaaaggtatctatccagcagtggatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaagaacattacgaaacagcgcaaagagttaagcaaactttacaacgttacaaagaacttcaggacattatagcgattcttggactggacgaattatctgaagaggatcgtttaaccgtagcaagagcgcgaaaaattgaacgttttctatcacaacccttcttcgtagcggaagtatttacaggttctccagggaaatatgttggtctcgcagaaacaattagggggtttcaactgatcctttccggagaatttgatagttttcctgagcaggccttttatttggtaggtaatatcgatgaagctacctctaaggctattaacttagaagtcgagagaagtgttggattcaaagctggtgttaaagattacagattgacttattacactcctgagtatgaaacccttgctactgatatcttggcagcattccgagtaactcctcaacctggagttccacctgaggaagcaggagctgcggtggctgccgaatcttccactggtacatggacaactgtgtggaccgatggacttaccagcctcgatcgttacaaaggacgatgctaccacatcgagccagttgctggggaggaaaatcaatatattgcttatgtagcttaccctttggatctttttgaagaaggttctgttactaacatgtttacttccattgtgggcaatgtatttggattcaaagccctacgagctctacgcttggaggatctgagaattcctcctgcttattctaaaactttccagggcccacctcatggaatccaagttgagagagataaattgaacaagtatggtcgtcccctattgggatgtactattaaaccaaaattggggttatccgcaaaaaactatggtagagcagtttatgagtgtctacgtggtggacttgattttaccaaggatgatgagaacgtaaactcccagccgtttatgcgttggagagatcgtttcttattttgcgccgaagctatttataaagcacaggccgaaacaggtgaaattaaaggacattacttgaatgctactgcaggtacatctgaagaaatgatgaaaagagcagcatgcgcccgagagttgggagttcctatcgtcatgcatgactacttaacagggggattcactgcaaatactagcttgtctcattattgccgagacaatggcctacttcttcacatccaccgcgcaatgcatgcagttattgatagacagaagaatcatggtattcacttccgtgtactagctaaagcgttgcgtatgtctgggggggatcatattcactctggtaccgtagtaggtaaactggaaggggaacgagatgtcactttgggctttgttgatttactacgtgatgattttattgaaaaagaccggagtcgcggtatttatttcactcaagattgggtatctatgcctggtgttttgcccgtggcttcaggcggtattcacgtttggcatatgcctgccctgaccgagatatttggggatgattccgtgctacagttcgg--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Amborella tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtacc-tgctactcggataaccgtagtaattctagagctaatacgtgcaagaaatcccgac-ctctggaagggatgcatttattagataaaaggccagcgcgggctt-tgcccgatgctttggtgaatcatgataactcgacggatcgcacggccattgtgctggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggataggggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-caagagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggctgggccgaccggtccgccttcacggtgtgcaccggccgtcccgtcccttcacccggcgatgcgttcctggccttaactggccgggtcgtgcctccggcaccgttactttgaagaaattagagtgctcaaagcaagcctacgctctgaatacattagcatgggataacatcacaggatttcggtcctattgtgttggccttcgggatcggagtaatgattaagagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctcttaggactccgtcggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtggaggt--atcctccacggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagta-tatagccttggccgacaggcccgggtaatctgtc-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacggaggcggtccgccgctggcgacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggtccggtactggatgtagcctttcccccgggcaagatgcccaatatttacaactctntggtagttaaaggtcgagatactgccggtcagcaaattaatgtgacttgtgaggtacaacaattattaggaaataatcgagttagaacggtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacgggagctccttaagtgttcccggttggcgaagctactctcggacgaattttcaacgttcttggagaaccagttgataatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcctgcctttatacagttagataccaaattatcaatctttgaaacaggcattaaagtggtggatcttttagctccttatcgtcgtggaggaaaaatcgggctattcgggggagccggagtgggtaaaacagtactcatcatggaattgatcaataacattgccaaagctcacggaggtgtatctgtatttggcggagtaggagaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggagtgattaatgaacaaaatattgcagaatcaaaagtcgctctagtctatggtcagatgaatgaaccgccgggagctcggatgagagttgttttaactgccctaacaatggcggaatatttccgtgatgttaatgagcaagacgtacttctatttattgacaatatctctcgcttcgttcaagcaggatcagaagtctctgccttattaggcagaatgccttctgccgtgggttatcaacctacccttagtacagaaatgggttctttgcaagaaagaattacttctactaaagagggatccataacttccattcaagcagtttatgtacctgcagacgatttgaccgaccctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagccgccaaaggtatctatccagcagtagatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaggaacattacgaaactgcgcaaagagttaagcaaactttacaacgttacaaagaacttcaagacattatagctattcttggaccagatgaattatccgaagaggatcgtttaaccgtagcaagagcacgaaaaattgagcgtttcttatcacaacccttcttcgtagcagaggtatttactggttctccaggaaaatatgttggtctcgcagaaacaattagggggtttcaactgatcctttccggagaattagatggtcttcccgaacaggctttttatctggtaggtaacatcgatgaagctaccgcgaaggctattaacttagaagtagagag--gcgctggattcaaagccggtgttaaagattacagattgacttattatactcctgactatgaaaccctagctactgatatcttggcagcattccgagtaactcctcaacctggagttccacctgaggaagcaggagctgcagtagctgccgaatcttccactggtacatggacaactgtgtggaccgatggacttaccagccttgatcgttacaaaggtcgatgctaccacatcgaacccgttgctggggaacaaaatcaatatattgcttatgtagcttatcctttggacctttttgaggaaggttctgttactaacatgtttacttccatcgtaggtaatgtatttgggttcaaagccctacgagctctacgtctagaggatctgcgaattcctcctgcttattccaaaagtttccaaggcccacctcatggcatccaagtcgagagagataaattgaacaagtatggtcgtcccctattaggatgtactattaaaccaaaattggggttatctgccaaaaactacggtagagcggtttatgaatgtctccgtggtgggcttgattttaccaaggatgatgagaatgtgaactcccaaccatttatgcgttggagggaccgtttcttattttgtgccgaagctctttataaagcacaggcagaaacaggtgaaatcaaaggacattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggccgtatttgccagagaattgggagttcctatcgtaatgcatgactacttaacaggaggattcactgcaaatactagtttggcccattattgccgagacaatggcctacttcttcacattcatcgcgcaatgcatgcagttattgatagacaaaggaatcatggtatacactttcgtgtactagctaaagcattgcgtatgtctggtggggatcatattcacgctggtaccgtagtaggtaaactggaaggggaacgggatgtcactttgggttttgttgatctactacgtgatgattttattgaaaaagaccgaagtcgcggtatttatttcactcaagattgggtatctatgccaggtgttctgcccgtggcttcaggtggtattcacgtttggcatatgcctgccctgaccgagatctttggggatgattccgtattacagttcggcggaggaactctgggacacccttggggaaatgcacccggtgcagtagctaatcgggtggctttagaagcgtgcgtacaagctcgtaatgagggacgtgatcttgctcgtgaaggtaatgaagttatccgtgaagctagcaggtggagcccagaactagctgctgcttgtgaggtatggaaggagatcaaattcgaattcgaagcaatggatgt Austrobaileyales_Austrobaileya tcaaagattaagccatgcatgtgtaagtatgaaccaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tcctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-tttgggaaggggcgcatttattagataaaaggccgatnncggctc-tgcccgatgctccggtgattcatgataactcgacggatcgcacggccttcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-ttcgagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggtcgggtcggccggtccgcctttc-ggtgtgcaccggtcgtcttgacccttctaccggcgatgcgctcctggccttaattggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcccaagctctgcatacattagcatgggataacatcacaggatttcggtcctattttgttggccttcgggatcggagtaatgattaatagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgtggaggc-gaccctccacggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-cctagccctggccgacaggcccgggtaatcttgt-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacnngggcggttcgccacccgcgacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggtccggtactggaagtagcctttccccccggcaagatgcctaatatttacaacttcttggtagttaagggtcaagatactgtcggtcagccaattaatgtgacttgtgaggtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacggatggtctgatgagaggaatggaagtaattgatacgggagctcctctaagtgttccagtcggtggagctactctgggacgaattttcaacgttcttggggaacctgttgataatttaggtcctgtagatactcgcacaacatctcccattcatagacctgcgcctgcctttatacagttagataccaaattatcaatctttgaaacagggattaaagtggtggatcttttagctccttatcgccgtggaggaaaaatcggactattcgggggagccggggtgggtaaaacagtactcatcatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtatctggcggagtaggcgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggagtgattaatgaacaaaatattgcagaatccaaagtagctctagtctatggtcagatgaatgaaccgccgggagctcgtatgagagttggtttgactgccctaaccatggcagaatatttccgggatgttaatgaacaagacgtacttctatttatcgacaatatctcccgcttcgttcaagcaggatcagaagtatctgccttattaggcagaatgccttccgccgtaggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttccaccaaagagggatctataacttccattcaagcagtttatgtacctgcggacgatttgaccgaccctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagagggttagctgccaaaggtatctatccagcagtggatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaggaacattatgaaactgcacaaagagttaagcaaacttcacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaagatcgtttaaccgtagcaagagcacgcaaaattgagcgtttcttatcacaacccttcttcgtagcagaagtatttactggttctccagggaaatatgttggtctcgcagaaacaattagggggtttcaactgatcctttccggagaattagatggtcttcccgagcaggccttttatttggtaggtaacatcgatgaagctaccgcgaaggctatgaacttagaagttgagag--gtgttggattcaaggctggtgttaaagattacagattgacttattatactcctgactatgaaactaaaatgactgatatcttggcagcattccgagtaactcctcaacccggagttccacctgaggaagcgggggctgcggtagctgcagaatcttctactggtacatggacaactgtgtggaccgatggacttaccagcctcgatcgttacaaaggtcgatgctaccacatcgagcctgttgctggggaggaaaatcaatatattgcttatgtagcttaccctttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctacgagctctgcgtctggaagatctgcgaattcctcctgcttattccaaaactttccaaggcccgcctcatggcatccaagttgagagagataaattgaacaagtatgggcgtcccctattgggatgtactattaaaccaaaattaggtttatctgccaagaactacggtagagcggtttatgaatgtctccgcggtggacttgattttaccaaggatgatgagaacgtgaactcccaaccgtttatgcgttggagggaccgtttcgtattttgtgccgaagaagtttataaagcgcaggcagaaacaggtgaaatcaaaggacattacttgaatgctaccgcaggtacatgcgaagaaatgatcaaaagggccgtatttgccagagaattgggagttcctatcgtaacgcatgactacttaacagggggattcactgcaaatactagcttggctcattattgccgagacaacggcctacttcttcacatccatcgcgcaatgcatgcagttattgatagacagaggaatcatggtatacactttcgtgtactagctaaagcgttgcgtatgtctggtggagatcatgttcactctggtaccgtagtaggcaaactggaaggggaacgggacgtcactttgggttttgttgatttactacgtgatgattttattgaaaaagaccgaagtcgcggtatttattttactcaagattgggtatctatgccaggtgttttacccgtggcttcaggaggtattcacgtttggcatatgcctgccctgaccgagatctttggggatgattccgtactacagttcggtggaggaactttagggcacccttggggaaatgcacctgatgcagtagccaatcgggtggctttagaagcgtgtgtacaagctcggaatgagggacgtgatcttgctcgtgaaggtaatgaggttatccgtgaagcgagcaaatggagccctgaactagctgctgcttgtgaggtatggaaggagatcaaattcgaattcgaagcaatggatgt Austrobaileyales_Schisandra tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtacc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttttggaagggatgcatttattagataaaaggccgacgcgggcta-tgcccgatgctccggtgattcatgataactcgacggatcgcacggccttagtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tttgagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttgggccggccggtccgccttcc-ggtgtgcaccggtcgtcttgacccttctaccggcgatgcgctcctggtcttaactggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcacaggatttcggtcctattttgttggccttcgggatcggagtaatgattaatagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttggcaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcngcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtggaggt-gaccctccacggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-catagccttggccgacaggcccgggtaatcttgt-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgggggcggttc----------------------------------------------------tcattggcccggtactggatgtagcttttcccccgggcaagatgcctaatattaacaactctttgntcgttaaaggtcgagatactgttggtcagcaaattaatgtgacttgtgangtacaacaattattaggaaataatcgagttagagctgtagctatgagtgctacggatggtctgatgagaggaatggaagtgattgatacgggagctcctctaagtgttccagttggtggatccactctcggacgcattttcaacgttcttggagagcctgttgataatttaggtcccgtggatactcgcacaacatctcctattcatagatctgcgcctgcctttatacagttagataccaaattatcaatctttgaaacagggattaaagtggtggatcttttagctccctatcgccgtggagggaaaatcggactattcgggggagccggggtgggtaaaacagtactgatcatggaattgatcaacaacattgccaaagctcatgggggtgtatctgtatttggtggagtaggtgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggagtgattaatgaacaaaatattgcagaatcaaaagtggctctagtctacggtcagatgaatgaaccgcccggagctcgtatgagagttggtttgactgccctaaccatggcggaatatttccgggatgttaatgaacaagacgtacttctatttatcgacaatatctcccgcttcgtccaagcaggatcagaagtatctgccttattaggtagaatgccttctgccgtgggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttctaccaaagagggatctataacttccattcaagcagtttatgtacctgcagatgatttgaccgaccctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagagggttagctgccaaaggtatctatccagcagtggatcctttagattcaacgtcaactatgctccaacctaggatcgttggcgaagagcattatgaaactgcgcaaagagttaagcaaacttcacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaggatcgtttaaccgtagcaagagcacgaaaaattgagcgtttcttatcacaacccttcttcgtagcagaagtatttactggttctcccgggaaatatgttggtctcgcagaaaccattagggggtttcaactgatcctttccggagaattagatggtcttcccgagcaggccttttatttggtaggtaacatcgatgaagctaccgcgaaggctatgaacttagaagtagagag--gtgttggattcaaggctggtgttaaagattacagattgacttattatactcctgaatatgaaacgaaagatactgatatcttggcagcattccgagtaactcctcaacccggagttccgcccgaggaagcgggagctgcggtagctgcggaatcttctactggtacctggactactgtgtggactgatggacttaccagcctcgatcgttataaagggcgatgctaccacattgagcccgttgctggggaggaaaatcaatatattgcttatgtagcttaccctttagacctttttgaagaaggctctgttactaacatgtttacttctattgtgggtaatgtatttgggttcaaagccctacgagctctgcgtctggaagatttgcgaattcctcctgcttattccaaaactttccaaggcccacctcatggcatccaagttgagagagataaattgaacaagtatggtcgtcccctattgggatgtactattaaaccaaaattagggttatctgccaagaactacggtagagcggtttatgaatgtctccgcggtggacttgattttaccaaggatgatgagaacgtgaactcccaaccgtttatgcgttggagggaccgtttcttattttgtgccgaagctctttataaagcgcaggccgaaacaggtgaaattaaaggacattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggctgtatttgccagagaattgggagttcctatcgtaatgcatgactacttaacagggggattcactgcaaatactagcttggctcattattgccgagacaacggcctacttcttcacatccatcgcgcaatgcatgcagttattgatagacagaggaatcatggtatccactttcgtgtactagctaaagcgttgcgtatgtctggtggagatcatattcactctggtaccgtagtaggtaaactggaaggggaacgggacgtcactttgggttttgttgatttactacgtgatgattttattgaaaaagaccgaagtcgcggcatttatttcactcaagattgggtatctatgccaggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcctgccctgaccgagatctttggggatgattccgtactacagttcggtggaggaactttaggacacccttggggaaatgcgcctggtgcagtagctaatcgtgtggctttagaggcgtgtgtacaagctcgtaatgaggggcgtgatcttgctcgtgaaggtaatgaagttatccgtgaagctagcaaatggagccctgaactagctgctgcttgtgaggtctggaaggagatcaaattcgaattcgaagcaatggatgt Oxalidales_Davidsonia tcaaagattaanccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatt-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ctctggaagggatgcatttattagataaaaggtcgacgcgggctt-tgcccgttgcttcggtgattcatgataactcgacggatcgcacggccatcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggtcggccggtccgcctc-a-ggtgtgcaccggccggctygtcccttctgccggcgatgcgctcctggccttaattggccgggtcgtgcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctggatacattagcatgggataacatcataggattccggtcctattgtgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctttaaggactccgccggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-gaccctccgcggccagcttcttagagggactatggccgctcaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgtgggcggttcgccgccggcgacgtcgcgagaagtccactgaaccttatcatttagaggaagg--------------------------------------------------------------------------------------------------------------------------------------------------------gtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacgggagctcctctaagtgttccagttggcggagcgactctaggacgaattttcaacgtacttggagagcctattgataatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcccgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtagtagatcttttagccccttatcgccgtggtggaaaaatcggactattcgggggagctggagtaggtaaaacagtgctcattatggaattaatcaacaatattgccaaagctcatggaggtgtatccgtatttggcggagtcggtgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatctggagtaattaatgaagaaaatattgcggaatcaaaagtggctctagtctacggtcagatgaatgaaccgccgggggctcgtatgagagttggtttgactgccctaactatggcggaatatttccgagatgttaatgaacaagacgtacttctctttatcgacaatatcttccgtttcgtccaagcgggatccgaagtatccgccttattgggtagaatgccttctgctgtgggttatcaacccacccttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagaagggtccataacttctattcaagcagtttatgtacctgcggacgatttgaccgaccctgctccggccacgacatttgcacatttagatgctactactgtactatcaagaggattagctgccaaaggtatctacccagcagtagatcctttagattcaacgtcaactatgctccaacctcgaattgttggtgaggaacattatgaaactgcgcaaagagttaaacaaactttacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaggatcgcttacccgtagcaagagcacgaaaaattgagcgtttcttatcacaaccctttttcgtagcagaagtatttacgggttctccggggaaatatgttggtctagcagaaacaattagagggtttaaattgatcctttccggagaattagacggtcttcctgaacaggccttttatttggtaggtaacatcgatgaagct-------------------------------------------------------------------------------atactcctgactatgaaaccaaagatactgatatcttggcagcattccgngtatctcctcttcctggagttccgcctgaggaagccgggcgagcggtagctgctgaatcttctactggtacatggacaactgtctggaccgacgggcttaccagtcttgatcgttacaaaggacgatgctacgacatcgagcctgttgcgggagaagaaaatcaatatattgnttatgtagcttaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtaggtaatgtgtttgggttcaaggcgctgcgggctctacgtctggaggatttgcgaatccctactgcttatgttaaaactttccaaggtccgcctcatggtatccaagttgagagagataaattgaacaagtatggccgccccctattgggatgtactattaaacctaaattggggttatccgctaagaattatggtagggcagtttatgaatgtctccgcggtggacttgattttaccaaagatgatgaaaacgtgaactcccaaccatttatgngttggagagaccgtttcttatttttggccgaagcactttataaagcacaggccgaaacgggcgaaatcaaagggcattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggctgtatttgctagagaattgggagttcccatcgtaatgcatgactacttaacaggaggattcactgcaaatactagcttggctgattattgccgcgataatggtctacttcttcacatccatcgtgcaatgcatgccgttnttgatngacagaagaatnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnntgtctggtggagatcatatncatgccggtaccgtngtcggcnaacttgaaccccaaagagacatcactttnggctttgttgatttactacgtgatgattttattgaaaaagatcgaagccgcggtatttntttcactcaagattgggtctctctaccnggcgttctgcccgtngcttcaggaggtattcatgtttggcatatnccggctttgaccgagatctttggagatgattccnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnccgtngctaatcgagtagctctngaagcatgtgtacaagctcgtaatgaggggcgtgatcttgctcgtgagggtaatgaaattatccntnaggctagcaaatggagtccnnnnnnnnnnnctgcttgtgaagtatggaaggagatcaaatttgaattccnnnnnatggatac Celastales_Lepuropetalon tcaaagattaagccatgcatgtgcaagtatgaacgaattcaaactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tactactcggataaccgtagtaattctagagctaatacgtgcaacatatcccgac-ttccggaagggatgcatttattagagaaaaggtcaacgcttgct--cgctcgttgctcagatgattcatgataactcgacggatcgcatggccattgtgctggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtaacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctaacaaggggaggtagtgacaataaataacaataccgggctctcaagagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttgtannttgggttgggtcgaccggtccgcttca--ggtgagcaccatcagtcctgtccttattgccggtgatgcgctcctagccttaattggttgggtcgtccctctggtgctgttactttgaagaaattagagtgctcaaagcccgcctacgctctggatacattagcatgggataacgtcataggatttcgatcctatttagttgg-cttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagagatcagcggatgttgctcttaggactccgctggcatcttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagnaaggattgacagattgagagctctttcttgattcnatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaaatagctacgcggaggg-ttccctctgcggccagcttcttagagggac-acggccgcttaggtcgaaggagtttgaggcaataacagctgtgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tataaccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcag--catcaactcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgttggcggttccctgctggcgatgtcgcgagaagtccactgaaccttatcatttagaggaagg---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ctgtagatacccgtacaacatctcctattcatagatcagcgcccgcctttatacagttagacacaaaattatccatttttgaaacaggaattaaagttgtagaccttttagctccttatcgccgtggaggtaaaatagggctattcgggggggctggagtgggtaaaacagtactaattatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtatttggcggagtgggtgaacgtactcgtgaaggaaatgacctttacatggaaatgaaagagtccggagtaattaatgaacaaaatattgcagaatcaaaagtggctctagtctatggccagatgaatgaaccgccgggagctcgtatgcgagttggtttgaccgccctaactatggccgaatattttcgagatgttaatgaacaagacgtacttctttttatcgacaatatattccgtttcgtccaagcgggatctgaagtatccgccttattgggtagaatgccctccgctgtgggttatcaacccacccttagtactgaaatgggttctttacaagaaagaattacttctaccaaaaaagggtccataacttctattcaagctgtttatgtaccggcagacgatttgactgaccctgctccggccacgacatttgcgcatttagatgccactactgtattatcgcgaggactagctgccaagggtatctacccagcagtagatcctttagattcaacgtcaactatgcttcaaccccgcattgttggtgaagaacattatgaaaccgcgcaaagagtgaagcaaactttacaacgttacaaagaacttcaggacattatagctatcctggggttggacgaattgtccgaagaggaccgcttaaccgtagcaagggcacgaaaaatcgagcgtttcttatcacaaccctttttcgtagcagaagtatttacgggttctccggggaaatatgttggtctagcagaaactattagagggtttaaattgatcctttcgggggaattagatggtcttcctgagcaggcsttttatttggtaggtaacattgatgaggctactgcgaaggctacgaattt----------------gttggattcaaggctggcgttaaagattataaattgacttattatactcctgactatgaaaccaaagatactgatatcttggcagcatttcgaatgactcctcaacctggagttccgcctgaagaagctggagctgcggtagctgctgaatcttctactggtacctggacaactgtgtggaccgatggacttaccagtcttgatcgttacaaaggacgatgctaccacatcgagcccgtggctggagaagacaatcaatatattgcttatgtagcttatcctttagacctttttgaagaaggttctgttactaatatgtttacttctattgtgggtaatgtttttgggttcaaagccctgcgcgctctacgtctggaagatttgcgaatcccccctgcttattctaaaactttccaaggcccgccgcatggcatccaagttgagagagataaattgaacaagtatggacgccctctattgggctgtactattaaacctaaattgggattatccgctaagaattatggtagagccgtttatgaatgtctacgcggtggacttgattttaccaaagatgatgagaacgtaaactcccaaccatttatgcgttggagagaccgtttcttattttgcgctgaagccatttttaaagcacaagctgaaacaggtgaaatcaaaggacattacttgaatgctactgcgggtacgtgcgaagaaatgatcaaacgggctgtatttgccagagaactaggagtccctatcgtaatgcacgactacttaacggggggattcactgcaaatactaccttggctcattattgccgagataatggtttacttcttcacatccaccgtgcaatgcatgcagttattgatagacagaaaaatcatggtatacactttcgtgtactagcgaaggccctacgtatgtctggtggagaccatattcatgctggtaccgtagtaggtaaacttgaaggcgaaagagatatcactctaggctttgttgatttattacgcgatgattttattgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctcttccaggtgttctgcccgtggcttccggaggtattcacgtttggcatatgcctgctctgaccgagatctttggtgatgattccgtactacaattcggtggaggaactttagggcatccttggggaaatgcgccaggtgctgtagcgaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgaaggtaatgaaattatccgcgaggcctgcaaatggagtcctgagttagctgctgcttgtgaagtatggaaggagatcaaatttgaattcgaagcaatggatac Celastales_Plagiopteron tcaaagattaagccatgcatgtctaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtat--tactactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattggataaaaggtcaacgcgggctc-tgcccgttgctctgttgattcatgataacttgacggatcgcacggccatcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtagtgacgggtaacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tgcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttgggtcgagtggtccgccat-t-ggtgtgcacctttcgtcccgtcccttctgccggcgatgcgctcctggccttaactggccgggtcgttcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctggatacattagcatgggataacatcataggatttcggtcctattctgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcagcggatgttgcttttaggactccgctggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggagga-atccctccgcggccagcttcttagagggactacggccgcttaggccgaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcctgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgtgggcggtttactgccgacaacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggtccagtactggatgtagctttttccccgggcaagatgcctaatatttacaacgctctagtggttaagggtcgagatacgtccggtcacacaattaatgtgatttgcgaagtacagcaattattaggaaataaccaagttcgggctgtagctatgagtgctacagatggtctaatgagagggatggacgtgattgacacgggagctcctctaagtgttccagtcggcggagcgactctcggacgaattttcaacgtacttggtgagcctgttgataatttaggtcctgtagatactcgtacaacctctcctattcataaatcagcacccgcctttatacagttagagacaaaattgtctatttttgaaacaggaattaaagtagtagaccttttagctccttatcgccgtggaggaaaaatcggactattcgggggggctggagtgggtaaaacggtcctaattatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtctttggcggagtgggtgaacgtacgcgcgaaggaaatgatctttacatggaaatgaaagaatctggagtaattaatgaacaaaatattgcagaatcaaaagtggctttagtttatggccagatgaatgaaccgccaggagctcgtatgagagttggtttraccgctctaactatggcggaatattttcgagatgttaatgaacaagacgtacttctatttatcgacaacatcttccgtttcgtccaagctggatccgaagtatccgccttattggggagaatgccttccgctgtgggttatcaacccacccttagtactgaaatgggtgctttacaagaaagaattacttctaccaaaaaagggtccataacttctattcaagctgtttatgtaccagcggatgatttgactgaccctgctccggccacgacctttgcacacttagatgctactactgtactatcacgaggactagctgccaagggtatctacccggcagtagatcctttagattcaacgtcaactatgctacaacctcgaattgttggtgaggagcattatgaaactgcgcaaagagtgaagcaaactttacaacgttacaaagagcttcaggacattatagctatcctggggttggacgaattgtccgaagaggaccgcttaaccgtagcaagagcacgaaaaatagagcgtttcttatcacaacccttttttgtcgccgaagtttttaccggttctccggggaaatatgtcggtctagcagaaacaattagagggtttaaattgatcctttccggagaattagatggtcttcctgagcaggccttttatttggtaggtaacatcgatgaagccactactaaggctacgaatttagaaatggag--nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnntgatcgttttaaaggacgatgctaccacatcgagcccgttgctggaggagaaaatcaatatattgcttatgtagcttactccttagaccttttcgaagaaggttctgttactaacatggttacttccattgtgggtaatgttcttgggttcaaagccctgcgcgctctacgtctggaggatttgcgagtcccccctgcttattctaaaacttttcaaggcccgccgcatggtatcccagttgagagagataaattgaacaagtatggacgccctctattgggatgtactatttaacctaaattgggattatctgctaagaattatggtagagcggtttatgaatgtctccgcggtggacttgattttacccaagatgatgagaacgtaaactcccaaccatttatgcgttggagagaacgtctcttaatttgtgccgaggcgctttataaagcacaggctgaaacaggtgaaatcaaagggcattacttgaatgctactgccggtacatgtgaagaaatgatcaaaagggctgtatttgctagagaactgggcgtacctatcgtaatgcatgactacttaacggggggattcactgcaaatactagcttggctcattattgccgagataatggtttacttcttcacatacaacgtgcaatgcatgcagttattgatagacagaaaaatcatggtatgcactttcgtgtactaggcgaggccctacgtatgtctggtggagaccatattcatgccggtaccgtagtaggtaaacttgagggtgaaagagatatcactttaggctttgttgatttattacgtgatgattttattgaaaaagaccgaagccgcggtatttatttcactcaagattgggtctctctaccaggtgttcttgctgtggcttccggaggtattcacgtttggcatatgcctgctctgaccgagatctttggtgatgattccgtactacaattcggtggaggaactttagggcatccttggggaaatgcaactggtgctgtagctaatcgagtagctctagaagcatgtgttacagctcgtaatgagggacgtgatcttgctcgtgaaggtaatgaaattatccgcgaggctagcaaatggagtcctgaactagctgctgcttgtgaagtatggaaggagatccaaattgaattcgcagcaatggatac Malpighiales_Populus tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatt-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggacgcatttattagataaaaggtcgacgcgggctc-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccatcgtgctggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-ttcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggactttgggttgggtcggccggtccgcctc-a-ggtgtgcaccggtcgcctcgtccyttctaccggcgatgcgctcctggccttaactggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctggatacattagcatgggataacatcataggatttcgatcctattgtgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggattggcggatgttgcttctaggactccgccagcaccttatgagaaatcaaagtttttgggttctggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-gaccctccgcggccagcttcttagagggactatggccttccaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacgtgggcggttcgccgccggcgacgtcgcgagaagtccactgaaccttatcatttagaggaaggtcattggcccagtgctagatgtagtttttcccccgggcaagatgcctaatatttacaacgctctggtagttaagggtcgagatactgtcagtcaacaaattaatgtcacttgtgaagtacagcaattattaggaaataatcgagttcgagctgtagctatgagtgctacagagggtctaatgagaggaatggaagtgattgacacgggagctcccctaagtgttccagtcggcggggcgactctaggacgaattttcaacgtgcttggagaacctgttgatgatttacgtcctgtagatactgggacaacatcccctattcatagatctgcgcctgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtcgtagatcttttagccccttatcgccgtggaggaaaaatcggactatttgggggcgctggagtaggtaaaacagtactaattatggaattaatcaacaacattgcgaaagctcatgggggtgtatccgtatttggcggagtaggtgaacgtactcgtgaaggaaacgatctttacatggaaatgaaagaatccggagtaattaatgaagaaaatattgcagaatcaaaagtggctctagtttatggtcagatgaacgaaccaccgggagctcgtatgagagttggtttgactgccctaactatggcggaatatttccgagatgttaatgaacaagacgtacttctatttatcgacaatatctttcgtttcgtccaagcaggatccgaagtatccgccttattgggtagaatgccctctgctgtgggttatcaacccacccttagtaccgaaatgggtactttacaagaaagaattacttctaccaaagaagggtccataacttctattcaagcagtttatgtacctgcggacgatttaaccgaccctgctcctgccacgacatttgcgcatttagatgctactactgtactatcaagaggattagctgctaaaggtatctatccagcagtcgaccctttagattcaacatcaactatgctccaacctcagatcgttggtgaggaacattatgaaactgcgcaaagagttaagcaaactttacaacgttacaaagaacttcaagacattatagctatccttgggttggacgaattatccgaagaggatcgcttaactgtagcaagagcacgaaaaattgagcgtttcttatcacaaccctttttcgtagccgaagtatttaccggttccccgggaaaatatgtcggtctagcagaaacaattagagggtttaaattgatcctttccggagaattagatagtcttcctgagcaggccttttatttggtaggtaacattgatgaagctactgcgaaggctacgaacttagaaatggagaaaggtgttggattcaaggctggtgttaaagagtataaattgaattattatactcctgaatatgaaaccaaagatactgatatcttggcagcattccgagtaactcctcaacctggagttccgcccgaggaagcaggggccgcagtagctgctgaatcttctactggtacatggacaactgtgtggaccgacgggcttaccagtcttgatcgttataaaggacgatgctacgacatcgagcccgttgctggagaagaaaatcaatttattgcttatgtagcttaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctacgcgctctacgtctggaggatttgcgaattcctcctgcttatactaagacttttcaaggcccacctcatggtatccaagttgaaagagataaattgaacaagtatggtcgccccctattgggatgtactattaaacctaaattggggttatccgctaagaattacggtagagcagtttatgaatgtctccgcggtggacttgattttaccaaagatgatgagaacgtgaactcccaaccatttatgcgttggagagaccgtttcttattttgtgccgaagcactttataaagcacagactgaaacaggtgaaatcaaagggcattatttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggctatatttgccagagaattgggagttcctatcgtaatgcatgactacttaacagggggattcaccgcaaacactagtttggctcattattgccgagataatggtttacttcttcacatccatcgcgcaatgcatgcagttattgatagacagaaaaatcatggtatacactttcgtgtactagctaaggcattacgtatgtctggtggagatcatattcactctggtaccgtagtaggtaaacttgaaggggaaagagacataactttgggttttgttgatttactacgtgatgattttgttgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctctaccgggtgttctgcccgtggcttcggggggtattcacgtttggcatatgcctgctctgaccgagatctttggagatgattccgtactncaattcggtggaggaactttagggcacccttggggaaatgcacctggtgctgtagctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattatccgtgaagctagcaaatggagccctgaactagctgctgcttgtgaagtatggaaggagattaaatttgaattcgaagcaatggatac Malpighiales_Linum tcaaagattaagccatgcatgtgtgagtatgaacaaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtacc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttttggaaggggcgcatttattagataaaaggtcaacgcgggctc-tgctcgttgttttgatgattcatgataactcgacggatcgcaaggccttcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-attgagtctggtaattggaatgagtacaatctaaaccccttaacgagtacccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggtcggccggtccgctcac--ggtgtgcaccggccgtcttgtcccttctgccggcgatgcgctcctggtcttaattggccgggtcgtgcctccggcgcagttactttgaagaaattagagtgctcaaagcaagcctacgctctgaatacattagcatgggataacatcacaggatttcggtcctattgtgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctttttggactccgccggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggc--accctccgtggccagcttcttagagggactatggccttttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggtctgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattattggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggattgcggcgacgtgggtggttcgctgcccgcgacgtcgcgagaagttcnctgaaccttatc-------------tcatcngnccggtactagatgtagcttttcccccggggaagatgcctaatatttacaatgctctcctagttaagggtcaagaccccgccggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgagttcgggctgtagctatgagtgctacagatggtttaatgagaggaatggaagtgattgacacgggaactcctctaagtgttccagtcggcggagcaactctaggacgaattttcaacgtgcttggagaacctattgatgatttaggtccggtagatactcgcacaacatcccctattcatagagctgcacccgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtagtagatcttttagccccttatcgtcgtggtggaaaaatcggattattcgggggagctggggtaggtaaaacagtactaattatggaattaattaacaacattgcgaaagctcatgggggtgtatccgtctttggcggagtaggcgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatccggtgtaattaatgaagaaaatattgcagaatccaaagtagctctagtctatggtcagatgaacgaaccgccgggagctcgtatgagagttggattgactgccctaaccatggcagaatatttccgagatgttaatgagcaagatgtacttctatttattgacaatatcttccgtttcgtccaagccggatccgaagtatccgctctattgggtagaatgccttccgctgtgggttatcaacccacccttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagaagggtcgataacttccattcaagcggtttatgtacctgcagatgatttgactgaccctgctcctgccacgacatttgcacatttagatgctactactgtactatcaagaggattagccgctaaagggatctatcctgcagtagatcctttagattcaacatccactatgctccaacctcagatcgttggtgaggaacattatgaaactgcacaaagagttaagcaaactttacaacgttacaaagaactccaggacattatagccatcctggggttggacgaattatccgaagaggatcg-ttaactgtagcaagagcacgaaaaattgagcgtttcttatcacaaccctttttcgtagcagaagtatttacgggttctccgggaaaatatgtcggtctagcagaaactataagagggtttaaattgatcctttccggagaattagatagtcttcctgagcaggccttttatttggtaggtaatattgatgaagctactgcgaaggctacgaacttagaaatggagaa--gtgttggattccaggctggtgttaaagattataaattaacttattatactcctgaatatgaaaccaaagatactgatatcttggcagcattccgagtaactcctcaaccaggagttccgcctgaggaagcgggggctgcggtagctgctgaatcttctactggtacgtggacaactgtgtggaccgatgggcttaccagtcttgatcgttataaaggacgatgctaccacattgaacccgttcccggagaagaaagtcaatttattgcttatgtagcgtaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtaggtaatgtatttgggttcaaagccctgcgcgccctacgtctggaggatttgcgaatccctcctgcttattctaaaactttccaaggcccgcctcacgggattcaagttgagagagataaattgaacaagtatggtcgccccctattgggatgtactattaaaccgaaactgggcttatccgctaagaattatggtagagctgtttatgaatgtcttcgtggtggacttgattttaccaaagatgatgaaaacgtgaactcccaaccatttatgcgttggagagaccgtttcttattttgtgccgaagctatttttaaatcacaggccgaaacaggggaaatcaaagggcattatttgaatgctaccgcgggtacatgtgaagaaatgatcaaaagggctgtatttgccagagagttgggagttcctatcgtaatgcacgactacttaacagggggattcaccgctaatactagtttggctcattattgccgagataatggtttacttcttcacatccaccgtgcaatgcatgcagttattgatagacagaaaaatcatggtatacactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatattcactcaggtaccgtagtaggtaaacttgaaggggaaagagatatcactttgggctttgttgatttactgcgtgatgattttgttgaaaaagatagaagccgtggtatttatttcactcaagattgggtctctctaccaggcgtcttacccgtagcttcggggggtattcacgtttggcatatgcctgctctgacagagatctttggagatgattccgtattacaatttggcggtggaactttgggtcacccttggggaaatgcacctggtgccgtagctaatcgagtagctctagaagcatgtgtacaagctcggaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgtgaggctagcaaatggagtcctgaattggctgctgcttgtga------------------------------------------ Nymphaeales_Barclaya tcaaagattaagccatgcatgtgtaagtatgaactatttcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtact-tgctactcggataaccgtagtaaagctagagctaatacgtgcaccacaccccgac-ttctggaagggacgcatttattagataaaaggccgacgcgggctc-tgcccgatgttttggtgattcatgataactcgacggatcgcacggcctttgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctaccatggtagtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaatacataacaataccgggctc-ttcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggactttgggttgggccgaccggtccgcctct--ggtgtgcaccggtcgtctcgtcccttctgccggcgatgcgctcctggccttaactggccgggtcgtgcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgcatacattagcatgggataacatcacaggatttcggtcctattgtgttggccttcgggatcggagtaatgattaagagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttgcttttaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggaggt-acccctccgcggccagcttcttagagggactatggccgtttaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-tatagccttggccgacaggcccgggtaatcttgg-aaactacatcgtgatggggatagatcattgcaattgttggtcttaaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgcggcgacggaggcggttcgccgcttgcgacgtcgcgagaagttcattgaaccttatcatt----------tcattggtccggtactggatgtagcttttcccccggggaagatgcctaatatttacaactctttggtagttaagggtcgagataccacaggtcaggaaattaatgtgacttgtgaggtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatgggctgatgagaggaatggaagtgattgacacgggagctcctctaagtgttccagtcggtggagccactctaggacgaattttcaatgttcttggagaacctgttgataatttgggtcctgtagatactcgtacaacatctcctattcatagacccgcacccgcttttatacaactagatacaaaattatcaatctttgaaacgggcattaaagtggtggatcttttagccccttatcggcgtgggggaaaaataggactattcgggggagccggagtgggtaaaacagtactcatcatggaattaatcaacaacattgccaaagctcatgggggtgtatccgtattcggcggagtaggagaacgcactcgtgaaggaaatgatctttacatggaaatgaaagaatccggggtgattaatgaagaaaatattgcagaatccaaagtagctctagtatatgggcagatgaatgaaccgccgggagctcgtatgagagtcggtttgactgccctaaccatggcggaatatttccgtgatgttaatcaacaagacgtacttctatttattgacaatatctttcgcttcgtccaagcggggtcagaagtatccgccttattaggtagaatgccttccgccgtgggttatcagcctacccttagtacagaaatgggttctttgcaagaaagaattacttctactaaagagggatctataacttccattcaagcagtttatgtacctgcggatgatttgactgatcctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagctgccaaaggtatctatccagcagtagatcctttagattcaacgtcaactatgctccaacctcggatcgttggcgaagaacattacgaaactgcgcaaagagttaaacaaacttta--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------aagtgttggattcaaagctggtgttaaagattacagattgacttattacactcctgattatgaaacccttgctactgatatcttggcagcattccgagtaactcctcaacctggagttccgcctgaggaagcaggagctgcggtggctgccgaatcttccactggtacatggacaactgtgtggaccgatggacttaccagccttgatcgttacaaaggacgatgctaccacatcgagccagttgctggggaggaaaatcaatatattgcttatgtagcttaccctttggacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctacgagctctacgtctggaggatctgagaattcctcctgcttattctaaaactttccagggcccacctcatggaatccaagttgagagagataaattgaacaagtatggtcgtcccctattgggatgtacaattaaaccaaaattggggttatccgcaaagaactatgggagagcggtttatgagtgtctccgtggtggacttgattttaccaaggatgatgagaacgtgaactcccaaccgtttatgcgttggagagaccgtttcttattttgcgccgaagctatttataaagcgcaggccgaaacaggtgaaattaaaggacattacttgaatgctactgcgggtacatccgaagaaatgatcaaaagggcggtatgtgcccgagagttgggagttcctatcgtaatgcatgactacttaacagggggattcaccgcaaatactagcttggctcattattgccgagacaatggcctacttcttcacatccaccgcgcaatgcatgcagttattgatagacagaggaatcatggtattcactttcgtgtactagctaaagcgttgcgtatgtctgggggggatcatattcactctggtaccgtagtaggtaaactggaaggggagcgagatgtcactttgggctttgttgatttactacgtgatgattttattgaaaaagaccggagtcgcggtatttatttcactcaagattgggtatctatgccaggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcctgccctgaccgatatatttggggatgattccgtgctacagttcgg--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Gymno_Ginkgo tcaaagattaagccatgcatgtgtaagtatgaactctttcagactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtacc-tactactcggataaccgtagtaattctagagctaatacgtgcaccaaatcccgac-ttctggaagggacgcatttattagataaaaggccgacgcgggc---cgcccgctgcttcggtgattcatgataactcgacggatcgcacggccctggtgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggccgggtcggccggtccgccttttcggtgtgcaccggccgctccgtcccttctgccggcggcgcgctcctggccttaattggctgggtcgcggctccggcgccgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgcgataggagtctggtcctattgtgttggccttcgggaccggagtaatgattaatagggacggtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttgctttaaggactccgccggcaccttgtgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-tg-ccttcgtggccagcttcttagagggactatggcccttcaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagt--ctatacctgggccgagaggcccgggaaatctgc-caaatttcatcgtgatggggatagatcattgcaattattgatcttaaacgaggaattcctagtaagcgcgagtcatcaactcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcggatcgcgccgacgacggcggttcgccgccggcgacgtcgcgagaagttcattgaaccttatcatttagaggaaggtcattggcccggtactggatgtaacttttcccccgggcaatatgcctaatattttcaattctttgatagtgaagggtcaagatacagctggtcaggaaattcatgttacttgtgaggtacaacaattattaggaaataatagagttagagctgtagctatgaatgctacagatggtctgatgagaggaatgaaagtgattgacacaggagctcctctgagtgttccagttggtggagctactcttggacgaattttcaatgttcttggagaacctgtcgataatttaggtcctgtagatgctcgcacaacatcccctattcatagacctgctcctgcctttacgcagttggataccaaattatcaatcttcgaaacaggcattaaagtggtggatcttttagctccttatcgacgtggaggaaagatcggactattcgggggagctggagtgggtaaaacagtactcatcatggagttaatcaacaacattgctaaggctcatggaggtgtatctgtatttggcggagtaggggaacgtactcgtgaagggaatgatctttacgtggaaatgaaagaatcaggagtaattaatgagcaaaacatctcagaatcaaaagtagctctggtctatggtcagatgaatgaaccaccaggagctcgtatgagagttggtttaactgccttaaccatggctgaatattcccgagatgtcaatgagcaagacgtactcttatttatcgacaatatcttccgctttgtccaagcaggatcagaagtatccgccttattaggtagaatgccttctgctgtgggttatcagccaactcttagcacggaaatgggttctttgcaagagagaattacttctactaaagagggatctataacctccattcaagcagtttatgtacctgcggacgatttgaccgaccctgctcctgctacgacatttgcacatttagatgctactaccgtactatcgagaggattagcttccaaaggtatctatccagcagtagatcctttagattcaacgtcgactatgctccaaccttggattgtgggcgaggaacattacgaaaccgcacaaggagttaagcaaacttcacaacgttataaagaacttcaagacattatagctattcttggactggacgaattatcagaagaagatcgtttaaccgtagcaagagcacgaaaaattgaacgttttttatcacaaccctttttcgtagcagaggtcttcaccggttccccgggcaaatatgtcagtctcgtagaaacaattagaggttttaaaatgatcctttctggagaattagatggtctccccgaacaggctttttatttggtaggtaacattgatgaagctaccgcgaaggctatgaacttcaaagtggagagaagtgtcggatttaaagctggtgttaaagattacagattgacttattatactcctgaatatcaaaccaaagatactgatatcttggcagcattccgagtaactcctcaacctggagtgccacctgaggaagcgggagctgcagtagctgccgaatcttccactggtacatggaccactgtttggaccgatggacttaccagtcttgatcgttacaagggaagatgctatgacatcgagcccgttcctggggaggaaaatcaatttattgcctatgtagcttaccctttggatcttttcgaggaaggttctgttactaacctgttcacttccattgtagggaatgtatttggattcaaagccctacgagctctacgtctggaagatctgcgaattcctcctgcttattccaaaacttgccagggtccacctcatggtatccaagttgnaagggataaattgaataaatatggccgtcccctattgggatgtactatcaagccaaaattgggtttatctgccaaaaattatggtagagcagtttacgaatgtcttcgtggtggacttgattttactaaagatgatgagaacgtaaattcccaaccattcatgcgctggagagatcgtttcttgttttgtgcagaagcaatttataaagctcagaccgagacgggtgaaattaagggacattacttgaatgctactgcaggtacatgcgaagaaatgatgaaaagggcagtatttgccagagaattgggagttcctatcgtcatgcatgactatctgacgggaggttttactgcaaatactagcttggctcattattgccgagacaatggcctacttcttcacattcaccgcgcaatgcatgcagttattgacagacaaagaaatcatggtatgcatttccgtgtactanntaaagcattgcgtatgtctggtggagatcatattcacgccggtactgtagtaggtaaacttgaaggagaacgagaagtcactctgggttttgttgatctactgcgtgatgattttattgaaaaagaccgaagtcgtggtatttatttcactcaagattgggtatctatgccaggtgttctgcccgtagcttcagggggtattcacgtttggcatatgcctgctctgaccgagatctttggggatgattctgtactacagtttggtgggggaactttgggacacccttggggnnnnncacctggnnntgtagctaattgngtnnnnctagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgctcgtgaaggtaatgaagtgatccgtgaagctagtaaatnnnnnnn---------------------------------------------------------n----- Gymno_Ephedra tcaaagattaagccatgcatgtctaagtatgaactaattcaaacggtgaaactgcggatggctcattaaatcagttatagtttctttgatggtacc-tactactcggataaccgtagtaattctagagctaatacgtgcagcaaatcccgac-ctctggaagggatgcatttattagataaaaggccgacgcgggc---tgcccgcttgttcggtgaatcatgataacttgtcggatcgcaaggcctcagtgccggcgacgcttcattcaaatttctgccctatcaactttcgacggtaggatagaggcctaccgtggttgtgacgggtgacggggaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgatacggggaggtagtgacaataaataacaataccgggctc-attgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggtcggcatggtcggtccgccttttcggtgtgcatcggccatcccgatccttctgtcggcggcgtgctcctggccttaactggctgggtcacggctccgacgcagttactttgaaaaaattagagtgctcaaagcaagcctatgctctgaatacattagcatggaataacgcgataggatttcggtcctgttgtgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactccgccggcaccttccgagaaatcagagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgacccaacacgggaaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgtcgagg--atccctcggcggacagcttcttagagggactatggccgtttagaccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcattcagcgagct-cattccctggtccgaaaggcccggggaatcttgt-aaaatgcatcgtgatggggatagatctttgcaattatcggtcttgaacgaggaattcctagtaagcgcgagtcattagctcgtgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaacgatccggtgaaatgttcggatcgcggcgacggcgacggtccgccgtgcccgacgtcgcgagaagttcattgaaccttatcgtttagaggaaggtnattggtccggnactggatgtatcctntccctctggggntatacanaatatttacaattctttgatngtgaaaggtcnanatannnccgnnnnggnnattaatattacttgtgaggnacaacanttattgggagacantacagtnagagctgtagatatgagcgcgacagacggtntgatgagaggantgaaantnattganacaggagctcntctaagagtacccntcggtnnaatgactcngggacgaatnttntanntttttggagaacnngttgataatttaggtcttatagacacacgtacaacatttcctattcatcgacccgcccctgccttttcacaattagatattaatttggcaatttttgaaacaggcattaaagtcgtggaccttttagcaccttaccgacgtggtggcaaaattggtctctttgggggagcaggagtgggtaaaacagtgctaattatggagttaatcaataacatagctaaagctcatggtggtgtttccgtttttggtggcgtaggagaacgtactcgtgaaggaaatgatctttacatggaaatgaaggaatccggagtaatcaatgaaaaaaatataatagaatccaaagtagctctggtctatggtcaaatgaatgaaccaccaggagctcgtatgagagttggtttaaccgccctaactatggcagaatatttccgagatgtgaacgaacaagatgtacttttatttatagataatattttccgctttgttcaagctggatctgaagtatccgctctattgggcagaatgccctctgctgtaggttatcaaccaacccttagtacagaaatgggttctttgcaagagagaataacttctactaaaaaggggtctataacctctatccaagcagtttatgtacctgcggacgacttgactgatcccgctcctgctacaacattcgcacatttggatgctactactgtactttctagaggattagctgccaaaggaatctacccagcagttgacccattagattccacatctactatgcttcaacctaggattgtaggtgaaaaacattatgaaattgcacaagaagtgaaacaaaccttgcaacgttacaaagaacttcaagatattatagctattcttggactagatgaattatcagaagaagaccgattaactgtagccagagcacgaaaaattgaacgttttttatcacagcccttttttgtagcagaggtttttacgggttccccagggaaatatgttagtcttattgaaacaacaagaggttttcaaatgattcttgccggagatttagatggtctccctgaacaatccttttacttgattggtaatatcgatgaagttataaaatgataagagaaatccgaaanaagtaa---cgatggatttaaagctggtgttaaagattatagattaacttattatactccagagtatcagactaaggacactgatatcttggcagcattccgagtaactcctcaacccggagtaccgcccgaggaagcaggctgggcggtagctgctgaatcttctacaggtacatggaccacagtttggactgatggtcttactagtcttgatcgttacaaaggacgatgctgtgatatcgaacctgttccgggagaagacaatcaatattttgcttatgtagcatatcctttggacctttttgaagaaggttctgttactaacatgtttacttctattgtggggaatgtttttggttttaaagccctacgcgctctacgcctagaagatttgcgaattcctactgcttatattcaaacatttcaaggtccacctcatgggatccaagtagagagagataaattaaacaaatacggacgtcctttgttgggatgtaccatcaaacctaaattaggtctatctgctaaaaactatggtagagcagtttatgaatgtcttcgtggcggactagattttactaaagatgatgaaaatgtaaattctcgagcctttatgcgttggagagatcgctttgttttttgcgcggaagctatttataaagcacaagctgaaacaggtgaaattaagggacattacttaaatgctacgtcgggtacatgtgaagaaatgataaaaagagcagtattcgcaagagaattaggggttccgattgttatgcatgattatttaacaggaggtttcactgcaaataccactttagctcattattgccgagataatggcttacttcttcatattcatcgtgcaatgcatgcagttattgatagacaaaaaaatcatggtatgcacttccgtgtactggctaaagcattacgaatgtccggtggagatcatattcatgccggtactgtcgtaggtaaacttgaaggagaacgagaaattactttaggttttgtggatttacttcgtgatgactttattgaaaaagatcgaagtcgtggtatttatttcacgcaagattgggtatctatgccaggtgttctgcctgttgcttcaggaggtattcacgtttggcatatgcctgctttgactgagatctttggagatgacgctgtattacaatttggtggaggaaccttaggacatccttggggaaatgctcccggtgccgtagctaatcgggttgctttagaagcttgtgtccaagctcgtaatgaaggacgtgatcttgctcgtgaggggaatgaagtaattcgtgaagcttgcaagtggagtcctgaactagctgctgcttgtgaagtatggaaagaaatcaagtttgatgctacagtggat----- Marattia ----agattaagccatgcatgtgtaagtataaactctcttgtactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccgactcccgactttccggaagggacgcatttattagataaaaggccgatgcgggc-t-tgcccggtgac-tggcgaatcatgataacttcccgaatcgcacggccctggcgccggcgatgtttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcccgacacggggaggtagtgacaataaataacaatactgggcttttacaagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgctgcagttaaaaagctcgtagttggatctcggggcggggcgagcggtccgccccttcggtgtgcactggtcgcccgtccttttctgtcggggacgcgctccttgccttcgctggccgggacgcggattcggcgatgttactttgaaaaaattagagtgctcaaagcaagcctatgctctgaatacattagcatggaataacgtgataggactctggtcctattgtgttggtcttcgggaccggagtaatgattaatagggatggttgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatttgcggatgttacttcgatgactccgccagcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagttacgcgaagga-tcctcttcgtggccaacttcttagagggactatggccgtctaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgaattcaacgagtt-taacacctgggccgagaggcccgggtaatcttctgaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagttttcggatcgcggcgacgccggcggttcgccgccggcgacgttgtgagaagttcattaaaccttatcat------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tcctgtcggtgaaattactcttggacgaatttttaatgttcttggagaaccagttgataatttaggacctgtcgatattggcacaacatcacctattcacaaatctgctcctgcttttacacaactagatactaaactatctatatttgaaacgggaattaaagtagtagatcttttagctccttatcgtcgtggaggaaaaattggattattcggaggagccggagtgggaaaaacagttcttattatggaattgattaataacattgccaaagctcatggaggtgtatcagtatctggtggcgtaggagaacggacccgtgaaggtaatgatctctacatggaaatgaaagaatcaaaggtaattaatcaagaaaacatttcagaatcaaaagtagctttggtatatggtcagatgaatgaaccaccaggagctcgtatgagagtcggtttaacagctccgacaatggctgaatatttcagagatgttaataaacaagatgtactattattcattgacaatatatttcgctttgttcaagcaggatcagaggtttccgctttattgggtagaatgccttctgctgtaggttatcaaccaacccttgctacagaaatgggttccttacaggaaaggattacttccactaaagaaggttctataacttccattcaagcagtttatgtaccggcagacgatttgactgatccggctcctgctacaacatttgcacattcagatgcgactactgtattatccaggggattagcagccaaaggcatttacccggctgtagatcccttagattcaacttcgactatgctacaaccctggattgtgggtgaagagcattatgagaccgcacagggggtgaaacaaactttacaacgttataaagaacttcaagatattatagctattcttggactggatgaattatcggaagaagaccgtttaacagtggctagagcacgaaaaattgaacgcttcttatcacaaccatttttcgtagcagaagtatttactggttctccaggaaaatatgttagtctgatagaaacaattaagggatttcaaatgattctttccggagaattagatagccttcctgaacaagctttttatttggtaggcaatatcgatgaagcgaccgcaaaggctgcaactttgcaagtggagaa----------------------------------------------tatactcctcagtatgagactaaggatactgatatcctggcagcattccgaatgactcctcaacctggagtaccgcctgaagaagcgggagctgcagtagctgccgaatcttctaccggtacttggactactgtatggacggatgggcttactagccttgatcgttacaaaggtcgatgctatgatatcgaacccgttgctggcgaagaaaatcaatatattgcttatgtagcttatcctttggatctattcgaagaaggttctgtcaccaatatgtttacctctatcgtaggtaacgtatttggattcaaagctttacgagctttacgattagaggacttaagaattcctcctgcttattcgaagaccttcctaggtccgcctcacggtatccaagttgaaagagataaattaaacaagtatggtcgtccactactaggatgtactatcaaaccaaaattaggtttatctgctaaaaactatggtagagctgtttatgaatgtcttcgtggtggacttgatttcacaaaagatgatgagaacgtaaattctcaaccatttatgcgttggagagatcgtttcttattcgtagcagaagctctttttaagtcccaagctgagacaggcgaagtaaaagggcactacttaaatgctactgcaggtacgtgtgaagaaatgatgaaaagagcaatctttgctagagaattgggcgcacccattgttatgcacgattatctgacaggaggatttactgcaaatacctcattggctcattattgtagagataatggtcttcttcttcatattcaccgtgcaatgcatgctgttattgacagacaacgaaatcacggtatacatttccgtgtattagctaaagcattgcgtatgtccggtggagatcatattcatgctggtacggtagtaggtaaacttgaaggagaacgtgaagtaactttaggctttgttgattcacttcgtgatgactatatcgaaaaagatcgaagtcgtggtatctatttcacccaggattgggtatctatgccgggtgtattccctgtagcttcaggtggtattcatgtttggcatatgcctgctctaactgagatttttggagatgattccgtattacaatttggtggaggaactctaggacacccttgggggaatgcacctggtgcagtagctaatcgagttgcttcagaggc---------------t-------------------------------------------------------------------------------------------------------------------------------- Angiopteris ----agattaagccatgcatgtgtaagtataaactctcttgtactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccgactcccgac-tcctggaagggacgcatttattagataaaaggccgatgcgggctt-tgcccggtgac-tggcgaatcatgataacttcccgaatcgcacggccctggcgccggcgatgtttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcccgacacggggaggtagtgacaataaataacaatactgggctt-tacaagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgctgcagttaaaaagctcgtagttggatctcggggcggggcgagcggtctgcctcctcggtgtgcactggtcgctccgtcctttctgtcggggacgcgctccttgcctttgctggccgggacgcggattcggcgatgttactttgaaaaaattagagtgctcaaagcaagcctatgctctgaatacattaacatggaataacgtgataggaccctggtcctattgtgttggtcttcgggaccggggtaatgattaatagggatggttgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatttgcggatgttacttcgatgactccgccagcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgacccaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagttacgcgaagga-tcctcttcgtggccaacttcttagagggactatggccgtctaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgaattcaacgagtt-taacacctgggccgagaggtccgggtaatcttctgaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagttttcggatcgcggcgacgccggcggtccgccgccggcgacgttgtgagaagttcattaaaccttatcat------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tcctgtcggtgaagttactctcggacgaatttttaatgttcttggagaaccagttgataatttaggacctgtcgatgctggcacaacatcacctattcacaaatctgctcctgctttcacacaattagatacgaaactatctatatttgaaacgggaattaaagtagtagatctttcagctccttatcgtcgtggaggaaaaattggattattcggaggggccggagtgggaaaaacagttcttattatggaattgattaataacattgccaaagctcatggaggtgtatcagtttttggtggcgtaggagaacggacccgtgaaggtaatgatctttacatggaaatgaaagaatcaaaggtgattaatcaagaaaacatttcagaatcgaaagtagctttggtatatggtcagatgaatgaaccaccaggagctcgtatgagagtcggtttaacagctctgacaatggctgaatattttcgagatgttaataaacaagatgtactattattcattgacaatatatttcgctttgttcaagcaggttcagaggtttccgcttcatcaggtagaatgccttctgctgtgggttatcaaccaacccttgctacagaaatgggttccttacaagaaaggattacttccacaaaagaaggttctataacttccattcaagcagtttatgtaccggcagacgatttgactgatccggctcctgctacaacatttgcacattcagatgcgactactgtactatccagaggattagcagccaaaggcatctacccggctgtagatcctttagattcaacttcaactatgctacaaccctggattgtgggtgaagaacattatgagaccgcacaaggggtgaaacaaactttacaacgttataaagaacttcaagatattatagcgattcttggactggatgaattatcagaagaggaccgtttaacagtggctagagcacgaaaaattgaacgcttcttgtcacaaccatttttcgtagcagaagtatttactggttctccagggaaatatgttagtctgatagaaacaattaagggatttcaaatgattctttccggagaattagatagccttcctgaacaagctttttatttggtaggcaatattgatgaagcgaccgcaaaggctgcaactttgcaagtggagaa----------------------------------------------tacactcctgagtatgagactaaggatactgatatcctggcagcattccgaatgactcctcaacctggagtaccgcctgaagaagcgggagctgcagtagctgccgaatcttctaccggtacttggactactgtatggacagatgggcttactagccttgatcgttacaaaggtcgatgctatgatatcgaacctgttgctggcgaagaaaatcaatatattgcttatgtagcttatcctttggatctattcgaagaaggttctgtcaccaatatgtttacctctatcgtaggtaacgtattcggattcaaagctttacgagctttgcgattagaggacttaagagttcctcctgcttattcgaaaactttccaaggtccgcctcacggtatccaagctgaaagagataaattaaacaagtatggtcgtccactactaggatgtactatcaaaccaaaattaggtttatctgctaaaaactatggtagagctgtttatgaatgtcttcgtggtggacttgattttacgaaagatgatgagaacgtcaattctcaaccatttatgcgttggagagatcgtttcttattcgtagcagaagctctttttaagtctcaagctgagacaggcgaagtaaaagggcactacttaaatgctactgcaggtacgtgtgaagaaatgatgaaaagagcaatctttgctagagaattgggcgcacccattgtcatgcacgactatctgacaggaggatttactgcaaatacttcattggctcattattgtagagataatggtcttcttcttcatattcaccgtgcaatgcatgctgttattgacagacaacgaaatcacggtatgcatttccgtgtattagctaaagctttgcgtatgtccggtggagatcatgttcacgccggtacggtagtgggtaaacttgagggagaacgtgaagtaactttaggcttcgttgattcacttcgtgatgactatatcgaaaaagatcgaagtcgtggtatctatttcactcaggattgggtatctatgccgggtgtattccccgtagcttcaggtggtattcatgtctggcatatgcctgctctaactgagattttcggagatgattctgtattacaatttggtggaggaactctaggacacccttgggggaatgcacctggtgcagtagctaatcgagttgcttcagaggc---------------t-------------------------------------------------------------------------------------------------------------------------------- Ophioglossum ----agattaagccatgcatgtgtaagtataaactctcttgtactgtgaaactgcgaatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccgactcccgac-ttccggaagggacgcatttattagataaaaggccgatgcgggc-t-tgcccggtgatgcggtgactcatgataactgtgcggatcgcacggcccttgcgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcccgacacggggaggtagtgacaataaataacaataccgggcttttacaagtctggtaattggaatgagtacaatctaaacaccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatctcggggcggggcgggcggtccgcccctcgggtgtgcactgcgcgctccgccctttctgccggggacgcgctcctggccttaggtggctgggacgcggattcggcgatgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacgttagcatggaataacgcgacaggactctggtcctattgtgttggtcttcgggaccggagtaatgattaatagggacggttgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaactactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggcggatgttacttcgatgactccgccagcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagtgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagttacgcgaagct-cagccttcgcggcgaacttcttagagggactgtggccgtctaggccacggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgaattcaacgagtc-cgccgcctgggccgagaggcccgggtaatcttctgaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgctgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagttttcggatcgcggcgacgccggcggtccgtccgccgcgacgttgtgagaagttcattaaaccttaccat------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tcccgttggtgaatccactcttggacgaatatttaatgttctaggagaacctgtcgatgagttgggtcccgtagatgctgacgaaacatctcctattcacaaacctgctcctgctttcacacagttggataccaaattatccatatttgaaaccgggattaaagtggtggatctcttagctccttatcgtcgtggtggaaaaatcggattgtttgggggagccggagttggaaaaacggttcttatcatggaattgattaacaacattgctaaagcccacggaggtgtatctgtatttggtggggtaggggaacgtacacgcgaaggaaatgatctctatatggaaatgaaagaatcaaaagttattaatgaacagaatgtctcggaatcaaaagtagctctggtatatggtcaaatgaatgaatcgcccggagctcgtatgagggttggtttaaccgcgttaacaatggccgagtattttcgggatgttaataaacaagatgtactcctatctattgataatattttccgtttcgtacaagcaggatccgaggtttctgccttattggggagaatgccctccgctgtaggttaccaaccgactcttagtacagagatgggttccttacaagaaaggatcacttctaccaaggaaggatccataacttccattcaagcggtttatgtacctgccgacgatttgactgacccagcccctgccacaacatttgcacatctagatgctaccactgttctctcaagaggattagctgcgaagggtatttatccggccgtggatccactagattcaacttcaaccatgttacaacccttgattgtgggtgaggaacattataagactgcgcagggagttaaacagactctgcaacgttataaggaactccaagacattatagctattctcggactggatgaattatcggaagaggaccgtttaacggtagctagagcacgaaagattgaacgtttcttatcacagcctttctttgtagcagaagtattcacgggctctccgggcaaatatgttagtctcgtaaaaacaatcaaaggtttccaaatgattctttccggagaattagacaaccttcccgaacaagctttttattcagtgggtgacatcgatgaagcagctgcaaaagctgcaatttcgcaagcggggaa----------------------------------------------tacactcccgattatgagcctaaggataccgatatcctagcagcctttcgaatgactccccaacctggagtgccggccgaggaagcaggagctgcagtagctgctgaatcctccacgggtacgtggactaccgtatggaccgatgggcttaccagtctcgatcgttacaaaggtcgatgctatgaaatcgaacctgttgctggggaggaagatcaatacattgcttatgtagcgtatcccttagacctttttgaagaaggttccgtcaccaacatgttcacctccattgtaggtaacgtattcggattcaaggcattgaaagctctacggttggaggatttacgagttcctcctgcttattctaagactttcatgggccctccccacggtatccaagtcgaaagggataaattaaacaaatatggtcgtcccttactggggtgtaccatcaaacccaaattgggattatctgccaagaattatggtagagccgtttatgaatgcttacgcggtgggctcgacttcaccaaagatgatgaaaacgtaaattctcaaccatttatgcgttggagagatcgtttcgtatttgtggcggaagctcttttcaaatctcaggcggaaacgggagagattaaggggcattacttaaatgctaccgcaggtaattgtgatgaaatgatgaaaagagcagtatttgctcgagaattgggagtacccattgtcatgcacgattatttgacgggaggatttactgcaaatactaccttagcttcctactgccgagacaatggtttgctccttcacattcaccgtgcaatgcatgctgttatcgataggcaaaaaaatcacggtatgcacttccgtgtattggccaaagcattgcgcatgtctggcggggatcacattcatgccggtaccgtggttggtaaactcgagggcgaacgcgagatcactttaggtttcgttgatctacttcgtgacgattatattgataaagatcgaagtcgaggtatctatttcacccaggattgggtatccatgccgggtgtatttcctgtagcttcgggaggtattcacgtttggcatatgcctgctctaaccgagatcttcggggatgattccgtacttcaatttggtggggggactctgggacacccatggggtaatgcacccggtgcagtagctaatcgagtcgctctggaagc---------------t-------------------------------------------------------------------------------------------------------------------------------- Fagales_Juglans tcnaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattagataaaaggtcgacgcgggctt-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccatcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgattgtaggatagaggcctacaatggtggtgacgggtaacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctcttacgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggttgggcagagcggtccgcccc-t-ggtgtgcaccggtctgctcgtcccttctaccggcgatgcgctcctggccttaactggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcataggatttcggtcctattgtgttggccttcgggatcggagtaatgattaacaggaacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctttaaggactccgccggcaccttatgagaaatcaaagtctttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtncatgnccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggaggt-gaccttccgcggccagcttcttagagggactatggccgcttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtt-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgaggcgatgtgggcggttcgctgccggcaacgtcgcgagaagtccactgnaccttatcatntagngg----ttattggtccggtactggatgtatcttttccccccggcaaaatgcctaatatttacaacgctctagtagttaagggtcgagatactaccggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgcgttagagctgtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacgggagcttctttaagcgttccagtcggcggagcaactctaggacgaattttcaacgtgcttggagagcctgttgacaatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcctgcctttatacagttagatacaaaattatctatttttgaaacaggaattaaagtagtagatcttttagctccttatcgccgtggaggaaaaataggactattcgggggagctggagtgggtaaaacagtactcattatggaattgatcaacaacattgccaaagctcatgggggtgtatccgtatttggcggagtaggtgaacgtactcgtgaaggaaatgatctttacatggaaatgaaagaatctggagtaattaatgaacaaaatattgcagaatcaaaagtggctctagtatatggtcagatgaatgaaccgcctggagctcgtatgagagttggtttaactgccctaactatggcagaatatttccgagatgttaatgaacaagacgtacttctatttatcgacaatatcttccggttcgtccaagcaggatccgaagtatctgccttattgggtcgaatgccttccgctgtgggttatcaacccactcttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagcgggatccataacctctattcaagcagtttatgtacctgcagacgatttgaccgatcctgctcctgccacgacatttgcacatttagatgctactaccgtactatcaagaggattagctgccaaaggtatctatccagcagtagatcctttagattcaacgtcaacgatgctccaacctcggatcgttggtgaagaacattatgaaactgcgcaaagagttaaacaaactttacagcggtataaagaacttcaggacattatagctattcttggattggacgagttatcagaagaggatcgcttaaccgtagcaagagcacgaaaaattgagcgtttcttatcacaaccttttttcgtagcagaagtatttacgggttccccgggaaaatatgtcggtttagccgaaaccattagagggtttcaattgatcctttccggagaattagacggtcttcctgagcaggctttttatttggtaggtaacattgatgaagctactgcgaaggctacaaacttagaaatggagagaagtgttggattcaaagctggtgttaaagattataaattgacttattatactcctgaatatcaaaccaaagatactgatatcttggcagcgttccgagtaagccctcaacctggagttccgcctgaggaagcaggggcagcagtagctgctgaatcttctactggtacatggacaactgtgtggaccgatgggcttactagtcttgatcgttacaaaggacgatgctaccacatcgagccagttgctggagaagaaaatcaatttattgcttatgtagcttaccccttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttggattcaaggccctgcgcgctctacgtctggaggatttgcgaatccctcctgcttattctaaaactttccaaggcccgcctcatggaatccaagttgagagagataaattaaacaagtatggccgccctctattgggatgtactattaaacctaaattgggattatccgctaagaattacggtagagcagtttatgaatgtctccgcggtgggcttgattttaccaaagatgatgagaacgtgaattcccaaccatttatgcgttggagagaccgtttcctattttgtgccgaagcaatttataaagcgcaggctgaaaccggtgaaatcaaagggcattacttgaatgctactgcaggtacatgcgaagaaatgatcaaaagggctgtatttgccagagaattgggagttcctatcgtaatgcatgactacttaaccgggggatttactgcaaatactagcttggctcattattgccgagataatggtctacttcttcacatccatcgtgcaatgcatgcagttattgatagacagaagaatcatggtatacactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatattcacgctggtaccgtagtaggtaaacttgaaggggaaagagaaatcactttaggctttgttgatttactacgtgatgattttgttgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctctacctggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcctgctctgaccgaaatctttggagatgattccgtactacaattcggtggaggaactttagggcacccttggggaaatgcacccggtgccgtagctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgtgaggctagtaaatggagtcctgagctagcggctgcttgtgaagtatggaaggagatcaaatttgaattcccagcaatggatac Rosales_Morus tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtact-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattagataaaaggtcgac---ggctc-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccattgtgccggtgacgcatnattcaaatatctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tacgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggttgatcggtccgcctc-c-ggtgtgcaccggtcgactcgtcccttctgccggcgatgcgctcctggccttaattggccgggtcgtgcctccggcgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcataggatttcggtcctattctgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaacagtttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgcttttaggactctgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagactgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctat-cggagga-taccctccgcggccagcttcttagagggactatggccgcttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgataggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgaggcgacatgggcggttcgctgcctgtgacgttgcgagaagtccactgaaccttatcatttngaggaaggtcattggtccggtactagatgtagcttttcccccgggcaagatgcctaatatttacaacgctctggtagttwaaggtcgagatactgttggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatggtctaatgagaggaatggaagtgattgacacaggagctcctataagtgttccagtcggcggagcgacgctaggacgaattttcaacgtgcttggagagcccattgataatttaggtcctgtagatactcgcacaacatctcctattcatagatctgcgcctgcctttatacaattagatacaaanttatctatttttgaaacaggaattaaagtagtagatcttttagccccttatcgtcgtggaggaaaaataggactattcgggggggctggagtaggtaaaactgtactcattatggaattgatcaacaacattgccaaagctcatggaggtgtatccgtatttggcggagtaggtgagcgtacccgtgaaggaaatgatctttacatggaaatgaaagaatccggcgtaattaatgaacaaaatattgcagaatcaaaagtggctctagtctacggtcagatgaatgaaccgccgggggctcgtatgagagttggtttaactgccctaactatggcggagtattttagagatgttaatgaacaagacgtacttctatttatcgacaatatctttcgttttgtccaagcgggatccgaagtatccgccttattgggtagaatgccttctgctgtgggttatcaacccactcttagtaccgaaatgggttctttacaagaaagaattacttctaccaaagaggggtccataacttctattcaagcagtttatgtacctgcggacgatttgaccgatccagctccggccacgacatttgcacatttagatgctactaccgtactatcaagaggattggccgccaaaggcatctatccagcagtagatcctttagattcaacgtcaactatgctccaacctcggattgttggtgaagaacattatgaaactgcccaaagagttaaacaaactttacaacgttacaaagaacttcaggacattatagctatccttgggttggacgaattatccgaagaagatcgcttaaccgtagcaagagcacgaaaaattgagcgtttcctgtcacaacctttttttgtagcagaagtatttaccggttccccagggaaatatgttggtctagcagaaacaattagagggtttaaattgatcctttctggagaattagatggtcttcctgaacaggctttttatttggtaggtaacattgatgaagctactgcgaaggc-------------------------gttggattcaaagctggtgttaaagattataaattgacttattatactcctgactatgaaaccaaagatactgatatcttggcagcatttcgagtaactcctcaacctggagttccacctgaagaagcaggggcagcggtagctgctgaatcttctactggtacatggacaactgtatggactgacgggcttactagtcttgatcgttacaaaggtcgatgctaccacatcgagcccgttgctggagaagaaagtcaatttattgcttatgtagcttaccccttagacctttttgaagagggttctgttactaacatgtttacttccattgtaggtaatgtgtttgggttcaaggccctgcgcgctctacgtctggaggatttgcgaatccctactgcttatgttaaaactttccaaggcccgcctcatgggatccaagttgagagagataaattgaacaagtatggccgccccctattgggatgtactattaaacctaaattggggttatccgctaagaattacggtagagcagtttatgaatgtctccgcggtggacttgattttaccaaagatgatgagaatgttaattcccaaccatttatgcgttggagagaccgtttcttattttgtgccgaagcaatttataaagcacaggctgaaacaggtgaaatcaaagggcattacttgaacgctactgcaggtacatgcgaagatatgatgaaaagagctgtatttgccagagaattgggggttcctatcgtaatgcatgattacttaacagggggattcactgcaaatactagcttggctcattattgccgagataatggtttacttcttcacatccaccgtgcaatgcatgcagttattgatagacagaagaatcatggtatgcactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatatacacgctggtaccgtagtaggtaaacttgagggggaaagggagatcactttaggctttgttgatttactacgtgatgattttgttgaaaaagatcgaagccgcggtatttatttcactcaagattgggtctctatgccaggtgttttgcctgtagcttcagggggtattcacgtttggcatatgcctgctctgaccgagatctttggagatgattctgtactacaatttggcggcggaactttaggacacccttggggaaatgcacctggtgccgtagctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgcgaggctagtaaatggagtcctgaactagctgctgcttgtgaagtatggaaggagatcaaatttgaatt--------------- Rosales_Humulus tcaaagattaagccatgcatgtgtaagtatgaactaattcagactgtgaaactgcgaatggctcattaaatcagttatagtttgtttgatggtatc-tgctactcggataaccgtagtaattctagagctaatacgtgcaacaaaccccgac-ttctggaagggatgcatttattagataaaaggtcgacgcgggctc-tgcccgttgctctgatgattcatgataactcgacggatcgcacggccttcgtgccggcgacgcatcattcaaatttctgccctatcaactttcgatggtaggatagtggcctactatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaataccgggctc-tacgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggttgggtcgatcggtccgcctc-c-ggtgtgcaccggtcggctcgtcccttctaccggcgatgcgctcctggccttaattggccgggtcgtgcctccggtgctgttactttgaagaaattagagtgctcaaagcaagcctacgctctgtatacattagcatgggataacatcataggatttcggtcctattctgttggccttcgggatcggagtaatgattaacagggacagtcgggggcattcgtatttcatagtcagaggtgaaattcttggatttatgaaagacgaacaactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggattggcggatgttgcttttaggactccgccagcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctatgcggagga-tttcctccgcggccagcttcttagagggactatggccgcttaggccaaggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tatagccttggccgacaggcccgggtaatctttg-aaatttcatcgtgatggggatagatcattgcaattgttggtcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttcggatcgaggcgacgtgggcggttcgctgcccgcgacgtagcgagaagtccactgaaccttatcatttagaggaaggtcattggtccggtactggatgtagcttttccgccggggaaaatgcctaatatttacaatgctctggtagttaagggtcgagatactgttggtcaacaaattaatgtgacttgtgaagtacagcaattattaggaaataatcgagttagagctgtagctatgagtgctacagatggtctaatgagaggaatggacgtgattgacacaggagctcctttaagtgttccagtcggcggagcgacactaggacgaattttcaacgtacttggggagcccgttgataatttaggtccggtagatactcgcacaacatctcctattcatagatctgcacctgcctttatacaattagatacaaaattatcgatttttgaaacaggaattaaagtagtagatcttttagccccttatcgccgtggaggaaaaataggactcttcgggggtgctggagtaggtaaaacagtactcattatggaattgatcaacaacattgccaaagctcatgggggcgtatccgtatttggcggagtaggtgaacgtacccgtgaaggaaatgatctttacatggaaatgaaagaatctggcgtaattaatgaacaaaatattgccgaatcaaaagtggctctagtctatggtcagatgaatgaaccaccaggggctcgtatgagagttggtttaactgctctaactatggcggagtatttccgagatgttaatgaacaagacgtacttctatttatcgacaatatctttcgttttgtccaagcaggatccgaagtatccgccttattaggcagaatgccttccgctgtgggttatcaacccactcttagtactgaaatgggttctttacaagaaagaattacttctaccaaagaggggtccataacttctattcaagcagtttatgtacccgcggacgatttgaccgatccagctccggccacgacatttgcacatttagatgcgactaccgtactatcaagaggattggccgccaaaggcatctatccagcagtagatcctttagattcaacgtcaacgatgctccaacctcggattgttggtgaagaacattatgaaactgcgcaaagagttaaagaaactttacaacgttacaaagaacttcaggacattatagctattcttgggttggacgaattatccgaagacgatcgcttaaccgtagcaagagcacgaaaaattgagcgtttcttgtcacaaccttttttcgtagcagaagtatttacaggttccccggggaaatatgttggtctagcagaaacaattaaagggtttaaattgattctttctggagaattagatggtcttcctgaacaggctttttatttggtaggtaacattgatgaagctactgcgaaggctacgaacttagaaatggagaaaagtgttggattcaaagctggtgttaaagattataaattgacttattacactccggactatgaaaccaaagatactgatatcttggcagcatttcgagtaactcctcaacctggagttccccctgaagaagctggggctgcggtagctgctgaatcttctactggtacatggacaactgtatggactgacgggcttaccagccttgatcgctacaaaggtcgatgctaccacatcgagcccgttgctggagaagaaaatcaatatattgcttatgtagcttatcctttagacctttttgaagaaggttctgttactaacatgtttacttccattgtgggtaatgtatttgggttcaaagccctgcgcgctctacgtctggaagatttgagaatccctacttcttatactaaaactttccaaggtccgcctcatgggatccaagttgagagagataaattgaacaagtatggccgcccactattgggatgtactattaaacctaaattggggttatccgctaagaattacggtagagcagtttatgaatgtcttcgtggtggacttgattttaccaaagatgatgagaacgtgaattcccaaccatttatgcgttggagagaccgtttcttattttgtgcagaagcaatttataaatcacagtctgaaacaggggaaatcaaaggacattacttgaatgctactgcaggtacatgtgaagaaatgatgaaaagggctgtatttgccagagaattgggagttcctattgtaatgcatgattacttaacaggaggattcactgcaaatactagcctggctcattattgtcgagataatggtctacttcttcacatccaccgtgcaatgcatgcagttattgatagacaaaagaatcatggtatacactttcgtgtactagctaaagcgttacgtatgtctggtggagatcatatccatgcgggtactgtagtaggtaaacttgaaggggaaagagaaatcactttaggctttgttgatttactacgtgatgattttattgaaaaagatcgaagccgtggtatttatttcactcaagattgggtctctctaccaggtgttctgcccgtggcttcagggggtattcacgtttggcatatgcccgctttgaccgagatctttggagatgattccgtactacaatttggtggaggaactttaggacatccttggggaaatgcacccggtgctgtcgctaatcgagtagctctagaagcatgtgtacaagctcgtaatgagggacgtgatcttgctcgtgagggtaatgaaattattcgtgaggcttgtaaatggagtcctgaactagctgctgcttgtgaagtttggaaggaaatcaaatttgaatttgaagcaatggatac Gymno_Cycas tcaaagattaagccatgcatgtgttggtatgaactatgtcggactgtgaaactgcgaatggctcattaaatcagttatagtttatttgatggattcatgttactcggataaccgtagtaattctagagctaatacgtgtaccaaatcctgac-ttttggaagggaggcatctattagataaaaggccgatgcgggctc-tcgccggtcgttcggtgattcatgataactcgacggatcgcatggccctagtgccggcgacgtttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatttaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggacggcccgaccggtctgcctttc-ggtgtgcatcgatcgtttcgtcctttttgtcggcggcgcgttcctggacttagttgcctgggttgcggctctggcgttgttactttgaaaaaattagagtgctcaaggcaagcccacgctctgaatacattagcatggaataacacgataggattctggtcctattacgttggccttcgggaccggagtaatgattaatagggacagtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatgaaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgactagggatcggtggatgttgctctaaggactccgccggcaccttatgagaaatcaaagtttttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcagaggg-tttcctttgcggccagcttcttagagggactatggccgttcaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgtattcaacgagtc-tataaccttggccgagaggttggggtaatctgtggaaatttcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcaacacgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcggatcgcggcgacgacggcggtttgctgctgccgacgtcgcgagaagttcattgaaccttattatttagaggaagg-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------tccggttggtggagctactctcggacgaattttcaatgttattggagaacctgtcgataatttaggtcctgtagatgctcgcacaacatctcctattcatagacccgctcctgcctttatacagttggatacaaagttatcaatcttcgaaacaggcattaaagtggtggatcttttagctccttaccgccgtggaggaaaaataggactattcgggggagctggggtaggtaaaacagtgctcatcatggaattaatcaacaatattgctaaggctcatggaggtgtatctgtatttggcggagtaggagaacgcacccgtgagggaaatgatctttacgttgaaatgaaagaatcgggagtaattaatgaacaagatatctcgggatcgaaagtagctctggtctatggccagatgaatgaaccaccaggagctcgtatgagagttgggttaaccgccctaaccatggctgaatatttccgagatgtcaatgagcaagacgtacttttatttatcgacaatatcttccgttttgtccaagcgggatcagaagtatctgcattattaggcagaatgccttccgctgtgggttatcagccaactcttagtacagaaatgggttctttgcaggaaagaattacttctaccaaagagggatctataacctccattcaagcagtttatgtacctgcagacgatttgaccgaccccgctcctgctacaacatttgcacatttagatgctactaccgtattatcgagaggattagctgccaaaggcatctatccagcagtagatcctttagattcaacatcgaccatgctccaaccttggatcgtgggcgaagaacattatgaaactgcacaaggagtcaagcaaactttacagcgttataaagaacttcaagacattatagctattcttggactggacgaattatcagaagaagatcgtttaaccgtagcaagagcacgaaagattgaacgtttcttatcacaacccttttttgtagcagaggtattcactggttccccgggtaaatatgtcggtctcgtagaaacaattagaggttttaaaatgatcctttccggagaattagatggtcttcccgaacaggccttttatttggtgggtaacattgatga----------------------------------ag----gttggatttaaagctggtgttaaagattacagattaacttattacactcctgaatatcaaaccaaagataccgatatcttggcagcgttccgagtaactcctcaacctggagtgccgcctgaggaagcgggagctgcagtagccgctgaatcttccactggtacatggaccactgtttggaccgatggacttaccagtctcgatcgttacaaggggcgatgctatgacatcgagcccgttcctggggagaaaaatcaatttattgcctatgtagcttaccccttagacctctttgaagaaggttctgttactaacatgttcacttccattgtaggtaatgtatttggattcaaagccctacgagctctacgcctagaagatttgcgagttcctcctgcttattccaaaactttccaaggtccacctcatggtatccaagttgaaagagataaattaaacaaatatggccgtcctctattgggatgtactattaaacccaaattgggtttatctgccaaaaactatggtagagcagtttatgaatgtcttcgtggtggacttgattttaccaaagatgatgagaacgtaaattcccaaccatttatgcgctggagagatcgtttctgcttctgtgcagaagcaatttataaagctcaggctgagacgggtgaaattaagggacattacttgaatgctactgcaggtacatgcgaagaaatgatcaaaagggcagtatttgccagagaattgggggttcctatcgtcatgcatgactacctgacgggaggatttactgcaaataccagcttggctcattattgccgagacaatggcctacttcttcacattcaccgcgcaatgcatgcagttattgacagacaaagaaatcatggtatgcacttccgtgtgctagctaaagcattgcgaatgtccggtggagatcatattcacggcggtactgtagtaggtaaacttgaaggagaacgagacgtaactttgggttttgttgatctactgcgtgacgattttattgaaagagaccgaagtcgtggtatttatttcacccaagattgggtatctatgccaggtgttctgcccgtagcttcggggggtattcacgtttggcatatgcctgctctaaccgagatctttggggatgattccgtactacagttcggtgggggaactttgggacacccttggggaaatgcacctggtgcagtagcgaatcgagttgccttagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgctcgtgaaggtaatgaagtgatccgcgaagctagtaaatggagtcc---------------------------------------------------------c----- Gymno_Araucaria tcaaagattaagccatgcatgtctaagtatgaactatttcagactgtgaaactgcggatggctcattaaatcagttatagtttctttgatggtaccttgctactcggataaccgtagtaattctagagctaatacgtgcaccaagtcccaac-tttcggaagggatgcatttattagataaaaggccggcgcgggctt-cggcccgcgttccggtgattcatgataactcgacggatcgcacggcccttgtgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaaccccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggtcgtcacggtcggtccgccttcttggtgtgcaccggccctcacgtcccttctgccggcggcgtgttcctgtccttaactggttgggtcgcggcaccggcgctgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgtgataggagtctggtcctattccgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatggaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctctaaggactccgccagcaccttctgagaaatcagagtgtttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgacagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgataacgaacgagacctcagcctgctaactagctacgcggaggt-tccccttcgcggccagcttcttagagggactatggccgtttaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcaatcaacgagctttctgccctggttcgataggcccgggaaatcttgtgaaattgcatcgtgatggggatagaccattgcaattattgatcttcaacgaggaattcctagtaaacgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatggtccggtgaagtgttccgatcgcgacgacgatggcggtcctctgccggcgacgtcgcgagaagttcattgaaccttatcatttagaggaagg-----------------------------------------------------------------------------------------------------------------------------------------------gttagagctgtagctatgagtgctacagatggtttgatgagaggaatgaaagtgtttgatacaggagctcctctgagtgttccagttggtggagctactctcggacgaatttttaatgttcttggagaacctgtcgatgatttaggtcctgtagatgctcgcgcaaaatcccctattcatagagctgctcctgcctttacacagttggataccaaattttcaatttttgaaacaggcattaaagtagtggatcttttagctccttatcgccgcgggggaaaaataggattatttgggggagctggagtgggtaaaacagtactcattatggagttaatcaacaacattgctaaggctcatgggggtgtatctgtatttagcggggtaggagagcgtacccgtgaaggaaatgatctttatatggaaatgaaagaatcgggagtcattcaggaacaaaatatctcagaatccaaagtagctctggtctatggtcagatgaacgaaccaccaggagctcgtatgagagtcgggttaactgctttaacgatggcggaatatttccgagatgtaaataagcaagatgtactattatttattgacaatatcttccgctttgtccaagcaggatcagaggtatccgccttattaggaagaatgccttctgctgtgggttatcagccgactcttggcacggaaatgggttgtttgcaagagagaataacttctaccaaagagggatctataacctccattcaagcagtttatgtacctgcggacgacttgactgatcctgctcctgctacaacatttgcacatttagacgctactaccgtgctatcacgaggattagctgccaagggtatctatccagcggtagatcctttagattcaacatcaactatgctccaaccttcgatcgttggcgaagaacattatgaaattgcacaaggagttaaacaaactttgcaacgttataaggaacttcaagacattatagctattcttggactggacgaattatcagaagaggatcgtttaacagtagcaagagcacgaaaaattgaacgtttcttgtcacaaccctttttcgtagcagaggtattcactggttccccgggtaaatatgttagtctcacagaaacaattagaggctttcaaatgattctttccggagaattagacggtctccctgaacagtctttttatttggtgggtaacattgatga----------------------------------ag----gttggatttaaagctggtgttagagattatagattaacttattatactccggaatatcagacccttgatacggatatcttggcagcattccgagtcactcctcaacccggagtgccccccgaggaagcaggagcagcagtagcggctgaatcttctaccggtacatggacaactgtttggaccgatggacttaccagtcttgatcgttacaaggggcgatgctatggcatcgagcctgttcctggagaggaaactcaatttattgcctatgtagcttaccccttagacctttttgaagaaggttctgttaccaacctgttcacttccattgtaggtaatgtatttggattcaaagccctacgggctctacgtctggaagatctgcgaattcctcctgcttattccaaaactttccaaggtccaccccatggtattcaagttgaaagagataaattaaacaaatatggccgtcccttgttggggtgtactatcaaaccaaaattgggtctatctgccaaaaattatggtagagcagtttacgaatgtctccgcggtggacttgattttaccaaggatgacgagaacgtgaattcccaaccattcatgcgctggagagatcgttttgtcttttgtgcagaagcaatttataaagctcaggcggagacgggtgaaattaaggggcattacttgaatgctactgcaggtacatgtgaagaaatgatgaaaagagtaagtttcgcctatgaattgggagttcccatcgtcatgcatgactatctgacgggaggttttacggcaaatacttcgttggctcattattgccgagatcatggcctacttcttcatattcaccgcgcaatgcatgcagttattgacagacaaaaaattcatggtatgcactttcgtgtgctggctaaagcattgcgtatgtctggcggagatcatgttcacgctggtactgtagtaggtaaacttgaaggtgaacgagaagttactttaggttttgttgatttactacgtgatgattttattgaaaaagaccgaagtcgtggtatttattttactcaagattgggtatctatgccaggtgttttgcctgtagcttcagggggtattcacgtttggcatatgcctgctctgaccgagatctttggggatgattctgtattacagtttggtgggggaactttgggacacccttggggaaatgcacctggtgcagtagctaatcgggtcgctttagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgctcgtgaaggtaatgaaattatccgtgaagcagctaaatggagtcc---------------------------------------------------------t----- Gymno_Sciadopitys tcaaagattaagccatgcatgtctaagtatgaactatttcaaactgtgaaactgcggatggctcattaaatcagttatagtttctttgatggtaccttactactcggataaccgtagtaattctagagctaatacgtgcaccaactcccgac-ttctggaagggacgcatttattagatacaaggccggcgcgggc-t-tgcccgctactccggtgattcatgataactcgacggatcgcacggccctggtgccggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggatcttgggccgttacggtcggtccgcctactcggtgtgcactggccatgacgtcccttctgccggcggcgtgctcctggccttagttgactgggtcgcggttccggcgccgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgcgataggagtctggtcctgttccgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatggaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctctaaggactccgccagcaccttctgagaaatcagagtgtttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggaggt-tctccttcgcggccagcttcttagagggactatggccgtttaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcaaccaacgagttctttgccctggttcgaaaggcccgggaaatcttgccaaattgcatcgtgatggggatagaccattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcagatcgcgccgacggcggcggttctctgccggcgacgtcgcgagaagttcattgaaccttatcatttagaggaagg-----------------------------------------------------------------------------------------------------------------------------------------------gttagagctgtagctatgagtgctacagatggtttgaaaagaggaatgagagtgattgatacaggagctcctcttagtgttcctgtcggtgaagctactctcggaagaatttttaatgttcttggagaacctgtcgatgatttaggtcctgtagatactcctaaaacatctcccattcatagatctgctcctgcttttacacagttggataccagattttcaattttcgaaacaggcattaaagtagtggatcttttagctccttaccgtcgtgggggaaaaattgggctatttgggggagcaggagtgggtaaaacagtactgattatggagttaatcaacaacattgctaaggctcatgggggtgtatctgtatttggtggagtaggagagcgtacccgtgaaggaaatgatctttacaaggaaatgaaagaatcgggagtaattaatgaacaaaatatctcagaatccaaagtagctctggtctatggtcagatgaatgaaccaccaggagctcgtatgagagtcgggttaactgccctaactatggctgaatatttcagagatgttaataagcaaaacgtactattatttattgataatatcttccgctttgtccaagcagggtcagaggtatctgccttattaggcagaatgccttccgccgttggttatcaaccaactcttagtacggaaatgggttctttgcaagagagaatcacctctaccaaagatggatctataacttccatccaagcagtttatgtacctgcagacgacttgaccgaccctgctcctgctacaacatttgcacatttagatgctactaccgtactatcgagaggattagctgccaagggcatctatccagcggtcgaccctttagattcaacgtcgactatgctccaaccttcgatcgtgggcaaagaacattatgaaactgcacaaggggttaagcaaacttt--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------g----gttggattcaaagctggtgttaaagattacagattaacttattatacccctgaatatcagaccaaagacactgatatcttggcagcattccgagtcactcctcaacccggagtgcctcctgaggaggcaggannngcagtagctgccgaatcttccactggtacatggaccactgtttggaccgatggactcaccagtcttgatcgttacaaggggcgatgctatgacatcgagcccgttcctggagaggaaagtcaatttattgcctatgtagcttatcccttagatctttttgaggaaggttctgttactaacatgttcacttctattgtaggtaatgtatttggattcaaagccctacgggctctacgtctggaagatctgcgaattcctcctgcttattcaaaaactttccaaggtccgccccatggtatccaagttgaaagagataaattaaacaaatatggtcgccctttattggggtgtactatcaaaccaaaatgtggcctatctgccaaaaattatggcagagcagtttacgaatgtcttcgcggtggacttgattttaccaaagatgatgagaacgtgaattcccaaccattcatgcgctggagagaccgtttttgcttttgtgctgaagcaatttataaagctcaagctgaaacgggtgaaattaagggacattatttgaatgctactgcaggtacatgtgaagaaatgatcaaaagagcagtattcgccagagaattgggagtccccatagtcatgcatgactatctgacgggaggttttacggcaaatacttcgttgtctcattattgccgagacaacggcctacttcttcacattcaccgcgcgatgcatgcagttattgacagacaaagaaatcatggtatgcatttccgtgtgctggctaaagcactacgtatgtctggtggagatcatattcacgctggtactgtagtaggtaaacttgaaggagaacgagaagtcactttgggttttgttgatttactgcgtgatgattttattgaaaaagatcgaagccgtggtatttatttcactcaagattgggtatctatgccaggtgttttgcctgtggcttcagggggtattcacgtttggcatatgcctgctctgactgagatctttggggacgattctgtattacagttcggtgggggaactttggggcatccgtggggaaatgcgcctggtgcagtagctaatcgagtcgctttagaagcttgtgtacaagctcgtaatgaaggacgcgatcttgctcgtgaaggtaatgaagtgatccgtgaagcttgtaaatggagtcc---------------------------------------------------------t----- Gymno_Juniperus tcaaagattaagccatgcatgtctaagtatgaactatttcagactgtgaaactgcggatggctcattaaatcagttatagtttctttgatggtactttgctactcggataaccgtagtaattctagagctaatacgtgcaccaaatcccgac-tcttggaagggatgcatttattagataaaaggccggcgcgggc-t-cgcccgctattccggtgattcatgataactcgacggatcgcacggcctttgtgctggcgacgcttcattcaaatttctgccctatcaactttcgatggtaggatagaggcctaccatggtggtgacgggtgacggagaattagggttcgattccggagagggagcctgagaaacggctaccacatccaaggaaggcagcaggcgcgcaaattacccaatcctgacacggggaggtagtgacaataaataacaatactgggctc-atcgagtctggtaattggaatgagtacaatctaaatcccttaacgaggatccattggagggcaagtctggtgccagcagccgcggtaattccagctccaatagcgtatatttaagttgttgcagttaaaaagctcgtagttggaccttgggtcgtcacggtcggtccgcctttttggtgtgcactggccctcacgtcccttctgccggcggcgtgttcctggccttaattggctgggtcgcggttccggcgccgttactttgaaaaaattagagtgctcaaagcaagcctacgctctgaatacattagcatggaataacgcgataggagtctggtcctgttccgttggccttcgggaccggagtaatgattaatagggactgtcgggggcattcgtatttcattgtcagaggtgaaattcttggatttatggaagacgaaccactgcgaaagcatttgccaaggatgttttcattaatcaagaacgaaagttgggggctcgaagacgatcagataccgtcctagtctcaaccataaacgatgccgaccagggatcggcggatgttgctctaaggactccgccagcaccttctgagaaatcagagtgtttgggttccggggggagtatggtcgcaaggctgaaacttaaaggaattgacggaagggcaccaccaggagtggagcctgcggcttaatttgactcaacacggggaaacttaccaggtccagacatagtaaggattgacagattgagagctctttcttgattctatgggtggtggtgcatggccgttcttagttggtggagcgatttgtctggttaattccgttaacgaacgagacctcagcctgctaactagctacgcggaggt-tccccttcgcggccagcttcttagagggactatggccttctaggccatggaagtttgaggcaataacaggtctgtgatgcccttagatgttctgggccgcacgcgcgctacactgatgcaaccaacgagtttctctccctggcccgaaaggtttgggaaatcttgccaaattgcatcgtgatggggatagatcattgcaattattgatcttcaacgaggaattcctagtaagcgcgagtcatcagctcgcgttgactacgtccctgccctttgtacacaccgcccgtcgctcctaccgattgaatgatccggtgaagtgttcggatcgcggcgacgacggcggtt-cctgtcggcgacgtcgcgagaagttcattgaaccttatcatttagaggaagg-----------------------------------------------------------------------------------------------------------------------------------------------gttagagctgtcgctatgagtgctacagacggtttgatgagaggaatgaaagtaattgatacaggagggccacttagtgttccagttggtgaaactactctcgggagaatttttaatgttcttggggaacccgttgataacttaggtcctgtagatgctctcacaagatctcctattcatagatctgctcccgcctttacacagttggataccaaattttcaatctttgaaacaggcattaaagtagtggatcttttagctccttatcgccgtggggggaaaattggattattcgggggagctggagtgggtaaaacagtgttgattatggaattaatcaacaacattgctaaggctcatggaggggtttctgtgtttggtggagtaggagaacgtacccgtgaaggaaatgatctttacaaggaaatgaaagaatcgggagtcattaatgaacaaaatatatccgaatccaaagtagctctggtctatggtcagatgaatgaaccaccaggagctcgtatgagagtaggtttaactgctttaactatggctgaatatttccgagatgtcaataaacaagatgtacttctatttattgacaatatcttccgctttgtccaagcaggatcagaggtatccgcattattaggcagaatgccttccgcagtgggttatcagcccactcttagcacggaaatgggttctttacaagagagaataacttctacgaaagaaggatctataacctccattcaagcagtttatgtacctgcagatgacttgactgatcccgctcctgctacaacatttgcacatttagatgctactactgtactatcgagaggattagctgccaaaggcatctatccagcggtagatccgctggattccacgtcaactatgctccaaccttcgatcgtaggcgaacaacattatgaaactgcgcaaggagttaaacaaactttgcaacgttataaggaacttcaagatattatagctattcttggattagatgaattatcagaagatgatcgtttacttgtagcaagagcaagaaaaattgaacggtttttgtcacaacccttttttgtagcagaggtattcaccggttcccccggtaaatatgttagtctaatagagacaattagaggttttcaaatgatcctttccggagaattagatgctctacccgagcagtctttttatttggtgggtaacattgatga----------------------------------ag-------------aaagcgggtgttaaagattacagattaacttattatactccggaatatcagaccaaagatactgatatcttggcagcattccgagtcactcctcaacctggagtgccccccgaagaagcgggagcagcggtagctgccgaatcttccactggtacgtggaccactgtttggaccgatggacttaccagtcttgatcgctacaaggggcgatgctatgatattgaacccgttcctggagaagaaactcaatttattgcctatgtagcttaccctttagacctttttgaagaaggctctgtgactaacctgtttacttctattgtaggtaatgtatttggattcaaagctttacgggctvtacgtctggaagatttacgaattcctcctgcttattcaaaaacttttcaaggcccdccacatggtattcaagtagaaagagataaattaaacaaatatggtcgtcctttattgggatgtactatcaaaccaaaattgggtctatctgmcaagaattatggtagagcggtttatgaatgtctccgtggtggacttgattttaccaaggatgatgaaaacgtgaattcccagccatttatgcgctggagagatcgtttctgcttttgtgcagaagcactttataaagctcaggctgagacgggtgagattaagggacattacctgaatgcnactgcaggtacatgtgaagaaatgattaaaagagcagtattcgccagagaattgggagttcctatagtcatgcatgactatctgactggaggttttacggcaaatacttcgttggctcattattgccgagataacggcctacttcttcacattcaccgcgcaatgcacgcagttattgacagacaaagaaatcatggtatgcacttccgtgtactggctaaagcactacgtatgtctggtggagatcatattcatgctggtactgtagtaggtaaacttgaaggagaacgagaagtcactttgggttttgttgatctattgcgtgatgattttattgaaaaagaccgaagtcgtggtatttatttcactcaagattgggtctctatgccgggtgtcctgcctgtagcttcaggaggtattcacgtttggcatatgcctgctctgaccgagatctttggagatgattccgtattacagtttggtggagggactttggggcacccttggggaaatgcacctggtgcagtggctaatcgggtcgctttagaagcttgtgtacaagctcgtaatgaaggacgtgatcttgcgcgtgaagg--------------------------------------------------------------------------------------------------- phyml-3.3.20220408/examples/proteic000077500000000000000000000626061422404706600166400ustar00rootroot0000000000000037 547 tax1 ALSDPSKLES DKDLRIDITP DKENKTLTIR DTGIGMTKAD LVNNLGTIAR SGTKQFMEAL tax2 SLSDPSKLDT GKDLRIDIIP DKENKTLTIQ DTGIGMTKAD LVNNLGTIAR SGTKQFMEAL tax3 SLTDASVLES KTELEIKIIP DKTAKTLTLI DSGIGMTKTD MVKNLGTIAR SGTKNFMEQL tax4 SLTDKSKLDA QPELFIRIIP DKATNTLTLI DSGIGMTKSD LVNNLATIGR SGTKDFMEAL tax5 SLTDKSKLDA QPELFIRLVP DKASKTLSII DSGVGMTKSD LVNNLGTIAR SGTKEFMEAL tax6 SLTDKSKLDG QPELFIHIIP DKANNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax7 SLSDKSILDT EAAMEIRIIA DKEAKTLTLQ DTGVGMTKGD LVNNLGMIAN SGTKSYMEAL tax8 SLTDSSVLDN EPKLEIRILT DKNNKSLTLI DTGIGMTKDD LIQNLGTIAK SGTKSFMEAL tax9 SLTDKSKLDA QPELFIHIVP DKASNTLSII DSGIGMTKSD LVNNLGTIAR SGTKEFMEAL tax10 SLTDKSKLDG QPELFIHIIP DKTNNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax11 SLTDKSKLDG QPELFIHIIP DKTNNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax12 SLTDKSKLDG QPELFIHIIP DKTNNTLTII DSGIGMTKAD LVNNLGTIAR SGTKEFMEAL tax13 SLTDKSKLDA QPELFIRLVP DKTNKTLSII DSGVGMAKAD LVNNLGTIAR SGTKEFMEAL tax14 SLTDPSVLGE SPRLCIRVVP DKENKTLTVE DNGIGMTKAD LVNNLGTIAR SGTKAFMEAL tax15 SLTDPSVLGD ATRLCVRVVP DKENKTLTVE DNGIGMTKAD LVNNLGTIAR SGTKAFMEAL tax16 SLTNQSVLGD EPHLRIRVIP DRVNKTLTVE DSGIGMTKAD LVNNLGTIAR SGTKSFMEAL tax17 SLTNQAVLGD ESHLRIRVVP DKANKTLTVE DTGIGMTKAE LVNNLGTIAR SGTKAFMEAL tax18 ALTEPSELDT GKELFIKITP NKEEKTLTIM DTGIGMTKAD LVNNLGTIAK SGTKAFMEAL tax19 ALTEPAELET GKELYIKITP NKADKTLTIM DTGIGMTKAD LVNNLGTIAK SGTKAFMEAL tax20 SLTDPTKLDS GKDLKIDIIP NVQERTLTLI DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax21 SLTDPSKLDS GKELHINIIP NKQDRTLTIV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax22 SLTDPTKLDS GKELFIKIIP NKEAGTLTLI DTGIGMTKAD LVNNLGTIAK SGTKAFMEAL tax23 SLTDPSKLDS GKELYIKLIP NKTAGTLTII DTGIGMTKSD LVNNLGTIAK SGTKAFMEAL tax24 SLTDPTKLDN GKELKIDVIP NVEERTLTLI DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax25 SLTDPSKLDS GKELKIDIIP NPQEATLTLV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax26 SLTDPSKLDS GKELHINLIP SKQDRTLTIV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax27 SLTDPSKLDS GKELKIDIIP NPQERTLTLV DTGIGMTKAD LINNLGTIAK SGTKAFMEAL tax28 VCSDPSKPGL QDHSSIDIIP DKANKTLTIR DTGIGMTKAD LVNNLGTIAR SGTKQFMEAL tax29 ALSDPSQLES EPELFIRITP HKDQKVLEIR DSGIGMTKAD LVNNLGTIAK SGTKSFMEAL tax30 ALSDPSQLES EPELFIRIIP QKDQKVLEIR DSGIGMTKAD LVNNLGTIAK SGTKSFMEAL tax31 SLSDPHALDA EKDLFIRITP DKENKILSIR DTGIGMTKND LINNLGVIAK SGTKQFMEAA tax32 SLSDPKQLET EPDLFIRITP KPEQKVLEIR DSGIGMTKAE LINNLGTIAK SGTKAFMEAL tax33 AIKDPKQVED FPEYQISLSA DKTNKTLTIE DTGIGMTKTD LINNLGTIAK SGTKAFMEAI tax34 SITDTQKLSA EPEFFIRIIP DKTNNTLTIE DSGIGMTKND LINNLGTIAR SGTKAFMEAI tax35 SITDSEKAKL EPNFRIRIIP DKANNTLTLW DTGIGMTKKE LINNLGTIAK SGTKAFMEAL tax36 AITEPEKLKT KPELFIRLIP DKANNTLTIE NSGIGMTKAD LVNNLGTIAR SGTKAFMEAL tax37 AIKDPKQIED QPDYYIRLYA DKNNNTLTIE DSGIGMTKAD LVNNLGTIAK SGTRAFMEAL TSMIGQFGVG FYSAYLVADK VTVISKSNDD QYIWESNAGG TFKVTDGRAI GRMILHLDEQ TSMIGQFGVG FYSAYLVADR VTVVSKNNDD QYIWESSAGG TFNISDGPSI GRIILHLDEQ QSMIGQFGVG FYSAYLVADT VIVHSKNNDD QYVWESSAGG EFTIADTEPL GRIVLHMEDQ ASMIGQFGVG FYSAYLVAER VIVTSKHNDD QHVWESQAGG SFTVTDGEPL GRITLYLDDQ ASMIGQFGVG FYSAYLVADR VMVTTKHNDD QYVWESQAGG SFTVTDGEQL GRITLFLDDQ ASMIGQFGVG FYSAYLVAEK VVVTTKHNDD QYVWESQAGG SFTVTDGENL GRMVLYLEDQ SSMIGQFGVG FYSAYLAADN VVVHTKHNDD QYVWESSAGG SFTIRKGPAL TRVVLHLDDQ QSMIGQFGVG FYSAYLVADR VVVETKNNND QYIWESSAGG SFTINDITDL ARITLFLDDQ ASMIGQFGVG FYSAYLVAER VVVTTKHNDD QYVWESQAGG SFTVTDGEQL GRITLYLDDQ ASMIGQFGVG FYSAYLVADK VVVTTKHNDD QYVWESQAGG SFTVTDGEAL GRMVLYLEDQ ASMIGQFGVG FYSAYLVADK VVVTTKHNDD QYVWESQAGG SFTVTDGETL GRMVLYLEDQ ASMIGQFGVG FYSAYLVADK VVVTTKHNDD QYVWESQAGG SFTVTDGEAL GRMILYLEDQ QSMIGQFGVG FYSAYLVAEK VIVTTKHNDD QYIWESQAGG SFTVTDGEQL GRITLFLEDQ ESMIGQFGVG FYSAYLVADR VTVTSKNNSD SYVWESSACG TFTITTESDM KRITLHLEDQ ESMIGQFGVG FYSAYLVADR VTVTSKNNSD VYVWESSAGG TFTITAESDM KLITLHLEDQ ESMIGQFGVG FYSAYLVADR VTVVSKNNED AYTWESSAGG TFTVTTDCDL KRIVLHLEDQ ESMIGQFGVG FYSAYLVADR VTVVSKNNDD AYTWESSAGG TFTVTTDCDL KRIVLHLEDQ QSMIGQFGVG FYSAFLVADK VVVTSKNNDD SYQWESSAGG SFVVRFDPEV TRIVMHIEDQ QSMIGQFGVG FYSAFLVADK VVVASKHNDD CYQWESSAGG SFIIRVDPEL TRITLYIEDQ QSMIGQFGVG FYSAYLVAEK VTVITKHNDD QYAWESSAGG SFTVKDGEPI GRVILHLEDQ QSMIGQFGVG FYTAYLVAEK VTVITKHNDD QYAWESSAGG SFTVRDGEPM GRVILHLEDQ QSMIGQFGVG FYSAYLVADK VVVTSKNNDD QYVWESSAGG SFTVRDGEPL GRIVLHIEDQ QSMIGQFGVG FYSAYLVADK VTVTSKNNDD QYVWESSAGG SFTVRDSEPL GRIVLYIEDQ QSMIGQFGVG FYSAYLVAER VTVITKHNDD QYIWESSAGG SFTVKDGEPM LRVILHMEDQ QSMIGQFGVG FYSAYLVAEK VVVITKHNDD QYAWESSAGG SFTVRDGEPI GRVILHLEDQ QSMIGQFGVG FYSAYLVAEK VTVITKHNDD QYAWESSAGG SFTVRDGEPM GRVILHLEDQ QSMIGQFGVG FYSAYLVAEK VVVITKHNDD QYAWESSAGG SFTVRDGEPI GRVILHLEDQ TSMIGQFGVG FYSAYLVADR VTVVSKHNDD QYIWESSAGG TFTIRDGEPL AKIILHLEEQ SSMIGQFGVG FYSLFLVADH VQVVSKHNDD QYIWESNAGG KFTVTDNERL GRLRLFLEDQ SSMIGQFGVG FYSLFLVADH VQVISKHNDD QYVWESNAGG KFTVTDNERL GRLRLFLEDQ ASMIGQFGVG FYSAYLVADK VQVVSKHNDD QYIWESSAGG SFTVTDGPRL LRIRLFMEDQ SSMIGQFGVG FYSLFLVADR VQVISKSNDD QYIWESNAGG SFTVTDNERI GRLRLFLDDQ QSMIGQFGVG FYSAYLVADK VTVVSKNNND QYVWESNASG HFTVTDEDQL KRLILHLDDQ QSMIGQFGVG FYSAYLVADH VVVISKNNDD QYVWESAAGG SFTVTDNEKL GRIILHLEDQ SSMIGQFGVG FYSAYLVAEK VEVISKSNDD QWRWESSAGG TFTVVDNPEK LRIILHMNDN QSMIGQFGVG FYSAYLVADS VTVVSKHNDD QYVWESAAGG SFTVQDYEPL GRIILHLEDQ QSMIGQFGVG FYSAYLVADK VTVVSKNNAD QYVWESTASG HFTVKDHEPL KRLILHLEDQ TEYLNESKIK EVVKKQSEFI FYPIYLHVLK EEKEVPDAKK TKKIKENKIE EEELNKTKPI TDYLNESKIK EVIKKHSEFI SYPIYLHVQK EEVEVPDKPK TKKVKEVKTE EEELNKQKPI LDYLDETKIK NLVKKHSEFI QYPISLLTIK EDEETTAEKE KKKVKVQEKE WDVLNKTKPL LEYLEERRLK DLVKKHSEFI SYPISLWTEK TEKEISDEKK KKKIKEVSHE WNLINKQKPI LEYLEERRLK DLVKKHSEFI SYPIYLWTEK TEKEISDSKK KKKVKEVSHE WVQINKQKPI LEYLEERRLK DLIKKHSEFI SYPISLWVEK TEKEISDEKK KKKVKEVSNE WSLVNKQKPI QEWLEERRIK DLVKKHSEFI QYPIKLWVEK EEKEVEVKKK TKKIKEKEHE WQLLNKNKPI LEYLEERRLK DLVKKHSEFI QYPINLWVEK EEKEVDAEKK KKKIKEISHE WQFLNKNKPI LEYLEERRLK DLIKKHSEFI SYPISLWTEK TEKEISDEKK KKKIKEVSHE WSLVNKQKPI MEYIEERRLK DLVKKHSEFI SMGISLWIEK TEKEISDEKK KKKIKEVSHE WDLVNKQKPI LEYLEERRLK DLVKKHSEFI SYPISLWIEK TEKEISDEKK KKKIKEVSHE WDLVNKQKPI MEYIEERRLK DLVKKHSEFI SYPISLWIEK TEKEISDEKK KKKIKEVTHE WDLVNKQKPI LEYLEERRIK DLVKKHSEFI SYPIYLWTEK TEKEISDGKK KKKIKEVSHE WQLINKQKPI MEYLEPRRLK ELIKKHSEFI GYDIELMVEK TEKEVTDKKK TKKVKEVTKE YEVQNKHKPL LEYLEARRLK ELIKKHSEFI GYDIELMVEK TEKEVTDKKK TKKVKEVTKE YEVQNKHKPL QEYLEERRLK DLIKKHSEFI GYDIELMVEN TEKEVTDKKK TKKVKEVKQE FVVQNKHKPL QEYLEERRLK DLIKKHSEFI GYDIELMVEK AEKEVTDKKK TKKVKEVTQE FVVQNKHKPL IDFLEERKIK EIVKKHSQFI GYPIKLVVEK EEKEVEDKKK TKKIKEKYFE DEELNKTKPI TDYLEERRIK EIVKKHSQFI GYPIKLTVEK EDKEVSDDKK KKKIKEKYHE DEELNKTKPI TEYIEEKRVK EVVKKHSQFI GYPITLYVEK EDKEISDKKK KKKIKEKYID QEELNKTKPI TEYMEERRIK EIVKKHSQFI GYPITLFVEK EDKEVSDKKK KKKIKEKYID QEELNKTKPI LEYLEESKIK QIVNKHSQFI GYPIKLLVEK EEKEVSDDKK KKTVKVKYTE DEELNKTKPI TDYLEESKIK EIVNKHSQFI GYPIKLLVEK EEKEVSDAKK KKTIKEKYTE DEELNKTKPI TEYVEEKRVK EVVKKHSQFI GYPITLFVEK EEKEISDKKK TKKIKEKYID QEELNKTKPI TEYLEERRVK EVVKKHSQFI GYPITLYLEK EEKEISDKKK TKKIKEKYID QEELNKTKPI TEYLEERRIK EIVKKHSQFI GYPITLFVEK EDKEVSDKKK KKKIKEKYID QEELNKTKPI TEYLEERRVK EVVKKHSQFI GYPITLYLEK EEKEISDKKK TKKIKEKYID QEELNKTKPI LDYLNESRIK EVVKKHSEFI SYPIYLHVQI SEVTEEGRRR SRTIKETRSE EEELNKQKPI LEYLEEKRII EVVKKHSEFV AYPIQLVVTK EEKEVPEEKK TKKIKEEVTE TEELNKTKPL LEYLEEKRIK EVVKKHSEFV AYPIQLVVTK EEKEVPEEKK TKTVKEEVTE TEELNKTKPL LQYLEEKTIK DTVKKHSEFI SYPIQLVVTR EEKEVPEKKE KKKVKETTTE TEELNKTKPI LEYLEEKRIK EVIKRHSEFV AYPIQLVVTK EEKEVPIKPK TKKVKEEVQE IEELNKTKPL SEYLEERRLK ELVKKHSEFI SFPIRLSVEK TETEVTDEKK KRKVTNVTRE WEMLNKQKPI LEYLEEKRIK DLVKKHSEFI SFPIKLYCER QEKEITAEKR KKKIHTVEHE WEELNKQKPL LEFLEERRIK DLIKKHSEFI AFPIELQVEK TEKEETDDKK KKKVKVVHTE FEEQNKNKPL GEYLEERRLK DLVKKHSEFI SFPIELAVEK TEREVTETGK TKKVQEVTRE WEQLNKQKPL TEYLEERRLK ELVKKHSEFI SFPISLSVEK TETEVTDKKK KRKVTNVTRE WEMLNKQKPI WTRNPADITQ EEYASFYKTN DWEDHLAVKH FSVEGQLEFR AILFVPKRAP FDLFETKTKN WTRNPQDITQ EEYAAFYKSN DWEDHLAVKH FSVEGQLEFK AILFVPKRAP FDLFETKTKN WTRNPSDVTK EEYNSFYKSN DWEEPLAVKH FSVEGQLEFK AILFVPKKAP FDLFESKKAN WMRKPEEITK DEFAAFFKTN DWEEHLGVKH FSVEGQLEFK AVLFVPKRAP FDLFDTRKLN WLRKPEEITR DEYASFYKTN DWEDHLAVKH FSVEGQLEFK AILFVPRRAP FDLFDTRKLN WMRKPEEITK EEYAAFYKTN DWEEHLAVKH FSVEGQLEFK AVLFVPKRAP FDLFDTKKPN WTRKPEEVTK EEYASFYKTN DWEEHLTVKH FSLEGQLEFR AILFCPKRAP FDLFEPRKLN WTRKPEEISK EEYSSFYKSN DWEDHLAVKH FSVEGQLEFK ALLFVPKRAP FDLFEPRKNN WMRKPEEITK EEYAAFYKTN DWEEHLAVKH FSVEGQLEFK AVLFVPKRAP FDLFDTRKLN WMRKPEEINK EEYAAFYKSN DWDKDLAVKH FSVEGQLEFK AILFVPKRRP FDLLYTKKPN WMRKPEEINK EEYAAFYKSN DWEEHLAVKH FSVEGQLEFK AILFVPKRAP FDLFDTKKPN WMRKPEEINK EEYAAFYKSN DWEEHLAVKH FSVEGQLEFK AILFVPKRAP FDLFDTKKPN WLRKPEEITK EEYASFYKTN DWEDHLAVKH FSVEGQLEFK AILFVPKRAP FDLFDTRKMN WTRDPKDVTK EEYAAFYKSN DWEDPRATKH FSVEGQLEFR SIMFVPKRAP FDMFEPNKRN WTRDPKDVTK EEYAAFYKSN DWEDPPATKH FSVEGQLEFR AIMFVPKRAP FDMLEPNKRN WTRDPKDVTK EEYASFYKSN DWEEQLSTKH FSVEGQLEFR AILFLPKRAP FDMFEPNKRN WTRDPKDVTK EEYAAFYKSN DWEEPLSTKH FSVEGQLEFR AILFVPKRAP FDMFEPSKRN WTRNPDDISN EEYAEFYKSN DWEDHLAVKH FSVEGQLEFR ALLFVPQRAP FDLFENKSKN WTRNPDDISN EEYAEFYKSN DWEDHLAVKH FSVEGQLEFR ALLFVPQRAP FDLFENKTKN WTRNPDDISN EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPDDITN EEYGEFYKTN DWEEHLAVKH FSVEGQLEFR ALLFVPRRAP FDLFENRKKN WTRNADDISQ EEYGEFYKTN DWEDHLAVKH FSVEGQLDFR ALLFVPRRMP FDLFENKKKN WTRNPDDISQ EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRTP FDLFENQKRN WTRNPDDITM EEYGEFYKTN DWEEHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPDDITQ EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPDDITN EEYGEFYKTN DWEEHLAVKH FSVEGQLEFR ALLFVPRRAP FDLFENRKKN WTRNPDDITQ EEYGEFYKTN DWEDHLAVKH FSVEGQLEFR ALLFIPRRAP FDLFENKKKN WTRNPQDITQ EEYAAFYKSN DWEDHLAVKH FSVEGQLEFR AILFVPKRAP FDLFETKTKS WTRNPSDITQ EEYNAFYKSN DWEDPLAVKH FSVEGQLEFR AILFVPKRAP FDAFESKKKS WTRNPSDITQ DEYNAFYKSN DWEDPLAVKH FSVEGQLEFR AILFVPKRAP FDAFESKKKN WTRNPSEVTK EEYASFYKTN DWEDHLAVKH FSVEGQLEFR AILFVPRRAP MDLFEAKKKN WTRNPSDITQ EEYNAFYKSN DWEDPLYVKH FSVEGQLEFR AILFIPKRAP FDLFESKKKN WMRLPTEVTN EEYASFYKSN DWEDHLAVKH FSVEGQLEFK AILFVPKRAP FDMFENRKKN WMRKPEEVTN EEYASFYKTN DWEDHLAVKH FSVEGQLEFK ALLFIPKRAP FDMFENRKRN WMRKPEEITK EEYVNFYKTN DWEEHQAVKQ FSVEGQLEFR AILFIPKRAP FDLFETKKKN WMRKPEEVTE EEYASFYKSN DWEEHLAVKH FSVEGQLEFK ALLFVPKRAP FDLFETRKRN WMRLPSEVTN EEYAAFYKTN DWEDHLAVKH FSVEGQLEFK ALLFVPRRAP FDMFESRKKN NIKLYVRRVF ITDDATDLIP EWLSFIKGVV DSEDLPLGLS RETLQQNKIM KVIKNIVKKT NIKLYVRRVF ITDDATDLIP EWLSFVKGVV DSEDLPLNLS RETLQQNKIM KVIKNIVKKA NIKLYVKRVF IMDNCADIIP EYLNFVRGIV DSEDLPLNIS RETLQQNKIL TVIKNLVKKC NIKLYVRRVF IMDNCEELIP EWLSFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEELIP EWLGFVKGVV DSDDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCDELIP EYLSFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVKRVF IMDNCEDIIP EYLNFVKGVV DSEDLPLNLS REMLQQNKIL KVIKNLVKKC NIKLYVKRVF IMDNCDEIIP EYLNFIKGVV DSEDLPLNIS RETLQQNKVV KVIKNIVKKC NIKLYVRRVF IMDNCEELIP EWLSFVKGIV DSEDLPLNIS REMLQQNKIL KVIKNLVKKC NISLYVRRVF IMTYCEDIIP EYLGFVKGIV DSEDLPLNIS RETLQQNKIS MVIKNLVKKC NIKLYVRRVF IMDNCEDIIP EYLGFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEDIIP DYLGFVKGIV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEELIP EYLGFVKGVV DSDDLPLNIS REMLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEDLCP DWLGFVKGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKC NIKLYVRRVF IMDNCEDLCP DWLGFVKGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKC NIKLYVRRVF IMDNCEDLCP EWLGFLRGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKA NIKLYVRRVF IMDNCEDLCP EWLAFVRGVV DSEDLPLNIS RENLQQNKIL KVIKNIVKKA SIKLYVRRVF IMENCEELMP EYLNFIKGVV DSEDLPLNIS REMLQQSKIL KVIKNLVKKC AIKLYVRRVF IMENCDELMP EYLNFIKGVV DSEDLPLNIS REMLQQSKIL KVIKNLVKKC NIKLYVRRVF IMDNCEELIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF IMDNCEELFP EYLNFIRGVV DSEDLPLNIS REILQQSKIL KVIKNLVRKC NIKLYVRRVF IMDNCEELIP DYLNFMKGVV DSEDLPLNIS REMLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDNCEDLIP EYLNFMKGVV DSEDLPLNIS REMLQQNKVL KVIKNLVKKT NIKLYVRRVF IMDSCEELIP EYLNFVRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF IMDSCDDLIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF IMDNCEELIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNLVKKC NIKLYVRRVF IMDSCDELIP EYLNFIRGVV DSEDLPLNIS REMLQQSKIL KVIKNIVKKC NIKLYVRRVF ITEHATDLVP EWLSFIKGVV DSEDLPLNLS RETLQQNKIM KVIKNIVKKS NSKLYVRRVF ITDDAEELIP EWLSFVKGVV DSEDLPLNLS REMLQQNKIL KVIKNISKKM NIKLYVRRVF ITDDAEELIP EWLSFIKGVV DSEDLPLNLS REMLQQNKIL KVIKNIVKKM NIKLYVRRVF ITDDCEELIP EWLGFIKGVV DSEDLPLNLS REMLQQNKIM KVIKNLVRRC NIKLYVRRVF ITDEAEDLIP EWLSFVKGVV DSEDLPLNLS REMLQQNKIM KVIKNIVKKL NIKLYVRRVF IMDDCDELIP EWLGFVKGVV DSEDLPLNIS REVLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDDCEEIIP EWLNFVKGVV DSEDLPLNIS RESLQQNKIL KVIKNLIKKC NIKLYVRRVF IMDDCEELIP EYLNFIKGVV DSEDLPLNIS REFLQHNKIL KVIKNIVKKC NIKLYVRRVF IMDDCEDIIP EWLNFVKGVV DSEDLPLNIS RESLQQNKIL KVIKNLVKKC NIKLYVRRVF IMDDCEELIP EWLSFVKGVV DSEDLPLNIS RETLQQNKIL KVIKNLVKKC LELFNEIAED REQFKFYSAF SKNIKLGVHE DAQNRPALAK LLRYNSTTTS LTDYVTRMPE LELFTEIAED KEQFKFYTAF SKNIKLGIHE DSQNRNTLAK LLRFNSTQTS LSDYVTRMPE IELFNEIAEN SEDYKFYEAF SKNLKLGVHE DSQNREKFAD LLRYQTSLVT LKEYVGRMKE IELFFEIAEN KEDYKFYEAF SKNLKLGVHE DSTNRTKLAE LLRYHSTLTS LKDYVTRMKE IEMFFEIAEN KDDYKFYDAF SKNIKLGIHE DSQNRAKLAD LLRYHSTTTS LKDYVTRMKE VELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSQNRAKFAE LLRYHSTMTS LKDYVTRMKE MDMFAEAAEN KEDYVFYEQF SKNLKLGIHE DAQNREKLAE LLRYNTTLTS LKEYVSRMKE LELFLEISEN KDDVIFYDQY SKNIKLGIHE DSQNRSKLAD LLRYKSTTTT LKEYVSRMKE VELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSTNRNKIAE LLRYHSTLTS LKDYVTRMKE LELFFEIAEN KEDYKFYEAF SKNLKPGIHE DSKIRTKIAE LLRYHSTLTS LKDYVTRMKE LELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSQNRTKIAE LLRYHSTLTS LKDYVTRMKE LELFFEIAEN KEDYKFYEAF SKNLKLGIHE DSQNRTKIAE LLRYHSTLTS LKDYVTRMKE IEMFNEIAEN KDDYKFYEAF SKNLKLGIHE DSQNRAKLAD LLRYYSTLTS LKDYVTRMKE LEMFDEVAEN KEDYQFYEQF GKNIKLGIHQ DTANRKKLME FVRFYSSMTT LKDYVTRMKA LEMFEEVAEN KEDYQFYEQF GKNIKLGIHE DTANRKKLME LLRFYSTMTT LKDYVTRMKA LELFEELAGN KEDYKFYEQF SKNVKLGIHE DSTNRKKLME LLRFHSSMTT LKDYVTRMKE LELFEEIAEN KEDYKFYEQF GKNVKLGIHE DSANRKKLME LLRFHSSMTT LKDYVTRMKE MELIDEVAED KDNFKFYEQF GKNLKLGIHE DSTNRKKLSD FLRYSTSPTS LKEYVSRMKE LELFDEIAED KDNFKFYEQF SKNIKLGIHE DSTNRKKLSE FLRFYTSMTS LKDYVSRMKE LELFAELAED KDNYKFYDAF SKNLKLGIHE DCQNRKKLSE LLRYQSSMTS LTEYVSRMKE LELFHELAED KENYKFYEQF SKNIKLGIHE DSQNRKKLSE LLRYYTSMVS LKDYCTRMKE MELFEELAED KETYKFYDQF SKNLKLGVHE DSQNRQKLAD LLRFNTSYCS LNDYVGRMKE MELIEELTED KENYKFYDQF SKNLKLGVHE DSNNRAKLAD FLRFHTSFCS LADYVSRMKD MELFGELAED RENYKFYDGF SKNLKLGIHE DSQNRKKLSE LLRYHSSLTS LTEYLTRMKD LELFSELAED KENYKFYEAF SKNLKLGIHE DSTNRRRLSE LLRYHTSMTS LSEYVSRMKE LELFTELAED KENYKFYEQF SKNIKLGIHE DSQNRKKLSE LLRYYTSMVS LKDYCTRMKE LELFSELAED KENYKFYEAF SKNLKLGIHE DSTNRRRLSE LLRYHTSMTS LSEYVSRMKE IELFNEIAED KEQFKFYSAF SKNIKLGIHE DAQNRSALAK LLRFHSTMTS LSDYVARMPE IETFNEISED QEQFQFYTAF SKNIKLGIHE DAQNRQALAK LLRFYSTMTS LSDYVTRMPE IETFNEISED QEQFQFYTAF SKNIKLGIHE DAQNRQSLAK LLRFYSTMTS LSDYVTRMPE LDMFNEIAED KENFTFYDAF SKNLKLGIHE DAANRPALAK LLRYNSLLIS LEDYITKMPE IEAFNEIAED SEQFKFYSAF SKNIKLGVHE DTQNRAALAK LLRYNSTLTS LTDYVTRMPE LELFSELTEK KEDFKFYEQF SKNLKLGIHE DNTNRNKISE LLRYETSAIS LKEYVDRMKP LDMFSELAEN KENYKFYEQF SKNLKLGIHE DNANRTKITE LLRFQTSMIG LKEYVDRMKE LDLIQEVADN EEDFKFYEQF GKNLKLGIHE DSANREKLSS FLRYHSSLTT LKDYVSRMKE LEMFAEIEEK KENYKFYEQF SKNLKLGIHE DSANRAKIAE LLRFHSSMVS FKEYVDRMKE LELFNELTEK KEDFKFYEQF SKNLKLGIHE DNANRSKIAE LLRFETTLVS LKEYVDRMKS HHKTIYYITG ESLKAVQKSP FLDTLKEKNF EVLFLVDPND EYAMTQLKEF DGKKLVDITK HQKNMYYITG ESIKAVSKSP FLDSLKEKGF EVLFLVDPID EYAMTQLKEF EGKKLVDITK GQNEIYYITG ESKKAVENSP FIEGLKKKNL EVIYMCDPID EYAVQQLKEY DGKKLVSITK GQNDIYYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYSIGQLKEF EGKKLVSATK GQKDIYYITG ESRKAVENSP FLERLKKKGY EVLFMVDAID EYAVGQLKEY DGKKLVSATK GQNDIYYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYSIGQLKEF EGKKLVSATK GQKNIYYITG ASKKAVENAP FLEKLKKKGF EVIYMTEPID EYCVQQLKEY DGKKLVCTTK NQNQIYYITG ESQKSVENSP FLEKLKQKGF EVLFMIEPID EYCVQQLKEY EGKKLVCATK GQNDIYYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYAVGQLKEF EGKKLVSATK GQNDIFYITG ESKKAVENSP FLEKLKKKGI EVLYMVDAID EYAIGQLKEF EGKKLVSATK GQNDIFYITG ESKKAVENSP FLEKLKKKGI EVLYMVDAID EYAIGQLKEF EGKKLVSATK GQNEIFYITG ESKKAVENSP FLEKLKKKGY EVLYMVDAID EYAIGQLKEF EGKKLVSATK GQKDIYYITG ESKKAVENSP FLERLKKKGY EVLFMVDAID EYAVGQLKEY DGKKLVSATK GQKSIYYITG DSKKKLESSP FIEQAKRRGL EVLFMTEPID EYVMQQVKDF EDKKFACLTK EQNSIYYITG DSKKKLESSP FIEQAKRRGF EVLFMTEPYD EYVMQQVKDF EDKKFACLTK GQKCIYYVTG DSKKKLETSP FIEQARRRGM EVLFMTDPID EYVMQQVKDF EDKKFACLTK GQKCIYYVTG DSKKKLETSP FIEQARRRGF EVLFMTEPID EYVMQQVKDF EDKKFACLTK NQTQIYYITG ESKDVVAASA FVERVKSRGF EVLYMCDPID EYCVQQLKEY DGKKLVSVTK NQKQIYFITG ESREAVASSA FVERVKRRGF EVIYMTDPID EYCVQQLKEY DGKKLVSVTK NQKSIYYITG ESKDQVAHSA FVERVCKRGF EVLYMTEPID EYCVQQLKDF DGKSLVSVTK NQKHIYFITG ETKDQVANSA FVERLRKHGL EVIYMIEPID EYCVQQLKEF EGKTLVSVTK NQTQIYFITG ESIEQVKNSA FVERVKKRGF EVIYMTEAID EYVIQQLKEY KGKQLVCVTK NQKHVYFITG ESKDQVSNSA FVERVKARGF EVVYMTEPID EYVIQHLKEY KGKQLVSVTK NQKSIYYITG ESKDQVANSA FVERVRKRGF EVLYMTEPID EYCVQQLKEF DGKTLVSVTK TQKSIYYITG ESKEQVANSA FVERVRKRGF EVVYMTEPID EYCVQQLKEF DGKSLVSVTK NQKHIYFITG ETKDQVANSA FVERLRKHGL EVIYMIEPID EYCVQQLKEF EGKTLVSVTK TQKSIYYITG ESKEQVANSA FVERVRKRGF EVVYMTEPID EYCVQQLKEF DGKSLVSVTK HQKNIYYITG ESIKAVSKSP FLDALKEKGF EVLFLVDPID EYAMTQLKEF EGKKLVDITK HQKNIYYITG ESIKAVEKSP FLDALKAKNF EVLFMVDPID EYAMTQLKEF EDKKLVDITK HQKNIYYITG ESIKAVEKSP FLDALKAKNF EVLFMVDPID EYAMTQLKEF EDKKLVDITK HQKNIYFITG ESKQAVENSP FLEIFRAKKF DVLFMVDPID EYAVTQLKEF EGKKLVNITK HQKNIYYITG ESLKAVEKSP FLDALKAKNF EVLFLTDPID EYAFTQLKEF EGKTLVDITK EQKYIYYITG ESKQSVANSP FLECLRSRGI EVIYMTDPID EYAVQQIKEF EGKKLKCCTK NQKDIYYITG ESINAVSNSP FLEALTKKGF EVIYMVDPID EYAVQQLKDF DGKKLKCCTK GQKDIFFITG ESRAAVAASP FVESLRKRGY EVLYMVDPID EYVIQQLKEY DGKKLKNCSK GQKDIYYITG ESRQTVANSP FLEKLTKKGY EVLYMTDPID EYAVQQLKEF DNHKLRCCTK DQKYVYYITG ESKQSVASSP FLETLRSRDY EVLYMTDPID EYAVQQIKEF EGKKLKCCTK DFELEETEEE KKDREAEEKE YEGLAKSLEN ILGDKVEKVV VSHKLIGSPC AIRTGQFGWS DFELEETEEE KKQREAEEKE YDGLAKALKN VLGDKVEKVV VSHKLVGAPC AIRTGQFGWS ELKLDETEDE KKKAEQDKAA NEELLKQVKD VLGDKVEKVV LSTRLANSPC VLVTSEYGWS ELKLDDSEEE KKRKEELKEK FEGLCKVIKE VLGDRVEKVI VSDRVVDSPC CLVTGEYGWT ELKLDDEDDE EKKREERKKR FEELCKVIKD ILGDRVEKVV VSDRIVDSPC CLVTGEYGWT ELKLDESEDE KKKQEELKEK FEGLCKVMKD VLGDKVEKVI VSDRVVDSPC CLVTGEYGWT EMQLEESEEE KAAREAEAKA CETLCEVIKE NLGEKVEKVV VSDRLADSPC ILVTGEYGWS ELDLGDSEND KKVKENEKEQ FDELCKVIKE TLNDKVEKVV ISDRLSDSPC ILVTGEYGWS ELKLDESEDE KKRKEELKEK FEGLCKVIKE VLGDKVEKVV VSDRVVDSPC CLVTGEYGWT ELKLDETEDE KKKKEELNEK FEGLCKVIKD VLGDKVEKVI VSDRVLDSPC CLVTGEYGWT ELKLDETEDE KKKKEELKEK FEGLCKVIKD VLGDKVEKVI VSDRVVDSPC CLVTGEYGWT ELKLEETDDE KKKKEELKEK FEGLCKVIKD VLGDKVEKVI VSDRVVDSPC CLVTGEYGWT ELKLEDDDEE EKKKREEKKS FENLCKIIKD ILGDKVEKVV VSDRIVDSPC CLVTGEYGWT EVHFEESEEE KQQREEEKAA CEKLCKTMKE VLGDKVEKVI VSECLSTSPC ILVTSEFGWS EVHFEESEEE KRQREEEKAT CEKLCKTMKE VLGDKVEKVT VSERLSTSPC ILVTSEFGWS EVHFEETEEE KKQREEEKAS YERLCKAMKE VLGDKVEKVV VSDRLATSPC ILVTSEFGWS EVHFEETEEE KKQREEEKTA YERLCKAMKD VLGDKVEKVV VSERLATSPC ILVTSEFGWS ELELPETEEE KKKFEEDKVA YENLCKVIKD ILEKKVEKVG VSNRLVSSPC CIVTSEYGWS ELELPESEEE KKKFEEDKVK FENLCKVMKD ILEKKVEKVA VSNRLVSSPC CIVTSEYGWS ELELPEDEDE KKKMEEDKAK FENLCKLMKE ILDKKVEKVT VSNRLVSSPC CIVTSTYGWT ELELPEDEEE KKKQEEKKTK FENLCKIMKD ILEKKVEKVV VSNRLVTSPC CIVTSTYGWT ELELPEDEAE KKKREEDKAK FENLCKVMKS VLESKVEKVV VSNRLVDSPC CIVTSQYGWS ELELPEDESE KKKREEDKAK FESLCKLMKS ILDNKVEKVV VSNRLVDSPC CIVTSQFGWS ELELPEDEEE KKKMDEDKTK FENLCKLMKE ILDKKVEKVT VSNRLVSSPC CIVTSTYGWT ELELPEDEEE KKKMEESKAR FENLCKLMKE ILDKKVEKVT ISNRLVSSPC CIVTSTYGWT ELELPEDEEE KKKQEEKKTK FENLCKIMKD ILEKKVEKVV VSNRLVTSPC CIVTSTYGWT ELELPEDEEE KKKMEESKAK FENLCKLMKE ILDKKVEKVT ISNRLVSSPC CIVTSTYGWT DFELEETEEE KKQREQEEKE YEDLCKALKN ILGDKVEKVV VSHKLVGSPC AIRTGQFGWS DFDLEETEEE KSTREKEIKE FEPLTKALKD ILGDQVEKVV VSYKLVDAPA AIRTGQFGWS DFELEESDEE KAAREKEIKE YEPLTKALKD ILGDQVEKVV VSYKLVDAPA AIRTGQFGWS DLELEETDEE KAAREKLEKE YEEFAKQLKT ILGDKVEKVV VSNKIVGSPC LLTTGQYGWS DFELEETDEE KAEREKEIKE YEPLTKALKE ILGDQVEKVV VSYKLLDAPA AIRTGQFGWS ELELEDTEEE RKNFETLEKE MEPLCRLIKE ILHDKVEKVV CGKRFTESPC ALVTSEFGWS ELDIDDSEEA KKDFETLKAE YEGLCKVIKD VLHEKVEKVV VGQRITDSPC VLVTSEFGWS ELELEQTEDE KKKFEEKKAA YEPLCKQIKE VLGDKVEKVV VGQRLDESPC VLVTGEYGWS ELEIDESEEE KKKFEELKAE FEPLLKLIKE VLHDKVDKVV LSNRITDSPC VLVTTEFGWS ELDLDEGEDE KKSFEALKEE MEPLCKHIKE VLHDKVEKVV CGTRFTDSPC ALVTSEFGWS ANMERIMKAQ ALRDTSMSSR RSSRPTENRT VKSITQLLFE TSLLSGFTIE EPSFAGRIHK ANMERIMKAQ ALRDTSMSSY MSSKPKENKT VKSIVQLLFE TSLLSGFTIE EPAFAERIHK ANMERIMKAQ ALRDSSMSSY MSSKPRDSKT FKDFVYLLYE TALLSGFSLD EPSFASRIHR ANMERIMKAQ ALRDTSMGGY MSSKAEENKS VKDLVMLLFE NSLLSGFSLD DPNFGTRIHR ANMERIMKAQ ALRDSSMSAY MSSKGEENKS VKDLVLLLFE TALLSGFSLD DPNFAARIHR ANMERIMKAQ ALRDSSMAGY MSSKSDENKS VKDLVLLLFE TALLSGFSLE EPNFGNRIHR ANMERIMSSQ ALRDNSLSTY MSSRSRETKT VKDLVSLLFD TAMLSGFSLE EPHFAGRIQR ANMERIMKAQ ALRDSSLSTY MSSRSNENKT VKDLVNLLFD TSLLSGFSLD EPHFAERIHR ANMERIMKAQ ALRDSSMAGY MSSKAEENKS VKDLVLLLFE TALLSGFSLD DPNFGSRIHR ANMERIMKAQ ALRDSSMGGY MSSKLDENKS VKDLVLLLFE TALLSGFSLD EPNFGSRIHR ANMERIMKAQ ALRDSSMAGY MSSKSDENKS VKDLVLLLFE TALLSGFSLD EPNFGSRIHR ANMERIMKAQ ALKDSNTGGY MSSKSDENKS VKDLVLLLFE TALLSGFSLD EPNFGSRIHR ANMERIMKAQ ALRDSSMSSY MSSKGEENKS VKDLVLLLFE TALLSGFSLD DPNFGARIHR AHMEQIMRNQ ALRDSSMAQY MMSKPKENKA VKDLVFLLFD TSLLSGFQLE DPTYAERINR AHMEQMMRNQ ALRDSSMAQY MMSKPKENKA VKDLVFLLFD TSLLSGFQLE DPTYAERINR AHMEQIMRNQ ALRDSSMSAY MMRKAKENKA AKDLIFLLFD TSLLSGFTLD DPTYADRIHR AHMEQIMRNQ ALRDSSMSAY MMSKPKENKA VKDLVYLLFD TALLSGFTLD DPTYAERIHR ANMERIMKAQ ALRDSSTMGY MAAKAKTNKT VKDLVVLLFE TALLSGFSLE EPQHASRIYR ANMERIMKAQ ALRDSSTMGY MAAKSKANKT VKDLVVLLFE TALLSGFSLE DPQHASRIYR ANMERIMKAQ ALRDNSTMGY MMANPETNKA VKDLVILLFE TALLSGFSLD DPQHSNRIYR ANMERIIKAQ ALRDNSTMGY MAAKSETNKS VKDLVILLYE TALLSGFSLE DPQHANRIYR ANMERIMKAQ ALRDSSAMGY MAGKAETNKA VKDLVILLFE TALLSGFSLD EPGHAARIYR ANMERIMKAQ ALRDTATMGY MAGKPETNKA VKDLVILLFE TSLLSGFSLD SPQHASRIYR ANMERIMKAQ ALRDNSTMGY MMAKPETNKA VKDLVILLFE TALLSGFSLD DPQHSNRIYR ANMERIMKAQ ALRDNSTMGY MMAKPETNKA VKDLVVLLFE TALSLASHFR RPKHSNRIYR ANMERIMKAQ ALRDNSTMGY MAAKSETNKS VKDLVILLYE TALLSGFSLE DPQHANRIYR ANMERIMKAQ ALRDNSTMGY MMAKPETNKA VKDLVVLLFE TALLSGFSLE DPQHSNRIYR ANMERIMKAQ ALRDTSMSSY MSSKPKENKT VKSIVQLLYE TSLLSGFTID EPALPRGIHK ANMERIMKAQ ALRDTTMSSY TSSKPKEEKT VKDLTTLLFD TALLSGFTLD EPSFAHRINR ANMERIMKAQ ALRDTTMSSY MSSKPKEEKT VKDLTTLLFD TALLSGFTLD EPSFAHRINR ANMERIMKAQ ALRDTSMSAY MSSRPAEERS VKDLATILYE TALLSGFTLD DPSYAQRINR ANMERIMKAQ ALRDSSMSSY MSSKPKEQKT VKDLTKLLYE TALLSGFSLD EPTFASRINR ANMERIMKAQ ALRDSSFGSF MISKSKESKT LKDLVWLLYD TAMLSGFNLD DPTFGGRIYR ANMERIMKAQ ALRDNSMTSY MLSKPSASKT VKDLIWLLFD TSLLSGFALE EPTFSKRIHR ANMERIMKAQ ALRDASMSTY MISKAQEAKT VKDLIWLLFE TSLLSGFSLD DPSFANRIHR ANMERIMKAQ ALRDNSMTSY MVSKSIESKT VKDLIWLLYD TALLSGFSLE EPTFAARIHR ANMERIMKAQ ALRDSSITSY MLSKSKETKT VKDLVWLLYD TALLSGFNLD EPTFGNRIYR LVSLGLN LVALGLN MIKLGLS MLKLGLS MLKLGLN MLKLGLS MLMLGLQ MIKLGLS MLKLGLS MLKLGLS MLKLGLS MLKLGLS MLKLGLS MIKLGLS MIKLGLS MIKLGLS MIKLGLS MIKLGLD MIKLGLD MIKLGLG MIKLGLG MVKLGLG MIKLGLG MIKLGLG MIKLGLG MIKLGLG MIKLGLG LVSLGQN LIALGLN LIALGLN LISLGLS LISLGLN MIKLGLS MIKLGLS MIKLGLQ MIKLGLS MIKLGLS phyml-3.3.20220408/src/000077500000000000000000000000001422404706600142045ustar00rootroot00000000000000phyml-3.3.20220408/src/Makefile.am000077500000000000000000000157321422404706600162530ustar00rootroot00000000000000# EXTRA_DIST = doc bin examples DEFS = $(REVISION) if WANT_PHYML bin_PROGRAMS = phyml PROG = PHYML else if WANT_PHYTIME bin_PROGRAMS = phytime PROG = PHYTIME else if WANT_RF bin_PROGRAMS = rf PROG = RF else if WANT_MPI bin_PROGRAMS = phyml-mpi PROG = PHYML else if WANT_WIN bin_PROGRAMS = phyml-windows PROG = PHYML else if WANT_TEST bin_PROGRAMS = test PROG = TEST else if WANT_EVOLVE bin_PROGRAMS = evolve PROG = EVOLVE else if WANT_PHYREX bin_PROGRAMS = phyrex PROG = PHYREX else if WANT_PHYREXSIM bin_PROGRAMS = phyrexsim PROG = PHYREXSIM else if WANT_DATE bin_PROGRAMS = date PROG = DATE else bin_PROGRAMS = phyml PROG = PHYML endif endif endif endif endif endif endif endif endif endif if WANT_PHYTIME phytime_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ times.c times.h\ draw.c draw.h\ rates.c rates.h\ mcmc.c mcmc.h\ stats.c stats.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ mixt.c mixt.h\ init.c init.h\ nexus.c nexus.h\ date.c date.h\ tbe.c tbe.h\ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ xml.c xml.h phytime_LDADD = -lm else # if WANT_RWRAP # lib_LTLIBRARIES = librwrap.la # librwrap_la_SOURCES = main.c \ # utilities.c utilities.h\ # optimiz.c optimiz.h\ # lk.c lk.h\ # bionj.c bionj.h\ # models.c models.h\ # free.c free.h\ # help.c help.h\ # simu.c simu.h\ # eigen.c eigen.h\ # pars.c pars.h\ # alrt.c alrt.h\ # interface.c interface.h\ # cl.c cl.h\ # spr.c spr.h\ # draw.c draw.h\ # stats.c stats.h\ # rates.c rates.h\ # mcmc.c mcmc.h\ # times.c times.h\ # tiporder.c tiporder.h\ # mg.c mg.h\ # io.c io.h\ # make.c make.h\ # nexus.c nexus.h\ # init.c init.h\ # xml.c xml.h\ # mixt.c mixt.h\ # rwrapper.c rwrapper.h # librwrap_la_LIBADD = -lm # librwrap_la_LDFLAGS = -I/usr/share/R/include -shared -module -flat_namespace # librwrap_la_CFLAGS=-std=gnu99 -fPIC -Wl,-z,defs # else if WANT_RF rf_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ tbe.c tbe.h \ ancestral.c ancestral.h\ sse.c sse.h\ avx.c avx.h rf_LDADD = -lm else if WANT_MPI phyml_mpi_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ mpi_boot.c mpi_boot.h phyml_mpi_LDADD = -lm else if WANT_WIN phyml_windows_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ tbe.c tbe.h \ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ date.c date.h phyml_windows_LDADD = -lm else if WANT_TEST test_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ tbe.c tbe.h \ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ date.c date.h test_LDADD = -lm else if WANT_EVOLVE evolve_SOURCES = main.c\ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ tbe.c tbe.h \ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h evolve_LDADD = -lm else if WANT_PHYREX phyrex_SOURCES = main.c\ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ date.c date.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ phyrex.c phyrex.h\ location.c location.h\ slfv.c slfv.h\ rw.c rw.h\ rrw.c rrw.h phyrex_LDADD = -lm else if WANT_PHYREXSIM phyrexsim_SOURCES = main.c\ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ mixt.c mixt.h\ date.c date.h\ tbe.c tbe.h \ sse.c sse.h\ avx.c avx.h\ ancestral.c ancestral.h\ phyrex.c phyrex.h phyrexsim_LDADD = -lm else if WANT_DATE date_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ rates.c rates.h\ mcmc.c mcmc.h\ times.c times.h\ mg.c mg.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ tbe.c tbe.h \ mixt.c mixt.h\ date.c date.h date_LDADD = -lm else phyml_SOURCES = main.c \ utilities.c utilities.h\ optimiz.c optimiz.h\ lk.c lk.h\ bionj.c bionj.h\ models.c models.h\ free.c free.h\ help.c help.h\ simu.c simu.h\ eigen.c eigen.h\ pars.c pars.h\ alrt.c alrt.h\ interface.c interface.h\ cl.c cl.h\ spr.c spr.h\ draw.c draw.h\ stats.c stats.h\ io.c io.h\ make.c make.h\ nexus.c nexus.h\ init.c init.h\ xml.c xml.h\ sse.c sse.h\ avx.c avx.h\ tbe.c tbe.h \ ancestral.c ancestral.h \ mixt.c mixt.h phyml_LDADD = -lm endif endif endif endif endif endif endif endif endif all-am: intro $(bin_PROGRAMS) @echo "" @echo "Done." intro: @echo "" @echo "" @echo ".: Building [$(bin_PROGRAMS)]. Version $(VERSION) :." @echo "" @echo "" phyml-3.3.20220408/src/Makefile_mc.am000077500000000000000000000015671422404706600167330ustar00rootroot00000000000000# AM_CFLAGS=-mpowerpc # AM_CFLAGS=-O3 -fomit-frame-pointer -funroll-loops -Wall -m64 # AM_CFLAGS=-O2 -Wall # AM_CFLAGS=-m64 # AM_CFLAGS=-g -Wall # AM_LDFLAGS=-lm # DEFS = -DUNIX -D$(PROG) -DDEBUG -DBATCH -DQUIET # DEFS=-DUNIX -D$(PROG) -DDEBUG # DEFS=-DUNIX -D$(PROG) # DEFS = -DUNIX -D$(PROG) AM_MAKEFLAGS = -f Makefile_mc bin_PROGRAMS = mc PROG = MC DEFS=-DUNIX -D$(PROG) -DDEBUG mc_SOURCES = main.c utilities.c optimiz.c lk.c bionj.c models.c free.c\ help.c simu.c eigen.c pars.c alrt.c interface.c cl.c spr.c mc.c m4.c draw.c rates.c mcmc.c numeric.c # mc_LDADD = -lm # SCOMPILE = $(CC) $(SDEFS) $(DEFS) $(INCLUDES) $(AM_CFLAGS) $(SCFLAGS) # SCCLD = $(CC) $(LIBS) # SLINK = $(SCCLD) $(AM_CFLAGS) $(SLDFLAGS) $(LDFLAGS) $(INCLUDES) $(AM_LDFLAGS) all-am: intro mc$(EXEEXT) @echo "" @echo "Done." intro: @echo "" @echo "** Building MC version $(VERSION) **" @echo "" phyml-3.3.20220408/src/Makefile_r.am000077500000000000000000000035621422404706600165720ustar00rootroot00000000000000bin_PROGRAMS = rwrapper PROG = RWRAP rwrapper_SOURCES = main.c utilities.c optimiz.c lk.c bionj.c models.c free.c\ help.c simu.c eigen.c pars.c alrt.c interface.c cl.c spr.c draw.c rates.c rwrapper.c numeric.c mcmc.c rwrapper_LDADD = main.o utilities.o optimiz.o lk.o bionj.o models.o free.o\ options.o simu.o eigen.o pars.o alrt.o interface.o cl.o spr.o draw.o rates.o rwrapper.o numeric.o mcmc.o AM_CFLAGS=-fPIC -Wall AM_LDFLAGS=-lm DEFS=-DUNIX -D$(PROG) -DDEBUG # SCOMPILE = $(CC) $(SDEFS) $(DEFS) $(INCLUDES) $(AM_CFLAGS) $(SCFLAGS) SCOMPILE = $(CC) $(SDEFS) $(DEFS) $(INCLUDES) $(AM_CFLAGS) $(SCFLAGS) -I/Library/Frameworks/R.framework/Versions/2.8/Resources/include/ SCCLD = $(CC) $(LIBS) SLINK = $(SCCLD) $(AM_CFLAGS) $(SLDFLAGS) $(LDFLAGS) $(INCLUDES) $(AM_LDFLAGS) -bundle -flat_namespace -undefined suppress rwrapper$(EXEEXT): $(rwrapper_LDADD) $(rwrapper_SOURCES) $(SLINK) $(rwrapper_LDADD) -o $@.so main.o: main.c $(SCOMPILE) -c main.c utilities.o: utilities.c utilities.h $(SCOMPILE) -c utilities.c optimiz.o: optimiz.c optimiz.h $(SCOMPILE) -c optimiz.c lk.o: lk.c lk.h $(SCOMPILE) -c lk.c bionj.o: bionj.c bionj.h $(SCOMPILE) -c bionj.c models.o: models.c models.h $(SCOMPILE) -c models.c free.o: free.c free.h $(SCOMPILE) -c free.c options.o: help.c help.h $(SCOMPILE) -c help.c simu.o: simu.c simu.h $(SCOMPILE) -c simu.c eigen.o: eigen.c eigen.h $(SCOMPILE) -c eigen.c pars.o: pars.c pars.h $(SCOMPILE) -c pars.c alrt.o: alrt.c alrt.h $(SCOMPILE) -c alrt.c interface.o: interface.c interface.h $(SCOMPILE) -c interface.c cl.o: cl.c cl.h $(SCOMPILE) -c cl.c spr.o: spr.c spr.h $(SCOMPILE) -c spr.c mg.o: mg.c $(SCOMPILE) -c mg.c draw.o: draw.c $(SCOMPILE) -c draw.c rates.o: rates.c $(SCOMPILE) -c rates.c rwrapper.o: rwrapper.c $(SCOMPILE) -c rwrapper.c numeric.o: numeric.c $(SCOMPILE) -c numeric.c mcmc.o: mcmc.c $(SCOMPILE) -c mcmc.c phyml-3.3.20220408/src/alrt.c000066400000000000000000001132121422404706600153120ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Implementation of aLRT branch tests, and 5-branchs NNI research optimization. Authors : Jean-Francois Dufayard & Stephane Guindon. */ #include "alrt.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Check every testable branch of the tree, * check for NNIs, optimizing 5 branches, * param tree : the tree to check */ int Check_NNI_Five_Branches(t_tree *tree) { int best_edge; phydbl best_gain; int best_config; int i; int better_found; /* = 1 if a phylogeny with greater likelihood than current one was found */ int result; phydbl init_lnL; init_lnL = UNLIKELY; better_found = YES; //While there is at least one NNI to do... while(better_found == YES) { Update_Dirs(tree); //Interface output if(tree->verbose > VL0 && tree->io->quiet == NO) PhyML_Printf("\n\n. Checking for NNIs, optimizing five branches...\n"); better_found = 0; result = -1; best_edge = -1; best_gain = tree->mod->s_opt->min_diff_lk_local; best_config = -1; MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); init_lnL = Lk(NULL,tree); MIXT_Set_Alias_Subpatt(NO,tree); // For every branch for(i=0;i<2*tree->n_otu-3;++i) { //if this branch is not terminal if((!tree->a_edges[i]->left->tax) && (!tree->a_edges[i]->rght->tax)) { result = -1; //Try every NNIs for the tested branch result = NNI_Neigh_BL(tree->a_edges[i],tree); //Look for possible NNI to do, and check if it is the best one switch(result) { case 1 : /* lk1 > lk0 > lk2 */ { if((tree->a_edges[i]->nni->lk0 - tree->a_edges[i]->nni->lk1) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk0-tree->a_edges[i]->nni->lk1; best_config = 1; } break; } case 2 : /* lk2 > lk0 > lk1 */ { if((tree->a_edges[i]->nni->lk0 - tree->a_edges[i]->nni->lk2) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk0-tree->a_edges[i]->nni->lk2; best_config = 2; } break; } case 3 : /* lk1 > lk2 > lk0 */ { if((tree->a_edges[i]->nni->lk2 - tree->a_edges[i]->nni->lk1) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk2-tree->a_edges[i]->nni->lk1; best_config = 1; } break; } case 4 : /* lk2 > lk1 > lk0 */ { if((tree->a_edges[i]->nni->lk1 - tree->a_edges[i]->nni->lk2) < best_gain) { better_found = YES; best_edge = i; best_gain = tree->a_edges[i]->nni->lk1-tree->a_edges[i]->nni->lk2; best_config = 2; } break; } default : /* lk2 = lk1 = lk0 */ { if(best_gain > .0) best_gain = .0; break; } } } } if((tree->c_lnL < init_lnL - tree->mod->s_opt->min_diff_lk_local) || (tree->c_lnL > init_lnL + tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n\n== tree->c_lnL = %f init_lnL = %f.",tree->c_lnL,init_lnL); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n.\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } //Don't do any NNI if the user doesn't want to optimize topology if(!tree->mod->s_opt->opt_topo) better_found = NO; /* if(FABS(best_gain) <= tree->mod->s_opt->min_diff_lk_move) better_found = 0; */ //If there is one swap to do, make the best one. if(better_found) { Make_Target_Swap(tree,tree->a_edges[best_edge],best_config); MIXT_Set_Alias_Subpatt(YES,tree); Lk(NULL,tree); MIXT_Set_Alias_Subpatt(YES,tree); if(tree->c_lnL < init_lnL) { PhyML_Fprintf(stderr,"\n\n== tree->c_lnL = %f init_lnL = %f.",tree->c_lnL,init_lnL); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n.\n",__FILE__,__LINE__); Exit("\n"); } if(tree->verbose > VL0 && tree->io->quiet == NO) Print_Lk(tree,"[Topology ]"); if(FABS(tree->c_lnL - init_lnL) < tree->mod->s_opt->min_diff_lk_move) return 0; return 1; } } return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Compute aLRT supports */ void aLRT(t_tree *tree) { int i; char *method; // Print_All_Edge_Likelihoods(tree); Unscale_Br_Len_Multiplier_Tree(tree); Br_Len_Not_Involving_Invar(tree); // Print_All_Edge_Likelihoods(tree); /* aLRT support will label each internal branch */ tree->io->print_support_val = YES; /* The topology will not be modified when assessing the branch support. We make sure that it will not be modified afterwards by locking the topology */ method = (char *)mCalloc(100,sizeof(char)); switch(tree->io->ratio_test) { case ALRTCHI2: { strcpy(method,"aLRT"); break; } case MINALRTCHI2SH: { strcpy(method,"aLRT"); break; } case ALRTSTAT: { strcpy(method,"aLRT"); break; } case SH: { strcpy(method,"SH"); break; } case ABAYES: { strcpy(method,"aBayes"); break; } default : return; } if(tree->io->quiet == NO) PhyML_Printf("\n\n. Calculating fast branch supports (using '%s').",method); Free(method); MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); // Print_All_Edge_Likelihoods(tree); Lk(NULL,tree); // Print_All_Edge_Likelihoods(tree); MIXT_Set_Alias_Subpatt(NO,tree); Update_Dirs(tree); for(i=0;i<2*tree->n_otu-3;++i) { if((!tree->a_edges[i]->left->tax) && (!tree->a_edges[i]->rght->tax)) { /* Compute likelihoods for each of the three configuration */ NNI_Neigh_BL(tree->a_edges[i],tree); /* Compute the corresponding statistical support */ Compute_Likelihood_Ratio_Test(tree->a_edges[i],tree); } } tree->lock_topo = YES; Br_Len_Involving_Invar(tree); Rescale_Br_Len_Multiplier_Tree(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Launch one branch testing, * analyse the result * and convert supports as wished by the user. * param tree : the tree to check * param tested_t_edge : the tested t_edge of the tree * param old_loglk : the initial likelihood, before any aLRT analysis * param isBoot : 1 if used from the Bootstrap procedure, 0 if not * return an integer, informative to analyse the results and potential NNIs to do */ int Compute_Likelihood_Ratio_Test(t_edge *tested_edge, t_tree *tree) { int result=0; tested_edge->ratio_test = 0.0; tested_edge->alrt_statistic = -1.0; if((tested_edge->nni->lk0 > tested_edge->nni->lk1) && (tested_edge->nni->lk0 > tested_edge->nni->lk2)) { if(tested_edge->nni->lk1 < tested_edge->nni->lk2) { //lk0 > lk2 > lk1 tested_edge->alrt_statistic = 2*(tested_edge->nni->lk0 - tested_edge->nni->lk2); } else { //lk0 > lk1 >= lk2 tested_edge->alrt_statistic = 2*(tested_edge->nni->lk0 - tested_edge->nni->lk1); } if (tested_edge->alrt_statistic < 0.0) { tested_edge->alrt_statistic = 0.0; tested_edge->ratio_test = 0.0; } else { //aLRT statistic is valid, compute the branch support if (tree->io->ratio_test == ALRTCHI2) { tested_edge->ratio_test = Statistics_To_Probabilities(tested_edge->alrt_statistic); } else if(tree->io->ratio_test == MINALRTCHI2SH) { phydbl sh_support; phydbl param_support; sh_support = Statistics_To_SH(tree); param_support = Statistics_To_Probabilities(tested_edge->alrt_statistic); if(sh_support < param_support) tested_edge->ratio_test = sh_support; else tested_edge->ratio_test = param_support; } else if(tree->io->ratio_test == ALRTSTAT) { tested_edge->ratio_test=tested_edge->alrt_statistic; } else if(tree->io->ratio_test == SH) { tested_edge->ratio_test = Statistics_To_SH(tree); } else if(tree->io->ratio_test == ABAYES) { phydbl Kp0,Kp1,Kp2,logK; logK = 1. - MAX(MAX(tested_edge->nni->lk0,tested_edge->nni->lk1),tested_edge->nni->lk2); Kp0 = exp(tested_edge->nni->lk0+logK); Kp1 = exp(tested_edge->nni->lk1+logK); Kp2 = exp(tested_edge->nni->lk2+logK); tested_edge->ratio_test = Kp0/(Kp0+Kp1+Kp2); } } } //statistic is not valid, give the negative statistics if wished, or a zero support. else if((tested_edge->nni->lk1 > tested_edge->nni->lk0) && (tested_edge->nni->lk1 > tested_edge->nni->lk2)) { /* tested_edge->ratio_test = 2*(tested_edge->nni->lk0-tested_edge->nni->lk1); */ tested_edge->ratio_test = 0.0; if(tree->io->ratio_test > 1) tested_edge->alrt_statistic = 0.0; } else if((tested_edge->nni->lk2 > tested_edge->nni->lk0) && (tested_edge->nni->lk2 > tested_edge->nni->lk1)) { /* tested_edge->ratio_test = 2*(tested_edge->nni->lk0-tested_edge->nni->lk2); */ tested_edge->ratio_test = 0.0; if(tree->io->ratio_test > 1) tested_edge->alrt_statistic = 0.0; } else // lk0 ~ lk1 ~ lk2 { tested_edge->ratio_test = 0.0; if(tree->io->ratio_test > 1) tested_edge->ratio_test = 0.0; } return result; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Test the 3 NNI positions for one branch. * param tree : the tree to check * param tested_t_edge : the tested t_edge of the tree * param old_loglk : the initial likelihood, before any aLRT analysis * param isBoot : 1 if used from the Bootstrap procedure, 0 if not */ int NNI_Neigh_BL(t_edge *b_fcus, t_tree *tree) { /*! syntax : (node) [edge] (left_1) . .(right_1) \ (left) (right) / \._____________./ / [b_fcus] \ / \ (left_2) . .(right_2) */ int site; t_node *v1,*v2,*v3,*v4; t_edge *e1,*e2,*e3,*e4; scalar_dbl *len_e1,*len_e2,*len_e3,*len_e4; scalar_dbl *var_e1,*var_e2,*var_e3,*var_e4; phydbl lk0, lk1, lk2; scalar_dbl *l_init,*v_init; phydbl lk_init, lk_temp; int i; int result; void *buff; result = 0; /*! Initialization */ l_init = Duplicate_Scalar_Dbl(b_fcus->l); v_init = Duplicate_Scalar_Dbl(b_fcus->l_var); lk_init = tree->c_lnL; lk_temp = UNLIKELY; lk0 = lk1 = lk2 = UNLIKELY; v1 = v2 = v3 = v4 = NULL; Init_NNI_Score(0.0,b_fcus,tree); /*! vertices */ v1 = b_fcus->left->v[b_fcus->l_v1]; v2 = b_fcus->left->v[b_fcus->l_v2]; v3 = b_fcus->rght->v[b_fcus->r_v1]; v4 = b_fcus->rght->v[b_fcus->r_v2]; if(v1->num < v2->num) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); } if(v3->num < v4->num) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); } /*! edges */ e1 = b_fcus->left->b[b_fcus->l_v1]; e2 = b_fcus->left->b[b_fcus->l_v2]; e3 = b_fcus->rght->b[b_fcus->r_v1]; e4 = b_fcus->rght->b[b_fcus->r_v2]; /*! record initial branch lengths */ len_e1 = Duplicate_Scalar_Dbl(e1->l); len_e2 = Duplicate_Scalar_Dbl(e2->l); len_e3 = Duplicate_Scalar_Dbl(e3->l); len_e4 = Duplicate_Scalar_Dbl(e4->l); var_e1 = Duplicate_Scalar_Dbl(e1->l_var); var_e2 = Duplicate_Scalar_Dbl(e2->l_var); var_e3 = Duplicate_Scalar_Dbl(e3->l_var); var_e4 = Duplicate_Scalar_Dbl(e4->l_var); /*! Optimize branch lengths and update likelihoods for the original configuration. */ do { lk0 = lk_temp; for(i=0;i<3;i++) //a branch has three nodes if(b_fcus->left->v[i] != b_fcus->rght) //Only consider left_1 and left_2 { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) //Only consider right_1 and right_2 { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(lk_temp < lk0 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_temp = %f lk0 = %f\n",lk_temp,lk0); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit("\n"); } } while(fabs(lk_temp-lk0) > tree->mod->s_opt->min_diff_lk_global); //until no significative improvement is detected lk0 = tree->c_lnL; buff = (t_tree *)tree; do { for(site=0;siten_pattern;site++) tree->log_lks_aLRT[0][site] = tree->c_lnL_sorted[site]; tree = tree->next_mixt; } while(tree); tree = (t_tree *)buff; /*! Go back to initial branch lengths */ Copy_Scalar_Dbl(len_e1,e1->l); Copy_Scalar_Dbl(len_e2,e2->l); Copy_Scalar_Dbl(len_e3,e3->l); Copy_Scalar_Dbl(len_e4,e4->l); Copy_Scalar_Dbl(l_init,b_fcus->l); Copy_Scalar_Dbl(var_e1,e1->l_var); Copy_Scalar_Dbl(var_e2,e2->l_var); Copy_Scalar_Dbl(var_e3,e3->l_var); Copy_Scalar_Dbl(var_e4,e4->l_var); Copy_Scalar_Dbl(v_init,b_fcus->l_var); Update_PMat_At_Given_Edge(e1,tree); Update_PMat_At_Given_Edge(e2,tree); Update_PMat_At_Given_Edge(e3,tree); Update_PMat_At_Given_Edge(e4,tree); Update_PMat_At_Given_Edge(b_fcus,tree); /* Sanity check */ MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); if((lk_temp > lk_init + tree->mod->s_opt->min_diff_lk_local) || (lk_temp < lk_init - tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n. lk_temp = %f lk_init = %f",lk_temp,lk_init); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } /*! Do first possible swap */ Swap(v2,b_fcus->left,b_fcus->rght,v3,tree); MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk1 = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); /*! Optimize branch lengths and update likelihoods */ lk_temp = UNLIKELY; do { lk1 = lk_temp; for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(lk_temp < lk1 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n. lk_temp = %f lk1 = %f\n",lk_temp,lk1); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); } } while(FABS(lk_temp-lk1) > tree->mod->s_opt->min_diff_lk_global); /*! until no significative improvement is detected */ lk1 = tree->c_lnL; /*! record likelihood of each site, in order to compute branch supports */ buff = (t_tree *)tree; do { for(site=0;siten_pattern;site++) tree->log_lks_aLRT[1][site]= tree->c_lnL_sorted[site]; tree = tree->next_mixt; } while(tree); tree = (t_tree *)buff; Swap(v3,b_fcus->left,b_fcus->rght,v2,tree); /*! Go back to initial branch lengths */ Copy_Scalar_Dbl(len_e1,e1->l); Copy_Scalar_Dbl(len_e2,e2->l); Copy_Scalar_Dbl(len_e3,e3->l); Copy_Scalar_Dbl(len_e4,e4->l); Copy_Scalar_Dbl(l_init,b_fcus->l); Copy_Scalar_Dbl(var_e1,e1->l_var); Copy_Scalar_Dbl(var_e2,e2->l_var); Copy_Scalar_Dbl(var_e3,e3->l_var); Copy_Scalar_Dbl(var_e4,e4->l_var); Copy_Scalar_Dbl(v_init,b_fcus->l_var); Update_PMat_At_Given_Edge(e1,tree); Update_PMat_At_Given_Edge(e2,tree); Update_PMat_At_Given_Edge(e3,tree); Update_PMat_At_Given_Edge(e4,tree); Update_PMat_At_Given_Edge(b_fcus,tree); /* Sanity check */ MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); Update_Partial_Lk(tree,b_fcus,b_fcus->left); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); if((lk_temp > lk_init + tree->mod->s_opt->min_diff_lk_local) || (lk_temp < lk_init - tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n== lk_temp = %f lk_init = %f",lk_temp,lk_init); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } /*! do the second possible swap */ Swap(v2,b_fcus->left,b_fcus->rght,v4,tree); Set_Both_Sides(YES,tree); MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk2 = Lk(b_fcus,tree); MIXT_Set_Alias_Subpatt(NO,tree); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); /*! Optimize branch lengths and update likelihoods */ lk_temp = UNLIKELY; do { lk2 = lk_temp; for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); if(lk_temp < lk2 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== l: %f var:%f",b_fcus->left->b[i]->l->v,b_fcus->left->b[i]->l_var->v); PhyML_Fprintf(stderr,"\n== lk_temp = %f lk2 = %f",lk_temp,lk2); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); if(lk_temp < lk2 - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== l: %f var:%f",b_fcus->l->v,b_fcus->l_var->v); PhyML_Fprintf(stderr,"\n== lk_temp = %f lk2 = %f",lk_temp,lk2); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); if(lk_temp < lk2 - tree->mod->s_opt->min_diff_lk_local) { Set_Both_Sides(YES,tree); Lk(b_fcus,tree); Check_Lk_At_Given_Edge(YES,tree); PhyML_Fprintf(stderr,"\n== l: %f var:%f",b_fcus->rght->b[i]->l->v,b_fcus->rght->b[i]->l_var->v); PhyML_Fprintf(stderr,"\n== lk_temp = %f lk2 = %f",lk_temp,lk2); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d",__FILE__,__LINE__); Exit("\n"); } } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); } while(FABS(lk_temp-lk2) > tree->mod->s_opt->min_diff_lk_global); //until no significative improvement is detected lk2 = tree->c_lnL; /*! save likelihood of each sites, in order to compute branch supports */ buff = (t_tree *)tree; do { for(site=0;siten_pattern;site++) tree->log_lks_aLRT[2][site]= tree->c_lnL_sorted[site]; tree = tree->next_mixt; } while(tree); tree = (t_tree *)buff; /*! undo the swap */ Swap(v4,b_fcus->left,b_fcus->rght,v2,tree); /***********/ /*! restore the initial branch length values */ Copy_Scalar_Dbl(len_e1,e1->l); Copy_Scalar_Dbl(len_e2,e2->l); Copy_Scalar_Dbl(len_e3,e3->l); Copy_Scalar_Dbl(len_e4,e4->l); Copy_Scalar_Dbl(l_init,b_fcus->l); Copy_Scalar_Dbl(var_e1,e1->l_var); Copy_Scalar_Dbl(var_e2,e2->l_var); Copy_Scalar_Dbl(var_e3,e3->l_var); Copy_Scalar_Dbl(var_e4,e4->l_var); Copy_Scalar_Dbl(v_init,b_fcus->l_var); /*! recompute likelihoods */ Update_PMat_At_Given_Edge(e1,tree); Update_PMat_At_Given_Edge(e2,tree); Update_PMat_At_Given_Edge(e3,tree); Update_PMat_At_Given_Edge(e4,tree); Update_PMat_At_Given_Edge(b_fcus,tree); MIXT_Set_Alias_Subpatt(YES,tree); Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); MIXT_Set_Alias_Subpatt(NO,tree); lk_temp = Lk(b_fcus,tree); if((lk_temp > lk_init + tree->mod->s_opt->min_diff_lk_local) || (lk_temp < lk_init - tree->mod->s_opt->min_diff_lk_local)) { PhyML_Fprintf(stderr,"\n== lk_temp = %f lk_init = %f",lk_temp,lk_init); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } //save likelihoods in NNI structures b_fcus->nni->lk0 = lk0; b_fcus->nni->lk1 = lk1; b_fcus->nni->lk2 = lk2; b_fcus->nni->score = lk0 - MAX(lk1,lk2); if((b_fcus->nni->score < tree->mod->s_opt->min_diff_lk_local) && (b_fcus->nni->score > -tree->mod->s_opt->min_diff_lk_local)) { b_fcus->nni->score = .0; b_fcus->nni->lk1 = b_fcus->nni->lk2 = b_fcus->nni->lk0; } if((b_fcus->nni->lk1 > b_fcus->nni->lk0) && (b_fcus->nni->lk1 > b_fcus->nni->lk2)) { if(b_fcus->nni->lk0 > b_fcus->nni->lk2) result = 1; //lk1 > lk0 > lk2 else result = 3; //lk1 > lk2 > lk0 } else if((b_fcus->nni->lk2 > b_fcus->nni->lk0) && (b_fcus->nni->lk2 > b_fcus->nni->lk1)) { if(b_fcus->nni->lk0 > b_fcus->nni->lk1) result = 2; //lk2 > lk0 > lk1 else result = 4; //lk2 > lk1 > lk0 } Free_Scalar_Dbl(len_e1); Free_Scalar_Dbl(len_e2); Free_Scalar_Dbl(len_e3); Free_Scalar_Dbl(len_e4); Free_Scalar_Dbl(l_init); Free_Scalar_Dbl(var_e1); Free_Scalar_Dbl(var_e2); Free_Scalar_Dbl(var_e3); Free_Scalar_Dbl(var_e4); Free_Scalar_Dbl(v_init); return result; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* * Make one target swap, optimizing five branches. * param tree : the tree to check * param tested_t_edge : the swaping t_edge of the tree * param swapToDo : 1 or 2, to select the first or the second swap to do */ void Make_Target_Swap(t_tree *tree, t_edge *b_fcus, int swaptodo) { t_node *v1,*v2,*v3,*v4; phydbl lktodo; phydbl lk_init, lk_temp; int i; if(swaptodo < 0) { PhyML_Fprintf(stderr,"\n== Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } //Initialization lk_init = tree->c_lnL; b_fcus->nni->score = .0; lktodo = UNLIKELY; v1 = v2 = v3 = v4 = NULL; v1 = b_fcus->left->v[b_fcus->l_v1]; v2 = b_fcus->left->v[b_fcus->l_v2]; v3 = b_fcus->rght->v[b_fcus->r_v1]; v4 = b_fcus->rght->v[b_fcus->r_v2]; if(v1->num < v2->num) { PhyML_Fprintf(stderr,"\n== Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(v3->num < v4->num) { PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } /***********/ //make the selected swap if(swaptodo==1) { Swap(v2,b_fcus->left,b_fcus->rght,v3,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) Swap(v3,b_fcus->left,b_fcus->rght,v2,tree); } else { Swap(v2,b_fcus->left,b_fcus->rght,v4,tree); if(!Check_Topo_Constraints(tree,tree->io->cstr_tree)) Swap(v4,b_fcus->left,b_fcus->rght,v2,tree); } MIXT_Set_Alias_Subpatt(YES,tree); Set_Both_Sides(YES,tree); lktodo = Update_Lk_At_Given_Edge(b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); MIXT_Set_Alias_Subpatt(NO,tree); //Optimize branch lengths and update likelihoods lk_temp = UNLIKELY; do { lktodo = lk_temp; for(i=0;i<3;i++) if(b_fcus->left->v[i] != b_fcus->rght) { Update_Partial_Lk(tree,b_fcus->left->b[i],b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->left->b[i]->l->v),b_fcus->left->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->left); lk_temp = Br_Len_Opt(&(b_fcus->l->v),b_fcus,tree); for(i=0;i<3;i++) if(b_fcus->rght->v[i] != b_fcus->left) { Update_Partial_Lk(tree,b_fcus->rght->b[i],b_fcus->rght); lk_temp = Br_Len_Opt(&(b_fcus->rght->b[i]->l->v),b_fcus->rght->b[i],tree); } Update_Partial_Lk(tree,b_fcus,b_fcus->rght); if(lk_temp < lktodo - tree->mod->s_opt->min_diff_lk_local) { PhyML_Fprintf(stderr,"\n== Edge %3d lk_temp = %f lktodo = %f\n",b_fcus->num,lk_temp,lktodo); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } } while(FABS(lk_temp-lktodo) > tree->mod->s_opt->min_diff_lk_global); //until no significative improvement is detected /* PhyML_Printf("\n.<< [%3d] l=%f lk_init=%f tree->c_lnL=%f score=%12f v1=%3d v2=%3d v3=%3d v4=%3d >>", */ /* b_fcus->num, */ /* b_fcus->l->v, */ /* lk_init, */ /* tree->c_lnL, */ /* lk_init-tree->c_lnL, */ /* v1->num,v2->num,v3->num,v4->num); */ if(tree->c_lnL < lk_init - tree->mod->s_opt->min_diff_lk_global) { PhyML_Fprintf(stderr,"\n== [%3d] v1=%d v2=%d v3=%d v4=%d",b_fcus->num,v1->num,v2->num,v3->num,v4->num); PhyML_Fprintf(stderr,"\n== tree->c_lnL = %f lk_init = %f\n",tree->c_lnL,lk_init); PhyML_Fprintf(stderr,"\n== Err. in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit(""); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * Convert an aLRT statistic to a non-parametric support * param in: the statistic */ phydbl Statistics_To_Probabilities(phydbl in) { phydbl rough_value=0.0; phydbl a=0.0; phydbl b=0.0; phydbl fa=0.0; phydbl fb=0.0; if(in>=0.000000393 && in<0.00000157) { a=0.000000393; b=0.00000157; fa=0.0005; fb=0.001; } else if(in>=0.00000157 && in<0.0000393) { a=0.00000157; b=0.0000393; fa=0.001; fb=0.005; } else if(in>=0.0000393 && in<0.000157) { a=0.0000393; b=0.000157; fa=0.005; fb=0.01; } else if(in>=0.000157 && in<0.000982) { a=0.000157; b=0.000982; fa=0.01; fb=0.025; } else if(in>=0.000982 && in<0.00393) { a=0.000982; b=0.00393; fa=0.025; fb=0.05; } else if(in>=0.00393 && in<0.0158) { a=0.00393; b=0.0158; fa=0.05; fb=0.1; } else if(in>=0.0158 && in<0.0642) { a=0.0158; b=0.0642; fa=0.1; fb=0.2; } else if(in>=0.0642 && in<0.148) { a=0.0642; b=0.148; fa=0.2; fb=0.3; } else if(in>=0.148 && in<0.275) { a=0.148; b=0.275; fa=0.3; fb=0.4; } else if(in>=0.275 && in<0.455) { a=0.275; b=0.455; fa=0.4; fb=0.5; } else if(in>=0.455 && in<0.708) { a=0.455; b=0.708; fa=0.5; fb=0.6; } else if(in>=0.708 && in<1.074) { a=0.708; b=1.074; fa=0.6; fb=0.7; } else if(in>=1.074 && in<1.642) { a=1.074; b=1.642; fa=0.7; fb=0.8; } else if(in>=1.642 && in<2.706) { a=1.642; b=2.706; fa=0.8; fb=0.9; } else if(in>=2.706 && in<3.841) { a=2.706; b=3.841; fa=0.9; fb=0.95; } else if(in>=3.841 && in<5.024) { a=3.841; b=5.024; fa=0.95; fb=0.975; } else if(in>=5.024 && in<6.635) { a=5.024; b=6.635; fa=0.975; fb=0.99; } else if(in>=6.635 && in<7.879) { a=6.635; b=7.879; fa=0.99; fb=0.995; } else if(in>=7.879 && in<10.828) { a=7.879; b=10.828; fa=0.995; fb=0.999; } else if(in>=10.828 && in<12.116) { a=10.828; b=12.116; fa=0.999; fb=0.9995; } if (in>=12.116) { rough_value=0.9999; } else if(in<0.000000393) { rough_value=0.0001; } else { rough_value=(b-in)/(b-a)*fa + (in - a)/(b-a)*fb; } rough_value=rough_value+(1.0-rough_value)/2.0; rough_value=rough_value*rough_value*rough_value; return rough_value; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * deprecated * Compute a RELL support, using the latest tested branch * param tree: the tested tree */ phydbl Statistics_to_RELL(t_tree *tree) { int i; int occurence=10000; phydbl nb=0.0; phydbl res,*pi; int site; phydbl lk0=0.0; phydbl lk1=0.0; phydbl lk2=0.0; int position = -1; t_tree *buff_tree; int* samples; /*! 1000 times */ for(i=0;idata->crunch_len,sizeof(phydbl)); for(site=0;siten_pattern;site++) pi[site] = tree->data->wght[site] / (phydbl)tree->data->init_len; samples = Sample_n_i_With_Proba_pi(pi,tree->n_pattern,tree->data->init_len); For(site, tree->data->init_len) { position = samples[site]; lk0+=tree->log_lks_aLRT[0][position]; lk1+=tree->log_lks_aLRT[1][position]; lk2+=tree->log_lks_aLRT[2][position]; } if (lk0>=lk1 && lk0>=lk2) nb++; tree = tree->next_mixt; Free(samples); Free(pi); } while(tree); tree = buff_tree; } res= nb/(phydbl)occurence; return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Compute a SH-like support, using the latest tested branch param tree: the tested tree */ phydbl Statistics_To_SH(t_tree *tree) { int i; int occurence=10000; phydbl nb=0.0; phydbl res; int site; phydbl lk0=0.0; phydbl lk1=0.0; phydbl lk2=0.0; phydbl c0=0.0; phydbl c1=0.0; phydbl c2=0.0; int position=-1; phydbl delta_local=-1.; phydbl delta=0.0; t_tree *buff_tree; phydbl *pi; int* samples; /*! Compute the total log-lk of each NNI position */ buff_tree = tree; do { For(site, tree->n_pattern) { c0+=tree->log_lks_aLRT[0][site] * tree->data->wght[site]; c1+=tree->log_lks_aLRT[1][site] * tree->data->wght[site]; c2+=tree->log_lks_aLRT[2][site] * tree->data->wght[site]; } tree = tree->next_mixt; } while(tree); tree = buff_tree; if (c0>=c1 && c0>=c2) { if (c1>=c2) { delta=c0-c1; } else { delta=c0-c2; } } else if(c1>=c0 && c1>=c2) { if (c0>=c2) { delta=c1-c0; } else { delta=c1-c2; } } else { if (c1>=c0) { delta=c2-c1; } else { delta=c2-c0; } } /*! 1000 times */ for(i=0;idata->crunch_len,sizeof(phydbl)); for(site=0;siten_pattern;site++) pi[site] = tree->data->wght[site] / (phydbl)tree->data->init_len; samples = Sample_n_i_With_Proba_pi(pi,tree->n_pattern,tree->data->init_len); /*! Shuffle the data */ For(site, tree->data->init_len) { position = samples[site]; lk0+=tree->log_lks_aLRT[0][position]; lk1+=tree->log_lks_aLRT[1][position]; lk2+=tree->log_lks_aLRT[2][position]; } tree = tree->next_mixt; Free(samples); Free(pi); } while(tree); tree = buff_tree; /*! return to null hypothesis */ lk0=lk0-c0; lk1=lk1-c1; lk2=lk2-c2; /*! compute results and increment if needed */ delta_local=0.0; if (lk0>=lk1 && lk0>=lk2) { if (lk1>=lk2) { delta_local=lk0-lk1; } else { delta_local=lk0-lk2; } } else if(lk1>=lk0 && lk1>=lk2) { if (lk0>=lk2) { delta_local=lk1-lk0; } else { delta_local=lk1-lk2; } } else { if (lk1>=lk0) { delta_local=lk2-lk1; } else { delta_local=lk2-lk0; } } if (delta>(delta_local+0.1)) { nb++; } } res= nb/occurence; return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /** * deprecated * Compute one side likelihood * param b_fcus : concerned edge * param tree : b_fcus tree * param exclude : side to exclude for computation */ phydbl Update_Lk_At_Given_Edge_Excluding(t_edge *b_fcus, t_tree *tree, t_node *exclude) { if((!b_fcus->left->tax) && (exclude == NULL || exclude != b_fcus->left)) Update_Partial_Lk(tree,b_fcus,b_fcus->left); if((!b_fcus->rght->tax) && (exclude == NULL || exclude != b_fcus->rght)) Update_Partial_Lk(tree,b_fcus,b_fcus->rght); tree->c_lnL = Lk(b_fcus,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/alrt.h000066400000000000000000000016631422404706600153250ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef ALRT_H #define ALRT_H #include "utilities.h" #include "lk.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "simu.h" void aLRT(t_tree *tree); int Check_NNI_Five_Branches(t_tree *tree); int Compute_Likelihood_Ratio_Test(t_edge *tested_edge, t_tree *tree); int NNI_Neigh_BL(t_edge *b_fcus, t_tree *tree); void Make_Target_Swap(t_tree *tree, t_edge *b_fcus, int swaptodo); phydbl Statistics_To_Probabilities(phydbl in); phydbl Statistics_To_RELL(t_tree *tree); phydbl Statistics_To_SH(t_tree *tree); phydbl Update_Lk_At_Given_Edge_Excluding(t_edge *b_fcus, t_tree *tree, t_node *exclude); #endif phyml-3.3.20220408/src/ancestral.c000066400000000000000000001060271422404706600163320ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "ancestral.h" void Sample_Ancestral_Seq(int fullmutmap, int fromprior, t_tree *tree) { int rate_cat; int i,j,k,l; phydbl *probs; phydbl sum; int n_mut; FILE *fp; phydbl *muttime; int *muttype,*muttax; char *s,*mut_string; int *ordering; if(tree->is_mixt_tree == YES) { MIXT_Sample_Ancestral_Seq(fullmutmap,fromprior,tree); return; } probs = (phydbl *)mCalloc(tree->mod->ras->n_catg,sizeof(phydbl)); muttime = (phydbl *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(phydbl)); muttype = (int *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(int)); muttax = (int *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(int)); ordering = (int *)mCalloc((2*tree->n_otu-3)*5, // At most 5 mutations per branch on average sizeof(int)); s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) { tree->a_nodes[i]->c_seq_anc = (align *)mCalloc(1,sizeof(align));; tree->a_nodes[i]->c_seq_anc->state = (char *)mCalloc(tree->n_pattern,sizeof(char)); } /* Update P(D_x|X=i) for each state i and node X */ Set_Both_Sides(YES,tree); Lk(NULL,tree); for(i=0;in_pattern;++i) { /* Sample the rate class from its posterior density */ for(j=0;jmod->ras->n_catg;j++) { if(fromprior == NO) probs[j] = tree->unscaled_site_lk_cat[i*tree->mod->ras->n_catg+j]* tree->mod->ras->gamma_r_proba->v[j]; else probs[j] = tree->mod->ras->gamma_r_proba->v[j]; } /* Scale probas. */ sum = .0; for(j=0;jmod->ras->n_catg;j++) sum += probs[j]; for(j=0;jmod->ras->n_catg;j++) probs[j]/=sum; rate_cat = Sample_i_With_Proba_pi(probs,tree->mod->ras->n_catg); n_mut = 0; if(tree->n_root != NULL) { Sample_Ancestral_Seq_Pre(tree->n_root,tree->n_root->v[1],tree->n_root->b[1], i,rate_cat, muttype,muttime,muttax,&n_mut, fullmutmap,fromprior,tree); Sample_Ancestral_Seq_Pre(tree->n_root,tree->n_root->v[2],tree->n_root->b[2], i,rate_cat, muttype,muttime,muttax,&n_mut, fullmutmap,fromprior,tree); } else { Sample_Ancestral_Seq_Pre(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree->a_nodes[0]->b[0], i,rate_cat, muttype,muttime,muttax,&n_mut, fullmutmap,fromprior,tree); } for(j=0;j muttime[j]) ordering[k]++; else ordering[j]++; } } strcpy(s,"mutmap."); sprintf(s+strlen(s),"%d.",tree->io->r_seed); sprintf(s+strlen(s),"%d",i); fp = fopen(s,"a"); PhyML_Fprintf(fp,"\n-1 -1 -1.0 -1 %d",tree->mixt_tree ? tree->mixt_tree->mcmc->run : tree->mcmc->run); Reverse_Muttime(muttime,n_mut,tree); for(j=0;jdata->init_len;l++) if(tree->data->sitepatt[l] == i) break; mut_string = Mutation_Id(muttype[k],tree); PhyML_Fprintf(fp,"\n%4d %s %g %4d %s",j,mut_string,muttime[k],l,tree->a_nodes[muttax[k]]->name); Free(mut_string); break; } } } for(j=0;j> a: %d d: %d b->left: %d b->rght: %d",a?a->num:-1,d?d->num:-1,b?b->left->num:-1,b?b->rght->num:-1); */ ns = tree->mod->ns; probs = (phydbl *)mCalloc(ns,sizeof(phydbl)); if(a->tax == TRUE) // Sample state at tip if observed state is ambiguous { assert(b); if(a == b->left) for(i=0;ip_lk_tip_l[site*ns+i]; else for(i=0;ip_lk_tip_r[site*ns+i]; for(i=0;imod->e_frq->pi->v[i]; sum = 0.0; for(i=0;in_root) { sa = Sample_Ancestral_Seq_Core(NULL,tree->n_root,NULL,r_cat,site,tree); } else { sa = Assign_State(a->c_seq_anc->state + site, tree->mod->io->datatype, tree->mod->io->state_len); } sd = Sample_Ancestral_Seq_Core(a,d,b,r_cat,site,tree); if(fullmutmap == YES) Map_Mutations(a,d,sa,sd,b,site,r_cat,muttype,muttime,muttax,n_mut,tree); if(d->tax) return; else { for(i=0;i<3;++i) { if(d->v[i] != a && d->b[i] != tree->e_root) { Sample_Ancestral_Seq_Pre(d,d->v[i],d->b[i],site,r_cat,muttype,muttime,muttax,n_mut,fullmutmap,fromprior,tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Sample_Ancestral_Seq_Core(t_node *a, t_node *d, t_edge *b, int r_cat, int site, t_tree *tree) { int i,j; int ns; ns = tree->mod->ns; int dim1 = tree->mod->ras->n_catg * ns; int dim2 = ns; int dim3 = ns * ns; phydbl *probs,*Pij,sum; int state; probs = (phydbl *)mCalloc(ns,sizeof(phydbl)); state = -1; if(d->tax == YES) { assert(b); if(d == b->left) for(i=0;ip_lk_tip_l[site*ns+i]; else if(d == b->rght) for(i=0;ip_lk_tip_r[site*ns+i]; else assert(FALSE); for(i=0;imod->e_frq->pi->v[i]; sum = 0.0; for(i=0;in_root); phydbl r,l; Update_PMat_At_Given_Edge(tree->n_root->b[1],tree); Update_PMat_At_Given_Edge(tree->n_root->b[2],tree); for(i=0;ie_root->left == tree->n_root->v[1]) Pij = tree->n_root->b[1]->Pij_rr; else Pij = tree->n_root->b[2]->Pij_rr; l = 0.0; for(j=0;je_root->left->tax == NO) l += tree->e_root->p_lk_left[site*dim1+r_cat*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; else l += tree->e_root->p_lk_tip_l[site*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; } if(tree->e_root->rght == tree->n_root->v[1]) Pij = tree->n_root->b[1]->Pij_rr; else Pij = tree->n_root->b[2]->Pij_rr; r = 0.0; for(j=0;je_root->rght->tax == NO) r += tree->e_root->p_lk_rght[site*dim1+r_cat*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; else r += tree->e_root->p_lk_tip_r[site*dim2+j] * Pij[r_cat*dim3+i*dim2+j]; } probs[i] = r*l*tree->mod->e_frq->pi->v[i]; } sum = 0.0; for(i=0;ic_seq_anc->state[site] = Reciproc_Assign_State(state,tree->io->datatype); } else { assert(b); // State (already) sampled at node a state = Assign_State(a->c_seq_anc->state + site, tree->mod->io->datatype, tree->mod->io->state_len); Pij = b->Pij_rr; for(i=0;ileft) probs[i] = b->p_lk_left[site*dim1+r_cat*dim2+i] * Pij[r_cat*dim3+state*dim2+i]; else if(d == b->rght) probs[i] = b->p_lk_rght[site*dim1+r_cat*dim2+i] * Pij[r_cat*dim3+state*dim2+i]; else assert(FALSE); } sum = 0.0; for(i=0;ic_seq_anc->state[site] = Reciproc_Assign_State(state,tree->io->datatype); } } Free(probs); return state; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Map_Mutations(t_node *a, t_node *d, int sa, int sd, t_edge *b, int site, int rcat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, t_tree *tree) { int i,j; phydbl *probs,*all_probs; int slast,snew; // Last state visited phydbl tlast; phydbl *Q; phydbl u,sum; int *mut; // Array of mutations int thismut; int n_mut_branch; int n_iter; int first_mut; phydbl T; int ns,tax_idx; phydbl rr; ns = tree->mod->ns; all_probs = (phydbl *)mCalloc(ns*ns,sizeof(phydbl)); mut = (int *)mCalloc(ns*ns,sizeof(int)); // Site relative rate rr = tree->mod->ras->gamma_rr->v[rcat]; // Rate matrix Q = tree->mod->r_mat->qmat->v; // Length of the 'time' interval considered. T = 0.0; #ifdef PHYTIME T = tree->rates->cur_l[d->num]*rr; #else T = b->l->v*rr; #endif /* PhyML_Printf("\n. Mutmap: a:%d d:%d ta:%G td:%G cr:%G rr:%G l:%G", */ /* a?a->num:-1,d?d->num:-1, */ /* tree->times->nd_t[a->num], */ /* tree->times->nd_t[d->num], */ /* cr,rr, */ /* fabs(tree->times->nd_t[a->num]-tree->times->nd_t[d->num])*cr*rr); */ // Matrix of change probabilities for(i=0;ii)=0.0; all_probs[i*ns+i] = 0.0; // Normalise so that \sum_j p(i->j) = 1.0; sum = 0; for(j=0;j sample a new mutation event if(tlast < T) { first_mut = NO; n_mut_branch++; if(n_mut_branch > 5 && n_mut_branch%10 == 0) PhyML_Printf("\n. # of mutations on edge %d (length: %g) exceeds 5 (%d) ! The program will probably crash soon...:(", b->num, tree->rates ? tree->rates->cur_l[d->num] : b->l->v, n_mut_branch); snew = Sample_i_With_Proba_pi(probs,ns); // Record mutation type mut[slast*ns+snew]++; // Record mutation type in the site mutation array thismut = slast*ns+snew; muttype[(*n_mut)+n_mut_branch-1] = thismut; // Record time of mutation muttime[(*n_mut)+n_mut_branch-1] = tlast; #ifdef PHYTIME // Transform into time in calendar units muttime[(*n_mut)+n_mut_branch-1] /= tree->rates->cur_l[d->num]; muttime[(*n_mut)+n_mut_branch-1] *= fabs(tree->times->nd_t[a->num]-tree->times->nd_t[d->num]); #endif tax_idx = -1; Random_Tax_Idx(a,d,&tax_idx,tree); muttax[(*n_mut)+n_mut_branch-1] = tax_idx; // Update the last state slast = snew; } else { if(slast == sd) break; else { // Restart from the beginning for(i=0;i 0) */ /* { */ /* thismut = MIN(i,j) * ns + MAX(i,j) - (MIN(i,j)+1+(int)POW(MIN(i,j)+1,2))/2; */ /* if(tree->mixt_tree != NULL) */ /* tree->mixt_tree->mutmap[thismut*(tree->n_pattern)*(2*tree->n_otu-3) + b->num*(tree->n_pattern) + site]++; */ /* else */ /* tree->mutmap[thismut*(tree->n_pattern)*(2*tree->n_otu-3) + b->num*(tree->n_pattern) + site]++; */ /* } */ /* } */ /* } */ Free(all_probs); Free(mut); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Ancestral_Sequences(t_tree *tree, int print) { int i; if(print == YES) { PhyML_Printf("\n\n. Estimating ancestral sequences..."); strcpy(tree->io->out_ancestral_seq_file,tree->io->out_file); strcat(tree->io->out_ancestral_seq_file,"_phyml_ancestral_"); if(tree->io->append_run_ID) { strcat(tree->io->out_ancestral_seq_file,tree->io->run_id_string); strcat(tree->io->out_ancestral_seq_file,"_"); } strcat(tree->io->out_ancestral_seq_file,"seq.txt"); tree->io->fp_out_ancestral_seq = Openfile(tree->io->out_ancestral_seq_file,1); strcpy(tree->io->out_ancestral_tree_file,tree->io->out_file); strcat(tree->io->out_ancestral_tree_file,"_phyml_ancestral_"); if(tree->io->append_run_ID) { strcat(tree->io->out_ancestral_tree_file,tree->io->run_id_string); strcat(tree->io->out_ancestral_tree_file,"_"); } strcat(tree->io->out_ancestral_tree_file,"tree.txt"); tree->io->fp_out_ancestral_tree = Openfile(tree->io->out_ancestral_tree_file,1); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n\n\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Printing marginal probabilities of ancestral sequences at each site"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. of the alignment and each node of the tree. The tree in Newick format"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. with internal nodes labels corresponding to those given below can be"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. found in the file '%s'.",tree->io->out_ancestral_tree_file); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Ancestral reconstruction is conducted based on the \"Minimum Posterior Expected"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Error\" (MPEE) criterion, which accomodates for uncertainty in the selection of "); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. ancestral character states."); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Recommended citation:"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Oliva A., Pulicani S., Lefort V., Brehelin L., Gascuel O. and S. Guindon,"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. \"Accounting for ambiguity in ancestral sequence reconstruction\","); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n. Bioinformatics, Volume 35, Issue 21, 1 November 2019."); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n\n"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"Site\tNodeLabel\t"); for(i=0;imod->ns;i++) PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"%10c\t",Reciproc_Assign_State(i,tree->io->datatype)); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"MPEE\t"); PhyML_Fprintf(tree->io->fp_out_ancestral_seq,"\n"); short int bck_support = tree->io->print_support_val; tree->io->print_node_num = YES; tree->io->print_support_val = NO; char *s = Write_Tree(tree); PhyML_Fprintf(tree->io->fp_out_ancestral_tree,"%s",s); tree->io->print_node_num = NO; tree->io->print_support_val = bck_support; Free(s); fclose(tree->io->fp_out_ancestral_tree); } for(i=0;i<2*tree->n_otu-2;i++) if(tree->a_nodes[i]->tax == NO) Ancestral_Sequences_One_Node(tree->a_nodes[i],tree,print); if(tree->n_root) Ancestral_Sequences_One_Node(tree->n_root,tree,print); fclose(tree->io->fp_out_ancestral_seq); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Ancestral_Sequences_One_Node(t_node *d, t_tree *tree, int print) { if(d->tax) return; else { if(tree->is_mixt_tree) { MIXT_Ancestral_Sequences_One_Node(d,tree,print); } else { t_node *v0,*v1,*v2; // three neighbours of d t_edge *b0,*b1,*b2; int i,j; int catg; phydbl p0, p1, p2; phydbl *p; int site,csite; phydbl *p_lk0, *p_lk1, *p_lk2; int *sum_scale0, *sum_scale1, *sum_scale2; phydbl sum_probas; phydbl *Pij0, *Pij1, *Pij2; phydbl inc,sum_scale; FILE *fp; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int nsns = ns*ns; unsigned const int ncatgns = ns*ncatg; if(tree->scaling_method == SCALE_RATE_SPECIFIC) { PhyML_Fprintf(stderr,"\n. Likelihood rescaling method not compatible with the calculation of ancestral state probabilities."); Exit("\n"); } if(!d) return; fp = tree->io->fp_out_ancestral_seq; assert(fp != NULL); p = (phydbl *)mCalloc(ns,sizeof(phydbl)); for(site=0;sitedata->init_len;site++) // For each site in the current partition element { csite = tree->data->sitepatt[site]; for(i=0;iv[0]; v1 = d->v[1]; v2 = d->v[2]; b0 = d->b[0]; b1 = d->b[1]; b2 = d->b[2]; Pij0 = b0->Pij_rr; Pij1 = b1->Pij_rr; Pij2 = b2->Pij_rr; sum_scale = 0.0; if(v0 == b0->left) { p_lk0 = b0->p_lk_left; sum_scale0 = b0->sum_scale_left; } else { p_lk0 = b0->p_lk_rght; sum_scale0 = b0->sum_scale_rght; } if(v1 == b1->left) { p_lk1 = b1->p_lk_left; sum_scale1 = b1->sum_scale_left; } else { p_lk1 = b1->p_lk_rght; sum_scale1 = b1->sum_scale_rght; } if(v2 == b2->left) { p_lk2 = b2->p_lk_left; sum_scale2 = b2->sum_scale_left; } else { p_lk2 = b2->p_lk_rght; sum_scale2 = b2->sum_scale_rght; } for(catg=0;catgtax) { for(j=0;jb[0]->p_lk_tip_r[csite*ns+j] * Pij0[catg*nsns+i*ns+j]; if(isinf(p0) || isnan(p0)) { PhyML_Fprintf(stderr,"\n. p0: %G v0->b[0]->p_lk_tip_r[csite*ns+j]: %G Pij0[catg*nsns+i*ns+j]: %G\n", p0, v0->b[0]->p_lk_tip_r[csite*ns+j], Pij0[catg*nsns+i*ns+j]); Exit("\n"); } } } else { for(j=0;jtax) { for(j=0;jb[0]->p_lk_tip_r[csite*ns+j] * Pij1[catg*nsns+i*ns+j]; if(isinf(p1) || isnan(p1)) { PhyML_Fprintf(stderr,"\n. p1: %G v1->b[0]->p_lk_tip_r[csite*ns+j]: %G Pij1[catg*nsns+i*ns+j]: %G\n", p1, v1->b[0]->p_lk_tip_r[csite*ns+j], Pij1[catg*nsns+i*ns+j]); Exit("\n"); } } } else { for(j=0;jtax) { for(j=0;jb[0]->p_lk_tip_r[csite*ns+j] * Pij2[catg*nsns+i*ns+j]; } } else { for(j=0;jmod->e_frq->pi->v[i] * tree->mod->ras->gamma_r_proba->v[catg]; p[i] += inc; if(isinf(p[i]) || isnan(p[i])) { PhyML_Fprintf(stderr,"\n. site: %4d p0: %G p1: %G p2: %G tree->mod->e_frq->pi->v[i]: %G tree->cur_site_lk[csite]: %G tree->mod->ras->gamma_r_proba->v[catg]: %G tree->c_lnL_sorted[csite]: %G", csite, p0,p1,p2, tree->mod->e_frq->pi->v[i] , tree->cur_site_lk[csite] , tree->mod->ras->gamma_r_proba->v[catg], tree->c_lnL_sorted[csite]); Exit("\n"); } } /* printf("\n. site: %d || %d %d %d", */ /* csite, */ /* v0->tax ? -1 : sum_scale0[csite*ncatg+catg], */ /* v1->tax ? -1 : sum_scale1[csite*ncatg+catg], */ /* v2->tax ? -1 : sum_scale2[csite*ncatg+catg]); */ } if(tree->mod->ras->invar == YES) { int num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(sum_scale,csite,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { assert(isinf(inv_site_lk)); inv_site_lk = Invariant_Lk(0,csite,&num_prec_issue,tree); for(i=0;imod->ras->pinvar->v * tree->mod->e_frq->pi->v[i]; break; } case NO : { for(i=0;imod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v * tree->mod->e_frq->pi->v[i]; break; } } } for(i=0;ic_lnL_sorted[csite]; for(i=0;inum); for(i=0;i highest_count) { highest_count = count[i]; highest_count_idx = i; } } most_frequent_state = best_state[highest_count_idx]; Free(alpha); Free(best_state); Free(idx); Free(count); return(most_frequent_state); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ int MPEE_Score(const phydbl *alpha, int *idx, const phydbl *p, const int ns) { unsigned int i; phydbl *mpee_score,*cdf_sorted; int min_idx,res; phydbl a,b; phydbl min; mpee_score = (phydbl *)mCalloc(ns,sizeof(phydbl)); cdf_sorted = (phydbl *)mCalloc(ns,sizeof(phydbl)); cdf_sorted[0] = p[idx[0]]; for(i=1;i #ifndef ANCESTRAL_H #define ANCESTRAL_H #include "utilities.h" void Sample_Ancestral_Seq(int fullmutmap, int fromprior, t_tree *tree); void Sample_Ancestral_Seq_Pre(t_node *a, t_node *d, t_edge *b, int site, int r_cat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, int fullmutmap, int fromprior, t_tree *tree); int Sample_Ancestral_Seq_Core(t_node *a, t_node *d, t_edge *b, int r_cat, int site, t_tree *tree); void Map_Mutations(t_node *a, t_node *d, int sa, int sd, t_edge *b, int site, int rcat, int *muttype, phydbl *muttime, int *muttax, int *n_mut, t_tree *tree); void Ancestral_Sequences(t_tree *tree, int print); void Ancestral_Sequences_One_Node(t_node *d, t_tree *tree, int print); int MPEE_Score(const phydbl *alpha, int *idx, const phydbl *p, const int ns); int MPEE_Infer(const phydbl *p, const int ns); void Reverse_Muttime(phydbl *muttime, int n_mut, t_tree *tree); #endif phyml-3.3.20220408/src/avx.c000066400000000000000000000501521422404706600151510ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "assert.h" #include "avx.h" #if (defined(__AVX__) || defined(__AVX2__)) ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void AVX_Update_Eigen_Lr(t_edge *b, t_tree *tree) { unsigned int site,catg; unsigned int i,j; unsigned const int npattern = tree->n_pattern; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned const int ncatgns = ncatg*ns; const phydbl *p_lk_left,*p_lk_rght,*pi; phydbl *dot_prod,*p_lk_left_pi; phydbl *l_ev,*r_ev; __m256d *_l_ev,*_r_ev,*_prod_left,*_prod_rght; p_lk_left_pi = tree->p_lk_left_pi; l_ev = tree->l_ev; _l_ev = tree->_l_ev; _r_ev = tree->_r_ev; _prod_left = tree->_prod_left; _prod_rght = tree->_prod_rght; assert(sz == 4); assert(tree->update_eigen_lr == YES); r_ev = tree->mod->eigen->r_e_vect; /* Copy transpose of matrix of left eigen vectors */ for(i=0;imod->eigen->l_e_vect[j*ns+i]; /* Load into AVX registers */ for(i=0;ileft->tax ? b->p_lk_tip_l : b->p_lk_left; p_lk_rght = b->rght->tax ? b->p_lk_tip_r : b->p_lk_rght; pi = tree->mod->e_frq->pi->v; dot_prod = tree->dot_prod; for(site=0;sitedata->wght[site] > SMALL) { for(catg=0;catgleft->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } if(b->left->tax == YES) p_lk_left += ns; if(b->rght->tax == YES) p_lk_rght += ns; } else { if(b->left->tax == YES) p_lk_left += ns; else p_lk_left += ncatgns; if(b->rght->tax == YES) p_lk_rght += ns; else p_lk_rght += ncatgns; dot_prod += ncatgns; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state) { const unsigned int sz = (int)BYTE_ALIGN / 8; const unsigned nblocks = ns/sz; if(nblocks == 1) { __m256d _plk_r,_plk_l; if(ambiguity_check == NO) // tip case. { Pij += observed_state*ns; _plk_r = _mm256_mul_pd(_mm256_load_pd(Pij),_mm256_load_pd(p_lk_left)); return pi[observed_state] * AVX_Vect_Norm(_plk_r); } else { unsigned int i; __m256d _pijplk,_pij; _plk_r = _mm256_mul_pd(_mm256_load_pd(p_lk_rght),_mm256_load_pd(pi)); _pijplk = _mm256_setzero_pd(); for(i=0;in_pattern; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int ncatgns = ncatg * ns; const unsigned int nsns = ns * ns; const unsigned int sz = (int)BYTE_ALIGN / 8; const unsigned nblocks = ns/sz; __m256d *_tPij1,*_tPij2,*_pmat1plk1,*_pmat2plk2,*_plk0; _tPij1 = tree->_tPij1; _tPij2 = tree->_tPij2; _pmat1plk1 = tree->_pmat1plk1; _pmat2plk2 = tree->_pmat2plk2; _plk0 = tree->_plk0; sum_scale_v1_val = 0; sum_scale_v2_val = 0; n_v1 = n_v2 = NULL; plk0 = plk1 = plk2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; state_v1 = state_v2 = -1; Set_All_Partial_Lk(&n_v1,&n_v2, &plk0,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&plk1,&sum_scale_v1, &Pij2,&tPij2,&plk2,&sum_scale_v2, d,b,tree); /* PhyML_Printf("\n. b: %d b->left:%d b->rght:%d d:%d [%p,%p]", */ /* b->num, */ /* b->left->num, */ /* b->rght->num, */ /* d->num, */ /* plk0, */ /* b->p_lk_rght); */ // Copy transpose of transition matrices into AVX registers for(i=0;imod->augmented == YES) { PhyML_Printf("\n== AVX version of the Update_Partial_Lk function does not"); PhyML_Printf("\n== allow augmented data."); assert(FALSE); } /* For every site in the alignment */ for(site=0;sitedata->wght[site] > SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = YES; if(n_v1 && n_v1->tax) { ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2 && n_v2->tax) { ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } for(catg=0;catgtax) ? 0 : ns; plk2 += (n_v2->tax) ? 0 : ns; } _tPij1 -= ncatg * nsns / sz; _tPij2 -= ncatg * nsns / sz; plk1 += (n_v1->tax) ? ns : 0; plk2 += (n_v2->tax) ? ns : 0; if(tree->scaling_method == SCALE_FAST) { sum_scale_v1_val = (sum_scale_v1)?(sum_scale_v1[site]):(0); sum_scale_v2_val = (sum_scale_v2)?(sum_scale_v2[site]):(0); sum_scale[site] = sum_scale_v1_val + sum_scale_v2_val; if(sum_scale[site] >= 1024) { /* plk0 -= ncatgns; */ /* plk1 -= (n_v1->tax) ? ns : ncatgns; */ /* plk2 -= (n_v2->tax) ? ns : ncatgns; */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d plk0: %p [%g %g %g %g] plk1: %p [%g %g %g %g] plk2: %p [%g %g %g %g]", */ /* site, */ /* plk0, */ /* plk0[0], */ /* plk0[1], */ /* plk0[2], */ /* plk0[3], */ /* plk1, */ /* plk1[0], */ /* plk1[1], */ /* plk1[2], */ /* plk1[3], */ /* plk2, */ /* plk2[0], */ /* plk2[1], */ /* plk2[2], */ /* plk2[3] */ /* ); */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d d: %d n_v1: %d n_v2: %d",site,d->num,n_v1->num,n_v2->num); */ /* PhyML_Fprintf(stderr,"\n. PARTIAL site: %d sum n: %d sum n_v1: %d sum n_v2: %d",site,sum_scale[site],sum_scale_v1_val,sum_scale_v2_val); */ /* plk0 += ncatgns; */ /* plk1 += (n_v1->tax) ? ns : ncatgns; */ /* plk2 += (n_v2->tax) ? ns : ncatgns; */ /* Exit("\n"); */ } plk0 -= ncatgns; largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = plk0[i]; if(largest_p_lk < INV_TWO_TO_THE_LARGE && tree->mod->augmented == NO && tree->apply_lk_scaling == YES) { for(i=0;itax) ? ns : ncatgns; plk2 += (n_v2->tax) ? ns : ncatgns; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void AVX_Partial_Lk_Exex(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const int state2, const int ns, __m256d *plk0) { unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned int i; _tPij1 = _tPij1 + state1 * nblocks; _tPij2 = _tPij2 + state2 * nblocks; for(i=0;i plk0: %f",x[i]); */ /* _mm256_store_pd(x,_tPij1[0]); */ /* for(int i=0;i<4;++i) PhyML_Printf("\n> Pij1: %f",x[i]); */ /* _mm256_store_pd(x,_tPij2[0]); */ /* for(int i=0;i<4;++i) PhyML_Printf("\n> Pij2: %f",x[i]); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void AVX_Partial_Lk_Exin(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const phydbl *_plk2, __m256d *_pmat2plk2, const int ns, __m256d *_plk0) { unsigned const int sz = (int)BYTE_ALIGN / 8; unsigned const int nblocks = ns / sz; unsigned int i; _tPij1 = _tPij1 + state1 * nblocks; AVX_Matrix_Vect_Prod(_tPij2,_plk2,ns,_pmat2plk2); for(i=0;i 1.0 || plk1[i] < 1.0 || plk2[i] > 1.0 || plk2[i] < 1.0) break; if(i != ns) { AVX_Matrix_Vect_Prod(_tPij1,plk1,ns,_pmat1plk1); AVX_Matrix_Vect_Prod(_tPij2,plk2,ns,_pmat2plk2); for(i=0;i #ifndef AVX_H #define AVX_H #include "utilities.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "times.h" #include "mixt.h" #if (defined(__AVX__) || defined(__AVX2__)) void AVX_Update_Partial_Lk(t_tree *tree,t_edge *b_fcus,t_node *n); void AVX_Update_Eigen_Lr(t_edge *b, t_tree *tree); phydbl AVX_Lk_Core_One_Class_Eigen_Lr(const phydbl *dot_prod, const phydbl *expl, const unsigned int ns); void AVX_Lk_dLk_Core_One_Class_Eigen_Lr(const phydbl *dot_prod, const phydbl *expl, const unsigned int ns, phydbl *lk, phydbl *dlk); phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state); phydbl AVX_Vect_Norm(__m256d _z); phydbl AVX_Lk_Core(int state, int ambiguity_check, t_edge *b, t_tree *tree); phydbl AVX_Lk_Core_Nucl(int state, int ambiguity_check, t_edge *b, t_tree *tree); phydbl AVX_Lk_Core_AA(int state, int ambiguity_check, t_edge *b, t_tree *tree); void AVX_Partial_Lk_Exex(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const int state2, const int ns, __m256d *plk0); void AVX_Partial_Lk_Exin(const __m256d *_tPij1, const int state1, const __m256d *_tPij2, const phydbl *_plk2, __m256d *_pmat2plk2, const int ns, __m256d *_plk0); void AVX_Partial_Lk_Inin(const __m256d *_tPij1, const phydbl *plk1, __m256d *_pmat1plk1, const __m256d *_tPij2, const phydbl *plk2, __m256d *_pmat2plk2, const int ns, __m256d *_plk0); void AVX_Matrix_Vect_Prod(const __m256d *_m_transpose, const phydbl *_v, const int ns, __m256d *res); __m256d AVX_Horizontal_Add(const __m256d x[4]); phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr_Block(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state); phydbl AVX_Lk_Core_One_Class_No_Eigen_Lr_No_Block(const phydbl *p_lk_left, const phydbl *p_lk_rght, const phydbl *Pij, const phydbl *tPij, const phydbl *pi, const int ns, const int ambiguity_check, const int observed_state); #endif #endif phyml-3.3.20220408/src/beagle_utils.c000066400000000000000000000416211422404706600170130ustar00rootroot00000000000000/* * author: Imran Fanaswala */ #ifndef BEAGLE_UTILS_CPP #define BEAGLE_UTILS_CPP #include #include "beagle_utils.h" #define CLEAN_BEAGLE_API /* Attempting to remove unnecessary communication with BEAGLE device */ double* int_to_double(const int* src, int num_elems) { double* dest = (double*)malloc(num_elems*sizeof(double)); if (NULL==dest) Warn_And_Exit("\n. Couldn't allocate memory.\n"); int i; for(i=0; ilength; i++) { fprintf(stdout, "\t\tResource %i:\n\t\tName : %s\n", i, rList->list[i].name); fprintf(stdout, "\t\t\tDesc : %s\n", rList->list[i].description); fprintf(stdout, "\t\t\tFlags:"); print_beagle_flags(rList->list[i].supportFlags); fprintf(stdout, "\n"); } fflush(stdout); } void print_beagle_instance_details(BeagleInstanceDetails *inst) { int rNumber = inst->resourceNumber; fprintf(stdout, "\tUsing resource %i:\n", rNumber); fprintf(stdout, "\t\tRsrc Name : %s\n", inst->resourceName); fprintf(stdout, "\t\tImpl Name : %s\n", inst->implName); fprintf(stdout, "\t\tImpl Desc : %s\n", inst->implDescription); fprintf(stdout, "\t\tFlags:"); fflush(stdout); print_beagle_flags(inst->flags); fflush(stdout); } int create_beagle_instance(t_tree *tree, int quiet, option* io) { if(UNINITIALIZED != tree->b_inst){ // fprintf(stdout,"\n\tWARNING: Creating a BEAGLE instance on a tree with an existing BEAGLE instance:%d\n",tree->b_inst); } if(!quiet){ // print_beagle_resource_list(); } int i; BeagleInstanceDetails inst_d; int num_rate_catg = tree->mod->ras->n_catg; int num_branches = 2*tree->n_otu-1; //rooted tree //Recall that in PhyML, each edge has a "left" and "right" partial vectors. Therefore, //in BEAGLE we have 2*num_branches number of partials. //BEAGLE's partials buffer = [ tax1, tax2, ..., taxN, b1Left, b2Left, b3Left,...,bMLeft, b1Rght, b2Rght, b3Rght,...,bMRght] (N taxa, M branches) int num_partials = 2*(tree->n_otu + num_branches); /* TODO: This does not seem correct; suspect poor indexing elsewhere */ /* In update_operations, indexes range from 0 to almost 2 (n_otu + num_branches), but not all integers are used */ int resourceList[1]; resourceList[0] = io->beagle_resource; // DUMP_I(tree->n_otu, num_rate_catg, num_partials, num_branches, tree->mod->ns, tree->n_pattern, tree->mod->whichmodel); int beagle_inst = beagleCreateInstance( tree->n_otu, /**< Number of tip data elements (input) */ num_partials, /**< Number of partial buffer (input) */ /* PhyML uses partials */ 0, /**< Number of compact state representation buffers to create (input) */ tree->mod->ns, /**< Number of states in the continuous-time Markov chain (input) */ tree->n_pattern, /**< Number of site patterns to be handled by the instance (input) */ 1, /**< Number of rate matrix eigen-decomposition,state freqs, and category weight buffers*/ num_branches, /**< Number of rate matrix buffers (input) */ num_rate_catg, /**< Number of rate categories (input) */ -1, /**< Number of scaling buffers. Unused because we use SCALING_ALWAYS */ resourceList, /**< List of potential resource on which this instance is allowed (input, NULL implies no restriction */ 1, /**< Length of resourceList list (input) */ BEAGLE_FLAG_FRAMEWORK_CPU | BEAGLE_FLAG_PROCESSOR_CPU | BEAGLE_FLAG_SCALING_ALWAYS | BEAGLE_FLAG_EIGEN_REAL | ((sizeof(float)==sizeof(phydbl)) ? BEAGLE_FLAG_PRECISION_SINGLE:BEAGLE_FLAG_PRECISION_DOUBLE), 0, /**< Bit-flags indicating required implementation characteristics, see BeagleFlags (input) */ &inst_d); if (beagle_inst < 0){ fprintf(stderr, "beagleCreateInstance() failed:%i\n\n",beagle_inst); return beagle_inst; } if(!quiet){ fprintf(stdout, "\n\tUnique BEAGLE instance id:%i\n", beagle_inst); print_beagle_instance_details(&inst_d); } //Set the tips for(i=0; i<2*tree->n_otu-1; ++i) //taxa+internal nodes { // Print_Tip_Partials(tree, tree->a_nodes[i]); if(tree->a_nodes[i]->tax) { assert(tree->a_nodes[i]->c_seq->len == tree->n_pattern); // number of compacts sites == number of distinct site patterns double* tip = short_to_double(tree->a_nodes[i]->b[0]->p_lk_tip_r, tree->n_pattern*tree->mod->ns); //The tip states are stored on the branch leading to the tip //Recall we store tip partials on the branch leading to the tip, rather than the tip itself. int ret = beagleSetTipPartials(beagle_inst, tree->a_nodes[i]->b[0]->p_lk_tip_idx, tip); if(ret<0){ fprintf(stderr, "beagleSetTipPartials() on instance %i failed:%i\n\n",beagle_inst,ret); Free(tip); return ret; } Free(tip); } } //Set the pattern weights double* pwts = int_to_double(tree->data->wght,tree->n_pattern); //BTW, These weights are absolute counts, and not freqs int ret = beagleSetPatternWeights(beagle_inst, pwts); if(ret<0){ fprintf(stderr, "beagleSetPatternWeights() on instance %i failed:%i\n\n",beagle_inst,ret); Free(pwts); return ret; } Free(pwts); tree->mod->b_inst=beagle_inst; update_beagle_ras(tree->mod); update_beagle_efrqs(tree->mod); return beagle_inst; } /* Update partial likelihood on edge b on the side of b where node d lies. */ void update_beagle_partials(t_tree* tree, t_edge* b, t_node* d) { /* | |<- b | d / \ b1 / \ b2 / \ n_v1 n_v2 */ if(d->tax) //Partial likelihoods are only calculated on internal nodes { PhyML_Printf("\n== t_node %d is a leaf...",d->num); PhyML_Printf("\n== Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit("\n"); } //Determine d's "left" and "right" neighbors. t_node *n_v1, *n_v2;//d's "left" and "right" neighbor nodes phydbl *p_lk,*p_lk_v1,*p_lk_v2; phydbl *Pij1,*Pij2; int *sum_scale, *sum_scale_v1, *sum_scale_v2; int *p_lk_loc; int dest_p_idx, child1_p_idx, child2_p_idx, Pij1_idx, Pij2_idx; n_v1 = n_v2 = NULL; p_lk = p_lk_v1 = p_lk_v2 = NULL; Pij1 = Pij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; dest_p_idx = child1_p_idx = child2_p_idx = Pij1_idx = Pij2_idx = UNINITIALIZED; Set_All_P_Lk(&n_v1,&n_v2, &p_lk,&sum_scale,&p_lk_loc, &Pij1,&p_lk_v1,&sum_scale_v1, &Pij2,&p_lk_v2,&sum_scale_v2, d,b,tree, &dest_p_idx, &child1_p_idx, &child2_p_idx, &Pij1_idx, &Pij2_idx); // fprintf(stdout, "\nUpdating partials on Branch %d (on the side where Node %d lies)\n",b->num,d->num);fflush(stdout); // double* p_lk_v1_b = (double*)malloc(tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern*sizeof(double));if(NULL==p_lk_v1_b) Warn_And_Exit("Couldnt allocate memory"); // beagleGetPartials(tree->b_inst, child1_p_idx, BEAGLE_OP_NONE, (double*)p_lk_v1_b); // double* p_lk_v2_b = (double*)malloc(tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern*sizeof(double));if(NULL==p_lk_v2_b) Warn_And_Exit("Couldnt allocate memory"); // beagleGetPartials(tree->b_inst, child2_p_idx, BEAGLE_OP_NONE, (double*)p_lk_v2_b); // fprintf(stdout, "Left partials :");fflush(stdout); // Dump_Arr_D(p_lk_v1_b, tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern); // fprintf(stdout, "Right partials:");fflush(stdout); // Dump_Arr_D(p_lk_v2_b, tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern); // Free(p_lk_v1_b); // Free(p_lk_v2_b); //Create the corresponding BEAGLE operation // fprintf(stderr,"%d, %d, %d, ", dest_p_idx, child1_p_idx, child2_p_idx); BeagleOperation operations[1] = {{dest_p_idx, BEAGLE_OP_NONE, BEAGLE_OP_NONE, child1_p_idx, Pij1_idx, child2_p_idx, Pij2_idx}}; //Compute the partials int ret = beagleUpdatePartials(tree->b_inst, operations, 1, BEAGLE_OP_NONE); if(ret<0){ fprintf(stderr, "beagleUpdatePartials() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } //Load the computed/updated partial partials #ifndef CLEAN_BEAGLE_API ret = beagleGetPartials(tree->b_inst, dest_p_idx, BEAGLE_OP_NONE, (double*)p_lk); if(ret<0){ fprintf(stderr, "beagleGetPartials() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } #endif // fprintf(stdout, "Updated partials:");fflush(stdout); // Dump_Arr_D(p_lk, tree->mod->ras->n_catg*tree->mod->ns*tree->n_pattern); } int finalize_beagle_instance(t_tree *tree) { if(tree->b_inst >= 0) { int ret = beagleFinalizeInstance(tree->b_inst); if(ret<0) fprintf(stderr, "\nFailed to finalize BEAGLE instance %i: %i\n\n", tree->b_inst, ret); return ret; } return 0; } void update_beagle_ras(t_mod* mod) { assert(UNINITIALIZED != mod->b_inst); int ret=-1; if((sizeof(float)==sizeof(phydbl))) //Do we need to convert? { double* catg_rates = float_to_double(mod->ras->gamma_rr->v, mod->ras->n_catg); ret = beagleSetCategoryRates(mod->b_inst, catg_rates); Free(catg_rates); if(ret<0){ fprintf(stderr, "beagleSetCategoryRates() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } double* catg_wts = float_to_double(mod->ras->gamma_r_proba->v, mod->ras->n_catg); if(!mod->optimizing_topology) { ret = beagleSetCategoryWeights(mod->b_inst, 0, catg_wts); Free(catg_wts); if(ret<0){ fprintf(stderr, "beagleSetCategoryWeights() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } } } else { ret = beagleSetCategoryRates(mod->b_inst, mod->ras->gamma_rr->v); if(ret<0){ fprintf(stderr, "beagleSetCategoryRates() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } if(!mod->optimizing_topology) { ret = beagleSetCategoryWeights(mod->b_inst, 0, mod->ras->gamma_r_proba->v); if(ret<0){ fprintf(stderr, "beagleSetCategoryWeights() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } } } } void update_beagle_efrqs(t_mod* mod) { assert(UNINITIALIZED != mod->b_inst); int ret=-1; if((sizeof(float)==sizeof(phydbl))) { double* efrqs = float_to_double(mod->e_frq->pi->v, mod->ns); ret = beagleSetStateFrequencies(mod->b_inst, 0, efrqs); Free(efrqs); } else { ret = beagleSetStateFrequencies(mod->b_inst, 0, mod->e_frq->pi->v); } if(ret<0){ fprintf(stderr, "beagleSetStateFrequencies() on instance %i failed:%i\n\n",mod->b_inst,ret); Exit(""); } } void calc_edgelks_beagle(t_edge *b, t_tree *tree) { assert(UNINITIALIZED != tree->b_inst); //Compute the edge likelihood int parents[1] = {b->p_lk_left_idx}; int children[1] = {b->rght->tax?b->p_lk_tip_idx:b->p_lk_rght_idx}; int pmats[1] = {b->Pij_rr_idx}; int other[1] = {0};//Category Weights and State Frequencies both have a single buffer, hence they are both indexed at 0 double lnL[1] = {UNINITIALIZED}; // DUMP_I(parents[0], children[0], pmats[0], b->num, b->rght->tax); int ret=beagleCalculateEdgeLogLikelihoods(tree->b_inst, parents, children, pmats, NULL, NULL, other, other, NULL, 1, lnL, NULL, NULL); int i; if(ret<0){ fprintf(stderr, "beagleCalculateEdgeLogLikelihoods() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } tree->c_lnL = sizeof(phydbl)==sizeof(float)?(float)lnL[0]:lnL[0]; //Retrieve the site likelihoods that were computed during the previous edge likelihood computation ret = beagleGetSiteLogLikelihoods(tree->b_inst,tree->cur_site_lk);//TODO: Handle when cur_site_lk is float if(ret<0){ fprintf(stderr, "beagleGetSiteLogLikelihoods() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } //Transform for(i=0;in_pattern;++i) tree->cur_site_lk[i]=exp(tree->cur_site_lk[i]); } void update_beagle_eigen(t_mod* mod) { assert(UNINITIALIZED != mod->b_inst); int whichmodel = mod->whichmodel; //We use Eigen Decomposition only for GTR models and AA datasets if((mod->io->datatype == AA || whichmodel==GTR || whichmodel==CUSTOM) && mod->use_m4mod == NO) { //Beagle expects untransformed eigen-values (i.e. recall e_val is exp() scaled, so we undo that) phydbl* evals = (phydbl*)malloc(mod->ns * sizeof(phydbl)); int i; for(i=0;ins;++i) evals[i]=log(mod->eigen->e_val[i]); int ret=-1; if((sizeof(float)==sizeof(phydbl)))//Need to convert to doubles? { double* eigen_vects = float_to_double(mod->eigen->r_e_vect, mod->eigen->size*mod->eigen->size); double* eigen_vects_inv = float_to_double(mod->eigen->l_e_vect, mod->eigen->size*mod->eigen->size); double* eigen_vals = float_to_double(evals,mod->eigen->size); ret = beagleSetEigenDecomposition(mod->b_inst,0,eigen_vects,eigen_vects_inv,eigen_vals); Free(eigen_vects);Free(eigen_vects_inv);Free(eigen_vals); } else { ret = beagleSetEigenDecomposition(mod->b_inst,0,mod->eigen->r_e_vect,mod->eigen->l_e_vect,evals); } if(ret<0){ fprintf(stderr, "beagleSetEigenDecomposition() on instance %i failed:%i\n\n",mod->b_inst,ret); Free(evals); Exit(""); } Free(evals); } } #endif // BEAGLE_UTILS_CPP phyml-3.3.20220408/src/beagle_utils.h000066400000000000000000000066111422404706600170200ustar00rootroot00000000000000/* * author: Imran Fanaswala */ #ifndef BEAGLE_UTILS_H #define BEAGLE_UTILS_H #include "assert.h" #include "libhmsbeagle/beagle.h" #include "utilities.h" #define UNINITIALIZED -42 /* BEAGLE is a library that abstracts the core computations common to most phylogenetic packages. The following paragraphs serve as a "design document" for the implementation details of how BEAGLE has been integrated with PhyML. The reader is expected to be familiar with phylogenetics, skimmed the BEAGLE API, and seen a couple of its examples. PARTIAL LIKELIHOODS: - For each internal edge, PhyML maintains a vector of partials that lie to the "right" and "left", to faciliate both post-order and pre-order tree traversal. Therefore each t_edge has a `p_lk_right` and `p_lk_left` field - PhyML represents a tip as a vector of partials (where one bit is "1", and the rest are "0"). Therefore, a t_edge connected to a tip has `p_lk_tip` field. Also by convention, the tip always lies to the right of the edge its connected to. In other words, if b->right->tax is True, then b->p_lk_tip holds the tip partials. - Therefore for BEAGLE, we allocate N+(2*num_edges) partial buffers. - Recall that BEAGLE requires each partial buffer to be uniquely indexed. Thus each edge also has an additional `p_lk_rght_idx` and `p_lk_left_idx` field. These fields are used to create a BeagleOperation struct during the call to beagleUpdatePartials(). - In PhyML, Update_P_Lk() updates the partials for a specific edge lieing along a specific "direction". The "direction" depends on which tree-traversal is being employed. In other words, the tree-traversal dictates whether we are computing "up"/"right" or "down"/"left" partials relative to the t_node*. Specifically, Set_All_P_Lk() handles the nitty gritty of determining whether we are computing "right" or "left" partials. Therefore this function has been modified to also set the appropriate BEAGLE indices. P-MATS and EDGELIKELIHOODS: - (1) Observe that PhyML does eigen decomposition for only GTR and AA models and thus the P-matrix is computed using Beagle. This implies the usage of SetEigenDecomposition() and UpdateTransitionMatricies() calls. - (2) On the other hand, in case of simpler models (JC69, F81, etc), the P-Matrix is explicitly set in BEAGLE thus implying the usage of SetTransitionMatrix(). - The choice between (1) and (2) is made in Update_PMat_At_Given_Edge(). BTW, upon reading Update_PMat_At_Given_Edge(), it may appear that the P-Matrix is being computed in PhyML *and* in BEAGLE; afterall because PMat() function in all cases. However, when BEAGLE is enabled, observe that in PMat() essentially does nothing. - Lk_Core() computes the edgelikelihoods, and calc_edgelks_beagle() is the corresponding BEAGLE function that does the same. */ #define TODO_BEAGLE "TODO. This codepath has not been implemented in PhyML-X, please post your usecase on the PhyML discussion list" int create_beagle_instance(t_tree* tree, int quiet, option* io); int finalize_beagle_instance(t_tree* tree); void update_beagle_partials(t_tree* tree, t_edge* b, t_node* d); void update_beagle_ras(t_mod* mod); void update_beagle_efrqs(t_mod* mod); void update_beagle_eigen(t_mod* mod); void calc_edgelks_beagle(t_edge* b, t_tree* tree); double* int_to_double(const int* src, int num_elems); double* short_to_double(const short* src, int num_elems); double* float_to_double(const phydbl *src, int num_elems); #endif // BEAGLE_UTILS_H phyml-3.3.20220408/src/bionj.c000066400000000000000000000254741422404706600154650ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* The code below is an implementation of the building tree algorithm described in "BIONJ: an improved version of the NJ algorithm based on a simple model of sequence data." (1997) O. Gascuel. Mol Biol Evol. 14:685-95. */ #include "bionj.h" void Bionj(matrix *mat) { int x,y,i; phydbl vxy,lx,ly,lamda,score; Clean_Tree_Connections(mat->tree); for(i=0;itree->n_otu;i++) mat->tip_node[i] = mat->tree->a_nodes[i]; mat->tree->num_curr_branch_available = mat->tree->n_otu; while(mat->r > 3) { x = y = 0; vxy = .0; score = .0; Compute_Sx(mat); Best_Pair(mat,&x,&y,&score); vxy=BioNJ_Variance(mat,x,y); lx=Br_Length(mat,x,y); ly=Br_Length(mat,y,x); lamda=Lamda(mat,x,y,vxy); Update_Mat(mat,x,y,lx,ly,vxy,lamda); Update_Tree(mat,x,y,lx,ly,score); } Finish(mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Finish(matrix *mat) { phydbl dxy,dxz,dyz; int x,y,z; t_node *nx,*ny,*nz,*new; int i; dxy = dxz = dyz = -1.; x = y = z = -1; for(i=0;in_otu;i++) { if(mat->on_off[i]) { if(x < 0) x=i; else if(y < 0) y = i; else if(z < 0) z = i; } } dxy = Dist(mat,x,y); dxz = Dist(mat,x,z); dyz = Dist(mat,y,z); nx = mat->tip_node[x]; ny = mat->tip_node[y]; nz = mat->tip_node[z]; new = mat->tree->a_nodes[mat->curr_int]; new->num = mat->curr_int; new->v[0] = nx; new->v[1] = ny; new->v[2] = nz; nx->v[0] = new; ny->v[0] = new; nz->v[0] = new; if(nx->tax) Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[nx->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); if(ny->tax) Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[ny->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); if(nz->tax) Connect_One_Edge_To_Two_Nodes(new,nz,mat->tree->a_edges[nz->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,nz,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); nx->b[0]->l->v = .5*(dxy-dyz+dxz); ny->b[0]->l->v = .5*(dyz-dxz+dxy); nz->b[0]->l->v = .5*(dxz-dxy+dyz); new->b[0]->l->v = nx->b[0]->l->v; new->b[1]->l->v = ny->b[0]->l->v; new->b[2]->l->v = nz->b[0]->l->v; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Mat(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl vxy, phydbl lamda) { int i; int a,b; a = b = -1; for(i=0;in_otu;i++) { if((mat->on_off[i]) && (i != x) && (i != y)) { if(x > i) { a=x; b=i; } else { a=i; b=x; } mat->dist[a][b]=Dist_Red(mat,x,lx,y,ly,i,lamda); mat->dist[b][a]=Var_Red(mat,x,y,i,lamda,vxy); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Tree(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl score) { t_node *new, *nx, *ny; nx = mat->tip_node[x]; ny = mat->tip_node[y]; new = mat->tree->a_nodes[mat->curr_int]; nx->v[0] = new; ny->v[0] = new; new->v[1] = nx; new->v[2] = ny; new->num = mat->curr_int; if(nx->tax) Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[nx->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,nx,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); if(ny->tax) Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[ny->num],mat->tree); else Connect_One_Edge_To_Two_Nodes(new,ny,mat->tree->a_edges[mat->tree->num_curr_branch_available],mat->tree); nx->b[0]->l->v = lx; ny->b[0]->l->v = ly; new->b[1]->l->v = lx; new->b[2]->l->v = ly; new->score[0] = score; nx->b[0]->l->v = lx; ny->b[0]->l->v = ly; mat->tip_node[x] = new; mat->on_off[y] = 0; mat->curr_int++; mat->r--; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Best_Pair(matrix *mat, int *x, int *y,phydbl *score) { int i,j/* ,n_ties */; phydbl Qmin,Qmin2; phydbl *t_Qij; /* int *ties; */ t_Qij = (phydbl *)mCalloc(mat->n_otu * mat->n_otu,sizeof(phydbl )); /* ties = (int *)mCalloc(mat->n_otu * mat->n_otu,sizeof(int )); */ Qmin = 1.e+10; for(i=0;in_otu;i++) { if(mat->on_off[i]) { for(j=0;jon_off[j]) { t_Qij[mat->n_otu*i+j] = Q_Agglo(mat,i,j); if(t_Qij[mat->n_otu*i+j] < Qmin - 1.E-05) { *x = i; *y = j; Qmin = t_Qij[mat->n_otu*i+j]; } } } } } /* n_ties = 0; */ /* for(i=0;in_otu;i++) */ /* { */ /* if(mat->on_off[i]) */ /* { */ /* for(j=0;jon_off[j]) */ /* { */ /* if((t_Qij[mat->n_otu*i+j] < Qmin + 1.E-05) && (t_Qij[mat->n_otu*i+j] > Qmin - 1.E-05)) */ /* { */ /* ties[n_ties] = mat->n_otu*i+j; */ /* n_ties++; */ /* } */ /* } */ /* } */ /* } */ /* } */ /* if(!n_ties) */ /* { */ /* PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ /* /\* Useful if some pairwise distances are null *\/ */ /* if(n_ties > 1) */ /* { */ /* int cand; */ /* *x = *y = -1; */ /* cand = (int)RINT(rand()/(phydbl)(RAND_MAX) * (n_ties-1)); */ /* *x = (int)(ties[cand] / mat->n_otu); */ /* *y = (int)(ties[cand] % mat->n_otu); */ /* } */ Qmin2 = 1e+10; for(i=0;in_otu;i++) { if((i != *y) && (i != *x) && (t_Qij[mat->n_otu*(*x)+i] < Qmin2)) Qmin2 = t_Qij[mat->n_otu*(*x)+i]; } for(i=0;in_otu;i++) { if((i != *y) && (i != *x) && (t_Qij[mat->n_otu*i+(*y)] < Qmin2)) Qmin2 = t_Qij[mat->n_otu*i+(*y)]; } *score = FABS(Qmin2 - Qmin)/FABS(Qmin); Free(t_Qij); /* Free(ties); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Compute_Sx(matrix *mat) { int i,j; for(i=0;in_otu;i++) { mat->dist[i][i] = .0; if(mat->on_off[i]) { for(j=0;jn_otu;j++) { if((i != j) && (mat->on_off[j])) { mat->dist[i][i] += Dist(mat,i,j); } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Sum_S(matrix *mat, int i) { return mat->dist[i][i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dist(matrix *mat, int x, int y) { if(x > y) return(mat->dist[x][y]); else return(mat->dist[y][x]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl BioNJ_Variance(matrix *mat, int x, int y) { if(x > y) { return(mat->dist[y][x]); } else { return(mat->dist[x][y]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Br_Length(matrix *mat, int x, int y) { return .5*(Dist(mat,x,y)+ (Sum_S(mat,x)-Sum_S(mat,y))/(phydbl)(mat->r-2.)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Dist_Red(matrix *mat, int x, phydbl lx, int y, phydbl ly, int i, phydbl lamda) { phydbl Dui; Dui=lamda*(Dist(mat,x,i)-lx) +(1.-lamda)*(Dist(mat,y,i)-ly); return(Dui); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Var_Red(matrix *mat, int x, int y, int i, phydbl lamda, phydbl vxy) { phydbl Vui; Vui=lamda*(BioNJ_Variance(mat,x,i)) +(1.-lamda)*(BioNJ_Variance(mat,y,i)) -lamda*(1.-lamda)*vxy; return(Vui); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lamda(matrix *mat, int x, int y, phydbl vxy) { phydbl lamda=0.0; int i; if(mat->method == 0) /* NJ (Saitou & Nei, 1987) */ lamda = 0.5; else /* BioNJ (Gascuel, 1997) */ { if(vxy < SMALL && vxy > -SMALL) lamda=0.5; else { for(i=0;in_otu;i++) { if((x != i) && (y != i) && (mat->on_off[i])) lamda = lamda + BioNJ_Variance(mat,y,i) - BioNJ_Variance(mat,x,i); } lamda = 0.5 + lamda/(2.*(mat->r-2)*vxy); } if(lamda > 1.0) lamda = 0.5;/*1.0;*/ else if(lamda < 0.0) lamda = 0.5;/*0.0;*/ } return(lamda); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Q_Agglo(matrix *mat, int x, int y) { phydbl Qxy; Qxy = .0; Qxy=(mat->r-2.)*Dist(mat,x,y)-Sum_S(mat,x)-Sum_S(mat,y); return(Qxy); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Bionj_Br_Length(matrix *mat) { int x; x = Bionj_Br_Length_Post(mat->tree->a_nodes[0], mat->tree->a_nodes[0]->v[0], mat); mat->tree->a_nodes[0]->b[0]->l->v = Dist(mat,0,x); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Bionj_Br_Length_Post(t_node *a, t_node *d, matrix *mat) { int i; if(d->tax) { return d->num; } else { int d_v1, d_v2; phydbl lx, ly, vxy,lamda; int x,y; d_v1 = d_v2 = -1; for(i=0;i<3;i++) if(d->v[i] != a) {(d_v1 < 0)?(d_v1 = i):(d_v2 = i);} x = Bionj_Br_Length_Post(d,d->v[d_v1],mat); y = Bionj_Br_Length_Post(d,d->v[d_v2],mat); vxy = .0; Compute_Sx(mat); vxy=BioNJ_Variance(mat,(x),(y)); lx=Br_Length(mat,(x),(y)); ly=Br_Length(mat,(y),(x)); lamda=Lamda(mat,(x),(y),vxy); Update_Mat(mat,(x),(y),lx,ly,vxy,lamda); d->b[d_v1]->l->v = lx; d->b[d_v2]->l->v = ly; mat->on_off[y] = 0; mat->r--; return x; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/bionj.h000066400000000000000000000024561422404706600154650ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef NJ_H #define NJ_H #include "utilities.h" #include "optimiz.h" #include "free.h" void Bionj(matrix *mat); void Finish(matrix *mat); void Compute_Sx(matrix *mat); phydbl Sum_S(matrix *mat, int i); phydbl Dist(matrix *mat, int x, int y); phydbl Q_Agglo(matrix *mat, int x, int y); phydbl BioNJ_Variance(matrix *mat, int x, int y); phydbl Br_Length(matrix *mat, int x, int y); void Update_Dist(matrix *mat, int x, int y); phydbl Lamda(matrix *mat, int x, int y, phydbl vxy); void Best_Pair(matrix *mat, int *x, int *y, phydbl *score); phydbl Var_Red(matrix *mat, int x, int y, int i, phydbl lamda, phydbl vxy); void Update_Tree(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl score); void Update_Mat(matrix *mat, int x, int y, phydbl lx, phydbl ly, phydbl vxy, phydbl lamda); phydbl Dist_Red(matrix *mat, int x, phydbl lx, int y, phydbl ly, int i, phydbl lamda); int Bionj_Br_Length_Post(t_node *a, t_node *d, matrix *mat); void Bionj_Br_Length(matrix *mat); #endif phyml-3.3.20220408/src/checkpoint.c000066400000000000000000000021311422404706600164740ustar00rootroot00000000000000#include "checkpoint.h" void CHECK_Main(int argc,char **argv) { // Up to you Salva... } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/checkpoint.h000066400000000000000000000002101422404706600164750ustar00rootroot00000000000000#include #ifndef CHECKPOINT_H #define CHECKPOINT_H #include "utilities.h" void CHECK_Main(int argc, char **argv); #endif phyml-3.3.20220408/src/cl.c000066400000000000000000001416731422404706600147620ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "cl.h" /*********************************************************/ /** * Fill the Option fields, with the argc array */ int Read_Command_Line(option *io, int argc, char **argv) { int c; int idx; int i; int writemode; short int opt_m; writemode = WRITE; opt_m = 0; if(argc == 1) Exit("\n. No argument was passed to the program. Please check the documentation. \n"); PhyML_Printf("",writemode); struct option longopts[] = { {"n_rgrft", required_argument,NULL,0}, {"n_globl", required_argument,NULL,1}, {"max_dist", required_argument,NULL,2}, {"n_optim", required_argument,NULL,3}, {"n_best", required_argument,NULL,4}, {"model", required_argument,NULL,5}, {"search", required_argument,NULL,6}, {"datatype", required_argument,NULL,7}, {"multiple", required_argument,NULL,8}, {"input", required_argument,NULL,9}, {"bootstrap", required_argument,NULL,10}, {"ts/tv", required_argument,NULL,11}, {"nclasses", required_argument,NULL,12}, {"pinv", required_argument,NULL,13}, {"alpha", required_argument,NULL,14}, {"inputtree", required_argument,NULL,15}, {"min_diff_lk_local", required_argument,NULL,16}, {"min_diff_lk_global",required_argument,NULL,17}, {"steph_spr", no_argument,NULL,18}, {"brent_it_max", required_argument,NULL,19}, {"rand_start", no_argument,NULL,20}, {"n_rand_starts", required_argument,NULL,21}, {"sequential", no_argument,NULL,22}, {"inside_opt", no_argument,NULL,23}, {"p_moves", required_argument,NULL,24}, {"fast_nni", no_argument,NULL,25}, {"g_pars", no_argument,NULL,26}, {"r_seed", required_argument,NULL,27}, {"collapse_boot", required_argument,NULL,28}, {"random_boot", required_argument,NULL,29}, {"print_trace", no_argument,NULL,30}, {"print_site_lnl", no_argument,NULL,31}, {"print_site_lk", no_argument,NULL,31}, {"cov", no_argument,NULL,32}, {"cov_delta", required_argument,NULL,33}, {"cov_alpha", required_argument,NULL,34}, {"cov_ncats", required_argument,NULL,35}, {"ps", no_argument,NULL,36}, {"cov_free", no_argument,NULL,37}, {"no_gap", no_argument,NULL,38}, {"n_rr_branch", required_argument,NULL,39}, {"append", no_argument,NULL,40}, {"no_five_branch", no_argument,NULL,41}, {"pars_thresh", required_argument,NULL,42}, {"min_diff_lk_move", required_argument,NULL,43}, {"hybrid", no_argument,NULL,44}, {"use_median", no_argument,NULL,45}, {"run_id", required_argument,NULL,46}, {"pars", no_argument,NULL,47}, {"quiet", no_argument,NULL,48}, {"version", no_argument,NULL,49}, {"calibration_file", required_argument,NULL,50}, {"calibration", required_argument,NULL,50}, {"clade_file", required_argument,NULL,50}, {"boot_progress_every", required_argument,NULL,51}, {"aa_rate_file", required_argument,NULL,52}, {"chain_len", required_argument,NULL,53}, {"sample_freq", required_argument,NULL,54}, {"burnin", required_argument,NULL,55}, {"no_memory_check", no_argument,NULL,56}, {"no_colalias", no_argument,NULL,57}, {"alias_subpatt", no_argument,NULL,58}, {"no_sequences", no_argument,NULL,59}, {"prior", no_argument,NULL,59}, {"fastlk", no_argument,NULL,60}, {"free_rates", no_argument,NULL,61}, {"freerates", no_argument,NULL,61}, {"freerate", no_argument,NULL,61}, {"free_rate", no_argument,NULL,61}, {"is", no_argument,NULL,62}, // no 63 since it corresponds to character '?' {"rate_model", required_argument,NULL,64}, {"ratemodel", required_argument,NULL,64}, {"log_l", no_argument,NULL,65}, {"gamma_lens", no_argument,NULL,66}, {"il", no_argument,NULL,66}, {"codpos", required_argument,NULL,67}, {"constraint_file", required_argument,NULL,68}, {"constraint_tree", required_argument,NULL,68}, {"help", no_argument,NULL,69}, {"mutmap", no_argument,NULL,70}, {"parvals", required_argument,NULL,71}, {"constrained_lens", no_argument,NULL,72}, {"xml", required_argument,NULL,73}, {"l_var", required_argument,NULL,74}, #ifdef BEAGLE {"beagle_resource", required_argument,NULL,75}, #endif {"ancestral", no_argument,NULL,76}, {"anc", no_argument,NULL,76}, {"coord_file", required_argument,NULL,77}, {"json_trace", no_argument,NULL,78}, {"weights", required_argument,NULL,79}, {"tbe", no_argument,NULL,80}, {"leave_duplicates", no_argument,NULL,81}, {"precision", required_argument,NULL,82}, {"l_min", required_argument,NULL,83}, {"print_mat_and_exit", no_argument,NULL,84}, {0,0,0,0} }; io->datatype = UNDEFINED; #ifndef PHYML int open_ps_file = 0; #endif idx=-1; do { c = getopt_long(argc,argv,"qi:d:t:m:b:n:f:zk:v:c:a:u:ho:s:x:g:l:ep",longopts,&idx); switch(c) { case 84 : { io->print_mat_and_exit = YES; break; } case 83 : { io->mod->l_min = String_To_Dbl(optarg); break; } case 82 : { if ((!atoi(optarg)) || (atoi(optarg) < 1) || (atoi(optarg) > DECIMAL_DIG -3)) { PhyML_Printf("\n. The number of digits must be [1 - %d]\n", DECIMAL_DIG -3); Exit("\n"); } else { io->precision = atoi(optarg); } break; } case 81 : { io->leave_duplicates = YES; break; } case 80 : { io->do_tbe = YES; io->do_boot = NO; io->do_alrt = NO; break; } case 79: { io->has_io_weights = YES; strcpy(io->weight_file, optarg); break; } case 78: { io->print_json_trace = YES; break; } case 77: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if(strlen(optarg) > T_MAX_FILE -11) { char choix; strcpy (tmp, "\n. The file name'"); strcat (tmp, optarg); strcat (tmp, "' is too long.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else if (!Filexists (optarg)) { char choix; strcpy (tmp, "\n. The file '"); strcat (tmp, optarg); strcat (tmp, "' doesn't exist.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_coord_file, optarg); io->fp_in_coord = Openfile(io->in_coord_file,READ); } Free(tmp); break; } case 76: { io->ancestral = YES; break; } #ifdef BEAGLE case 75: { io->beagle_resource = (int)atoi(optarg); break; } #endif case 74: { io->mod->l_var_sigma = String_To_Dbl(optarg); break; } case 73: { #ifdef INVITEE Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); PhyTime_XML(optarg); return 0; #elif defined(PHYML) Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); io = PhyML_XML(optarg); Free(io); return 0; #elif defined(PHYTIME) Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); DATE_XML(optarg); return 0; #elif defined(PHYREX) Free_Optimiz(io->mod->s_opt); Free_Model_Basic(io->mod); Free_Input(io); PHYREX_XML(optarg); return 0; #endif break; } case 72: { io->mod->s_opt->constrained_br_len = YES; break; } case 71: { io->mcmc->in_fp_par = fopen(optarg,"r"); io->mcmc->randomize = NO; break; } case 70: { io->mutmap = YES; break; } case 68: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if(strlen(optarg) > T_MAX_FILE -11) { char choix; strcpy (tmp, "\n. The file name'"); strcat (tmp, optarg); strcat (tmp, "' is too long.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else if (!Filexists (optarg)) { char choix; strcpy (tmp, "\n. The file '"); strcat (tmp, optarg); strcat (tmp, "' doesn't exist.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_constraint_tree_file, optarg); io->fp_in_constraint_tree = Openfile(io->in_constraint_tree_file,0); } Free(tmp); break; } case 67: { phydbl pos; pos = atof(optarg); io->codpos = (int)pos; if(io->codpos < 1 || io->codpos > 3) { char choix; PhyML_Printf("\n. Coding position must be set to 1, 2 or 3.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; break; } case 66: { io->mod->gamma_mgf_bl = YES; io->mod->s_opt->opt_gamma_br_len = YES; break; } case 65: { io->mod->log_l = YES; break; } case 64: { char *s; int i; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); i = 0; while(optarg[i++]) s[i]=tolower(optarg[i]); if(!strcmp(optarg,"gbd")) io->rates->model_id = THORNE; else if(!strcmp(optarg,"autocorrelated")) io->rates->model_id = THORNE; else if(!strcmp(optarg,"autocorr")) io->rates->model_id = THORNE; else if(!strcmp(optarg,"geom")) io->rates->model_id = GUINDON; else if(!strcmp(optarg,"integrated")) io->rates->model_id = GUINDON; else if(!strcmp(optarg,"uncorrelated")) io->rates->model_id = LOGNORMAL; else if(!strcmp(optarg,"uncorr")) io->rates->model_id = LOGNORMAL; else if(!strcmp(optarg,"lognorm")) io->rates->model_id = LOGNORMAL; else if(!strcmp(optarg,"clock")) io->rates->model_id = STRICTCLOCK; else if(!strcmp(optarg,"strictclock")) io->rates->model_id = STRICTCLOCK; else if(!strcmp(optarg,"strict_clock")) io->rates->model_id = STRICTCLOCK; else { PhyML_Printf("\n. rate_model should be 'autocorrelated', 'uncorrelated', 'integrated' or 'clock'."); Exit("\n"); } Free(s); break; } case 62: { io->mcmc->is = YES; break; } case 61: { io->mod->ras->free_mixt_rates = YES; io->mod->s_opt->opt_free_mixt_rates = YES; break; } case 60: { io->lk_approx = NORMAL; break; } case 59: { break; } case 58: { io->do_alias_subpatt = YES; break; } case 57: { io->colalias = NO; break; } case 56: { io->mem_question = NO; break; } case 55: { phydbl len; len = atof(optarg); io->mcmc->chain_len_burnin = (int)len; if(io->mcmc->chain_len_burnin < 1) { char choix; PhyML_Printf("\n. chain_len_burnin must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case 54: { phydbl len; len = atof(optarg); io->mcmc->sample_interval = (int)len; if(io->mcmc->sample_interval < 1) { char choix; PhyML_Printf("\n. sample_interval must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case 53: { phydbl len; len = atof(optarg); io->mcmc->chain_len = (int)len; if(io->mcmc->chain_len < 1) { char choix; PhyML_Printf("\n. chain_len must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case 52: { char *s; s = (char *)mCalloc(T_MAX_FILE, sizeof(char)); strcpy(s,optarg); io->mod->fp_aa_rate_mat = Openfile(s,0); strcpy(io->mod->aa_rate_mat_file->s,s); Free(s); break; } case 51: { io->boot_prog_every = atoi(optarg); if(io->boot_prog_every < 1) { char choix; PhyML_Printf("\n. boot_progress_every must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case 50: { strcpy(io->clade_list_file,optarg); break; } case 49: { PhyML_Printf("\n. This is PhyML version %s.\n\n",VERSION); Exit(""); break; } case 48 : { io->quiet = 1; break; } case 'p' : case 47 : { io->in_tree = 1; break; } case 46 : { if(strlen(optarg) > 0) { io->append_run_ID = YES; strcpy(io->run_id_string,optarg); } break; } case 45 : { io->mod->ras->gamma_median = 1; break; } case 44 : { io->mod->s_opt->hybrid_thresh = 0; break; } case 43 : { io->mod->s_opt->min_diff_lk_move = atof(optarg); if(io->mod->s_opt->min_diff_lk_move < 0) { char choix; PhyML_Printf("\n. Min_diff_lk_move must be a double greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case 42 : { io->mod->s_opt->pars_thresh = (int)atoi(optarg); if(io->mod->s_opt->pars_thresh < 0) { PhyML_Printf("\n. The parsimony threshold must be an integer greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); Exit("\n"); } break; } case 41 : { io->mod->s_opt->opt_five_branch = 0; break; } case 40 : { writemode = APPEND; break; } case 39 : { break; } case 38 : { io->rm_ambigu = 1; break; } case 37 : { io->mod->s_opt->opt_cov_free_rates = YES; #ifdef M4 io->mod->m4mod->use_cov_alpha = NO; io->mod->m4mod->use_cov_free = YES; #endif break; } case 36 : { #ifndef PHYML open_ps_file = 1; #endif break; } case 35 : { #ifdef M4 io->mod->m4mod->n_h = (int)atoi(optarg); if(io->mod->m4mod->n_h < 1) { char choix; PhyML_Printf("\n. The number of classes must be greater than 0.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } #endif break; } case 34 : { #ifdef M4 io->mod->m4mod->use_cov_alpha = YES; io->mod->m4mod->use_cov_free = NO; if(!strcmp(optarg,"e") || !strcmp(optarg,"E") || !strcmp(optarg,"estimated") || !strcmp(optarg,"ESTIMATED")) { io->mod->s_opt->opt_cov_alpha = YES; io->mod->m4mod->alpha = 1.0; } else { io->mod->m4mod->alpha = (phydbl)atof(optarg); if(io->mod->m4mod->alpha < 1.E-5) { char choix; PhyML_Printf("\n. The value of alpha must be greater than 1.E-5.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } } #endif break; } case 33 : { #ifdef M4 if(!strcmp(optarg,"e") || !strcmp(optarg,"E") || !strcmp(optarg,"estimated") || !strcmp(optarg,"ESTIMATED")) { io->mod->s_opt->opt_cov_delta = YES; io->mod->m4mod->delta = 1.0; } else { io->mod->m4mod->delta = (phydbl)atof(optarg); if(atof(optarg) < 1.E-10) { char choix; PhyML_Printf("\n. The value of delta must be larger than 1.E-10.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } } #endif break; } case 32 : { io->mod->use_m4mod = YES; break; } case 31 : { io->print_site_lnl = YES; break; } case 30 : { io->print_trace = YES; break; } case 29 : { io->random_boot_seq_order = (int)atoi(optarg); break; } case 28 : { io->collapse_boot = (int)atoi(optarg); break; } case 27 : { io->r_seed = (int)atoi(optarg); break; } case 26 : { io->mod->s_opt->general_pars = YES; break; } case 25 : { io->mod->s_opt->fast_nni = YES; break; } case 24 : { io->mod->s_opt->p_moves_to_examine = (phydbl)atof(optarg); break; } case 23 : { io->mod->s_opt->wim_inside_opt = 1; break; } case 0 : { io->mod->s_opt->wim_n_rgrft = atoi(optarg); break; } case 1 : { io->mod->s_opt->wim_n_globl = atoi(optarg); break; } case 2 : { io->mod->s_opt->wim_max_dist = atoi(optarg); break; } case 3 : { io->mod->s_opt->wim_n_optim = atoi(optarg); break; } case 4 : { io->mod->s_opt->wim_n_best = atoi(optarg); break; } case 16 : { io->mod->s_opt->min_diff_lk_local = atof(optarg); break; } case 17 : { io->mod->s_opt->min_diff_lk_global = atof(optarg); break; } case 18 : { io->mod->s_opt->steph_spr = NO; io->mod->s_opt->greedy = YES; break; } case 19 : { io->mod->s_opt->brent_it_max = atoi(optarg); break; } case 20 : { io->mod->s_opt->random_input_tree = YES; break; } case 21 : { io->mod->s_opt->random_input_tree = YES; io->mod->s_opt->n_rand_starts = atoi(optarg); if(io->mod->s_opt->n_rand_starts < 1) Exit("\n. Number of random starting trees must be > 0.\n\n"); } case 's':case 6: { if((!strcmp(optarg,"spr")) || (!strcmp(optarg,"SPR"))) { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->greedy = (io->mod->s_opt->steph_spr)?(0):(1); } else if((!strcmp(optarg,"nni")) || (!strcmp(optarg,"NNI"))) { PhyML_Printf("\n. The NNI option is deprecated. PhyML now uses a mix of SPRs and NNIs."); io->mod->s_opt->topo_search = NNI_MOVE; io->mod->s_opt->random_input_tree = 0; } else if((!strcmp(optarg,"best")) || (!strcmp(optarg,"BEST"))) { PhyML_Printf("\n. The BEST option is deprecated. PhyML now uses a mix of SPRs and NNIs."); io->mod->s_opt->topo_search = BEST_OF_NNI_AND_SPR; io->mod->s_opt->greedy = (io->mod->s_opt->steph_spr)?(0):(1); } break; } case 'd':case 7: { if(!strcmp(optarg,"nt")) { io->datatype = NT; io->mod->ns = 4; #ifdef M4 io->mod->m4mod->n_o = 4; #endif if((io->mod->whichmodel == LG) || (io->mod->whichmodel == WAG) || (io->mod->whichmodel == DAYHOFF) || (io->mod->whichmodel == JTT) || (io->mod->whichmodel == BLOSUM62) || (io->mod->whichmodel == MTREV) || (io->mod->whichmodel == RTREV) || (io->mod->whichmodel == CPREV) || (io->mod->whichmodel == DCMUT) || (io->mod->whichmodel == VT) || (io->mod->whichmodel == MTMAM) || (io->mod->whichmodel == MTART) || (io->mod->whichmodel == HIVW) || (io->mod->whichmodel == HIVB) || (io->mod->whichmodel == AB) || (io->mod->whichmodel == CUSTOMAA) ) { io->mod->whichmodel = HKY85; strcpy(io->mod->modelname->s, "HKY85\0"); } } else if (!strcmp(optarg,"aa")) { io->datatype = AA; io->mod->s_opt->opt_kappa = NO; io->mod->ns = 20; #ifdef M4 io->mod->m4mod->n_o = 20; #endif if( (io->mod->whichmodel == JC69) || (io->mod->whichmodel == K80) || (io->mod->whichmodel == F81) || (io->mod->whichmodel == HKY85) || (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93) || (io->mod->whichmodel == GTR) || (io->mod->whichmodel == CUSTOM) ) { io->mod->whichmodel = LG; strcpy(io->mod->modelname->s, "LG\0"); } } else if ((!strcmp(optarg,"generic")) || (!strcmp(optarg,"gen"))) { io->datatype = GENERIC; } else { char choix; PhyML_Printf("\n. Unknown argument to -d option: please use `nt' for DNA or `aa' for Amino-Acids\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case 'm': case 5 : { opt_m = 1; if (!isalpha(optarg[0])) { if(strchr(optarg,',') == NULL) { strcpy(io->mod->custom_mod_string->s,optarg); if (strlen(io->mod->custom_mod_string->s) != 6) { Warn_And_Exit("\n. The custom model string should be of length 6.\n"); } io->datatype = NT; io->mod->whichmodel = CUSTOM; strcpy(io->mod->modelname->s, "custom"); io->mod->s_opt->opt_kappa = NO; io->mod->s_opt->opt_rr = YES; } else { phydbl v; int n_rr; const char *d = ","; char *tok = strtok(optarg,d); io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = GTR; io->mod->s_opt->opt_rr = NO; io->mod->r_mat = (t_rmat *)Make_Rmat(io->mod->ns); Init_Rmat(io->mod->r_mat); Make_Custom_Model(io->mod); n_rr = 0; while(tok && n_rr < 6) { v = strtod(tok,NULL); if (v != 0) { io->mod->r_mat->rr->v[n_rr] = v; io->mod->r_mat->rr_val->v[n_rr] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", tok); Exit("\n"); } tok = strtok (NULL,d); n_rr++; } assert(n_rr <= 6); } } else { char *s = To_Upper_String(optarg); if (strcmp(s, "JC69") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = JC69; } else if(strcmp(s, "K80") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = K80; } else if(strcmp(s, "F81") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = F81; } else if (strcmp(s, "HKY85") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = HKY85; } else if(strcmp(s, "F84") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = F84; } else if (strcmp(s,"TN93") == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = TN93; } else if(strncmp(s, "GTR", 3) == 0) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = GTR; io->mod->s_opt->opt_rr = YES; } else if(strcmp(s, "DAYHOFF") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = DAYHOFF; } else if(strcmp(s, "JTT") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = JTT; } else if(strcmp(s, "MTREV") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = MTREV; } else if(strcmp(s, "LG") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = LG; } else if(strcmp(s, "WAG") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = WAG; } else if(strcmp(s, "DCMUT") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = DCMUT; } else if(strcmp(s, "RTREV") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = RTREV; } else if(strcmp(s, "CPREV") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = CPREV; } else if(strcmp(s, "VT") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = VT; } else if(strcmp(s, "BLOSUM62") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = BLOSUM62; } else if(strcmp(s, "MTMAM") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = MTMAM; } else if (strcmp(s,"MTART") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = MTART; } else if (strcmp(s,"HIVW") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = HIVW; } else if(strcmp(s, "HIVB") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = HIVB; } else if(strcmp(s, "AB") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = AB; } else if (strcmp(s, "CUSTOM") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = CUSTOMAA; } else if(strcmp(s, "FLU") == 0) { io->datatype = AA; io->mod->ns = 20; io->mod->whichmodel = FLU; } else { PhyML_Printf("\n. The model name is incorrect. Please see the documentation.\n"); Exit("\n"); } Free(s); } Set_Model_Name(io->mod); break; } case 'a':case 14 : { if ((strcmp (optarg, "e") == 0) || (strcmp (optarg, "E") == 0) || (strcmp (optarg, "estimated") == 0) || (strcmp (optarg, "ESTIMATED") == 0)) { io->mod->s_opt->opt_alpha = YES; } else if (atof(optarg) < 1.E-10) { char choix; PhyML_Printf("\n. Alpha must be > 1.E-10.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { io->mod->ras->alpha->v = (phydbl)atof(optarg); io->mod->s_opt->opt_alpha = NO; } break; } case 'b':case 10: { if ((int)String_To_Dbl(optarg) < -5) { char choix; PhyML_Printf("\n. Branch test value must be a positive integer for bootstrap, or between -1 and -4 for aLRT branch test\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { if((int)String_To_Dbl(optarg) > 0) { io->do_alrt = NO; io->ratio_test = 0; io->n_boot_replicates = (int)atoi(optarg); io->print_boot_trees = YES; if(io->n_data_sets > 1) { char choix; PhyML_Printf("\n. Bootstrap option is not allowed with multiple data sets\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } } else if (atoi(optarg)==0) { io->do_alrt = NO; io->do_tbe = NO; io->do_boot = NO; io->ratio_test = 0; } else { io->do_alrt = YES; io->do_tbe = NO; io->do_boot = NO; io->ratio_test = -(int)atoi(optarg); } } break; } case 'c':case 12: { if ((!atoi(optarg)) || (atoi(optarg) < 0)) { char choix; PhyML_Printf("\n. Unknown argument to -c option: the number of rate categories must be a positive integer\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { io->mod->ras->n_catg = atoi(optarg); if(io->mod->ras->n_catg < 1) { PhyML_Printf("\n. The number of rate categories must be a positive integer\n"); Exit("\n"); } } break; } case 'f': { if(!strcmp(optarg,"e")) // empirical state frequencies { io->mod->s_opt->state_freq = EMPIRICAL; } else if(!strcmp(optarg,"o")) // ML estimation { io->mod->s_opt->state_freq = ML; } else if(!strcmp(optarg,"m")) // Given by the model { if(io->datatype == AA) io->mod->s_opt->state_freq = MODEL; else if(io->datatype == NT) io->mod->s_opt->state_freq = ML; } else if(!isalpha(optarg[0])) { phydbl sum; double val1,val2,val3,val4; io->mod->e_frq = (t_efrq *)Make_Efrq(4); Init_Efrq(NULL,io->mod->e_frq); io->mod->s_opt->state_freq = USER; sscanf(optarg,"%lf,%lf,%lf,%lf",&val1,&val2,&val3,&val4); io->mod->e_frq->user_b_freq->v[0] = (phydbl)val1; io->mod->e_frq->user_b_freq->v[1] = (phydbl)val2; io->mod->e_frq->user_b_freq->v[2] = (phydbl)val3; io->mod->e_frq->user_b_freq->v[3] = (phydbl)val4; sum = (io->mod->e_frq->user_b_freq->v[0] + io->mod->e_frq->user_b_freq->v[1] + io->mod->e_frq->user_b_freq->v[2] + io->mod->e_frq->user_b_freq->v[3]); io->mod->e_frq->user_b_freq->v[0] /= sum; io->mod->e_frq->user_b_freq->v[1] /= sum; io->mod->e_frq->user_b_freq->v[2] /= sum; io->mod->e_frq->user_b_freq->v[3] /= sum; if(io->mod->e_frq->user_b_freq->v[0] < .0 || io->mod->e_frq->user_b_freq->v[1] < .0 || io->mod->e_frq->user_b_freq->v[2] < .0 || io->mod->e_frq->user_b_freq->v[3] < .0 || io->mod->e_frq->user_b_freq->v[0] > 1. || io->mod->e_frq->user_b_freq->v[1] > 1. || io->mod->e_frq->user_b_freq->v[2] > 1. || io->mod->e_frq->user_b_freq->v[3] > 1.) { Warn_And_Exit("\n. Invalid base frequencies.\n"); } } break; } case 'h':case 69: { Usage(); break; } case 'i':case 9: { char *tmp; tmp = (char *) mCalloc (T_MAX_FILE, sizeof(char)); if (strlen (optarg) > T_MAX_FILE -16) { char choix; strcpy (tmp, "\n. The file name'"); strcat (tmp, optarg); strcat (tmp, "' is too long.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else if (!Filexists (optarg)) { char choix; strcpy (tmp, "\n. The file '"); strcat (tmp, optarg); strcat (tmp, "' does not exist.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_align_file, optarg); io->fp_in_align = Openfile(io->in_align_file,0); strcpy(io->out_file, optarg); strcpy(io->out_tree_file,optarg); #ifdef PHYML strcat(io->out_tree_file,"_phyml_tree"); #elif M4 strcat(io->out_tree_file,"_m4_tree"); #elif PHYREX strcat(io->out_tree_file,"_phyrex_tree"); #endif strcpy(io->out_stats_file,optarg); #ifdef PHYML strcat(io->out_stats_file,"_phyml_stats"); #elif M4 strcat(io->out_stats_file,"_m4_stats"); #elif PHYREX strcat(io->out_stats_file,"_phyrex_stats"); #endif #ifdef PHYREX strcpy(io->out_summary_file,optarg); strcat(io->out_summary_file,"_phyrex_summary"); #endif } Free (tmp); break; } case 't':case 11: { if(opt_m == 0) { PhyML_Fprintf(stderr,"\n. Please use the -m option before -t in the command line."); Exit("\n"); } if((io->mod->whichmodel != JC69) && (io->mod->whichmodel != F81) && (io->mod->whichmodel != GTR)) { if ((strcmp(optarg, "e") == 0) || (strcmp(optarg, "E") == 0) || (strcmp(optarg, "estimated") == 0) || (strcmp(optarg, "ESTIMATED") == 0)) { io->mod->kappa->v = 4.0; io->mod->s_opt->opt_kappa = YES; if(io->mod->whichmodel == TN93) io->mod->s_opt->opt_lambda = YES; } else { io->mod->s_opt->opt_kappa = NO; io->mod->s_opt->opt_lambda = NO; // Added the 2 TsTv ratios for TN93 // lambda is the ratio of both TsTv ratios // kappa is the mean of both TsTv ratios if (io->mod->whichmodel == TN93) { double TsTvPur, TsTvPyr; TsTvPur = TsTvPyr = -1.; if(!isalpha(optarg[0])) { sscanf(optarg,"%lf,%lf",&TsTvPur,&TsTvPyr); } else { PhyML_Fprintf(stderr,"\n. The TN93 model requires two ts/tv ratios.\n"); Exit("\n"); } if ( (TsTvPur < .0) || (TsTvPyr < .0) ) { PhyML_Fprintf(stderr,"\n. ts/tv for purines: %f",TsTvPur); PhyML_Fprintf(stderr,"\n. ts/tv for pyrimidines: %f",TsTvPyr); PhyML_Fprintf(stderr,"\n. The TN93 model requires two ts/tv ratios"); PhyML_Fprintf(stderr,"\n. The command-line option should look as follows: ... -t 3.5,4.3 ... "); PhyML_Fprintf(stderr,"\n. The ts/tv ratio must be a positive number.\n"); Exit("\n"); } io->mod->lambda->v = (phydbl)(TsTvPur / TsTvPyr); io->mod->kappa->v = (phydbl)((TsTvPur + TsTvPyr)/2.); } else { // -- End TN93 rates for purines & pyrimidines if (atof(optarg) < .0) { char choix; PhyML_Printf("\n. The ts/tv ratio must be a positive number\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { io->mod->kappa->v = (phydbl)atof(optarg); } } } } break; } case 'n':case 8: { if ((!atoi(optarg)) || (atoi(optarg) < 0)) { char choix; PhyML_Printf("\n. The number of alignments must be a positive integer\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else io->n_data_sets = atoi (optarg); break; } case 'q':case 22: { io->interleaved = NO; break; } case 'u':case 15: { char *tmp; tmp = (char *)mCalloc(T_MAX_FILE, sizeof(char)); if(strlen(optarg) > T_MAX_FILE -11) { char choix; strcpy (tmp, "\n. The file name'"); strcat (tmp, optarg); strcat (tmp, "' is too long.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else if (! Filexists (optarg)) { char choix; strcpy (tmp, "\n. The file '"); strcat (tmp, optarg); strcat (tmp, "' doesn't exist.\n"); PhyML_Printf("%s",tmp); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { strcpy(io->in_tree_file, optarg); io->in_tree = 2; io->fp_in_tree = Openfile(io->in_tree_file,READ); } Free(tmp); break; } case 'v':case 13: { if ((strcmp (optarg, "e") == 0) || (strcmp (optarg, "E") == 0) || (strcmp (optarg, "estimated") == 0) || (strcmp (optarg, "ESTIMATED") == 0)) { io->mod->s_opt->opt_pinvar = YES; io->mod->ras->invar = YES; } else if ((atof(optarg) < 0.0) || (atof(optarg) > 1.0)) { char choix; PhyML_Printf("\n. The proportion of invariable site must be a number between 0.0 and 1.0\n"); PhyML_Printf("\n. Type any key to exit."); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } else { io->mod->ras->pinvar->v = (phydbl)atof(optarg); if (io->mod->ras->pinvar->v > 0.0+SMALL) io->mod->ras->invar = 1; else io->mod->ras->invar = 0; io->mod->s_opt->opt_pinvar = 0; } break; } case 'o': { if(!strcmp(optarg,"tlr")) { io->mod->s_opt->opt_topo = YES; io->mod->s_opt->opt_bl = YES; io->mod->s_opt->opt_subst_param = YES; } else if(!strcmp(optarg,"tl")) { io->mod->s_opt->opt_topo = YES; io->mod->s_opt->opt_bl = YES; io->mod->s_opt->opt_subst_param = NO; } else if(!strcmp(optarg,"t")) { Warn_And_Exit("\n. You can't optimize the topology without adjusting branch length too...\n"); } else if(!strcmp(optarg,"lr")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl = YES; io->mod->s_opt->opt_subst_param = YES; } else if(!strcmp(optarg,"l")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl = YES; io->mod->s_opt->opt_subst_param = NO; } else if(!strcmp(optarg,"r")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl = NO; io->mod->s_opt->opt_subst_param = YES; } else if(!strcmp(optarg,"none") || !strcmp(optarg,"n")) { io->mod->s_opt->opt_topo = NO; io->mod->s_opt->opt_bl = NO; io->mod->s_opt->opt_subst_param = NO; } else { char choix; PhyML_Printf ("\n. The optimization parameter must be 'tlr' or 'tl' or 'lr' or 'l' or 'r' or 'n'."); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } break; } case '?': { Exit("\n"); break; } case -1: { break; } default: { Usage(); break; } } }while(c != -1); /* if((io->mod->whichmodel == K80) || (io->mod->whichmodel == JC69)) */ /* { */ /* if(io->mod->s_opt->opt_state_freq) */ /* { */ /* char c; */ /* PhyML_Printf("\n. WARNING: nucleotide frequencies must be set to 1/4 with this model.\n"); */ /* PhyML_Printf("\n. Type the enter key to resume the analysis.\n"); */ /* scanf("%c",&c); */ /* } */ /* io->mod->s_opt->opt_state_freq = 0; */ /* } */ if(io->mod->s_opt->constrained_br_len == YES) { io->mod->s_opt->opt_topo = NO; /* io->mod->s_opt->opt_bl = NO; */ } if(io->do_tbe == YES) { io->do_alrt = NO; io->do_boot = NO; } else { if(io->do_alrt == NO && io->n_boot_replicates > 0) io->do_boot = YES; } #ifndef PHYML if((open_ps_file) || (io->m4_model == YES)) { strcpy(io->out_ps_file,io->in_align_file); strcat(io->out_ps_file, "_mc_tree.ps"); io->fp_out_ps = Openfile(io->out_ps_file,WRITE); } #endif if(io->datatype == UNDEFINED) io->datatype = NT; if ((io->datatype == NT) && (io->mod->whichmodel > 10)) { char choix; PhyML_Printf("\n. Err.: model incompatible with the data type. Please use JC69, K80, F81, HKY, F84, TN93 or GTR\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Warn_And_Exit("\n"); } else if ((io->datatype == AA) && (io->mod->whichmodel < 11)) { char choix; PhyML_Printf("\n. Err.: model incompatible with the data type. Please use LG, Dayhoff, JTT, MtREV, WAG, DCMut, RtREV, CpREV, VT, Blosum62, MtMam, MtArt, HIVw, HIVb or AB.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } if(io->mod->use_m4mod == NO) { io->mod->s_opt->opt_cov_delta = 0; io->mod->s_opt->opt_cov_alpha = 0; io->mod->s_opt->opt_cov_free_rates = 0; } if((io->mod->s_opt->opt_cov_free_rates) && (io->mod->s_opt->opt_cov_alpha)) { io->mod->s_opt->opt_cov_free_rates = 1; #ifdef M4 io->mod->m4mod->use_cov_alpha = 0; io->mod->m4mod->use_cov_free = 1; #endif } if(io->print_site_lnl && io->fp_in_align != NULL) { strcpy(io->out_lk_file,io->in_align_file); strcat(io->out_lk_file, "_phyml_lk"); if(io->append_run_ID) { strcat(io->out_lk_file,"_"); strcat(io->out_lk_file,io->run_id_string); } strcat(io->out_lk_file, ".txt"); io->fp_out_lk = Openfile(io->out_lk_file,1); } if(io->print_trace && io->fp_in_align != NULL) { strcpy(io->out_trace_file,io->in_align_file); strcat(io->out_trace_file,"_phyml_trace"); if(io->append_run_ID) { strcat(io->out_trace_file,"_"); strcat(io->out_trace_file,io->run_id_string); } strcat(io->out_trace_file,".txt"); io->fp_out_trace = Openfile(io->out_trace_file,WRITE); } if(io->print_json_trace && io->fp_in_align != NULL) { strcpy(io->out_json_trace_file,io->in_align_file); strcat(io->out_json_trace_file,"_phyml_trace"); if(io->append_run_ID) { strcat(io->out_json_trace_file,"_"); strcat(io->out_json_trace_file,io->run_id_string); } strcat(io->out_json_trace_file,".json"); io->fp_out_json_trace = Openfile(io->out_json_trace_file,READWRITE); } if(io->mod->s_opt->random_input_tree && io->fp_in_align != NULL) { strcpy(io->out_trees_file,io->in_align_file); strcat(io->out_trees_file,"_phyml_rand_trees"); if(io->append_run_ID) { strcat(io->out_trees_file,"_"); strcat(io->out_trees_file,io->run_id_string); } strcat(io->out_trees_file,".txt"); io->fp_out_trees = Openfile(io->out_trees_file,1); } if((io->print_boot_trees) && (io->do_boot == YES || io->do_tbe == YES) && (io->fp_in_align != NULL)) { strcpy(io->out_boot_tree_file,io->in_align_file); strcat(io->out_boot_tree_file,"_phyml_boot_trees"); if(io->append_run_ID) { strcat(io->out_boot_tree_file,"_"); strcat(io->out_boot_tree_file,io->run_id_string); } strcat(io->out_boot_tree_file,".txt"); io->fp_out_boot_tree = Openfile(io->out_boot_tree_file,1); strcpy(io->out_boot_stats_file,io->in_align_file); strcat(io->out_boot_stats_file,"_phyml_boot_stats"); if(io->append_run_ID) { strcat(io->out_boot_stats_file,"_"); strcat(io->out_boot_stats_file,io->run_id_string); } strcat(io->out_boot_stats_file,".txt"); io->fp_out_boot_stats = Openfile(io->out_boot_stats_file,1); } if(io->append_run_ID && io->fp_in_align != NULL) { strcat(io->out_tree_file,"_"); strcat(io->out_stats_file,"_"); strcat(io->out_tree_file,io->run_id_string); strcat(io->out_stats_file,io->run_id_string); } if(io->fp_in_align != NULL) { strcat(io->out_tree_file,".txt"); strcat(io->out_stats_file,".txt"); } #ifdef PHYREX strcat(io->out_summary_file,".txt"); #endif if(io->mod->ras->n_catg == 1) io->mod->s_opt->opt_alpha = 0; if(io->mod->s_opt->opt_subst_param == NO) { io->mod->s_opt->opt_alpha = NO; io->mod->s_opt->opt_kappa = NO; io->mod->s_opt->opt_lambda = NO; io->mod->s_opt->opt_pinvar = NO; io->mod->s_opt->opt_rr = NO; } if(io->mod->whichmodel != K80 && io->mod->whichmodel != HKY85 && io->mod->whichmodel != F84 && io->mod->whichmodel != TN93) { io->mod->s_opt->opt_kappa = NO; } if(io->datatype == AA && io->mod->whichmodel == CUSTOMAA && !io->mod->fp_aa_rate_mat) { PhyML_Printf("\n. Custom model option with amino-acid requires you to specify a rate matrix file through the '--aa_rate_file' option.\n"); Exit("\n"); } #if !defined(PHYTIME) // Make sure you don't erase the input file... if(!strcmp(io->out_tree_file,io->in_align_file) || !strcmp(io->out_stats_file,io->in_align_file)) { PhyML_Fprintf(stderr,"\n. The alignment file '%s' does not seem to exist...",io->in_align_file); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(io->fp_in_align != NULL) { io->fp_out_tree = Openfile(io->out_tree_file,writemode); io->fp_out_stats = Openfile(io->out_stats_file,writemode); } #endif #if defined(PHYREX) if(io->fp_in_align != NULL) io->fp_out_summary = Openfile(io->out_summary_file,writemode); #endif if(io->quiet == NO) { PhyML_Printf("\n\n. Command line: "); for(i=0;i #ifndef CL_H #define CL_H #include #include #include "utilities.h" #include "help.h" #include "models.h" #include "free.h" #include "interface.h" #include "invitee.h" #include "date.h" int Read_Command_Line(option *input, int argc, char **argv); #endif phyml-3.3.20220408/src/date.c000066400000000000000000001402301422404706600152650ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for molecular dating */ #include "date.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_Main(int argc, char **argv) { option *io; io = Get_Input(argc,argv); Free(io); return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DATE_XML(char *xml_filename) { FILE *fp_xml_in; xml_node *xnd,*xroot; t_tree *mixt_tree,*tree; phydbl *res; int seed; char *dum_string; mixt_tree = XML_Process_Base(xml_filename); assert(mixt_tree); mixt_tree->rates = RATES_Make_Rate_Struct(mixt_tree->n_otu); RATES_Init_Rate_Struct(mixt_tree->rates,NULL,mixt_tree->n_otu); mixt_tree->times = TIMES_Make_Time_Struct(mixt_tree->n_otu); TIMES_Init_Time_Struct(mixt_tree->times,NULL,mixt_tree->n_otu); tree = mixt_tree; do { // All rate stuctures point to the same object tree->rates = mixt_tree->rates; tree = tree->next; } while(tree); fp_xml_in = fopen(xml_filename,"r"); if(!fp_xml_in) { PhyML_Fprintf(stderr,"\n. Could not find the XML file '%s'.\n",xml_filename); Exit("\n"); } /* xroot = XML_Load_File(fp_xml_in); */ xroot = mixt_tree->xml_root; if(xroot == NULL) { PhyML_Fprintf(stderr,"\n. Encountered an issue while loading the XML file.\n"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } xnd = XML_Search_Node_Name("phytime",NO,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. Cound not find the \"root\" of the XML file (it should have \'phytime\' as tag name).\n"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } dum_string = XML_Get_Attribute_Value(xnd,"mcmc.chain.len"); if(dum_string != NULL) mixt_tree->io->mcmc->chain_len = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.sample.every"); if(dum_string != NULL) mixt_tree->io->mcmc->sample_interval = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.print.every"); if(dum_string != NULL) mixt_tree->io->mcmc->print_every = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"mcmc.burnin"); if(dum_string != NULL) mixt_tree->io->mcmc->chain_len_burnin = (int)String_To_Dbl(dum_string); dum_string = XML_Get_Attribute_Value(xnd,"ignore.sequences"); if(dum_string != NULL) mixt_tree->eval_alnL = NO; dum_string = XML_Get_Attribute_Value(xnd,"ignore.seq"); if(dum_string != NULL) mixt_tree->eval_alnL = NO; dum_string = XML_Get_Attribute_Value(xnd,"ignore.data"); if(dum_string != NULL) mixt_tree->eval_alnL = NO; dum_string = XML_Get_Attribute_Value(xnd,"mutmap"); if(dum_string != NULL) { int select = XML_Validate_Attr_Int(dum_string,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->io->mutmap = YES; else mixt_tree->io->mutmap = NO; } // Looking for XML node with rate-across-lineage info xnd = XML_Search_Node_Name("lineagerates",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stdout,"\n. The model of rate variation across lineages is not specified."); PhyML_Fprintf(stdout,"\n. Using the geometric Brownian model (see Guindon, 2012, Syst. Biol.).\n"); mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"geometric Brownian"); } else { char *model_name; model_name = XML_Get_Attribute_Value(xnd,"model"); if(model_name == NULL) { PhyML_Fprintf(stderr,"\n. Please specify a model of rate variation across lineages,"); PhyML_Fprintf(stderr,"\n. e.g., ."); PhyML_Fprintf(stderr,"\n. See the manual for more options."); assert(FALSE); } else { if(!strcmp(model_name,"geometricbrownian")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"geometric")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"integrated")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"geo")) { mixt_tree->rates->model_id = GUINDON; mixt_tree->mod->gamma_mgf_bl = YES; strcpy(mixt_tree->rates->model_name,"integrated"); } else if(!strcmp(model_name,"lognormal")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"normal")) { mixt_tree->rates->model_id = LOGNORMAL; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"lognormal (uncorrelated)"); } else if(!strcmp(model_name,"strictclock")) { mixt_tree->rates->model_id = STRICTCLOCK; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"strict clock"); } else if(!strcmp(model_name,"clock")) { mixt_tree->rates->model_id = STRICTCLOCK; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"strict clock"); } else if(!strcmp(model_name,"thorne")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else if(!strcmp(model_name,"autocorrelated")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else if(!strcmp(model_name,"autocorr")) { mixt_tree->rates->model_id = THORNE; mixt_tree->mod->gamma_mgf_bl = NO; strcpy(mixt_tree->rates->model_name,"autocorrelated"); } else { assert(FALSE); } } } // Looking for XML node with rate-across-lineage info xnd = XML_Search_Node_Name("clockrate",YES,xroot); if(xnd != NULL) { char *clock_r; clock_r = XML_Get_Attribute_Value(xnd,"value"); if(clock_r == NULL) clock_r = XML_Get_Attribute_Value(xnd,"clock.val"); if(clock_r == NULL) clock_r = XML_Get_Attribute_Value(xnd,"val"); if(clock_r != NULL) { mixt_tree->rates->clock_r = String_To_Dbl(clock_r); for(int i=0;i<2*mixt_tree->n_otu-1;++i) { mixt_tree->rates->br_r[i] = mixt_tree->rates->clock_r; mixt_tree->rates->nd_r[i] = mixt_tree->rates->clock_r; } } char *opt_clock; opt_clock = XML_Get_Attribute_Value(xnd,"optimise.clock"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"optimize.clock"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"optimize.rate"); if(opt_clock == NULL) opt_clock = XML_Get_Attribute_Value(xnd,"opt.clock"); if(opt_clock != NULL) { int select = XML_Validate_Attr_Int(opt_clock,6, "true","yes","y", "false","no","n"); if(select < 3) mixt_tree->mod->s_opt->opt_clock_r = YES; else mixt_tree->mod->s_opt->opt_clock_r = NO; } } // Looking for calibration info xnd = XML_Search_Node_Name("calibration",YES,xroot); if(xnd == NULL) { PhyML_Fprintf(stderr,"\n. No calibration information seems to be provided."); PhyML_Fprintf(stderr,"\n. Please amend your XML file. \n"); assert(FALSE); } else { assert(xnd->child); if(XML_Search_Node_Name("upper",NO,xnd->child) == NULL && XML_Search_Node_Name("lower",NO,xnd->child) == NULL) { PhyML_Fprintf(stderr,"\n. There is no calibration information provided. \n"); PhyML_Fprintf(stderr,"\n. Please check your data. \n"); assert(FALSE); } } /* MIXT_Check_Model_Validity(mixt_tree); */ /* MIXT_Init_Model(mixt_tree); */ /* Print_Data_Structure(NO,stdout,mixt_tree); */ /* tree = MIXT_Starting_Tree(mixt_tree); */ /* Copy_Tree(tree,mixt_tree); */ /* Free_Tree(tree); */ /* MIXT_Connect_Cseqs_To_Nodes(mixt_tree); */ /* MIXT_Init_T_Beg(mixt_tree); */ /* MIXT_Chain_Edges(mixt_tree); */ /* MIXT_Chain_Nodes(mixt_tree); */ /* MIXT_Make_Tree_For_Pars(mixt_tree); */ /* MIXT_Make_Tree_For_Lk(mixt_tree); */ /* MIXT_Make_Spr(mixt_tree); */ /* MIXT_Chain_All(mixt_tree); */ /* Add_Root(mixt_tree->a_edges[0],mixt_tree); */ /* MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); */ /* MIXT_Turn_Branches_OnOff_In_All_Elem(ON,mixt_tree); */ /* MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); */ /* MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); */ /* XML_Read_Calibration(xroot,mixt_tree); */ /* MIXT_Chain_Cal(mixt_tree); */ seed = (mixt_tree->io->r_seed < 0)?(time(NULL)):(mixt_tree->io->r_seed); srand(seed); mixt_tree->io->r_seed = seed; MIXT_Check_Model_Validity(mixt_tree); MIXT_Chain_Models(mixt_tree); Init_Model(mixt_tree->mod->io->cdata,mixt_tree->mod,mixt_tree->mod->io); Set_Model_Parameters(mixt_tree->mod); Print_Data_Structure(NO,stdout,mixt_tree); tree = MIXT_Starting_Tree(mixt_tree); Add_Root(tree->a_edges[0],tree); Copy_Tree(tree,mixt_tree); Free_Tree(tree); Copy_Tree(mixt_tree,mixt_tree->next); Connect_CSeqs_To_Nodes(mixt_tree->mod->io->cdata,mixt_tree->mod->io,mixt_tree); Init_T_Beg(mixt_tree); Make_Tree_For_Lk(mixt_tree); Make_Tree_For_Pars(mixt_tree); Make_Spr(mixt_tree); MIXT_Chain_All(mixt_tree); MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); MIXT_Turn_Branches_OnOff_In_All_Elem(ON,mixt_tree); MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); XML_Read_Calibration(xroot,mixt_tree); MIXT_Chain_Cal(mixt_tree); res = DATE_MCMC(mixt_tree); // Cleaning up... RATES_Free_Rates(mixt_tree->rates); RATES_Free_Rates(mixt_tree->aux_tree[0]->rates); TIMES_Free_Times(mixt_tree->times); TIMES_Free_Times(mixt_tree->aux_tree[0]->times); MCMC_Free_MCMC(mixt_tree->mcmc); MCMC_Free_MCMC(mixt_tree->aux_tree[0]->mcmc); Free_Mmod(mixt_tree->mmod); Free_Spr_List_One_Edge(mixt_tree); Free_Tree_Pars(mixt_tree); Free_Tree_Lk(mixt_tree); if(mixt_tree->io->fp_out_trees) fclose(mixt_tree->io->fp_out_trees); if(mixt_tree->io->fp_out_tree) fclose(mixt_tree->io->fp_out_tree); if(mixt_tree->io->fp_out_stats) fclose(mixt_tree->io->fp_out_stats); if(mixt_tree->io->fp_out_json_trace) fclose(mixt_tree->io->fp_out_json_trace); Free_Input(mixt_tree->io); tree = mixt_tree; do { Free_Calign(tree->data); tree = tree->next_mixt; } while(tree); tree = mixt_tree; do { Free_Optimiz(tree->mod->s_opt); tree = tree->next; } while(tree); Free_Model_Complete(mixt_tree->mod); Free_Model_Basic(mixt_tree->mod); Free_Tree(mixt_tree->aux_tree[0]); Free(mixt_tree->aux_tree); Free_Tree(mixt_tree); Free(res); XML_Free_XML_Tree(xroot); fclose(fp_xml_in); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update t_prior_min and t_prior_max on a given ranked tree // given (primary and secondary) calibration information. // Make sure secondary and primary calibration are up-to-date void DATE_Update_T_Prior_MinMax(t_tree *tree) { int i,j; for(i=0;i<2*tree->n_otu-1;++i) // All nodes { tree->times->t_prior_max[i] = +INFINITY; tree->times->t_prior_min[i] = -INFINITY; if(tree->a_nodes[i]->n_cal > 0) // Primary calibration found on that node { for(j=0;ja_nodes[i]->n_cal;++j) { tree->times->t_prior_max[i] = MIN(tree->times->t_prior_max[i],tree->a_nodes[i]->cal[j]->upper); tree->times->t_prior_min[i] = MAX(tree->times->t_prior_min[i],tree->a_nodes[i]->cal[j]->lower); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DATE_Assign_Primary_Calibration(t_tree *tree) { int i,j,idx,node_num; t_clad *clade; t_cal *cal; clade = NULL; cal = NULL; for(i=0;itimes->n_cal;++i) { cal = tree->times->a_cal[i]; if(cal->clade_list != NULL) { clade = cal->clade_list[cal->current_clade_idx]; clade->target_nd = NULL; } } for(i=0;i<2*tree->n_otu-1;++i) for(j=0;ja_nodes[i]->cal[j] = NULL; tree->a_nodes[i]->n_cal = 0; } for(i=0;itimes->n_cal;++i) { cal = tree->times->a_cal[i]; if(cal->clade_list != NULL) { clade = cal->clade_list[cal->current_clade_idx]; node_num = Find_Clade(clade->tax_list, clade->n_tax, tree); clade->target_nd = tree->a_nodes[node_num]; idx = tree->a_nodes[node_num]->n_cal; tree->a_nodes[node_num]->cal[idx] = tree->times->a_cal[i]; tree->a_nodes[node_num]->n_cal++; if(tree->a_nodes[node_num]->n_cal == MAX_N_CAL) { PhyML_Fprintf(stderr,"\n. A node cannot have more than %d calibration",MAX_N_CAL); PhyML_Fprintf(stderr,"\n. constraints attached to it. Feel free to increase the"); PhyML_Fprintf(stderr,"\n. value of the variable MAX_N_CAL in utilities.h if"); PhyML_Fprintf(stderr,"\n. necessary."); Exit("\n"); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Return splitted calibration intervals. Make sure all primary // and secondary calibration intervals are up-to-date. phydbl *DATE_Splitted_Calibration(t_tree *tree) { phydbl *minmax,*splitted_cal,buff; int i,len,done; // One t_prior_min and one t_prior_max per internal nodes except root, so // 2 x # of internal nodes boundaries in total at most. minmax = (phydbl *)mCalloc(2*(tree->n_otu-2),sizeof(phydbl)); For(i,2*(tree->n_otu-2)) minmax[i] = +INFINITY; splitted_cal = (phydbl *)mCalloc((int)(4*tree->n_otu-10),sizeof(phydbl)); len = 0; for(i = tree->n_otu; i < 2*tree->n_otu-1; i++) { if(tree->a_nodes[i] != tree->n_root) { minmax[len] = MAX(tree->times->t_prior_min[i],tree->times->nd_t[tree->n_root->num]); minmax[len+1] = tree->times->t_prior_max[i]; len+=2; } } // Bubble sort of all these times in increasing order do { done = YES; for(i=0;i minmax[i+1]) { buff = minmax[i]; minmax[i] = minmax[i+1]; minmax[i+1] = buff; done = NO; } } } while(done == NO); for(i=0;i minmax[i+1])); // Remove ties for(i=0;i minmax[i+1]) { buff = minmax[i]; minmax[i] = minmax[i+1]; minmax[i+1] = buff; done = NO; } } } while(done == NO); splitted_cal[0] = minmax[0]; len = 1; for(i = 1; i < 2*(tree->n_otu-2); i++) { splitted_cal[len] = minmax[i]; if(len+1 < 4*tree->n_otu-10) splitted_cal[len+1] = minmax[i]; len+=2; } /* For(i,4*tree->n_otu-10) PhyML_Printf("\n. split -- %3d %12f",i,splitted_cal[i]); */ Free(minmax); return splitted_cal; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DATE_J_Sum_Product(t_tree *tree) { phydbl prod, total,*splitted_cal; int fact,idx,ans,rk; DATE_Assign_Primary_Calibration(tree); DATE_Update_T_Prior_MinMax(tree); splitted_cal = DATE_Splitted_Calibration(tree); ans = 0; total = 0.0; idx = 0; rk = 1; do { prod = 1.0; fact = 1; ans = DATE_J_Sum_Product_Pre(tree->a_nodes[tree->times->t_rank[rk]], // Oldest node after root (as rk=1) idx, -1, prod,fact,&total,splitted_cal,rk,tree); idx+=2; } while(ans != 1); Free(splitted_cal); return(total); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_J_Sum_Product_Pre(t_node *d, int split_idx_d, int split_idx_a, phydbl prod, int fact, phydbl *total, phydbl *splitted_cal, int rk, t_tree *tree) { int ans,idx; ans = DATE_Is_Split_Accessible(d,split_idx_d,splitted_cal,tree); switch(ans) { case 1 : // split interval is younger than t_prior_max. No need to go further. { return ans; break; } case 0 : // split interval is within [t_prior_min,t_prior_max] { int local_ans; // Calculate J for this time interval prod *= DATE_J(tree->times->birth_rate, tree->times->death_rate, FABS(splitted_cal[split_idx_d+1]), FABS(splitted_cal[split_idx_d])); // Remove factorial term from current product prod *= fact; if(split_idx_d == split_idx_a) fact++; else fact = 1; prod /= fact; if(tree->times->t_rank[tree->n_otu-2] == d->num) // Youngest internal node { (*total) += prod; return 0; } idx = split_idx_d; do { local_ans = DATE_J_Sum_Product_Pre(tree->a_nodes[tree->times->t_rank[rk+1]], idx, split_idx_d, prod,fact,total,splitted_cal,rk+1,tree); idx+=2; } while(local_ans == 0); break; } case -1 : // split interval is older than t_prior_min. Move forward. { int local_ans; // Advance to younger split intervals and stop once you're in idx = split_idx_d+2; do { local_ans = DATE_J_Sum_Product_Pre(d, idx, idx+1, prod,fact,total,splitted_cal,rk,tree); idx+=2; } while(local_ans == -1); break; } } return ans; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_Is_Split_Accessible(t_node *d, int which, phydbl *splitted_cal, t_tree *tree) { phydbl eps; assert(d->tax == NO); eps = FABS(tree->times->t_prior_min[d->num]) / 1.E+6; assert(eps > MDBL_MIN); // Upper and lower bound of splitted calibration interval are equal to zero if(Are_Equal(splitted_cal[which],0.0,eps) && Are_Equal(splitted_cal[which+1],0.0,eps)) return +1; if(Are_Equal(tree->times->t_prior_min[d->num],splitted_cal[which],eps) || Are_Equal(tree->times->t_prior_max[d->num],splitted_cal[which+1],eps) || (tree->times->t_prior_min[d->num] < splitted_cal[which] && tree->times->t_prior_max[d->num] > splitted_cal[which+1])) return 0; // splitted interval is within [t_prior_min,t_prior_max] else if(Are_Equal(tree->times->t_prior_max[d->num],splitted_cal[which],eps) || splitted_cal[which] > tree->times->t_prior_max[d->num]) return +1; // splitted interval is younger than [t_prior_min,t_prior_max] else if(Are_Equal(tree->times->t_prior_min[d->num],splitted_cal[which+1],eps) || splitted_cal[which+1] < tree->times->t_prior_min[d->num]) return -1; // splitted interval is older than [t_prior_min,t_prior_max] else { PhyML_Printf("\n. d->num: %d d->tax: %d",d->num,d->tax); PhyML_Printf("\n. t_prior_min: %f t_prior_max: %f", tree->times->t_prior_min[d->num], tree->times->t_prior_max[d->num]); PhyML_Printf("\n. splitted_cal_min: %f splitted_cal_max: %f", splitted_cal[which], splitted_cal[which+1]); PhyML_Printf("\n"); assert(FALSE); // splitted interval cannot be partially overlapping [t_prior_min,t_prior_max] } return(0); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DATE_J(phydbl birth_r, phydbl death_r, phydbl t_min, phydbl t_pls) { phydbl d,b,J; assert(t_pls > t_min); d = death_r; b = birth_r; J = (b-d)*(exp(t_min*d+t_pls*b) - exp(t_min*b+t_pls*d)); J /= ((b*exp(t_min*b)-d*exp(t_min*d)) * (b*exp(t_pls*b)-d*exp(t_pls*d))); /* printf(" J : %f",J); */ return(J); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int DATE_Check_Calibration_Constraints(t_tree *tree) { int i,j; phydbl lower,upper; lower = upper = -1.; For(i,2*tree->n_otu-1) { if(tree->a_nodes[i]->n_cal > 1) { lower = tree->a_nodes[i]->cal[0]->lower; upper = tree->a_nodes[i]->cal[0]->upper; for(j=1; j < tree->a_nodes[i]->n_cal; j++) { lower = MAX(lower,tree->a_nodes[i]->cal[j]->lower); upper = MIN(upper,tree->a_nodes[i]->cal[j]->upper); if(upper < lower) { /* PhyML_Printf("\n. Inconsistency detected on node %d",i); */ return 0; } } } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Check that time constraints are satisfied. Note: it is a // requirement to verify that the age of the root node is also // within correct boundaries int DATE_Check_Time_Constraints(t_tree *tree) { for(int i=0;i<2*tree->n_otu-1;++i) { if(tree->a_nodes[i]->tax == NO) { if(tree->times->nd_t[i] > tree->times->t_prior_max[i] || tree->times->nd_t[i] < tree->times->t_prior_min[i]) { /* PhyML_Printf("\n!!! Node %d t: %f min:%f max:%f", */ /* i, */ /* tree->times->nd_t[i], */ /* tree->times->t_prior_min[i], */ /* tree->times->t_prior_max[i]); */ return 0; } } } return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl *DATE_MCMC(t_tree *tree) { t_mcmc *mcmc; char *s_tree; int move, n_vars, i, j, adjust_len; phydbl u; phydbl *res; FILE *fp_stats,*fp_tree; int t_beg; t_beg = (int)time(NULL); fp_stats = tree->io->fp_out_stats; fp_tree = tree->io->fp_out_tree; if(tree->io->mutmap == YES) Make_MutMap(tree); TIMES_Randomize_Tree_With_Time_Constraints(tree->times->a_cal[0],tree); MIXT_Propagate_Tree_Update(tree); mcmc = MCMC_Make_MCMC_Struct(); tree->mcmc = mcmc; MCMC_Init_MCMC_Struct(NULL,NULL,mcmc); MCMC_Complete_MCMC(mcmc,tree); MCMC_Randomize_Birth(tree); MCMC_Randomize_Death(tree); MCMC_Randomize_Clock_Rate(tree); MCMC_Randomize_Rate_Across_Sites(tree); MCMC_Randomize_Rates(tree); n_vars = 10; adjust_len = tree->io->mcmc->chain_len_burnin; mcmc->sample_interval = tree->io->mcmc->sample_interval; mcmc->print_every = tree->io->mcmc->print_every; mcmc->chain_len = tree->io->mcmc->chain_len; mcmc->chain_len_burnin = tree->io->mcmc->chain_len_burnin; tree->rates->bl_from_rt = YES; res = (phydbl *)mCalloc(tree->mcmc->chain_len / tree->mcmc->sample_interval * n_vars,sizeof(phydbl)); Set_Both_Sides(YES,tree); Set_Update_Eigen(YES,tree->mod); Lk(NULL,tree); Set_Update_Eigen(NO,tree->mod); RATES_Lk(tree); DATE_Assign_Primary_Calibration(tree); TIMES_Lk(tree); /* Time_To_Branch(tree); */ /* tree->bl_ndigits = 1; */ /* printf("\n. Random init tree: %s",Write_Tree(tree)); */ /* tree->bl_ndigits = 7; */ RATES_Update_Edge_Lengths(tree); PhyML_Printf("\n. AVX enabled: %s", #if defined(__AVX__) "yes" #else "no" #endif ); PhyML_Printf("\n. SSE enabled: %s", #if defined(__SSE3__) "yes" #else "no" #endif ); PhyML_Printf("\n\n. Seed: %d",tree->io->r_seed); PhyML_Printf("\n. Ignore sequences: %s",tree->eval_alnL == YES ? "no" : "yes"); PhyML_Printf("\n. Model of variation of rates across lineages: %s",tree->rates->model_name); PhyML_Printf("\n. log(Pr(Seq|Tree)) = %f",tree->c_lnL); PhyML_Printf("\n. log(Pr(Tree)) = %f",tree->times->c_lnL); tree->aux_tree = (t_tree **)mCalloc(1,sizeof(t_tree *)); tree->aux_tree[0] = Make_Tree_From_Scratch(tree->n_otu,tree->data); tree->aux_tree[0]->mod = tree->mod; Copy_Tree(tree,tree->aux_tree[0]); tree->aux_tree[0]->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->aux_tree[0]->rates,NULL,tree->n_otu); RATES_Copy_Rate_Struct(tree->rates,tree->aux_tree[0]->rates,tree->n_otu); tree->aux_tree[0]->rates->model_id = LOGNORMAL; tree->aux_tree[0]->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->aux_tree[0]->times,NULL,tree->n_otu); TIMES_Copy_Time_Struct(tree->times,tree->aux_tree[0]->times,tree->n_otu); RATES_Duplicate_Calib_Struct(tree,tree->aux_tree[0]); MIXT_Chain_Cal(tree->aux_tree[0]); DATE_Assign_Primary_Calibration(tree->aux_tree[0]); TIMES_Randomize_Tree_With_Time_Constraints(tree->aux_tree[0]->times->a_cal[0],tree->aux_tree[0]); TIMES_Lk(tree->aux_tree[0]); PhyML_Printf("\n. log(Pr(extra tree)) = %f",tree->aux_tree[0]->times->c_lnL); mcmc = MCMC_Make_MCMC_Struct(); tree->aux_tree[0]->mcmc = mcmc; MCMC_Init_MCMC_Struct(NULL,NULL,mcmc); MCMC_Complete_MCMC(mcmc,tree->aux_tree[0]); PhyML_Fprintf(fp_stats,"\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t", "sample", "lnL(posterior)", "lnL(seq)", "lnL(times)", "lnL(rates)", "birth", "death", "clock", "root", "tstv", "nu"); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"rr%d\t",i); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"pr%d\t",i); for(i=0;itimes->n_cal;++i) { t_cal *cal = tree->times->a_cal[i]; for(j=0;jclade_list_size;++j) { t_clad *clade = cal->clade_list[j]; PhyML_Fprintf(fp_stats,"t(calib:%s_clade:%s)\t",cal->id,clade->id); } } for(i=0;itimes->n_cal;++i) { t_cal *cal = tree->times->a_cal[i]; PhyML_Fprintf(fp_stats,"clade(calib:%s)\t",cal->id); } if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) for(i=0;i<2*tree->n_otu-2;++i) PhyML_Fprintf(fp_stats,"br%d\t",i); else for(i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"nr%d\t",i); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) PhyML_Fprintf(fp_stats,"t%d\t",i); PhyML_Fprintf(fp_stats,"accRT\t"); PhyML_Fprintf(fp_stats,"tuneRT\t"); PhyML_Fprintf(fp_stats,"accT\t"); PhyML_Fprintf(fp_stats,"tuneT\t"); PhyML_Fprintf(fp_stats,"accClock\t"); PhyML_Fprintf(fp_stats,"tuneClock\t"); PhyML_Fprintf(fp_stats,"accTCr\t"); PhyML_Fprintf(fp_stats,"tuneTCr\t"); PhyML_Fprintf(fp_stats,"accTreeRates\t"); PhyML_Fprintf(fp_stats,"tuneTreeRates\t"); PhyML_Fprintf(fp_stats,"accSprW\t"); PhyML_Fprintf(fp_stats,"tuneSprW\t"); PhyML_Fprintf(fp_stats,"accSpr\t"); PhyML_Fprintf(fp_stats,"tuneSpr\t"); PhyML_Fprintf(fp_stats,"accSprLoc\t"); PhyML_Fprintf(fp_stats,"tuneSprLoc\t"); fflush(NULL); PhyML_Printf("\n\n"); PhyML_Printf("\n. MCMC settings. Chain length: %g steps.",(phydbl)tree->mcmc->chain_len); PhyML_Printf("\n. MCMC settings. Burnin: %g steps.",(phydbl)tree->mcmc->chain_len_burnin); PhyML_Printf("\n. MCMC settings. Sample every %g steps.",(phydbl)tree->mcmc->sample_interval); PhyML_Printf("\n. MCMC settings. Print out every %g steps.",(phydbl)tree->mcmc->print_every); PhyML_Printf("\n\n"); for(i=0;imcmc->n_moves;i++) tree->mcmc->start_ess[i] = YES; Set_Both_Sides(NO,tree); tree->mcmc->always_yes = NO; move = -1; // Get in the range of sensible values for clock_r i = 0; do { MCMC_Clock_R(tree); } while(i++ < 100); do { if(tree->mcmc->run > adjust_len) for(i=0;imcmc->n_moves;i++) tree->mcmc->adjust_tuning[i] = NO; if(tree->c_lnL < UNLIKELY + 0.1 && tree->eval_alnL == YES) { PhyML_Printf("\n. Move '%s' failed\n",tree->mcmc->move_name[move]); assert(FALSE); } u = Uni(); for(move=0;movemcmc->n_moves;move++) if(tree->mcmc->move_weight[move] > u-1.E-10) break; assert(!(move == tree->mcmc->n_moves)); if(!strcmp(tree->mcmc->move_name[move],"clock")) MCMC_Clock_R(tree); else if(!strcmp(tree->mcmc->move_name[move],"birth_rate")) MCMC_Birth_Rate(tree); else if(!strcmp(tree->mcmc->move_name[move],"death_rate")) MCMC_Death_Rate(tree); else if(!strcmp(tree->mcmc->move_name[move],"birth_death_updown")) MCMC_Birth_Death_Updown(tree); else if(!strcmp(tree->mcmc->move_name[move],"tree_height")) MCMC_Tree_Height(tree); else if(!strcmp(tree->mcmc->move_name[move],"times")) MCMC_Times_All(tree); else if(!strcmp(tree->mcmc->move_name[move],"times_and_rates")) MCMC_Times_And_Rates_All(tree); else if(!strcmp(tree->mcmc->move_name[move],"spr")) MCMC_Prune_Regraft(tree); else if(!strcmp(tree->mcmc->move_name[move],"spr_local")) MCMC_Prune_Regraft_Local(tree); else if(!strcmp(tree->mcmc->move_name[move],"spr_weighted")) MCMC_Prune_Regraft_Weighted(tree); else if(!strcmp(tree->mcmc->move_name[move],"updown_t_cr")) MCMC_Updown_T_Cr(tree); else if(!strcmp(tree->mcmc->move_name[move],"kappa")) MCMC_Kappa(tree); else if(!strcmp(tree->mcmc->move_name[move],"ras")) MCMC_Rate_Across_Sites(tree); else if(!strcmp(tree->mcmc->move_name[move],"nu")) MCMC_Nu(tree); else if(!strcmp(tree->mcmc->move_name[move],"subtree_height")) MCMC_Subtree_Height(tree); else if(!strcmp(tree->mcmc->move_name[move],"time_slice")) MCMC_Time_Slice(tree); else if(!strcmp(tree->mcmc->move_name[move],"br_rate")) MCMC_Rates_All(tree); else if(!strcmp(tree->mcmc->move_name[move],"tree_rates")) MCMC_Tree_Rates(tree); else if(!strcmp(tree->mcmc->move_name[move],"clade_change")) MCMC_Clade_Change(tree); else continue; phydbl cur_lk = tree->c_lnL; phydbl new_lk = Lk(NULL,tree); if(Are_Equal(cur_lk,new_lk,1.E-5) == NO) { PhyML_Printf("\n. move: %s",tree->mcmc->move_name[move]); PhyML_Printf("\n. new: %f cur: %f",new_lk,cur_lk); assert(FALSE); } if(!RATES_Check_Edge_Length_Consistency(tree)) { PhyML_Fprintf(stderr,"\n. Issue detected by RATES_Check_Edge_Length_Consistency(tree)."); PhyML_Fprintf(stderr,"\n. Move: %s",tree->mcmc->move_name[move]); if(tree->eval_alnL == YES) assert(FALSE); } if(!TIMES_Check_Node_Height_Ordering(tree)) { PhyML_Fprintf(stderr,"\n. Issue detected by TIMES_Check_Node_Height_Ordering(tree)."); PhyML_Fprintf(stderr,"\n. Move: %s",tree->mcmc->move_name[move]); assert(FALSE); } if(!(tree->times->c_lnL > UNLIKELY)) { PhyML_Fprintf(stderr,"\n. move: %s",tree->mcmc->move_name[move]); PhyML_Fprintf(stderr,"\n. glnL=%f",tree->times->c_lnL); assert(FALSE); } (void)signal(SIGINT,MCMC_Terminate); if(!(tree->mcmc->run%tree->mcmc->print_every)) { phydbl mean_r,post; mean_r = RATES_Average_Substitution_Rate(tree); post = Get_Lk(tree) + tree->times->c_lnL + tree->rates->c_lnL; if(tree->mcmc->run < adjust_len) PhyML_Printf("\nx"); else PhyML_Printf("\n."); PhyML_Printf(" %10d lnL: [%12.2f -- %12.2f -- %12.2f -- %12.2f] root age: %12f [time: %7d sec] clock: %15f %20s", tree->mcmc->run, post, Get_Lk(tree), tree->times->c_lnL, tree->rates->c_lnL, fabs(tree->times->nd_t[tree->n_root->num]), (int)time(NULL) - t_beg, mean_r, tree->mcmc->move_name[move]); } if(!(tree->mcmc->run%tree->mcmc->sample_interval)) { phydbl mean_r,post; mean_r = RATES_Average_Substitution_Rate(tree); post = Get_Lk(tree) + tree->times->c_lnL + tree->rates->c_lnL; PhyML_Fprintf(fp_stats,"\n%6d\t%9.1f\t%9.1f\t%9.1f\t%9.1f\t%12G\t%12G\t%12G\t%12G\t%12G\t%12G\t", tree->mcmc->run, post, Get_Lk(tree), tree->times->c_lnL, tree->rates->c_lnL, tree->times->birth_rate, tree->times->death_rate, mean_r, fabs(tree->times->nd_t[tree->n_root->num]), tree->next->mod->kappa->v, tree->rates->nu); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"%G\t",tree->mod->ras->gamma_rr->v[i]); for(i=0;imod->ras->n_catg;i++) PhyML_Fprintf(fp_stats,"%G\t",tree->mod->ras->gamma_r_proba->v[i]); for(i=0;itimes->n_cal;i++) { t_cal *cal = tree->times->a_cal[i]; for(j=0;jclade_list_size;++j) { t_clad *clade = cal->clade_list[j]; PhyML_Fprintf(fp_stats,"%G\t",fabs(tree->times->nd_t[clade->target_nd->num])); } } for(i=0;itimes->n_cal;++i) { t_cal *cal = tree->times->a_cal[i]; PhyML_Fprintf(fp_stats,"%d\t",cal->current_clade_idx); /* PhyML_Fprintf(fp_stats,"%s\t",cal->clade_list[cal->current_clade_idx]->id); */ } if(tree->rates->model_id == THORNE || tree->rates->model_id == LOGNORMAL || tree->rates->model_id == STRICTCLOCK) for(i=0;i<2*tree->n_otu-2;++i) PhyML_Fprintf(fp_stats,"%G\t",tree->rates->br_r[i]); else for(i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"%G\t",tree->rates->nd_r[i]); for(i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i]->tax == NO) PhyML_Fprintf(fp_stats,"%G\t",fabs(tree->times->nd_t[i])); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_times_and_rates_root]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_times_and_rates_root]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_root_time]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_root_time]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_clock_r]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_clock_r]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_updown_t_cr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_updown_t_cr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_tree_rates]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_tree_rates]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_spr_weighted]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_spr_weighted]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_spr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_spr]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->acc_rate[tree->mcmc->num_move_spr_local]); PhyML_Fprintf(fp_stats,"%G\t",tree->mcmc->tune_move[tree->mcmc->num_move_spr_local]); if(tree->mcmc->sample_num == 0) { PhyML_Fprintf(fp_tree,"\n#NEXUS"); PhyML_Fprintf(fp_tree,"\nBEGIN TREES;"); } else { fseek(fp_tree,-5,SEEK_CUR); } TIMES_Time_To_Bl(tree); tree->bl_ndigits = 3; /* RATES_Update_Edge_Lengths(tree); */ s_tree = Write_Tree(tree); tree->bl_ndigits = 7; PhyML_Fprintf(fp_tree,"\ntree %d [&lnP=%f] = [&R] %s",tree->mcmc->sample_num,tree->c_lnL,s_tree); Free(s_tree); PhyML_Fprintf(fp_tree,"\nEND;"); fflush(NULL); RATES_Update_Edge_Lengths(tree); if(tree->mcmc->run > tree->mcmc->chain_len_burnin && tree->io->mutmap == YES) Sample_Ancestral_Seq(YES,NO,tree); tree->mcmc->sample_num++; } tree->mcmc->run++; MCMC_Get_Acc_Rates(tree->mcmc); } while(tree->mcmc->run < tree->mcmc->chain_len); return(res); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update the list of nodes that are younger than lim void DATE_List_Of_Nodes_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree) { if(tree->times->nd_t[d->num] > lim) Push_Bottom_Linked_List(d,list,YES); if(d->tax == YES) return; else { int i; if(d == tree->n_root) { DATE_List_Of_Nodes_Younger_Than(d,d->v[1],lim,list,tree); DATE_List_Of_Nodes_Younger_Than(d,d->v[2],lim,list,tree); } else { for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) DATE_List_Of_Nodes_Younger_Than(d,d->v[i],lim,list,tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update the list of nodes that are younger than lim with direct ancestors // not younger than lim void DATE_List_Of_Nodes_And_Ancestors_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree) { if(tree->times->nd_t[d->num] > lim && a != NULL && tree->times->nd_t[a->num] > lim) Push_Bottom_Linked_List(d,list,YES); if(d->tax == YES) return; else { int i; if(d == tree->n_root) { DATE_List_Of_Nodes_And_Ancestors_Younger_Than(d,d->v[1],lim,list,tree); DATE_List_Of_Nodes_And_Ancestors_Younger_Than(d,d->v[2],lim,list,tree); } else { for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) DATE_List_Of_Nodes_And_Ancestors_Younger_Than(d,d->v[i],lim,list,tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // List of valid regraft nodes, taking into account calibration // constraints. The subtree (defined by prune and prune_daughter // will be re-attached *on top of* one of the nodes in this list // (as opposed to *on one of the sister edges below*). t_ll *DATE_List_Of_Regraft_Nodes(t_node *prune, t_node *prune_daughter, phydbl *t_min, phydbl *t_max, int verbose, t_tree *tree) { t_node *n,*m; int i,j; t_ll *out,*in,*ll; int is_clade_affected; t_clad *clade; t_cal *cal; cal = NULL; clade = NULL; n = NULL; m = NULL; *t_min = -INFINITY; in = NULL; out = NULL; is_clade_affected = NO; // Find the oldest LCA of calibrated sets among the nodes between // prune and root. These clades might see the position of their // LCA change. if(prune != tree->n_root) { n = prune; while(n) { for(i=0;itimes->n_cal;++i) { // That node is the LCA of calibration a_cal[i] cal = tree->times->a_cal[i]; clade = cal->clade_list[cal->current_clade_idx]; if(n == clade->target_nd) { is_clade_affected = NO; for(j=0;jn_tax;++j) { m = clade->tip_list[j]; do { if(m == prune_daughter) { is_clade_affected = YES; break; } m = m->anc; } while(m); if(is_clade_affected == YES) break; } // Maximum of the lower bounds for calibration intervals /* if(is_clade_affected == YES) *t_min = MAX(*t_min,tree->times->a_cal[i]->lower); */ if(is_clade_affected == YES) *t_min = MAX(*t_min,tree->times->t_prior_min[n->num]); } } n = n->anc; } } // Find the oldest internal node within intervals defined by // calibrations affected by the pruning. n = prune_daughter; while(n->anc && !(tree->times->nd_t[n->anc->num] < *t_min)) { n = n->anc; assert(n); } if(verbose) { PhyML_Printf("\n. Apical: %d @ time %f min: %f",n->num,tree->times->nd_t[n->num],*t_min); fflush(NULL); } // List all nodes younger than this apical node DATE_List_Of_Nodes_Younger_Than(n->anc,n,-INFINITY,&in,tree); assert(in != NULL); if(verbose) { ll = in->head; t_node *x; do { x = (t_node *)ll->v; PhyML_Printf("\nx Inlist %d @ %f",x->num,tree->times->nd_t[x->num]); ll = ll->next; } while(ll != NULL); } // Remove from that list the nodes that are too young to be suitable regraft points. n = prune_daughter; out = NULL; while(n) { for(i=0;itimes->n_cal;i++) { cal = tree->times->a_cal[i]; clade = cal->clade_list[cal->current_clade_idx]; if(n->anc && n->anc == clade->target_nd) { for(j=0;jn_tax;++j) { m = clade->tip_list[j]; do { if(m == prune_daughter) break; if(m == prune) break; m = m->anc; } while(m); if(m == prune) break; // Prune-regraft anywhere below calibrated node will not change that node. } if(m != prune) { for(j=0;j<3;++j) { if(n->anc->v[j] != n->anc->anc && n->anc->b[j] != tree->e_root && n->anc->v[j] != n) { DATE_List_Of_Nodes_And_Ancestors_Younger_Than(n->anc, n->anc->v[j], tree->times->a_cal[i]->upper, &out, tree); break; } } } } } n = n->anc; } // Remove nodes that are `strictly' younger than prune_daughter DATE_List_Of_Nodes_And_Ancestors_Younger_Than(tree->n_root,tree->n_root->v[1],tree->times->nd_t[prune_daughter->num],&out,tree); DATE_List_Of_Nodes_And_Ancestors_Younger_Than(tree->n_root,tree->n_root->v[2],tree->times->nd_t[prune_daughter->num],&out,tree); // Remove nodes that are below prune_daughter (prune_daughter included) DATE_List_Of_Nodes_Younger_Than(prune,prune_daughter,-INFINITY,&out,tree); // Add prune node to the list of node that can't be targeted for regraft Push_Bottom_Linked_List(prune,&out,YES); // Add root node as one cannot regraft above it /* Push_Bottom_Linked_List(tree->n_root,&out); */ if(verbose) { printf("\nx outlist: %p",(void *)out); fflush(NULL); ll = out->head; do { t_node *x = (t_node *)ll->v; PhyML_Printf("\nx Outlist %d @ %f",x->num,tree->times->nd_t[x->num]); ll = ll->next; } while(ll != NULL); } /* Print_List(in); */ ll = out->head; do { if(verbose) { t_node *x = (t_node *)ll->v; printf("\nx Remove %d",x->num); } Remove_From_Linked_List(NULL,ll->v,&in); if(verbose) PhyML_Printf("\n. List in (in->head:%p in->tail:%p):",in?in->head:NULL,in?in->tail:NULL); /* Print_List(in); */ ll = ll->next; } while(ll != NULL); Free_Linked_List(out); if(verbose) { ll = in->head; do { t_node *x; x = (t_node *)ll->v; printf("\n. In1: %d",x->num); fflush(NULL); ll = ll->next; } while(ll != NULL); } return(in); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DATE_Lk_Calib(t_tree *tree) { phydbl lnL; int i; t_cal *cal; lnL = 0.0; for(i=0;itimes->n_cal;++i) { cal = tree->times->a_cal[i]; lnL += LOG(cal->alpha_proba_list[cal->current_clade_idx]); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/date.h000066400000000000000000000033341422404706600152750ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef DATE_H #define DATE_H #include "utilities.h" int DATE_Main(int argc, char **argv); void DATE_XML(char *xml_filename); void DATE_Update_Secondary_Cal(t_tree *tree); void DATE_Update_Secondary_Cal_Post(t_node *a, t_node *d, t_tree *tree); void DATE_Update_Secondary_Cal_Pre(t_node *a, t_node *d, t_tree *tree); phydbl *DATE_Splitted_Calibration(t_tree *tree); void DATE_Assign_Primary_Calibration(t_tree *tree); void DATE_Update_T_Prior_MinMax(t_tree *tree); phydbl DATE_J(phydbl birth_r, phydbl death_r, phydbl t_min, phydbl t_pls); int DATE_Is_Split_Accessible(t_node *d, int which, phydbl *splitted_cal, t_tree *tree); phydbl *DATE_Splitted_Calibration(t_tree *tree); phydbl DATE_J_Sum_Product(t_tree *tree); int DATE_J_Sum_Product_Pre(t_node *d, int split_idx_d, int split_idx_a, phydbl prod, int fact, phydbl *total, phydbl *splitted_cal, int rk, t_tree *tree); void DATE_Chain_Cal(t_tree *mixt_tree); int DATE_Check_Calibration_Constraints(t_tree *tree); int DATE_Check_Time_Constraints(t_tree *tree); phydbl *DATE_MCMC(t_tree *tree); void DATE_List_Of_Nodes_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree); void DATE_List_Of_Nodes_And_Ancestors_Younger_Than(t_node *a, t_node *d, phydbl lim, t_ll **list, t_tree *tree); t_ll *DATE_List_Of_Regraft_Nodes(t_node *prune, t_node *prune_daughter, phydbl *t_min, phydbl *t_max, int verbose, t_tree *tree); phydbl DATE_Lk_Calib(t_tree *tree); #endif phyml-3.3.20220408/src/draw.c000066400000000000000000000461151422404706600153140ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "draw.h" void DR_Draw_Tree(char *file_name, t_tree *tree) { FILE *ps_tree; ps_tree = (FILE *)fopen(file_name,"w"); DR_Print_Postscript_Header(1,ps_tree); tree->ps_tree = DR_Make_Tdraw_Struct(tree); DR_Init_Tdraw_Struct(tree->ps_tree); DR_Get_Tree_Box_Width(tree->ps_tree,tree); Dist_To_Root(tree); tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); DR_Get_X_Coord(NO,tree->ps_tree,tree); DR_Get_Y_Coord(NO,tree->ps_tree,tree); DR_Print_Tree_Postscript(1,NO,ps_tree,tree); DR_Print_Postscript_EOF(ps_tree); fclose(ps_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Tree_Coord(t_tree *tree) { DR_Init_Tdraw_Struct(tree->ps_tree); DR_Get_Tree_Box_Width(tree->ps_tree,tree); if(!tree->n_root) { PhyML_Printf("\n. Adding root before rendering the tree."); Add_Root(tree->a_edges[0],tree); } Dist_To_Root(tree); tree->ps_tree->max_dist_to_root = DR_Get_Max_Dist_To_Root(tree); DR_Get_X_Coord(NO,tree->ps_tree,tree); DR_Get_Y_Coord(NO,tree->ps_tree,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Postscript_Header(int n_pages, FILE *fp) { if(!fp) { PhyML_Printf("\n== Failed to open the postscript file."); PhyML_Printf("\n== Did you forget the '--ps' option ?."); Exit("\n"); } PhyML_Fprintf(fp,"%%!PS-Adobe-3.0\n"); PhyML_Fprintf(fp,"%%%%BoundingBox: 0 0 595.28 841.89\n"); PhyML_Fprintf(fp,"%%%%DocumentFonts: Times-Roman Times-Roman\n"); PhyML_Fprintf(fp,"%%%%Creator: Stephane Guindon\n"); PhyML_Fprintf(fp,"%%%%Title: tree\n"); PhyML_Fprintf(fp,"%%%%EndComments\n"); PhyML_Fprintf(fp,"%%%%Pages: %d\n",n_pages); PhyML_Fprintf(fp,"/lt {lineto} bind def\n"); PhyML_Fprintf(fp,"/mt {moveto} bind def\n"); PhyML_Fprintf(fp,"/sc {setrgbcolor} bind def\n"); PhyML_Fprintf(fp,"/ct {curveto} bind def\n"); PhyML_Fprintf(fp,"/np {newpath} bind def\n"); PhyML_Fprintf(fp,"/cp {closepath} bind def\n"); PhyML_Fprintf(fp,"/gs {gsave} bind def\n"); PhyML_Fprintf(fp,"/gr {grestore} bind def\n"); PhyML_Fprintf(fp,"/Times-Roman findfont\n"); PhyML_Fprintf(fp,"12 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"/clipbox\n"); PhyML_Fprintf(fp,"{\n"); PhyML_Fprintf(fp,"newpath\n"); PhyML_Fprintf(fp,"20 20 mt\n"); PhyML_Fprintf(fp,"580 20 lt\n"); PhyML_Fprintf(fp,"580 820 lt\n"); PhyML_Fprintf(fp,"20 820 lt\n"); PhyML_Fprintf(fp,"20 20 lt\n"); PhyML_Fprintf(fp,"closepath\n"); PhyML_Fprintf(fp,"clip\n"); PhyML_Fprintf(fp,"} bind def\n"); /* PhyML_Fprintf(fp,"gs\n"); */ /* PhyML_Fprintf(fp,"newpath\n"); */ /* PhyML_Fprintf(fp,"20 20 mt\n"); */ /* PhyML_Fprintf(fp,"580 20 lt\n"); */ /* PhyML_Fprintf(fp,"580 820 lt\n"); */ /* PhyML_Fprintf(fp,"20 820 lt\n"); */ /* PhyML_Fprintf(fp,"20 20 lt\n"); */ /* PhyML_Fprintf(fp,"closepath\n"); */ /* PhyML_Fprintf(fp,"stroke\n"); */ /* PhyML_Fprintf(fp,"gr\n"); */ /* PhyML_Fprintf(fp,"0 0 0 sc\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Postscript_EOF(FILE *fp) { PhyML_Fprintf(fp,"%%%%Trailer\n"); PhyML_Fprintf(fp,"%%%%EOF\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Tree_Postscript(int page_num, int render_name, FILE *fp, t_tree *tree) { tdraw *draw; t_node *n_root; draw = tree->ps_tree; /* DR_Get_Tree_Coord(tree); */ n_root = tree->n_root; /* PhyML_Fprintf(fp,"%%%%Page: %d %d\n",page_num,page_num); */ /* PhyML_Fprintf(fp,"0.001 setlinewidth\n"); */ /* PhyML_Fprintf(fp,"0.5 0.5 0.4 sc\n"); */ /* PhyML_Fprintf(fp,"0 0 0 sc\n"); */ /* PhyML_Fprintf(fp,"clipbox\n"); */ /* PhyML_Fprintf(fp,"stroke\n"); */ PhyML_Fprintf(fp,"20 20 translate\n"); PhyML_Fprintf(fp,"newpath\n"); draw->ycoord[n_root->num] = (draw->ycoord[n_root->v[2]->num] + draw->ycoord[n_root->v[1]->num])/2. + 20; draw->xcoord[n_root->num] = 0.0; DR_Print_Tree_Postscript_Pre(n_root,n_root->v[2],n_root->b[2],render_name,fp,draw,tree); DR_Print_Tree_Postscript_Pre(n_root,n_root->v[1],n_root->b[1],render_name,fp,draw,tree); PhyML_Fprintf(fp,"closepath\n"); PhyML_Fprintf(fp,"0 0 translate\n"); PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"showpage\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Print_Tree_Postscript_Pre(t_node *a, t_node *d, t_edge *b, int render_name, FILE *fp, tdraw *w, t_tree *tree) { int i; phydbl R, G, B; R = G = B = 0.0; PhyML_Fprintf(fp,"gs\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[a->num],w->ycoord[a->num]); /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[a->num],w->ycoord[d->num]); */ /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[d->num],w->ycoord[d->num]); */ phydbl min,max,step,val; min = 0.0; max = 5.; step = (max-min)/13.; /* val = tree->rates->mean_r[d->num] / (phydbl)(tree->mcmc->run/tree->mcmc->sample_interval+1.); */ /* val = tree->rates->mean_r[d->num]; */ /* val = tree->times->has_survived[d->num]; */ /* if(val > 0.5) {R=1.; G=.0; B=0.;} */ /* val = tree->geo->ldscape[tree->geo->idx_loc[d->num]*tree->geo->n_dim+0] + 2.5; */ val = tree->geo->coord_loc[tree->geo->idx_loc[d->num]]->lonlat[0] + 2.5; /* val = 0.; */ if(val <= min+1.*step) {R=.0; G=1.; B=1.;} else if(val > min+1.*step && val <= min+2.*step) {R=.0; G=1.; B=.8;} else if(val > min+2.*step && val <= min+3.*step) {R=.0; G=1.; B=.5;} else if(val > min+3.*step && val <= min+4.*step) {R=.0; G=1.; B=.3;} else if(val > min+4.*step && val <= min+5.*step) {R=.0; G=1.; B=.0;} else if(val > min+5.*step && val <= min+6.*step) {R=.25; G=1.; B=0.;} else if(val > min+6.*step && val <= min+7.*step) {R=.5; G=1.; B=0.;} else if(val > min+7.*step && val <= min+8.*step) {R=.75; G=1.; B=.0;} else if(val > min+8.*step && val <= min+9.*step) {R=1.; G=1.; B=.0;} else if(val > min+9.*step && val <= min+10.*step) {R=1.; G=.75; B=.0;} else if(val > min+10.*step && val <= min+11.*step) {R=1.; G=.5; B=.0;} else if(val > min+11.*step && val <= min+12.*step) {R=1.; G=.25; B=.0;} else if(val > min+12.*step) {R=1.; G=.0; B=0.;} /* R = 0.; G = 0.; B = 0.; */ PhyML_Fprintf(fp,"2 setlinewidth\n"); /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[a->num],w->ycoord[d->num]); */ /* PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[d->num],w->ycoord[d->num]); */ phydbl xa = w->xcoord[a->num]; phydbl xd = MIN(w->xcoord[a->num] + 5,w->xcoord[d->num]); phydbl ya = w->ycoord[a->num]; phydbl yd = w->ycoord[d->num]; PhyML_Fprintf(fp,"%.1f %.1f %.1f %.1f %.1f %.1f ct\n", xa + (xd-xa)/2.,(ya+yd)/2., xd - (xd-xa)/5.,yd, xd,yd); PhyML_Fprintf(fp,"%.1f %.1f lt\n",w->xcoord[d->num],w->ycoord[d->num]); /* PhyML_Fprintf(fp,"%.1f %.1f %.1f %.1f %.1f %.1f ct\n", */ /* w->xcoord[a->num], */ /* w->ycoord[d->num], */ /* w->xcoord[d->num], */ /* w->ycoord[d->num], */ /* w->xcoord[d->num], */ /* w->ycoord[d->num]); */ if(tree->rates && tree->times->has_survived[d->num] == YES) { PhyML_Fprintf(fp," /Helvetica findfont 16 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]-5,w->ycoord[d->num]); PhyML_Fprintf(fp,"0 0 0 sc\n"); PhyML_Fprintf(fp,"(*) show \n"); } PhyML_Fprintf(fp,"%f %f %f sc\n",R,G,B); if(d->tax) { PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"0 setgray\n"); PhyML_Fprintf(fp,"2 setlinewidth\n"); PhyML_Fprintf(fp,"np %.1f %.1f 1 0 360 arc cp\n",w->xcoord[d->num],w->ycoord[d->num]); PhyML_Fprintf(fp,"%.1f %.1f %.1f sc fill\n",R,G,B); /* PhyML_Fprintf(fp,"%f setgray fill\n",greylevel); */ PhyML_Fprintf(fp,"0 0 0 sc\n"); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]+2,w->ycoord[d->num]-6); /* PhyML_Fprintf(fp,"(%d) show \n",d->num); */ /* PhyML_Fprintf(fp,"(%s) show \n",d->name); */ PhyML_Fprintf(fp," /Helvetica findfont 14 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num] - (w->xcoord[d->num] - w->xcoord[a->num])/2.,w->ycoord[d->num]); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); #if (defined GEO) /* PhyML_Fprintf(fp,"([%4.4f,%4.4f]) show \n", */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+0], */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+1]); */ #endif /* PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]+5,w->ycoord[d->num]); */ /* PhyML_Fprintf(fp,"(%.10s) show \n",d->name); */ /* if(render_name) */ /* { */ /* if(tree->io->long_tax_names) */ /* PhyML_Fprintf(fp,"(%s) show \n",tree->io->long_tax_names[d->num]); */ /* else */ /* PhyML_Fprintf(fp,"(%s) show \n",d->name); */ /* } */ PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"gr\n"); PhyML_Fprintf(fp,"0 0 0 sc\n"); return; } else { PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"0 setgray\n"); PhyML_Fprintf(fp,"2 setlinewidth\n"); PhyML_Fprintf(fp,"np %.1f %.1f 1 0 360 arc cp\n",w->xcoord[d->num],w->ycoord[d->num]); PhyML_Fprintf(fp,"%.1f %.1f %.1f sc fill\n",R,G,B); /* PhyML_Fprintf(fp,"%f setgray fill\n",greylevel); */ PhyML_Fprintf(fp,"0 0 0 sc\n"); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num]+2,w->ycoord[d->num]); /* PhyML_Fprintf(fp,"(%d) show \n",b->num); */ PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num],w->ycoord[d->num]); PhyML_Fprintf(fp," /Helvetica findfont 14 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); PhyML_Fprintf(fp,"%.1f %.1f mt\n",w->xcoord[d->num] - (w->xcoord[d->num] - w->xcoord[a->num])/2.,w->ycoord[d->num]); PhyML_Fprintf(fp," /Helvetica findfont 10 scalefont\n"); PhyML_Fprintf(fp,"setfont\n"); #if (defined GEO) /* PhyML_Fprintf(fp,"([%4.4f,%4.4f]) show \n", */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+0], */ /* tree->geo->ldscape[tree->geo->loc[d->num]*tree->geo->n_dim+1]); */ #endif PhyML_Fprintf(fp,"stroke\n"); PhyML_Fprintf(fp,"gr\n"); PhyML_Fprintf(fp,"0 0 0 sc\n"); for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) DR_Print_Tree_Postscript_Pre(d,d->v[i],d->b[i],render_name,fp,w,tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_X_Coord_Pre(t_node *a, t_node *d, t_edge *b, tdraw *w, int fixed_tips, t_tree *tree) { int i; if(!(d->tax && fixed_tips == YES)) w->xcoord[d->num] = d->dist_to_root * (phydbl)w->tree_box_width/w->max_dist_to_root; if(d->tax) return; else { for(i=0;i<3;i++) if((d->v[i] != a) && (d->b[i] != tree->e_root)) DR_Get_X_Coord_Pre(d,d->v[i],d->b[i],w,fixed_tips,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_X_Coord(int fixed_tips, tdraw *w, t_tree *tree) { if(!(tree->n_root->v[2]->tax && fixed_tips == YES)) w->xcoord[tree->n_root->v[2]->num] = tree->n_root->v[2]->dist_to_root * (phydbl)w->tree_box_width/w->max_dist_to_root; if(!(tree->n_root->v[1]->tax && fixed_tips == YES)) w->xcoord[tree->n_root->v[1]->num] = tree->n_root->v[1]->dist_to_root * (phydbl)w->tree_box_width/w->max_dist_to_root; DR_Get_X_Coord_Pre(tree->n_root,tree->n_root->v[2],NULL,w,fixed_tips,tree); DR_Get_X_Coord_Pre(tree->n_root,tree->n_root->v[1],NULL,w,fixed_tips,tree); w->xcoord[tree->n_root->num] = 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Y_Coord(int fixed_tips, tdraw *w, t_tree *tree) { int next_y_slot; next_y_slot = 0; DR_Get_Y_Coord_Post(tree->n_root,tree->n_root->v[2],NULL,&next_y_slot,fixed_tips,w,tree); DR_Get_Y_Coord_Post(tree->n_root,tree->n_root->v[1],NULL,&next_y_slot,fixed_tips,w,tree); w->ycoord[tree->n_root->num] = (int)((w->ycoord[tree->n_root->v[2]->num] + w->ycoord[tree->n_root->v[2]->num]) / 2.) + 20; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Y_Coord_Post(t_node *a, t_node *d, t_edge *b, int *next_y_slot, int fixed_tips, tdraw *w, t_tree *tree) { int i; if(d->tax) { if(!fixed_tips) { /* w->ycoord[d->num] = *next_y_slot + (int)(w->page_height / (2.*tree->n_otu)); */ w->ycoord[d->num] = *next_y_slot + 20; (*next_y_slot) += (int)(w->page_height / (tree->n_otu-1)); printf("\n. %s %f",d->name,w->ycoord[d->num]); } } else { int d1, d2; d1 = d2 = -1; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { DR_Get_Y_Coord_Post(d,d->v[i],d->b[i],next_y_slot,fixed_tips,w,tree); if(d1<0) d1 = i; else d2 = i; } } w->ycoord[d->num] = (w->ycoord[d->v[d1]->num] + w->ycoord[d->v[d2]->num])/2.; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// tdraw *DR_Make_Tdraw_Struct(t_tree *tree) { tdraw *w; w = (tdraw *)mCalloc(1,sizeof(tdraw)); w->xcoord = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->ycoord = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->xcoord_s = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->ycoord_s = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->cdf_mat = (int *)mCalloc((2*tree->n_otu-2)*(2*tree->n_otu-2),sizeof(int)); w->cdf_mat_x = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); w->cdf_mat_y = (phydbl *)mCalloc(2*tree->n_otu-1,sizeof(phydbl)); return w; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Init_Tdraw_Struct(tdraw *w) { w->page_width = 580-20; w->page_height = 820-20; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Tree_Box_Width(tdraw *w, t_tree *tree) { int i; int max_name_len, curr_len; max_name_len = curr_len = 0; for(i=0;in_otu;i++) { curr_len = (int)strlen(tree->a_nodes[i]->name); if(curr_len > max_name_len) max_name_len = curr_len; } w->tree_box_width = w->page_width - max_name_len * 8.66667; /* w->tree_box_width = w->page_width - max_name_len * 10.; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl DR_Get_Max_Dist_To_Root(t_tree *tree) { phydbl mx; int i; mx = .0; for(i=0;in_otu;i++) { if(tree->a_nodes[i]->dist_to_root > mx) { mx = tree->a_nodes[i]->dist_to_root; } } return mx; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Tree_Coord_Scaled(tdraw *w, t_tree *tree) { int i; int max_x,min_x; int max_y,min_y; max_x = -INT_MAX; min_x = INT_MAX; For(i,2*tree->n_otu-1) { if(w->xcoord[i] > max_x) max_x = w->xcoord[i]; if(w->xcoord[i] < min_x) min_x = w->xcoord[i]; } max_y = -INT_MAX; min_y = INT_MAX; For(i,2*tree->n_otu-1) { if(w->ycoord[i] > max_y) max_y = w->ycoord[i]; if(w->ycoord[i] < min_y) min_y = w->ycoord[i]; } For(i,2*tree->n_otu-1) { w->xcoord_s[i] = (phydbl)(w->xcoord[i] - min_x) / (max_x - min_x); w->ycoord_s[i] = (phydbl)(w->ycoord[i] - min_y) / (max_y - min_y); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void DR_Get_Cdf_Mat(t_tree *tree) { int i,j,k; phydbl min_x,max_x,y; phydbl x_mat,y_mat; t_node *d, *a; phydbl eps; eps = 1.E-6; For(i,2*tree->n_otu-1) tree->ps_tree->cdf_mat_x[i] = tree->ps_tree->xcoord_s[i]; For(i,2*tree->n_otu-1) tree->ps_tree->cdf_mat_y[i] = tree->ps_tree->ycoord_s[i]; Qksort(tree->ps_tree->cdf_mat_x,NULL,0,2*tree->n_otu-2); Qksort(tree->ps_tree->cdf_mat_y,NULL,0,2*tree->n_otu-2); For(i,2*tree->n_otu-2) /* x coordinates */ { For(j,2*tree->n_otu-2) /* y coordinates */ { For(k,2*tree->n_otu-2) /* all nodes in the tree */ { d = tree->a_nodes[k]; a = tree->a_nodes[k]->anc; min_x = tree->ps_tree->xcoord_s[a->num]; max_x = tree->ps_tree->xcoord_s[d->num]; y = tree->ps_tree->ycoord_s[d->num]; x_mat = tree->ps_tree->cdf_mat_x[i]; y_mat = tree->ps_tree->cdf_mat_y[j]; /* printf("\n. x_mat=%.1f ymat=%.1f min=%.1f max=%.1f y=%.1f", */ /* x_mat,y_mat,min_x,max_x,y); */ if((min_x < x_mat + eps) && (max_x > x_mat) && (y > y_mat)) { tree->ps_tree->cdf_mat[j*(2*tree->n_otu-2)+i] += 1; /* PhyML_Printf("\n. Add 1 to [%.1f,%.1f]", */ /* tree->ps_tree->cdf_mat_x[i], */ /* tree->ps_tree->cdf_mat_y[j]); */ } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/draw.h000066400000000000000000000022641422404706600153160ustar00rootroot00000000000000#include #ifndef DRAW_H #define DRAW_H #include "utilities.h" void DR_Dist_To_Root_Pre(t_node *a, t_node *d, t_edge *b, t_tree *tree); void DR_Dist_To_Root(t_node *n_root, t_tree *tree); void DR_Get_X_Coord_Pre(t_node *a, t_node *d, t_edge *b, tdraw *w, int fixed_tips, t_tree *tree); void DR_Get_X_Coord(int fixed_tips, tdraw *w, t_tree *tree); tdraw *DR_Make_Tdraw_Struct(t_tree *tree); void DR_Init_Tdraw_Struct(tdraw *d); void DR_Get_Tree_Box_Width(tdraw *w, t_tree *tree); void DR_Get_Y_Coord_Post(t_node *a, t_node *d, t_edge *b, int *next_y_slot, int fixed_tips, tdraw *w, t_tree *tree); void DR_Get_Y_Coord(int fixed_tips, tdraw *w, t_tree *tree); void DR_Get_Tree_Coord(t_tree *tree); phydbl DR_Get_Max_Dist_To_Root(t_tree *tree); void DR_Print_Tree_Postscript(int tree_num, int render_name,FILE *fp, t_tree *tree); void DR_Print_Tree_Postscript_Pre(t_node *a, t_node *d, t_edge *b, int render_name, FILE *fp, tdraw *w, t_tree *tree); void DR_Print_Postscript_EOF(FILE *fp); void DR_Print_Postscript_Header(int n_pages, FILE *fp); void DR_Get_Tree_Coord_Scaled(tdraw *w, t_tree *tree); void DR_Get_Cdf_Mat(t_tree *tree); void DR_Draw_Tree(char *file_name, t_tree *tree); #endif phyml-3.3.20220408/src/eigen.c000066400000000000000000000621301422404706600154410ustar00rootroot00000000000000/*********************************************************** * This eigen() routine works for eigenvalue/vector analysis * for real general square matrix A * A will be destroyed * rr,ri are vectors containing eigenvalues * vr,vi are matrices containing (right) real and imaginary eigenvectors * * A * [vr+vi*i] = [vr+vi*i] * diag{rr+ri*i} * * Algorithm: Handbook for Automatic Computation, vol 2 * by Wilkinson and Reinsch, 1971 * most of source codes were taken from a public domain * solftware called MATCALC. * Credits: to the authors of MATCALC * * return -1 not converged * 0 no complex eigenvalues/vectors * 1 complex eigenvalues/vectors * Tianlin Wang at University of Illinois * Thu May 6 15:22:31 CDT 1993 ***************************************************************/ #include "eigen.h" #define BASE 2 /* base of floating point arithmetic */ /* no. of digits to the base BASE in the fraction */ #define DIGITS 40 /* #define DIGITS 53 */ #define MAXITER 10000 /* max2. no. of iterations to converge */ #define pos(i,j,n) ((i)*(n)+(j)) /* rr/vr : real parts of eigen values/vectors */ /* ri/vi : imaginary part s of eigen values/vectors */ int Eigen(int job, phydbl *A, int n, phydbl *rr, phydbl *ri, phydbl *vr, phydbl *vi, phydbl *work) { /* job=0: eigen values only 1: both eigen values and eigen vectors phydbl w[n*2]: work space */ int low,hi,i,j,k, it, istate=0; phydbl tiny, t; for(i=0;itiny) istate=1; } return (istate) ; } /* complex functions */ complex compl (phydbl re,phydbl im) { complex r; r.re = re; r.im = im; return(r); } complex _conj (complex a) { a.im = -a.im; return(a); } complex cplus (complex a, complex b) { complex c; c.re = a.re+b.re; c.im = a.im+b.im; return (c); } complex cminus (complex a, complex b) { complex c; c.re = a.re-b.re; c.im = a.im-b.im; return (c); } complex cby (complex a, complex b) { complex c; c.re = a.re*b.re-a.im*b.im ; c.im = a.re*b.im+a.im*b.re ; return (c); } complex cdiv (complex a,complex b) { phydbl ratio, den; complex c; if (fabs(b.re) <= fabs(b.im)) { ratio = b.re / b.im; den = b.im * (1 + ratio * ratio); c.re = (a.re * ratio + a.im) / den; c.im = (a.im * ratio - a.re) / den; } else { ratio = b.im / b.re; den = b.re * (1 + ratio * ratio); c.re = (a.re + a.im * ratio) / den; c.im = (a.im - a.re * ratio) / den; } return(c); } /* complex local_cexp (complex a) */ /* { */ /* complex c; */ /* c.re = exp(a.re); */ /* if (fabs(a.im)==0) c.im = 0; */ /* else { c.im = c.re*sin(a.im); c.re*=cos(a.im); } */ /* return (c); */ /* } */ complex cfactor (complex x, phydbl a) { complex c; c.re = a*x.re; c.im = a*x.im; return (c); } int cxtoy (complex *x, complex *y, int n) { int i; For (i,n) y[i]=x[i]; return (0); } int cmatby (complex *a, complex *b, complex *c, int n,int m,int k) /* a[n*m], b[m*k], c[n*k] ...... c = a*b */ { int i,j,i1; complex t; For (i,n) for(j=0;j=n */ int i,j,k, *irow=(int*) space; phydbl xmaxsize, ee=1e-20; complex t,t1; for(i=0;i=0; i--) { if (irow[i] == i) continue; for(j=0;j= 0; k--) { for (j = k; j >= 0; j--) { for (i = 0; i <= k; i++) { if (i != j && fabs(mat[pos(j,i,n)]) > SMALL) break; } if (i > k) { scale[k] = j; if (j != k) { for (i = 0; i <= k; i++) { c = mat[pos(i,j,n)]; mat[pos(i,j,n)] = mat[pos(i,k,n)]; mat[pos(i,k,n)] = c; } for (i = 0; i < n; i++) { c = mat[pos(j,i,n)]; mat[pos(j,i,n)] = mat[pos(k,i,n)]; mat[pos(k,i,n)] = c; } } break; } } if (j < 0) break; } /* search for columns isolating an eigenvalue and push them left */ for (l = 0; l <= k; l++) { for (j = l; j <= k; j++) { for (i = l; i <= k; i++) { if (i != j && fabs(mat[pos(i,j,n)]) > SMALL) break; } if (i > k) { scale[l] = j; if (j != l) { for (i = 0; i <= k; i++) { c = mat[pos(i,j,n)]; mat[pos(i,j,n)] = mat[pos(i,l,n)]; mat[pos(i,l,n)] = c; } for (i = l; i < n; i++) { c = mat[pos(j,i,n)]; mat[pos(j,i,n)] = mat[pos(l,i,n)]; mat[pos(l,i,n)] = c; } } break; } } if (j > k) break; } *hi = k; *low = l; /* balance the submatrix in rows l through k */ for (i = l; i <= k; i++) { scale[i] = 1; } do { for (done = 1,i = l; i <= k; i++) { for (c = 0,r = 0,j = l; j <= k; j++) { if (j != i) { c += fabs(mat[pos(j,i,n)]); r += fabs(mat[pos(i,j,n)]); } } /* if (c != 0 && r != 0) { */ if ((fabs(c) > SMALL || fabs(c) < -SMALL) && (fabs(r) > SMALL || fabs(r) < -SMALL)) { g = r / BASE; f = 1; s = c + r; while (c < g) { f *= BASE; c *= BASE * BASE; } g = r * BASE; while (c >= g) { f /= BASE; c /= BASE * BASE; } if ((c + r) / f < 0.95 * s) { done = 0; g = 1 / f; scale[i] *= f; for (j = l; j < n; j++) { mat[pos(i,j,n)] *= g; } for (j = 0; j <= k; j++) { mat[pos(j,i,n)] *= f; } } } } } while (!done); } /* * Transform back eigenvectors of a balanced matrix * into the eigenvectors of the original matrix */ void unbalance(int n,phydbl *vr,phydbl *vi, int low, int hi, phydbl *scale) { int i,j,k; phydbl tmp; for (i = low; i <= hi; i++) { for (j = 0; j < n; j++) { vr[pos(i,j,n)] *= scale[i]; vi[pos(i,j,n)] *= scale[i]; } } for (i = low - 1; i >= 0; i--) { if ((k = (int)scale[i]) != i) { for (j = 0; j < n; j++) { tmp = vr[pos(i,j,n)]; vr[pos(i,j,n)] = vr[pos(k,j,n)]; vr[pos(k,j,n)] = tmp; tmp = vi[pos(i,j,n)]; vi[pos(i,j,n)] = vi[pos(k,j,n)]; vi[pos(k,j,n)] = tmp; } } } for (i = hi + 1; i < n; i++) { if ((k = (int)scale[i]) != i) { for (j = 0; j < n; j++) { tmp = vr[pos(i,j,n)]; vr[pos(i,j,n)] = vr[pos(k,j,n)]; vr[pos(k,j,n)] = tmp; tmp = vi[pos(i,j,n)]; vi[pos(i,j,n)] = vi[pos(k,j,n)]; vi[pos(k,j,n)] = tmp; } } } } /* * Reduce the submatrix in rows and columns low through hi of real matrix mat to * Hessenberg form by elementary similarity transformations */ void elemhess(int job,phydbl *mat,int n,int low,int hi, phydbl *vr, phydbl *vi, int *work) { /* work[n] */ unsigned int i,j,m; phydbl x,y; for (m = low + 1; m < hi; m++) { for (x = 0,i = m,j = m; j <= hi; j++) { if(fabs(mat[pos(j,m-1,n)]) > fabs(x)) { x = mat[pos(j,m-1,n)]; i = j; } } if ((work[m] = i) != m) { for (j = m - 1; j < n; j++) { y = mat[pos(i,j,n)]; mat[pos(i,j,n)] = mat[pos(m,j,n)]; mat[pos(m,j,n)] = y; } for (j = 0; j <= hi; j++) { y = mat[pos(j,i,n)]; mat[pos(j,i,n)] = mat[pos(j,m,n)]; mat[pos(j,m,n)] = y; } } if (fabs(x) > SMALL) { for (i = m + 1; i <= hi; i++) { if (fabs(y = mat[pos(i,m-1,n)]) > SMALL) { y = mat[pos(i,m-1,n)] = y / x; for (j = m; j < n; j++) { mat[pos(i,j,n)] -= y * mat[pos(m,j,n)]; } for (j = 0; j <= hi; j++) { mat[pos(j,m,n)] += y * mat[pos(j,i,n)]; } } } } } if (job) { for (i=0; i low; m--) { for (i = m + 1; i <= hi; i++) { vr[pos(i,m,n)] = mat[pos(i,m-1,n)]; } if ((i = work[m]) != m) { for (j = m; j <= hi; j++) { vr[pos(m,j,n)] = vr[pos(i,j,n)]; vr[pos(i,j,n)] = 0.0; } vr[pos(i,m,n)] = 1.0; } } } } /* * Calculate eigenvalues and eigenvectors of a real upper Hessenberg matrix * Return 1 if converges successfully and 0 otherwise */ int realeig(int job,phydbl *mat,int n,int low, int hi, phydbl *valr, phydbl *vali, phydbl *vr,phydbl *vi) { complex v; phydbl p=.0,q=.0,r=.0,s=.0,t,w,x,y,z=0,ra,sa,norm,eps; int niter,en,i,j,k,l,m; phydbl precision = POW((phydbl)BASE,(phydbl)(1-(int)DIGITS)); // Won't pass testiphy... /* phydbl precision = SMALL; */ eps = precision; for (i=0; i hi) valr[i] = mat[pos(i,i,n)]; } t = 0; en = hi; while (en >= low) { niter = 0; for (;;) { /* look for single small subdiagonal element */ for (l = en; l > low; l--) { s = fabs(mat[pos(l-1,l-1,n)]) + fabs(mat[pos(l,l,n)]); if (fabs(s) < SMALL) s = norm; if (fabs(mat[pos(l,l-1,n)]) <= eps * s) break; } /* form shift */ x = mat[pos(en,en,n)]; if (l == en) { /* one root found */ valr[en] = x + t; if (job) mat[pos(en,en,n)] = x + t; en--; break; } y = mat[pos(en-1,en-1,n)]; w = mat[pos(en,en-1,n)] * mat[pos(en-1,en,n)]; if (l == en - 1) { /* two roots found */ p = (y - x) / 2; q = p * p + w; z = SQRT(fabs(q)); x += t; if (job) { mat[pos(en,en,n)] = x; mat[pos(en-1,en-1,n)] = y + t; } if (q < 0) { /* complex pair */ valr[en-1] = x+p; vali[en-1] = z; valr[en] = x+p; vali[en] = -z; } else { /* real pair */ z = (p < 0) ? p - z : p + z; valr[en-1] = x + z; valr[en] = (fabs(z) < SMALL) ? x + z : x - w / z; if (job) { x = mat[pos(en,en-1,n)]; s = fabs(x) + fabs(z); p = x / s; q = z / s; r = SQRT(p*p+q*q); p /= r; q /= r; for (j = en - 1; j < n; j++) { z = mat[pos(en-1,j,n)]; mat[pos(en-1,j,n)] = q * z + p * mat[pos(en,j,n)]; mat[pos(en,j,n)] = q * mat[pos(en,j,n)] - p*z; } for (i = 0; i <= en; i++) { z = mat[pos(i,en-1,n)]; mat[pos(i,en-1,n)] = q * z + p * mat[pos(i,en,n)]; mat[pos(i,en,n)] = q * mat[pos(i,en,n)] - p*z; } for (i = low; i <= hi; i++) { z = vr[pos(i,en-1,n)]; vr[pos(i,en-1,n)] = q*z + p*vr[pos(i,en,n)]; vr[pos(i,en,n)] = q*vr[pos(i,en,n)] - p*z; } } } en -= 2; break; } if (niter == MAXITER) return(-1); if (niter != 0 && niter % 10 == 0) { t += x; for (i = low; i <= en; i++) mat[pos(i,i,n)] -= x; s = fabs(mat[pos(en,en-1,n)]) + fabs(mat[pos(en-1,en-2,n)]); x = y = 0.75 * s; w = -0.4375 * s * s; } niter++; /* look for two consecutive small subdiagonal elements */ for (m = en - 2; m >= l; m--) { z = mat[pos(m,m,n)]; r = x - z; s = y - z; p = (r * s - w) / mat[pos(m+1,m,n)] + mat[pos(m,m+1,n)]; q = mat[pos(m+1,m+1,n)] - z - r - s; r = mat[pos(m+2,m+1,n)]; s = fabs(p) + fabs(q) + fabs(r); p /= s; q /= s; r /= s; if (m == l || fabs(mat[pos(m,m-1,n)]) * (fabs(q)+fabs(r)) <= eps * (fabs(mat[pos(m-1,m-1,n)]) + fabs(z) + fabs(mat[pos(m+1,m+1,n)])) * fabs(p)) break; } for (i = m + 2; i <= en; i++) mat[pos(i,i-2,n)] = 0; for (i = m + 3; i <= en; i++) mat[pos(i,i-3,n)] = 0; /* phydbl QR step involving rows l to en and columns m to en */ for (k = m; k < en; k++) { if (k != m) { p = mat[pos(k,k-1,n)]; q = mat[pos(k+1,k-1,n)]; r = (k == en - 1) ? 0 : mat[pos(k+2,k-1,n)]; if (fabs(x = fabs(p) + fabs(q) + fabs(r)) < SMALL) continue; p /= x; q /= x; r /= x; } s = SQRT(p*p+q*q+r*r); if (p < 0) s = -s; if (k != m) { mat[pos(k,k-1,n)] = -s * x; } else if (l != m) { mat[pos(k,k-1,n)] = -mat[pos(k,k-1,n)]; } p += s; x = p / s; y = q / s; z = r / s; q /= p; r /= p; /* row modification */ for (j = k; j <= (!job ? en : n-1); j++){ p = mat[pos(k,j,n)] + q * mat[pos(k+1,j,n)]; if (k != en - 1) { p += r * mat[pos(k+2,j,n)]; mat[pos(k+2,j,n)] -= p * z; } mat[pos(k+1,j,n)] -= p * y; mat[pos(k,j,n)] -= p * x; } j = MIN(en,k+3); /* column modification */ for (i = (!job ? l : 0); i <= j; i++) { p = x * mat[pos(i,k,n)] + y * mat[pos(i,k+1,n)]; if (k != en - 1) { p += z * mat[pos(i,k+2,n)]; mat[pos(i,k+2,n)] -= p*r; } mat[pos(i,k+1,n)] -= p*q; mat[pos(i,k,n)] -= p; } if (job) { /* accumulate transformations */ for (i = low; i <= hi; i++) { p = x * vr[pos(i,k,n)] + y * vr[pos(i,k+1,n)]; if (k != en - 1) { p += z * vr[pos(i,k+2,n)]; vr[pos(i,k+2,n)] -= p*r; } vr[pos(i,k+1,n)] -= p*q; vr[pos(i,k,n)] -= p; } } } } } if (!job) return(0); if (fabs(norm) > SMALL) { /* back substitute to find vectors of upper triangular form */ for (en = n-1; en >= 0; en--) { p = valr[en]; if ((q = vali[en]) < 0) { /* complex vector */ m = en - 1; if (fabs(mat[pos(en,en-1,n)]) > fabs(mat[pos(en-1,en,n)])) { mat[pos(en-1,en-1,n)] = q / mat[pos(en,en-1,n)]; mat[pos(en-1,en,n)] = (p - mat[pos(en,en,n)]) / mat[pos(en,en-1,n)]; } else { v = cdiv(compl(0.0,-mat[pos(en-1,en,n)]), compl(mat[pos(en-1,en-1,n)]-p,q)); mat[pos(en-1,en-1,n)] = v.re; mat[pos(en-1,en,n)] = v.im; } mat[pos(en,en-1,n)] = 0; mat[pos(en,en,n)] = 1; for (i = en - 2; i >= 0; i--) { w = mat[pos(i,i,n)] - p; ra = 0; sa = mat[pos(i,en,n)]; for (j = m; j < en; j++) { ra += mat[pos(i,j,n)] * mat[pos(j,en-1,n)]; sa += mat[pos(i,j,n)] * mat[pos(j,en,n)]; } if (vali[i] < 0) { z = w; r = ra; s = sa; } else { m = i; if (fabs(vali[i]) < SMALL) { v = cdiv(compl(-ra,-sa),compl(w,q)); mat[pos(i,en-1,n)] = v.re; mat[pos(i,en,n)] = v.im; } else { /* solve complex equations */ x = mat[pos(i,i+1,n)]; y = mat[pos(i+1,i,n)]; v.re = (valr[i]- p)*(valr[i]-p) + vali[i]*vali[i] - q*q; v.im = (valr[i] - p)*2*q; if (fabs(v.re) + fabs(v.im) < SMALL) { v.re = eps * norm * (fabs(w) + fabs(q) + fabs(x) + fabs(y) + fabs(z)); } v = cdiv(compl(x*r-z*ra+q*sa,x*s-z*sa-q*ra),v); mat[pos(i,en-1,n)] = v.re; mat[pos(i,en,n)] = v.im; if (fabs(x) > fabs(z) + fabs(q)) { mat[pos(i+1,en-1,n)] = (-ra - w * mat[pos(i,en-1,n)] + q * mat[pos(i,en,n)]) / x; mat[pos(i+1,en,n)] = (-sa - w * mat[pos(i,en,n)] - q * mat[pos(i,en-1,n)]) / x; } else { v = cdiv(compl(-r-y*mat[pos(i,en-1,n)], -s-y*mat[pos(i,en,n)]),compl(z,q)); mat[pos(i+1,en-1,n)] = v.re; mat[pos(i+1,en,n)] = v.im; } } } } } else if (fabs(q) < SMALL) { /* real vector */ m = en; mat[pos(en,en,n)] = 1; for (i = en - 1; i >= 0; i--) { w = mat[pos(i,i,n)] - p; r = mat[pos(i,en,n)]; for (j = m; j < en; j++) { r += mat[pos(i,j,n)] * mat[pos(j,en,n)]; } if (vali[i] < 0) { z = w; s = r; } else { m = i; if (fabs(vali[i]) < SMALL) { if (fabs(t = w) < SMALL) t = eps * norm; mat[pos(i,en,n)] = -r / t; } else { /* solve real equations */ x = mat[pos(i,i+1,n)]; y = mat[pos(i+1,i,n)]; q = (valr[i] - p) * (valr[i] - p) + vali[i]*vali[i]; t = (x * s - z * r) / q; mat[pos(i,en,n)] = t; if (fabs(x) <= fabs(z)) { mat[pos(i+1,en,n)] = (-s - y * t) / z; } else { mat[pos(i+1,en,n)] = (-r - w * t) / x; } } } } } } /* vectors of isolated roots */ for (i = 0; i < n; i++) { if (i < low || i > hi) { for (j = i; j < n; j++) { vr[pos(i,j,n)] = mat[pos(i,j,n)]; } } } /* multiply by transformation matrix */ for (j = n-1; j >= low; j--) { m = MIN(j,hi); for (i = low; i <= hi; i++) { for (z = 0,k = low; k <= m; k++) { z += vr[pos(i,k,n)] * mat[pos(k,j,n)]; } vr[pos(i,j,n)] = z; } } } /* rearrange complex eigenvectors */ for (j = 0; j < n; j++) { if (fabs(vali[j]) > SMALL) { for (i = 0; i < n; i++) { vi[pos(i,j,n)] = vr[pos(i,j+1,n)]; vr[pos(i,j+1,n)] = vr[pos(i,j,n)]; vi[pos(i,j+1,n)] = -vi[pos(i,j,n)]; } j++; } } return(0); } #define LUDCMP_TINY 1.0e-20; int ludcmp(phydbl **a, int n, phydbl *d) { int i,imax,j,k; phydbl big,dum,sum,temp; phydbl *vv; imax = 0; vv = (phydbl *)mCalloc(n,sizeof(phydbl)); *d=1.0; for (i=0;i big) big=temp; if (fabs(big) < SMALL) Exit("\n. Singular matrix in routine LUDCMP"); vv[i]=1.0/big; } for (j=0;j= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k big) big=temp; if (fabs(big) < SMALL) Exit("\n. Singular matrix in routine LUDCMP"); vv[i]=1.0/big; } for (j=0;j= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k #ifndef EIGEN_H #define EIGEN_H #include "utilities.h" #include "free.h" #ifdef RWRAPPER #include #endif int ludcmp_1D(phydbl *a, int n, phydbl *d); void det_1D(phydbl *a, int n, phydbl *d); int Eigen(int job, phydbl *A, int n, phydbl *rr, phydbl *ri, phydbl *vr, phydbl *vi, phydbl *w); void balance(phydbl *mat, int n, int *low, int *hi, phydbl *scale); void unbalance(int n, phydbl *vr, phydbl *vi, int low, int hi, phydbl *scale); int realeig(int job, phydbl *mat, int n,int low, int hi, phydbl *valr, phydbl *vali, phydbl *vr, phydbl *vi); void elemhess(int job, phydbl *mat, int n, int low, int hi, phydbl *vr, phydbl *vi, int *work); int ludcmp(phydbl **a, int n, phydbl *d); void det(phydbl **a, int n, phydbl *d); /* complex functions */ typedef struct { phydbl re, im; } complex; #define csize(a) (FABS(a.re)+FABS(a.im)) complex compl (phydbl re,phydbl im); complex _conj (complex a); complex cplus (complex a, complex b); complex cminus (complex a, complex b); complex cby (complex a, complex b); complex cdiv (complex a,complex b); /* complex local_cexp (complex a); */ complex cfactor (complex x, phydbl a); int cxtoy (complex *x, complex *y, int n); int cmatby (complex *a, complex *b, complex *c, int n,int m,int k); int cmatout (FILE * fout, complex *x, int n, int m); int cmatinv( complex *x, int n, int m, phydbl *space); phydbl *Cholesky_Decomp(phydbl *A, int dim); #endif phyml-3.3.20220408/src/free.c000066400000000000000000001064211422404706600152750ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "free.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Clade(t_clad *this) { Free(this); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All_Nodes_Light(t_tree *tree) { if(tree->a_nodes != NULL) { for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_nodes[i] != NULL) Free_Node(tree->a_nodes[i]); Free(tree->a_nodes); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All_Edges_Light(t_tree *tree) { if(tree->a_edges != NULL) { for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_edges[i] != NULL) Free_Edge(tree->a_edges[i]); Free(tree->a_edges); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All_Edges_Lens(t_tree *tree) { if(tree->a_edges != NULL) { for(int i=0;i<2*tree->n_otu-1;++i) if(tree->a_edges[i] != NULL) Free_Edge_Length(tree->a_edges[i]); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Length(t_edge *b) { if(b->l != NULL) Free_Scalar_Dbl(b->l); if(b->l_old != NULL) Free_Scalar_Dbl(b->l_old); if(b->l_var != NULL) Free_Scalar_Dbl(b->l_var); if(b->l_var_old != NULL) Free_Scalar_Dbl(b->l_var_old); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge(t_edge *b) { Free_Label(b->label); Free_Edge_Core(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Core(t_edge *b) { Free(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Node(t_node *n) { Free(n->b); Free(n->v); Free(n->score); Free(n->s_ingrp); Free(n->s_outgrp); Free(n->cal); Free_Label(n->label); if(n->c_seq_anc != NULL) { Free(n->c_seq_anc->state); Free(n->c_seq_anc); } if(n->ori_name) { Free(n->ori_name); n->ori_name = NULL; } Free(n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Mat(matrix *mat) { int i; for(i=0;in_otu;i++) { Free(mat->P[i]); Free(mat->Q[i]); Free(mat->dist[i]); Free(mat->name[i]); } Free(mat->P); Free(mat->Q); Free(mat->dist); Free(mat->name); Free(mat->tip_node); Free(mat->on_off); Free(mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Partial_Lk(phydbl *p_lk, int len, int n_catg) { Free(p_lk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree(t_tree *tree) { if(tree->is_mixt_tree == YES) { MIXT_Free_Tree(tree); } else { if(tree->mat) Free_Mat(tree->mat); if(tree->t_dir) Free(tree->t_dir); if(tree->short_l) Free(tree->short_l); if(tree->mutmap) Free(tree->mutmap); Free_Bip(tree); Free(tree->curr_path); Free_All_Edges_Lens(tree); Free_All_Edges_Light(tree); Free_All_Nodes_Light(tree); Free(tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Bip(t_tree *tree) { int i,j; if(tree->has_bip) { For(i,2*tree->n_otu-2) { Free(tree->a_nodes[i]->bip_size); for(j=0;j<3;j++) Free(tree->a_nodes[i]->bip_node[j]); Free(tree->a_nodes[i]->bip_node); } } tree->has_bip = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Calign(calign *data) { int i; if(data->io_wght) Free_Scalar_Dbl(data->io_wght); Free(data->invar); Free(data->wght); Free(data->ambigu); Free(data->obs_state_frq); Free(data->sitepatt); for(i=0;in_otu;i++) { Free(data->c_seq[i]->name); if(data->c_seq[i]->state) { Free(data->c_seq[i]->state); Free(data->c_seq[i]->d_state); if(data->c_seq[i]->is_ambigu) Free(data->c_seq[i]->is_ambigu); } Free(data->c_seq[i]); } for(i=0;in_rm;i++) { Free(data->c_seq_rm[i]->name); if(data->c_seq_rm[i]->state) { Free(data->c_seq_rm[i]->state); Free(data->c_seq_rm[i]->d_state); if(data->c_seq_rm[i]->is_ambigu) Free(data->c_seq_rm[i]->is_ambigu); } Free(data->c_seq_rm[i]); } if(data->c_seq_rm != NULL) Free(data->c_seq_rm); if(data->c_seq != NULL) Free(data->c_seq); Free(data); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Seq(align **d, int n_otu) { int i; for(i=0;iname); Free(d[i]->state); Free(d[i]->d_state); if(d[i]->is_ambigu) Free(d[i]->is_ambigu); Free(d[i]); } Free(d); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_All(align **d, calign *cdata, t_tree *tree) { Free_Calign(cdata); Free_Seq(d,tree->n_otu); Free_Tree(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_SubTree(t_edge *b_fcus, t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax) return; else { for(i=0;i<3;i++) { if(d->v[i] != a) { Free_SubTree(d->b[i],d,d->v[i],tree); Free_Edge(d->b[i]); Free_Node(d->v[i]); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_Ins_Tar(t_tree *tree) { return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_Pars(t_tree *tree) { int i; Free(tree->step_mat); Free(tree->site_pars); for(i=0;i<2*tree->n_otu-3;++i) Free_Edge_Pars(tree->a_edges[i]); if(tree->n_root) { Free_Edge_Pars_Left(tree->n_root->b[1]); Free_Edge_Pars_Left(tree->n_root->b[2]); } else { Free_Edge_Pars(tree->a_edges[2*tree->n_otu-3]); Free_Edge_Pars(tree->a_edges[2*tree->n_otu-2]); } if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Tree_Pars,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Pars_Left(t_edge *b) { if(b->pars_l) Free(b->pars_l); if(b->ui_l) Free(b->ui_l); if(b->p_pars_l) Free(b->p_pars_l); if(b->n_diff_states_l) Free(b->n_diff_states_l); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Pars_Rght(t_edge *b) { if(b->pars_r) Free(b->pars_r); if(b->ui_r) Free(b->ui_r); if(b->p_pars_r) Free(b->p_pars_r); if(b->n_diff_states_r) Free(b->n_diff_states_r); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Pars(t_edge *b) { Free_Edge_Pars_Left(b); Free_Edge_Pars_Rght(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_Lk(t_tree *tree) { int i; Free(tree->big_lk_array); Free(tree->c_lnL_sorted); Free(tree->cur_site_lk); Free(tree->old_site_lk); Free(tree->site_lk_cat); Free(tree->fact_sum_scale); Free(tree->unscaled_site_lk_cat); Free(tree->expl); for(i=0;i<3;i++) Free(tree->log_lks_aLRT[i]); Free(tree->log_lks_aLRT); for(i=0;i<2*tree->n_otu-1;++i) Free_NNI(tree->a_edges[i]->nni); for(i=0;i<2*tree->n_otu-3;++i) Free_Edge_Lk(tree->a_edges[i]); for(i=0;i<2*tree->n_otu-3;++i) Free_Edge_Loc(tree->a_edges[i]); if(tree->is_mixt_tree == NO) { Free(tree->dot_prod); Free(tree->p_lk_left_pi); Free(tree->l_ev); #if (defined(__AVX__) || defined(__AVX2__) || defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) Free(tree->_tPij1); Free(tree->_tPij2); Free(tree->_pmat1plk1); Free(tree->_pmat2plk2); Free(tree->_plk0); Free(tree->_l_ev); Free(tree->_r_ev); Free(tree->_prod_left); Free(tree->_prod_rght); #endif Free(tree->div_post_pred_extra_0); Free(tree->sum_scale_cat_extra_0); Free(tree->sum_scale_extra_0); Free(tree->patt_id_extra_0); Free(tree->p_lk_extra_0); Free(tree->p_lk_tip_extra_0); Free(tree->div_post_pred_extra_1); Free(tree->sum_scale_cat_extra_1); Free(tree->sum_scale_extra_1); Free(tree->patt_id_extra_1); Free(tree->p_lk_extra_1); Free(tree->p_lk_tip_extra_1); if(tree->n_root != NULL) { Free_Edge_Lk_Left(tree->n_root->b[1]); Free_Edge_Lk_Left(tree->n_root->b[2]); Free_Edge_Loc_Left(tree->n_root->b[1]); Free_Edge_Loc_Left(tree->n_root->b[2]); } else { Free_Edge_Lk(tree->a_edges[2*tree->n_otu-3]); Free_Edge_Lk(tree->a_edges[2*tree->n_otu-2]); Free_Edge_Loc(tree->a_edges[2*tree->n_otu-3]); Free_Edge_Loc(tree->a_edges[2*tree->n_otu-2]); } } if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Tree_Lk,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Node_Lk(t_node *n) { /* Free(n->n_ex_nodes); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Extra_Edge_Lk(t_tree *tree) { if(tree->div_post_pred_extra_0) Free(tree->div_post_pred_extra_0); if(tree->sum_scale_cat_extra_0) Free(tree->sum_scale_cat_extra_0); if(tree->sum_scale_extra_0) Free(tree->sum_scale_extra_0); if(tree->p_lk_extra_0) Free(tree->p_lk_extra_0); if(tree->p_lk_tip_extra_0) Free(tree->p_lk_tip_extra_0); if(tree->patt_id_extra_0) Free(tree->patt_id_extra_0); if(tree->div_post_pred_extra_1) Free(tree->div_post_pred_extra_1); if(tree->sum_scale_cat_extra_1) Free(tree->sum_scale_cat_extra_1); if(tree->sum_scale_extra_1) Free(tree->sum_scale_extra_1); if(tree->p_lk_extra_1) Free(tree->p_lk_extra_1); if(tree->p_lk_tip_extra_1) Free(tree->p_lk_tip_extra_1); if(tree->patt_id_extra_1) Free(tree->patt_id_extra_1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Lk_Rght(t_edge *b) { assert(b); Free(b->div_post_pred_rght); if(b->p_lk_rght) { if(b->sum_scale_rght) Free(b->sum_scale_rght); } if(b->p_lk_tip_r) Free(b->p_lk_tip_r); if(b->sum_scale_rght_cat) Free(b->sum_scale_rght_cat); if(b->patt_id_rght) Free(b->patt_id_rght); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Lk_Left(t_edge *b) { Free(b->div_post_pred_left); if(b->p_lk_left) { if(b->sum_scale_left) Free(b->sum_scale_left); } if(b->p_lk_tip_l) Free(b->p_lk_tip_l); if(b->sum_scale_left_cat) Free(b->sum_scale_left_cat); if(b->patt_id_left) Free(b->patt_id_left); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Lk(t_edge *b) { Free_Edge_Lk_Left(b); Free_Edge_Lk_Rght(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Loc_Rght(t_edge *b) { if(b->p_lk_loc_rght) Free(b->p_lk_loc_rght); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Loc_Left(t_edge *b) { if(b->p_lk_loc_left) Free(b->p_lk_loc_left); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Edge_Loc(t_edge *b) { Free_Edge_Loc_Left(b); Free_Edge_Loc_Rght(b); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Model_Complete(t_mod *mixt_mod) { Free_Eigen(mixt_mod->eigen); Free_Rmat(mixt_mod->r_mat); Free_Efrq(mixt_mod->e_frq); Free_Vect_Dbl(mixt_mod->Pij_rr); mixt_mod->r_mat = NULL; mixt_mod->e_frq = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Rmat_Weights(t_mod *mixt_mod) { t_mod *mod; mod = mixt_mod; do { Free(mod->r_mat_weight); mod = mod->next_mixt; } while(mod); if(mixt_mod->next) Free_Scalar_Dbl(mixt_mod->next->r_mat_weight); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Efrq_Weights(t_mod *mixt_mod) { t_mod *mod; mod = mixt_mod; do { Free(mod->e_frq_weight); mod = mod->next_mixt; } while(mod); if(mixt_mod->next) Free_Scalar_Dbl(mixt_mod->next->e_frq_weight); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Model_Basic(t_mod *mixt_mod) { t_mod *mod; Free_RAS(mixt_mod->ras); Free_Scalar_Dbl(mixt_mod->mr); Free_Scalar_Dbl(mixt_mod->kappa); Free_Scalar_Dbl(mixt_mod->lambda); Free_Scalar_Dbl(mixt_mod->br_len_mult); Free_Scalar_Dbl(mixt_mod->br_len_mult_unscaled); Free_Rmat_Weights(mixt_mod); Free_Efrq_Weights(mixt_mod); Free_String(mixt_mod->modelname); Free_String(mixt_mod->custom_mod_string); Free_String(mixt_mod->aa_rate_mat_file); mod = mixt_mod; do { if(mod->next) { mod = mod->next; Free(mod->prev); } else { Free(mod); break; } } while(mod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Vect_Dbl(vect_dbl *v) { vect_dbl *next; assert(v); next = v->next; do { Free(v->v); Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Vect_Int(vect_int *v) { vect_int *next; assert(v); next = v->next; do { Free(v->v); Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Scalar_Dbl(scalar_dbl *v) { scalar_dbl *next; assert(v); next = v->next; do { Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Scalar_Int(scalar_int *v) { scalar_int *next; assert(v); next = v->next; do { Free(v); v = next; if(v) next = v->next; } while(v); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Linked_List(t_ll *t) { t_ll *next,*ll; if(t == NULL) return; ll = t->head; next = ll->next; do { /* t_node *n = ll->v; */ /* printf("\n. free node %d",n?n->num:-1); */ /* printf(" ll: %p",ll); */ /* printf(" hd: %p",ll?ll->head:NULL); fflush(NULL); */ Free(ll); ll = next; if(ll) next = ll->next; } while(ll); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_String(t_string *ts) { t_string *next; next = ts->next; do { Free(ts->s); Free(ts); ts = next; if(ts) next = ts->next; } while(ts); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Custom_Model(t_mod *mod) { } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Efrq(t_efrq *e_frq) { Free(e_frq->pi->v); Free(e_frq->pi); Free(e_frq->pi_unscaled->v); Free(e_frq->pi_unscaled); Free(e_frq->user_b_freq->v); Free(e_frq->user_b_freq); if(e_frq->next) Free_Efrq(e_frq->next); Free(e_frq); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Rmat(t_rmat *r_mat) { Free(r_mat->rr->v); Free(r_mat->rr); Free(r_mat->rr_num->v); Free(r_mat->rr_val->v); Free(r_mat->rr_val); Free(r_mat->n_rr_per_cat->v); Free(r_mat->n_rr_per_cat); Free(r_mat->rr_num); Free(r_mat->qmat->v); Free(r_mat->qmat); Free(r_mat->qmat_buff->v); Free(r_mat->qmat_buff); if(r_mat->next) Free_Rmat(r_mat->next); Free(r_mat); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_RAS(t_ras *ras) { if(ras->gamma_r_proba->v) { Free(ras->gamma_r_proba->v); Free(ras->gamma_r_proba_unscaled->v); Free(ras->gamma_rr->v); Free(ras->gamma_rr_unscaled->v); } Free(ras->gamma_r_proba); Free(ras->skip_rate_cat); Free(ras->gamma_r_proba_unscaled); Free(ras->gamma_rr); Free(ras->gamma_rr_unscaled); Free_Scalar_Dbl(ras->pinvar); Free_Scalar_Dbl(ras->alpha); Free_Scalar_Dbl(ras->free_rate_mr); if(ras->next) Free_RAS(ras->next); Free(ras); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Model(t_mod *mod) { Free_Custom_Model(mod); Free_Model_Complete(mod); Free_Model_Basic(mod); /* Free(mod); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free(void *p) { #if (defined(__AVX__) || defined(__SSE3__)) #ifndef WIN32 free(p); #else _aligned_free(p); #endif #else free(p); #endif p = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Input(option *io) { int i; do { RATES_Free_Rates(io->rates); TIMES_Free_Times(io->times); MCMC_Free_MCMC(io->mcmc); Free(io->in_align_file); Free(io->in_tree_file); Free(io->in_constraint_tree_file); Free(io->in_coord_file); Free(io->out_file); Free(io->out_tree_file); Free(io->out_trees_file); Free(io->out_boot_tree_file); Free(io->out_boot_stats_file); Free(io->out_stats_file); Free(io->weight_file); Free(io->out_lk_file); Free(io->out_summary_file); Free(io->out_ps_file); Free(io->out_trace_file); Free(io->out_json_trace_file); Free(io->out_ancestral_seq_file); Free(io->out_ancestral_tree_file); Free(io->nt_or_cd); Free(io->run_id_string); Free(io->clade_list_file); for(i=0;ialphabet[i]); Free(io->alphabet); if(io->short_tax_names) { for(i=0;isize_tax_names;i++) { Free(io->short_tax_names[i]); Free(io->long_tax_names[i]); } Free(io->long_tax_names); Free(io->short_tax_names); } Free_Tree_List(io->treelist); if(io->lon) Free(io->lon); if(io->lat) Free(io->lat); if(io->next) { io = io->next; Free(io->prev); } else { Free(io); break; } }while(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Tree_List(t_treelist *list) { Free(list->tree); Free(list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_St(supert_tree *st) { int i; For(i,2*st->tree->n_otu-1) Free_NNI(st->tree->a_edges[i]->nni); for(i=0;in_part;i++) Free(st->match_st_node_in_gt[i]); Free(st->match_st_node_in_gt); Free_Tree(st->tree); Free(st); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Eigen(eigen *eigen_struct) { Free(eigen_struct->space_int); Free(eigen_struct->space); Free(eigen_struct->e_val); Free(eigen_struct->e_val_im); Free(eigen_struct->r_e_vect_im); Free(eigen_struct->l_e_vect); Free(eigen_struct->r_e_vect); Free(eigen_struct->dum); Free(eigen_struct->q); if(eigen_struct->next) Free_Eigen(eigen_struct->next); Free(eigen_struct); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_One_Spr(t_spr *this_spr) { Free(this_spr->path); if(this_spr->l0) Free_Scalar_Dbl(this_spr->l0); if(this_spr->l1) Free_Scalar_Dbl(this_spr->l1); if(this_spr->l2) Free_Scalar_Dbl(this_spr->l2); if(this_spr->v0) Free_Scalar_Dbl(this_spr->v0); if(this_spr->v1) Free_Scalar_Dbl(this_spr->v1); if(this_spr->v2) Free_Scalar_Dbl(this_spr->v2); if(this_spr->init_target_l) Free_Scalar_Dbl(this_spr->init_target_l); if(this_spr->init_target_v) Free_Scalar_Dbl(this_spr->init_target_v); Free(this_spr); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Spr_List_One_Edge(t_tree *tree) { int i; for(i=0;isize_spr_list_one_edge+1;++i) Free_One_Spr(tree->spr_list_one_edge[i]); if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Spr_List_One_Edge,tree); Free(tree->spr_list_one_edge); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Spr_List_All_Edge(t_tree *tree) { int i; for(i=0;isize_spr_list_all_edge+1;++i) Free_One_Spr(tree->spr_list_all_edge[i]); if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Spr_List_All_Edge,tree); Free(tree->spr_list_all_edge); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Best_Spr(t_tree *tree) { Free_One_Spr(tree->best_spr); if(tree->is_mixt_tree == YES) MIXT_Repeat_Task(Free_Best_Spr,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Actual_CSeq(calign *data) { int i; for(i=0;in_otu;i++) { Free(data->c_seq[i]->state); Free(data->c_seq[i]->d_state); data->c_seq[i]->state = NULL; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Prefix_Tree(pnode *n, int size) { int i; for(i=0;inext[i]) { Free_Prefix_Tree(n->next[i],size); } } Free_Pnode(n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Pnode(pnode *n) { Free(n->next); Free(n); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Optimiz(t_opt *s_opt) { Free(s_opt); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Nexus(option *io) { int i,j; for(i=0;inex_com_list[i]->nparm) Free_Nexus_Parm(io->nex_com_list[i]->parm[j]); Free(io->nex_com_list[i]->parm); Free(io->nex_com_list[i]->name); Free(io->nex_com_list[i]); } Free(io->nex_com_list); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Nexus_Com(nexcom **com) { int i; for(i=0;iparm); Free(com[i]->name); Free(com[i]); } Free(com); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Nexus_Parm(nexparm *parm) { Free(parm->value); Free(parm->name); Free(parm); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Tree(xml_node *node) { if(!node) return; if(node->child) XML_Free_XML_Tree(node->child); if(node->next) XML_Free_XML_Tree(node->next); XML_Free_XML_Node(node); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Node(xml_node *node) { Free(node->id); Free(node->name); Free(node->value); XML_Free_XML_Ds(node->ds); XML_Free_XML_Attr(node->attr); Free(node); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Attr(xml_attr *attr) { if(attr) { Free(attr->name); Free(attr->value); if(attr->next) XML_Free_XML_Attr(attr->next); Free(attr); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Free_XML_Ds(t_ds *ds) { if(ds->next) XML_Free_XML_Ds(ds->next); Free(ds); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Free_MCMC(t_mcmc *mcmc) { int i; Free(mcmc->move_type); Free(mcmc->adjust_tuning); Free(mcmc->out_filename); Free(mcmc->move_weight); Free(mcmc->move_prob); Free(mcmc->acc_move); Free(mcmc->run_move); Free(mcmc->prev_acc_move); Free(mcmc->prev_run_move); Free(mcmc->acc_rate); Free(mcmc->tune_move); for(i=0;in_moves;i++) Free(mcmc->move_name[i]); Free(mcmc->move_name); Free(mcmc->ess_run); Free(mcmc->start_ess); Free(mcmc->ess); Free(mcmc->sampled_val); Free(mcmc->mode); Free(mcmc); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Free_Times(t_time *times) { Free(times->buff_t); Free(times->nd_t); Free(times->true_t); Free(times->t_prior); Free(times->t_mean); Free(times->t_prior_min); Free(times->t_prior_max); Free(times->t_floor); Free(times->t_has_prior); Free(times->t_rank); Free(times->mean_t); Free(times->t_prior_min_ori); Free(times->t_prior_max_ori); Free(times->times_partial_proba); Free(times->calib_prob); Free(times->numb_calib_chosen); for(int i=0;in_cal;i++) Free_Calib(times->a_cal[i]); Free(times->a_cal); Free(times->n_jps); Free(times->t_jps); Free(times->time_slice_lims); Free(times->n_time_slice_spans); Free(times->curr_slice); Free(times->has_survived); Free(times); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Free_Rates(t_rate *rates) { if(rates->is_allocated == YES) { Free(rates->nd_r); Free(rates->br_r); Free(rates->buff_nd_r); Free(rates->buff_br_r); Free(rates->true_r); Free(rates->dens); Free(rates->triplet); Free(rates->cond_var); Free(rates->invcov); Free(rates->ml_l); Free(rates->cur_l); Free(rates->u_ml_l); Free(rates->u_cur_l); Free(rates->cov_r); Free(rates->lca); Free(rates->trip_cond_cov); Free(rates->trip_reg_coeff); Free(rates->_2n_vect1); Free(rates->_2n_vect2); Free(rates->_2n_vect3); Free(rates->_2n_vect4); Free(rates->_2n_vect5); Free(rates->_2n2n_vect1); Free(rates->_2n2n_vect2); Free(rates->cov_l); Free(rates->mean_l); Free(rates->mean_r); Free(rates->grad_l); Free(rates->reg_coeff); Free(rates->br_do_updt); Free(rates->cur_gamma_prior_mean); Free(rates->cur_gamma_prior_var); Free(rates->n_tips_below); Free(rates->model_name); } Free(rates); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Calib(t_cal *cal) { if(!cal) return; else { int i; for(i=0;iclade_list_size;i++) Free(cal->clade_list[i]); Free(cal->clade_list); Free(cal->id); Free(cal->alpha_proba_list); Free(cal); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Free_Geo(t_geo *t) { int i; Free(t->f_mat); Free(t->r_mat); Free(t->occup); Free(t->idx_loc); Free(t->sorted_nd); Free(t->cov); Free(t->idx_loc_beneath); for(i=0;ildscape_sz;i++) Free_Geo_Coord(t->coord_loc[i]); Free(t->coord_loc); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Free_Geo_Coord(t_geo_coord *t) { Free(t->cpy->lonlat); Free(t->cpy->id); Free(t->cpy); Free(t->lonlat); Free(t->id); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Free_Disk(t_dsk *t) { Free_Geo_Coord(t->centr); Free(t->ldsk_a); Free(t->id); Free(t); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void PHYREX_Free_Ldisk(t_ldsk *t) { if(t == NULL) return; else { Free(t->next); Free_Geo_Coord(t->coord); if(t->cpy_coord) Free_Geo_Coord(t->cpy_coord); Free(t); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Free_Ldsk_Struct(t_tree *tree) { t_dsk *disk,*next; int i; assert(tree); assert(tree->n_root); assert(tree->n_root->ldsk); assert(tree->n_root->ldsk->disk); disk = tree->n_root->ldsk->disk; do { if(disk->ldsk) PHYREX_Free_Ldisk(disk->ldsk); next = disk->next; PHYREX_Free_Disk(disk); disk = next; } while(disk); for(i=0;in_otu;++i) PHYREX_Free_Ldisk(tree->a_nodes[i]->ldsk); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Poly(t_poly *p) { int i; for(i=0;in_poly_vert;i++) Free_Geo_Coord(p->poly_vert[i]); Free(p->poly_vert); Free(p); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Mmod(t_phyrex_mod *mmod) { if(mmod == NULL) return; Free_Geo_Coord(mmod->lim_up); Free_Geo_Coord(mmod->lim_do); Free(mmod->sigsq_scale); Free(mmod->sigsq); Free(mmod); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void JSON_Free_Array(json_a *a) { if(a->object) JSON_Free_Object(a->object); Free(a); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void JSON_Free_Object(json_o *o) { if(o->kv) JSON_Free_KeyVal(o->kv); if(o->next) JSON_Free_Object(o->next); Free(o); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void JSON_Free_KeyVal(json_kv *kv) { if(kv->key) Free(kv->key); if(kv->value) Free(kv->value); if(kv->object) JSON_Free_Object(kv->object); if(kv->array) JSON_Free_Array(kv->array); if(kv->next) JSON_Free_KeyVal(kv->next); Free(kv); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_NNI(t_nni *t) { if(t->init_l) Free_Scalar_Dbl(t->init_l); if(t->init_v) Free_Scalar_Dbl(t->init_v); if(t->best_l) Free_Scalar_Dbl(t->best_l); if(t->best_v) Free_Scalar_Dbl(t->best_v); if(t->l0) Free_Scalar_Dbl(t->l0); if(t->v0) Free_Scalar_Dbl(t->v0); if(t->l1) Free_Scalar_Dbl(t->l1); if(t->v1) Free_Scalar_Dbl(t->v1); if(t->l2) Free_Scalar_Dbl(t->l2); if(t->v2) Free_Scalar_Dbl(t->v2); Free(t); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Matrices used in transfer bootstrap computation (tbe.c) */ void Free_TBE_Matrices(int n_otu, short unsigned*** i_matrix, short unsigned*** c_matrix, short unsigned*** hamming, short unsigned** min_dist, short unsigned** min_dist_edge, int** cluster_sizes){ int i; int nb_edges = 2*n_otu-3; for (i=0; ikey); Free(lab->val); if(lab->next != NULL) Free_Label(lab->next); Free(lab); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Free_Contrasts(t_ctrst *ctrst) { Free(ctrst->x); Free(ctrst->tprime); Free(ctrst); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/free.h000066400000000000000000000066371422404706600153120ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef FREE_H #define FREE_H #include "utilities.h" void Free_All_Nodes_Light(t_tree *tree); void Free_All_Edges_Light(t_tree *tree); void Free_Mat(matrix *mat); void Free_Partial_Lk(phydbl *p_lk,int len,int n_catg); void Free_Tree(t_tree *tree); void Free_Bip(t_tree *tree); void Free_Edge(t_edge *b); void Free_Node(t_node *n); void Free_Calign(calign *data); void Free_Seq(align **d,int n_otu); void Free_All(align **d,calign *cdata,t_tree *tree); void Free_SubTree(t_edge *b_fcus,t_node *a,t_node *d,t_tree *tree); void Free_Tree_Ins_Tar(t_tree *tree); void Free_Tree_Pars(t_tree *tree); void Free_Edge_Pars(t_edge *b); void Free_Edge_Pars_Left(t_edge *b); void Free_Edge_Pars_Rght(t_edge *b); void Free_Tree_Lk(t_tree *tree); void Free_Node_Lk(t_node *n); void Free_Edge_Lk(t_edge *b); void Free_Model_Complete(t_mod *mod); void Free_Model_Basic(t_mod *mod); void Free_Custom_Model(t_mod *mod); void Free_Efrq(t_efrq *e_frq); void Free_Rmat(t_rmat *r_mat); void Free_Model(t_mod *mod); void Free(void *p); void Free_Input(option *io); void Free_Tree_List(t_treelist *list); void Free_St(supert_tree *st); void Free_Eigen(eigen *eigen_struct); void Free_One_Spr(t_spr *this_spr); void Free_Spr_List_One_Edge(t_tree *tree); void Free_Spr_List_All_Edge(t_tree *mixt_tree); void Free_Actual_CSeq(calign *data); void Free_Prefix_Tree(pnode *n,int size); void Free_Pnode(pnode *n); void Free_Optimiz(t_opt *s_opt); void Free_Nexus(option *io); void Free_Nexus_Com(nexcom **com); void Free_Nexus_Parm(nexparm *parm); void Free_RAS(t_ras *ras); void XML_Free_XML_Tree(xml_node *node); void XML_Free_XML_Node(xml_node *node); void XML_Free_XML_Attr(xml_attr *attr); void XML_Free_XML_Ds(t_ds *ds); void Free_String(t_string *ts); void Free_Vect_Dbl(vect_dbl *v); void Free_Vect_Int(vect_int *v); void Free_Scalar_Dbl(scalar_dbl *v); void Free_Scalar_Int(scalar_int *v); void Free_Edge_Core(t_edge *b); void Free_Rates(t_rate *rates); void Free_Calib(t_cal *cal); void Free_Edge_Lk_Left(t_edge *b); void Free_Edge_Lk_Rght(t_edge *b); void Free_Geo(t_geo *t); void Free_Geo_Coord(t_geo_coord *t); void PHYREX_Free_Disk(t_dsk *t); void PHYREX_Free_Ldisk(t_ldsk *t); void PHYREX_Free_Ldsk_Struct(t_tree *tree); void Free_Poly(t_poly *p); void Free_Mmod(t_phyrex_mod *mmod); void Free_Efrq_Weights(t_mod *mixt_mod); void Free_Rmat_Weights(t_mod *mixt_mod); void JSON_Free_KeyVal(json_kv *kv); void JSON_Free_Object(json_o *o); void JSON_Free_Array(json_a *a); void Free_Edge_Loc_Rght(t_edge *b); void Free_Edge_Loc_Left(t_edge *b); void Free_Edge_Loc(t_edge *b); void Free_NNI(t_nni *t); void Free_Linked_List(t_ll *t); void Free_TBE_Matrices(int n_otu, short unsigned*** i_matrix, short unsigned*** c_matrix, short unsigned*** hamming, short unsigned** min_dist, short unsigned** min_dist_edge, int** cluster_sizes); void Free_Extra_Edge_Lk(t_tree *tree); void Free_Edge_Length(t_edge *b); void Free_Clade(t_clad *this); void Free_Label(t_label *lab); void Free_Contrasts(t_ctrst *ctrst); void TIMES_Free_Times(t_time *times); void Free_Best_Spr(t_tree *tree); void Free_All_Edges_Light(t_tree *tree); void Free_All_Edges_Lens(t_tree *tree); #endif phyml-3.3.20220408/src/geo.c000066400000000000000000001663631422404706600151410ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "geo.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GEO_Main(int argc, char **argv) { /* GEO_Simulate_Estimate(argc,argv); */ GEO_Estimate(argc,argv); return(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GEO_Estimate(int argc, char **argv) { t_geo *t; int seed; FILE *fp; t_tree *tree; phydbl *ldscp; int *loc_hash; int i,j; phydbl *probs; phydbl sum; // geo ./ban seed = getpid(); /* seed = 28224; */ /* seed = 21249; */ /* seed = 21596; */ printf("\n. Seed = %d",seed); srand(seed); t = GEO_Make_Geo_Basic(); GEO_Init_Geo_Struct(t); fp = Openfile(argv[1],0); /* Open tree file */ tree = Read_Tree_File_Phylip(fp); /* Read it */ Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates,NULL,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,NULL,tree->n_otu); Branch_To_Time(tree); tree->geo = t; GEO_Read_In_Landscape(argv[2],t,&ldscp,&loc_hash,tree); GEO_Make_Geo_Complete(t->ldscape_sz,t->n_dim,tree->n_otu,t); j = 0; for(i=0;ildscape_sz;i++) { t->coord_loc[i]->lonlat[0] = ldscp[j]; t->coord_loc[i]->lonlat[1] = ldscp[j+1]; PhyML_Printf("\n. Location %d: %13f %13f",i+1,t->coord_loc[i]->lonlat[0],t->coord_loc[i]->lonlat[1]); j+=2; } for(i=0;in_otu;i++) t->idx_loc[i] = loc_hash[i]; t->cov[0*t->n_dim+0] = t->sigma; t->cov[1*t->n_dim+1] = t->sigma; t->cov[0*t->n_dim+1] = 0.0; t->cov[1*t->n_dim+0] = 0.0; GEO_Get_Sigma_Max(t); t->max_sigma = t->sigma_thresh * 2.; PhyML_Printf("\n. Sigma max: %f",t->sigma_thresh); GEO_Get_Locations_Beneath(t,tree); probs = (phydbl *)mCalloc(tree->geo->ldscape_sz,sizeof(phydbl)); sum = 0.0; for(i=0;igeo->ldscape_sz;i++) sum += tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]; for(i=0;igeo->ldscape_sz;i++) probs[i] = tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]/sum; tree->geo->idx_loc[tree->n_root->num] = Sample_i_With_Proba_pi(probs,tree->geo->ldscape_sz); Free(probs); GEO_Randomize_Locations(tree->n_root,t,tree); GEO_Update_Occup(t,tree); GEO_Lk(t,tree); PhyML_Printf("\n. Init loglk: %f",tree->geo->c_lnL); /* DR_Draw_Tree("essai.ps",tree); */ GEO_MCMC(tree); fclose(fp); Free(ldscp); Free(loc_hash); return(1); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int GEO_Simulate_Estimate(int argc, char **argv) { t_geo *t; int n_tax; t_tree *tree,*ori_tree; int seed; phydbl *res; FILE *fp; int pid; char *s; int rand_loc; phydbl *probs,sum; int i; phydbl mantel_p_val; phydbl rf; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); strcpy(s,"geo.out"); pid = getpid(); sprintf(s+strlen(s),".%d",pid); fp = fopen(s,"w"); seed = getpid(); /* seed = 15520; */ /* seed = 5023; */ printf("\n. Seed = %d",seed); srand(seed); t = GEO_Make_Geo_Basic(); GEO_Init_Geo_Struct(t); /* t->tau = 3.0; */ /* t->lbda = 0.02; */ /* t->sigma = 10.; */ t->ldscape_sz = (int)atoi(argv[1]); t->n_dim = 2; n_tax = (int)atoi(argv[2]); GEO_Make_Geo_Complete(t->ldscape_sz,t->n_dim,n_tax,t); t->cov[0*t->n_dim+0] = t->sigma; t->cov[1*t->n_dim+1] = t->sigma; t->cov[0*t->n_dim+1] = 0.0; t->cov[1*t->n_dim+0] = 0.0; GEO_Simulate_Coordinates(t->ldscape_sz,t); GEO_Get_Sigma_Max(t); t->max_sigma = t->sigma_thresh * 2.; PhyML_Printf("\n. sigma max: %f threshold: %f",t->max_sigma,t->sigma_thresh); /* t->tau = Uni()*(t->max_tau/100.-t->min_tau*10.) + t->min_tau*10.; */ /* t->lbda = exp(Uni()*(log(t->max_lbda/100.)-log(t->min_lbda*10.)) + log(t->min_lbda*10.)); */ /* t->sigma = Uni()*(t->max_sigma-t->min_sigma) + t->min_sigma; */ t->lbda = 1.; t->sigma = 0.3; t->tau = 1.; PhyML_Fprintf(fp,"\n# SigmaTrue\t SigmaThresh\t LbdaTrue\t TauTrue\txTrue\t yTrue\t xRand\t yRand\t RF\t Sigma5\t Sigma50\t Sigma95\t ProbSigmaInfThresh\t Lbda5\t Lbda50\t Lbda95\t ProbLbdaInf1\t Tau5\t Tau50\t Tau95\t X5\t X50\t X95\t Y5\t Y50\t Y95\t RandX5\t RandX50\t RandX95\t RandY5\t RandY50\t RandY95\t Mantel\t"); PhyML_Fprintf(fp,"\n"); tree = GEO_Simulate(t,n_tax); ori_tree = Make_Tree_From_Scratch(tree->n_otu,NULL); Copy_Tree(tree,ori_tree); Random_SPRs_On_Rooted_Tree(tree); Free_Bip(ori_tree); Alloc_Bip(ori_tree); Get_Bip(ori_tree->a_nodes[0],ori_tree->a_nodes[0]->v[0],ori_tree); Free_Bip(tree); Alloc_Bip(tree); Get_Bip(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); Match_Tip_Numbers(tree,ori_tree); rf = (phydbl)Compare_Bip(ori_tree,tree,NO)/(tree->n_otu-3); PhyML_Printf("\n. rf: %f",rf); phydbl scale; scale = exp(Rnorm(0,0.2)); PhyML_Printf("\n. Scale: %f",scale); For(i,2*tree->n_otu-1) tree->times->nd_t[i] *= scale; phydbl *tree_dist,*geo_dist; int j; Time_To_Branch(tree); tree_dist = Dist_Btw_Tips(tree); geo_dist = (phydbl *)mCalloc(tree->n_otu*tree->n_otu,sizeof(phydbl)); for(i=0;in_otu;i++) { for(j=0;jn_otu;j++) { /* geo_dist[i*tree->n_otu+j] = */ /* FABS(t->ldscape[t->idx_loc[i]*t->n_dim+0] - */ /* t->ldscape[t->idx_loc[j]*t->n_dim+0])+ */ /* FABS(t->ldscape[t->idx_loc[i]*t->n_dim+1] - */ /* t->ldscape[t->idx_loc[j]*t->n_dim+1]); */ geo_dist[i*tree->n_otu+j] = FABS(t->coord_loc[t->idx_loc[i]]->lonlat[0] - t->coord_loc[t->idx_loc[j]]->lonlat[0])+ FABS(t->coord_loc[t->idx_loc[i]]->lonlat[1] - t->coord_loc[t->idx_loc[j]]->lonlat[1]); } } printf("\n. tau: %f lbda: %f sigma: %f",t->tau,t->lbda,t->sigma); mantel_p_val = Mantel(tree_dist,geo_dist,tree->n_otu,tree->n_otu); printf("\n. Mantel test p-value: %f",mantel_p_val); Free(tree_dist); Free(geo_dist); rand_loc = Rand_Int(0,t->ldscape_sz-1); PhyML_Printf("\n. sigma: %f\t lbda: %f\t tau:%f\t x:%f\t y:%f rand.x:%f\t rand.y:%f\t", t->sigma, t->lbda, t->tau, /* t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+1], */ /* t->ldscape[rand_loc*t->n_dim+0], */ /* t->ldscape[rand_loc*t->n_dim+1]); */ t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[0], t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[1], t->coord_loc[rand_loc]->lonlat[0], t->coord_loc[rand_loc]->lonlat[1]); PhyML_Fprintf(fp,"%f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t", t->sigma, t->sigma_thresh, t->lbda, t->tau, t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[0], t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[1], t->coord_loc[rand_loc]->lonlat[0], t->coord_loc[rand_loc]->lonlat[1], rf); GEO_Get_Locations_Beneath(t,tree); probs = (phydbl *)mCalloc(tree->geo->ldscape_sz,sizeof(phydbl)); sum = 0.0; for(i=0;igeo->ldscape_sz;i++) sum += tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]; for(i=0;igeo->ldscape_sz;i++) probs[i] = tree->geo->idx_loc_beneath[tree->n_root->num * tree->geo->ldscape_sz + i]/sum; tree->geo->idx_loc[tree->n_root->num] = Sample_i_With_Proba_pi(probs,tree->geo->ldscape_sz); Free(probs); GEO_Randomize_Locations(tree->n_root,tree->geo,tree); GEO_Update_Occup(t,tree); GEO_Lk(t,tree); PhyML_Printf("\n. Init loglk: %f",tree->geo->c_lnL); res = GEO_MCMC(tree); PhyML_Fprintf(fp,"%f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f\t %f \n", /* Sigma5 */ Quantile(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Sigma50*/ Quantile(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Sigma95*/ Quantile(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* ProbInfThesh */ Prob(res+0*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval,t->sigma_thresh), /* Lbda5 */ Quantile(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Lbda50 */ Quantile(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Lbda95 */ Quantile(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* ProbInf1 */ Prob(res+1*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval,1.0), /* Tau5 */ Quantile(res+2*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Tau50 */ Quantile(res+2*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Tau 95 */ Quantile(res+2*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* X5 */ Quantile(res+4*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* X50 */ Quantile(res+4*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* X95 */ Quantile(res+4*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* Y5 */ Quantile(res+5*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* Y50 */ Quantile(res+5*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* Y95 */ Quantile(res+5*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* RandX5 */ Quantile(res+6*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* RandX50*/ Quantile(res+6*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* RandX95*/ Quantile(res+6*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), /* RandY5 */ Quantile(res+7*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.025), /* RandY50*/ Quantile(res+7*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.50), /* RandY95*/ Quantile(res+7*tree->mcmc->chain_len / tree->mcmc->sample_interval,tree->mcmc->run / tree->mcmc->sample_interval+1,0.975), mantel_p_val ); fflush(NULL); Free(s); Free(res); fclose(fp); return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl *GEO_MCMC(t_tree *tree) { phydbl *res; int n_vars; int rand_loc; t_geo *t; t = tree->geo; tree->mcmc = MCMC_Make_MCMC_Struct(); MCMC_Complete_MCMC(tree->mcmc,tree); tree->mcmc->io = NULL; tree->mcmc->is = NO; tree->mcmc->run = 0; tree->mcmc->sample_interval = 1E+3; tree->mcmc->chain_len = 1E+6; tree->mcmc->chain_len_burnin = 1E+5; tree->mcmc->randomize = YES; tree->mcmc->norm_freq = 1E+3; tree->mcmc->max_tune = 1.E+20; tree->mcmc->min_tune = 1.E-10; tree->mcmc->print_every = 2; tree->mcmc->is_burnin = NO; tree->mcmc->nd_t_digits = 1; t->tau = 1.0; t->lbda = 1.0; t->sigma = 1.0; t->dum = 1.0; tree->mcmc->chain_len = 1.E+8; tree->mcmc->sample_interval = 50; MCMC_Complete_MCMC(tree->mcmc,tree); GEO_Update_Occup(t,tree); GEO_Lk(t,tree); tree->mcmc->start_ess[tree->mcmc->num_move_geo_sigma] = YES; tree->mcmc->start_ess[tree->mcmc->num_move_geo_lambda] = YES; tree->mcmc->start_ess[tree->mcmc->num_move_geo_tau] = YES; tree->mcmc->start_ess[tree->mcmc->num_move_geo_dum] = YES; n_vars = 10; res = (phydbl *)mCalloc(tree->mcmc->chain_len / tree->mcmc->sample_interval * n_vars,sizeof(phydbl)); PhyML_Printf("\n. Run Sigma [ESS] Lambda [ESS] Tau [ESS] Dummy [ESS] LogLk"); tree->mcmc->run = 0; do { MCMC_GEO_Lbda(tree); MCMC_GEO_Tau(tree); /* MCMC_Geo_Dum(tree); */ MCMC_GEO_Loc(tree); t->update_fmat = YES; MCMC_GEO_Sigma(tree); t->update_fmat = NO; /* t->update_fmat = YES; */ /* MCMC_Geo_Updown_Lbda_Sigma(tree); */ /* t->update_fmat = NO; */ /* MCMC_Geo_Updown_Tau_Lbda(tree); */ /* MCMC_Geo_Updown_Tau_Lbda(tree); */ /* MCMC_Geo_Updown_Tau_Lbda(tree); */ /* printf("\n"); */ /* int i; */ /* For(i,2*tree->n_otu-1) */ /* { */ /* if(tree->a_nodes[i]->tax == NO) */ /* { */ /* printf("%2d ",tree->geo->idx_loc[i]); */ /* } */ /* } */ if(tree->mcmc->run%tree->mcmc->sample_interval == 0) { MCMC_Copy_To_New_Param_Val(tree->mcmc,tree); MCMC_Update_Effective_Sample_Size(tree->mcmc->num_move_geo_lambda,tree->mcmc,tree); MCMC_Update_Effective_Sample_Size(tree->mcmc->num_move_geo_sigma,tree->mcmc,tree); MCMC_Update_Effective_Sample_Size(tree->mcmc->num_move_geo_tau,tree->mcmc,tree); /* printf("\n. lbda:%f,%f tau:%f,%f sigma:%f,%f", */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_geo_lambda], */ /* tree->mcmc->tune_move[tree->mcmc->num_move_geo_lambda], */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_geo_tau], */ /* tree->mcmc->tune_move[tree->mcmc->num_move_geo_tau], */ /* tree->mcmc->acc_rate[tree->mcmc->num_move_geo_sigma], */ /* tree->mcmc->tune_move[tree->mcmc->num_move_geo_sigma]); */ PhyML_Printf("\n. %6d %12f %4.0f %12f %4.0f %12f %4.0f %12f %4.0f %12f", tree->mcmc->run, t->sigma, tree->mcmc->ess[tree->mcmc->num_move_geo_sigma], t->lbda, tree->mcmc->ess[tree->mcmc->num_move_geo_lambda], t->tau, tree->mcmc->ess[tree->mcmc->num_move_geo_tau], t->dum, tree->mcmc->ess[tree->mcmc->num_move_geo_dum], t->c_lnL); /* PhyML_Printf("\n%12f %12f %12f %12f", */ /* t->sigma, */ /* t->lbda, */ /* t->tau, */ /* t->dum); */ rand_loc = Rand_Int(0,t->ldscape_sz-1); res[0 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->sigma; res[1 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->lbda; res[2 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->tau; res[3 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->c_lnL; /* res[4 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+0]; */ /* res[5 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[t->idx_loc[tree->n_root->num]*t->n_dim+1]; */ res[4 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[0]; res[5 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[t->idx_loc[tree->n_root->num]]->lonlat[1]; /* res[6 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[rand_loc*t->n_dim+0]; */ /* res[7 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->ldscape[rand_loc*t->n_dim+1]; */ res[6 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[rand_loc]->lonlat[0]; res[7 * tree->mcmc->chain_len / tree->mcmc->sample_interval + tree->mcmc->run / tree->mcmc->sample_interval] = t->coord_loc[rand_loc]->lonlat[1]; } tree->mcmc->run++; if(tree->mcmc->ess[tree->mcmc->num_move_geo_sigma] > 200.) tree->mcmc->adjust_tuning[tree->mcmc->num_move_geo_sigma] = NO; if(tree->mcmc->ess[tree->mcmc->num_move_geo_tau] > 200.) tree->mcmc->adjust_tuning[tree->mcmc->num_move_geo_tau] = NO; if(tree->mcmc->ess[tree->mcmc->num_move_geo_lambda]> 200.) tree->mcmc->adjust_tuning[tree->mcmc->num_move_geo_lambda] = NO; MCMC_Get_Acc_Rates(tree->mcmc); if(tree->mcmc->ess[tree->mcmc->num_move_geo_sigma] > 1000. && tree->mcmc->ess[tree->mcmc->num_move_geo_tau] > 1000. && tree->mcmc->ess[tree->mcmc->num_move_geo_lambda]> 1000.) break; } while(tree->mcmc->run < tree->mcmc->chain_len); return(res); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update F matrix. Assume a diagonal covariance matrix. void GEO_Update_Fmat(t_geo *t) { phydbl *loc1, *loc2; int i,j,k; int err; phydbl lognloc; for(i=0;in_dim;i++) t->cov[i*t->n_dim+i] = t->sigma; // Diagonal covariance matrix. Same variance in every direction lognloc = log(t->ldscape_sz); // Fill in F matrix; for(i=0;ildscape_sz;i++) { loc1 = t->coord_loc[i]->lonlat; for(j=i;jldscape_sz;j++) { loc2 = t->coord_loc[j]->lonlat; t->f_mat[i*t->ldscape_sz+j] = .0; // Calculate log(f(l_i,l_j)) - log(f(l_i,l_i) - log(m) for(k=0;kn_dim;k++) t->f_mat[i*t->ldscape_sz+j] += Log_Dnorm(loc2[k],loc1[k],t->cov[k*t->n_dim+k],&err); t->f_mat[i*t->ldscape_sz+j] -= lognloc; for(k=0;kn_dim;k++) t->f_mat[i*t->ldscape_sz+j] -= Log_Dnorm(loc1[k],loc1[k],t->cov[k*t->n_dim+k],&err); // Take the exponential t->f_mat[i*t->ldscape_sz+j] = exp(t->f_mat[i*t->ldscape_sz+j]); // Matrix is symmetric t->f_mat[j*t->ldscape_sz+i] = t->f_mat[i*t->ldscape_sz+j]; /* printf("\n. f[%d,%d] = %f (1:[%f;%f] 2:[%f;%f]) sigma=%f",i,j,t->f_mat[i*t->ldscape_sz+j],loc1[0],loc1[1],loc2[0],loc2[1],SQRT(t->cov[0*t->n_dim+0])); */ } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Sort node heights from oldest to youngest age. void GEO_Update_Sorted_Nd(t_geo *t, t_tree *tree) { int i; int swap; t_node *buff; buff = NULL; For(i,2*tree->n_otu-1) t->sorted_nd[i] = tree->a_nodes[i]; // Bubble sort of the node heights do { swap = NO; For(i,2*tree->n_otu-2) { if(tree->times->nd_t[t->sorted_nd[i+1]->num] < tree->times->nd_t[t->sorted_nd[i]->num]) { buff = t->sorted_nd[i]; t->sorted_nd[i] = t->sorted_nd[i+1]; t->sorted_nd[i+1] = buff; swap = YES; } } } while(swap == YES); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Update the set of vectors of occupation along the tree void GEO_Update_Occup(t_geo *t, t_tree *tree) { int i,j; t_node *v1, *v2; GEO_Update_Sorted_Nd(t,tree); For(i,t->ldscape_sz*(2*tree->n_otu-1)) t->occup[i] = 0; t->occup[tree->n_root->num*t->ldscape_sz + t->idx_loc[tree->n_root->num]] = 1; for(i=1;i<2*tree->n_otu-1;i++) { for(j=0;jldscape_sz;j++) { t->occup[t->sorted_nd[i]->num*t->ldscape_sz + j] = t->occup[t->sorted_nd[i-1]->num*t->ldscape_sz + j]; } if(t->sorted_nd[i-1]->tax == NO) { v1 = v2 = NULL; if(t->sorted_nd[i-1] == tree->n_root) { v1 = tree->n_root->v[1]; v2 = tree->n_root->v[2]; } else { for(j=0;j<3;j++) { if(t->sorted_nd[i-1]->v[j] != t->sorted_nd[i-1]->anc && t->sorted_nd[i-1]->b[j] != tree->e_root) { if(!v1) v1 = t->sorted_nd[i-1]->v[j]; else v2 = t->sorted_nd[i-1]->v[j]; } } } if(t->idx_loc[v1->num] != t->idx_loc[t->sorted_nd[i-1]->num]) { t->occup[t->sorted_nd[i]->num * t->ldscape_sz + t->idx_loc[v1->num]]++; } else { t->occup[t->sorted_nd[i]->num * t->ldscape_sz + t->idx_loc[v2->num]]++; } } } /* printf("\n"); */ /* For(i,2*tree->n_otu-1) */ /* { */ /* printf("\n. Node %3d: ",t->sorted_nd[i]->num); */ /* for(j=0;jldscape_sz;j++) */ /* { */ /* /\* printf("%3d [%12f;%12f] ", *\/ */ /* /\* t->occup[t->sorted_nd[i]->num*t->ldscape_sz + j], *\/ */ /* /\* t->ldscape[j*t->n_dim+0],t->ldscape[j*t->n_dim+1]); *\/ */ /* /\* printf("%3d ", *\/ */ /* /\* t->occup[t->sorted_nd[i]->num*t->ldscape_sz + j]); *\/ */ /* } */ /* } */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Calculate R mat at node n void GEO_Update_Rmat(t_node *n, t_geo *t, t_tree *tree) { int i,j; phydbl lbda_j; for(i=0;ildscape_sz;i++) { for(j=0;jldscape_sz;j++) { lbda_j = ((t->occup[n->num*t->ldscape_sz + j]==0) ? (1.0) : (t->lbda)); t->r_mat[i*t->ldscape_sz+j] = t->f_mat[i*t->ldscape_sz+j] * lbda_j * t->tau * t->dum; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl GEO_Lk(t_geo *t, t_tree *tree) { int i,j; phydbl loglk; phydbl R; int dep,arr; // departure and arrival location indices; t_node *curr_n,*prev_n,*v1,*v2; phydbl sum; GEO_Update_Occup(t,tree); // Same here. if(t->update_fmat == YES) GEO_Update_Fmat(t); prev_n = NULL; curr_n = NULL; loglk = .0; for(i=1;in_otu-1;i++) // Consider all the time slices, from oldest to youngest. // Start at first node below root { prev_n = t->sorted_nd[i-1]; // node just above curr_n = t->sorted_nd[i]; // current node GEO_Update_Rmat(curr_n,t,tree); // NOTE: don't need to do that every time. Add check later. R = GEO_Total_Migration_Rate(curr_n,t); // Total migration rate calculated at node n /* if(i < 2) */ /* { */ /* printf("\n. t0: %f t1: %f R: %f tau: %f sigma: %f lbda: %f x1: %f y1: %f x2: %f y2: %f log0: %d loc1: %d rij: %G fij: %G", */ /* tree->times->nd_t[t->sorted_nd[i-1]->num], */ /* tree->times->nd_t[t->sorted_nd[i]->num], */ /* R, */ /* t->tau, */ /* t->lbda, */ /* t->sigma, */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i-1]->num]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i-1]->num]*t->n_dim+1], */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i]->num]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[tree->geo->sorted_nd[i]->num]*t->n_dim+1], */ /* t->idx_loc[tree->geo->sorted_nd[i-1]->num], */ /* t->idx_loc[tree->geo->sorted_nd[i]->num], */ /* t->r_mat[t->idx_loc[tree->geo->sorted_nd[i-1]->num] * t->ldscape_sz + t->idx_loc[tree->geo->sorted_nd[i]->num]], */ /* t->f_mat[t->idx_loc[tree->geo->sorted_nd[i-1]->num] * t->ldscape_sz + t->idx_loc[tree->geo->sorted_nd[i]->num]] */ /* ); */ /* printf("\n >> "); */ /* int j; */ /* for(j=0;jldscape_sz;j++) */ /* if(t->occup[t->sorted_nd[i]->num * t->ldscape_sz + j] > 0) */ /* printf("%f %f -- ", */ /* t->ldscape[j*t->n_dim+0], */ /* t->ldscape[j*t->n_dim+1]); */ /* } */ /* printf("\n. %d %d (%d) %f %p %p \n",i,curr_n->num,curr_n->tax,tree->times->nd_t[curr_n->num],curr_n->v[1],curr_n->v[2]); */ v1 = v2 = NULL; for(j=0;j<3;j++) if(curr_n->v[j] != curr_n->anc && curr_n->b[j] != tree->e_root) { if(!v1) v1 = curr_n->v[j]; else v2 = curr_n->v[j]; } dep = t->idx_loc[curr_n->num]; // departure location arr = // arrival location (t->idx_loc[v1->num] == t->idx_loc[curr_n->num] ? t->idx_loc[v2->num] : t->idx_loc[v1->num]); /* printf("\n%f\t%f", */ /* t->ldscape[arr*t->n_dim+0]-t->ldscape[dep*t->n_dim+0], */ /* t->ldscape[arr*t->n_dim+1]-t->ldscape[dep*t->n_dim+1]); */ loglk -= R * FABS(tree->times->nd_t[curr_n->num] - tree->times->nd_t[prev_n->num]); loglk += log(t->r_mat[dep * t->ldscape_sz + arr]); /* printf("\n <> %d %f %f %d %d v1:%d v2:%d anc:%d %d %d %d", */ /* curr_n->num, */ /* R * FABS(tree->times->nd_t[curr_n->num] - tree->times->nd_t[prev_n->num]), */ /* log(t->r_mat[dep * t->ldscape_sz + arr]), */ /* dep,arr,v1->num,v2->num,curr_n->anc->num,curr_n->v[0]->num,curr_n->v[1]->num,curr_n->v[2]->num); */ /* if(i<2) */ /* { */ /* printf("\n. R = %f r_mat = %f f_mat = %f dt = %f loglk = %f", */ /* R, */ /* t->r_mat[dep * t->ldscape_sz + arr], */ /* t->f_mat[dep * t->ldscape_sz + arr], */ /* FABS(t->sorted_nd[i] - t->sorted_nd[i-1]),loglk); */ /* Exit("\n"); */ /* } */ } // Likelihood for the first 'slice' (i.e., the part just below the root down to // the next node) GEO_Update_Rmat(tree->n_root,t,tree); loglk -= log(t->ldscape_sz); dep = t->idx_loc[tree->n_root->num]; arr = (t->idx_loc[tree->n_root->num] != t->idx_loc[tree->n_root->v[1]->num] ? t->idx_loc[tree->n_root->v[1]->num] : t->idx_loc[tree->n_root->v[2]->num]); /* printf("\n %f %f",t->ldscape[dep],t->ldscape[arr]); */ loglk += log(t->r_mat[dep * t->ldscape_sz + arr]); sum = .0; for(i=0;ildscape_sz;i++) sum += t->r_mat[dep * t->ldscape_sz + i]; loglk -= log(sum); tree->geo->c_lnL = loglk; return loglk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Init_Tloc_Tips(t_geo *t, t_tree *tree) { int i; // TO DO for(i=0;in_otu;i++) { t->idx_loc[i] = i; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Do not forget to call GEO_Update_Rmat (with node n) before calling this function phydbl GEO_Total_Migration_Rate(t_node *n, t_geo *t) { phydbl R; int i,j; R = .0; for(i=0;ildscape_sz;i++) { for(j=0;jldscape_sz;j++) { R += t->r_mat[i * t->ldscape_sz + j] * t->occup[n->num * t->ldscape_sz + i]; } } return R; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Find the arrival location for the migration leaving from n int GEO_Get_Arrival_Location(t_node *n, t_geo *t, t_tree *tree) { int i; t_node *v1, *v2; // the two daughters of n v1 = v2 = NULL; for(i=0;i<3;i++) { if(n->v[i] && n->v[i] != n->anc) { if(!v1) v1 = n->v[i]; else v2 = n->v[i]; } } if(t->idx_loc[v1->num] == t->idx_loc[v2->num]) // Migrated to the same location as that of n { if(t->idx_loc[n->num] != t->idx_loc[v1->num]) { PhyML_Printf("\n== Error detected in location labeling."); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } else return t->idx_loc[n->num]; } else // Migrated to a different spot { if((t->idx_loc[v1->num] != t->idx_loc[n->num]) && (t->idx_loc[v2->num] != t->idx_loc[n->num])) { PhyML_Printf("\n== Error detected in location labeling."); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } else { if(t->idx_loc[v1->num] == t->idx_loc[n->num]) return t->idx_loc[v2->num]; // v2 gets the new location, v1 inheritates from n else return t->idx_loc[v1->num]; // v1 gets the new location, v2 inheritates from n } } return -1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *GEO_Simulate(t_geo *t, int n_otu) { t_tree *tree; int n_branching_nodes; t_node **branching_nodes; // vector of nodes available for branching out phydbl *p_branch; // p_branch[i]: proba that the i-th node in branching_nodes branches out (p_x vector in the article) phydbl *p_mig; // p_branch[i]: proba of migrating to location i from the location of the edge branching out (q_i vector in the article) int hit; phydbl time; int dep, arr; int i,j; phydbl sum; phydbl R; int *occup; // occupation vector. Updated as we move down the tree int nd_idx; t_node *buff_nd; phydbl buff_t; int buff_l; int swap; tree = Make_Tree_From_Scratch(n_otu,NULL); tree->rates = RATES_Make_Rate_Struct(tree->n_otu); RATES_Init_Rate_Struct(tree->rates,NULL,tree->n_otu); tree->times = TIMES_Make_Time_Struct(tree->n_otu); TIMES_Init_Time_Struct(tree->times,NULL,tree->n_otu); tree->n_root = tree->a_nodes[2*tree->n_otu-2]; // Set the root node to the last element in the list of nodes tree->geo = t; For(i,2*tree->n_otu-2) tree->times->nd_t[i] = -1.; occup = (int *)mCalloc(t->ldscape_sz,sizeof(int)); GEO_Update_Fmat(t); branching_nodes = (t_node **)mCalloc(tree->n_otu,sizeof(t_node *)); branching_nodes[0] = tree->n_root; n_branching_nodes = 1; nd_idx = 0; p_branch = (phydbl *)mCalloc(tree->n_otu,sizeof(phydbl )); p_branch[0] = 1.0; p_mig = (phydbl *)mCalloc(t->ldscape_sz,sizeof(phydbl )); time = 0.0; // Time at the root node (this will be changed afterward) // Sample a location uniformly for the root t->idx_loc[tree->n_root->num] = Rand_Int(0,t->ldscape_sz-1); // Update the occupancy vector occup[t->idx_loc[tree->n_root->num]] = 1; dep = arr = -1; // total migration rate R = 0.0; for(i=0;ildscape_sz;i++) { R += t->f_mat[t->idx_loc[tree->n_root->num]*t->ldscape_sz+i] * ((occup[i] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum; } do { // Select the node that branches out hit = Sample_i_With_Proba_pi(p_branch,n_branching_nodes); /* printf("\n. [%d] Select node %d (location %d)",n_branching_nodes,branching_nodes[hit]->num,t->idx_loc[branching_nodes[hit]->num]); */ // Set the time for the branching node tree->times->nd_t[branching_nodes[hit]->num] = time; /* printf("\n. Set its time to %f",time); */ // Select the destination location dep = t->idx_loc[branching_nodes[hit]->num]; // Departure point sum = .0; for(i=0;ildscape_sz;i++) // Total rate of migration out of departure point { p_mig[i] = t->f_mat[dep*t->ldscape_sz+i] * ((occup[i] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum; sum += p_mig[i]; } for(i=0;ildscape_sz;i++) p_mig[i] /= sum; arr = Sample_i_With_Proba_pi(p_mig,t->ldscape_sz); /* printf("\n. Migrate from %d [%5.2f,%5.2f] to %d [%5.2f,%5.2f]", */ /* dep, */ /* t->ldscape[dep*t->n_dim+0], */ /* t->ldscape[dep*t->n_dim+1], */ /* arr, */ /* t->ldscape[arr*t->n_dim+0], */ /* t->ldscape[arr*t->n_dim+1]); */ /* printf("\n%f\t%f", */ /* t->ldscape[arr*t->n_dim+0]-t->ldscape[dep*t->n_dim+0], */ /* t->ldscape[arr*t->n_dim+1]-t->ldscape[dep*t->n_dim+1]); */ // Update vector of occupation occup[arr]++; /* printf("\n. Remove %d. Add %d and %d",branching_nodes[hit]->num,tree->a_nodes[nd_idx]->num,tree->a_nodes[nd_idx+1]->num); */ // Connect two new nodes to the node undergoing a branching event tree->a_nodes[nd_idx]->v[0] = branching_nodes[hit]; tree->a_nodes[nd_idx+1]->v[0] = branching_nodes[hit]; branching_nodes[hit]->v[1] = tree->a_nodes[nd_idx]; branching_nodes[hit]->v[2] = tree->a_nodes[nd_idx+1]; // update branching_nodes vector. Element 'hit' is being replaced so that the corresponding node can no longer branch out branching_nodes[hit] = tree->a_nodes[nd_idx]; branching_nodes[n_branching_nodes] = tree->a_nodes[nd_idx+1]; // Update t_loc vector. t->idx_loc[tree->a_nodes[nd_idx]->num] = dep; t->idx_loc[tree->a_nodes[nd_idx+1]->num] = arr; // Update total migration rate R = .0; for(i=0;ildscape_sz;i++) { if(occup[i] > 0) { for(j=0;jldscape_sz;j++) { R += occup[i] * t->f_mat[i*t->ldscape_sz+j] * ((occup[j] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum; } } } // Set the time until next branching event time = time + Rexp(R); // Update p_branch vector For(i,n_branching_nodes+1) { dep = t->idx_loc[branching_nodes[i]->num]; p_branch[i] = 0.0; for(j=0;jldscape_sz;j++) { p_branch[i] += t->f_mat[dep*t->ldscape_sz+j] * ((occup[j] == 0) ? (1.0) : (t->lbda)) * t->tau * t->dum / R; /* printf("\n. %f %f %f %f", */ /* R, */ /* t->f_mat[dep*t->ldscape_sz+j], */ /* ((occup[j]>0) ? (t->lbda) : (1.0)), */ /* t->tau); */ } /* printf("\n. %f ",p_branch[i]); */ } // Increase the number of branching nodes by one (you just added 2 new and removed 1 old) n_branching_nodes++; nd_idx += 2; } while(n_branching_nodes < n_otu); // Set the times at the tips For(i,2*tree->n_otu-1) if(tree->times->nd_t[i] < 0.0) tree->times->nd_t[i] = time; // Reverse time scale For(i,2*tree->n_otu-1) tree->times->nd_t[i] -= time; /* For(i,2*tree->n_otu-1) tree->times->nd_t[i] = FABS(tree->times->nd_t[i]); */ // Bubble sort to put all the tips at the top of the tree->a_nodes array do { swap = NO; For(i,2*tree->n_otu-2) { if(!tree->a_nodes[i+1]->v[1] && tree->a_nodes[i]->v[1]) { buff_nd = tree->a_nodes[i+1]; tree->a_nodes[i+1] = tree->a_nodes[i]; tree->a_nodes[i] = buff_nd; buff_t = tree->times->nd_t[i+1]; tree->times->nd_t[i+1] = tree->times->nd_t[i]; tree->times->nd_t[i] = buff_t; buff_l = t->idx_loc[i+1]; t->idx_loc[i+1] = t->idx_loc[i]; t->idx_loc[i] = buff_l; swap = YES; } } } while(swap == YES); // The rest below is just bookeeping... For(i,2*tree->n_otu-1) tree->a_nodes[i]->num = i; For(i,2*tree->n_otu-1) { if(i < tree->n_otu) tree->a_nodes[i]->tax = YES; else tree->a_nodes[i]->tax = NO; } /* printf("\n++++++++++++++++++\n"); */ /* For(i,2*tree->n_otu-1) */ /* { */ /* printf("\n. Node %3d [%p] anc:%3d v1:%3d v2:%3d time: %f", */ /* tree->a_nodes[i]->num, */ /* (void *)tree->a_nodes[i], */ /* tree->a_nodes[i]->v[0] ? tree->a_nodes[i]->v[0]->num : -1, */ /* tree->a_nodes[i]->v[1] ? tree->a_nodes[i]->v[1]->num : -1, */ /* tree->a_nodes[i]->v[2] ? tree->a_nodes[i]->v[2]->num : -1, */ /* tree->times->nd_t[i]); */ /* } */ for(i=0;in_otu;i++) { if(!tree->a_nodes[i]->name) tree->a_nodes[i]->name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); strcpy(tree->a_nodes[i]->name,"x"); sprintf(tree->a_nodes[i]->name+1,"%d",i); } tree->n_root->v[1]->v[0] = tree->n_root->v[2]; tree->n_root->v[2]->v[0] = tree->n_root->v[1]; tree->num_curr_branch_available = 0; Connect_Edges_To_Nodes_Recur(tree->a_nodes[0],tree->a_nodes[0]->v[0],tree); tree->e_root = tree->n_root->v[1]->b[0]; For(i,2*tree->n_otu-3) { tree->a_edges[i]->l->v = FABS(tree->times->nd_t[tree->a_edges[i]->left->num] - tree->times->nd_t[tree->a_edges[i]->rght->num]); } tree->e_root->l->v = FABS(tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]) + FABS(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]); tree->n_root->l[1] = FABS(tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num]); tree->n_root->l[2] = FABS(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]); tree->n_root_pos = FABS(tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num]) / tree->e_root->l->v; /* printf("\n. %s ",Write_Tree(tree)); */ DR_Draw_Tree("essai.ps",tree); /* for(i=0;in_otu;i++) */ /* printf("\n. %4s %4d [%5.2f %5.2f]",tree->a_nodes[i]->name, */ /* t->idx_loc[i], */ /* t->ldscape[t->idx_loc[i]*t->n_dim+0], */ /* t->ldscape[t->idx_loc[i]*t->n_dim+1]); */ Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); Free(branching_nodes); Free(p_branch); Free(p_mig); return(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Simualte n coordinates (in 2D) void GEO_Simulate_Coordinates(int n, t_geo *t) { int i; phydbl width; width = 5.; for(i=0;ildscape[i*t->n_dim+0] = -width/2. + Uni()*width; */ /* t->ldscape[i*t->n_dim+1] = width/2.; */ t->coord_loc[i]->lonlat[0] = -width/2. + Uni()*width; t->coord_loc[i]->lonlat[1] = width/2.; } /* t->ldscape[0*t->n_dim+0] = 0.0; */ /* t->ldscape[0*t->n_dim+1] = 0.0; */ /* t->ldscape[1*t->n_dim+0] = 0.1; */ /* t->ldscape[1*t->n_dim+1] = 0.1; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Optimize_Sigma(t_geo *t, t_tree *tree) { Generic_Brent_Lk(&(t->sigma), t->min_sigma, t->max_sigma, 1.E-5, 1000, NO, GEO_Wrap_Lk,NULL,tree,NULL,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Optimize_Lambda(t_geo *t, t_tree *tree) { Generic_Brent_Lk(&(t->lbda), t->min_lbda, t->max_lbda, 1.E-5, 1000, NO, GEO_Wrap_Lk,NULL,tree,NULL,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Optimize_Tau(t_geo *t, t_tree *tree) { Generic_Brent_Lk(&(t->tau), t->min_tau, t->max_tau, 1.E-5, 1000, NO, GEO_Wrap_Lk,NULL,tree,NULL,NO); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl GEO_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return GEO_Lk(tree->geo,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Init_Geo_Struct(t_geo *t) { t->c_lnL = UNLIKELY; t->sigma = 1.0; t->min_sigma = 1.E-3; t->max_sigma = 1.E+3; t->sigma_thresh = t->max_sigma; t->lbda = 1.0; t->min_lbda = 1.E-3; t->max_lbda = 1.E+3; t->tau = 1.0; t->min_tau = 1.E-3; t->max_tau = 1.E+3; t->dum = 1.0; t->min_dum = 1.E-3; t->max_dum = 1.E+3; t->n_dim = 2; t->ldscape_sz = 1; t->update_fmat = YES; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Randomize_Locations(t_node *n, t_geo *t, t_tree *tree) { if(n->tax == YES) return; else { t_node *v1, *v2; int i; phydbl *probs; // vector of probability of picking each location phydbl sum; phydbl u; probs = (phydbl *)mCalloc(t->ldscape_sz,sizeof(phydbl)); v1 = v2 = NULL; for(i=0;i<3;i++) { if(n->v[i] != n->anc && n->b[i] != tree->e_root) { if(!v1) v1 = n->v[i]; else v2 = n->v[i]; } } if(v1->tax && v2->tax) { Free(probs); return; } else if(v1->tax && !v2->tax && t->idx_loc[v1->num] != t->idx_loc[n->num]) { t->idx_loc[v2->num] = t->idx_loc[n->num]; } else if(v2->tax && !v1->tax && t->idx_loc[v2->num] != t->idx_loc[n->num]) { t->idx_loc[v1->num] = t->idx_loc[n->num]; } else if(v1->tax && !v2->tax && t->idx_loc[v1->num] == t->idx_loc[n->num]) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v2->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v2->num * t->ldscape_sz + i]/sum; t->idx_loc[v2->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); } else if(v2->tax && !v1->tax && t->idx_loc[v2->num] == t->idx_loc[n->num]) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v1->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v1->num * t->ldscape_sz + i]/sum; t->idx_loc[v1->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); } else { int n_v1, n_v2; phydbl p; n_v1 = t->idx_loc_beneath[v1->num * t->ldscape_sz + t->idx_loc[n->num]]; n_v2 = t->idx_loc_beneath[v2->num * t->ldscape_sz + t->idx_loc[n->num]]; if(n_v1 + n_v2 < 1) { PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } p = n_v1 / (n_v1 + n_v2); u = Uni(); if(u < p) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v2->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v2->num * t->ldscape_sz + i]/sum; t->idx_loc[v2->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); t->idx_loc[v1->num] = t->idx_loc[n->num]; } else { if(t->idx_loc_beneath[v2->num * t->ldscape_sz + t->idx_loc[n->num]] > 0) { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v1->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v1->num * t->ldscape_sz + i]/sum; t->idx_loc[v1->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); t->idx_loc[v2->num] = t->idx_loc[n->num]; } else { sum = 0.0; for(i=0;ildscape_sz;i++) sum += t->idx_loc_beneath[v2->num * t->ldscape_sz + i]; for(i=0;ildscape_sz;i++) probs[i] = t->idx_loc_beneath[v2->num * t->ldscape_sz + i]/sum; t->idx_loc[v2->num] = Sample_i_With_Proba_pi(probs,t->ldscape_sz); t->idx_loc[v1->num] = t->idx_loc[n->num]; } } if(t->idx_loc[v1->num] != t->idx_loc[n->num] && t->idx_loc[v2->num] != t->idx_loc[n->num]) { PhyML_Printf("\n. %d %d %d",t->idx_loc[v1->num],t->idx_loc[v2->num],t->idx_loc[n->num]); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(t->idx_loc_beneath[v1->num * t->ldscape_sz + t->idx_loc[v1->num]] < 1) { PhyML_Printf("\n. %d %d %d",t->idx_loc[v1->num],t->idx_loc[v2->num],t->idx_loc[n->num]); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(t->idx_loc_beneath[v2->num * t->ldscape_sz + t->idx_loc[v2->num]] < 1) { PhyML_Printf("\n. %d %d %d",t->idx_loc[v1->num],t->idx_loc[v2->num],t->idx_loc[n->num]); PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } } Free(probs); for(i=0;i<3;i++) if(n->v[i] != n->anc && n->b[i] != tree->e_root) GEO_Randomize_Locations(n->v[i],t,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Get_Locations_Beneath(t_geo *t, t_tree *tree) { int i; GEO_Get_Locations_Beneath_Post(tree->n_root,tree->n_root->v[1],t,tree); GEO_Get_Locations_Beneath_Post(tree->n_root,tree->n_root->v[2],t,tree); for(i=0;ildscape_sz;i++) { t->idx_loc_beneath[tree->n_root->num*t->ldscape_sz+i] = t->idx_loc_beneath[tree->n_root->v[1]->num*t->ldscape_sz+i] + t->idx_loc_beneath[tree->n_root->v[2]->num*t->ldscape_sz+i]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Get_Locations_Beneath_Post(t_node *a, t_node *d, t_geo *t, t_tree *tree) { if(d->tax) { t->idx_loc_beneath[d->num*t->ldscape_sz+t->idx_loc[d->num]] = 1; return; } else { int i; t_node *v1, *v2; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { GEO_Get_Locations_Beneath_Post(d,d->v[i],t,tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) { if(d->v[i] != a && d->b[i] != tree->e_root) { if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } } for(i=0;ildscape_sz;i++) { t->idx_loc_beneath[ d->num*t->ldscape_sz+i] = t->idx_loc_beneath[v1->num*t->ldscape_sz+i] + t->idx_loc_beneath[v2->num*t->ldscape_sz+i] ; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Get_Sigma_Max(t_geo *t) { int i,j; phydbl mean_dist,inv_mean_dist; phydbl sigma_a, sigma_b, sigma_c; phydbl overlap_a, overlap_b, overlap_c; phydbl d_intersect; phydbl overlap_target; phydbl eps; int n_iter,n_iter_max; eps = 1.E-6; overlap_target = 0.95; n_iter_max = 100; mean_dist = -1.; inv_mean_dist = -1.; for(i=0;ildscape_sz-1;i++) { for(j=i+1;jldscape_sz;j++) { /* dist = POW(t->ldscape[i*t->n_dim+0] - t->ldscape[j*t->n_dim+0],1); */ /* if(dist > mean_dist) mean_dist = dist; */ /* dist = POW(t->ldscape[i*t->n_dim+1] - t->ldscape[j*t->n_dim+1],1); */ /* if(dist > mean_dist) mean_dist = dist; */ /* mean_dist += FABS(t->ldscape[i*t->n_dim+0] - t->ldscape[j*t->n_dim+0]); */ /* mean_dist += FABS(t->ldscape[i*t->n_dim+1] - t->ldscape[j*t->n_dim+1]); */ mean_dist += FABS(t->coord_loc[i]->lonlat[0] - t->coord_loc[j]->lonlat[0]); mean_dist += FABS(t->coord_loc[i]->lonlat[1] - t->coord_loc[j]->lonlat[1]); } } mean_dist /= t->ldscape_sz*(t->ldscape_sz-1)/2.; inv_mean_dist = 1./mean_dist; PhyML_Printf("\n. Mean distance between locations: %f",mean_dist); sigma_a = t->min_sigma; sigma_b = 1.0; sigma_c = t->max_sigma; /* sigma_a = t->min_sigma; sigma_b = 1.0; sigma_c = 10.; */ n_iter = 0; do { d_intersect = Inverse_Truncated_Normal(inv_mean_dist,0.0,sigma_a,0.0,mean_dist); overlap_a = (Pnorm(mean_dist,0.0,sigma_a) - Pnorm(d_intersect,0.0,sigma_a))/ (Pnorm(mean_dist,0.0,sigma_a) - Pnorm(0.0,0.0,sigma_a)) + d_intersect / mean_dist; /* printf("\n. inter: %f %f [%f]",d_intersect,mean_dist,d_intersect / mean_dist); */ d_intersect = Inverse_Truncated_Normal(inv_mean_dist,0.0,sigma_b,0.0,mean_dist); overlap_b = (Pnorm(mean_dist,0.0,sigma_b) - Pnorm(d_intersect,0.0,sigma_b))/ (Pnorm(mean_dist,0.0,sigma_b) - Pnorm(0.0,0.0,sigma_b)) + d_intersect / mean_dist; /* printf("\n. inter: %f %f [%f]",d_intersect,mean_dist,d_intersect / mean_dist); */ d_intersect = Inverse_Truncated_Normal(inv_mean_dist,0.0,sigma_c,0.0,mean_dist); overlap_c = (Pnorm(mean_dist,0.0,sigma_c) - Pnorm(d_intersect,0.0,sigma_c))/ (Pnorm(mean_dist,0.0,sigma_c) - Pnorm(0.0,0.0,sigma_c)) + d_intersect / mean_dist; /* printf("\n. inter: %f %f [%f]",d_intersect,mean_dist,d_intersect / mean_dist); */ /* printf("\n. sigma_a:%f overlap_a:%f sigma_b:%f overlap_b:%f sigma_c:%f overlap_c:%f", */ /* sigma_a,overlap_a, */ /* sigma_b,overlap_b, */ /* sigma_c,overlap_c); */ if(overlap_target > overlap_a && overlap_target < overlap_b) { sigma_c = sigma_b; sigma_b = sigma_a + (sigma_c - sigma_a)/2.; } else if(overlap_target > overlap_b && overlap_target < overlap_c) { sigma_a = sigma_b; sigma_b = sigma_a + (sigma_c - sigma_a)/2.; } else if(overlap_target < overlap_a) { sigma_a /= 2.; } else if(overlap_target > overlap_c) { sigma_c *= 2.; } n_iter++; } while(sigma_c - sigma_a > eps && n_iter < n_iter_max); /* if(sigma_c - sigma_a > eps) */ /* { */ /* PhyML_Printf("\n== Error detected in getting maximum value of sigma."); */ /* PhyML_Printf("\n== Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ /* } */ /* else */ /* { */ /* PhyML_Printf("\n== Threshold for sigma: %f",sigma_b); */ /* } */ t->sigma_thresh = sigma_b; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Geo_Updown_Tau_Lbda(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL,new_lnL; phydbl cur_tau,new_tau; phydbl cur_lbda,new_lbda; K = tree->mcmc->tune_move[tree->mcmc->num_move_geo_updown_tau_lbda]; cur_lnL = tree->geo->c_lnL; new_lnL = tree->geo->c_lnL; cur_tau = tree->geo->tau; new_tau = tree->geo->tau; cur_lbda = tree->geo->lbda; new_lbda = tree->geo->lbda; u = Uni(); mult = exp(K*(u-0.5)); /* Multiply tau by K */ new_tau = cur_tau * K; /* Divide lbda by same amount */ new_lbda = cur_lbda / K; if( new_lbda < tree->geo->min_lbda || new_lbda > tree->geo->max_lbda || new_tau < tree->geo->min_tau || new_tau > tree->geo->max_tau ) { tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_tau_lbda]++; return; } tree->geo->tau = new_tau; tree->geo->lbda = new_lbda; if(tree->eval_alnL) new_lnL = GEO_Lk(tree->geo,tree); ratio = 0.0; /* Proposal ratio: 2n-2=> number of multiplications, 1=>number of divisions */ ratio += 0.0*log(mult); /* (1-1)*log(mult); */ /* Likelihood density ratio */ ratio += (new_lnL - cur_lnL); /* printf("\n. new_tau: %f new_lbda:%f cur_lnL:%f new_lnL:%f",new_tau,new_lbda,cur_lnL,new_lnL); */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(u > alpha) /* Reject */ { tree->geo->tau = cur_tau; tree->geo->lbda = cur_lbda; tree->geo->c_lnL = cur_lnL; } else { tree->mcmc->acc_move[tree->mcmc->num_move_geo_updown_tau_lbda]++; } tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_tau_lbda]++; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Geo_Updown_Lbda_Sigma(t_tree *tree) { phydbl K,mult,u,alpha,ratio; phydbl cur_lnL,new_lnL; phydbl cur_lbda,new_lbda; phydbl cur_sigma,new_sigma; K = tree->mcmc->tune_move[tree->mcmc->num_move_geo_updown_lbda_sigma]; cur_lnL = tree->geo->c_lnL; new_lnL = tree->geo->c_lnL; cur_lbda = tree->geo->lbda; new_lbda = tree->geo->lbda; cur_sigma = tree->geo->sigma; new_sigma = tree->geo->sigma; u = Uni(); mult = exp(K*(u-0.5)); /* Multiply lbda by K */ new_lbda = cur_lbda * K; /* Divide sigma by same amount */ new_sigma = cur_sigma / K; if( new_sigma < tree->geo->min_sigma || new_sigma > tree->geo->max_sigma || new_lbda < tree->geo->min_lbda || new_lbda > tree->geo->max_lbda ) { tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_lbda_sigma]++; return; } tree->geo->lbda = new_lbda; tree->geo->sigma = new_sigma; if(tree->eval_alnL) new_lnL = GEO_Lk(tree->geo,tree); ratio = 0.0; /* Proposal ratio: 2n-2=> number of multiplications, 1=>number of divisions */ ratio += 0.0*log(mult); /* (1-1)*log(mult); */ /* Likelihood density ratio */ ratio += (new_lnL - cur_lnL); /* printf("\n. new_lbda: %f new_sigma:%f cur_lnL:%f new_lnL:%f",new_lbda,new_sigma,cur_lnL,new_lnL); */ ratio = exp(ratio); alpha = MIN(1.,ratio); u = Uni(); if(u > alpha) /* Reject */ { tree->geo->lbda = cur_lbda; tree->geo->sigma = cur_sigma; tree->geo->c_lnL = cur_lnL; } else { tree->mcmc->acc_move[tree->mcmc->num_move_geo_updown_lbda_sigma]++; } tree->mcmc->run_move[tree->mcmc->num_move_geo_updown_lbda_sigma]++; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void GEO_Read_In_Landscape(char *file_name, t_geo *t, phydbl **ldscape, int **loc_hash, t_tree *tree) { FILE *fp; char *s; phydbl longitude, lattitude; int tax,loc; PhyML_Printf("\n"); PhyML_Printf("\n. Reading landscape file '%s'.\n",file_name); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); (*ldscape) = (phydbl *)mCalloc(10*t->n_dim,sizeof(phydbl)); (*loc_hash) = (int *)mCalloc(tree->n_otu,sizeof(int)); fp = Openfile(file_name,0); tax = loc = -1; t->ldscape_sz = 0; do { if(fscanf(fp,"%s",s) == EOF) break; if(strlen(s) > 0) for(tax=0;taxn_otu;tax++) if(!strcmp(tree->a_nodes[tax]->name,s)) break; if(tax == tree->n_otu) { PhyML_Printf("\n== Could not find a taxon with name '%s' in the tree provided.",s); /* PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ continue; } /* sscanf(line+pos,"%lf %lf",&longitude,&lattitude); */ if(fscanf(fp,"%lf",&longitude) == EOF) break; if(fscanf(fp,"%lf",&lattitude) == EOF) break; /* printf("\n. s: %s %f %f",s,longitude,lattitude); */ for(loc=0;locldscape_sz;loc++) { if(FABS(longitude-(*ldscape)[loc*t->n_dim+0]) < 1.E-10 && FABS(lattitude-(*ldscape)[loc*t->n_dim+1]) < 1.E-10) { break; } } if(loc == t->ldscape_sz) { t->ldscape_sz++; (*ldscape)[(t->ldscape_sz-1)*t->n_dim+0] = longitude; (*ldscape)[(t->ldscape_sz-1)*t->n_dim+1] = lattitude; if(!(t->ldscape_sz%10)) { (*ldscape) = (phydbl *)mRealloc((*ldscape),(t->ldscape_sz+10)*t->n_dim,sizeof(phydbl)); } } (*loc_hash)[tax] = loc; } while(1); for(tax=0;taxn_otu;tax++) PhyML_Printf("\n. Taxon %30s, longitude: %12f, lattitude: %12f [%4d]", tree->a_nodes[tax]->name, (*ldscape)[(*loc_hash)[tax]*t->n_dim+0], (*ldscape)[(*loc_hash)[tax]*t->n_dim+1], (*loc_hash)[tax]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/geo.h000066400000000000000000000034011422404706600151250ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef GEO_H #define GEO_H #include "utilities.h" int GEO_Main(int argc, char **argv); void Free_Geo(t_geo *t); void GEO_Update_Fmat(t_geo *t); void GEO_Update_Sorted_Nd(t_geo *t,t_tree *tree); void GEO_Update_Occup(t_geo *t,t_tree *tree); void GEO_Update_Rmat(t_node *n,t_geo *t,t_tree *tree); phydbl GEO_Lk(t_geo *t,t_tree *tree); void GEO_Init_Tloc_Tips(t_geo *t,t_tree *tree); phydbl GEO_Total_Migration_Rate(t_node *n,t_geo *t); int GEO_Get_Arrival_Location(t_node *n,t_geo *t,t_tree *tree); void GEO_Simulate_Coordinates(int n, t_geo *t); t_tree *GEO_Simulate(t_geo *t, int n_otu); void GEO_Optimize_Sigma(t_geo *t, t_tree *tree); phydbl GEO_Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); void GEO_Optimize_Lambda(t_geo *t, t_tree *tree); void GEO_Init_Geo_Struct(t_geo *t); void GEO_Optimize_Tau(t_geo *t, t_tree *tree); void GEO_Get_Locations_Beneath(t_geo *t, t_tree *tree); void GEO_Get_Locations_Beneath_Post(t_node *a, t_node *d, t_geo *t, t_tree *tree); void GEO_Randomize_Locations_Pre(t_node *n, t_geo *t, t_tree *tree); void GEO_Randomize_Locations(t_node *n, t_geo *t, t_tree *tree); void GEO_Get_Sigma_Max(t_geo *t); void MCMC_Geo_Updown_Tau_Lbda(t_tree *tree); void MCMC_Geo_Updown_Lbda_Sigma(t_tree *tree); int GEO_Simulate_Estimate(int argc, char **argv); void GEO_Read_In_Landscape(char *file_name, t_geo *t, phydbl **ldscape, int **loc_hash, t_tree *tree); int GEO_Estimate(int argc, char **argv); phydbl *GEO_MCMC(t_tree *tree); #endif phyml-3.3.20220408/src/help.c000066400000000000000000000370721422404706600153110ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "help.h" /* int T_MAX_FILE; */ /* phydbl SMALL; */ /* phydbl UNLIKELY; */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Usage() { char *BOLD=(char *)mCalloc(10,sizeof(char)); char *FLAT=(char *)mCalloc(10,sizeof(char)); char *LINE=(char *)mCalloc(10,sizeof(char)); char *cha; cha = getenv("OS"); if(cha!=NULL) { strcpy(BOLD, ""); strcpy(FLAT, ""); strcpy(LINE, ""); } else { strcpy(BOLD, "\033[00;01m"); strcpy(FLAT, "\033[00;00m"); strcpy(LINE, "\033[00;04m"); } #ifdef PHYML PhyML_Printf("%sNAME\n" "%s\t- PhyML %s - \n\n" "%s\t\''A simple, fast, and accurate algorithm to estimate\n" "%s\tlarge phylogenies by maximum likelihood\''\n\n" "%s\tStephane Guindon and Olivier Gascuel,\n" "%s\tSystematic Biology 52(5):696-704, 2003.\n\n" "%s\tPlease cite this paper if you use this software in your publications.\n",BOLD,FLAT,VERSION,FLAT,FLAT,FLAT,FLAT,FLAT); #endif #ifdef PHYTIME PhyML_Printf("%sNAME\n" "%s\t- PhyTime %s - \n\n" "%s\t'Bayesian estimation of divergence times from large sequence alignments.'\n" "%s\tStephane Guindon,\n" "%s\tMolecular Biology and Evolution 27(8):1768-81, 2010.\n\n" "%s\tPlease cite this paper if you use this software in your publications.\n",BOLD,FLAT,VERSION,FLAT,FLAT,FLAT,FLAT,FLAT); #endif #ifdef PHYML PhyML_Printf("%s\nSYNOPSIS:\n\n" "%s\tphyml %s[command args]\n",BOLD,BOLD,BOLD); #endif #ifdef PHYTIME PhyML_Printf("%s\nSYNOPSIS:\n\n" "%s\tphytime %s[command args]\n",BOLD,BOLD,BOLD); #endif #ifdef PHYML PhyML_Printf("%s\n\tAll the options below are optional (except '%s-i%s' if you want to use the command-line interface).\n\n",FLAT,BOLD,FLAT); #endif #ifdef PHYTIME PhyML_Printf("%s\n\tAll the options below are optional except '%s-i%s','%s-u%s' and '%s--calibration%s'.\n\n",FLAT,BOLD,FLAT,BOLD,FLAT,BOLD,FLAT); #endif PhyML_Printf("%s\nCommand options:\n%s",BOLD,FLAT); PhyML_Printf("\n\t%s-i (or --input) %sseq_file_name%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sseq_file_name%s is the name of the nucleotide or amino-acid sequence file in PHYLIP format.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-d (or --datatype) ""%sdata_type%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sdata_type%s is 'nt' for nucleotide (default), 'aa' for amino-acid sequences, or 'generic',\n",LINE,FLAT); PhyML_Printf("\t\t(use NEXUS file format and the 'symbols' parameter here).\n"); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-q (or --sequential)\n",BOLD); PhyML_Printf("%s\t\tChanges interleaved format (default) to sequential format.\n",FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-n (or --multiple) ""%snb_data_sets%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%snb_data_sets%s is an integer corresponding to the number of data sets to analyse.\n",LINE,FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t-p (or --pars)%s\n",BOLD,FLAT); PhyML_Printf("%s\t\tUse a minimum parsimony starting tree. This option is taken into account when the '-u' option\n",FLAT); PhyML_Printf("%s\t\tis absent and when tree topology modifications are to be done.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t-b (or --bootstrap) %sint%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sint%s > 0: %sint%s is the number of bootstrap replicates.\n",LINE,FLAT,LINE,FLAT); PhyML_Printf("\t\t%sint%s = 0: neither approximate likelihood ratio test nor bootstrap values are computed.\n",LINE,FLAT); PhyML_Printf("\t\t%sint%s = -1: approximate likelihood ratio test returning aLRT statistics.\n",LINE,FLAT); PhyML_Printf("\t\t%sint%s = -2: approximate likelihood ratio test returning Chi2-based parametric branch supports.\n",LINE,FLAT); /* PhyML_Printf("\t\t%sint%s = -3 : minimum of Chi2-based parametric and SH-like branch supports.\n",LINE,FLAT); */ PhyML_Printf("\t\t%sint%s = -4: SH-like branch supports alone.\n",LINE,FLAT); PhyML_Printf("\t\t%sint%s = -5: (default) approximate Bayes branch supports.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--tbe%s\n",BOLD,FLAT); PhyML_Printf("\t\tComputes TBE instead of FBP (standard) bootstrap support\n"); PhyML_Printf("\t\tHas no effect with -b <= 0\n"); #endif PhyML_Printf("%s\n\t-m (or --model) %smodel%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tmodel%s : substitution model name.\n",FLAT); PhyML_Printf("\t\t%s- %sNucleotide%s-based models : %sHKY85%s (default) | %sJC69%s | %sK80%s | %sF81%s | %sF84%s \n", FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t %sTN93%s | %sGTR%s | %scustom (*)%s\n", LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t(*) : for the custom option, a string of six digits identifies the model. For instance, 000000\n"); PhyML_Printf("\t\t corresponds to F81 (or JC69 provided the distribution of nucleotide frequencies is uniform).\n"); PhyML_Printf("\t\t 012345 corresponds to GTR. This option can be used for encoding any model that is a nested within GTR.\n"); PhyML_Printf("\n"); PhyML_Printf("\t\t%s- %sAmino-acid%s based models : %sLG%s (default) | %sWAG%s | %sJTT%s | %sMtREV%s | %sDayhoff%s | %sDCMut%s \n",FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t %sRtREV%s | %sCpREV%s | %sVT%s | %sAB%s | %sBlosum62%s | %sMtMam%s | %sMtArt%s\n", LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\t\t %sHIVw%s | %sHIVb%s | %scustom%s\n", LINE,FLAT, LINE,FLAT, LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--aa_rate_file %sfilename%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sfilename%s is the name of the file that provides the amino acid substitution rate matrix in PAML format.\n",LINE,FLAT); PhyML_Printf("\t\tIt is compulsory to use this option when analysing amino acid sequences with the `custom' model.\n"); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-f %se%s, %sm%s, %so%s or %sfA,fC,fG,fT%s\n",BOLD,LINE,BOLD,LINE,BOLD,LINE,FLAT); PhyML_Printf("\t\t%se%s : the character frequencies are determined by counting the number of amino-acids \n",LINE,FLAT); PhyML_Printf("\t\t or nucleotides from the sequence alignment. \n"); PhyML_Printf("\n"); PhyML_Printf("\t\t%sm%s : the character frequencies are determined as follows : \n",LINE,FLAT); PhyML_Printf("%s\t\t- %sNucleotide%s sequences: the equilibrium base frequencies are optimized using maximum likelihood.\n",FLAT,LINE,FLAT); PhyML_Printf("%s\t\t- %sAmino-acid%s sequences: the equilibrium amino-acid frequencies are estimated using\n" "\t\t the frequencies defined by the substitution model.\n",FLAT,LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("\t\t%so%s : the character frequencies (amino-acids or nucleotides) are optimized using maximum likelihood \n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("\t\t%sfA,fC,fG,fT%s : only valid for nucleotide-based models. fA, fC, fG and fT are floating numbers that \n",LINE,FLAT); PhyML_Printf("\t\t correspond to the frequencies of A, C, G and T respectively (WARNING: do not use any blank space between\n"); PhyML_Printf("\t\t your values of nucleotide frequencies, only commas!)\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--calibration %sfilename%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sfilename%s is the name of the calibration file that provides a priori defined boundaries for node ages.\n",LINE,FLAT); PhyML_Printf("\t\tPlease read the manual for more information about the format of this file.\n"); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t-t (or --ts/tv) %sts/tv_ratio%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tts/tv_ratio%s : transition/transversion ratio. DNA sequences only.\n",FLAT); PhyML_Printf("\t\tCan be a fixed positive value (ex:4.0) or %se%s to get the maximum likelihood estimate.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-v (or --pinv) %sprop_invar%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tprop_invar%s : proportion of invariable sites.\n",FLAT); PhyML_Printf("\t\tCan be a fixed value in the [0,1] range or %se%s to get the maximum likelihood estimate.\n",LINE,FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-c (or --nclasses) %snb_subst_cat%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tnb_subst_cat%s : number of relative substitution rate categories. Default : %snb_subst_cat%s=4.\n", FLAT,LINE,FLAT); PhyML_Printf("\t\tMust be a positive integer.\n"); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--freerates (or --free_rates or --freerate or --free_rate)\n",BOLD); PhyML_Printf("\t\t%s FreeRate model of substitution rate variation across sites.\n",FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t-a (or --alpha) %sgamma%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tgamma%s : distribution of the gamma distribution shape parameter.\n",FLAT); PhyML_Printf("\t\tCan be a fixed positive value or %se%s to get the maximum likelihood estimate.\n",LINE,FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-s (or --search) %smove%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t Deprecated option.\n"); PhyML_Printf("\t\tTree topology search operation option.\n"); PhyML_Printf("\t\tCan be either %sNNI%s (default, fast) or %sSPR%s (a bit slower than NNI) or %sBEST%s (best of NNI and SPR search).\n",LINE,FLAT,LINE,FLAT,LINE,FLAT); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t-u (or --inputtree) %suser_tree_file%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tuser_tree_file%s : starting tree filename. The tree must be in Newick format.\n",FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t-o %sparams%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tThis option focuses on specific parameter optimisation.\n"); PhyML_Printf("\t\t%sparams%s=tlr : tree topology (t), branch length (l) and rate parameters (r) are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=tl : tree topology and branch length are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=lr : branch length and rate parameters are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=l : branch length are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=r : rate parameters are optimised.\n",LINE,FLAT); PhyML_Printf("\t\t%sparams%s=n : no parameter is optimised.\n",LINE,FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--rand_start%s\n",BOLD,FLAT); PhyML_Printf("\t\tThis option sets the initial tree to random.\n"); PhyML_Printf("\t\tIt is only valid if SPR searches are to be performed.\n"); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--n_rand_starts %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tnum%s is the number of initial random trees to be used.\n",FLAT); PhyML_Printf("\t\tIt is only valid if SPR searches are to be performed.\n"); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t--r_seed %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tnum%s is the seed used to initiate the random number generator.\n",FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t--print_site_lnl%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sPrint the likelihood for each site in file *_phyml_lk.txt.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--print_trace%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sPrint each phylogeny explored during the tree search process\n",FLAT); PhyML_Printf("\t\t%sin file *_phyml_trace.txt.\n",FLAT); PhyML_Printf("\n"); #endif PhyML_Printf("%s\n\t--run_id %sID_string%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%sAppend the string %sID_string%s at the end of each PhyML output file.\n",FLAT,LINE,FLAT); PhyML_Printf("\t\t%sThis option may be useful when running simulations involving PhyML.\n",FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--quiet%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sNo interactive question (for running in batch mode) and quiet output.\n",FLAT); PhyML_Printf("\n"); PhyML_Printf("%s\n\t--no_memory_check%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sNo interactive question for memory usage (for running in batch mode). Normal output otherwise.\n",FLAT); PhyML_Printf("\n"); #ifndef PHYTIME PhyML_Printf("%s\n\t--leave_duplicates%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sPhyML removes duplicate sequences by default. Use this option to leave them in.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--alias_subpatt%s\n",BOLD,FLAT); PhyML_Printf("\t\t%sSite aliasing is generalized at the subtree level. Sometimes lead to faster calculations.\n",FLAT); PhyML_Printf("\t\t%sSee Kosakovsky Pond SL, Muse SV, Sytematic Biology (2004) for an example.\n",FLAT); PhyML_Printf("\n"); #endif #ifndef PHYTIME PhyML_Printf("%s\n\t--boot_progress_display %snum%s (default=20)\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%snum%s is the frequency at which the bootstrap progress bar will be updated.\n",LINE,FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--chain_len %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\t%snum%s is the number of generations or runs of the Markov Chain Monte Carlo. Set to 1E+6 by default. \n",LINE,FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #endif /* #ifdef PHYTIME */ /* PhyML_Printf("%s\n\t--burnin %snum%s\n",BOLD,LINE,FLAT); */ /* PhyML_Printf("\t\t%snum%s is the number of generations of runs of the Markov Chain Monte Carlo during the 'burnin' period.\n",LINE,FLAT); */ /* PhyML_Printf("\t\t%sSet to 1E+5 by default. Must be an integer. \n",FLAT); */ /* PhyML_Printf("\n"); */ /* #endif */ #ifdef PHYTIME PhyML_Printf("%s\n\t--sample_freq %snum%s\n",BOLD,LINE,FLAT); PhyML_Printf("\t\tThe chain is sampled every %snum%s generations. Set to 1E+3 by default. \n",LINE,FLAT); PhyML_Printf("\t\tMust be an integer.\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--no_sequences%s\n",BOLD,FLAT); PhyML_Printf("\t\tUse this option to run the sampler without sequence data.\n"); PhyML_Printf("\n"); #endif #ifdef PHYTIME PhyML_Printf("%s\n\t--fastlk%s\n",BOLD,FLAT); PhyML_Printf("\t\tUse the multivariate normal approximation to the likelihood and speed up calculations\n"); PhyML_Printf("\n"); #endif #ifdef PHYML PhyML_Printf("%sPHYLIP-LIKE INTERFACE\n""%s\n\tYou can also use PhyML with no argument, in this case change the value of\n",BOLD,FLAT); PhyML_Printf("%s\ta parameter by typing its corresponding character as shown on screen.\n\n",FLAT); #endif #ifdef PHYML PhyML_Printf("%sEXAMPLES\n\n" "%s\tDNA interleaved sequence file, default parameters : ""%s ./phyml -i seqs1" "%s\n\tAA interleaved sequence file, default parameters : ""%s ./phyml -i seqs2 -d aa" "%s\n\tAA sequential sequence file, with customization : ""%s ./phyml -i seqs3 -q -d aa -m JTT -c 4 -a e%s\n",BOLD,FLAT,BOLD,FLAT,BOLD,FLAT,BOLD,FLAT); #endif Exit(""); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/help.h000066400000000000000000000007351422404706600153120ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef OPTIONS_H #define OPTIONS_H #include "utilities.h" #include "cl.h" #include "models.h" #include "free.h" #include "interface.h" void Usage(); #endif phyml-3.3.20220408/src/init.c000066400000000000000000005615111422404706600153240ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "init.h" #ifdef BEAGLE #include "beagle_utils.h" #endif void Init_Eigen_Struct(eigen *this) { this->next = NULL; this->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Scalar_Dbl(scalar_dbl *p) { p->v = -1.; p->onoff = ON; p->next = NULL; p->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Scalar_Int(scalar_int *p) { p->v = -1.; p->next = NULL; p->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Vect_Dbl(int len, vect_dbl *p) { p->len = len; p->next = NULL; p->prev = NULL; p->v = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Vect_Int(int len, vect_int *p) { p->len = len; p->next = NULL; p->prev = NULL; p->v = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_String(t_string *ts) { ts->len = -1.; ts->next = NULL; ts->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Efrq(phydbl *b_frq, t_efrq *f) { f->next = NULL; f->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tree(t_tree *tree, int n_otu) { tree->n_otu = n_otu; tree->mat = NULL; tree->n_root = NULL; tree->e_root = NULL; tree->ps_tree = NULL; tree->short_l = NULL; tree->mutmap = NULL; tree->next = NULL; tree->prev = NULL; tree->next = NULL; tree->prev = NULL; tree->mixt_tree = NULL; tree->geo = NULL; tree->xml_root = NULL; tree->aux_tree = NULL; tree->verbose = VL3; tree->edge_list = NULL; tree->node_list = NULL; tree->is_mixt_tree = NO; tree->tree_num = 0; tree->depth_curr_path = 0; tree->has_bip = NO; tree->n_moves = 0; tree->bl_from_node_stamps = 0; tree->lock_topo = NO; tree->ps_page_number = 0; tree->init_lnL = UNLIKELY; tree->best_lnL = UNLIKELY; tree->old_lnL = UNLIKELY; tree->c_lnL = UNLIKELY; tree->p_lnL = UNLIKELY; tree->sum_min_sum_scale = .0; tree->n_swap = 0; tree->best_pars = 1E+5; tree->n_pattern = -1; tree->n_root_pos = -1.; tree->print_labels = YES; tree->write_br_lens = YES; tree->num_curr_branch_available = 0; tree->tip_order_score = .0; tree->write_tax_names = YES; tree->update_alias_subpatt = NO; tree->bl_ndigits = 8; tree->n_short_l = 100; tree->norm_scale = 0.0; tree->br_len_recorded = NO; tree->apply_lk_scaling = YES; tree->dp = 0; tree->ignore_root = YES; tree->ignore_mixt_info = NO; tree->annealing_temp = 0.; tree->both_sides = NO; tree->json_num = 0; tree->update_eigen_lr = NO; tree->use_eigen_lr = NO; tree->eval_alnL = YES; tree->eval_rlnL = YES; tree->eval_glnL = YES; tree->scaling_method = NO; tree->perform_spr_right_away = YES; tree->tip_root = 0; tree->n_edges_traversed = 0; tree->fully_nni_opt = NO; tree->n_tot_bl_opt = 0; tree->numerical_warning = NO; #ifdef BEAGLE tree->b_inst = UNINITIALIZED; #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Edge_Light(t_edge *b, int num) { b->num = num; b->bip_score = 0; b->tdist_score = .0; b->dist_btw_edges = .0; b->topo_dist_btw_edges = 0; b->has_zero_br_len = NO; b->n_jumps = 0; b->l_var->v = -1.; b->does_exist = YES; b->l->v = -1.; b->bin_cod_num = -1.; b->l->onoff = ON; b->next = NULL; b->prev = NULL; b->next_mixt = NULL; b->prev_mixt = NULL; b->p_lk_left = NULL; b->p_lk_rght = NULL; b->p_lk_loc_left = NULL; b->p_lk_loc_rght = NULL; b->Pij_rr = NULL; b->label = NULL; b->pars_l = NULL; b->pars_r = NULL; b->ui_l = NULL; b->ui_r = NULL; b->p_pars_l = NULL; b->p_pars_r = NULL; b->n_diff_states_l = NULL; b->n_diff_states_r = NULL; b->update_partial_lk_left = YES; b->update_partial_lk_rght = YES; #ifdef BEAGLE b->p_lk_left_idx = num; b->p_lk_rght_idx = UNINITIALIZED; //Will be initialized later when the total number of branches is known (i.e. in Make_Tree_From_Scratch()) b->Pij_rr_idx = num; b->p_lk_tip_idx = UNINITIALIZED; //Will be initialized later only if this branch is connected to a tip #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Node_Light(t_node *n, int num) { n->num = num; n->tax = -1; n->dist_to_root = .0; n->common = 1; n->ext_node = NULL; n->name = NULL; n->ori_name = NULL; n->c_seq = NULL; n->c_seq_anc = NULL; n->y_rank = 0.; n->y_rank_ori = 0.; n->y_rank_max = 0.; n->y_rank_min = 0.; n->anc = NULL; n->b_anc = NULL; n->rank = 0; n->match_node = NULL; n->id_rank = 0; n->next = NULL; n->prev = NULL; n->n_cal = 0; n->ldsk = NULL; n->rk_next = NULL; n->rk_prev = NULL; n->label = NULL; /* n->next = NULL; */ /* n->prev = NULL; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_NNI(t_nni *a_nni) { a_nni->left = NULL; a_nni->rght = NULL; a_nni->b = NULL; a_nni->init_l = NULL; a_nni->init_v = NULL; a_nni->init_lk = .0; a_nni->score = +1.0; a_nni->best_l = NULL; a_nni->best_v = NULL; a_nni->swap_node_v1 = NULL; a_nni->swap_node_v2 = NULL; a_nni->swap_node_v3 = NULL; a_nni->swap_node_v4 = NULL; a_nni->lk0 = UNLIKELY; a_nni->lk1 = UNLIKELY; a_nni->lk2 = UNLIKELY; a_nni->l0 = NULL; a_nni->l1 = NULL; a_nni->l2 = NULL; a_nni->v0 = NULL; a_nni->v1 = NULL; a_nni->v2 = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Nexus_Format(nexcom **com) { /*****************************/ strcpy(com[0]->name,"dimensions"); com[0]->nparm = 2; com[0]->nxt_token_t = NEXUS_PARM; com[0]->cur_token_t = NEXUS_COM; com[0]->parm[0] = Make_Nexus_Parm(); strcpy(com[0]->parm[0]->name,"ntax"); com[0]->parm[0]->fp = Read_Nexus_Dimensions; com[0]->parm[0]->com = com[0]; com[0]->parm[0]->nxt_token_t = NEXUS_EQUAL; com[0]->parm[0]->cur_token_t = NEXUS_PARM; com[0]->parm[1] = Make_Nexus_Parm(); strcpy(com[0]->parm[1]->name,"nchar"); com[0]->parm[1]->fp = Read_Nexus_Dimensions; com[0]->parm[1]->com = com[0]; com[0]->parm[1]->nxt_token_t = NEXUS_EQUAL; com[0]->parm[1]->cur_token_t = NEXUS_PARM; /*****************************/ strcpy(com[1]->name,"format"); com[1]->nparm = 11; com[1]->nxt_token_t = NEXUS_PARM; com[1]->cur_token_t = NEXUS_COM; com[1]->parm[0] = Make_Nexus_Parm(); strcpy(com[1]->parm[0]->name,"datatype"); com[1]->parm[0]->fp = Read_Nexus_Format; com[1]->parm[0]->com = com[1]; com[1]->parm[0]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[0]->cur_token_t = NEXUS_PARM; com[1]->parm[1] = Make_Nexus_Parm(); strcpy(com[1]->parm[1]->name,"respectcase"); com[1]->parm[1]->fp = Read_Nexus_Format; com[1]->parm[1]->com = com[1]; com[1]->parm[1]->nxt_token_t = NEXUS_PARM; com[1]->parm[1]->cur_token_t = NEXUS_VALUE; com[1]->parm[2] = Make_Nexus_Parm(); strcpy(com[1]->parm[2]->name,"missing"); com[1]->parm[2]->fp = Read_Nexus_Format; com[1]->parm[2]->com = com[1]; com[1]->parm[2]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[2]->cur_token_t = NEXUS_PARM; com[1]->parm[3] = Make_Nexus_Parm(); strcpy(com[1]->parm[3]->name,"gap"); com[1]->parm[3]->fp = Read_Nexus_Format; com[1]->parm[3]->com = com[1]; com[1]->parm[3]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[3]->cur_token_t = NEXUS_PARM; com[1]->parm[4] = Make_Nexus_Parm(); strcpy(com[1]->parm[4]->name,"symbols"); com[1]->parm[4]->fp = Read_Nexus_Format; com[1]->parm[4]->com = com[1]; com[1]->parm[4]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[4]->cur_token_t = NEXUS_PARM; com[1]->parm[5] = Make_Nexus_Parm(); strcpy(com[1]->parm[5]->name,"equate"); com[1]->parm[5]->fp = Read_Nexus_Format; com[1]->parm[5]->com = com[1]; com[1]->parm[5]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[5]->cur_token_t = NEXUS_PARM; com[1]->parm[6] = Make_Nexus_Parm(); strcpy(com[1]->parm[6]->name,"matchchar"); com[1]->parm[6]->fp = Read_Nexus_Format; com[1]->parm[6]->com = com[1]; com[1]->parm[6]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[6]->cur_token_t = NEXUS_PARM; com[1]->parm[7] = Make_Nexus_Parm(); strcpy(com[1]->parm[7]->name,"transpose"); com[1]->parm[7]->fp = Read_Nexus_Format; com[1]->parm[7]->com = com[1]; com[1]->parm[7]->nxt_token_t = NEXUS_PARM; com[1]->parm[7]->cur_token_t = NEXUS_VALUE; com[1]->parm[8] = Make_Nexus_Parm(); strcpy(com[1]->parm[8]->name,"interleave"); com[1]->parm[8]->fp = Read_Nexus_Format; com[1]->parm[8]->com = com[1]; com[1]->parm[8]->nxt_token_t = NEXUS_PARM; com[1]->parm[8]->cur_token_t = NEXUS_VALUE; com[1]->parm[9] = Make_Nexus_Parm(); strcpy(com[1]->parm[9]->name,"items"); com[1]->parm[9]->fp = Read_Nexus_Format; com[1]->parm[9]->com = com[1]; com[1]->parm[9]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[9]->cur_token_t = NEXUS_PARM; com[1]->parm[10] = Make_Nexus_Parm(); strcpy(com[1]->parm[10]->name,"statesformat"); com[1]->parm[10]->fp = Read_Nexus_Format; com[1]->parm[10]->com = com[1]; com[1]->parm[10]->nxt_token_t = NEXUS_EQUAL; com[1]->parm[10]->cur_token_t = NEXUS_PARM; /*****************************/ strcpy(com[2]->name,"eliminate"); com[2]->nparm = 0; com[2]->nxt_token_t = NEXUS_VALUE; com[2]->cur_token_t = NEXUS_COM; /*****************************/ strcpy(com[3]->name,"taxlabels"); com[3]->nparm = 0; com[3]->nxt_token_t = -1; com[3]->cur_token_t = -1; /*****************************/ strcpy(com[4]->name,"charstatelabels"); com[4]->nparm = 0; com[4]->nxt_token_t = -1; com[4]->cur_token_t = -1; /*****************************/ strcpy(com[5]->name,"charlabels"); com[5]->nparm = 0; com[5]->nxt_token_t = -1; com[5]->cur_token_t = -1; /*****************************/ strcpy(com[6]->name,"statelabels"); com[6]->nparm = 0; com[6]->nxt_token_t = -1; com[6]->cur_token_t = -1; /*****************************/ strcpy(com[7]->name,"matrix"); com[7]->nparm = 1; com[7]->nxt_token_t = NEXUS_COM; com[7]->cur_token_t = NEXUS_VALUE; /* This will allow us to skip directly to the matrix reading function */ com[7]->parm[0] = Make_Nexus_Parm(); strcpy(com[7]->parm[0]->name,"matrix"); com[7]->parm[0]->fp = Read_Nexus_Matrix; com[7]->parm[0]->com = com[7]; com[7]->parm[0]->nxt_token_t = NEXUS_COM; com[7]->parm[0]->cur_token_t = -1; /*****************************/ strcpy(com[8]->name,"begin"); com[8]->nparm = 3; com[8]->nxt_token_t = NEXUS_PARM; com[8]->cur_token_t = NEXUS_COM; com[8]->parm[0] = Make_Nexus_Parm(); strcpy(com[8]->parm[0]->name,"data"); com[8]->parm[0]->fp = Read_Nexus_Begin; com[8]->parm[0]->com = com[8]; com[8]->parm[0]->nxt_token_t = NEXUS_COM; com[8]->parm[0]->cur_token_t = NEXUS_PARM; com[8]->parm[1] = Make_Nexus_Parm(); strcpy(com[8]->parm[1]->name,"trees"); com[8]->parm[1]->fp = Read_Nexus_Begin; com[8]->parm[1]->com = com[8]; com[8]->parm[1]->nxt_token_t = NEXUS_COM; com[8]->parm[1]->cur_token_t = NEXUS_PARM; com[8]->parm[2] = Make_Nexus_Parm(); strcpy(com[8]->parm[2]->name,"taxa"); com[8]->parm[2]->fp = Read_Nexus_Taxa; com[8]->parm[2]->com = com[8]; com[8]->parm[2]->nxt_token_t = NEXUS_COM; com[8]->parm[2]->cur_token_t = NEXUS_VALUE; /*****************************/ strcpy(com[9]->name,"end"); com[9]->nparm = 0; com[9]->nxt_token_t = -1; com[9]->cur_token_t = -1; /*****************************/ strcpy(com[10]->name,"translate"); com[10]->nparm = 1; com[10]->nxt_token_t = NEXUS_COM; com[10]->cur_token_t = NEXUS_VALUE; com[10]->parm[0] = Make_Nexus_Parm(); strcpy(com[10]->parm[0]->name,"translate"); com[10]->parm[0]->fp = Read_Nexus_Translate; com[10]->parm[0]->com = com[10]; com[10]->parm[0]->nxt_token_t = NEXUS_COM; com[10]->parm[0]->cur_token_t = -1; /*****************************/ strcpy(com[11]->name,"tree"); com[11]->nparm = 1; com[11]->nxt_token_t = NEXUS_COM; com[11]->cur_token_t = NEXUS_VALUE; com[11]->parm[0] = Make_Nexus_Parm(); strcpy(com[11]->parm[0]->name,"tree"); com[11]->parm[0]->fp = Read_Nexus_Tree; com[11]->parm[0]->com = com[11]; com[11]->parm[0]->nxt_token_t = -1; com[11]->parm[0]->cur_token_t = -1; /*****************************/ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Mat(matrix *mat, calign *data) { int i; mat->n_otu = data->n_otu; mat->r = mat->n_otu; mat->curr_int = mat->n_otu; mat->method = 1; for(i=0;in_otu;i++) { strcpy(mat->name[i],data->c_seq[i]->name); mat->on_off[i] = 1; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Input(option* io) { io->fp_in_align = NULL; io->fp_in_tree = NULL; io->fp_in_constraint_tree = NULL; io->fp_out_tree = NULL; io->fp_out_trees = NULL; io->fp_out_boot_tree = NULL; io->fp_out_boot_stats = NULL; io->fp_out_stats = NULL; io->fp_out_ancestral_seq = NULL; io->fp_out_ancestral_tree = NULL; io->fp_in_coord = NULL; io->fp_out_trace = NULL; io->fp_weight_file = NULL; io->fp_out_json_trace = NULL; io->fp_out_lk = NULL; io->fp_out_trace = NULL; io->long_tax_names = NULL; io->short_tax_names = NULL; io->lon = NULL; io->lat = NULL; io->z_scores = NULL; io->cstr_tree = NULL; io->next = NULL; io->prev = NULL; io->tree = NULL; io->mod = NULL; strcpy(io->nt_or_cd,"nucleotides"); io->tbe_bootstrap = NO; io->n_data_sets = 1; io->interleaved = 1; io->in_tree = 0; io->out_tree_file_open_mode = 1; io->out_stats_file_open_mode = 1; io->init_len = -1; io->n_otu = -1; io->n_data_set_asked = -1; io->print_boot_trees = 1; io->n_part = 1; io->ratio_test = ABAYES; io->multigene = 0; io->config_multigene = 0; io->curr_interface = 0; io->r_seed = -1; io->collapse_boot = 0; io->random_boot_seq_order = YES; io->print_trace = NO; io->print_json_trace = NO; io->print_site_lnl = NO; io->m4_model = NO; io->rm_ambigu = NO; io->append_run_ID = NO; io->quiet = NO; io->datatype = NT; io->colalias = YES; io->data_file_format = PHYLIP; io->tree_file_format = PHYLIP; io->boot_prog_every = 20; io->mem_question = YES; io->do_alias_subpatt = NO; io->lk_approx = EXACT; io->codpos = -1; io->mutmap = NO; io->state_len = 1; io->ancestral = NO; io->use_xml = NO; io->has_io_weights = NO; io->do_boot = NO; io->do_alrt = YES; io->do_tbe = NO; io->print_node_num = NO; io->print_support_val = NO; io->n_boot_replicates = 0; io->print_mat_and_exit = NO; #ifdef BEAGLE io->beagle_resource = 0; #endif io->precision = 0; MCMC_Init_MCMC_Struct(NULL,io,io->mcmc); RATES_Init_Rate_Struct(io->rates,NULL,-1); io->rates->model_id = LOGNORMAL; TIMES_Init_Time_Struct(io->times,NULL,-1); io->times->model_id = COALESCENT; io->times->coalescent_model_id = STRICTCOALESCENT; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Rmat(t_rmat *rmat) { rmat->n_diff_rr = 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Model(t_mod *mod) { Set_Defaults_Ras(mod->ras); strcpy(mod->modelname->s,"HKY85"); strcpy(mod->custom_mod_string->s,"000000"); mod->next = NULL; mod->prev = NULL; mod->next_mixt = NULL; mod->prev_mixt = NULL; mod->r_mat = NULL; mod->e_frq = NULL; mod->whichmodel = HKY85; mod->n_mixt_classes = 0; mod->mod_num = 0; mod->update_eigen = NO; mod->is_mixt_mod = NO; mod->kappa->v = 4.0; mod->lambda->v = 1.0; mod->l_var_sigma = 1.E-2; mod->e_frq_weight->v = 1.0; mod->r_mat_weight->v = 1.0; mod->ns = 4; mod->use_m4mod = NO; mod->ras->gamma_median = NO; mod->m4mod = NULL; /* mod->r_mat->n_diff_rr = 0; */ /* mod->r_mat->rr = NULL; */ /* mod->r_mat->rr_val = NULL; */ /* mod->r_mat->n_rr_per_cat = NULL; */ mod->io = NULL; mod->log_l = NO; mod->gamma_mgf_bl = NO; mod->br_len_mult->v = 1.0; #if !(defined PHYTIME || defined PHYREX) mod->l_min = 1.E-8; mod->l_max = 100.0; #else mod->l_min = 1.E-8; mod->l_max = 1.E+3; #endif mod->l_var_min = mod->l_min; mod->l_var_max = mod->l_max; mod->br_len_mult->v = 1.0; mod->br_len_mult_unscaled->v = 1.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Ras(t_ras *ras) { ras->n_catg = 4; ras->normalise_rr = YES; ras->pinvar->v = 0.0; ras->alpha->v = 1.0; ras->invar = NO; ras->free_mixt_rates = NO; ras->parent_class_number = 0; ras->init_r_proba = YES; ras->init_rr = YES; ras->sort_rate_classes = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Set_Defaults_Optimiz(t_opt *s_opt) { s_opt->last_opt = YES; s_opt->opt_subst_param = YES; s_opt->opt_alpha = YES; s_opt->opt_kappa = YES; s_opt->opt_bl = YES; s_opt->opt_lambda = NO; s_opt->opt_pinvar = NO; s_opt->opt_cov_delta = NO; s_opt->opt_cov_alpha = NO; s_opt->opt_cov_free_rates = NO; s_opt->opt_rr = NO; s_opt->init_lk = UNLIKELY; s_opt->n_it_max = 1000; s_opt->opt_topo = YES; s_opt->topo_search = NNI_MOVE; s_opt->random_input_tree = 0; s_opt->n_rand_starts = 5; s_opt->brent_it_max = BRENT_IT_MAX; s_opt->steph_spr = YES; s_opt->opt_br_len_mult = NO; s_opt->min_n_triple_moves = 20; s_opt->max_rank_triple_move = 0; s_opt->n_improvements = 0; s_opt->max_spr_depth = 0; s_opt->opt_clock_r = YES; s_opt->min_diff_lk_local = 1.E-03; s_opt->min_diff_lk_global = 1.E-03; s_opt->min_diff_lk_move = 1.E-03; s_opt->p_moves_to_examine = 0.15; s_opt->fast_nni = NO; s_opt->greedy = NO; s_opt->general_pars = NO; s_opt->tree_size_mult = 1; s_opt->opt_five_branch = YES; s_opt->nni_br_len_opt = YES; s_opt->pars_thresh = 5; s_opt->hybrid_thresh = NO; s_opt->quickdirty = NO; s_opt->spr_pars = YES; s_opt->spr_lnL = NO; s_opt->min_depth_path = 0; s_opt->eval_list_regraft = NO; s_opt->max_depth_path = 2000; s_opt->deepest_path = 2000; s_opt->max_delta_lnL_spr = 2000000.; s_opt->max_delta_lnL_spr_current = 0.0; s_opt->worst_lnL_spr = BIG; s_opt->br_len_in_spr = 10; s_opt->opt_free_mixt_rates = YES; s_opt->constrained_br_len = NO; s_opt->opt_gamma_br_len = NO; s_opt->first_opt_free_mixt_rates = YES; s_opt->wim_n_rgrft = -1; s_opt->wim_n_globl = -1; s_opt->wim_max_dist = -1; s_opt->wim_n_optim = -1; s_opt->wim_n_best = -1; s_opt->wim_inside_opt = 0; s_opt->opt_rmat_weight = NO; s_opt->opt_efrq_weight = NO; s_opt->skip_tree_traversal = NO; s_opt->serial_free_rates = YES; s_opt->curr_opt_free_rates = NO; s_opt->state_freq = EMPIRICAL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Init_Attribute(xml_attr *attr) { } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void XML_Init_Node(xml_node *parent, xml_node *new_node, char *name) { if(name) strcpy(new_node->name,name); new_node->parent = parent ? parent : NULL; new_node->next = NULL; new_node->prev = NULL; new_node->child = NULL; new_node->ds->obj = NULL; new_node->ds->next = NULL; if(parent) { if(!parent->child) { parent->child = new_node; } else { xml_node *node = parent->child; while(node->next) node = node->next; node->next = new_node; new_node->prev = node; } } new_node->attr = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void RATES_Init_Rate_Struct(t_rate *rates, t_rate *existing_rates, int n_otu) { int i; if(existing_rates && existing_rates->model_id != -1) { rates->model_id = existing_rates->model_id; } else { rates->model_id = NONE; } rates->met_within_gibbs = NO; rates->c_lnL = UNLIKELY; rates->p_lnL = UNLIKELY; rates->c_lnP = UNLIKELY; rates->p_lnP = UNLIKELY; rates->adjust_rates = 0; rates->use_rates = 1; rates->lexp = 1.E-3; rates->norm_fact = 1.0; rates->inflate_var = 1.0; rates->br_r_recorded = NO; /* Important to start from high subst. rate to ``reveal'' time structure */ /* Low rate, and thus old root, makes serially sampled data look like */ /* tips all have the same age. */ rates->clock_r = 1.E-1; rates->min_clock = 1.E-8; rates->max_clock = 1.E+2; rates->clock_r_has_prior = NO; rates->clock_r_prior_mean = 1.0E-1; rates->clock_r_prior_var = 1.0E-8; rates->max_rate = 1.E+1; rates->min_rate = 1.E-1; /* rates->max_rate = 5.; */ /* rates->min_rate = 0.2; */ rates->nu = 1.0; rates->min_nu = 0.0; rates->max_nu = 1.0E+3; rates->autocor_rate_prior = 1.0; rates->min_dt = 0.0; rates->step_rate = 1.E-4; rates->approx = 1; rates->bl_from_rt = NO; rates->update_mean_l = NO; rates->update_cov_l = NO; rates->p_max = 0.01; if(n_otu > 0) { for(i=0;i<(2*n_otu-2)*(2*n_otu-2);++i) rates->cov_l[i] = 0.0; for(i=0;i<2*n_otu-2;++i) { rates->mean_r[i] = 1.0; rates->mean_l[i] = 0.0; rates->cur_l[i] = 0.01; } for(i=0;i<2*n_otu-1;++i) { rates->nd_r[i] = 1.0; rates->br_r[i] = 1.0; rates->br_do_updt[i] = YES; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Init_Time_Struct(t_time *times, t_time *existing_times, int n_otu) { if(existing_times && existing_times->model_id != -1) { times->model_id = existing_times->model_id; } else { times->model_id = COALESCENT; times->coalescent_model_id = STRICTCOALESCENT; } times->scaled_pop_size = 1.E+2; times->scaled_pop_size_min = 1.E-1; times->scaled_pop_size_max = 1.E+3; times->neff_growth = 1E-6; times->neff_growth_min = -5.; times->neff_growth_max = +5.; times->c_lnL = UNLIKELY; times->p_lnL = UNLIKELY; times->c_lnP = UNLIKELY; times->p_lnP = UNLIKELY; times->c_lnL_jps = UNLIKELY; times->nd_t_recorded = NO; times->birth_rate = 1.E-1; times->birth_rate_min = 1.E-6; times->birth_rate_max = 1.E+0; times->birth_rate_pivot = 1.E-1; times->death_rate = 1.E-1; times->death_rate_min = 1.E-6; times->death_rate_min = 1.E+0; times->death_rate_pivot = 1.E-1; if(n_otu > 0) { for(int i=0;i<2*n_otu-2;++i) { times->n_jps[i] = -1; times->t_jps[i] = -1; } for(int i=0;i<2*n_otu-1;++i) { times->mean_t[i] = 0.0; times->nd_t[i] = 0.0; times->true_t[i] = 0.0; if(i < n_otu) { times->t_has_prior[i] = YES; times->t_prior_max[i] = 0.0; times->t_prior_min[i] = 0.0; } else { times->t_has_prior[i] = NO; times->t_prior_max[i] = 0.0; times->t_prior_min[i] = -BIG; } times->has_survived[i] = NO; times->t_rank[i] = i; } } times->update_time_norm_const = NO; times->is_asynchronous = NO; times->augmented_coalescent = NO; times->neff_prior_mean = 1.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_One_Spr(t_spr *a_spr) { a_spr->lnL = UNLIKELY; a_spr->pars = 1E+5; a_spr->depth_path = 0; a_spr->dist = 0; a_spr->init_target_l = NULL; a_spr->init_target_v = NULL; a_spr->l0 = NULL; a_spr->l1 = NULL; a_spr->l2 = NULL; a_spr->v0 = NULL; a_spr->v1 = NULL; a_spr->v2 = NULL; a_spr->n_link = NULL; a_spr->n_opp_to_link = NULL; a_spr->b_opp_to_link = NULL; a_spr->b_target = NULL; a_spr->b_init_target = NULL; a_spr->next = NULL; a_spr->prev = NULL; a_spr->next = NULL; a_spr->prev = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Target_Tip(t_clad *clade, t_tree *tree) { int i,j; for(i=0;in_tax;++i) { for(j=0;jn_otu;++j) { if(!strcmp(tree->a_nodes[j]->name,clade->tax_list[i])) { clade->tip_list[i] = tree->a_nodes[j]; break; } } assert(j != tree->n_otu); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Model(calign *data, t_mod *mod, option *io) { int i,j; phydbl sum,aux; phydbl *dr, *di, *space; assert(data); assert(mod); assert(io); #ifdef BEAGLE mod->b_inst = UNINITIALIZED; //prevents calling an uninitialized BEAGLE instance (for ex: prevents Update_Eigen(), Update_RAS(), from calling BEAGLE) mod->optimizing_topology = false; #endif mod->ns = io->mod->ns; if(io->datatype == GENERIC) mod->whichmodel = JC69; dr = (phydbl *)mCalloc( mod->ns,sizeof(phydbl)); di = (phydbl *)mCalloc( mod->ns,sizeof(phydbl)); space = (phydbl *)mCalloc(2*mod->ns,sizeof(phydbl)); if(mod->log_l == YES) { mod->l_min = log(mod->l_min); mod->l_max = log(mod->l_max); } // Init unscaled relative rate frequencies if(mod->ras->init_r_proba == YES) { /* for(i=0;iras->n_catg;i++) mod->ras->gamma_r_proba->v[i] = (phydbl)1./mod->ras->n_catg; */ /* for(i=0;iras->n_catg;i++) mod->ras->gamma_r_proba_unscaled->v[i] = (phydbl)(i+1); */ for(i=0;iras->n_catg;i++) mod->ras->gamma_r_proba_unscaled->v[i] = 1.0; } else { mod->ras->gamma_r_proba_unscaled->v[mod->ras->n_catg-1] = 1.0; for(i=0;iras->n_catg;i++) { sum = 0.0; for(j=0;jras->gamma_r_proba->v[j]; mod->ras->gamma_r_proba_unscaled->v[i] = sum * mod->ras->gamma_r_proba_unscaled->v[mod->ras->n_catg-1]; } } // Init unscaled relative rates if(mod->ras->init_rr == YES) { if(mod->ras->n_catg > 1) { /* for(i=0;iras->n_catg;i++) mod->ras->gamma_rr->v[i] = (phydbl)i; */ /* for(i=0;iras->n_catg;i++) mod->ras->gamma_rr_unscaled->v[i] = (phydbl)i; */ for(i=0;iras->n_catg;i++) mod->ras->gamma_rr_unscaled->v[i] = 1.0 + (phydbl)i/10.; } else { mod->ras->gamma_rr->v[0] = 1.0; mod->ras->gamma_rr_unscaled->v[0] = 1.0; } } else { for(i=0;iras->n_catg;i++) mod->ras->gamma_rr_unscaled->v[i] = mod->ras->gamma_rr->v[i]; } if(io->datatype == NT) { /* Set the substitution parameters to their default values if they are not fixed by the user */ if(mod->s_opt->opt_kappa == YES) { mod->kappa->v = 4.0; mod->lambda->v = 1.0; } if(mod->whichmodel == CUSTOM) { for(i=0;i<6;i++) { mod->r_mat->rr_val->v[i] = log(1.0); /* mod->r_mat->rr_val->v[i] = exp(1.0); */ mod->r_mat->rr->v[i] = 1.0; } /* Condition below is true if custom model corresponds to TN93 or K80 */ if(mod->r_mat->rr_num->v[AC] == mod->r_mat->rr_num->v[AT] && mod->r_mat->rr_num->v[AT] == mod->r_mat->rr_num->v[CG] && mod->r_mat->rr_num->v[CG] == mod->r_mat->rr_num->v[GT] && mod->r_mat->rr_num->v[AG] != mod->r_mat->rr_num->v[AC] && mod->r_mat->rr_num->v[CT] != mod->r_mat->rr_num->v[AC]) { for(i=1;ir_mat->n_diff_rr;i++) { mod->r_mat->rr_val->v[i] = log(2.0); /* mod->r_mat->rr_val->v[i] = exp(2.0); */ mod->r_mat->rr->v[i] = 2.0; } } else if(mod->r_mat->n_diff_rr == 6) /* Custom <-> GTR model */ { mod->r_mat->rr_val->v[AG] = log(2.0); mod->r_mat->rr_val->v[CT] = log(2.0); /* mod->r_mat->rr_val->v[AG] = exp(2.0); */ /* mod->r_mat->rr_val->v[CT] = exp(2.0); */ mod->r_mat->rr->v[AG] = 2.0; mod->r_mat->rr->v[CT] = 2.0; } } else if(mod->whichmodel == GTR) { if(mod->s_opt->opt_rr == YES) { for(i=0;i<6;i++) mod->r_mat->rr_val->v[i] = log(1.0); /* for(i=0;i<6;i++) mod->r_mat->rr_val->v[i] = exp(1.0); */ for(i=0;i<6;i++) mod->r_mat->rr->v[i] = 1.0; mod->r_mat->rr_val->v[AG] = log(2.0); mod->r_mat->rr_val->v[CT] = log(2.0); /* mod->r_mat->rr_val->v[AG] = exp(2.0); */ /* mod->r_mat->rr_val->v[CT] = exp(2.0); */ mod->r_mat->rr->v[AG] = 2.0; mod->r_mat->rr->v[CT] = 2.0; } } } if(mod->s_opt->opt_alpha) mod->ras->alpha->v = 1.0; if(mod->s_opt->opt_pinvar) mod->ras->pinvar->v = 0.2; if(io->datatype == NT) /* Nucleotides */ { /* init for nucleotides */ for(i=0;ins;i++) mod->e_frq->pi->v[i] = 1./(phydbl)mod->ns; if(mod->whichmodel == JC69) { mod->e_frq->pi->v[0] = mod->e_frq->pi->v[1] = mod->e_frq->pi->v[2] = mod->e_frq->pi->v[3] = .25; mod->kappa->v = 1.; mod->s_opt->state_freq = MODEL; mod->s_opt->opt_kappa = NO; mod->s_opt->opt_lambda = NO; } if(mod->whichmodel == K80) { mod->e_frq->pi->v[0] = mod->e_frq->pi->v[1] = mod->e_frq->pi->v[2] = mod->e_frq->pi->v[3] = .25; mod->s_opt->state_freq = MODEL; mod->s_opt->opt_lambda = NO; } if(mod->whichmodel == F81) { if(mod->s_opt->state_freq == EMPIRICAL || mod->s_opt->state_freq == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); else if(mod->s_opt->state_freq == USER) for(i=0;i<4;i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; mod->kappa->v = 1.; } if(mod->whichmodel == F84) { if(mod->s_opt->state_freq == EMPIRICAL || mod->s_opt->state_freq == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); else if(mod->s_opt->state_freq == USER) for(i=0;i<4;i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf(stderr,"\n. The F84 model is not compatible with the '-f m' option (use '-f e' or '-f o' instead. See the documentation).\n"); assert(false); } aux = ((mod->e_frq->pi->v[0]+mod->e_frq->pi->v[2])-(mod->e_frq->pi->v[1]+mod->e_frq->pi->v[3]))/(2.*mod->kappa->v); mod->lambda->v = ((mod->e_frq->pi->v[1]+mod->e_frq->pi->v[3]) + aux)/((mod->e_frq->pi->v[0]+mod->e_frq->pi->v[2]) - aux); } if(mod->whichmodel == TN93) { if(mod->s_opt->state_freq == EMPIRICAL || mod->s_opt->state_freq == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); else if(mod->s_opt->state_freq == USER) for(i=0;i<4;i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf(stderr,"\n. The TN93 model is not compatible with the '-f m' option (use '-f e' or '-f o' instead. See the documentation).\n"); assert(false); } if(io->mod->s_opt->opt_kappa) io->mod->s_opt->opt_lambda = YES; } if(mod->whichmodel == HKY85) { if(mod->s_opt->state_freq == EMPIRICAL || mod->s_opt->state_freq == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); else if(mod->s_opt->state_freq == USER) for(i=0;i<4;i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf(stderr,"\n. The HKY85 model is not compatible with the '-f m' option (use '-f e' or '-f o' instead. See the documentation).\n"); assert(false); } } if(mod->whichmodel == GTR) { if(mod->s_opt->state_freq == EMPIRICAL || mod->s_opt->state_freq == ML) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); else if(mod->s_opt->state_freq == USER) for(i=0;i<4;i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; else { PhyML_Fprintf(stderr,"\n. The GTR model is not compatible with the '-f m' option (use '-f e' or '-f o' instead. See the documentation).\n"); assert(false); } mod->kappa->v = 1.; mod->custom_mod_string->s[0] = '0'; mod->custom_mod_string->s[1] = '1'; mod->custom_mod_string->s[2] = '2'; mod->custom_mod_string->s[3] = '3'; mod->custom_mod_string->s[4] = '4'; mod->custom_mod_string->s[5] = '5'; Translate_Custom_Mod_String(mod); } if(mod->whichmodel == CUSTOM) { if(mod->s_opt->state_freq == EMPIRICAL) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); else for(i=0;i<4;i++) mod->e_frq->pi->v[i] = mod->e_frq->user_b_freq->v[i]; mod->kappa->v = 1.; } for(i=0;ins;i++) mod->e_frq->pi_unscaled->v[i] = log(mod->e_frq->pi->v[i]); } else if(mod->io->datatype == AA) { /* init for amino-acids */ /* see comments of PMat_Empirical for details */ phydbl *qmat,*rr,*f; qmat = mod->r_mat->qmat->v; rr = mod->r_mat->rr_val->v; f = mod->e_frq->pi->v; for(i=0;ins*mod->ns;++i) qmat[i] = .0; for(i=0;ins;++i) f[i] = .0; switch(mod->whichmodel) { case DAYHOFF : { Init_Qmat_Dayhoff(qmat,f); break; } case JTT : { Init_Qmat_JTT(qmat,f); break; } case MTREV : { Init_Qmat_MtREV(qmat,f); break; } case LG : { Init_Qmat_LG(qmat,f); break; } case WAG : { Init_Qmat_WAG(qmat,f); break; } case DCMUT : { Init_Qmat_DCMut(qmat,f); break; } case RTREV : { Init_Qmat_RtREV(qmat,f); break; } case CPREV : { Init_Qmat_CpREV(qmat,f); break; } case VT : { Init_Qmat_VT(qmat,f); break; } case BLOSUM62 : { Init_Qmat_Blosum62(qmat,f); break; } case MTMAM : { Init_Qmat_MtMam(qmat,f); break; } case MTART : { Init_Qmat_MtArt(qmat,f); break; } case HIVW : { Init_Qmat_HIVw(qmat,f); break; } case HIVB : { Init_Qmat_HIVb(qmat,f); break; } case AB : { Init_Qmat_AB(qmat,f); break; } case CUSTOMAA : { mod->fp_aa_rate_mat = Openfile(mod->aa_rate_mat_file->s,READ); Read_Qmat(qmat,f,mod->fp_aa_rate_mat); fclose(mod->fp_aa_rate_mat); break; } case FLU : { Init_Qmat_FLU(qmat,f); break; } default : { Init_Qmat_LG(qmat,f); break; } } for(i=0;ins;i++) for(j=i+1;jns;j++) rr[MIN(i,j) * mod->ns + MAX(i,j) - (MIN(i,j)+1+(int)POW(MIN(i,j)+1,2))/2] = qmat[i*mod->ns+j]; if(mod->s_opt->state_freq == EMPIRICAL) Init_Efrqs_Using_Observed_Freqs(mod->e_frq,data->obs_state_frq,mod->ns); // Adjust equilibrium state frequencies if some of them are too close to zero // in order to avoid numerical precision issues. int iter = 0; do { for(i=0;ins;i++) if(mod->e_frq->pi->v[i] < E_FRQ_MIN) mod->e_frq->pi->v[i] = E_FRQ_MIN; sum = 0.0; for(i=0;ins;i++) sum += fabs(mod->e_frq->pi->v[i]); for(i=0;ins;i++) mod->e_frq->pi->v[i] /= sum; iter++; } while(iter < 10); for(i=0;ins;i++) mod->e_frq->pi_unscaled->v[i] = log(mod->e_frq->pi->v[i]); mod->mr->v = Update_Qmat_Generic(rr,f,mod->ns,qmat); } else if(mod->io->datatype == GENERIC) { /* Uniform state frequencies */ for(i=0;ins;i++) mod->e_frq->pi->v[i] = 1./(phydbl)mod->ns; mod->kappa->v = 1; mod->s_opt->state_freq = MODEL; mod->s_opt->opt_kappa = NO; mod->s_opt->opt_lambda = NO; for(i=0;ins*(mod->ns-1)/2;i++) mod->r_mat->rr_val->v[i] = log(1.0); /* for(i=0;ins*(mod->ns-1)/2;i++) mod->r_mat->rr_val->v[i] = exp(1.0); */ for(i=0;ins*(mod->ns-1)/2;i++) mod->r_mat->rr->v[i] = 1.0; } else { PhyML_Fprintf(stderr,"\n. Datatype not recognized.\n"); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } Init_Eigen_Struct(mod->eigen); mod->update_eigen = YES; Update_Eigen(mod); if(mod->is_mixt_mod == YES) MIXT_Init_Model(mod); free(dr); free(di); free(space); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Efrqs_Using_Observed_Freqs(t_efrq *f, phydbl *o, int ns) { int i; phydbl eps,sum; assert(f); assert(o); // To avoid numerical prevision issues eps = 1.E-50; for(i=0;ipi->v[i] = MAX(o[i],eps); sum = 0.0; for(i=0;ipi->v[i]; for(i=0;ipi->v[i] /= sum;; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Init_Qmat_Dayhoff(phydbl *daa, phydbl *pi) { /* Dayhoff's model data * Dayhoff, M.O., Schwartz, R.M., Orcutt, B.C. (1978) * "A model of evolutionary change in proteins." * Dayhoff, M.O.(ed.) Atlas of Protein Sequence Structur., Vol5, Suppl3. * National Biomedical Research Foundation, Washington DC, pp.345-352. */ int i,j,naa; naa = 20; /* PhyML_Printf("\n\n. REMINDER : THIS IS NOT DAYHOFF !!!\n\n"); */ /* daa[1*20 + 0] = 0.538903; */ /* daa[2*20 + 0] = 0.412504; */ /* daa[2*20 + 1] = 0.736081; */ /* daa[3*20 + 0] = 0.586915; */ /* daa[3*20 + 1] = 0.108051; */ /* daa[3*20 + 2] = 5.446642; */ /* daa[4*20 + 0] = 2.189718; */ /* daa[4*20 + 1] = 0.830604; */ /* daa[4*20 + 2] = 0.573426; */ /* daa[4*20 + 3] = 0.077565; */ /* daa[5*20 + 0] = 1.08213; */ /* daa[5*20 + 1] = 2.950693; */ /* daa[5*20 + 2] = 1.739514; */ /* daa[5*20 + 3] = 0.559035; */ /* daa[5*20 + 4] = 0.111314; */ /* daa[6*20 + 0] = 1.386865; */ /* daa[6*20 + 1] = 0.358434; */ /* daa[6*20 + 2] = 0.541447; */ /* daa[6*20 + 3] = 5.406871; */ /* daa[6*20 + 4] = 0.003738; */ /* daa[6*20 + 5] = 4.124043; */ /* daa[7*20 + 0] = 2.085747; */ /* daa[7*20 + 1] = 0.453132; */ /* daa[7*20 + 2] = 1.815844; */ /* daa[7*20 + 3] = 1.08647; */ /* daa[7*20 + 4] = 0.526418; */ /* daa[7*20 + 5] = 0.347693; */ /* daa[7*20 + 6] = 0.438476; */ /* daa[8*20 + 0] = 0.407898; */ /* daa[8*20 + 1] = 2.689322; */ /* daa[8*20 + 2] = 5.386808; */ /* daa[8*20 + 3] = 0.884563; */ /* daa[8*20 + 4] = 0.658583; */ /* daa[8*20 + 5] = 4.588358; */ /* daa[8*20 + 6] = 0.386218; */ /* daa[8*20 + 7] = 0.368668; */ /* daa[9*20 + 0] = 0.10177; */ /* daa[9*20 + 1] = 0.104875; */ /* daa[9*20 + 2] = 0.16239; */ /* daa[9*20 + 3] = 0.011698; */ /* daa[9*20 + 4] = 0.253282; */ /* daa[9*20 + 5] = 0.083872; */ /* daa[9*20 + 6] = 0.041767; */ /* daa[9*20 + 7] = 0.009778; */ /* daa[9*20 + 8] = 0.1042; */ /* daa[10*20 + 0] = 0.248202; */ /* daa[10*20 + 1] = 0.375742; */ /* daa[10*20 + 2] = 0.093863; */ /* daa[10*20 + 3] = 0.019241; */ /* daa[10*20 + 4] = 0.572688; */ /* daa[10*20 + 5] = 0.703538; */ /* daa[10*20 + 6] = 0.071961; */ /* daa[10*20 + 7] = 0.03006; */ /* daa[10*20 + 8] = 0.418222; */ /* daa[10*20 + 9] = 3.702051; */ /* daa[11*20 + 0] = 0.652019; */ /* daa[11*20 + 1] = 5.940478; */ /* daa[11*20 + 2] = 2.352253; */ /* daa[11*20 + 3] = 0.231001; */ /* daa[11*20 + 4] = 0.027995; */ /* daa[11*20 + 5] = 3.646743; */ /* daa[11*20 + 6] = 1.507981; */ /* daa[11*20 + 7] = 0.331175; */ /* daa[11*20 + 8] = 0.698362; */ /* daa[11*20 + 9] = 0.140326; */ /* daa[11*20 + 10] = 0.171396; */ /* daa[12*20 + 0] = 0.694226; */ /* daa[12*20 + 1] = 0.419899; */ /* daa[12*20 + 2] = 0.326927; */ /* daa[12*20 + 3] = 0.039488; */ /* daa[12*20 + 4] = 0.844827; */ /* daa[12*20 + 5] = 1.394214; */ /* daa[12*20 + 6] = 0.133235; */ /* daa[12*20 + 7] = 0.085075; */ /* daa[12*20 + 8] = 0.347092; */ /* daa[12*20 + 9] = 4.051255; */ /* daa[12*20 + 10] = 6.650794; */ /* daa[12*20 + 11] = 0.617549; */ /* daa[13*20 + 0] = 0.155206; */ /* daa[13*20 + 1] = 0.057971; */ /* daa[13*20 + 2] = 0.09816; */ /* daa[13*20 + 3] = 0.020441; */ /* daa[13*20 + 4] = 0.904305; */ /* daa[13*20 + 5] = 0.052719; */ /* daa[13*20 + 6] = 0.0219; */ /* daa[13*20 + 7] = 0.046668; */ /* daa[13*20 + 8] = 0.890005; */ /* daa[13*20 + 9] = 0.844963; */ /* daa[13*20 + 10] = 2.348881; */ /* daa[13*20 + 11] = 0.028372; */ /* daa[13*20 + 12] = 1.671635; */ /* daa[14*20 + 0] = 1.433475; */ /* daa[14*20 + 1] = 0.328393; */ /* daa[14*20 + 2] = 0.173181; */ /* daa[14*20 + 3] = 0.431874; */ /* daa[14*20 + 4] = 0.09902; */ /* daa[14*20 + 5] = 0.592324; */ /* daa[14*20 + 6] = 0.488352; */ /* daa[14*20 + 7] = 0.23865; */ /* daa[14*20 + 8] = 0.462856; */ /* daa[14*20 + 9] = 0.057048; */ /* daa[14*20 + 10] = 0.233532; */ /* daa[14*20 + 11] = 0.387808; */ /* daa[14*20 + 12] = 0.096377; */ /* daa[14*20 + 13] = 0.079912; */ /* daa[15*20 + 0] = 4.887126; */ /* daa[15*20 + 1] = 0.883923; */ /* daa[15*20 + 2] = 4.627163; */ /* daa[15*20 + 3] = 1.122164; */ /* daa[15*20 + 4] = 3.186667; */ /* daa[15*20 + 5] = 1.085947; */ /* daa[15*20 + 6] = 0.569339; */ /* daa[15*20 + 7] = 1.993432; */ /* daa[15*20 + 8] = 0.867972; */ /* daa[15*20 + 9] = 0.070512; */ /* daa[15*20 + 10] = 0.163009; */ /* daa[15*20 + 11] = 0.718913; */ /* daa[15*20 + 12] = 0.301103; */ /* daa[15*20 + 13] = 0.32579; */ /* daa[15*20 + 14] = 1.449582; */ /* daa[16*20 + 0] = 2.030538; */ /* daa[16*20 + 1] = 0.639463; */ /* daa[16*20 + 2] = 2.076294; */ /* daa[16*20 + 3] = 0.377239; */ /* daa[16*20 + 4] = 1.42848; */ /* daa[16*20 + 5] = 0.979403; */ /* daa[16*20 + 6] = 0.647562; */ /* daa[16*20 + 7] = 0.145556; */ /* daa[16*20 + 8] = 0.493329; */ /* daa[16*20 + 9] = 0.973405; */ /* daa[16*20 + 10] = 0.271824; */ /* daa[16*20 + 11] = 1.20033; */ /* daa[16*20 + 12] = 1.659187; */ /* daa[16*20 + 13] = 0.1217; */ /* daa[16*20 + 14] = 0.571399; */ /* daa[16*20 + 15] = 6.641034; */ /* daa[17*20 + 0] = 0.131405; */ /* daa[17*20 + 1] = 0.552911; */ /* daa[17*20 + 2] = 0.079985; */ /* daa[17*20 + 3] = 0.060514; */ /* daa[17*20 + 4] = 0.633662; */ /* daa[17*20 + 5] = 0.21823; */ /* daa[17*20 + 6] = 0.074988; */ /* daa[17*20 + 7] = 0.169114; */ /* daa[17*20 + 8] = 0.847725; */ /* daa[17*20 + 9] = 0.10627; */ /* daa[17*20 + 10] = 0.622044; */ /* daa[17*20 + 11] = 0.060755; */ /* daa[17*20 + 12] = 0.719575; */ /* daa[17*20 + 13] = 3.14824; */ /* daa[17*20 + 14] = 0.077123; */ /* daa[17*20 + 15] = 0.276716; */ /* daa[17*20 + 16] = 0.148883; */ /* daa[18*20 + 0] = 0.165179; */ /* daa[18*20 + 1] = 0.224883; */ /* daa[18*20 + 2] = 0.528334; */ /* daa[18*20 + 3] = 0.121252; */ /* daa[18*20 + 4] = 1.174118; */ /* daa[18*20 + 5] = 0.177062; */ /* daa[18*20 + 6] = 0.074715; */ /* daa[18*20 + 7] = 0.042356; */ /* daa[18*20 + 8] = 5.911187; */ /* daa[18*20 + 9] = 0.192481; */ /* daa[18*20 + 10] = 0.321454; */ /* daa[18*20 + 11] = 0.090556; */ /* daa[18*20 + 12] = 0.406415; */ /* daa[18*20 + 13] = 10.908861; */ /* daa[18*20 + 14] = 0.070752; */ /* daa[18*20 + 15] = 0.328483; */ /* daa[18*20 + 16] = 0.181539; */ /* daa[18*20 + 17] = 3.823886; */ /* daa[19*20 + 0] = 1.78517; */ /* daa[19*20 + 1] = 0.166975; */ /* daa[19*20 + 2] = 0.106482; */ /* daa[19*20 + 3] = 0.041707; */ /* daa[19*20 + 4] = 1.876812; */ /* daa[19*20 + 5] = 0.22421; */ /* daa[19*20 + 6] = 0.247356; */ /* daa[19*20 + 7] = 0.06688; */ /* daa[19*20 + 8] = 0.1436; */ /* daa[19*20 + 9] = 9.60184; */ /* daa[19*20 + 10] = 1.599119; */ /* daa[19*20 + 11] = 0.17319; */ /* daa[19*20 + 12] = 1.645134; */ /* daa[19*20 + 13] = 0.438571; */ /* daa[19*20 + 14] = 0.252486; */ /* daa[19*20 + 15] = 0.105536; */ /* daa[19*20 + 16] = 1.789097; */ /* daa[19*20 + 17] = 0.147951; */ /* daa[19*20 + 18] = 0.200571; */ /* for (i=0; i 2664 (67% of the original 3933 positions) The species included in the analysis were: Harpiosquilla harpax [NCBI_TaxID 287944] Ixodes uriae [NCBI_TaxID 59655] Heptathela hangzhouensis [NCBI_TaxID 216259] Triops longicaudatus [NCBI_TaxID 58777] Gryllotalpa orientalis [NCBI_TaxID 213494] lepidopsocid RS-2001 [NCBI_TaxID 159971] Locusta migratoria [NCBI_TaxID 7004] Drosophila yakuba [NCBI_TaxID 7245] Ostrinia furnacalis [NCBI_TaxID 93504] Megabalanus volcano [NCBI_TaxID 266495] Periplaneta fuliginosa [NCBI_TaxID 36977] Thermobia domestica [NCBI_TaxID 89055] Aleurochiton aceris [NCBI_TaxID 266942] Schizaphis graminum [NCBI_TaxID 13262] Pteronarcys princeps [NCBI_TaxID 285953] Aleurodicus dugesii [NCBI_TaxID 30099] Pollicipes polymerus [NCBI_TaxID 36137] Gomphiocephalus hodgsoni [NCBI_TaxID 221270] Habronattus oregonensis [NCBI_TaxID 130930] Speleonectes tulumensis [NCBI_TaxID 84346] Hutchinsoniella macracantha [NCBI_TaxID 84335] Haemaphysalis flava [NCBI_TaxID 181088] Scutigera coleoptrata [NCBI_TaxID 29022] Vargula hilgendorfii [NCBI_TaxID 6674] Tricholepidion gertschi [NCBI_TaxID 89825] Varroa destructor [NCBI_TaxID 109461] Bombyx mandarina [NCBI_TaxID 7092] Thyropygus sp. [NCBI_TaxID 174155] Tribolium castaneum [NCBI_TaxID 7070] Pagurus longicarpus [NCBI_TaxID 111067] Limulus polyphemus [NCBI_TaxID 6850] Tetrodontophora bielanensis [NCBI_TaxID 48717] Penaeus monodon [NCBI_TaxID 6687] Daphnia pulex [NCBI_TaxID 6669] Apis mellifera [NCBI_TaxID 7469] Anopheles gambiae [NCBI_TaxID 7165] The topology used for inferring the model was: (((Daph_pulex,Trio_longi),((((((Aleu_aceri,Aleu_duges),Schi_grami),lepi_RS_20), ((((Ostr_furna,Bomb_manda),(Dros_yakub,Anop_gambi)),Apis_melli),Trib_casta)), ((Gryl_orien,Locu_migra),(Pter_princ,Peri_fulig))),(Tric_gerts,Ther_domes)), (Scut_coleo,Thyr_sp),Varg_hilge,Hutc_macra,((((Ixod_uriae,Haem_flava),Varr_destr), (Habr_orego,Hept_hangz)),Limu_polyp),(Poll_polym,Mega_volca),(Gomp_hodgs,Tetr_biela), ((Pagu_longi,Pena_monod),Harp_harpa),Spel_tulum)); Note this is not the ML topology but the consensus one (based on morphological data, phylogenetic reconstruction using nuclear genes, etc). Where relationships are not clear, a polytomy was introduced (it contains quite a lot of polytomies!). The model was estimated using (the great and helpful) Ziheng Yang's Paml software package. A four-categorized gamma distribution was used to account for heterogeneity (alpha was estimated to be 0.47821). Sites with ambiguity data were taken into account. If you would like the data related to this matrix, please contact fabascal@uvigo.es. Federico Abascal (c)2005. */ int i,j,naa; naa = 20; daa[1*20+ 0] = 0.2; daa[2*20+ 0] = 0.2; daa[2*20+ 1] = 0.2; daa[3*20+ 0] = 0.6; daa[3*20+ 1] = 4.3; daa[3*20+ 2] = 500.2; daa[4*20+ 0] = 253.5; daa[4*20+ 1] = 35.5; daa[4*20+ 2] = 98.2; daa[4*20+ 3] = 10.6; daa[5*20+ 0] = 0.2; daa[5*20+ 1] = 154.0; daa[5*20+ 2] = 261.8; daa[5*20+ 3] = 0.2; daa[5*20+ 4] = 0.2; daa[6*20+ 0] = 0.2; daa[6*20+ 1] = 0.2; daa[6*20+ 2] = 183.0; daa[6*20+ 3] = 861.8; daa[6*20+ 4] = 0.2; daa[6*20+ 5] = 261.6; daa[7*20+ 0] = 199.8; daa[7*20+ 1] = 0.2; daa[7*20+ 2] = 120.5; daa[7*20+ 3] = 12.5; daa[7*20+ 4] = 80.5; daa[7*20+ 5] = 2.6; daa[7*20+ 6] = 43.9; daa[8*20+ 0] = 0.2; daa[8*20+ 1] = 41.3; daa[8*20+ 2] = 179.5; daa[8*20+ 3] = 0.2; daa[8*20+ 4] = 12.4; daa[8*20+ 5] = 313.5; daa[8*20+ 6] = 15.2; daa[8*20+ 7] = 0.2; daa[9*20+ 0] = 25.7; daa[9*20+ 1] = 1.8; daa[9*20+ 2] = 21.3; daa[9*20+ 3] = 6.6; daa[9*20+ 4] = 63.0; daa[9*20+ 5] = 10.5; daa[9*20+ 6] = 6.8; daa[9*20+ 7] = 2.7; daa[9*20+ 8] = 0.2; daa[10*20+ 0] = 3.7; daa[10*20+ 1] = 1.8; daa[10*20+ 2] = 12.6; daa[10*20+ 3] = 1.2; daa[10*20+ 4] = 78.7; daa[10*20+ 5] = 16.3; daa[10*20+ 6] = 1.7; daa[10*20+ 7] = 1.4; daa[10*20+ 8] = 5.5; daa[10*20+ 9] = 514.5; daa[11*20+ 0] = 0.2; daa[11*20+ 1] = 208.6; daa[11*20+ 2] = 467.3; daa[11*20+ 3] = 1.7; daa[11*20+ 4] = 0.2; daa[11*20+ 5] = 349.3; daa[11*20+ 6] = 106.3; daa[11*20+ 7] = 0.2; daa[11*20+ 8] = 0.2; daa[11*20+ 9] = 3.5; daa[11*20+ 10] = 3.8; daa[12*20+ 0] = 120.6; daa[12*20+ 1] = 5.2; daa[12*20+ 2] = 78.8; daa[12*20+ 3] = 0.2; daa[12*20+ 4] = 312.3; daa[12*20+ 5] = 67.3; daa[12*20+ 6] = 0.2; daa[12*20+ 7] = 55.7; daa[12*20+ 8] = 0.2; daa[12*20+ 9] = 514.8; daa[12*20+ 10] = 885.5; daa[12*20+ 11] = 105.6; daa[13*20+ 0] = 13.1; daa[13*20+ 1] = 4.7; daa[13*20+ 2] = 19.7; daa[13*20+ 3] = 0.2; daa[13*20+ 4] = 184.1; daa[13*20+ 5] = 0.2; daa[13*20+ 6] = 0.2; daa[13*20+ 7] = 0.8; daa[13*20+ 8] = 13.8; daa[13*20+ 9] = 117.9; daa[13*20+ 10] = 262.6; daa[13*20+ 11] = 10.7; daa[13*20+ 12] = 321.6; daa[14*20+ 0] = 49.3; daa[14*20+ 1] = 0.2; daa[14*20+ 2] = 16.5; daa[14*20+ 3] = 0.2; daa[14*20+ 4] = 0.2; daa[14*20+ 5] = 39.3; daa[14*20+ 6] = 7.9; daa[14*20+ 7] = 0.2; daa[14*20+ 8] = 0.8; daa[14*20+ 9] = 0.2; daa[14*20+ 10] = 12.2; daa[14*20+ 11] = 16.8; daa[14*20+ 12] = 5.3; daa[14*20+ 13] = 14.6; daa[15*20+ 0] = 673.0; daa[15*20+ 1] = 2.7; daa[15*20+ 2] = 398.4; daa[15*20+ 3] = 44.4; daa[15*20+ 4] = 664.2; daa[15*20+ 5] = 52.4; daa[15*20+ 6] = 31.5; daa[15*20+ 7] = 226.0; daa[15*20+ 8] = 10.6; daa[15*20+ 9] = 7.2; daa[15*20+ 10] = 8.2; daa[15*20+ 11] = 144.2; daa[15*20+ 12] = 111.7; daa[15*20+ 13] = 36.1; daa[15*20+ 14] = 86.5; daa[16*20+ 0] = 243.9; daa[16*20+ 1] = 0.2; daa[16*20+ 2] = 165.9; daa[16*20+ 3] = 0.2; daa[16*20+ 4] = 182.8; daa[16*20+ 5] = 43.7; daa[16*20+ 6] = 43.4; daa[16*20+ 7] = 0.2; daa[16*20+ 8] = 18.6; daa[16*20+ 9] = 203.7; daa[16*20+ 10] = 47.8; daa[16*20+ 11] = 69.5; daa[16*20+ 12] = 288.6; daa[16*20+ 13] = 13.5; daa[16*20+ 14] = 46.8; daa[16*20+ 15] = 660.4; daa[17*20+ 0] = 0.2; daa[17*20+ 1] = 0.2; daa[17*20+ 2] = 7.7; daa[17*20+ 3] = 0.2; daa[17*20+ 4] = 21.6; daa[17*20+ 5] = 6.7; daa[17*20+ 6] = 11.0; daa[17*20+ 7] = 1.9; daa[17*20+ 8] = 0.2; daa[17*20+ 9] = 0.2; daa[17*20+ 10] = 21.1; daa[17*20+ 11] = 16.0; daa[17*20+ 12] = 70.7; daa[17*20+ 13] = 53.7; daa[17*20+ 14] = 0.2; daa[17*20+ 15] = 2.4; daa[17*20+ 16] = 0.2; daa[18*20+ 0] = 1.2; daa[18*20+ 1] = 3.9; daa[18*20+ 2] = 251.2; daa[18*20+ 3] = 0.2; daa[18*20+ 4] = 72.0; daa[18*20+ 5] = 86.7; daa[18*20+ 6] = 7.7; daa[18*20+ 7] = 8.6; daa[18*20+ 8] = 191.4; daa[18*20+ 9] = 12.3; daa[18*20+ 10] = 19.8; daa[18*20+ 11] = 117.1; daa[18*20+ 12] = 70.9; daa[18*20+ 13] = 791.6; daa[18*20+ 14] = 18.4; daa[18*20+ 15] = 30.5; daa[18*20+ 16] = 46.0; daa[18*20+ 17] = 37.7; daa[19*20+ 0] = 339.9; daa[19*20+ 1] = 0.2; daa[19*20+ 2] = 22.6; daa[19*20+ 3] = 0.2; daa[19*20+ 4] = 350.4; daa[19*20+ 5] = 0.2; daa[19*20+ 6] = 13.6; daa[19*20+ 7] = 2.6; daa[19*20+ 8] = 0.2; daa[19*20+ 9] = 1854.5; daa[19*20+ 10] = 84.7; daa[19*20+ 11] = 26.1; daa[19*20+ 12] = 281.3; daa[19*20+ 13] = 51.9; daa[19*20+ 14] = 31.7; daa[19*20+ 15] = 60.6; daa[19*20+ 16] = 544.1; daa[19*20+ 17] = 0.2; daa[19*20+ 18] = 1.6; /* MtArt.old: esta es la MtArt que hice con 26 secuencias (2 outgroups) con una topologia incorrecta daa[1*20+ 0] = 0.2; daa[2*20+ 0] = 0.2; daa[2*20+ 1] = 8.0; daa[3*20+ 0] = 0.2; daa[3*20+ 1] = 0.2; daa[3*20+ 2] = 441.7; daa[4*20+ 0] = 287.9; daa[4*20+ 1] = 48.4; daa[4*20+ 2] = 82.4; daa[4*20+ 3] = 0.2; daa[5*20+ 0] = 0.2; daa[5*20+ 1] = 149.9; daa[5*20+ 2] = 278.6; daa[5*20+ 3] = 0.2; daa[5*20+ 4] = 21.7; daa[6*20+ 0] = 6.6; daa[6*20+ 1] = 0.2; daa[6*20+ 2] = 213.9; daa[6*20+ 3] = 760.8; daa[6*20+ 4] = 0.2; daa[6*20+ 5] = 292.9; daa[7*20+ 0] = 228.2; daa[7*20+ 1] = 0.2; daa[7*20+ 2] = 97.1; daa[7*20+ 3] = 10.4; daa[7*20+ 4] = 98.4; daa[7*20+ 5] = 4.0; daa[7*20+ 6] = 48.7; daa[8*20+ 0] = 0.2; daa[8*20+ 1] = 56.7; daa[8*20+ 2] = 156.4; daa[8*20+ 3] = 24.5; daa[8*20+ 4] = 15.5; daa[8*20+ 5] = 328.6; daa[8*20+ 6] = 7.0; daa[8*20+ 7] = 8.4; daa[9*20+ 0] = 26.4; daa[9*20+ 1] = 1.6; daa[9*20+ 2] = 40.1; daa[9*20+ 3] = 0.2; daa[9*20+ 4] = 22.1; daa[9*20+ 5] = 13.8; daa[9*20+ 6] = 0.2; daa[9*20+ 7] = 3.6; daa[9*20+ 8] = 0.2; daa[10*20+ 0] = 3.4; daa[10*20+ 1] = 0.6; daa[10*20+ 2] = 13.8; daa[10*20+ 3] = 0.7; daa[10*20+ 4] = 76.9; daa[10*20+ 5] = 12.1; daa[10*20+ 6] = 5.4; daa[10*20+ 7] = 2.5; daa[10*20+ 8] = 2.9; daa[10*20+ 9] = 542.6; daa[11*20+ 0] = 0.2; daa[11*20+ 1] = 240.2; daa[11*20+ 2] = 602.8; daa[11*20+ 3] = 35.5; daa[11*20+ 4] = 0.2; daa[11*20+ 5] = 357.6; daa[11*20+ 6] = 62.6; daa[11*20+ 7] = 0.2; daa[11*20+ 8] = 3.3; daa[11*20+ 9] = 0.2; daa[11*20+ 10] = 17.5; daa[12*20+ 0] = 119.0; daa[12*20+ 1] = 0.2; daa[12*20+ 2] = 91.4; daa[12*20+ 3] = 6.4; daa[12*20+ 4] = 332.3; daa[12*20+ 5] = 65.4; daa[12*20+ 6] = 0.2; daa[12*20+ 7] = 60.4; daa[12*20+ 8] = 2.4; daa[12*20+ 9] = 492.5; daa[12*20+ 10] = 815.8; daa[12*20+ 11] = 67.3; daa[13*20+ 0] = 8.2; daa[13*20+ 1] = 6.4; daa[13*20+ 2] = 31.5; daa[13*20+ 3] = 3.4; daa[13*20+ 4] = 174.4; daa[13*20+ 5] = 5.7; daa[13*20+ 6] = 5.7; daa[13*20+ 7] = 2.1; daa[13*20+ 8] = 11.0; daa[13*20+ 9] = 94.4; daa[13*20+ 10] = 243.3; daa[13*20+ 11] = 12.3; daa[13*20+ 12] = 357.8; daa[14*20+ 0] = 62.5; daa[14*20+ 1] = 0.4; daa[14*20+ 2] = 17.5; daa[14*20+ 3] = 0.2; daa[14*20+ 4] = 0.2; daa[14*20+ 5] = 48.6; daa[14*20+ 6] = 17.7; daa[14*20+ 7] = 2.7; daa[14*20+ 8] = 0.2; daa[14*20+ 9] = 0.2; daa[14*20+ 10] = 11.2; daa[14*20+ 11] = 21.7; daa[14*20+ 12] = 5.2; daa[14*20+ 13] = 12.6; daa[15*20+ 0] = 659.0; daa[15*20+ 1] = 5.2; daa[15*20+ 2] = 469.8; daa[15*20+ 3] = 52.3; daa[15*20+ 4] = 570.7; daa[15*20+ 5] = 47.8; daa[15*20+ 6] = 37.3; daa[15*20+ 7] = 227.8; daa[15*20+ 8] = 12.7; daa[15*20+ 9] = 12.3; daa[15*20+ 10] = 7.4; daa[15*20+ 11] = 189.0; daa[15*20+ 12] = 155.3; daa[15*20+ 13] = 43.8; daa[15*20+ 14] = 103.4; daa[16*20+ 0] = 276.4; daa[16*20+ 1] = 1.6; daa[16*20+ 2] = 175.6; daa[16*20+ 3] = 0.2; daa[16*20+ 4] = 96.2; daa[16*20+ 5] = 71.4; daa[16*20+ 6] = 37.4; daa[16*20+ 7] = 0.2; daa[16*20+ 8] = 14.2; daa[16*20+ 9] = 212.5; daa[16*20+ 10] = 38.5; daa[16*20+ 11] = 97.4; daa[16*20+ 12] = 254.7; daa[16*20+ 13] = 2.1; daa[16*20+ 14] = 41.6; daa[16*20+ 15] = 670.6; daa[17*20+ 0] = 6.2; daa[17*20+ 1] = 0.2; daa[17*20+ 2] = 0.2; daa[17*20+ 3] = 5.6; daa[17*20+ 4] = 0.2; daa[17*20+ 5] = 0.2; daa[17*20+ 6] = 3.1; daa[17*20+ 7] = 0.4; daa[17*20+ 8] = 0.2; daa[17*20+ 9] = 15.2; daa[17*20+ 10] = 11.5; daa[17*20+ 11] = 32.6; daa[17*20+ 12] = 82.4; daa[17*20+ 13] = 81.9; daa[17*20+ 14] = 0.2; daa[17*20+ 15] = 9.7; daa[17*20+ 16] = 0.2; daa[18*20+ 0] = 1.6; daa[18*20+ 1] = 7.7; daa[18*20+ 2] = 242.5; daa[18*20+ 3] = 0.2; daa[18*20+ 4] = 88.0; daa[18*20+ 5] = 93.1; daa[18*20+ 6] = 0.2; daa[18*20+ 7] = 6.0; daa[18*20+ 8] = 113.7; daa[18*20+ 9] = 22.1; daa[18*20+ 10] = 17.2; daa[18*20+ 11] = 138.5; daa[18*20+ 12] = 37.6; daa[18*20+ 13] = 770.2; daa[18*20+ 14] = 5.3; daa[18*20+ 15] = 25.0; daa[18*20+ 16] = 55.5; daa[18*20+ 17] = 69.3; daa[19*20+ 0] = 307.8; daa[19*20+ 1] = 2.2; daa[19*20+ 2] = 6.9; daa[19*20+ 3] = 0.2; daa[19*20+ 4] = 405.7; daa[19*20+ 5] = 0.8; daa[19*20+ 6] = 20.2; daa[19*20+ 7] = 5.7; daa[19*20+ 8] = 0.2; daa[19*20+ 9] = 1687.9; daa[19*20+ 10] = 49.4; daa[19*20+ 11] = 23.4; daa[19*20+ 12] = 329.9; daa[19*20+ 13] = 86.3; daa[19*20+ 14] = 27.3; daa[19*20+ 15] = 95.0; daa[19*20+ 16] = 443.0; daa[19*20+ 17] = 2.4; daa[19*20+ 18] = 0.2; 3*/ for (i=0; idim = n_dim; Random_String(t->id,3); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Init_Disk_Event(t_dsk *t, int n_dim, t_phyrex_mod *mmod) { t->prev = NULL; t->next = NULL; t->img = NULL; t->mmod = NULL; t->age_fixed = NO; t->cum_glnL = 0.0; t->cum_tlnL = 0.0; Random_String(t->id,3); GEO_Init_Coord(t->centr,n_dim); if(mmod != NULL) t->mmod = mmod; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Init_Migrep_Mod(t_phyrex_mod *t, int n_dim, phydbl min_lat, phydbl min_lon, phydbl max_lat, phydbl max_lon) { assert(n_dim == 2); if(t->model_id == -1) t->model_id = SLFV_GAUSSIAN; t->n_dim = n_dim; if(t->sampling_scheme == -1) t->sampling_scheme = SPATIAL_SAMPLING_DETECTION; if(t->use_locations == -1) t->use_locations = YES; t->lim_up->lonlat[0] = max_lat; t->lim_up->lonlat[1] = max_lon; t->lim_do->lonlat[0] = min_lat; t->lim_do->lonlat[1] = min_lon; t->min_rad = 0.0; t->max_rad = 1.0*((max_lat-min_lat)+(max_lon-min_lon)); t->rad = 0.01*((max_lat-min_lat)+(max_lon-min_lon)); t->prior_param_rad = 1./(0.1*((max_lat-min_lat)+(max_lon-min_lon))); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Set_Default_Migrep_Mod(int n_otu, t_phyrex_mod *t) { for(int i=0;i<2*n_otu-1;++i) t->sigsq_scale[i] = 1.0; t->sigsq_scale_min = 0.1; t->sigsq_scale_max = 10.; t->rrw_norm_fact = 1.0; t->model_id = -1; t->use_locations = -1; t->sampling_scheme = -1; t->safe_phyrex = YES; t->lim_up->lonlat[0] = 100.; t->lim_up->lonlat[1] = 100.; t->lim_do->lonlat[0] = 0.0; t->lim_do->lonlat[1] = 0.0; t->lbda = 1.E-0; t->min_lbda = 1.E-6; t->max_lbda = 1.E+4; t->prior_param_lbda = 1.0; t->mu = 0.800; t->min_mu = 0.000; t->max_mu = 1.000; t->prior_param_mu = 1.000; t->min_rad = 0.0; t->max_rad = 100.; t->rad = 4.; t->prior_param_rad = 1.; t->update_rad = NO; t->min_sigsq = 1.E-1; t->max_sigsq = 1.E+3; t->prior_param_sigsq = 10.0; assert(t->n_dim > 0); for(int i=0;in_dim;++i) t->sigsq[i] = t->min_sigsq + (t->max_sigsq-t->min_sigsq)/20.; t->nu = 1.0E-0; t->c_lnL = UNLIKELY; t->p_lnL = UNLIKELY; t->c_lnP = UNLIKELY; t->p_lnP = UNLIKELY; t->c_ln_prior_rad = UNLIKELY; t->c_ln_prior_lbda = UNLIKELY; t->c_ln_prior_mu = UNLIKELY; t->soft_bound_area = 0.1; t->max_num_of_intervals = 10000000; t->disp_prior_mean = 1.0; t->integrateAncestralLocations = YES; t->rrw_param_val = 2.0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PHYREX_Init_Lindisk_Node(t_ldsk *t, t_dsk *disk, int n_dim) { t->disk = disk; /* disk->ldsk = t; */ t->prev = NULL; t->next = NULL; t->img = NULL; t->nd = NULL; t->is_hit = NO; t->n_next = 0; t->rr = 1.0; t->sigsq = 1.0; GEO_Init_Coord(t->coord, n_dim); GEO_Init_Coord(t->cpy_coord,n_dim); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void MCMC_Init_MCMC_Struct(char *filename, option *io, t_mcmc *mcmc) { int pid; assert(mcmc); mcmc->io = io; mcmc->is = NO; mcmc->run = 0; mcmc->sample_interval = 1E+3; mcmc->chain_len = 1E+7; mcmc->chain_len_burnin = 1E+4; mcmc->randomize = YES; mcmc->norm_freq = 1E+3; mcmc->max_tune = 1.E+6; mcmc->min_tune = 1.E-6; mcmc->print_every = 2; mcmc->is_burnin = NO; mcmc->nd_t_digits = 4; mcmc->always_yes = NO; mcmc->max_lag = 1000; mcmc->sample_num = 0; if(filename) { char *s; s = (char *)mCalloc(T_MAX_NAME,sizeof(char)); strcpy(mcmc->out_filename,filename); pid = getpid(); sprintf(mcmc->out_filename+strlen(mcmc->out_filename),".%d",pid); strcpy(s,mcmc->io->in_align_file); strcat(s,"_"); strcat(s,mcmc->out_filename); strcat(s,".stats"); mcmc->out_fp_stats = fopen(s,"w"); strcpy(s,mcmc->io->in_align_file); strcat(s,"_"); strcat(s,mcmc->out_filename); strcat(s,".trees"); mcmc->out_fp_trees = fopen(s,"w"); strcpy(s,mcmc->io->in_align_file); strcat(s,"_"); strcat(s,mcmc->out_filename); strcat(s,".constree"); mcmc->out_fp_constree = fopen(s,"w"); /* strcpy(s,tree->mcmc->out_filename); */ /* strcat(s,".means"); */ /* tree->mcmc->out_fp_means = fopen(s,"w"); */ /* strcpy(s,tree->mcmc->out_filename); */ /* strcat(s,".lasts"); */ /* tree->mcmc->out_fp_last = fopen(s,"w"); */ Free(s); } else { mcmc->out_fp_stats = stderr; mcmc->out_fp_trees = stderr; /* tree->mcmc->out_fp_means = stderr; */ /* tree->mcmc->out_fp_last = stderr; */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Calibration(t_cal *cal) { cal->next = NULL; cal->prev = NULL; cal->lower = -1.; cal->upper = -1.; cal->is_primary = FALSE; cal->alpha_proba_list = NULL; cal->clade_list = NULL; cal->clade_list_size = 0; cal->id = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_All_Calibration(t_tree *tree) { int i; assert(tree->rates && tree->times->a_cal); For(i,2*tree->n_otu-1) Init_Calibration(tree->times->a_cal[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Sarea(t_sarea *s) { assert(s); s->n_poly = 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Calign(int n_otu, int crunch_len, int init_len, calign *this) { this->obs_pinvar = .0; this->n_otu = n_otu; this->clean_len = -1; this->crunch_len = crunch_len; this->init_len = init_len; this->format = 0; this->io_wght = NULL; for(int i=0; ic_seq[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Cseq(align *this) { this->is_duplicate = NO; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Linked_List(t_ll *list) { list->head = list; list->tail = list; list->next = NULL; list->prev = NULL; list->v = NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_NNI_Score(phydbl val, t_edge *b, t_tree *tree) { b->nni->score = val; if(tree->is_mixt_tree == YES) MIXT_Init_NNI_Score(val,b,tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef M4 void M4_Init_Model(m4 *m4mod, calign *data, t_mod *mod) { int i,j,ct; phydbl fq; if(mod->io->datatype == NT) m4mod->n_o = 4; else if(mod->io->datatype == AA) m4mod->n_o = 20; else { PhyML_Fprintf(stderr,"\n. Not implemented yet."); PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } mod->ns = m4mod->n_o * m4mod->n_h; for(i=0;in_o;i++) m4mod->o_fq[i] = mod->e_frq->pi->v[i]; /*! At that stage, the mod->pi vector as been initialized under a standard non covarion type of model. Use these frequencies as they have been set according to the nucleotide substitution model chosen (e.g., 1/4 for JC69). !*/ for(i=0;i<(int)(m4mod->n_h);++i) m4mod->multipl[i] = 1.; ct = 0; for(i=0;in_o-1;i++) { for(j=i+1;jn_o;j++) { m4mod->o_rr[ct] = MAX(mod->r_mat->qmat->v[i*m4mod->n_o+j],1.E-5); ct++; } } for(i=0;i<(int)(m4mod->n_h*(m4mod->n_h-1)/2);++i) m4mod->h_rr[i] = 1.; fq = (phydbl)(1./m4mod->n_h); if(mod->s_opt->opt_cov_delta) m4mod->delta = 1.0; if(mod->s_opt->opt_cov_alpha) m4mod->alpha = 1.0; for(i=0;in_h;i++) m4mod->h_fq[i] = fq; for(i=0;in_h;i++) m4mod->h_fq_unscaled[i] = 1.0; for(i=0;in_h;i++) m4mod->multipl[i] = (phydbl)i; for(i=0;in_h;i++) m4mod->multipl_unscaled[i] = (phydbl)i; Set_Update_Eigen(YES,mod); M4_Update_Qmat(m4mod,mod); } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Initialise x values using coordinates at the tip nodes along // one dimension (with index dim_idx) void RW_Init_Contrasts(int dim_idx, t_tree *tree) { for(int i=0;in_otu;++i) tree->ctrst->x[i] = tree->a_nodes[i]->ldsk->coord->lonlat[dim_idx]; for(int i=0;i<2*tree->n_otu-1;++i) tree->ctrst->tprime[i] = tree->times->nd_t[i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/init.h000066400000000000000000000060571422404706600153300ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef INIT_H #define INIT_H #include "utilities.h" void Init_Cseq(align *this); void Init_Eigen_Struct(eigen *this); void Init_Scalar_Dbl(scalar_dbl *p); void Init_Scalar_Int(scalar_int *p); void Init_Vect_Dbl(int len,vect_dbl *p); void Init_Vect_Int(int len,vect_int *p); void Init_Tree(t_tree *tree,int n_otu); void Init_Edge_Light(t_edge *b,int num); void Init_Node_Light(t_node *n,int num); void Init_NNI(t_nni *a_nni); void Init_Nexus_Format(nexcom **com); void Init_Mat(matrix *mat,calign *data); void Set_Defaults_Input(option *io); void Set_Defaults_Model(t_mod *mod); void Set_Defaults_Optimiz(t_opt *s_opt); void XML_Init_Node(xml_node *prev,xml_node *new_node,char *name); void Init_One_Spr(t_spr *a_spr); void Init_Model(calign *data,t_mod *mod,option *io); int Init_Qmat_Dayhoff(phydbl *daa,phydbl *pi); int Init_Qmat_DCMut(phydbl *daa,phydbl *pi); int Init_Qmat_MtArt(phydbl *daa,phydbl *pi); int Init_Qmat_HIVb(phydbl *daa,phydbl *pi); int Init_Qmat_HIVw(phydbl *daa,phydbl *pi); int Init_Qmat_JTT(phydbl *daa,phydbl *pi); int Init_Qmat_MtREV(phydbl *daa,phydbl *pi); int Init_Qmat_LG(phydbl *daa,phydbl *pi); int Init_Qmat_WAG(phydbl *daa,phydbl *pi); int Init_Qmat_RtREV(phydbl *daa,phydbl *pi); int Init_Qmat_CpREV(phydbl *daa,phydbl *pi); int Init_Qmat_VT(phydbl *daa,phydbl *pi); int Init_Qmat_Blosum62(phydbl *daa,phydbl *pi); int Init_Qmat_MtMam(phydbl *daa,phydbl *pi); int Init_Qmat_AB(phydbl *daa, phydbl *pi); void XML_Init_Attribute(xml_attr *attr); void Init_String(t_string *ts); void Init_Efrq(phydbl *b_frq, t_efrq *f); void RATES_Init_Rate_Struct(t_rate *rates, t_rate *existing_rates, int n_otu); void TIMES_Init_Time_Struct(t_time *times, t_time *existing_time, int n_otu); void Init_Rmat(t_rmat *rmat); void Init_MGF_Bl(t_tree *tree); int Init_Qmat_FLU(phydbl *daa, phydbl *pi); void Set_Defaults_Ras(t_ras *ras); void GEO_Init_Coord(t_geo_coord *t, int n_dim); void PHYREX_Init_Disk_Event(t_dsk *t, int n_dim, t_phyrex_mod *mod); void PHYREX_Init_Lindisk_Node(t_ldsk *t, t_dsk *devt, int n_dim); void PHYREX_Init_Migrep_Mod(t_phyrex_mod *t, int n_dim, phydbl min_lat, phydbl min_lon, phydbl max_lat, phydbl max_lon); void MCMC_Init_MCMC_Struct(char *filename, option *io, t_mcmc *mcmc); void Init_Calibration(t_cal *cal); void Init_All_Calibration(t_tree *tree); void Init_Sarea(t_sarea *s); void Init_Efrqs_Using_Observed_Freqs(t_efrq *f, phydbl *o, int ns); void Init_Calign(int n_otu, int crunch_len, int init_len, calign *this); void Init_Linked_List(t_ll *list); void Init_Target_Tip(t_clad *clade, t_tree *tree); void Init_NNI_Score(phydbl val, t_edge *b, t_tree *tree); void M4_Init_Model(m4 *m4mod, calign *data, t_mod *mod); void RW_Init_Contrasts(int dim_idx, t_tree *tree); void PHYREX_Set_Default_Migrep_Mod(int n_otu, t_phyrex_mod *t); #endif phyml-3.3.20220408/src/interface.c000066400000000000000000001447631422404706600163270ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "interface.h" #include "mg.h" void Launch_Interface(option *io) { Launch_Interface_Input(io); io->ready_to_go = 0; do { switch(io->curr_interface) { case INTERFACE_DATA_TYPE : { Launch_Interface_Data_Type(io); break; } case INTERFACE_MULTIGENE : { Launch_Interface_Multigene(io); break; } case INTERFACE_MODEL : { Launch_Interface_Model(io); break; } case INTERFACE_TOPO_SEARCH : { Launch_Interface_Topo_Search(io); break; } case INTERFACE_BRANCH_SUPPORT : { Launch_Interface_Branch_Support(io); break; } default : { PhyML_Printf("\n== Err in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); break; } } }while(!io->ready_to_go); if(io->in_tree == 2) { PhyML_Printf("\n. Enter the name of the input tree file > "); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file,0); } if((io->mod->whichmodel == CUSTOMAA) && (io->datatype == AA)) { char *filename; filename = (char *)mCalloc(T_MAX_NAME,sizeof(char)); fflush(NULL); PhyML_Printf("\n"); PhyML_Printf("\n. Enter the rate matrix file name > "); fflush(NULL); Getstring_Stdin(filename); io->mod->fp_aa_rate_mat = Openfile(filename,0); strcpy(io->mod->aa_rate_mat_file->s,filename); PhyML_Printf("\n"); Free(filename); fflush(NULL); } if((io->mod->s_opt->n_rand_starts) && (io->mod->s_opt->topo_search == NNI_MOVE) && (io->mod->s_opt->random_input_tree)) { Warn_And_Exit("\n. The random starting tree option is only compatible with SPR based search options.\n"); } if ((io->datatype == NT) && (io->mod->whichmodel > 10)) { char choix; PhyML_Printf("\n== Err: model incompatible with the data type. Please use JC69, K80, F81, HKY, F84, TN93 or GTR\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Warn_And_Exit("\n"); } else if ((io->datatype == AA) && (io->mod->whichmodel < 11)) { char choix; PhyML_Printf("\n== Err: model incompatible with the data type. Please use LG, Dayhoff, JTT, MtREV, WAG, DCMut, RtREV, CpREV, VT, Blosum62, MtMam, MtArt, HIVw, HIVb or AB.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } if(io->m4_model == YES) { #ifdef M4 io->mod->ns *= io->mod->m4mod->n_h; io->mod->use_m4mod = 1; M4_Make_Complete(io->mod->m4mod->n_h, io->mod->m4mod->n_o, io->mod->m4mod); #endif } else { io->mod->s_opt->opt_cov_delta = 0; io->mod->s_opt->opt_cov_alpha = 0; io->mod->s_opt->opt_cov_free_rates = 0; } if((io->mod->s_opt->opt_cov_free_rates) && (io->mod->s_opt->opt_cov_alpha)) { io->mod->s_opt->opt_cov_free_rates = 0; io->mod->m4mod->use_cov_alpha = 0; io->mod->m4mod->use_cov_free = 1; } if(io->print_site_lnl) { strcpy(io->out_lk_file,io->in_align_file); strcat(io->out_lk_file, "_phyml_lk.txt"); if(io->append_run_ID) { strcat(io->out_lk_file,"_"); strcat(io->out_lk_file,io->run_id_string); } io->fp_out_lk = Openfile(io->out_lk_file,1); } if(io->print_trace) { strcpy(io->out_trace_file,io->in_align_file); strcat(io->out_trace_file,"_phyml_trace.txt"); if(io->append_run_ID) { strcat(io->out_trace_file,"_"); strcat(io->out_trace_file,io->run_id_string); } io->fp_out_trace = Openfile(io->out_trace_file,1); } if(io->mod->s_opt->random_input_tree) { strcpy(io->out_trees_file,io->in_align_file); strcat(io->out_trees_file,"_phyml_trees.txt"); if(io->append_run_ID) { strcat(io->out_trees_file,"_"); strcat(io->out_trees_file,io->run_id_string); } io->fp_out_trees = Openfile(io->out_trees_file,1); } if((io->print_boot_trees) && (io->n_boot_replicates > 0)) { strcpy(io->out_boot_tree_file,io->in_align_file); strcat(io->out_boot_tree_file,"_phyml_boot_trees.txt"); if(io->append_run_ID) { strcat(io->out_boot_tree_file,"_"); strcat(io->out_boot_tree_file,io->run_id_string); } io->fp_out_boot_tree = Openfile(io->out_boot_tree_file,1); strcpy(io->out_boot_stats_file,io->in_align_file); strcat(io->out_boot_stats_file,"_phyml_boot_stats.txt"); if(io->append_run_ID) { strcat(io->out_boot_stats_file,"_"); strcat(io->out_boot_stats_file,io->run_id_string); } io->fp_out_boot_stats = Openfile(io->out_boot_stats_file,1); } if(io->append_run_ID) { strcat(io->out_tree_file,"_"); strcat(io->out_stats_file,"_"); strcat(io->out_tree_file,io->run_id_string); strcat(io->out_stats_file,io->run_id_string); } if(io->mod->ras->n_catg == 1) io->mod->s_opt->opt_alpha = 0; if(io->mod->whichmodel != K80 && io->mod->whichmodel != HKY85 && io->mod->whichmodel != F84 && io->mod->whichmodel != TN93) { io->mod->s_opt->opt_kappa = 0; } io->fp_out_tree = Openfile(io->out_tree_file,1); io->fp_out_stats = Openfile(io->out_stats_file,1); // VINCENT: do not necessarily optimize relative rate parameters, they could be set by user if(io->mod->whichmodel == GTR) { if (io->mod->s_opt->opt_subst_param) io->mod->s_opt->opt_rr = YES; else io->mod->s_opt->opt_rr = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Clear() { #ifdef WIN32 system("cls"); #elif UNIX PhyML_Printf("\033[2J\033[H"); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Input(option *io) { char choix; int n_trial; Clear(); Print_Banner(stdout); #ifdef EVOLVE char *n_data_sets; PhyML_Printf("\n\n"); PhyML_Printf("\n. Enter the tree file name > "); fflush(NULL); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file,0); PhyML_Printf("\n"); PhyML_Printf("\n. Enter the reference sequence file name > "); fflush(NULL); Getstring_Stdin(io->in_align_file); io->fp_in_align = Openfile(io->in_align_file,0); PhyML_Printf("\n"); PhyML_Printf("\n. Number of data sets > "); n_data_sets = (char *)mCalloc(10000,sizeof(char)); Getstring_Stdin(n_data_sets); n_trial = 0; while((!atoi(n_data_sets)) || (atoi(n_data_sets) < 0)) { if(++n_trial > 10) Exit("\n== Err : the number of sets must be a positive integer"); PhyML_Printf("\n. The number of sets must be a positive integer"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(n_data_sets); } io->n_data_set_asked = atoi(n_data_sets); Free(n_data_sets); #elif OPTIMIZ PhyML_Printf("\n. Enter the tree file name > "); fflush(NULL); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file,0); PhyML_Printf("\n"); PhyML_Printf("\n. Enter the reference sequence file name > "); fflush(NULL); Getstring_Stdin(io->in_align_file); io->fp_in_align = Openfile(io->in_align_file,0); PhyML_Printf("\n"); #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) PhyML_Printf("\n. Enter the sequence file name > "); fflush(NULL); Getstring_Stdin(io->in_align_file); io->fp_in_align = Openfile(io->in_align_file,0); #endif #if defined(PHYML) || defined(PART) || defined(PHYML_INSERT) strcpy(io->out_stats_file,io->in_align_file); strcat(io->out_stats_file,"_phyml_stats.txt"); strcpy(io->out_tree_file,io->in_align_file); strcat(io->out_tree_file,"_phyml_tree.txt"); strcpy(io->out_lk_file,io->in_align_file); strcat(io->out_lk_file,"_phyml_lk.txt"); #endif #ifdef EVOLVE if(Filexists("evolve_out.txt")); #elif OPTIMIZ if(Filexists("optimiz_out.txt")) #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) if(Filexists(io->out_stats_file)) #endif { PhyML_Printf("\n"); #ifdef EVOLVE PhyML_Printf("\n. A file 'evolve_out' already exists"); #elif OPTIMIZ PhyML_Printf("\n. A file 'optimiz_out' already exists"); #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) PhyML_Printf("\n. A file '%s' already exists",io->out_stats_file); #endif PhyML_Printf("\n. Do you want to Replace it or Append to it ? "); n_trial = 0; do { PhyML_Printf("\n. Please type R or A > "); if(!scanf("%c",&choix)) Exit("\n"); if(choix == '\n') choix = 'r'; else getchar(); if(++n_trial>10) Exit("\n"); Uppercase(&choix); } while((choix != 'R') && (choix != 'A')); if(choix == 'R') io->out_stats_file_open_mode = 1; else io->out_stats_file_open_mode = 2; } /* io->fp_out_stats = Openfile(io->out_stats_file,io->out_stats_file_open_mode); */ #ifdef EVOLVE if(Filexists("evolve_seq.txt")) #elif OPTIMIZ if(Filexists("optimiz_tree.txt")) #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) if(Filexists(io->out_tree_file)) #endif { PhyML_Printf("\n"); #ifdef EVOLVE PhyML_Printf("\n. A file 'evolve_seq' already exists"); #elif OPTIMIZ PhyML_Printf("\n. A file 'optimiz_tree' already exists"); #elif defined(PHYML) || defined(PART) || defined(PHYML_INSERT) PhyML_Printf("\n. A file '%s' already exists",io->out_tree_file); #endif PhyML_Printf("\n. Do you want to Replace it or Append to it ? "); n_trial = 0; do { PhyML_Printf("\n. Please type R or A > "); if(!scanf("%c",&choix)) Exit("\n"); if(choix == '\n') choix = 'r'; else getchar(); Uppercase(&choix); if(++n_trial>10) Exit("\n"); } while((choix != 'R') && (choix != 'A')); if(choix == 'R') io->out_tree_file_open_mode = 1; else io->out_tree_file_open_mode = 2; } /* io->fp_out_tree = Openfile(io->out_tree_file,io->out_tree_file_open_mode); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Data_Type(option *io) { char choix; char *s; char *buff; Clear(); Print_Banner(stdout); if(io->config_multigene) Print_Data_Set_Number(io,stdout); s = (char *)mCalloc(100,sizeof(char)); buff = (char *)mCalloc(100,sizeof(char)); PhyML_Printf("\n\n"); PhyML_Printf(" ................... \n"); PhyML_Printf(" Menu : Input Data \n"); PhyML_Printf(" ......................... \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); if(io->datatype == NT) strcpy(s,"DNA"); else if(io->datatype == AA) strcpy(s,"AA"); else strcpy(s,"Generic"); PhyML_Printf(" [D] " "....................... Data type (DNA/AA/Generic) " " %-15s \n",s); PhyML_Printf(" [I] " "...... Input sequences interleaved (or sequential) " " %-15s \n", (io->interleaved)?("interleaved"):("sequential")); strcpy(s,""); sprintf(s," (%d sets)",io->n_data_sets); strcpy(buff,(io->n_data_sets > 1)?("yes"):("no")); buff=strcat(buff,(io->n_data_sets > 1)?(s):("\0")); PhyML_Printf(" [M] " "....................... Analyze multiple data sets " " %-15s \n",buff); if(!io->append_run_ID) strcpy(s,"none"); else strcpy(s,io->run_id_string); PhyML_Printf(" [R] " "........................................... Run ID " " %-15s \n",s); PhyML_Printf("\n\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if(!scanf("%c",&choix)) Exit("\n"); if(choix != '\n') getchar(); /* \n */ fflush(NULL); Uppercase(&choix); switch(choix) { /* case '\n': */ /* { */ /* io->curr_interface++; */ /* break; */ /* } */ case 'R' : { io->append_run_ID = (io->append_run_ID)?(0):(1); PhyML_Printf("\n. Enter a run ID (any string of characters) > "); Getstring_Stdin(io->run_id_string); break; } case 'M' : { char *c; int n_trial; PhyML_Printf("\n. How many data sets > "); c = (char *)mCalloc(100,sizeof(char)); Getstring_Stdin(c); n_trial = 0; while((!atoi(c)) || (atoi(c) < 0)) { if(++n_trial > 10) Exit("\n== Err : The number of data sets must be a positive integer"); PhyML_Printf("\n. The number of data sets must be a positive integer"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(c); } io->n_data_sets = atoi(c); #ifdef PART if(io->n_data_sets > 1) { io->multigene = 1; } #endif if((io->do_boot || io->do_tbe) && (io->n_data_sets > 1)) { PhyML_Printf("\n. Bootstrap option is not allowed with multiple data sets !\n"); PhyML_Printf("\n. Type any key to exit."); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } Free(c); break; } case 'I' : { if(io->interleaved) io->interleaved = 0; else io->interleaved = 1; break; } case 'D' : { if(io->datatype == NT) { io->datatype = AA; io->mod->ns = 20; io->mod->s_opt->opt_kappa = 0; io->mod->whichmodel = LG; strcpy(io->mod->modelname->s,"LG"); } else if(io->datatype == AA) { io->datatype = GENERIC; io->mod->whichmodel = JC69; strcpy(io->mod->modelname->s,"JC69"); strcpy(io->nt_or_cd,"natural numbers"); } else if(io->datatype == GENERIC) { io->datatype = NT; io->mod->ns = 4; io->mod->whichmodel = HKY85; strcpy(io->mod->modelname->s,"HKY85"); strcpy(io->nt_or_cd,"nucleotides"); } break; } case '-' : { io->curr_interface = (io->config_multigene)?(INTERFACE_MODEL):(INTERFACE_BRANCH_SUPPORT); break; } case '+' : { io->curr_interface = (io->multigene)?(INTERFACE_MULTIGENE):(INTERFACE_MODEL); break; } case 'Y' : { io->ready_to_go = 1; break; } default : { break; } } Free(s); Free(buff); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Model(option *io) { char choix; char *s; s = (char *)mCalloc(100,sizeof(char)); Clear(); Print_Banner(stdout); if(io->config_multigene) Print_Data_Set_Number(io,stdout); PhyML_Printf("\n\n"); PhyML_Printf(" ........................... \n"); PhyML_Printf(" Menu : Substitution Model \n"); PhyML_Printf(" ................................. \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); if (io->datatype == NT) { if(!strcmp(io->nt_or_cd,"nucleotides")) { PhyML_Printf(" [M] " "................. Model of nucleotide substitution " " %-15s \n", io->mod->modelname->s); if((io->mod->whichmodel == F81) || (io->mod->whichmodel == HKY85) || (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93) || (io->mod->whichmodel == GTR) || (io->mod->whichmodel == CUSTOM)) { PhyML_Printf(" [F] " "................. Optimise equilibrium frequencies " " %-15s \n", (io->mod->s_opt->state_freq == ML)?("yes"):("no")); } if(io->mod->whichmodel == CUSTOM) { if(io->mod->s_opt->state_freq == EMPIRICAL) { PhyML_Printf(" [E] " "......... Equilibrium frequencies " " %-15s \n", "empirical"); } else if(io->mod->s_opt->state_freq == USER) { PhyML_Printf(" [E] " "......... Equilibrium frequencies " " %-15s \n", "user-defined"); } else if(io->mod->s_opt->state_freq == ML) { PhyML_Printf(" [E] " "......... Equilibrium frequencies " " %-15s \n", "optimized"); } PhyML_Printf(" [K] " "............................. Current custom model " " %-15s \n", io->mod->custom_mod_string->s); PhyML_Printf(" [O] " "................ Optimise relative rate parameters " " %-15s \n",(io->mod->s_opt->opt_rr)?("yes"):("no")); } } } else if(io->datatype == AA) { PhyML_Printf(" [M] " "................ Model of amino-acids substitution " " %-15s \n", io->mod->modelname->s); if(io->mod->s_opt->state_freq == EMPIRICAL) PhyML_Printf(" [F] " ". Amino acid frequencies " " %-15s \n", "empirical"); else if(io->mod->s_opt->state_freq == MODEL) PhyML_Printf(" [F] " ". Amino acid frequencies " " %-15s \n", "model"); else if(io->mod->s_opt->state_freq == ML) PhyML_Printf(" [F] " ". Amino acid frequencies " " %-15s \n", "optimized"); } else if(io->datatype == GENERIC) { PhyML_Printf(" [M] " "................. Model of nucleotide substitution " " %-15s \n", io->mod->modelname->s); } if ((io->datatype == NT) && ((io->mod->whichmodel == K80) || (io->mod->whichmodel == HKY85)|| (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93))) { strcpy(s,(io->mod->s_opt->opt_kappa)?("estimated"):("fixed")); if(io->mod->s_opt->opt_kappa) strcat(s,""); else strcat(s," (ts/tv = "); /* (io->mod->s_opt->opt_kappa)?((char *)strcat(s,"")):((char *)sprintf(s+(int)strlen((char *)s),"%3.2f)",io->mod->kappa->v)); */ if(io->mod->s_opt->opt_kappa) { strcat((char *)s,""); } else { sprintf((char *)(s+(int)strlen(s)),"%3.2f)",io->mod->kappa->v); } PhyML_Printf(" [T] " ".................... Ts/tv ratio (fixed/estimated) " " %-15s \n",s); } strcpy(s,io->mod->s_opt->opt_pinvar?"estimated":"fixed"); strcat(s,io->mod->s_opt->opt_pinvar?"":" (p-invar = "); if(io->mod->s_opt->opt_pinvar) { strcat(s,""); } else { sprintf((char *)(s+strlen((char *)s)),"%3.2f)",io->mod->ras->pinvar->v); } PhyML_Printf(" [V] " ". Proportion of invariable sites (fixed/estimated)" " %-15s \n",s); PhyML_Printf(" [R] " "....... One category of substitution rate (yes/no) " " %-15s \n", (io->mod->ras->n_catg > 1)?("no"):("yes")); if(io->mod->ras->n_catg > 1) { PhyML_Printf(" [C] " "........... Number of substitution rate categories " " %-15d \n", io->mod->ras->n_catg); } if(io->mod->ras->n_catg > 1) { PhyML_Printf(" [G] " "............. Gamma distributed rates across sites " " %-15s \n",(io->mod->ras->free_mixt_rates)?("no"):("yes")); } if((io->mod->ras->n_catg > 1) && (io->mod->ras->free_mixt_rates == NO)) { strcpy(s,(io->mod->s_opt->opt_alpha)?("estimated"):("fixed")); strcat(s,io->mod->s_opt->opt_alpha?"":" (alpha = "); if(io->mod->s_opt->opt_alpha) { strcat(s, ""); } else { sprintf(s+strlen(s),"%3.2f)",io->mod->ras->alpha->v); } PhyML_Printf(" [A] " "... Gamma distribution parameter (fixed/estimated) " " %-15s \n",s); /* strcpy(s,(io->mod->ras->gamma_median)?("median"):("mean")); */ /* PhyML_Printf(" [G] " */ /* ".........'Middle' of each rate class (mean/median) " */ /* " %-15s \n",s); */ } PhyML_Printf("\n\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if(!scanf("%c",&choix)) Exit("\n"); if(choix != '\n') getchar(); /* \n */ Uppercase(&choix); switch(choix) { /* case '\n': */ /* { */ /* io->curr_interface++; */ /* break; */ /* } */ case 'G' : { io->mod->ras->free_mixt_rates = (io->mod->ras->free_mixt_rates)?(NO):(YES); break; } case 'O' : { io->mod->s_opt->opt_rr = (io->mod->s_opt->opt_rr)?(0):(1); break; } case 'K' : { int i,j; char **rr_param,*rr; t_mod *mod; int n_trial; if(io->mod->whichmodel == CUSTOM) { rr_param = (char **)mCalloc(6,sizeof(char *)); for(i=0;i<6;i++) rr_param[i] = (char *)mCalloc(10,sizeof(char)); rr = (char *)mCalloc(50,sizeof(char)); mod = io->mod; mod->s_opt->opt_rr = 1; n_trial = 0; do { PhyML_Printf("\n. Enter a new custom model > "); Getstring_Stdin(io->mod->custom_mod_string->s); if(strlen(io->mod->custom_mod_string->s) == 6) { for(i=0;i<6;i++) { while(!isdigit((int)io->mod->custom_mod_string->s[i])) { if(++n_trial > 10) Exit("\n== Err : this string is not valid !\n"); PhyML_Printf("\n. This string is not valid\n"); PhyML_Printf("\n. Enter a new model > "); Getstring_Stdin(io->mod->custom_mod_string->s); } } if(i == 6) break; } else { PhyML_Printf("\n. The string should be of length 6\n"); n_trial++; } }while(n_trial < 10); if(n_trial == 10) Exit(""); if(!mod->r_mat) { mod->r_mat = (t_rmat *)Make_Rmat(mod->ns); Init_Rmat(mod->r_mat); Make_Custom_Model(mod); Translate_Custom_Mod_String(io->mod); } strcpy(rr_param[0],"A<->C"); strcpy(rr_param[1],"A<->G"); strcpy(rr_param[2],"A<->T"); strcpy(rr_param[3],"C<->G"); strcpy(rr_param[4],"C<->T"); strcpy(rr_param[5],"G<->T"); PhyML_Printf("\n. Set the relative rate values\n"); for(i=0;ir_mat->n_diff_rr;i++) { sprintf(rr,"\n. ["); for(j=0;j<6;j++) { if(mod->r_mat->rr_num->v[j] == i) { sprintf(rr+strlen(rr),"%s = ",rr_param[j]); } } sprintf(rr+strlen(rr)-3,"]"); PhyML_Printf("%s",rr); PhyML_Printf(" (current=%.2f) > ",mod->r_mat->rr_val->v[i]); Getstring_Stdin(rr); if(rr[0] != '\0') { n_trial = 0; while((atof(rr) < .0)) { if(++n_trial > 10) Exit("\n== Err : the value of this parameter must be a positive number\n"); PhyML_Printf("\n. The value of this parameter must be a positive number\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(rr); } io->mod->r_mat->rr_val->v[i] = (phydbl)atof(rr); } } for(i=0;i<6;i++) Free(rr_param[i]); Free(rr_param); Free(rr); } break; } case 'E' : { int i; if(io->mod->whichmodel == CUSTOM) { if(io->mod->s_opt->state_freq == EMPIRICAL) io->mod->s_opt->state_freq = ML; else if(io->mod->s_opt->state_freq == ML) io->mod->s_opt->state_freq = USER; else if(io->mod->s_opt->state_freq == USER) io->mod->s_opt->state_freq = MODEL; else if(io->mod->s_opt->state_freq == MODEL) io->mod->s_opt->state_freq = EMPIRICAL; if(io->mod->s_opt->state_freq == USER) { char **bases; char *bs; phydbl sum; int n_trial; bases = (char **)mCalloc(4,sizeof(char *)); for(i=0;i<4;i++) bases[i] = (char *)mCalloc(50,sizeof(char)); bs = (char *)mCalloc(100,sizeof(char)); strcpy(bases[0],". f(A)> "); strcpy(bases[1],". f(C)> "); strcpy(bases[2],". f(G)> "); strcpy(bases[3],". f(T)> "); PhyML_Printf("\n. Set nucleotide frequencies \n"); sum = .0; for(i=0;i<4;i++) { PhyML_Printf("%s",bases[i]); Getstring_Stdin(bs); n_trial = 0; while((atof(bs) < .0001) || (bs[0] == '\0')) { if(++n_trial > 10) Exit("\n== Err : the value of this parameter must be a positive number\n"); PhyML_Printf("\n. The value of this parameter must be a positive number\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(bs); } io->mod->e_frq->user_b_freq->v[i] = (phydbl)atof(bs); sum += io->mod->e_frq->user_b_freq->v[i]; } for(i=0;i<4;i++) io->mod->e_frq->user_b_freq->v[i] /= sum; if(sum > 1.0 || sum < 1.0) { PhyML_Printf("\n. The nucleotide frequencies have to be normalised in order to sum to 1.0.\n"); PhyML_Printf("\n. The frequencies are now : f(A)=%f, f(C)=%f, f(G)=%f, f(T)=%f.\n", io->mod->e_frq->user_b_freq->v[0], io->mod->e_frq->user_b_freq->v[1], io->mod->e_frq->user_b_freq->v[2], io->mod->e_frq->user_b_freq->v[3]); PhyML_Printf("\n. Enter any key to continue.\n"); if(!scanf("%c",bs)) Exit("\n"); } for(i=0;i<4;i++) Free(bases[i]); Free(bases); Free(bs); } else { Warn_And_Exit("\n. 'E' is not a valid option with these model settings.\n"); } } break; } case 'A' : { char answer; int n_trial; answer = 0; switch(io->mod->s_opt->opt_alpha) { case 0 : { PhyML_Printf("\n. Optimise alpha ? [Y/n] "); if(!scanf("%c",&answer)) Exit("\n"); if(answer == '\n') answer = 'Y'; else getchar(); break; } case 1 : { PhyML_Printf("\n. Optimise alpha ? [N/y] "); if(!scanf("%c",&answer)) Exit("\n"); if(answer == '\n') answer = 'N'; else getchar(); break; } default : Exit("\n"); } n_trial = 0; while((answer != 'Y') && (answer != 'y') && (answer != 'N') && (answer != 'n')) { if(++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Optimise alpha ? [N/y] "); if(!scanf("%c",&answer)) Exit("\n"); if(answer == '\n') answer = 'N'; else getchar(); } switch(answer) { case 'Y' : case 'y' : { io->mod->s_opt->opt_alpha = 1; io->mod->s_opt->opt_subst_param = 1; break; } case 'N' : case 'n' : { char *a; a = (char *)mCalloc(100,sizeof(char)); io->mod->ras->alpha->v = 10.0; io->mod->s_opt->opt_alpha = 0; PhyML_Printf("\n. Enter your value of alpha > "); Getstring_Stdin(a); n_trial = 0; while(atof(a) < 1.E-10) { if(++n_trial > 10) Exit("\n== Err : alpha must be > 1.E-10\n"); PhyML_Printf("\n. Alpha must be 1.E-10\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(a); } io->mod->ras->alpha->v = (phydbl)atof(a); Free(a); io->mod->s_opt->opt_alpha = 0; break; } } break; } case 'C' : { char *c; int n_trial; PhyML_Printf("\n. Enter your number of categories > "); c = (char *)mCalloc(100,sizeof(char)); Getstring_Stdin(c); n_trial = 0; while((!atoi(c)) || (atoi(c) < 0)) { if(++n_trial > 10) Exit("\n== Err : the number of categories must be a positive integer\n"); PhyML_Printf("\n. The number of categories must be a positive integer\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(c); } io->mod->ras->n_catg = atoi(c); Free(c); break; } case 'R' : { io->mod->ras->n_catg = (io->mod->ras->n_catg == 1)?(4):(1); break; } case 'V' : { char answer; int n_trial; answer = 0; switch(io->mod->s_opt->opt_pinvar) { case 0 : { PhyML_Printf("\n. Optimise p-invar ? [Y/n] "); answer = 0; if(!scanf("%c", &answer)) Exit("\n"); if(answer == '\n') answer = 'Y'; else getchar(); break; } case 1 : { PhyML_Printf("\n. Optimise p-invar ? [N/y] "); if(!scanf("%c", &answer)) Exit("\n"); if(answer == '\n') answer = 'N'; else getchar(); break; } default : Exit("\n"); } n_trial = 0; while((answer != 'Y') && (answer != 'y') && (answer != 'N') && (answer != 'n')) { if(++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Optimise p-invar ? [N/y] "); if(!scanf("%c", &answer)) Exit("\n"); if(answer == '\n') answer = 'N'; else getchar(); } switch(answer) { case 'Y' : case 'y' : { io->mod->s_opt->opt_subst_param = 1; io->mod->s_opt->opt_pinvar = 1; io->mod->ras->pinvar->v = 0.2; io->mod->ras->invar = 1; break; } case 'N' : case 'n' : { char *p; p = (char *)mCalloc(100,sizeof(char)); PhyML_Printf("\n. Enter your value of p-invar > "); Getstring_Stdin(p); n_trial = 0; while((atof(p) < 0.0) || (atof(p) > 1.0)) { if(++n_trial > 10) Exit("\n== Err : the proportion of invariable sites must be a positive number between 0.0 and 1.0"); PhyML_Printf("\n. The proportion must be a positive number between 0.0 and 1.0\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(p); } io->mod->ras->pinvar->v = (phydbl)atof(p); if(io->mod->ras->pinvar->v > 0.0+SMALL) io->mod->ras->invar = 1; else io->mod->ras->invar = 0; Free(p); io->mod->s_opt->opt_pinvar = 0; break; } } break; } case 'T' : { char answer; int n_trial; answer = 0; if((io->datatype == AA) || (io->mod->whichmodel == JC69)|| (io->mod->whichmodel == F81) || (io->mod->whichmodel == GTR) || (io->mod->whichmodel == CUSTOM)) { PhyML_Printf("\n. 'K' is not a valid choice for this model\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } switch(io->mod->s_opt->opt_kappa) { case 0 : { PhyML_Printf("\n. Optimise ts/tv ratio ? [Y/n] "); if(!scanf("%c", &answer)) Exit("\n"); if(answer == '\n') answer = 'Y'; else getchar(); break; } case 1 : { PhyML_Printf("\n. Optimise ts/tv ratio ? [N/y] "); if(!scanf("%c", &answer)) Exit("\n"); if(answer == '\n') answer = 'N'; else getchar(); break; } default : Exit("\n"); } n_trial = 0; while((answer != 'Y') && (answer != 'y') && (answer != 'N') && (answer != 'n')) { if(++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Optimise ts/tv ratio ? [N/y] "); if(!scanf("%c", &answer)) Exit("\n"); if(answer == '\n') answer = 'N'; else getchar(); } switch(answer) { case 'Y' : case 'y' : { io->mod->kappa->v = 4.0; io->mod->s_opt->opt_subst_param = 1; io->mod->s_opt->opt_kappa = 1; if(io->mod->whichmodel == TN93) io->mod->s_opt->opt_lambda = 1; break; } case 'N' : case 'n' : { char *t; t = (char *)mCalloc(100,sizeof(char)); io->mod->s_opt->opt_kappa = 0; PhyML_Printf("\n. Enter your value of the ts/tv ratio > "); Getstring_Stdin(t); n_trial = 0; while(atof(t) < .0) { if(++n_trial > 10) Exit("\n== Err : the ts/tv ratio must be a positive number\n"); PhyML_Printf("\n. The ratio must be a positive number"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(t); } io->mod->kappa->v = (phydbl)atof(t); io->mod->s_opt->opt_kappa = 0; io->mod->s_opt->opt_lambda = 0; Free(t); break; } } break; } case 'F' : { if((io->mod->whichmodel == JC69) || (io->mod->whichmodel == K80)) { Warn_And_Exit("\n. 'F' is not a valid choice with these model settings.\n"); } if(io->mod->s_opt->state_freq == EMPIRICAL) io->mod->s_opt->state_freq = ML; else if(io->mod->s_opt->state_freq == ML) io->mod->s_opt->state_freq = USER; else if(io->mod->s_opt->state_freq == USER) io->mod->s_opt->state_freq = MODEL; else if(io->mod->s_opt->state_freq == MODEL) io->mod->s_opt->state_freq = EMPIRICAL; break; } case 'M' : { if(io->datatype == NT) { if(!strcmp(io->nt_or_cd,"nucleotides")) { if(io->mod->whichmodel == JC69) { io->mod->whichmodel = K80; } else if(io->mod->whichmodel == K80) { io->mod->whichmodel = F81; } else if(io->mod->whichmodel == F81) { io->mod->whichmodel = HKY85; } else if(io->mod->whichmodel == HKY85) { io->mod->whichmodel = F84; } else if(io->mod->whichmodel == F84) { io->mod->whichmodel = TN93; } else if(io->mod->whichmodel == TN93) { io->mod->whichmodel = GTR; } else if(io->mod->whichmodel == GTR) { io->mod->whichmodel = CUSTOM; } else if(io->mod->whichmodel == CUSTOM) { io->mod->whichmodel = JC69; } } } else if(io->datatype == AA) { if(io->mod->whichmodel == LG) { io->mod->whichmodel = WAG; } else if(io->mod->whichmodel == WAG) { io->mod->whichmodel = DAYHOFF; } else if(io->mod->whichmodel == DAYHOFF) { io->mod->whichmodel = JTT; } else if(io->mod->whichmodel == JTT) { io->mod->whichmodel = BLOSUM62; } else if(io->mod->whichmodel == BLOSUM62) { io->mod->whichmodel = MTREV; } else if(io->mod->whichmodel == MTREV) { io->mod->whichmodel = RTREV; } else if(io->mod->whichmodel == RTREV) { io->mod->whichmodel = CPREV; } else if(io->mod->whichmodel == CPREV) { io->mod->whichmodel = DCMUT; } else if(io->mod->whichmodel == DCMUT) { io->mod->whichmodel = VT; } else if(io->mod->whichmodel == VT) { io->mod->whichmodel = MTMAM; } else if(io->mod->whichmodel == MTMAM) { io->mod->whichmodel = MTART; } else if(io->mod->whichmodel == MTART) { io->mod->whichmodel = HIVW; } else if(io->mod->whichmodel == HIVW) { io->mod->whichmodel = HIVB; } else if(io->mod->whichmodel == HIVB) { io->mod->whichmodel = AB; } else if(io->mod->whichmodel == AB) { io->mod->whichmodel = CUSTOMAA; } else if(io->mod->whichmodel == CUSTOMAA) { io->mod->whichmodel = LG; } } else if(io->datatype == GENERIC) { io->mod->whichmodel = JC69; } Set_Model_Name(io->mod); break; } case '-' : { io->curr_interface = INTERFACE_DATA_TYPE; break; } case '+' : { io->curr_interface = (io->config_multigene)?(INTERFACE_DATA_TYPE):(INTERFACE_TOPO_SEARCH); break; } case 'Y' : { io->ready_to_go = 1; break; } default : { break; } } if(io->mod->s_opt->opt_alpha || io->mod->s_opt->opt_kappa || io->mod->s_opt->opt_lambda || io->mod->s_opt->opt_pinvar || io->mod->s_opt->opt_rr) io->mod->s_opt->opt_subst_param = 1; else io->mod->s_opt->opt_subst_param = 0; Free(s); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Topo_Search(option *io) { char choix; char *s; s = (char *)mCalloc(100,sizeof(char)); Clear(); Print_Banner(stdout); PhyML_Printf("\n\n"); PhyML_Printf(" ....................... \n"); PhyML_Printf(" Menu : Tree Searching \n"); PhyML_Printf(" ............................. \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); PhyML_Printf(" [O] " "........................... Optimise tree topology " " %-15s \n", (io->mod->s_opt->opt_topo)?("yes"):("no")); if(io->mod->s_opt->opt_topo) { switch(io->in_tree) { case 0: { strcpy(s,"BioNJ"); break; } case 1: { strcpy(s,"parsimony"); break; } case 2: { strcpy(s,"user tree"); break; } } PhyML_Printf(" [U] " "........ Starting tree (BioNJ/parsimony/user tree) " " %-15s \n",s); } else { switch(io->in_tree) { case 0: { strcpy(s,"BioNJ"); break; } case 2: { strcpy(s,"user tree"); break; } } PhyML_Printf(" [U] " "..................... Input tree (BioNJ/user tree) " " %-15s \n",s); } if(io->mod->s_opt->opt_topo) { char *s; s = (char *)mCalloc(T_MAX_OPTION,sizeof(char)); io->mod->s_opt->topo_search = SPR_MOVE; if(io->mod->s_opt->topo_search == NNI_MOVE) { /* strcpy(s,"NNI moves (fast, approximate)\0"); */ strcpy(s,"SPR moves\0"); } else if(io->mod->s_opt->topo_search == SPR_MOVE) { strcpy(s,"SPR moves\0"); } else if(io->mod->s_opt->topo_search == BEST_OF_NNI_AND_SPR) { strcpy(s,"SPR moves\0"); /* strcpy(s,"Best of NNI and SPR \0"); */ } PhyML_Printf(" [S] " ".................. Tree topology search operations " " %-15s \n",s); Free(s); if(io->mod->s_opt->topo_search != NNI_MOVE) { PhyML_Printf(" [R] " "........................ Add random starting trees " " %-15s \n", (io->mod->s_opt->random_input_tree)?("yes"):("no")); if(io->mod->s_opt->random_input_tree) { PhyML_Printf(" [N] " ".................. Number of random starting trees " " %-15d \n",io->mod->s_opt->n_rand_starts); } } } else { PhyML_Printf(" [L] " ".......................... Optimise branch lengths " " %-15s \n", (io->mod->s_opt->opt_bl)?("yes"):("no")); } PhyML_Printf("\n\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if(!scanf("%c",&choix)) Exit("\n"); if(choix != '\n') getchar(); /* \n */ Free(s); Uppercase(&choix); switch(choix) { case '-' : { io->curr_interface = INTERFACE_MODEL; break; } case '+' : { io->curr_interface = INTERFACE_BRANCH_SUPPORT; break; } case 'Y' : { io->ready_to_go = 1; break; } case 'U' : { io->in_tree++; if(!io->mod->s_opt->opt_topo) { if(io->in_tree == 1) io->in_tree = 2; } if(io->in_tree == 3) io->in_tree = 0; break; } case 'N' : { char *n; int n_trial; PhyML_Printf("\n. Enter your number of starting trees > "); n = (char *)mCalloc(100,sizeof(char)); Getstring_Stdin(n); n_trial = 0; while(atoi(n) < 1) { if(++n_trial > 10) Exit("\n== Err : the number of starting trees must be a positive integer\n"); PhyML_Printf("\n. The number of starting trees must be a positive integer\n"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(n); } io->mod->s_opt->n_rand_starts = atoi(n); io->n_trees = 1; Free(n); break; } case 'O' : { io->mod->s_opt->opt_topo = (io->mod->s_opt->opt_topo)?(0):(1); break; } case 'L' : { if(!io->mod->s_opt->opt_topo) { io->mod->s_opt->opt_bl = (io->mod->s_opt->opt_bl)?(0):(1); } break; } case 'S' : { if(io->mod->s_opt->topo_search == NNI_MOVE) { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->n_rand_starts = 1; io->mod->s_opt->random_input_tree = 0; io->mod->s_opt->greedy = 0; } else if(io->mod->s_opt->topo_search == SPR_MOVE) { io->mod->s_opt->topo_search = BEST_OF_NNI_AND_SPR; io->mod->s_opt->n_rand_starts = 1; io->mod->s_opt->random_input_tree = 0; io->mod->s_opt->greedy = 0; } else if(io->mod->s_opt->topo_search == BEST_OF_NNI_AND_SPR) { io->mod->s_opt->topo_search = NNI_MOVE; io->mod->s_opt->n_rand_starts = 1; io->mod->s_opt->random_input_tree = 0; io->mod->s_opt->greedy = 0; } break; } case 'R' : { io->mod->s_opt->random_input_tree = (io->mod->s_opt->random_input_tree)?(0):(1); if(io->mod->s_opt->random_input_tree) { if(io->fp_in_tree) fclose(io->fp_in_tree); /* io->in_tree = 0; */ io->n_trees = 1; io->mod->s_opt->n_rand_starts = 5; strcpy(io->out_trees_file,io->in_align_file); strcat(io->out_trees_file,"_phyml_trees.txt"); } break; } default : { break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Branch_Support(option *io) { char choix; char *s; s = (char *)mCalloc(100,sizeof(char)); Clear(); Print_Banner(stdout); PhyML_Printf("\n\n"); PhyML_Printf(" ....................... \n"); PhyML_Printf(" Menu : Branch Support \n"); PhyML_Printf(" ............................. \n"); PhyML_Printf("\n\n"); PhyML_Printf(" [+] " ".................................... Next sub-menu\n"); PhyML_Printf(" [-] " "................................ Previous sub-menu\n"); PhyML_Printf(" [Y] " ".............................. Launch the analysis\n"); PhyML_Printf("\n"); strcpy(s,(io->do_boot || io->do_tbe)?("yes"):("no")); if(io->n_boot_replicates > 0) sprintf(s+strlen(s)," (%d replicate%s%s)", io->n_boot_replicates, (io->n_boot_replicates>1)?("s"):(""), (io->do_tbe)?(", TBE"):("")); /* PhyML_Printf(" [+] " */ PhyML_Printf(" [B] " "................ Non parametric bootstrap analysis " " %-15s \n",s); if(io->ratio_test == 0) { strcpy(s,"no"); } else if(io->ratio_test == 1) { strcpy(s,"yes / aLRT statistics"); } else if(io->ratio_test == 2) { strcpy(s,"yes / Chi2-based supports"); } else if(io->ratio_test == 3) { strcpy(s,"yes / min of SH-like & Chi2-based supports"); } else if(io->ratio_test == 4) { strcpy(s,"yes / SH-like supports"); } else if(io->ratio_test == 5) { strcpy(s,"yes / aBayes supports"); } /* PhyML_Printf(" [+] " */ PhyML_Printf(" [A] " "................ Approximate likelihood ratio test " " %-15s \n",s); PhyML_Printf("\n. Are these settings correct ? " "(type '+', '-', 'Y' or other letter for one to change) "); if(!scanf("%c",&choix)) Exit("\n"); if(choix != '\n') getchar(); /* \n */ Uppercase(&choix); Free(s); switch(choix) { /* case '\n': */ /* { */ /* io->curr_interface++; */ /* break; */ /* } */ case 'B' : { if(io->n_boot_replicates > 0) io->n_boot_replicates = 0; else { char *r; char answer; int n_trial; answer = 0; io->ratio_test = 0; if(io->n_data_sets > 1) { PhyML_Printf("\n. Bootstrap option is not allowed with multiple data sets.\n"); PhyML_Printf("\n. Type any key to exit.\n"); if(!scanf("%c",&choix)) Exit("\n"); Exit("\n"); } PhyML_Printf("\n. Number of replicates > "); r = (char *)mCalloc(T_MAX_OPTION,sizeof(char)); Getstring_Stdin(r); n_trial = 0; while((!atoi(r)) || (atoi(r) < 0)) { if(++n_trial > 10) Exit("\n== Err : the number of replicates must be a positive integer\n"); PhyML_Printf("\n. The number of replicates must be a positive integer"); PhyML_Printf("\n. Enter a new value > "); Getstring_Stdin(r); } io->n_boot_replicates = atoi(r); PhyML_Printf("\n. Print bootstrap trees (and statistics) ? (%s) > ", (io->print_boot_trees)?("Y/n"):("y/N")); if(!scanf("%c",&answer)) Exit("\n"); if(answer == '\n') answer = (io->print_boot_trees)?('Y'):('N'); else getchar(); switch(answer) { case 'Y' : case 'y' : { io->print_boot_trees = 1; strcpy(io->out_boot_tree_file,io->in_align_file); strcat(io->out_boot_tree_file,"_phyml_boot_trees.txt"); io->fp_out_boot_tree = Openfile(io->out_boot_tree_file,1); strcpy(io->out_boot_stats_file,io->in_align_file); strcat(io->out_boot_stats_file,"_phyml_boot_stats.txt"); io->fp_out_boot_stats = Openfile(io->out_boot_stats_file,1); break; } case 'N' : case 'n' : { io->print_boot_trees = 0; io->fp_out_boot_tree = NULL; io->fp_out_boot_stats = NULL; break; } } PhyML_Printf("\n. Compute TBE instead of FBP ? (%s) > ", (io->do_tbe)?("Y/n"):("y/N")); if(!scanf("%c",&answer)) Exit("\n"); if(answer == '\n') answer = (io->do_tbe)?('Y'):('N'); else getchar(); switch(answer) { case 'Y' : case 'y' : { io->do_tbe = YES; io->do_boot = NO; break; } case 'N' : case 'n' : { io->do_tbe = NO; io->do_boot = YES; break; } } Free(r); } break; } case 'A' : { io->do_boot = NO; io->do_tbe = NO; io->do_alrt = YES; io->n_boot_replicates = 0; switch(io->ratio_test) { case 0 : { io->ratio_test = 1; break; } case 1 : { io->ratio_test = 2; break; } case 2 : { /* io->ratio_test = 3; */ io->ratio_test = 4; break; } case 3 : { io->ratio_test = 4; break; } case 4 : { io->ratio_test = 5; break; } case 5 : { io->ratio_test = 0; break; } } break; } case '-' : { io->curr_interface = INTERFACE_TOPO_SEARCH; break; } case '+' : { io->curr_interface = INTERFACE_DATA_TYPE; break; } case 'Y' : { io->ready_to_go = 1; break; } default : break; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Launch_Interface_Multigene(option *io) { #ifdef PART if((io->n_data_sets > 1) && (io->multigene)) { int set, n_trial; char choix; io->n_part = io->n_data_sets; io->st = (supert_tree *)PART_Make_Supert_tree_Light(io); io->st->n_part = io->n_data_sets; for(set=0;setn_part;set++) { io->st->optionlist[set] = Make_Input(); Set_Defaults_Input(io->st->optionlist[set]); Set_Defaults_Model(io->st->optionlist[set]->mod); Set_Defaults_Optimiz(io->st->optionlist[set]->mod->s_opt); io->st->optionlist[set]->curr_gt = set; PhyML_Printf("\n. Enter the sequence file name [data set %2d] > ",set+1); fflush(NULL); Getstring_Stdin(io->st->optionlist[set]->in_align_file); io->st->optionlist[set]->fp_in_align = Openfile(io->st->optionlist[set]->in_align_file,0); } PhyML_Printf("\n. Do you want to use your own initial tree ? [N/y] "); if(!scanf("%c", &choix)) Exit("\n"); if(choix != '\n') getchar(); n_trial = 0; while((choix != 'Y') && (choix != 'y') && (choix != 'N') && (choix != 'n')) { if(++n_trial > 10) Exit("\n== Err : wrong answers !"); PhyML_Printf("\n. Do you want to use your own initial tree ? [N/y] ? "); if(!scanf("%c", &choix)) Exit("\n"); if(choix == '\n') choix = 'N'; else getchar(); } switch(choix) { case '\n' : break; case 'Y' : case 'y' : { io->in_tree = 2; PhyML_Printf("\n. Enter the name of the tree file > "); Getstring_Stdin(io->in_tree_file); io->fp_in_tree = Openfile(io->in_tree_file,0); break; } case 'N' : case 'n' : { io->in_tree = 0; break; } default : break; } io->curr_gt = 0; do { io->st->optionlist[io->curr_gt]->config_multigene = 1; do { switch(io->st->optionlist[io->curr_gt]->curr_interface) { case INTERFACE_DATA_TYPE : { Launch_Interface_Data_Type(io->st->optionlist[io->curr_gt]); break; } case INTERFACE_MODEL : { Launch_Interface_Model(io->st->optionlist[io->curr_gt]); break; } default : { PhyML_Printf("\n== Err in file %s at line %d\n\n",__FILE__,__LINE__); Exit(""); break; } } }while(!io->st->optionlist[io->curr_gt]->ready_to_go); io->curr_gt++; }while(io->curr_gt < io->n_part); } io->ready_to_go = 1; PART_Fill_Model_Partitions_Table(io->st); #endif } phyml-3.3.20220408/src/interface.h000066400000000000000000000014451422404706600163210ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef INTERFACE_H #define INTERFACE_H #include "utilities.h" #include "help.h" #include "models.h" #include "free.h" #include "help.h" void Launch_Interface(option *input); void Clear(); void Launch_Interface_Input(option *input); void Launch_Interface_Data_Type(option *input); void Launch_Interface_Model(option *input); void Launch_Interface_Topo_Search(option *input); void Launch_Interface_Branch_Support(option *input); void Launch_Interface_Multigene(option *input); #endif phyml-3.3.20220408/src/invitee.c000066400000000000000000002766561422404706600160410ustar00rootroot00000000000000#include "spr.h" #include "utilities.h" #include "lk.h" #include "optimiz.h" #include "bionj.h" #include "models.h" #include "free.h" #include "help.h" #include "simu.h" #include "eigen.h" #include "pars.h" #include "alrt.h" #include "mixt.h" #include "invitee.h" #ifdef MPI #include "mpi_boot.h" #endif #include ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PhyTime_XML(char *xml_file) { FILE *f; char **clade, *clade_name, **mon_list; phydbl low, up; int i, j, n_taxa, clade_size, node_num, n_mon; //rnd_num xml_node *n_r, *n_t, *n_m, *n_cur; t_cal *last_calib; align **data, **c_seq; option *io; calign *cdata; t_opt *s_opt; t_mod *mod; time_t t_beg,t_end; int r_seed; char *most_likely_tree; int user_lk_approx; t_tree *tree; t_node **a_nodes; //*node; m4 *m4mod; srand(time(NULL)); i = 0; j = 0; last_calib = NULL; mod = NULL; most_likely_tree = NULL; n_taxa = 0; node_num = -1; //file can/cannot be open: if ((f =(FILE *)fopen(xml_file, "r")) == NULL) { PhyML_Printf("\n== File '%s' can not be opened...\n",xml_file); Exit("\n"); } n_r = XML_Load_File(f); //memory allocation for model parameters: io = (option *)Make_Input(); mod = (t_mod *)Make_Model_Basic(); s_opt = (t_opt *)Make_Optimiz(); m4mod = (m4 *)M4_Make_Light(); Set_Defaults_Input(io); Set_Defaults_Model(mod); Set_Defaults_Optimiz(s_opt); io -> mod = mod; mod = io -> mod; mod -> s_opt = s_opt; clade_size = -1; //////////////////////////////////////////////////////////////////////////// //////////////////////reading tree topology://////////////////////////////// //looking for a node n_t = XML_Search_Node_Name("topology", YES, n_r); //setting tree: /* tree = (t_tree *)mCalloc(1,sizeof(t_tree)); */ n_cur = XML_Search_Node_Name("instance", YES, n_t); if(n_cur != NULL) { if(XML_Search_Attribute(n_cur, "user.tree") != NULL) { strcpy(io -> out_tree_file, XML_Search_Attribute(n_cur, "user.tree") -> value); io -> fp_out_tree = Openfile(io -> out_tree_file, 1); io -> tree = Read_Tree_File_Phylip(io -> fp_in_tree); } else { PhyML_Printf("\n== No input tree was not found. \n"); PhyML_Printf("\n== Please specify either a tree file name or enter the whole tree directly in the XML file (in Newick format). \n"); Exit("\n"); } } else io -> tree = Read_Tree(&n_t -> value); io -> n_otu = io -> tree -> n_otu; tree = io -> tree; //setting initial values to n_calib: For(i, 2 * tree -> n_otu - 2) { tree -> a_nodes[i] -> n_calib = 0; //PhyML_Printf("\n. '%d' \n", tree -> a_nodes[i] -> n_calib); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //memory for nodes: a_nodes = (t_node **)mCalloc(2 * io -> n_otu - 1,sizeof(t_node *)); For(i, 2 * io -> n_otu - 2) a_nodes[i] = (t_node *)mCalloc(1,sizeof(t_node)); //setting a model: tree -> rates = RATES_Make_Rate_Struct(io -> n_otu); RATES_Init_Rate_Struct(tree -> rates, io -> rates, tree -> n_otu); tree -> times = TIMES_Make_Time_Struct(io -> n_otu); TIMES_Init_Time_Struct(tree -> times, io -> times, tree -> n_otu); //reading seed: if(XML_Search_Attribute(n_r, "seed")) io -> r_seed = String_To_Dbl(XML_Search_Attribute(n_r, "seed") -> value); //TO DO: check that the tree has a root Update_Ancestors(io -> tree -> n_root, io -> tree -> n_root -> v[2], io -> tree -> n_root -> b[2], io -> tree); Update_Ancestors(io -> tree -> n_root, io -> tree -> n_root -> v[1], io -> tree -> n_root -> b[1], io -> tree); //////////////////////////////////////////////////////////////////////////// //////////////////////memory allocation for temp parameters///////////////// //memory for monitor flag: io -> mcmc -> monitor = (int *)mCalloc(2 * io -> n_otu - 1,sizeof(int)); //memory for sequences: n_cur = XML_Search_Node_Name("alignment", YES, n_r); data = (align **)mCalloc(io -> n_otu,sizeof(align *)); For(i, io -> n_otu) { data[i] = (align *)mCalloc(1,sizeof(align)); data[i] -> name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); if(n_cur -> child -> value != NULL) data[i] -> state = (char *)mCalloc(strlen(n_cur -> child -> value) + 1,sizeof(char)); else data[i] -> state = (char *)mCalloc(T_MAX_SEQ,sizeof(char)); } io -> data = data; //tree -> data = data; //memory for clade: clade_name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); //memory for list of clades to be monitored mon_list = (char **)mCalloc(T_MAX_FILE,sizeof(char *)); For(i, T_MAX_FILE) { mon_list[i] = (char *)mCalloc(T_MAX_NAME,sizeof(char)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //reading monitor node: i = 0; n_m = XML_Search_Node_Name("monitor", YES, n_r); if(n_m != NULL) { do { strcpy(mon_list[i], n_m -> child -> attr -> value); i++; if(n_m -> child) n_m -> child = n_m -> child -> next; else break; } while(n_m -> child); n_mon = i; } else { n_mon = 0; PhyML_Printf("\n. There is no clade to be monitored. \n"); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //chekcing for calibration node (upper or lower bound) to exist: n_cur = XML_Search_Node_Name("calibration", YES, n_r); if(n_cur == NULL) { PhyML_Printf("\n== There is no calibration information provided. \n"); PhyML_Printf("\n== Please check your data. \n"); Exit("\n"); } else { if(XML_Search_Node_Name("upper", NO, n_cur -> child) == NULL && XML_Search_Node_Name("lower", NO, n_cur -> child) == NULL) { PhyML_Printf("\n== There is no calibration information provided. \n"); PhyML_Printf("\n== Please check your data. \n"); Exit("\n"); } } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// n_r = n_r -> child; tree -> rates -> tot_num_cal = 0; do { if(!strcmp(n_r -> name, "alignment"))//looking for a node . { if(!n_r -> attr -> value) { PhyML_Printf("\n== Sequence type (nt / aa) must be provided. \n"); PhyML_Printf("\n== Please, include this information as an attribute of component <%s>. \n", n_r -> name); Exit("\n"); } char *s; s = To_Upper_String(n_r -> attr -> value); /* if(!strcmp(To_Upper_String(n_r -> attr -> value), "NT")) */ if(!strcmp(s, "NT")) { io -> datatype = 0; io -> mod -> ns = 4; } /* if(!strcmp(To_Upper_String(n_r -> attr -> value), "AA")) */ if(!strcmp(s, "AA")) { io -> datatype = 1; io -> mod -> ns = 20; } free(s); n_cur = XML_Search_Node_Name("instance", YES, n_r); if(n_cur != NULL) { if(XML_Search_Attribute(n_cur, "user.alignment") != NULL) { strcpy(io -> in_align_file, XML_Search_Attribute(n_cur, "user.alignment") -> value); io -> fp_in_align = Openfile(io -> in_align_file, 1); Detect_Align_File_Format(io); io -> data = Get_Seq(io); } } else { char *s; i = 0; s = To_Upper_String(n_r -> child -> value); do { strcpy(io -> in_align_file, "invitee"); strcpy(io -> data[i] -> name, n_r -> child -> attr -> value); /* strcpy(io -> data[i] -> state, To_Upper_String(n_r -> child -> value)); */ strcpy(io -> data[i] -> state, s); i++; if(n_r -> child -> next) n_r -> child = n_r -> child -> next; else break; } while(n_r -> child); n_taxa = i; free(s); } //checking if a sequences of the same lengths: i = 1; For(i, n_taxa) if(strlen(io -> data[0] -> state) != strlen(io -> data[i] -> state)) { PhyML_Printf("\n== All the sequences should be of the same length. Please check your data...\n"); Exit("\n"); break; } //checking sequence names: i = 0; For(i, n_taxa) Check_Sequence_Name(io -> data[i] -> name); //check if a number of tips is equal to a number of taxa: if(n_taxa != io -> n_otu) { PhyML_Printf("\n== The number of taxa is not the same as a number of tips. Check your data...\n"); Exit("\n"); } //deleting '-', etc. from sequences: io -> data[0] -> len = strlen(io -> data[0] -> state); Post_Process_Data(io); n_r = n_r -> next; } else if(!strcmp(n_r -> name, "calibration"))//looking for a node . { tree -> rates -> tot_num_cal++; if (tree -> rates -> calib == NULL) tree -> rates -> calib = Make_Calib(tree -> n_otu); if(last_calib) { last_calib -> next = tree -> rates -> calib; tree -> rates -> calib -> prev = last_calib; } last_calib = tree -> rates -> calib; low = -BIG; up = BIG; n_cur = XML_Search_Node_Name("lower", YES, n_r); if(n_cur != NULL) low = String_To_Dbl(n_cur -> value); n_cur = XML_Search_Node_Name("upper", YES, n_r); if(n_cur != NULL) up = String_To_Dbl(n_cur -> value); do { if(!strcmp("appliesto", n_r -> child -> name)) { //case of internal node: strcpy(clade_name, n_r -> child -> attr -> value);//reached clade names n_r -> child -> attr -> value if(!strcmp("root", clade_name)) { node_num = io -> tree -> n_root -> num; } else if(strcmp("NO_CLADE", clade_name) && strcmp("root", clade_name)) { xml_node *n_clade, *nd2; nd2 = n_r -> parent; n_clade = XML_Search_Node_Generic("clade", "id", clade_name, YES, nd2); if(n_clade) //found clade with a given name { i = 0; xml_node *nd; nd = n_clade -> child; clade = XML_Read_Clade(nd, tree); clade_size = XML_Number_Of_Taxa_In_Clade(nd); node_num = Find_Clade(clade, clade_size, io -> tree); } else { PhyML_Printf("\n== The calibration information for clade [%s] was not found.", clade_name); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } } if(strcmp("NO_CLADE", clade_name)) { For(j, n_mon) { if(!strcmp(clade_name, mon_list[j])) io -> mcmc -> monitor[node_num] = YES; } } if(strcmp("NO_CLADE", clade_name)) { tree -> rates -> calib -> proba[node_num] = String_To_Dbl(n_r -> child -> attr -> next -> value); if(!n_r -> child -> attr -> next && n_r -> child -> next == NULL) tree -> rates -> calib -> proba[node_num] = 1.; if(!n_r -> child -> attr -> next && n_r -> child -> next) { PhyML_Printf("\n== You either need to provide information about the probability with which calibration "); PhyML_Printf("\n== applies to a node or you need to apply calibration only to one node."); PhyML_Printf("\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } tree -> rates -> calib -> all_applies_to[tree -> rates -> calib -> n_all_applies_to] -> num = node_num; } else tree -> rates -> calib -> proba[2 * tree -> n_otu - 1] = String_To_Dbl(n_r -> child -> attr -> next -> value); tree -> rates -> calib -> n_all_applies_to++; tree -> rates -> calib -> lower = low; tree -> rates -> calib -> upper = up; PhyML_Printf("\n. Lower bound: %f.", low); PhyML_Printf("\n. Upper bound: %f.", up); ///////////////////////////////////////////////////////////////////////////////////////////////////// PhyML_Printf("\n. ......................................................................."); PhyML_Printf("\n"); if(strcmp(clade_name, "NO_CLADE")) PhyML_Printf("\n. Clade name: [%s]", clade_name); else { PhyML_Printf("\n. Calibration with:"); PhyML_Printf("\n. Lower bound set to: %15f time units.", low); PhyML_Printf("\n. Upper bound set to: %15f time units.", up); PhyML_Printf("\n. does not apply to any node with probability [%f]", String_To_Dbl(n_r -> child -> attr -> next -> value)); PhyML_Printf("\n. ......................................................................."); } if(strcmp(clade_name, "root") && strcmp(clade_name, "NO_CLADE")) { For(i, clade_size) PhyML_Printf("\n. Taxon name: [%s]", clade[i]); } if(strcmp(clade_name, "NO_CLADE")) { PhyML_Printf("\n. Node number to which calibration applies to is [%d] with probability [%f]", node_num, String_To_Dbl(n_r -> child -> attr -> next -> value)); PhyML_Printf("\n. Lower bound set to: %15f time units.", low); PhyML_Printf("\n. Upper bound set to: %15f time units.", up); PhyML_Printf("\n. ......................................................................."); } ///////////////////////////////////////////////////////////////////////////////////////////////////// if(n_r -> child -> next) n_r -> child = n_r -> child -> next; else break; } else if(n_r -> child -> next) n_r -> child = n_r -> child -> next; else break; } while(n_r -> child); tree -> rates -> calib = tree -> rates -> calib -> next; n_r = n_r -> next; } else if(!strcmp(n_r -> name, "ratematrices"))//initializing rate matrix: { if(n_r -> child) { Make_Ratematrice_From_XML_Node(n_r -> child, io, mod); n_r = n_r -> next; } else n_r = n_r -> next; } else if(!strcmp(n_r -> name, "equfreqs"))//initializing frequencies: { if(n_r -> child) { Make_Efrq_From_XML_Node(n_r -> child , io, mod); n_r = n_r -> next; } else n_r = n_r -> next; } else if(!strcmp(n_r -> name, "siterates"))//initializing site rates: { if(n_r -> child) { Make_RAS_From_XML_Node(n_r, io -> mod); n_r = n_r -> next; } else n_r = n_r -> next; } else if (n_r -> next) n_r = n_r -> next; else break; } while(1); tree -> rates -> calib = last_calib; while(tree -> rates -> calib -> prev) tree -> rates -> calib = tree -> rates -> calib -> prev; //////////////////////////////////////////////////////////////////////////////////////////////// //Check for the sum of probabilities for one calibration add up to one do { phydbl p = 0.0; for(i = tree -> n_otu; i < 2 * tree -> n_otu; i++) { p = p + tree -> rates -> calib -> proba[i]; /* PhyML_Printf("\n. # applies to %d \n", tree -> rates -> calib -> n_all_applies_to); */ /* PhyML_Printf("\n. %f \n", tree -> rates -> calib -> proba[i]); */ } if(!Are_Equal(p, 1.0, 1.E-10)) { PhyML_Printf("\n. ......................................................................."); PhyML_Printf("\n. WARNING! The sum of the probabilities for the calibration with:"); PhyML_Printf("\n. Lower bound set to: %15f time units.", tree -> rates -> calib -> lower); PhyML_Printf("\n. Upper bound set to: %15f time units.", tree -> rates -> calib -> upper); PhyML_Printf("\n. is not equal to 1."); PhyML_Printf("\n. The probability that this calibration does not apply to any node is set to [%f].", 1.0 - p); PhyML_Printf("\n. ......................................................................."); tree -> rates -> calib -> proba[2 * tree -> n_otu - 1] = 1.0 - p; tree -> rates -> calib -> n_all_applies_to++; /* PhyML_Printf("\n==You need to provide proper probabilities for the calibration. \n"); */ /* PhyML_Printf("\n. Err. in file %s at line %d\n",__FILE__,__LINE__); */ /* Exit("\n"); */ } if(tree -> rates -> calib -> next) tree -> rates -> calib = tree -> rates -> calib -> next; else break; } while(tree -> rates -> calib); while(tree -> rates -> calib -> prev) tree -> rates -> calib = tree -> rates -> calib -> prev; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //clear memory: free(clade_name); For(i, tree -> n_otu) { free(clade[i]); } free(clade); For(i, T_MAX_FILE) { free(mon_list[i]); } free(mon_list); /* do */ /* { */ /* printf("\n %f %f \n", tree -> rates -> calib -> lower, tree -> rates -> calib -> upper); */ /* printf("\n numb applies to: %d \n", tree -> rates -> calib -> n_all_applies_to); */ /* For(i, tree -> rates -> calib -> n_all_applies_to) printf("\n Node number %d \n", tree -> rates -> calib -> all_applies_to[i] -> num); */ /* if(tree -> rates -> calib -> next) tree -> rates -> calib = tree -> rates -> calib -> next; */ /* else break; */ /* } */ /* while(tree -> rates -> calib); */ /* while(tree -> rates -> calib -> prev) tree -> rates -> calib = tree -> rates -> calib -> prev; */ /* Exit("\n"); */ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //START analysis: r_seed = (io -> r_seed < 0)?(time(NULL)):(io -> r_seed); srand(r_seed); rand(); PhyML_Printf("\n. Seed: %d\n", r_seed); PhyML_Printf("\n. Pid: %d\n",getpid()); PhyML_Printf("\n. Compressing sequences...\n"); data = io -> data; data[0] -> len = strlen(data[0] -> state); //////////////////////////////////////////////////////////////////////////// //memory for compressed sequences: cdata = (calign *)mCalloc(1,sizeof(calign)); c_seq = (align **)mCalloc(io -> n_otu,sizeof(align *)); For(i, io -> n_otu) { c_seq[i] = (align *)mCalloc(1,sizeof(align)); c_seq[i] -> name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); c_seq[i] -> state = (char *)mCalloc(data[0] -> len + 1,sizeof(char)); } cdata -> c_seq = c_seq; //////////////////////////////////////////////////////////////////////////// cdata = Compact_Data(data, io); Free_Seq(io -> data, cdata -> n_otu); io -> mod -> io = io; Check_Ambiguities(cdata, io -> mod -> io -> datatype, io -> state_len); Make_Model_Complete(mod); Init_Model(cdata, mod, io); if(io -> mod -> use_m4mod) M4_Init_Model(mod -> m4mod, cdata, mod); time(&(t_beg)); RATES_Fill_Lca_Table(tree); tree -> mod = mod; tree -> io = io; tree -> data = cdata; tree -> n_pattern = tree -> data -> crunch_len / tree -> io -> state_len; Set_Both_Sides(YES, tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); //calculate the probabilities of each combination of calibrations: TIMES_Calib_Partial_Proba(tree); int cal_numb = 0; do { if(!Are_Equal(tree -> rates -> times_partial_proba[cal_numb], 0.0, 1.E-10)) break; else cal_numb += 1; } while(1); PhyML_Printf("\n. Calibration number chosen %d.\n", cal_numb); Set_Current_Calibration(cal_numb, tree); tree -> rates -> numb_calib_chosen[cal_numb]++; int tot_num_comb; tot_num_comb = Number_Of_Comb(tree -> rates -> calib); PhyML_Printf("\n. The number of calibration combinations that is going to be considered is %d.\n", tot_num_comb); /* For(i, tot_num_comb) Set_Current_Calibration(i, tree); */ /* Exit("\n"); */ //set initial value for Hastings ratio for conditional jump: /* tree -> rates -> c_lnL_Hastings_ratio = 0.0; */ TIMES_Set_All_Node_Priors(tree); tree -> rates -> cur_comb_numb = cal_numb; tree -> rates -> log_K_cur = K_Constant_Prior_Times_Log(tree); TIMES_Get_Number_Of_Time_Slices(tree); TIMES_Label_Edges_With_Calibration_Intervals(tree); tree -> write_br_lens = NO; PhyML_Printf("\n. Input tree with calibration information ('almost' compatible with MCMCtree).\n"); char *t; t = Write_Tree(tree, YES); PhyML_Printf("\n. %s \n", t); free(t); tree -> write_br_lens = YES; // Work with log of branch lengths? if(tree -> mod -> log_l == YES) Log_Br_Len(tree); if(io -> mcmc -> use_data == YES) { // Force the exact likelihood score user_lk_approx = tree -> io -> lk_approx; tree -> io -> lk_approx = EXACT; /* MLE for branch lengths */ /* printf("\n. %s",Write_Tree(tree,NO)); */ /* printf("\n. alpha %f",tree->mod->ras->alpha->v); */ /* printf("\n. %f %f %f %f",tree->mod->e_frq->pi->v[0],tree->mod->e_frq->pi->v[1],tree->mod->e_frq->pi->v[2],tree->mod->e_frq->pi->v[3]); */ /* Lk(NULL,tree); */ /* printf("\n. %f",tree->c_lnL); */ /* Exit("\n"); */ Round_Optimize(tree, tree -> data, ROUND_MAX); // Set vector of mean branch lengths for the Normal approximation of the likelihood RATES_Set_Mean_L(tree); // Estimate the matrix of covariance for the Normal approximation of the likelihood PhyML_Printf("\n"); PhyML_Printf("\n. Computing Hessian..."); tree -> rates -> bl_from_rt = 0; Free(tree -> rates -> cov_l); tree -> rates -> cov_l = Hessian_Seo(tree); // tree->rates->cov_l = Hessian_Log(tree); For(i, (2 * tree -> n_otu - 3) * (2 * tree -> n_otu - 3)) tree -> rates -> cov_l[i] *= -1.0; if(!Iter_Matinv(tree -> rates -> cov_l, 2 * tree -> n_otu - 3, 2 * tree -> n_otu - 3, YES)) Exit("\n"); tree -> rates -> covdet = Matrix_Det(tree -> rates -> cov_l, 2 * tree -> n_otu - 3, YES); For(i,(2 * tree -> n_otu - 3) * (2 * tree -> n_otu - 3)) tree -> rates -> invcov[i] = tree -> rates -> cov_l[i]; if(!Iter_Matinv(tree -> rates -> invcov, 2 * tree -> n_otu - 3, 2 * tree -> n_otu - 3, YES)) Exit("\n"); tree -> rates -> grad_l = Gradient(tree); // Pre-calculation of conditional variances to speed up calculations RATES_Bl_To_Ml(tree); RATES_Get_Conditional_Variances(tree); RATES_Get_All_Reg_Coeff(tree); RATES_Get_Trip_Conditional_Variances(tree); RATES_Get_All_Trip_Reg_Coeff(tree); Lk(NULL, tree); PhyML_Printf("\n"); PhyML_Printf("\n. p(data|model) [exact ] ~ %.2f",tree -> c_lnL); tree -> io -> lk_approx = NORMAL; For(i,2 * tree -> n_otu - 3) tree -> rates -> u_cur_l[i] = tree -> rates -> mean_l[i] ; tree -> c_lnL = Lk(NULL,tree); PhyML_Printf("\n. p(data|model) [approx] ~ %.2f",tree -> c_lnL); tree -> io -> lk_approx = user_lk_approx; } tree -> rates -> model = io -> rates -> model; PhyML_Printf("\n. Selected model '%s' \n", RATES_Get_Model_Name(io -> rates -> model)); if(tree -> rates -> model == GUINDON) tree -> mod -> gamma_mgf_bl = YES; tree -> rates -> bl_from_rt = YES; if(tree -> io -> cstr_tree) Find_Surviving_Edges_In_Small_Tree(tree, tree -> io -> cstr_tree); time(&t_beg); tree -> mcmc = MCMC_Make_MCMC_Struct(); MCMC_Copy_MCMC_Struct(tree -> io -> mcmc, tree -> mcmc, "phytime"); tree -> mod -> m4mod = m4mod; MCMC_Complete_MCMC(tree -> mcmc, tree); tree -> mcmc -> is_burnin = NO; MCMC(tree); PhyML_Printf("\n"); for(i=0;i<6;i++) printf(" %d ", tree -> rates -> numb_calib_chosen[i]); PhyML_Printf("\n"); MCMC_Close_MCMC(tree -> mcmc); MCMC_Free_MCMC(tree -> mcmc); PhyML_Printf("\n"); Free_Calib(tree -> rates -> calib); Add_Root(tree->a_edges[0],tree); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); Free_Calign(cdata); Free_Model(mod); if(io -> fp_in_align) fclose(io -> fp_in_align); if(io -> fp_in_tree) fclose(io -> fp_in_tree); if(io -> fp_out_lk) fclose(io -> fp_out_lk); if(io -> fp_out_tree) fclose(io -> fp_out_tree); if(io -> fp_out_trees) fclose(io -> fp_out_trees); if(io -> fp_out_stats) fclose(io -> fp_out_stats); fclose(f); Free(most_likely_tree); Free_Input(io); time(&t_end); Print_Time_Info(t_beg,t_end); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Calculate the prior probability for node times taking into account the //probailitis with which each calibration applies to the particular node. phydbl TIMES_Calib_Cond_Prob(t_tree *tree) { phydbl times_lk, *Yule_val, *times_partial_proba, times_tot_proba, c, constant, ln_t; int i, tot_num_comb; t_cal *calib; times_tot_proba = 0.0; calib = tree -> rates -> calib; times_partial_proba = tree -> rates -> times_partial_proba; tot_num_comb = Number_Of_Comb(calib); Yule_val = (phydbl *)mCalloc(tot_num_comb, sizeof(phydbl)); For(i, tot_num_comb) { Set_Current_Calibration(i, tree); int result; result = TRUE; TIMES_Set_All_Node_Priors_S(&result, tree); times_lk = TIMES_Lk_Yule_Order_Root_Cond(tree); constant = 0.0; if(tot_num_comb > 1 && times_lk > -INFINITY && result != FALSE && tree->rates->update_time_norm_const == YES) Yule_val[i] = constant + times_lk; while(calib -> prev) calib = calib -> prev; } /* Exit("\n"); */ c = .0; times_tot_proba = 0.0; For(i, tot_num_comb) { times_tot_proba += times_partial_proba[i] * exp(Yule_val[i] + c); } ln_t = -c + log(times_tot_proba); free(Yule_val); return(ln_t); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //Function calculates the normalizing constant K of the joint distribution Yule_Order. //Use the fact that density Yule_Order can be used streight forward only in case of the complete //overlap of the calibration intervals for all of the nodes or in case of no overlap. phydbl K_Constant_Prior_Times_Log(t_tree *tree) { int i, j, k, f, n_otu, *indic, *n_slice, *slice_numbers; phydbl buf, chop_bound, *t_prior_min, *t_prior_max, *t_slice, *t_slice_min, *t_slice_max, *g_i_node; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; n_otu = tree -> n_otu; t_slice = (phydbl *)mCalloc(2 * (n_otu - 1), sizeof(phydbl)); //the vector of the union of lower and upper bounds, lined up in incresing order. t_slice_min = (phydbl *)mCalloc(2 * n_otu - 3, sizeof(phydbl)); //vector of the lower bounds of the sliced intervals. t_slice_max = (phydbl *)mCalloc(2 * n_otu - 3, sizeof(phydbl)); //vector of the upper bounds of the sliced intervals. indic = (int *)mCalloc((n_otu - 1) * (2 * n_otu - 3), sizeof(int)); //vector of the indicators, columns - node numbers (i + n_otu), rows - the number of the sliced interval. slice_numbers = (int *)mCalloc((n_otu - 1) * (2 * n_otu - 3), sizeof(int )); //vecor of the slice intervals numbers, columns node numbers (i + n_otu), rows - the number of the sliced interval. n_slice = (int *)mCalloc(n_otu - 1, sizeof(int)); //vector of the numbers of sliced intervals that apply to one node with number (i + n_otu). g_i_node = (phydbl *)mCalloc((n_otu - 1) * (2 * n_otu - 3), sizeof(phydbl)); //vector of the values of the function g evaluated for each node. i = 0; /* K = 0; */ j = n_otu; //////////////////////////////////////////////////////////////////////////// //Put prior bounds in one vector t_slice. Excluding tips. For(i, n_otu - 1) { t_slice[i] = t_prior_min[j]; j++; } j = n_otu; for(i = n_otu - 1; i < 2 * n_otu - 3; i++) { t_slice[i] = t_prior_max[j]; j++; } if(tree -> rates -> nd_t[tree -> n_root -> num] > t_prior_min[tree -> n_root -> num]) chop_bound = MIN(tree -> rates -> nd_t[tree -> n_root -> num], t_prior_max[tree -> n_root -> num]); else chop_bound = t_prior_min[tree -> n_root -> num]; t_slice[2 * n_otu - 3] = chop_bound; //////////////////////////////////////////////////////////////////////////// //Get slices in increasing order. Excluding tips. do { f = NO; For(j, 2 * n_otu - 3) { if(t_slice[j] > t_slice[j + 1]) { buf = t_slice[j]; t_slice[j] = t_slice[j + 1]; t_slice[j + 1] = buf; f = YES; } } } while(f); for(j = 1; j < 2 * n_otu - 2; j++) t_slice[j] = MAX(chop_bound, t_slice[j]); //////////////////////////////////////////////////////////////////////////// //Get the intervals with respect to slices. Total number of t_slice_min(max) - 2 * n_otu - 3. Excluding tips. i = 0; For(j, 2 * n_otu - 3) { t_slice_min[j] = t_slice[i]; t_slice_max[j] = t_slice[i + 1]; i++; } //////////////////////////////////////////////////////////////////////////// //Getting indicators for the node number [i + n_otu] to have slice. i = i + n_otu is the node number on the tree and j is the slice number, total //number of intervals is 2 * n_otu - 3. Excluding tips. For(i, n_otu - 1) { For(j, 2 * n_otu - 3) { if(Are_Equal(t_prior_min[i + n_otu], t_slice_min[j], 1.E-10) && t_prior_max[i + n_otu] > t_slice_max[j] && t_prior_min[i + n_otu] < t_slice_max[j] && !Are_Equal(t_slice_max[j], t_slice_min[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; else if(Are_Equal(t_prior_max[i + n_otu], t_slice_max[j], 1.E-10) && t_prior_min[i + n_otu] < t_slice_min[j] && t_prior_max[i + n_otu] > t_slice_min[j] && !Are_Equal(t_slice_max[j], t_slice_min[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; else if(t_prior_min[i + n_otu] < t_slice_min[j] && t_prior_max[i + n_otu] > t_slice_max[j] && !Are_Equal(t_slice_max[j], t_slice_min[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; else if(Are_Equal(t_prior_min[i + n_otu], t_slice_min[j], 1.E-10) && Are_Equal(t_prior_max[i + n_otu], t_slice_max[j], 1.E-10)) indic[i * (2 * n_otu - 3) + j] = 1; } } For(i, n_otu - 2) { indic[i * (2 * n_otu - 3)] = 0; } for(j = 1; j < 2 * n_otu - 3; j++) { indic[(n_otu - 2) * (2 * n_otu - 3) + j] = 0; } /* printf("\n"); */ /* printf(" ", j); */ /* For(j, 2 * n_otu - 3) printf(". '%d' ", j); */ /* printf("\n"); */ /* For(i, n_otu - 1) */ /* { */ /* printf(" ['%d'] ", i + n_otu); */ /* For(j, 2 * n_otu - 3) */ /* { */ /* printf(". '%d' ", indic[i * (2 * n_otu - 3) + j]); */ /* } */ /* printf("\n"); */ /* } */ //////////////////////////////////////////////////////////////////////////// //Running through all of the combinations of slices int *cur_slices, *cur_slices_shr, *cur_slices_cpy, *slices_start_node, shr_num_slices; phydbl *t_cur_slice_min, *t_cur_slice_max; phydbl tot_num_comb; phydbl log_g_i, lmbd; lmbd = tree -> rates -> birth_rate; tot_num_comb = 1; t_cur_slice_min = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); t_cur_slice_max = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); cur_slices = (int *)mCalloc(n_otu - 1, sizeof(int)); //the vector of the current slices with repetition. cur_slices_cpy = (int *)mCalloc(n_otu - 1, sizeof(int)); slices_start_node = (int *)mCalloc(n_otu - 1, sizeof(int)); cur_slices_shr = (int *)mCalloc(n_otu - 1, sizeof(int)); //the vector of the current slices without repetition. //////////////////////////////////////////////////////////////////////////// //Get the number of slices that can be applied for each node and the vectors of slice numbers for each node. For(i, n_otu - 1) { k = 0; For(j, 2 * n_otu - 3) { if(indic[i * (2 * n_otu - 3) + j] == 1) { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// g_i_node[i * (2 * n_otu - 3) + j] = (exp(lmbd * t_slice_max[j]) - exp(lmbd * t_slice_min[j])) / (exp(lmbd * t_prior_max[i + n_otu]) - exp(lmbd * t_prior_min[i + n_otu])); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// slice_numbers[i * (2 * n_otu - 3) + k] = j; n_slice[i]++; k++; } } } /* printf("\n"); */ /* For(i, n_otu - 1) */ /* { */ /* printf(" ['%d'] ", i + n_otu); */ /* For(j, 2 * n_otu - 3) */ /* { */ /* printf(". '%f' ", g_i_node[i * (2 * n_otu - 3) + j]); */ /* } */ /* printf("\n"); */ /* } */ /* printf("\n"); */ /* For(i, n_otu - 1) */ /* { */ /* printf(" ['%d'] ", i + n_otu); */ /* For(j, n_slice[i]) */ /* { */ /* printf(". '%d' ", slice_numbers[i * (2 * n_otu - 3) + j]); */ /* } */ /* printf("\n"); */ /* } */ For(i, n_otu - 1) { tot_num_comb = tot_num_comb * n_slice[i]; } int r, numb_unsuc, max_size, comb_numb, *combinations, *max_combination, numb_approx; /* **combinations; */ phydbl K_total; phydbl *t_slice_min_f, *t_slice_max_f, *K_val_approx; int *root_nodes, *dif; phydbl K_total_cur, max_K_val, scl_const; max_size = 1000000; combinations = (int *)mCalloc(max_size*(n_otu-1), sizeof(int)); max_combination = (int *)mCalloc((n_otu-1), sizeof(int)); t_slice_min_f = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); t_slice_max_f = (phydbl *)mCalloc(n_otu - 1, sizeof(phydbl)); K_val_approx = (phydbl *)mCalloc(max_size, sizeof(phydbl)); root_nodes = (int *)mCalloc(n_otu - 1, sizeof(int)); dif = (int *)mCalloc(n_otu - 1, sizeof(int)); numb_approx = 0; max_K_val = 0; scl_const = 0.0; /* lmbd = 4.0; */ numb_unsuc = 0; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////CALCULATING THE MAXIMUM VALUE OF m_i * g_i FOR ONE COMBINATION OF SLICES://////////////////////////////////////////////////////////////// comb_numb = 0; K_total = 0.0; do { /* printf("\n ____________________________________________________________________________________________________ \n"); */ int x = 0, f = FALSE; For(i, n_otu - 1) { r = rand()%(n_slice[i]); t_slice_min_f[i] = t_slice_min[slice_numbers[i * (2 * n_otu - 3) + r]]; t_slice_max_f[i] = t_slice_max[slice_numbers[i * (2 * n_otu - 3) + r]]; cur_slices[i] = slice_numbers[i * (2 * n_otu - 3) + r]; } For(i, n_otu - 1) { cur_slices_cpy[i] = cur_slices[i]; slices_start_node[i] = cur_slices[i]; } For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } //For(i, n_otu - 1) printf(" Slice number'%d' \n", cur_slices[i]); shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } int result_1; int c = 0; int num_elem; result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. [START] Result '%d' \n", result_1); */ K_total_cur = 0.0; if(result_1 != TRUE) K_total_cur = 0.0; else { int n_1, n_2; num_elem = 0; x = 0; f = FALSE; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; if(dif[j] == 0) x++; } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu - 1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [1][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu - 1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } /* for(i = 0; i < n_otu - 2; i++) printf("\n. [START] Node [%d] Slice_min [%f] Slice_max [%f] \n", i + n_otu, t_slice_min_f[i], t_slice_max_f[i]); */ For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_total_cur = K_total_cur + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. K_total_cur [%f] \n", K_total_cur); */ /* printf("\n. [START] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [START] log(m_i) [%f] \n", K_total_cur); */ /* printf("\n. K_total_cur [%f] \n", K_total_cur); */ log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_total_cur = exp(K_total_cur + log_g_i + scl_const); if(K_total_cur > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_total_cur; } K_val_approx[numb_approx] = K_total_cur; numb_approx++; /* printf("\n. [APPROX] Approximated constant after start (K_total_cur) = [%f] \n", (K_total_cur)); */ /* printf("\n. [START] m_i * g_i [%f] \n", K_total_cur); */ /* printf("\n. [START] sum(m_i * g_i) = m_i * g_i [%f] \n", K_total_cur); */ /* printf("\n. K of the tree for starting combination of slices [%f] \n", K_total_cur); */ comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* printf("\n. ____________________________________________________________________________________________ \n"); */ phydbl K_part, K_max; int m, n, count; K_max = K_total_cur; /* printf("\n. K_total [%f] \n", K_total); */ do { r = rand()%(n_otu - 1); count = 0; For(m, r) { /* printf("\n. NODE NUMBER ['%d'] \n", m + n_otu); */ For(n, 2 * n_otu - 3) { K_part = 0.0; if(g_i_node[m * (2 * n_otu - 3) + n] > 0) { t_slice_min_f[m] = t_slice_min[n]; t_slice_max_f[m] = t_slice_max[n]; cur_slices_cpy[m] = n; For(i, n_otu - 1) cur_slices[i] = cur_slices_cpy[i]; For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); if(result_1 != TRUE) K_part = 0.0; else { int n_1, n_2; x = 0; f = FALSE; num_elem = 0; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; if(dif[j] == 0) x++; } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu-1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [2][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu-1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_part = K_part + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. [CONT] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [CONT] log(m_i) [%f] \n", K_part); */ /* printf("\n. K_part [%f] \n", K_part); */ if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_part = exp(K_part + log_g_i + scl_const); if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } /* printf("\n. [START] m_i * g_i [%f] \n", K_part); */ K_val_approx[numb_approx] = K_part; numb_approx++; K_total_cur = K_total_cur + K_part; /* printf("\n. [APPROX] Approximated constant after one run (K_part) = [%f] \n", (K_part)); */ /* printf("\n. K_max [%f] K_part [%f] \n", K_max, K_part); */ /* printf("\n. [CONT] sum(m_i * g_i) [%f] \n", K_total_cur); */ if(K_max < K_part) { K_max = K_part; /* For(i, n_otu - 1) slices_start_node[i] = cur_slices_cpy[i]; */ count++; } comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } } } } for(m = r; m < n_otu - 1; m++) { For(n, 2 * n_otu - 3) { K_part = 0.0; if(g_i_node[m * (2 * n_otu - 3) + n] > 0) { t_slice_min_f[m] = t_slice_min[n]; t_slice_max_f[m] = t_slice_max[n]; cur_slices_cpy[m] = n; For(i, n_otu - 1) cur_slices[i] = cur_slices_cpy[i]; For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); if(result_1 != TRUE) K_part = 0.0; else { int n_1, n_2; x = 0; f = FALSE; num_elem = 0; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; /* dif[j] = combinations[i][j] - cur_slices_cpy[j]; */ if(dif[j] == 0) x++; /* printf(". [%d] ", dif[j]); */ } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu-1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [2][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu-1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_part = K_part + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. [CONT] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [CONT] log(m_i) [%f] \n", K_part); */ /* printf("\n. K_part [%f] \n", K_part); */ log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_part = exp(K_part + log_g_i + scl_const); if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } /* printf("\n. [START] m_i * g_i [%f] \n", K_part); */ K_val_approx[numb_approx] = K_part; numb_approx++; K_total_cur = K_total_cur + K_part; /* printf("\n. [APPROX] Approximated constant after one run (K_part) = [%f] \n", (K_part)); */ /* printf("\n. K_max [%f] K_part [%f] \n", K_max, K_part); */ /* printf("\n. [CONT] sum(m_i * g_i) [%f] \n", K_total_cur); */ if(K_max < K_part) { K_max = K_part; /* For(i, n_otu - 1) slices_start_node[i] = cur_slices_cpy[i]; */ count++; } comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } } } } if(Are_Equal(count, 0, 1.E-10)) break; } while(1); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// For(m, n_otu - 1) { For(i, n_otu - 1) cur_slices_cpy[i] = max_combination[i]; For(i, n_otu - 1) { t_slice_min_f[i] = t_slice_min[cur_slices_cpy[i]]; t_slice_max_f[i] = t_slice_max[cur_slices_cpy[i]]; } For(n, 2 * n_otu - 3) { K_part = 0.0; if(g_i_node[m * (2 * n_otu - 3) + n] > 0) { t_slice_min_f[m] = t_slice_min[n]; t_slice_max_f[m] = t_slice_max[n]; cur_slices_cpy[m] = n; For(i, n_otu - 1) cur_slices[i] = cur_slices_cpy[i]; For(i, n_otu - 1) { for(j = i + 1; j < n_otu - 1; j++) { if(cur_slices[i] == cur_slices[j]) cur_slices[j] = -1; } } shr_num_slices = 0; For(i, n_otu -1) { if(cur_slices[i] >= 0) { cur_slices_shr[shr_num_slices] = cur_slices[i]; shr_num_slices++; } } result_1 = TRUE; Check_Time_Slices(tree -> n_root, tree -> n_root -> v[1], &result_1, t_slice_min_f, t_slice_max_f, tree); Check_Time_Slices(tree -> n_root, tree -> n_root -> v[2], &result_1, t_slice_min_f, t_slice_max_f, tree); if(result_1 != TRUE) K_part = 0.0; else { int n_1, n_2; x = 0; f = FALSE; num_elem = 0; if(comb_numb > 0) { For(i, comb_numb) { x = 0; For(j, n_otu - 1) { dif[j] = combinations[i*(n_otu-1) + j] - cur_slices_cpy[j]; /* dif[j] = combinations[i][j] - cur_slices_cpy[j]; */ if(dif[j] == 0) x++; /* printf(". [%d] ", dif[j]); */ } if(x == n_otu - 1) f = TRUE; } } if(!f) { For(i, n_otu - 1) combinations[comb_numb*(n_otu-1) + i] = cur_slices_cpy[i]; /* printf("\n"); */ /* printf(" [2][CUR SLICES PROPOSED] "); */ /* printf(" [COMB NUMBER] = [%d] --- ", comb_numb); */ /* For(i, n_otu - 1) printf(". [%d] .", combinations[comb_numb*(n_otu-1) + i]); */ /* printf("\n"); */ For(i, shr_num_slices) { Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[1], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); Search_Root_Node_In_Slice(tree -> n_root, tree -> n_root -> v[2], root_nodes, &num_elem, t_slice_min[cur_slices_shr[i]], t_slice_max[cur_slices_shr[i]], t_slice_min_f, t_slice_max_f, tree); } For(j, num_elem) { n_1 = 0; n_2 = 0; Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[1], &n_1, t_slice_min_f, t_slice_max_f, tree); Number_Of_Nodes_In_Slice(tree -> a_nodes[root_nodes[j] + n_otu], tree -> a_nodes[root_nodes[j] + n_otu] -> v[2], &n_2, t_slice_min_f, t_slice_max_f, tree); /* printf("\n. n_1 [%d] n_2 [%d]\n", n_1, n_2); */ K_part = K_part + log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1); /* printf("\n. [CONT] log(m_i) [%f] \n", log(1) - log(n_1 + n_2 + 1) - LnGamma(n_1 + 1) - LnGamma(n_2 + 1)); */ } /* printf("\n. [CONT] log(m_i) [%f] \n", K_part); */ /* printf("\n. K_part [%f] \n", K_part); */ log_g_i = 0.0; For(i, n_otu - 2) log_g_i += log_g_i(lmbd, t_slice_max_f[i], t_slice_min_f[i], t_prior_max[i + n_otu], MAX(t_prior_min[i + n_otu],tree->times->nd_t[tree->n_root->num])); /* printf("\n. [START] log(g_i) [%f] \n", log_g_i); */ K_part = exp(K_part + log_g_i + scl_const); if(K_part > max_K_val) { For(i, n_otu - 1) max_combination[i] = cur_slices_cpy[i]; max_K_val = K_part; } /* printf("\n. [START] m_i * g_i [%f] \n", K_part); */ K_val_approx[numb_approx] = K_part; numb_approx++; K_total_cur = K_total_cur + K_part; comb_numb++; if(comb_numb > max_size) { combinations = (int *)mRealloc(combinations, max_size*(n_otu - 1) + (n_otu - 1),sizeof(char)); max_size = max_size + 1; } c++; } } } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// K_total = K_total + K_total_cur; /* printf("\n. [APPROX TOTAL] Approximated constant (K_total) = [%f] \n", (K_total)); */ /* printf("\n%G %d", K_total, c); */ if(Are_Equal(c, 0, 1.E-10)) numb_unsuc++; else numb_unsuc = 0; } while(numb_unsuc < 100); /* printf("\n"); */ /* printf("\n. [APPROX TOTAL] log(K_total) = [%f] \n", log(K_total)); */ /* printf("\n. [APPROX TOTAL] log(Constant) = scl_const - log(K_total) = [%f] \n", scl_const - log(K_total)); */ /* printf("\n. [APPROX TOTAL] Approximated constant 1 / (K_total) = [%f] \n", 1 / (K_total)); */ /* printf("\n ____________________________________________________________________________________________________ \n"); */ /* printf("\n. [APPROX TOTAL] Numb_approx = [%d] \n", numb_approx); */ /* printf("\n"); */ /* } */ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// free(combinations); free(max_combination); free(dif); free(t_cur_slice_min); free(t_cur_slice_max); free(cur_slices); free(cur_slices_cpy); free(slices_start_node); free(cur_slices_shr); free(t_slice); free(t_slice_min); free(t_slice_max); free(t_slice_min_f); free(t_slice_max_f); free(indic); free(slice_numbers); free(root_nodes); free(n_slice); free(g_i_node); free(K_val_approx); return(-log(K_total)); } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// int Number_Of_Comb_Slices(int m, int num_elem, int *n_slice) { int i, num_comb; i = 0; num_comb = 1; for(i = m; i < num_elem; i++) num_comb = num_comb * n_slice[i]; return(num_comb); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Check the combination of the time slices to be set correctly. void Check_Time_Slices(t_node *a, t_node *d, int *result, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree) { int n_otu; n_otu = tree -> n_otu; d -> anc = a; if(d -> tax) return; else { if(t_cur_slice_max[d -> num - n_otu] < t_cur_slice_max[a -> num - n_otu]) { *result = FALSE; } int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Check_Time_Slices(d, d -> v[i], result, t_cur_slice_min, t_cur_slice_max, tree); } } ////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //Getting the number of nodes on both sides from the node d_start, that are in the slice of that node. void Number_Of_Nodes_In_Slice(t_node *d_start, t_node *d, int *n, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree) { int n_otu; n_otu = tree -> n_otu; if(d -> tax) return; else { if(Are_Equal(t_cur_slice_max[d_start -> num - n_otu], t_cur_slice_max[d -> num - n_otu], 1.E-10) && Are_Equal(t_cur_slice_min[d_start -> num - n_otu], t_cur_slice_min[d -> num - n_otu], 1.E-10)) { (*n)++; int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Number_Of_Nodes_In_Slice(d_start, d -> v[i], n, t_cur_slice_min, t_cur_slice_max, tree); } } } ////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //Returnig the root node in the given slice. void Search_Root_Node_In_Slice(t_node *d_start, t_node *d, int *root_nodes, int *num_elem, phydbl t_slice_min, phydbl t_slice_max, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree) { int j, n_otu, f; j = 0; f = FALSE; n_otu = tree -> n_otu; if(Are_Equal(t_cur_slice_max[d_start -> num - n_otu], t_slice_max, 1.E-10) && Are_Equal(t_cur_slice_min[d_start -> num - n_otu], t_slice_min, 1.E-10)) { For(j, *num_elem) if(d_start -> num - n_otu == (root_nodes[j])) f = TRUE; if(f != TRUE) { (root_nodes[(*num_elem)]) = d_start -> num - n_otu; (*num_elem)++; return; } } else { d -> anc = d_start; if(d -> tax) return; else { if(Are_Equal(t_cur_slice_max[d -> num - n_otu], t_slice_max, 1.E-10) && Are_Equal(t_cur_slice_min[d -> num - n_otu], t_slice_min, 1.E-10)) { (root_nodes[*num_elem]) = d -> num - n_otu; (*num_elem)++; return; } int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Search_Root_Node_In_Slice(d, d -> v[i], root_nodes, num_elem, t_slice_min, t_slice_max, t_cur_slice_min, t_cur_slice_max, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Factorial(int base) { if(base == 0) return(1); if(base == 1) return(1); return(base * Factorial(base-1)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Calculate the vector of the norm.constants for prior on node times. //The length of the vector is the total number of combinations of calibrations. phydbl *Norm_Constant_Prior_Times(t_tree *tree) { phydbl *log_K_val; int i, tot_num_comb; t_cal *calib; calib = tree -> rates -> calib; tot_num_comb = Number_Of_Comb(calib); log_K_val = (phydbl *)mCalloc(tot_num_comb, sizeof(phydbl)); For(i, tot_num_comb) { Set_Current_Calibration(i, tree); int result = TRUE; TIMES_Set_All_Node_Priors_S(&result, tree); if(result == TRUE) log_K_val[i] = K_Constant_Prior_Times_Log(tree); while(calib -> prev) calib = calib -> prev; } return(log_K_val); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Sets a vector of the partial probabilities for each combination of calibrations void TIMES_Calib_Partial_Proba(t_tree *tree) { phydbl *times_partial_proba, proba, *t_prior_min, *t_prior_max; int i, j, k, tot_num_comb; t_cal *calib; short int *t_has_prior; proba = 0.0; times_partial_proba = tree -> rates -> times_partial_proba; calib = tree -> rates -> calib; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; t_has_prior = tree -> rates -> t_has_prior; tot_num_comb = Number_Of_Comb(calib); For(i, tot_num_comb) { times_partial_proba[i] = 1.0; for(j = tree -> n_otu; j < 2 * tree -> n_otu - 1; j++) { t_prior_min[j] = -BIG; t_prior_max[j] = BIG; t_has_prior[j] = NO; } do { k = (i % Number_Of_Comb(calib)) / Number_Of_Comb(calib -> next); if(calib -> all_applies_to[k] -> num) { t_prior_min[calib -> all_applies_to[k] -> num] = MAX(t_prior_min[calib -> all_applies_to[k] -> num], calib -> lower); t_prior_max[calib -> all_applies_to[k] -> num] = MIN(t_prior_max[calib -> all_applies_to[k] -> num], calib -> upper); t_has_prior[calib -> all_applies_to[k] -> num] = YES; proba = calib -> proba[calib -> all_applies_to[k] -> num]; times_partial_proba[i] *= proba; } else { proba = calib -> proba[2 * tree -> n_otu - 1]; times_partial_proba[i] *= proba; } if(calib -> next) calib = calib -> next; else break; } while(calib); int result; result = TRUE; TIMES_Set_All_Node_Priors_S(&result, tree); if(result != TRUE) times_partial_proba[i] = 0; /* printf("\n. [4] Partial Proba [%f] \n", times_partial_proba[i]); */ while(calib -> prev) calib = calib -> prev; } phydbl sum_proba; sum_proba = 0.0; For(i, tot_num_comb) sum_proba += times_partial_proba[i]; if(!Are_Equal(sum_proba, 1.0, 1.E-10)) { For(i, tot_num_comb) times_partial_proba[i] = times_partial_proba[i] / sum_proba; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Function checks if the randomized node times are within the //upper and lower time limits, taken into account the times of //the ancestor and descendent. void Check_Node_Time(t_node *a, t_node *d, int *result, t_tree *tree) { phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; if((a == tree -> n_root) && ((nd_t[a -> num] > MIN(t_prior_max[a -> num], MIN(nd_t[a -> v[1] -> num], nd_t[a -> v[2] -> num]))) || (nd_t[a -> num] < t_prior_min[a -> num]))) { *result = FALSE; return; } if(d -> tax) return; else { t_low = MAX(t_prior_min[d -> num], nd_t[d -> anc -> num]); t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); /* printf("\n. CHECK: %d t:%f u:%f d:%f",d->num,nd_t[d->num],t_up,t_low); */ if(nd_t[d -> num] < t_low || nd_t[d -> num] > t_up) { *result = FALSE; return; } int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Check_Node_Time(d, d -> v[i], result, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Function calculates the TOTAL number of calibration combinations, //given the number of nodes to which each calibartion applies to. int Number_Of_Comb(t_cal *calib) { int num_comb; if(!calib) return(1); num_comb = 1; do { num_comb *= calib -> n_all_applies_to; if(calib -> next) calib = calib -> next; else break; } while(calib); return(num_comb); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Function calculates the TOTAL number of calibration combinations, //given the number of nodes to which each calibartion applies to. int Number_Of_Calib(t_cal *calib) { int num_calib; num_calib = 0; do { num_calib++; if(calib -> next) calib = calib -> next; else break; } while(calib); return(num_calib); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Function sets current calibration in the following way: // Suppose we have a vector of calibrations C=(C1, C2, C3), each calibration // applies to a set of nodes. We can reach each node number through the indexes (corresponds // to the number the information was read). C1={0,1,2}, C2={0,1}, C3={0}; // The total number of combinations is 3*2*1=6. The first combination with row number 0 // will be {0,0,0}, the second row will be {0,1,0} and so on. Calling the node numbers with // the above indexes will return current calibration. Also sets the vector of probabilities // for current calibration combination. void Set_Current_Calibration(int row, t_tree *tree) { t_cal *calib; phydbl *t_prior_min, *t_prior_max; short int *t_has_prior; int k, i, j, *curr_nd_for_cal; calib = tree -> rates -> calib; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; t_has_prior = tree -> rates -> t_has_prior; curr_nd_for_cal = tree -> rates -> curr_nd_for_cal; /* printf("\n COMBINATION NUMBER [%d] \n", row); */ for(j = tree -> n_otu; j < 2 * tree -> n_otu - 1; j++) { t_prior_min[j] = -BIG; t_prior_max[j] = BIG; t_has_prior[j] = NO; } k = -1; i = 0; do { k = (row % Number_Of_Comb(calib)) / Number_Of_Comb(calib -> next); if(calib -> all_applies_to[k] -> num) { /* printf("\n"); */ /* printf(" %f %f %f %f ", calib -> lower, calib -> upper, t_prior_min[calib -> all_applies_to[k] -> num], t_prior_max[calib -> all_applies_to[k] -> num]); */ /* printf("\n"); */ /* printf("\n"); */ /* printf(" Node number [%d] ", calib -> all_applies_to[k] -> num); */ /* printf("\n"); */ t_prior_min[calib -> all_applies_to[k] -> num] = MAX(t_prior_min[calib -> all_applies_to[k] -> num], calib -> lower); /* printf("\n Prior min [%f] \n", t_prior_min[calib -> all_applies_to[k] -> num]); */ t_prior_max[calib -> all_applies_to[k] -> num] = MIN(t_prior_max[calib -> all_applies_to[k] -> num], calib -> upper); /* printf("\n Prior max [%f] \n", t_prior_max[calib -> all_applies_to[k] -> num]); */ t_has_prior[calib -> all_applies_to[k] -> num] = YES; curr_nd_for_cal[i] = calib -> all_applies_to[k] -> num; i++; } if(calib->next) calib = calib->next; else break; } while(calib); while(calib -> prev) calib = calib -> prev; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Randomly choose a combination of calibrations drawing an index of calibration combination, //used function Set_Cur_Calibration. void Random_Calibration(t_tree *tree) { int rnd, num_comb; t_cal *calib; calib = tree -> rates -> calib; num_comb = Number_Of_Comb(calib); srand(time(NULL)); rnd = rand()%(num_comb); Set_Current_Calibration(rnd, tree); TIMES_Set_All_Node_Priors(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Variable curr_nd_for_cal is a vector of node numbers, the length of that vector is a number of calibrations. //Function randomly updates that vector by randomly changing one node and setting times limits with respect //to a new vector. int RND_Calibration_And_Node_Number(t_tree *tree) { int i, j, tot_num_cal, cal_num, node_ind, node_num, *curr_nd_for_cal; phydbl *t_prior_min, *t_prior_max; //*times_partial_proba; short int *t_has_prior; t_cal *cal; tot_num_cal = tree -> rates -> tot_num_cal; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; t_has_prior = tree -> rates -> t_has_prior; curr_nd_for_cal = tree -> rates -> curr_nd_for_cal; cal = tree -> rates -> calib; cal_num = rand()%(tot_num_cal - 1); i = 0; while (i != cal_num) { cal = cal -> next; i++; } node_ind = rand()%(cal -> n_all_applies_to); node_num = cal -> all_applies_to[node_ind] -> num; curr_nd_for_cal[cal_num] = node_num; for(j = tree -> n_otu; j < 2 * tree -> n_otu - 1; j++) { t_prior_min[j] = -BIG; t_prior_max[j] = BIG; t_has_prior[j] = NO; } while(cal -> prev) cal = cal -> prev; i = 0; do { t_prior_min[curr_nd_for_cal[i]] = cal -> lower; t_prior_max[curr_nd_for_cal[i]] = cal -> upper; t_has_prior[curr_nd_for_cal[i]] = YES; i++; if(cal->next) cal = cal -> next; else break; } while(cal); while(cal -> prev) cal = cal -> prev; TIMES_Set_All_Node_Priors(tree); return(node_num); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Return the value uniformly distributed between two values. phydbl Randomize_One_Node_Time(phydbl min, phydbl max) { phydbl u; u = Uni(); u *= (max - min); u += min; return(u); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Calculates the Hastings ratio for the analysis. Used in case of //calibration conditional jump. NOT THE RIGHT ONE TO USE! void Lk_Hastings_Ratio_Times(t_node *a, t_node *d, phydbl *tot_prob, t_tree *tree) { phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; if(d -> tax) return; else { t_low = MAX(t_prior_min[d -> num], nd_t[d -> anc -> num]); t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); (*tot_prob) += log(1) - log(t_up - t_low); int i; for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) { Lk_Hastings_Ratio_Times(d, d -> v[i], tot_prob, tree); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Updates nodes which are below a randomized node in case if new proposed time //for that node is below the current value. void Update_Descendent_Cond_Jump(t_node *a, t_node *d, phydbl *L_Hast_ratio, t_tree *tree) { int result = TRUE; phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; Check_Node_Time(tree -> n_root, tree -> n_root -> v[1], &result, tree); Check_Node_Time(tree -> n_root, tree -> n_root -> v[2], &result, tree); if(d -> tax) return; else { if(result != TRUE) { int i; t_low = MAX(nd_t[a -> num], t_prior_min[d -> num]); if(t_low < MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])) t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); else t_up = t_prior_max[d -> num]; nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); (*L_Hast_ratio) += log(1) - log(t_up - t_low); for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Update_Descendent_Cond_Jump(d, d -> v[i], L_Hast_ratio, tree); } else return; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //Updates nodes which are above a randomized node in case if new proposed time //for that node is above the current value. void Update_Ancestor_Cond_Jump(t_node *d, phydbl *L_Hast_ratio, t_tree *tree) { int result = TRUE; phydbl t_low, t_up; phydbl *t_prior_min, *t_prior_max, *nd_t; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; Check_Node_Time(tree -> n_root, tree -> n_root -> v[1], &result, tree); Check_Node_Time(tree -> n_root, tree -> n_root -> v[2], &result, tree); if(result != TRUE) { if(d == tree -> n_root) { t_low = t_prior_min[d -> num]; t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); (*L_Hast_ratio) += log(1) - log(t_up - t_low); return; } else { t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); if(nd_t[d -> anc -> num] > t_up) t_low = t_prior_min[d -> num]; else t_low = MAX(t_prior_min[d -> num], nd_t[d -> anc -> num]); nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); (*L_Hast_ratio) += log(1) - log(t_up - t_low); Update_Ancestor_Cond_Jump(d -> anc, L_Hast_ratio, tree); } } else return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //when made a calibration conditional jump, updates node times //with respect to the new calibration which was made with respect //to the randomly chosen node, the root is fixed. Updates only those nodes //that are not within new intervals. Traverse up and down. void Update_Times_RND_Node_Ancestor_Descendant(int rnd_node, phydbl *L_Hast_ratio, t_tree *tree) { int i; phydbl *t_prior_min, *t_prior_max, *nd_t; phydbl new_time_rnd_node = 0.0; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; new_time_rnd_node = Randomize_One_Node_Time(t_prior_min[rnd_node], t_prior_max[rnd_node]); nd_t[rnd_node] = new_time_rnd_node; Update_Ancestor_Cond_Jump(tree -> a_nodes[rnd_node] -> anc, L_Hast_ratio, tree); for(i=0;i<3;i++) if((tree -> a_nodes[rnd_node] -> v[i] != tree -> a_nodes[rnd_node] -> anc) && (tree -> a_nodes[rnd_node] -> b[i] != tree -> e_root)) Update_Descendent_Cond_Jump(tree -> a_nodes[rnd_node], tree -> a_nodes[rnd_node] -> v[i], L_Hast_ratio, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //when made a calibration conditional jump, updates node times //with respect to the new calibration which was made with respect //to the randomly chosen node, starting from the root down to the tips. //Updates only those nodes that are not within new intervals. void Update_Times_Down_Tree(t_node *a, t_node *d, phydbl *L_Hastings_ratio, t_tree *tree) { int i; phydbl *t_prior_min, *t_prior_max, *nd_t, t_low, t_up; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; t_low = MAX(t_prior_min[d -> num], nd_t[a -> num]); t_up = t_prior_max[d -> num]; //printf("\n. [1] Node number: [%d] \n", d -> num); if(d -> tax) return; else { if(nd_t[d -> num] > t_up || nd_t[d -> num] < t_low) { //printf("\n. [2] Node number: [%d] \n", d -> num); //(*L_Hastings_ratio) += (log(1) - log(t_up - t_low)); (*L_Hastings_ratio) += (- log(t_up - t_low)); nd_t[d -> num] = Randomize_One_Node_Time(t_low, t_up); /* t_prior_min[d -> num] = t_low; */ /* t_prior_max[d -> num] = t_up; */ } for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Update_Times_Down_Tree(d, d -> v[i], L_Hastings_ratio, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// xml_node *XML_Search_Node_Attribute_Value_Clade(char *attr_name, char *value, int skip, xml_node *node) { xml_node *match; //printf("\n. Node name [%s] Attr name [%s] Attr value [%s] \n", node -> name, attr_name, value); if(!node) { PhyML_Printf("\n== node: %p attr: %p",node,node?node->attr:NULL); PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } match = NULL; if(skip == NO && node -> attr) { xml_attr *attr; attr = node -> attr; do { if(!strcmp(attr -> name, attr_name) && !strcmp(attr -> value, value)) { match = node; break; } attr = attr->next; if(!attr) break; } while(1); } if(match) return(match); if(node -> next && !match) { match = XML_Search_Node_Attribute_Value_Clade(attr_name, value, NO, node -> next); return match; } return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_S(int *result, t_tree *tree) { int i; phydbl min_prior; /* Set all t_prior_max values */ TIMES_Set_All_Node_Priors_Bottom_Up_S(tree->n_root,tree->n_root->v[2], result, tree); TIMES_Set_All_Node_Priors_Bottom_Up_S(tree->n_root,tree->n_root->v[1], result, tree); tree->times->t_prior_max[tree->n_root->num] = MIN(tree->times->t_prior_max[tree->n_root->num], MIN(tree->times->t_prior_max[tree->n_root->v[2]->num], tree->times->t_prior_max[tree->n_root->v[1]->num])); /* Set all t_prior_min values */ if(!tree->times->t_has_prior[tree->n_root->num]) { min_prior = 1.E+10; For(i,2*tree->n_otu-2) { if(tree->times->t_has_prior[i]) { if(tree->times->t_prior_min[i] < min_prior) min_prior = tree->times->t_prior_min[i]; } } tree->times->t_prior_min[tree->n_root->num] = 2.0 * min_prior; } if(tree->times->t_prior_min[tree->n_root->num] > 0.0) { *result = FALSE; } TIMES_Set_All_Node_Priors_Top_Down_S(tree->n_root,tree->n_root->v[2], result, tree); TIMES_Set_All_Node_Priors_Top_Down_S(tree->n_root,tree->n_root->v[1], result, tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_Bottom_Up_S(t_node *a, t_node *d, int *result, t_tree *tree) { int i; phydbl t_sup; if(d->tax) return; else { t_node *v1, *v2; /* the two sons of d */ for(i=0;i<3;i++) { if((d->v[i] != a) && (d->b[i] != tree->e_root)) { TIMES_Set_All_Node_Priors_Bottom_Up_S(d,d->v[i], result, tree); } } v1 = v2 = NULL; for(i=0;i<3;i++) if((d->v[i] != a) && (d->b[i] != tree->e_root)) { if(!v1) v1 = d->v[i]; else v2 = d->v[i]; } if(tree->times->t_has_prior[d->num] == YES) { t_sup = MIN(tree->times->t_prior_max[d->num], MIN(tree->times->t_prior_max[v1->num], tree->times->t_prior_max[v2->num])); tree->times->t_prior_max[d->num] = t_sup; if(tree->times->t_prior_max[d->num] < tree->times->t_prior_min[d->num]) { *result = FALSE; } } else { tree->times->t_prior_max[d->num] = MIN(tree->times->t_prior_max[v1->num], tree->times->t_prior_max[v2->num]); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void TIMES_Set_All_Node_Priors_Top_Down_S(t_node *a, t_node *d, int *result, t_tree *tree) { if(d->tax) return; else { int i; if(tree->times->t_has_prior[d->num] == YES) { tree->times->t_prior_min[d->num] = MAX(tree->times->t_prior_min[d->num],tree->times->t_prior_min[a->num]); if(tree->times->t_prior_max[d->num] < tree->times->t_prior_min[d->num]) { *result = FALSE; } } else { tree->times->t_prior_min[d->num] = tree->times->t_prior_min[a->num]; } for(i=0;i<3;i++) { if((d->v[i] != a) && (d->b[i] != tree->e_root)) { TIMES_Set_All_Node_Priors_Top_Down_S(d,d->v[i], result, tree); } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl log_g_i(phydbl lmbd, phydbl t_slice_max, phydbl t_slice_min, phydbl t_prior_max, phydbl t_prior_min) { phydbl result = 0.0; if(lmbd * t_prior_min < -10.0) { phydbl K; K = -10.0 - lmbd * t_prior_min; /* printf("\n. K = [%f] \n", K); */ if(lmbd * t_prior_max + K > 700.0) { PhyML_Printf("\n. Please scale your calibration intervals. \n"); PhyML_Printf("\n. Cannot calculate exp(-lmbd * t_prior_max). \n"); PhyML_Printf("\n. Err. in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } else { result = log(exp(lmbd * t_slice_max + K) - exp(lmbd * t_slice_min + K)) - log(exp(lmbd * t_prior_max + K) - exp(lmbd * t_prior_min + K)); } } else { result = log(exp(lmbd * t_slice_max) - exp(lmbd * t_slice_min)) - log(exp(lmbd * t_prior_max) - exp(lmbd * t_prior_min)); } return(result); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int CombineInt(int int1, int int2) { int mem; mem = 500 * 2; char cResult[mem]; sprintf(cResult, "%d%d", int1, int2); return atoi(cResult); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Jump_Calibration_Move_Pre(t_node *a, t_node *d, phydbl old_ta, phydbl *log_hastings_ratio, t_tree *tree) { int i; phydbl *t_prior_min_new, *t_prior_max_new, t_low_new, t_up_new; phydbl *t_prior_min_old, *t_prior_max_old, t_low_old, t_up_old; phydbl *nd_t, old_t; phydbl eps = DBL_MIN; int move_anyway; t_prior_min_new = tree -> rates -> t_prior_min; t_prior_max_new = tree -> rates -> t_prior_max; t_prior_min_old = tree -> rates -> t_prior_min_ori; t_prior_max_old = tree -> rates -> t_prior_max_ori; nd_t = tree -> rates -> nd_t; t_low_new = MAX(t_prior_min_new[d -> num], nd_t[a -> num]); t_up_new = t_prior_max_new[d -> num]; t_low_old = MAX(t_prior_min_old[d -> num], old_ta); t_up_old = t_prior_max_old[d -> num]; old_t = nd_t[d -> num]; /* move_anyway = NO; */ /* if(Uni() < .5) move_anyway = YES; */ move_anyway = YES; if(d -> tax) return; else { if((nd_t[d -> num] > t_up_new || nd_t[d -> num] < t_low_new) || (move_anyway == YES)) /* Hastings ratio */ { (*log_hastings_ratio) += log(t_up_new - t_low_new + eps); } if((nd_t[d -> num] > t_up_new || nd_t[d -> num] < t_low_new) || (move_anyway == YES)) /* Do the jump */ { nd_t[d -> num] = Uni()*(t_up_new - t_low_new) + t_low_new; } if((nd_t[d -> num] > t_up_old || nd_t[d -> num] < t_low_old) || (move_anyway == YES)) /* Hastings ratio */ { (*log_hastings_ratio) -= log(t_up_old - t_low_old + eps); } for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Jump_Calibration_Move_Pre(d, d -> v[i], old_t, log_hastings_ratio, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Multiple_Time_Proposal_Density(t_node *a, t_node *d, phydbl *time_proposal_density, t_tree *tree) { int i; phydbl *t_prior_min, *t_prior_max, *nd_t, t_low, t_up; t_prior_min = tree -> rates -> t_prior_min; t_prior_max = tree -> rates -> t_prior_max; nd_t = tree -> rates -> nd_t; //printf("\n. [1] Node number: [%d] \n", d -> num); if(d -> tax) return; else { t_low = MAX(t_prior_min[d -> num], nd_t[a -> num]); t_up = t_prior_max[d -> num]; /* t_up = MIN(t_prior_max[d -> num], MIN(nd_t[d -> v[1] -> num], nd_t[d -> v[2] -> num])); */ /* printf("\n. Low [%f] Up [%f] \n", t_low, t_up); */ (*time_proposal_density) += (- log(t_up - t_low)); for(i=0;i<3;i++) if((d -> v[i] != d -> anc) && (d -> b[i] != tree -> e_root)) Multiple_Time_Proposal_Density(d, d -> v[i], time_proposal_density, tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phyml-3.3.20220408/src/invitee.h000066400000000000000000000050241422404706600160210ustar00rootroot00000000000000#ifndef INVITEE_H #define INVITEE_H #include "utilities.h" int My_Function(int argc, char **argv); int My_main(int argc, char **argv); void PhyTime_XML(char *xml_file); phydbl TIMES_Calib_Cond_Prob(t_tree *tree); int Number_Of_Comb(t_cal *calib); int Number_Of_Calib(t_cal *calib); void Check_Node_Time(t_node *a, t_node *d, int *result, t_tree *tree); void Set_Current_Calibration(int row, t_tree *tree); void Random_Calibration(t_tree *tree); int RND_Calibration_And_Node_Number(t_tree *tree); phydbl Randomize_One_Node_Time(phydbl min, phydbl max); void Lk_Hastings_Ratio_Times(t_node *a, t_node *d, phydbl *tot_prob, t_tree *tree); void Update_Descendent_Cond_Jump(t_node *a, t_node *d, phydbl *L_Hast_ratio, t_tree *tree); void Update_Ancestor_Cond_Jump(t_node *d, phydbl *L_Hast_ratio, t_tree *tree); void Update_Times_RND_Node_Ancestor_Descendant(int rnd_node, phydbl *L_Hast_ratio, t_tree *tree); void Update_Times_Down_Tree(t_node *a, t_node *d, phydbl *L_Hastings_ratio, t_tree *tree); phydbl K_Constant_Prior_Times_Log(t_tree *tree); int Number_Of_Comb_Slices(int m, int num_elem, int *n_slice); void Check_Time_Slices(t_node *a, t_node *d, int *result, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree); void Number_Of_Nodes_In_Slice(t_node *d_start, t_node *d, int *n, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree); void Search_Root_Node_In_Slice(t_node *d_start, t_node *d, int *root_nodes, int *num_elem, phydbl t_slice_min, phydbl t_slice_max, phydbl *t_cur_slice_min, phydbl *t_cur_slice_max, t_tree *tree); int Factorial(int base); phydbl *Norm_Constant_Prior_Times(t_tree *tree); void TIMES_Calib_Partial_Proba(t_tree *tree); xml_node *XML_Search_Node_Attribute_Value_Clade(char *attr_name, char *value, int skip, xml_node *node); char **XML_Read_Clade(xml_node *n_clade, t_tree *tree); int XML_Number_Of_Taxa_In_Clade(xml_node *n_clade); void TIMES_Set_All_Node_Priors_S(int *result, t_tree *tree); void TIMES_Set_All_Node_Priors_Bottom_Up_S(t_node *a, t_node *d, int *result, t_tree *tree); void TIMES_Set_All_Node_Priors_Top_Down_S(t_node *a, t_node *d, int *result, t_tree *tree); phydbl LOG_g_i(phydbl lmbd, phydbl t_slice_max, phydbl t_slice_min, phydbl t_prior_max, phydbl t_prior_min); int CombineInt(int int1, int int2); void Update_Current_Times_Down_Tree(t_node *a, t_node *d, t_tree *tree); void Multiple_Time_Proposal_Density(t_node *a, t_node *d, phydbl *time_proposal_density, t_tree *tree); void Jump_Calibration_Move_Pre(t_node *a, t_node *d, phydbl old_ta, phydbl *log_hastings_ratio, t_tree *tree); #endif phyml-3.3.20220408/src/io.c000066400000000000000000006537131422404706600147760ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "io.h" #include "assert.h" #ifdef BEAGLE #include "libhmsbeagle/beagle.h" #endif /* Tree parser function. We need to pass a pointer to the string of characters since this string might be freed and then re-allocated by that function (i.e., its address in memory might change) */ t_tree *Read_Tree(char **s_tree) { char **subs; int i,n_ext,n_int,n_otu; t_tree *tree; int degree,len; t_node *root_node; n_int = n_ext = 0; n_otu=0; for(i=0;i<(int)strlen((*s_tree));++i) { if((*s_tree)[i] == '[') do ++i; while((*s_tree)[i] != ']'); // Skip labels if((*s_tree)[i] == ',') n_otu++; } n_otu+=1; tree = Make_Tree_From_Scratch(n_otu,NULL); subs = Sub_Trees((*s_tree),°ree); Clean_Multifurcation(subs,degree,3); if(degree == 2) { /* Unroot_Tree(subs); */ /* degree = 3; */ /* root_node = tree->a_nodes[n_otu]; */ root_node = tree->a_nodes[2*n_otu-2]; root_node->num = 2*n_otu-2; tree->n_root = root_node; n_int -= 1; } else { root_node = tree->a_nodes[n_otu]; root_node->num = n_otu; tree->n_root = NULL; } if(degree > 3) /* Multifurcation at the root. Need to re-assemble the subtrees since Clean_Multifurcation added sets of parenthesis and the corresponding NULL edges */ { degree = 3; Free((*s_tree)); len = 0; for(i=0;itax = 0; tree->has_branch_lengths = 0; tree->num_curr_branch_available = tree->n_otu; for(i=0;in_root) { if(tree->n_root->v[1]->tax == NO && tree->n_root->v[2]->tax == NO) { tree->e_root = tree->a_edges[tree->num_curr_branch_available]; tree->n_root->b[1] = tree->a_edges[tree->num_curr_branch_available+1]; tree->n_root->b[2] = tree->a_edges[tree->num_curr_branch_available+2]; } else { for(i=0;in_otu;++i) if(tree->a_edges[i]->left == NULL && tree->a_edges[i]->rght == NULL) break; assert(i != tree->n_otu); tree->e_root = tree->a_edges[i]; tree->n_root->b[1] = tree->a_edges[tree->num_curr_branch_available]; tree->n_root->b[2] = tree->a_edges[tree->num_curr_branch_available+1]; } tree->n_root->v[2]->v[0] = tree->n_root->v[1]; tree->n_root->v[1]->v[0] = tree->n_root->v[2]; // Reading edge lengths subs = Sub_Trees((*s_tree),°ree); Read_Branch_Length(subs[0],(*s_tree),tree->n_root->b[1],tree); Read_Branch_Length(subs[1],(*s_tree),tree->n_root->b[2],tree); Free(subs); Connect_One_Edge_To_Two_Nodes(tree->n_root->v[2], tree->n_root->v[1], tree->e_root, tree); tree->e_root->l->v = tree->n_root->b[2]->l->v + tree->n_root->b[1]->l->v; if(tree->e_root->l->v > 0.0) tree->n_root_pos = tree->n_root->b[2]->l->v / tree->e_root->l->v; else tree->n_root_pos = .5; Update_Ancestors(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],tree); Update_Ancestors(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],tree); } return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* 'a' in t_node a stands for ancestor. 'd' stands for descendant */ void R_rtree(char *s_tree_a, char *s_tree_d, t_node *a, t_tree *tree, int *n_int, int *n_ext) { int i; t_node *d; int n_otu = tree->n_otu; if(strstr(s_tree_a," ")) { PhyML_Fprintf(stderr,"\n. [%s]",s_tree_a); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } // Internal edge if(s_tree_d[0] == '(') { char **subs; int degree; t_edge *b; (*n_int)+=1; if((*n_int + n_otu) == (2*n_otu-1)) { PhyML_Fprintf(stderr,"\n. The number of internal nodes in the tree exceeds the number of taxa minus one."); PhyML_Fprintf(stderr,"\n. There probably is a formating problem in the input tree."); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } d = tree->a_nodes[n_otu+*n_int]; d->num = n_otu + *n_int; d->tax = 0; b = tree->a_edges[tree->num_curr_branch_available]; Read_Branch_Support(s_tree_d,s_tree_a,b,tree); Read_Branch_Length(s_tree_d,s_tree_a,b,tree); Read_Node_Label(s_tree_d,s_tree_a,d); if(tree->n_root && a == tree->n_root) { if(!a->v[1]) a->v[1] = d; else a->v[2] = d; } else { for(i=0;i<3;i++) { if(!a->v[i]) { a->v[i] = d; break; } } } d->v[0]=a; if(!(tree->n_root && a == tree->n_root)) Connect_One_Edge_To_Two_Nodes(a,d,tree->a_edges[tree->num_curr_branch_available],tree); subs=Sub_Trees(s_tree_d,°ree); if(degree < 2) { PhyML_Fprintf(stderr,"\n. A problem was detected in the following subtree:"); PhyML_Fprintf(stderr,"\n. %s",s_tree_d); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } if(degree > 2) { Clean_Multifurcation(subs,degree,2); Free(s_tree_d); s_tree_d = (char *)mCalloc(strlen(subs[0])+strlen(subs[1])+5,sizeof(char)); i = 0; while(subs[i] != NULL) Free(subs[i++]); Free(subs); subs=Sub_Trees(s_tree_d,°ree); } R_rtree(s_tree_d,subs[0],d,tree,n_int,n_ext); R_rtree(s_tree_d,subs[1],d,tree,n_int,n_ext); i = 2; while(subs[i] != NULL) Free(subs[i++]); Free(subs); } // External edge else { int i; d = tree->a_nodes[*n_ext]; d->tax = 1; Read_Node_Name(d,s_tree_d,tree->a_edges[*n_ext],tree); Read_Branch_Length(s_tree_d,s_tree_a,tree->a_edges[*n_ext],tree); Read_Node_Label(s_tree_d,s_tree_a,d); if(tree->n_root && a == tree->n_root) { if(!a->v[1]) a->v[1] = d; else a->v[2] = d; } else { for(i=0;i<3;i++) { if(!a->v[i]) { a->v[i]=d; break; } } } d->v[0]=a; if(!(tree->n_root && a == tree->n_root)) { Connect_One_Edge_To_Two_Nodes(a,d,tree->a_edges[*n_ext],tree); } d->num=*n_ext; (*n_ext)+=1; } Free(s_tree_d); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Node_Name(t_node *d, char *s_tree_d, t_edge *b, t_tree *tree) { d->name = (char *)mCalloc(strlen(s_tree_d)+1,sizeof(char )); strcpy(d->name,s_tree_d); d->ori_name = d->name; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Branch_Support(char *s_d, char *s_a, t_edge *b, t_tree *tree) { char *sub_tp; char *p; if(s_d[0] != '(') return; // b is an external edge -> no edge support on it sub_tp = (char *)mCalloc(10+strlen(s_d)+1,sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp,s_d); p = strstr(s_a,sub_tp); if(!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp,s_d); p = strstr(s_a,sub_tp); } if(p) { b->support_val = atof((char *)p+(int)strlen(sub_tp)); p = p + strlen(sub_tp); if(p[0] == '[') { while(p[0] != ']') p++; p++; } // Skip label b->support_val = atof((char *)p); /* PhyML_Printf("\n. READ SUPPORT for s_d: %s b: %f",s_d,b->support_val); */ } Free(sub_tp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Branch_Length(char *s_d, char *s_a, t_edge *b, t_tree *tree) { char *sub_tp; char *p; sub_tp = (char *)mCalloc(10+strlen(s_d)+1,sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp,s_d); p = strstr(s_a,sub_tp); if(!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp,s_d); p = strstr(s_a,sub_tp); } if(p) { p = p + strlen(sub_tp); while(p[0] != ':' && p[0] != '\0') p++; if(p[0] == ':') { p++; b->l->v = atof((char *)p); /* PhyML_Printf("\n. READ LENGTH for s_d: %s b: %f",s_d,b->l->v); */ tree->has_branch_lengths = YES; b->does_exist = YES; } else { b->l->v = -1.; } } else { b->l->v = -1.; } Free(sub_tp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Node_Label(char *s_d, char *s_a, t_node *n) { char *sub_tp,*s_lab; char *p; sub_tp = (char *)mCalloc(3+(int)strlen(s_d)+1,sizeof(char)); s_lab = (char *)mCalloc(strlen(s_a)+1,sizeof(char)); sub_tp[0] = '('; sub_tp[1] = '\0'; strcat(sub_tp,s_d); strcat(sub_tp,"[\0"); p = strstr(s_a,sub_tp); if(!p) { sub_tp[0] = ','; sub_tp[1] = '\0'; strcat(sub_tp,s_d); strcat(sub_tp,"[\0"); p = strstr(s_a,sub_tp); } if(p) { p = p+strlen(sub_tp)-1; assert(p[0]=='['); s_lab[0]='['; if(sscanf(p,"[%[^]]]",s_lab+1) != 1) { PhyML_Fprintf(stderr,"\n. Label is in wrong format. A proper label should"); PhyML_Fprintf(stderr,"\n. look as follows: \"[xxx={yyy},xxxx={yy},...]\""); assert(FALSE); } s_lab[strlen(s_lab)]=']'; s_lab[strlen(s_lab)]='\0'; /* PhyML_Printf("\n. READ LABEL for s_d: %s b: %s",s_d,s_lab); */ n->label = Read_Labels(s_lab); } Free(sub_tp); Free(s_lab); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Clean_Multifurcation(char **subtrees, int current_deg, int end_deg) { if(current_deg <= end_deg) return; else { char *s_tmp; int i; /* s_tmp = (char *)mCalloc(T_MAX_LINE,sizeof(char)); */ s_tmp = (char *)mCalloc(10+ (int)strlen(subtrees[0])+1+ (int)strlen(subtrees[1])+1, sizeof(char)); strcat(s_tmp,"(\0"); strcat(s_tmp,subtrees[0]); strcat(s_tmp,",\0"); strcat(s_tmp,subtrees[1]); strcat(s_tmp,")#NULL\0"); /* Add the label 'NULL' to identify a non-existing edge */ Free(subtrees[0]); subtrees[0] = s_tmp; for(i=1;in_otu;++i) PhyML_Fprintf(fp,"\t%3d\t%s,\n",i+1,tree->a_nodes[i]->name); PhyML_Fprintf(fp,"\tUTREE PAUP_1=\n"); PhyML_Fprintf(fp,"%s\n",s_tree); PhyML_Fprintf(fp,"ENDBLOCK;"); } Free(s_tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *Write_Tree(t_tree *tree) { char *s; int i,available; #ifndef MPI int init_len; init_len = 3*(int)T_MAX_NAME; s=(char *)mCalloc(init_len,sizeof(char)); available = init_len; #elif defined MPI s=(char *)mCalloc(T_MAX_LINE,sizeof(char)); #endif i = -1; s[0]='('; if(tree->n_root == NULL) { i = 0; while((!tree->a_nodes[tree->n_otu+i]->v[0]) || (!tree->a_nodes[tree->n_otu+i]->v[1]) || (!tree->a_nodes[tree->n_otu+i]->v[2])) i++; R_wtree(tree->a_nodes[tree->n_otu+i],tree->a_nodes[tree->n_otu+i]->v[0],tree->a_nodes[tree->n_otu+i]->b[0],&available,&s,tree); R_wtree(tree->a_nodes[tree->n_otu+i],tree->a_nodes[tree->n_otu+i]->v[1],tree->a_nodes[tree->n_otu+i]->b[1],&available,&s,tree); R_wtree(tree->a_nodes[tree->n_otu+i],tree->a_nodes[tree->n_otu+i]->v[2],tree->a_nodes[tree->n_otu+i]->b[2],&available,&s,tree); } else { R_wtree(tree->n_root,tree->n_root->v[1],tree->n_root->b[1],&available,&s,tree); R_wtree(tree->n_root,tree->n_root->v[2],tree->n_root->b[2],&available,&s,tree); } s[(int)strlen(s)-1]=')'; if(tree->n_root != NULL) if(tree->print_labels == YES) Print_Labels(NULL,s+(int)strlen(s),tree->n_root->label); if(tree->io && tree->io->print_node_num == YES) { if(!tree->n_root) sprintf(s+(int)strlen(s),"%d",tree->a_nodes[tree->n_otu+i]->num); else sprintf(s+(int)strlen(s),"%d",tree->n_root->num); } s[(int)strlen(s)]=';'; return s; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void R_wtree(t_node *pere, t_node *fils, t_edge *b, int *available, char **s_tree, t_tree *tree) { int i,p; char *format; int last_len; phydbl mean_len; format = (char *)mCalloc(100,sizeof(char)); sprintf(format,"%%.%df",tree->bl_ndigits); p = -1; if(fils->tax == YES) // Tip node { last_len = (int)strlen(*s_tree); if(OUTPUT_TREE_FORMAT == NEWICK) { if(tree->write_tax_names == YES) { if(tree->io && tree->io->long_tax_names) { strcat(*s_tree,tree->io->long_tax_names[fils->num]); } else { if(fils->name && strlen(fils->name) > 0) strcat(*s_tree,fils->name); else sprintf(*s_tree+(int)strlen(*s_tree),"%d",fils->num+1); } } else if(tree->write_tax_names == NO) { sprintf(*s_tree+(int)strlen(*s_tree),"%d",fils->num+1); } } else if(OUTPUT_TREE_FORMAT == NEXUS) { sprintf(*s_tree+(int)strlen(*s_tree),"%d",fils->num+1); } else { PhyML_Printf("\n. Unknown tree format."); PhyML_Printf("\n. Err. in file %s at line %d\n",__FILE__,__LINE__); PhyML_Printf("\n. s=%s\n",*s_tree); } if((fils->b) && (fils->b[0]) && (tree->write_br_lens == YES)) { if(tree->print_labels == YES) Print_Labels(NULL,*s_tree+(int)strlen(*s_tree),fils->label); (*s_tree)[(int)strlen(*s_tree)] = ':'; if(tree->print_labels == YES) Print_Labels(NULL,*s_tree+(int)strlen(*s_tree),b->label); if(tree->is_mixt_tree == NO) mean_len = b->l->v; else mean_len = MIXT_Get_Mean_Edge_Len(b,tree); sprintf(*s_tree+(int)strlen(*s_tree),format,MAX(0.0,mean_len)); } (*s_tree)[(int)strlen(*s_tree)] = ','; #ifndef MPI (*available) -= ((int)strlen(*s_tree) - last_len); /* printf("\n0 Available = %d [%d %d]",(*available),(int)strlen(*s_tree),last_len); */ /* printf("\n0 %s [%d,%d]",*s_tree,(int)(int)strlen(*s_tree),*available); */ if(*available < 0) { PhyML_Fprintf(stderr,"\n. s=%s\n",*s_tree); PhyML_Fprintf(stderr,"\n. len=%d\n",(int)strlen(*s_tree)); PhyML_Fprintf(stderr,"\n. The sequence names in your input file might be too long."); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(*available < (int)T_MAX_NAME) { (*s_tree) = (char *)mRealloc(*s_tree,(int)strlen(*s_tree)+3*(int)T_MAX_NAME,sizeof(char)); for(i=0;i<3*(int)T_MAX_NAME;++i) (*s_tree)[(int)strlen(*s_tree)+i] = '\0'; (*available) = 3*(int)T_MAX_NAME; } #endif } else // Internal node { (*s_tree)[(int)strlen(*s_tree)]='('; #ifndef MPI (*available) -= 1; if(*available < (int)T_MAX_NAME) { (*s_tree) = (char *)mRealloc(*s_tree,(int)strlen(*s_tree)+3*(int)T_MAX_NAME,sizeof(char)); for(i=0;i<3*(int)T_MAX_NAME;++i) (*s_tree)[(int)strlen(*s_tree)+i] = '\0'; (*available) = 3*(int)T_MAX_NAME; } #endif for(i=0;i<3;i++) { if((fils->v[i] != pere) && (fils->b[i] != tree->e_root)) R_wtree(fils,fils->v[i],fils->b[i],available,s_tree,tree); else p=i; } if(p < 0) { PhyML_Fprintf(stderr,"\n. pere: %d fils=%d root=%d root->v[2]=%d root->v[1]=%d",pere->num,fils->num,tree->n_root->num,tree->n_root->v[2]->num,tree->n_root->v[1]->num); PhyML_Fprintf(stderr,"\n. fils=%d root=%d root->v[2]=%d root->v[1]=%d",fils->num,tree->n_root->num,tree->n_root->v[2]->num,tree->n_root->v[1]->num); PhyML_Fprintf(stderr,"\n. tree->e_root=%d fils->b[0]=%d fils->b[1]=%d fils->b[2]=%d",tree->e_root->num,fils->b[0]->num,fils->b[1]->num,fils->b[2]->num); assert(false); } last_len = (int)strlen(*s_tree); (*s_tree)[last_len-1] = ')'; if((fils->b) && (tree->write_br_lens == YES)) { if(tree->print_labels == YES) Print_Labels(NULL,*s_tree+(int)strlen(*s_tree),fils->label); if(tree->io && tree->io->print_support_val == YES) { if(tree->io->do_boot == YES) { sprintf(*s_tree+(int)strlen(*s_tree),"%.0f",fils->b[p]->support_val); } else { sprintf(*s_tree+(int)strlen(*s_tree),"%f",fils->b[p]->support_val); } } if(tree->io && tree->io->print_node_num == YES) { sprintf(*s_tree+(int)strlen(*s_tree),"%d",fils->num); } fflush(NULL); (*s_tree)[(int)strlen(*s_tree)] = ':'; if(tree->print_labels == YES) Print_Labels(NULL,*s_tree+(int)strlen(*s_tree),b->label); if(tree->is_mixt_tree == NO) mean_len = b->l->v; else mean_len = MIXT_Get_Mean_Edge_Len(b,tree); sprintf(*s_tree+(int)strlen(*s_tree),format,MAX(0.0,mean_len)); } (*s_tree)[(int)strlen(*s_tree)] = ','; #ifndef MPI (*available) -= ((int)strlen(*s_tree) - last_len); if(*available < 0) { PhyML_Fprintf(stderr,"\n. available = %d",*available); PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(*available < (int)T_MAX_NAME) { (*s_tree) = (char *)mRealloc(*s_tree,(int)strlen(*s_tree)+3*(int)T_MAX_NAME,sizeof(char)); for(i=0;i<3*(int)T_MAX_NAME;++i) (*s_tree)[(int)strlen(*s_tree)+i] = '\0'; (*available) = 3*(int)T_MAX_NAME; } #endif } Free(format); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Detect_Align_File_Format(option *io) { int c; fpos_t curr_pos; fgetpos(io->fp_in_align,&curr_pos); errno = 0; while((c=fgetc(io->fp_in_align)) != EOF) { if(errno) io->data_file_format = PHYLIP; else if(c == '#') { char s[10],t[6]="NEXUS"; if(!fgets(s,6,io->fp_in_align)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } if(!strcmp(t,s)) { fsetpos(io->fp_in_align,&curr_pos); io->data_file_format = NEXUS; return; } } } fsetpos(io->fp_in_align,&curr_pos); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Detect_Tree_File_Format(option *io) { int c; fpos_t curr_pos; fgetpos(io->fp_in_tree,&curr_pos); errno = 0; while((c=fgetc(io->fp_in_tree)) != EOF) { if(errno) { io->tree_file_format = PHYLIP; PhyML_Printf("\n. Detected PHYLIP tree file format."); } else if(c == '#') { char s[10],t[6]="NEXUS"; if(!fgets(s,6,io->fp_in_tree)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(!strcmp(t,s)) { fsetpos(io->fp_in_tree,&curr_pos); io->tree_file_format = NEXUS; PhyML_Printf("\n. Detected NEXUS tree file format."); return; } } } fsetpos(io->fp_in_tree,&curr_pos); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Get_Seq(option *io) { io->data = NULL; if(!io->fp_in_align) { PhyML_Fprintf(stderr,"\n. Filehandle to '%s' seems to be closed.",io->in_align_file); Exit("\n"); } Detect_Align_File_Format(io); switch(io->data_file_format) { case PHYLIP: { io->data = Get_Seq_Phylip(io); break; } case NEXUS: { io->nex_com_list = Make_Nexus_Com(); Init_Nexus_Format(io->nex_com_list); Get_Nexus_Data(io->fp_in_align,io); Free_Nexus(io); break; } default: { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); break; } } if(!io->data) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } else { Post_Process_Data(io); } if(io->n_otu < 3) { PhyML_Fprintf(stderr,"\n. PhyML needs at least three sequences to perform an analysis."); assert(FALSE); } return io->data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Post_Process_Data(option *io) { int i,j,swap; align *data_buff; for(i=0;idata[0]->len;++i) { for(j=0;jn_otu;++j) { if((io->data[j]->state[i] == '*') || (io->data[j]->state[i] == '?') || (io->data[j]->state[i] == '-')) io->data[j]->state[i] = 'X'; if((io->datatype == NT) && (io->data[j]->state[i] == 'N')) io->data[j]->state[i] = 'X'; if(io->data[j]->state[i] == 'U') io->data[j]->state[i] = 'T'; } } for(i=0;in_otu;++i) io->data[i]->len = io->data[0]->len; /* Sequences are ordered alphabetically */ data_buff = NULL; swap = TRUE; /* swap = FALSE; */ while(swap == TRUE) { swap = FALSE; for(i=0;in_otu-1;i++) { for(j=i+1;jn_otu;j++) { if(strcmp(io->data[i]->name,io->data[j]->name) < 0) { swap = TRUE; data_buff = io->data[i]; io->data[i] = io->data[j]; io->data[j] = data_buff; } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* align **Get_Seq_Nexus(option *io) */ /* { */ /* char *s,*ori_s; */ /* char *token; */ /* int in_comment; */ /* nexcom *curr_com; */ /* nexparm *curr_parm; */ /* int nxt_token_t,cur_token_t; */ /* s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); */ /* token = (char *)mCalloc(T_MAX_TOKEN,sizeof(char)); */ /* ori_s = s; */ /* in_comment = NO; */ /* curr_com = NULL; */ /* curr_parm = NULL; */ /* nxt_token_t = NEXUS_COM; */ /* cur_token_t = -1; */ /* while(fgets(s,T_MAX_LINE,io->fp_in_align)) */ /* { */ /* do */ /* { */ /* Get_Token(&s,token); */ /* /\* PhyML_Printf("\n. Token: '%s' next_token=%d cur_token=%d",token,nxt_token_t,cur_token_t); *\/ */ /* if(token[0] == '\0') break; */ /* if(token[0] == ';') */ /* { */ /* curr_com = NULL; */ /* curr_parm = NULL; */ /* nxt_token_t = NEXUS_COM; */ /* cur_token_t = -1; */ /* break; /\* End of command *\/ */ /* } */ /* if(nxt_token_t == NEXUS_EQUAL) */ /* { */ /* cur_token_t = NEXUS_VALUE; */ /* nxt_token_t = NEXUS_PARM; */ /* continue; */ /* } */ /* if((nxt_token_t == NEXUS_COM) && (cur_token_t != NEXUS_VALUE)) */ /* { */ /* Find_Nexus_Com(token,&curr_com,&curr_parm,io->nex_com_list); */ /* if(curr_com) */ /* { */ /* nxt_token_t = curr_com->nxt_token_t; */ /* cur_token_t = curr_com->cur_token_t; */ /* } */ /* if(cur_token_t != NEXUS_VALUE) continue; */ /* } */ /* if((nxt_token_t == NEXUS_PARM) && (cur_token_t != NEXUS_VALUE)) */ /* { */ /* Find_Nexus_Parm(token,&curr_parm,curr_com); */ /* if(curr_parm) */ /* { */ /* nxt_token_t = curr_parm->nxt_token_t; */ /* cur_token_t = curr_parm->cur_token_t; */ /* } */ /* if(cur_token_t != NEXUS_VALUE) continue; */ /* } */ /* if(cur_token_t == NEXUS_VALUE) */ /* { */ /* if((curr_parm->fp)(token,curr_parm,io)) /\* Read in parameter value *\/ */ /* { */ /* nxt_token_t = NEXUS_PARM; */ /* cur_token_t = -1; */ /* } */ /* } */ /* } */ /* while(strlen(token) > 0); */ /* } */ /* Free(ori_s); */ /* Free(token); */ /* return io->data; */ /* } */ /* /\*********************************************************\/ */ void Get_Nexus_Data(FILE *fp, option *io) { char *token; nexcom *curr_com; nexparm *curr_parm; int nxt_token_t,cur_token_t; token = (char *)mCalloc(T_MAX_TOKEN,sizeof(char)); curr_com = NULL; curr_parm = NULL; nxt_token_t = NEXUS_COM; cur_token_t = -1; do { if(!Get_Token(fp,token)) break; /* PhyML_Printf("\n+ Token: '%s' next_token=%d cur_token=%d",token,nxt_token_t,cur_token_t); */ if(token[0] == ';') { curr_com = NULL; curr_parm = NULL; nxt_token_t = NEXUS_COM; cur_token_t = -1; } if(nxt_token_t == NEXUS_EQUAL) { cur_token_t = NEXUS_VALUE; nxt_token_t = NEXUS_PARM; continue; } if((nxt_token_t == NEXUS_COM) && (cur_token_t != NEXUS_VALUE)) { Find_Nexus_Com(token,&curr_com,&curr_parm,io->nex_com_list); if(curr_com) { nxt_token_t = curr_com->nxt_token_t; cur_token_t = curr_com->cur_token_t; } if(cur_token_t != NEXUS_VALUE) continue; } if((nxt_token_t == NEXUS_PARM) && (cur_token_t != NEXUS_VALUE)) { Find_Nexus_Parm(token,&curr_parm,curr_com); if(curr_parm) { nxt_token_t = curr_parm->nxt_token_t; cur_token_t = curr_parm->cur_token_t; } if(cur_token_t != NEXUS_VALUE) continue; } if(cur_token_t == NEXUS_VALUE) { if((curr_parm->fp)(token,curr_parm,io)) /* Read in parameter value */ { nxt_token_t = NEXUS_PARM; cur_token_t = -1; } } } while(strlen(token) > 0); Free(token); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Get_Token(FILE *fp, char *token) { char c; c = ' '; while(c == ' ' || c == '\t' || c == '\n' || c == '\r') { c = fgetc(fp); if(c == EOF) return 0; } if(c == '"') { do { *token = c; token++; c = fgetc(fp); if(c == EOF) return 0; } while(c != '"'); *token = c; /* c = fgetc(fp); */ if(c == EOF) return 0; *(token+1) = '\0'; return 1; } if(c == '[') { Skip_Comment(fp); c = fgetc(fp); *token = c; token++; if(c == EOF) return 0; return 1; } if(c == '#') { *token = c; token++; } else if(c == ';') { *token = c; token++; } else if(c == ',') { *token = c; token++; } else if(c == '.') { *token = c; token++; } else if(c == '=') { *token = c; token++; } else if(c == '(') { *token = c; token++; } else if(c == ')') { *token = c; token++; } else if(c == '{') { *token = c; token++; } else if(c == '}') { *token = c; token++; } else if(c == '?') { *token = c; token++; } else if(c == '-') { *token = c; token++; } else { while(isgraph(c) && c != ';' && c != '-' && c != ',' && c != '=') { *(token++) = c; c = fgetc(fp); if(c == EOF) return 0; } fseek(fp,-1*sizeof(char),SEEK_CUR); } *token = '\0'; return 1; } /* void Get_Token(char *line, char *token) */ /* { */ /* while(**line == ' ' || **line == '\t') (*line)++; */ /* if(**line == '"') */ /* { */ /* do { *token = **line; (*line)++; token++; } while(**line != '"'); */ /* *token = **line; */ /* (*line)++; */ /* *(token+1) = '\0'; */ /* return; */ /* } */ /* if(**line == '[') */ /* { */ /* int in_comment; */ /* in_comment = 1; */ /* do */ /* { */ /* (*line)++; */ /* if(**line == '[') */ /* { */ /* in_comment++; */ /* } */ /* else if(**line == ']') in_comment--; */ /* } */ /* while(in_comment); */ /* (*line)++; */ /* return; */ /* } */ /* if(**line == '#') {*token = **line; (*line)++; token++; } */ /* else if(**line == ';') {*token = **line; (*line)++; token++; } */ /* else if(**line == ',') {*token = **line; (*line)++; token++; } */ /* else if(**line == '.') {*token = **line; (*line)++; token++; } */ /* else if(**line == '=') {*token = **line; (*line)++; token++; } */ /* else if(**line == '(') {*token = **line; (*line)++; token++; } */ /* else if(**line == ')') {*token = **line; (*line)++; token++; } */ /* else if(**line == '{') {*token = **line; (*line)++; token++; } */ /* else if(**line == '}') {*token = **line; (*line)++; token++; } */ /* else if(**line == '?') {*token = **line; (*line)++; token++; } */ /* else if(**line == '-') {*token = **line; (*line)++; token++; } */ /* else */ /* { */ /* while(isgraph(**line) && **line != ';' && **line != '=' && **line != ',') */ /* { */ /* *(token++) = **line; */ /* (*line)++; */ /* } */ /* } */ /* *token = '\0'; */ /* } */ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Get_Seq_Phylip(option *io) { Read_Ntax_Len_Phylip(io->fp_in_align,&io->n_otu,&io->init_len); if(io->n_otu > N_MAX_OTU) { PhyML_Fprintf(stderr,"\n. The number of taxa should not exceed %d",N_MAX_OTU); assert(FALSE); } if(io->interleaved == YES) io->data = Read_Seq_Interleaved(io); else io->data = Read_Seq_Sequential(io); return io->data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Ntax_Len_Phylip(FILE *fp ,int *n_otu, int *n_tax) { char *line; int readok; line = (char *)mCalloc(T_MAX_LINE,sizeof(char)); readok = 0; do { if(fscanf(fp,"%s",line) == EOF) { Free(line); PhyML_Fprintf(stderr,"\n. PhyML can't read in this alignment."); PhyML_Fprintf(stderr,"\n. Could it be that sequence file is empty?"); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } else { if(strcmp(line,"\n") && strcmp(line,"\r") && strcmp(line,"\t")) { sscanf(line,"%d",n_otu); if(*n_otu <= 0) Warn_And_Exit("\n. The number of taxa cannot be negative.\n"); if(!fscanf(fp,"%s",line)) Exit("\n"); sscanf(line,"%d",n_tax); if(*n_tax <= 0) Warn_And_Exit("\n. The sequence length cannot be negative.\n"); else readok = 1; } } }while(!readok); Free(line); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Read_Seq_Sequential(option *io) { int i; char *line; align **data; /* char c; */ char *format; format = (char *)mCalloc(T_MAX_NAME,sizeof(char)); line = (char *)mCalloc(T_MAX_LINE,sizeof(char)); data = (align **)mCalloc(io->n_otu,sizeof(align *)); /* while((c=fgetc(in))!='\n'); */ /* while(((c=fgetc(io->fp_in_align))!='\n') && (c != ' ') && (c != '\r') && (c != '\t')); */ sprintf(format, "%%%ds", T_MAX_NAME); for(i=0;in_otu;i++) { data[i] = (align *)mCalloc(1,sizeof(align)); data[i]->name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); data[i]->state = (char *)mCalloc(io->init_len*io->state_len+1,sizeof(char)); data[i]->is_ambigu = NULL; data[i]->len = 0; if(!fscanf(io->fp_in_align,format,data[i]->name)) Exit("\n"); Check_Sequence_Name(data[i]->name); while(data[i]->len < io->init_len * io->state_len) assert(Read_One_Line_Seq(&data,i,io->fp_in_align)); if(data[i]->len != io->init_len * io->state_len) { PhyML_Fprintf(stderr,"\n. Err. Problem with species %s's sequence (check the format).\n",data[i]->name); PhyML_Fprintf(stderr,"\n. Observed sequence length: %d, expected length: %d\n",data[i]->len, io->init_len * io->state_len); Warn_And_Exit(""); } } for(i=0;in_otu;i++) data[i]->state[data[i]->len] = '\0'; Restrict_To_Coding_Position(data,io); Free(format); Free(line); return data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// align **Read_Seq_Interleaved(option *io) { int i,end,num_block; char *line; align **data; /* char c; */ char *format; fpos_t curr_pos; line = (char *)mCalloc(T_MAX_LINE,sizeof(char)); format = (char *)mCalloc(T_MAX_NAME, sizeof(char)); data = (align **)mCalloc(io->n_otu,sizeof(align *)); /* while(((c=fgetc(io->fp_in_align))!='\n') && (c != ' ') && (c != '\r') && (c != '\t')); */ sprintf(format, "%%%ds", T_MAX_NAME); end = 0; for(i=0;in_otu;i++) { data[i] = (align *)mCalloc(1,sizeof(align)); data[i]->name = (char *)mCalloc(T_MAX_NAME,sizeof(char)); data[i]->state = (char *)mCalloc(io->init_len*io->state_len+1,sizeof(char)); data[i]->len = 0; data[i]->is_ambigu = NULL; if(!fscanf(io->fp_in_align,format,data[i]->name)) Exit("\n"); Check_Sequence_Name(data[i]->name); if(!Read_One_Line_Seq(&data,i,io->fp_in_align)) { end = 1; if((i != io->n_otu) && (i != io->n_otu-1)) { PhyML_Fprintf(stderr,"\n. Err.: problem with species %s's sequence.\n",data[i]->name); PhyML_Fprintf(stderr,"\n. Observed sequence length: %d, expected length: %d\n",data[i]->len, io->init_len * io->state_len); Exit(""); } break; } } if(data[0]->len == io->init_len * io->state_len) end = 1; /* if(end) printf("\n. finished yet '%c'\n",fgetc(io->fp_in_align)); */ if(!end) { end = 0; num_block = 1; do { num_block++; /* interblock */ if(!fgets(line,T_MAX_LINE,io->fp_in_align)) break; if(line[0] != 13 && line[0] != 10) { PhyML_Fprintf(stderr,"\n. Err.: one or more missing sequences in block %d.\n",num_block-1); Exit(""); } for(i=0;in_otu;i++) if(data[i]->len != io->init_len * io->state_len) break; if(i == io->n_otu) break; for(i=0;in_otu;i++) { /* Skip the taxon name, if any, in this interleaved block */ fgetpos(io->fp_in_align,&curr_pos); if(!fscanf(io->fp_in_align,format,line)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } if(line && strcmp(line,data[i]->name)) fsetpos(io->fp_in_align,&curr_pos); if(data[i]->len > io->init_len * io->state_len) { PhyML_Fprintf(stderr,"\n. Observed sequence length=%d expected length=%d.\n",data[i]->len,io->init_len * io->state_len); PhyML_Fprintf(stderr,"\n. Err.: Problem with species %s's sequence.\n",data[i]->name); Exit(""); } else if(!Read_One_Line_Seq(&data,i,io->fp_in_align)) { end = 1; if((i != io->n_otu) && (i != io->n_otu-1)) { PhyML_Fprintf(stderr,"\n. Err.: Problem with species %s's sequence.\n",data[i]->name); PhyML_Fprintf(stderr,"\n. Observed sequence length: %d, expected length: %d.\n",data[i]->len, io->init_len * io->state_len); Exit(""); } break; } } }while(!end); } for(i=0;in_otu;i++) data[i]->state[data[i]->len] = '\0'; for(i=0;in_otu;i++) { if(data[i]->len != io->init_len * io->state_len) { PhyML_Fprintf(stderr,"\n. Check sequence '%s' length (expected length: %d, observed length: %d) [OTU %d].\n",data[i]->name,io->init_len,data[i]->len,i+1); Exit(""); } } Restrict_To_Coding_Position(data,io); Free(format); Free(line); return data; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Read_One_Line_Seq(align ***data, int num_otu, FILE *in) { char c = ' '; int nchar = 0; while(1) { /* if((c == EOF) || (c == '\n') || (c == '\r')) break; */ if((c == 13) || (c == 10)) { /* PhyML_Printf("[%d %d]\n",c,nchar); fflush(NULL); */ if(!nchar) { c=(char)fgetc(in); continue; } else { /* PhyML_Printf("break\n"); */ break; } } else if(c == EOF) { /* PhyML_Printf("EOL\n"); */ break; } else if((c == ' ') || (c == '\t') || (c == 32)) { /* PhyML_Printf("[%d]",c); */ c=(char)fgetc(in); continue; } nchar++; Uppercase(&c); if(c == '.') { c = (*data)[0]->state[(*data)[num_otu]->len]; if(!num_otu) Warn_And_Exit("\n. Err: Symbol \".\" should not appear in the first sequence\n"); } (*data)[num_otu]->state[(*data)[num_otu]->len]=c; (*data)[num_otu]->len++; c = (char)fgetc(in); /* PhyML_Printf("[%c %d]",c,c); fflush(NULL); */ if(c == ';') break; } /* printf("\n. Exit nchar: %d [%d]\n",nchar,c==EOF); */ if(c == EOF) return 0; else return 1; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// scalar_dbl *Read_Io_Weights(option *io) { scalar_dbl *w,*ori,*prev = NULL; double val; assert(io->weight_file); io->fp_weight_file = Openfile(io->weight_file,READ); w = (scalar_dbl *)mCalloc(1,sizeof(scalar_dbl)); ori = w; do { if(fscanf(io->fp_weight_file,"%lf,",&val) == EOF) break; w->v = (phydbl)val; w->next = (scalar_dbl *)mCalloc(1,sizeof(scalar_dbl)); prev = w; w = w->next; } while(1); /* Remove the last allocated and empty element of the list */ if(prev !=NULL && prev->next != NULL) { Free(prev->next); prev->next=NULL; } fclose(io->fp_weight_file); return(ori); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *Return_Tree_String_Phylip(FILE *fp_input_tree) { char *line; int i; char c; int open,maxopen; if(fp_input_tree == NULL) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } do { c=fgetc(fp_input_tree); } while((c != '(') && (c != EOF)); if(c==EOF) return NULL; line = (char *)mCalloc(1,sizeof(char)); open = 1; maxopen = open; i=0; for(;;) { if((c == ' ') || (c == '\n')) { c=fgetc(fp_input_tree); if(c == EOF || c == ';') break; else continue; } /* if(c == '[') */ /* { */ /* Skip_Comment(fp_input_tree); */ /* c = fgetc(fp_input_tree); */ /* if(c == EOF || c == ';') break; */ /* } */ line = (char *)mRealloc(line,i+2,sizeof(char)); line[i]=c; i++; c=fgetc(fp_input_tree); if(c==EOF || c==';') break; if(c=='(') open++; if(c==')') open--; if(open>maxopen) maxopen = open; } line[i] = '\0'; /* if(maxopen == 1) return NULL; */ return line; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Read_Tree_File_Phylip(FILE *fp_input_tree) { char *line; t_tree *tree; line = Return_Tree_String_Phylip(fp_input_tree); tree = Read_Tree(&line); Free(line); return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Site(calign *cdata, int num, int n_otu, char *sep, int stepsize, FILE *fp) { int i,j; PhyML_Fprintf(fp,"\n"); for(i=0;ic_seq[i]->name); for(j=0;jc_seq[i]->state[num+j]); PhyML_Fprintf(fp,"%s",sep); } PhyML_Fprintf(fp,"%s",sep); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Site_Lk(t_tree *tree, FILE *fp) { int site; int catg; char *s; phydbl postmean,sum; assert(fp); rewind(fp); if(tree->is_mixt_tree == YES) { MIXT_Print_Site_Lk(tree,fp); return; } assert(tree->io->print_site_lnl == YES); if(!tree->io->print_trace) { s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); PhyML_Fprintf(fp,"Note : P(D|M) is the probability of site D given the model M (i.e., the site likelihood)\n"); if(tree->mod->ras->n_catg > 1 || tree->mod->ras->invar) { PhyML_Fprintf(fp,"P*(D|M,rr[x]) is the scaled probability of site D given the model M and the relative rate\n"); PhyML_Fprintf(fp,"of evolution rr[x], where x is the class of rate to be considered.\n"); PhyML_Fprintf(fp,"The actual conditional probability is given by P*(D|M,rr[x])/2^F, where\n"); PhyML_Fprintf(fp,"F is the scaling factor (see column 'Scaler').\n"); PhyML_Fprintf(fp,"For invariant sites, P(D|M,rr[0]=0) is the actual conditional probability\n"); PhyML_Fprintf(fp,"(i.e., it is not scaled).\n"); } PhyML_Fprintf(fp,"\n\n"); sprintf(s,"Site"); PhyML_Fprintf(fp, "%-12s",s); sprintf(s,"P(D|M)"); PhyML_Fprintf(fp,"%-15s",s); sprintf(s,"Scaler"); PhyML_Fprintf(fp,"%-7s",s); sprintf(s,"Pattern"); PhyML_Fprintf(fp, "%-9s",s); if(tree->mod->ras->n_catg > 1) { for(catg=0;catgmod->ras->n_catg;catg++) { sprintf(s,"P*(D|M,rr[%d]=%5.4f)",catg+1,tree->mod->ras->gamma_rr->v[catg]); PhyML_Fprintf(fp,"%-23s",s); } sprintf(s,"Posterior mean"); PhyML_Fprintf(fp,"%-22s",s); } if(tree->mod->ras->invar) { sprintf(s,"P(D|M,rr[0]=0)"); PhyML_Fprintf(fp,"%-16s",s); } sprintf(s,"NDistinctStates"); PhyML_Fprintf(fp,"%-16s",s); PhyML_Fprintf(fp,"\n"); Init_Ui_Tips(tree); for(site=0;sitedata->init_len;site++) { PhyML_Fprintf(fp,"%-12d",site+1); PhyML_Fprintf(fp,"%-15g",tree->cur_site_lk[tree->data->sitepatt[site]]); PhyML_Fprintf(fp,"%-7d",tree->fact_sum_scale[tree->data->sitepatt[site]]); PhyML_Fprintf(fp,"%-9d",tree->data->sitepatt[site]); if(tree->mod->ras->n_catg > 1) { for(catg=0;catgmod->ras->n_catg;catg++) { PhyML_Fprintf(fp,"%-23g",tree->unscaled_site_lk_cat[tree->data->sitepatt[site]*tree->mod->ras->n_catg + catg]); } postmean = .0; for(catg=0;catgmod->ras->n_catg;catg++) postmean += tree->mod->ras->gamma_rr->v[catg] * tree->unscaled_site_lk_cat[tree->data->sitepatt[site]*tree->mod->ras->n_catg + catg] * tree->mod->ras->gamma_r_proba->v[catg]; sum = .0; for(catg=0;catgmod->ras->n_catg;catg++) { sum += tree->unscaled_site_lk_cat[tree->data->sitepatt[site]*tree->mod->ras->n_catg + catg] * tree->mod->ras->gamma_r_proba->v[catg]; } postmean /= sum; PhyML_Fprintf(fp,"%-22g",postmean); } if(tree->mod->ras->invar) { if((phydbl)tree->data->invar[tree->data->sitepatt[site]] > -0.5) PhyML_Fprintf(fp,"%-16g",tree->mod->e_frq->pi->v[tree->data->invar[tree->data->sitepatt[site]]]); else PhyML_Fprintf(fp,"%-16g",0.0); } PhyML_Fprintf(fp,"%-16d",Number_Of_Diff_States_One_Site(tree->data->sitepatt[site],tree)); PhyML_Fprintf(fp,"\n"); } Free(s); } else { for(site=0;sitedata->init_len;site++) PhyML_Fprintf(fp,"%.2f\t",log(tree->cur_site_lk[tree->data->sitepatt[site]])); PhyML_Fprintf(fp,"\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Seq(FILE *fp, align **data, int n_otu) { int i,j; PhyML_Fprintf(fp,"%d\t%d\n",n_otu,data[0]->len); for(i=0;iname); /* for(j=0;j<20;j++) */ /* { */ /* if(j<(int)strlen(data[i]->name)) */ /* fputc(data[i]->name[j],fp); */ /* else fputc(' ',fp); */ /* } */ /* PhyML_Printf("%10d ",i); */ For(j,data[i]->len) { PhyML_Fprintf(fp,"%c",data[i]->state[j]); } PhyML_Fprintf(fp,"\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_CSeq(FILE *fp, int compressed, calign *cdata, t_tree *tree) { int i,j; int n_otu; n_otu = cdata->n_otu; if(cdata->format == PHYLIP) { PhyML_Fprintf(fp,"%d\t%d\n",n_otu,cdata->init_len); } else if(cdata->format == NEXUS) { PhyML_Fprintf(fp,"#NEXUS\n"); PhyML_Fprintf(fp,"begin data\n"); PhyML_Fprintf(fp,"dimensions ntax=%d nchar=%d;\n",n_otu,cdata->init_len); PhyML_Fprintf(fp,"format sequential datatype=dna;\n"); PhyML_Fprintf(fp,"matrix\n"); } else { PhyML_Fprintf(fp,"This sample file is to be processed by IBDSim (http://www1.montpellier.inra.fr/CBGP/software/ibdsim/)"); } if(cdata->format == PHYLIP || cdata->format == NEXUS) { for(i=0;ic_seq[i]->name)) fputc(cdata->c_seq[i]->name[j],fp); else fputc(' ',fp); } if(compressed == YES) /* Print out compressed sequences */ PhyML_Fprintf(fp,"%s",cdata->c_seq[i]->state); else /* Print out uncompressed sequences */ { for(j=0;jinit_len;j++) { PhyML_Fprintf(fp,"%c",cdata->c_seq[i]->state[cdata->sitepatt[j]]); } } PhyML_Fprintf(fp,"\n"); } PhyML_Fprintf(fp,"\n"); if(cdata->format == NEXUS) { PhyML_Fprintf(fp,";\n"); PhyML_Fprintf(fp,"END;\n"); } } else if(cdata->format == IBDSIM) { for(i=0;iinit_len;i++) PhyML_Fprintf(fp,"\nlocus %6d",i); for(i=0;ia_nodes[i]->coord->lonlat[0], tree->a_nodes[i]->coord->lonlat[1]); for(j=0;jinit_len;j++) { switch(tree->a_nodes[i]->c_seq->state[j]) { case 'A' : { PhyML_Fprintf(fp,"001 "); break; } case 'C' : { PhyML_Fprintf(fp,"002 "); break; } case 'G' : { PhyML_Fprintf(fp,"003 "); break; } case 'T' : { PhyML_Fprintf(fp,"004 "); break; } } } } } /* PhyML_Printf("\t"); */ /* for(j=0;jcrunch_len;j++) */ /* PhyML_Printf("%.0f ",cdata->wght[j]); */ /* PhyML_Printf("\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_CSeq_Select(FILE *fp, int compressed, calign *cdata, t_tree *tree) { int i,j; int n_otu; phydbl eps; int slice = 14; eps = 1.E-6; n_otu = 0; for(i=0;in_otu;i++) if(tree->times->nd_t[i] < tree->times->time_slice_lims[slice] + eps) n_otu++; PhyML_Fprintf(fp,"%d\t%d\n",n_otu,cdata->init_len); n_otu = cdata->n_otu; for(i=0;itimes->nd_t[i] < tree->times->time_slice_lims[slice] + eps) { for(j=0;j<50;j++) { if(j<(int)strlen(cdata->c_seq[i]->name)) fputc(cdata->c_seq[i]->name[j],fp); else fputc(' ',fp); } if(compressed == YES) /* Print out compressed sequences */ PhyML_Fprintf(fp,"%s",cdata->c_seq[i]->state); else /* Print out uncompressed sequences */ { for(j=0;jinit_len;j++) { PhyML_Fprintf(fp,"%c",cdata->c_seq[i]->state[cdata->sitepatt[j]]); } } PhyML_Fprintf(fp,"\n"); } } if(cdata->format == 1) { PhyML_Fprintf(fp,";\n"); PhyML_Fprintf(fp,"END;\n"); } /* PhyML_Printf("\t"); */ /* for(j=0;jcrunch_len;j++) */ /* PhyML_Printf("%.0f ",cdata->wght[j]); */ /* PhyML_Printf("\n"); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Dist(matrix *mat) { int i,j; for(i=0;in_otu;i++) { PhyML_Printf("%s ",mat->name[i]); for(j=0;jn_otu;j++) PhyML_Printf("%9.6f ",mat->dist[i][j]); PhyML_Printf("\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Node(t_node *a, t_node *d, t_tree *tree) { int i; int dir; dir = -1; for(i=0;i<3;i++) if(a->v[i] == d) {dir = i; break;} PhyML_Printf("Node nums: %3d %3d (dir:%3d) (a->anc:%3d) (d->anc:%3d) ta:%8.4f td:%8.4f t_min:%6.2f t_max:%6.2f", a->num,d->num,dir,a->anc?a->anc->num:(-1), d->anc?d->anc->num:(-1), tree->rates?tree->times->nd_t[a->num]:-1., tree->rates?tree->times->nd_t[d->num]:-1., tree->rates?tree->times->t_prior_min[a->num]:-1., tree->rates?tree->times->t_prior_max[a->num]:-1.); PhyML_Printf(" names = '%10s' '%10s' ; ",a->name,d->name); for(i=0;i<3;i++) if(a->v[i] == d) { if(a->b[i]) { PhyML_Printf("Branch num = %3d%c (%3d %3d) %f", a->b[i]->num,a->b[i]==tree->e_root?'*':' ',a->b[i]->left->num, a->b[i]->rght->num,a->b[i]->l->v); if(a->b[i]->left->tax) PhyML_Printf(" WARNING LEFT->TAX!"); break; } } PhyML_Printf("\n"); if(d->tax) return; else for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) Print_Node(d,d->v[i],tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Node_Brief(t_node *a, t_node *d, t_tree *tree, FILE *fp) { int i; int dir; dir = -1; for(i=0;i<3;i++) if(a->v[i] == d) {dir = i; break;} PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"Node nums: %3d %3d (dir:%3d)", a->num,d->num,dir); PhyML_Fprintf(fp,"\tnames = '%10s' '%10s' ; ",a->name,d->name); for(i=0;i<3;i++) if(a->v[i] == d) { if(a->b[i]) { PhyML_Fprintf(fp,"Branch num = %3d%c (%3d %3d) length:%10f", a->b[i]->num,a->b[i]==tree->e_root?'*':' ',a->b[i]->left->num, a->b[i]->rght->num,a->b[i]->l->v); if(a->b[i]->left->tax) PhyML_Printf(" WARNING LEFT->TAX!"); break; } } if(d->tax) return; else for(i=0;i<3;i++) if(d->v[i] != a && d->b[i] != tree->e_root) Print_Node_Brief(d,d->v[i],tree,fp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Model(t_mod *mod) { int i,j,k; PhyML_Printf("\n. name=%s",mod->modelname->s); PhyML_Printf("\n. string=%s",mod->custom_mod_string); PhyML_Printf("\n. mod_num=%d",mod->mod_num); PhyML_Printf("\n. ns=%d",mod->ns); PhyML_Printf("\n. n_catg=%d",mod->ras->n_catg); PhyML_Printf("\n. kappa=%f",mod->kappa->v); PhyML_Printf("\n. alpha=%f",mod->ras->alpha->v); PhyML_Printf("\n. lambda=%f",mod->lambda->v); PhyML_Printf("\n. pinvar=%f",mod->ras->pinvar->v); PhyML_Printf("\n. br_len_mult=%f",mod->br_len_mult->v); PhyML_Printf("\n. whichmodel=%d",mod->whichmodel); PhyML_Printf("\n. update_eigen=%d",mod->update_eigen); PhyML_Printf("\n. bootstrap=%d",mod->io->n_boot_replicates); PhyML_Printf("\n. n_diff_rr=%d",mod->r_mat->n_diff_rr); PhyML_Printf("\n. invar=%d",mod->ras->invar); PhyML_Printf("\n. use_m4mod=%d",mod->use_m4mod); PhyML_Printf("\n. gamma_median=%d",mod->ras->gamma_median); PhyML_Printf("\n. state_len=%d",mod->io->state_len); PhyML_Printf("\n. log_l=%d",mod->log_l); PhyML_Printf("\n. l_min=%f",mod->l_min); PhyML_Printf("\n. l_max=%f",mod->l_max); PhyML_Printf("\n. free_mixt_rates=%d",mod->ras->free_mixt_rates); PhyML_Printf("\n. gamma_mgf_bl=%d",mod->gamma_mgf_bl); PhyML_Printf("\n. Pi\n"); for(i=0;ins;i++) PhyML_Printf(" %f ",mod->e_frq->pi->v[i]); PhyML_Printf("\n"); for(i=0;ins;i++) PhyML_Printf(" %f ",mod->e_frq->pi_unscaled->v[i]); PhyML_Printf("\n. Rates\n"); for(i=0;iras->n_catg;i++) PhyML_Printf(" %f ",mod->ras->gamma_r_proba->v[i]); PhyML_Printf("\n"); for(i=0;iras->n_catg;i++) PhyML_Printf(" %f ",mod->ras->gamma_r_proba_unscaled->v[i]); PhyML_Printf("\n"); for(i=0;iras->n_catg;i++) PhyML_Printf(" %f ",mod->ras->gamma_rr->v[i]); PhyML_Printf("\n"); for(i=0;iras->n_catg;i++) PhyML_Printf(" %f ",mod->ras->gamma_rr_unscaled->v[i]); PhyML_Printf("\n. Qmat \n"); if(mod->whichmodel == CUSTOM) { fflush(NULL); for(i=0;i<6;i++) {PhyML_Printf(" %12f ",mod->r_mat->rr->v[i]); fflush(NULL);} for(i=0;i<6;i++) {PhyML_Printf(" %12f ",mod->r_mat->rr_val->v[i]); fflush(NULL);} for(i=0;i<6;i++) {PhyML_Printf(" %12d ",mod->r_mat->rr_num->v[i]); fflush(NULL);} for(i=0;i<6;i++) {PhyML_Printf(" %12d ",mod->r_mat->n_rr_per_cat->v[i]); fflush(NULL);} } for(i=0;ins;i++) { PhyML_Printf(" "); for(j=0;j<4;j++) PhyML_Printf("%8.5f ",mod->r_mat->qmat->v[i*4+j]); PhyML_Printf("\n"); } PhyML_Printf("\n. Freqs"); PhyML_Printf("\n"); for(i=0;ins;i++) PhyML_Printf(" %12f ",mod->e_frq->user_b_freq->v[i]); PhyML_Printf("\n"); for(i=0;ins;i++) PhyML_Printf(" %12f ",mod->e_frq->pi->v[i]); PhyML_Printf("\n"); for(i=0;ins;i++) PhyML_Printf(" %12f ",mod->e_frq->pi_unscaled->v[i]); PhyML_Printf("\n. Eigen\n"); For(i,2*mod->ns) PhyML_Printf(" %f ",mod->eigen->space[i]); /* PhyML_Printf("\n"); */ /* For(i,2*mod->ns) PhyML_Printf(" %f ",mod->eigen->space_int[i]); */ PhyML_Printf("\n"); for(i=0;ins;i++) PhyML_Printf(" %f ",mod->eigen->e_val[i]); PhyML_Printf("\n"); for(i=0;ins;i++) PhyML_Printf(" %f ",mod->eigen->e_val_im[i]); PhyML_Printf("\n"); For(i,mod->ns*mod->ns) PhyML_Printf(" %f ",mod->eigen->r_e_vect[i]); PhyML_Printf("\n"); For(i,mod->ns*mod->ns) PhyML_Printf(" %f ",mod->eigen->r_e_vect_im[i]); PhyML_Printf("\n"); For(i,mod->ns*mod->ns) PhyML_Printf(" %f ",mod->eigen->l_e_vect[i]); PhyML_Printf("\n"); For(i,mod->ns*mod->ns) PhyML_Printf(" %f ",mod->eigen->q[i]); PhyML_Printf("\n"); PhyML_Printf("\n. Pij"); for(k=0;kras->n_catg;k++) { PMat(0.01*mod->ras->gamma_rr->v[k],mod,mod->ns*mod->ns*k,mod->Pij_rr->v,NULL); PhyML_Printf("\n. l=%f\n",0.01*mod->ras->gamma_rr->v[k]); for(i=0;ins;i++) { PhyML_Printf(" "); for(j=0;jns;j++) PhyML_Printf("%8.5f ",mod->Pij_rr->v[k*mod->ns*mod->ns+i*mod->ns+j]); PhyML_Printf("\n"); } } PhyML_Printf("\n"); fflush(NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Mat(matrix *mat) { int i,j; PhyML_Printf("\n\n"); PhyML_Printf("%d",mat->n_otu); PhyML_Printf("\n"); for(i=0;in_otu;i++) { for(j=0;j<13;j++) { if(j>=(int)strlen(mat->name[i])) putchar(' '); else putchar(mat->name[i][j]); } for(j=0;jn_otu;j++) { char s[2]="-"; if(mat->dist[i][j] < .0) PhyML_Printf("%12s",s); else PhyML_Printf("%12f",mat->dist[i][j]); } PhyML_Printf("\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// FILE *Openfile(char *filename, int mode) { FILE *fp; char *s; int open_test=0; s = filename; fp = NULL; switch(mode) { case READ : { while(!(fp = (FILE *)fopen(s,"r")) && ++open_test<10) { PhyML_Printf("\n. Can't open file '%s', enter a new name : ",s); Getstring_Stdin(s); } break; } case WRITE : { fp = (FILE *)fopen(s,"w"); break; } case APPEND : { fp = (FILE *)fopen(s,"a"); break; } case READWRITE : { fp = (FILE *)fopen(s,"w+"); break; } default : break; } /* Free(s); */ return fp; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Fp_Out(FILE *fp_out, time_t t_beg, time_t t_end, t_tree *tree, option *io, int n_data_set, int num_tree, int add_citation, int precision) { char *s; char format[8]; div_t hour,min; int i, j; if (precision > 0) snprintf(format,8,"%%.%huf",(unsigned short)precision); if(n_data_set == 1) { rewind(fp_out); Print_Banner_Small(fp_out); } PhyML_Fprintf(fp_out,"\n. Sequence filename: \t\t\t%s", Basename(io->in_align_file)); PhyML_Fprintf(fp_out,"\n. Data set: \t\t\t\t#%d",n_data_set); if(io->mod->s_opt->random_input_tree) PhyML_Fprintf(fp_out,"\n. Random init tree: \t\t\t#%d",num_tree+1); else if(io->n_trees > 1) PhyML_Fprintf(fp_out,"\n. Starting tree number: \t\t#%d",num_tree+1); /* if(io->mod->s_opt->opt_topo) */ /* PhyML_Fprintf(fp_out,"\n. Tree topology search: \t\tSPRs"); */ /* else */ /* PhyML_Fprintf(fp_out,"\n. Tree topology: \t\t\tfixed"); */ /* was after Sequence file ; moved here FLT */ s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); if(io->in_tree == 2) { strcat(strcat(strcat(s,"user tree ("),io->in_tree_file),")"); } else { if(!io->mod->s_opt->random_input_tree) { if(io->in_tree == 0) strcat(s,"BioNJ"); if(io->in_tree == 1) strcat(s,"parsimony"); } else strcat(s,"random tree"); } PhyML_Fprintf(fp_out,"\n. Initial tree: \t\t\t%s",s); Free(s); if(tree->io->datatype == NT) { PhyML_Fprintf(fp_out,"\n. Model of nucleotides substitution: \t%s",tree->mod->modelname->s); if(io->mod->whichmodel == CUSTOM) PhyML_Fprintf(fp_out," (%s)",io->mod->custom_mod_string); } else if(tree->io->datatype == AA) { PhyML_Fprintf(fp_out,"\n. Model of amino acids substitution: \t%s",tree->mod->modelname->s); if(io->mod->whichmodel == CUSTOMAA) PhyML_Fprintf(fp_out," (%s)",tree->mod->aa_rate_mat_file->s); } else { fprintf(fp_out,"\n. Substitution model: \t\t\t%s",tree->mod->modelname->s); } PhyML_Fprintf(fp_out,"\n. Number of taxa: \t\t\t%d",tree->n_otu);/*added FLT*/ PhyML_Fprintf(fp_out,"\n. Log-likelihood: \t\t\t%.5f",tree->c_lnL);/*was last ; moved here FLT*/ Unconstraint_Lk(tree); PhyML_Fprintf(fp_out,"\n. Unconstrained log-likelihood: \t%.5f",tree->unconstraint_lk); Composite_Lk(tree); PhyML_Fprintf(fp_out,"\n. Composite log-likelihood: \t\t%.5f",tree->composite_lk); PhyML_Fprintf(fp_out,"\n. Parsimony: \t\t\t\t%d",tree->c_pars); PhyML_Fprintf(fp_out,"\n. Tree size: \t\t\t\t%.5f",Get_Tree_Size(tree)); /* if(tree->mod->ras->n_catg > 1 && tree->mod->ras->free_mixt_rates == NO) */ if(tree->mod->ras->free_mixt_rates == NO) { PhyML_Fprintf(fp_out,"\n. Discrete gamma model: \t\t%s","Yes"); PhyML_Fprintf(fp_out,"\n - Number of classes: \t\t\t%d",tree->mod->ras->n_catg); PhyML_Fprintf(fp_out,"\n - Gamma shape parameter: \t\t%.3f",tree->mod->ras->alpha->v); for(i=0;imod->ras->n_catg;i++) { PhyML_Fprintf(fp_out,"\n - Relative rate in class %d: \t\t%.5f [freq=%4f] \t\t",i+1,tree->mod->ras->gamma_rr->v[i],tree->mod->ras->gamma_r_proba->v[i]); } } else if(tree->mod->ras->free_mixt_rates == YES) { int *rk; rk = Ranks(tree->mod->ras->gamma_rr->v,tree->mod->ras->n_catg); PhyML_Fprintf(fp_out,"\n. FreeRate model: \t\t\t%s","Yes"); PhyML_Fprintf(fp_out,"\n - Number of classes: \t\t\t%d",tree->mod->ras->n_catg); for(i=0;imod->ras->n_catg;i++) { PhyML_Fprintf(fp_out,"\n - Relative rate in class %d: \t\t%.5f [freq=%4f] \t\t",i+1,tree->mod->ras->gamma_rr->v[rk[i]],tree->mod->ras->gamma_r_proba->v[rk[i]]); } Free(rk); } if(tree->mod->ras->invar) PhyML_Fprintf(fp_out,"\n. Proportion of invariant: \t\t%.3f",tree->mod->ras->pinvar->v); if(tree->mod->gamma_mgf_bl == YES) PhyML_Fprintf(fp_out,"\n. Variance of branch lengths: \t\t%f",tree->mod->l_var_sigma); /*was before Discrete gamma model ; moved here FLT*/ if((tree->mod->whichmodel == K80) || (tree->mod->whichmodel == HKY85) || (tree->mod->whichmodel == F84)) { PhyML_Fprintf(fp_out,"\n. Transition/transversion ratio: \t"); if (precision > 0) PhyML_Fprintf(fp_out,format,tree->mod->kappa->v); else PhyML_Fprintf(fp_out,"%f",tree->mod->kappa->v); } else if(tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp_out,"\n. Transition/transversion ratio for purines: \t\t"); if (precision > 0) PhyML_Fprintf(fp_out,format,tree->mod->kappa->v*2.*tree->mod->lambda->v/(1.+tree->mod->lambda->v)); else PhyML_Fprintf(fp_out,"%f",tree->mod->kappa->v*2.*tree->mod->lambda->v/(1.+tree->mod->lambda->v)); PhyML_Fprintf(fp_out,"\n. Transition/transversion ratio for pyrimidines: \t"); if (precision > 0) PhyML_Fprintf(fp_out,format,tree->mod->kappa->v*2./(1.+tree->mod->lambda->v)); else PhyML_Fprintf(fp_out,"%f",tree->mod->kappa->v*2./(1.+tree->mod->lambda->v)); } if(tree->io->datatype == NT) { PhyML_Fprintf(fp_out,"\n. Nucleotides frequencies:"); if (precision > 0) { PhyML_Fprintf(fp_out,"\n - f(A)= "); PhyML_Fprintf(fp_out,format,tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out,"\n - f(C)= "); PhyML_Fprintf(fp_out,format,tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out,"\n - f(G)= "); PhyML_Fprintf(fp_out,format,tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out,"\n - f(T)= "); PhyML_Fprintf(fp_out,format,tree->mod->e_frq->pi->v[3]); } else { PhyML_Fprintf(fp_out,"\n - f(A)= %8.5f",tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out,"\n - f(C)= %8.5f",tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out,"\n - f(G)= %8.5f",tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out,"\n - f(T)= %8.5f",tree->mod->e_frq->pi->v[3]); } } /*****************************************/ if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) { Update_Qmat_GTR(tree->mod->r_mat->rr->v, tree->mod->r_mat->rr_val->v, tree->mod->r_mat->rr_num->v, tree->mod->e_frq->pi->v, tree->mod->r_mat->qmat->v, tree->mod->s_opt->opt_rr); PhyML_Fprintf(fp_out,"\n"); PhyML_Fprintf(fp_out,". GTR relative rate parameters :"); if (precision > 0) { PhyML_Fprintf(fp_out,"\n A <-> C "); if (tree->mod->r_mat->rr->v[0] < 10) PhyML_Fprintf(fp_out," "); PhyML_Fprintf(fp_out,format, tree->mod->r_mat->rr->v[0]); PhyML_Fprintf(fp_out,"\n A <-> G "); if (tree->mod->r_mat->rr->v[1] < 10) PhyML_Fprintf(fp_out," "); PhyML_Fprintf(fp_out,format, tree->mod->r_mat->rr->v[1]); PhyML_Fprintf(fp_out,"\n A <-> T "); if (tree->mod->r_mat->rr->v[2] < 10) PhyML_Fprintf(fp_out," "); PhyML_Fprintf(fp_out,format, tree->mod->r_mat->rr->v[2]); PhyML_Fprintf(fp_out,"\n C <-> G "); if (tree->mod->r_mat->rr->v[3] < 10) PhyML_Fprintf(fp_out," "); PhyML_Fprintf(fp_out,format, tree->mod->r_mat->rr->v[3]); PhyML_Fprintf(fp_out,"\n C <-> T "); if (tree->mod->r_mat->rr->v[4] < 10) PhyML_Fprintf(fp_out," "); PhyML_Fprintf(fp_out,format, tree->mod->r_mat->rr->v[4]); PhyML_Fprintf(fp_out,"\n G <-> T "); if (tree->mod->r_mat->rr->v[5] < 10) PhyML_Fprintf(fp_out," "); PhyML_Fprintf(fp_out,format, tree->mod->r_mat->rr->v[5]); } else { PhyML_Fprintf(fp_out,"\n A <-> C %8.5f", tree->mod->r_mat->rr->v[0]); PhyML_Fprintf(fp_out,"\n A <-> G %8.5f", tree->mod->r_mat->rr->v[1]); PhyML_Fprintf(fp_out,"\n A <-> T %8.5f", tree->mod->r_mat->rr->v[2]); PhyML_Fprintf(fp_out,"\n C <-> G %8.5f", tree->mod->r_mat->rr->v[3]); PhyML_Fprintf(fp_out,"\n C <-> T %8.5f", tree->mod->r_mat->rr->v[4]); PhyML_Fprintf(fp_out,"\n G <-> T %8.5f", tree->mod->r_mat->rr->v[5]); } PhyML_Fprintf(fp_out,"\n. Instantaneous rate matrix : "); if (precision > 0) { PhyML_Fprintf(fp_out,"\n [A"); for(i=0;imod->r_mat->qmat->v[i*4+j]); } PhyML_Fprintf(fp_out,"\n"); } } else { PhyML_Fprintf(fp_out,"\n [A---------C---------G---------T------]\n"); for(i=0;i<4;i++) { PhyML_Fprintf(fp_out," "); for(j=0;j<4;j++) PhyML_Fprintf(fp_out,"%8.5f ",tree->mod->r_mat->qmat->v[i*4+j]); PhyML_Fprintf(fp_out,"\n"); } } //PhyML_Fprintf(fp_out,"\n"); } /*****************************************/ if(io->ratio_test == 1) { PhyML_Fprintf(fp_out,". aLRT statistics to test branches"); } else if(io->ratio_test == 2) { PhyML_Fprintf(fp_out,". aLRT branch supports (cubic approximation, mixture of Chi2s distribution)"); } PhyML_Fprintf(fp_out,"\n"); PhyML_Fprintf(fp_out,"\n. Run ID:\t\t\t\t%s", (io->append_run_ID) ? (io->run_id_string): ("none")); PhyML_Fprintf(fp_out,"\n. Random seed:\t\t\t\t%d", io->r_seed); PhyML_Fprintf(fp_out,"\n. Subtree patterns aliasing:\t\t%s",io->do_alias_subpatt?"yes":"no"); PhyML_Fprintf(fp_out,"\n. Version:\t\t\t\t%s", VERSION); hour = div(t_end-t_beg,3600); min = div(t_end-t_beg,60 ); min.quot -= hour.quot*60; PhyML_Fprintf(fp_out,"\n. Time used:\t\t\t\t%dh%dm%ds (%d seconds)", hour.quot,min.quot,(int)(t_end-t_beg)%60,(int)(t_end-t_beg)); if(add_citation == YES) { PhyML_Fprintf(fp_out,"\n\n"); PhyML_Fprintf(fp_out," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp_out," Suggested citations:\n"); PhyML_Fprintf(fp_out," S. Guindon, JF. Dufayard, V. Lefort, M. Anisimova, W. Hordijk, O. Gascuel\n"); PhyML_Fprintf(fp_out," \"New algorithms and methods to estimate maximum-likelihood phylogenies: assessing the performance of PhyML 3.0.\"\n"); PhyML_Fprintf(fp_out," Systematic Biology. 2010. 59(3):307-321.\n"); PhyML_Fprintf(fp_out,"\n"); PhyML_Fprintf(fp_out," S. Guindon & O. Gascuel\n"); PhyML_Fprintf(fp_out," \"A simple, fast, and accurate algorithm to estimate large phylogenies by maximum likelihood\"\n"); PhyML_Fprintf(fp_out," Systematic Biology. 2003. 52(5):696-704.\n"); PhyML_Fprintf(fp_out," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); } else { PhyML_Fprintf(fp_out,"\n\n"); PhyML_Fprintf(fp_out," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp_out,"\n"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*FLT wrote this function*/ void Print_Fp_Out_Lines(FILE *fp_out, time_t t_beg, time_t t_end, t_tree *tree, option *io, int n_data_set) { char *s; /*div_t hour,min;*/ if (n_data_set==1) { PhyML_Fprintf(fp_out,". Sequence file : [%s]\n\n", Basename(io->in_align_file)); if((tree->io->datatype == NT) || (tree->io->datatype == AA)) { (tree->io->datatype == NT)? (PhyML_Fprintf(fp_out,". Model of nucleotides substitution : %s\n\n",io->mod->modelname->s)): (PhyML_Fprintf(fp_out,". Model of amino acids substitution : %s\n\n",io->mod->modelname->s)); } s = (char *)mCalloc(100,sizeof(char)); switch(io->in_tree) { case 0: { strcpy(s,"BioNJ"); break; } case 1: { strcpy(s,"parsimony"); break; } case 2: { strcpy(s,"user tree ("); strcat(s,io->in_tree_file); strcat(s,")"); break; } } PhyML_Fprintf(fp_out,". Initial tree : [%s]\n\n",s); Free(s); PhyML_Fprintf(fp_out,"\n"); /*headline 1*/ PhyML_Fprintf(fp_out, ". Data\t"); PhyML_Fprintf(fp_out,"Nb of \t"); PhyML_Fprintf(fp_out,"Likelihood\t"); PhyML_Fprintf(fp_out, "Discrete \t"); if(tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out, "Number of \tGamma shape\t"); PhyML_Fprintf(fp_out,"Proportion of\t"); if(tree->mod->whichmodel <= 6) PhyML_Fprintf(fp_out,"Transition/ \t"); PhyML_Fprintf(fp_out,"Nucleotides frequencies \t"); if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) PhyML_Fprintf(fp_out,"Instantaneous rate matrix \t"); /* PhyML_Fprintf(fp_out,"Time\t");*/ PhyML_Fprintf(fp_out, "\n"); /*headline 2*/ PhyML_Fprintf(fp_out, " set\t"); PhyML_Fprintf(fp_out,"taxa\t"); PhyML_Fprintf(fp_out,"loglk \t"); PhyML_Fprintf(fp_out, "gamma model\t"); if(tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out, "categories\tparameter \t"); PhyML_Fprintf(fp_out,"invariant \t"); if(tree->mod->whichmodel <= 6) PhyML_Fprintf(fp_out,"transversion\t"); PhyML_Fprintf(fp_out,"f(A) f(C) f(G) f(T) \t"); if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) PhyML_Fprintf(fp_out,"[A---------C---------G---------T------]\t"); /* PhyML_PhyML_Fprintf(fp_out,"used\t");*/ PhyML_Fprintf(fp_out, "\n"); /*headline 3*/ if(tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp_out," \t \t \t \t"); if(tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out," \t \t"); PhyML_Fprintf(fp_out," \t"); PhyML_Fprintf(fp_out,"purines pyrimid.\t"); PhyML_Fprintf(fp_out, "\n"); } PhyML_Fprintf(fp_out, "\n"); } /*line items*/ PhyML_Fprintf(fp_out," #%d\t",n_data_set); PhyML_Fprintf(fp_out,"%d \t",tree->n_otu); PhyML_Fprintf(fp_out,"%.5f\t",tree->c_lnL); PhyML_Fprintf(fp_out,"%s \t", (tree->mod->ras->n_catg>1)?("Yes"):("No ")); if(tree->mod->ras->n_catg > 1) { PhyML_Fprintf(fp_out,"%d \t",tree->mod->ras->n_catg); PhyML_Fprintf(fp_out,"%.3f \t",tree->mod->ras->alpha->v); } /*if(tree->mod->ras->invar)*/ PhyML_Fprintf(fp_out,"%.3f \t",tree->mod->ras->pinvar->v); if(tree->mod->whichmodel <= 5) { PhyML_Fprintf(fp_out,"%.3f \t",tree->mod->kappa->v); } else if(tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp_out,"%.3f ", tree->mod->kappa->v*2.*tree->mod->lambda->v/(1.+tree->mod->lambda->v)); PhyML_Fprintf(fp_out,"%.3f\t", tree->mod->kappa->v*2./(1.+tree->mod->lambda->v)); } if(tree->io->datatype == NT) { PhyML_Fprintf(fp_out,"%8.5f ",tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp_out,"%8.5f ",tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp_out,"%8.5f ",tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp_out,"%8.5f\t",tree->mod->e_frq->pi->v[3]); } /* hour = div(t_end-t_beg,3600); min = div(t_end-t_beg,60 ); min.quot -= hour.quot*60; PhyML_Fprintf(fp_out,"%dh%dm%ds\t", hour.quot,min.quot,(int)(t_end-t_beg)%60); if(t_end-t_beg > 60) PhyML_Fprintf(fp_out,". -> %d seconds\t",(int)(t_end-t_beg)); */ /*****************************************/ if((tree->mod->whichmodel == GTR) || (tree->mod->whichmodel == CUSTOM)) { int i,j; for(i=0;i<4;i++) { if (i!=0) { /*format*/ PhyML_Fprintf(fp_out," \t \t \t \t"); if(tree->mod->ras->n_catg > 1) PhyML_Fprintf(fp_out," \t \t"); PhyML_Fprintf(fp_out," \t \t"); } for(j=0;j<4;j++) PhyML_Fprintf(fp_out,"%8.5f ",tree->mod->r_mat->qmat->v[i*4+j]); if (i<3) PhyML_Fprintf(fp_out,"\n"); } } /*****************************************/ PhyML_Fprintf(fp_out, "\n\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Freq(t_tree *tree) { switch(tree->io->datatype) { case NT: { PhyML_Printf("A : %f\n",tree->mod->e_frq->pi->v[0]); PhyML_Printf("C : %f\n",tree->mod->e_frq->pi->v[1]); PhyML_Printf("G : %f\n",tree->mod->e_frq->pi->v[2]); PhyML_Printf("T : %f\n",tree->mod->e_frq->pi->v[3]); break; } case AA: { PhyML_Printf("A : %f\n",tree->mod->e_frq->pi->v[0]); PhyML_Printf("R : %f\n",tree->mod->e_frq->pi->v[1]); PhyML_Printf("N : %f\n",tree->mod->e_frq->pi->v[2]); PhyML_Printf("D : %f\n",tree->mod->e_frq->pi->v[3]); PhyML_Printf("C : %f\n",tree->mod->e_frq->pi->v[4]); PhyML_Printf("Q : %f\n",tree->mod->e_frq->pi->v[5]); PhyML_Printf("E : %f\n",tree->mod->e_frq->pi->v[6]); PhyML_Printf("G : %f\n",tree->mod->e_frq->pi->v[7]); PhyML_Printf("H : %f\n",tree->mod->e_frq->pi->v[8]); PhyML_Printf("I : %f\n",tree->mod->e_frq->pi->v[9]); PhyML_Printf("L : %f\n",tree->mod->e_frq->pi->v[10]); PhyML_Printf("K : %f\n",tree->mod->e_frq->pi->v[11]); PhyML_Printf("M : %f\n",tree->mod->e_frq->pi->v[12]); PhyML_Printf("F : %f\n",tree->mod->e_frq->pi->v[13]); PhyML_Printf("P : %f\n",tree->mod->e_frq->pi->v[14]); PhyML_Printf("S : %f\n",tree->mod->e_frq->pi->v[15]); PhyML_Printf("T : %f\n",tree->mod->e_frq->pi->v[16]); PhyML_Printf("W : %f\n",tree->mod->e_frq->pi->v[17]); PhyML_Printf("Y : %f\n",tree->mod->e_frq->pi->v[18]); PhyML_Printf("V : %f\n",tree->mod->e_frq->pi->v[19]); PhyML_Printf("N : %f\n",tree->mod->e_frq->pi->v[20]); break; } default : {break;} } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Settings(option *io) { int answer; char *s; s = (char *)mCalloc(100,sizeof(char)); PhyML_Printf("\n\n\n"); PhyML_Printf("\n\n"); PhyML_Printf("\n ////////////////////////////////////.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); PhyML_Printf("\n \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.//////////////////////////////////////////\n"); PhyML_Printf("\n . Sequence filename:\t\t\t\t %s", Basename(io->in_align_file)); if(io->datatype == NT) strcpy(s,"dna"); else if(io->datatype == AA) strcpy(s,"aa"); else strcpy(s,"generic"); PhyML_Printf("\n . Data type:\t\t\t\t\t %s",s); PhyML_Printf("\n . Alphabet size:\t\t\t\t %d",io->mod->ns); PhyML_Printf("\n . Sequence format:\t\t\t\t %s", io->interleaved ? "interleaved": "sequential"); PhyML_Printf("\n . Number of data sets:\t\t\t\t %d", io->n_data_sets); PhyML_Printf("\n . Nb of bootstrapped data sets:\t\t\t %d", io->n_boot_replicates); if (io->n_boot_replicates > 0) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t no"); else { if(io->ratio_test == 1) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t yes (aLRT statistics)"); else if(io->ratio_test == 2) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t yes (Chi2-based parametric branch supports)"); else if(io->ratio_test == 3) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t yes (Minimum of SH-like and Chi2-based branch supports)"); else if(io->ratio_test == 4) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t yes (SH-like branch supports)"); else if(io->ratio_test == 5) PhyML_Printf("\n . Compute approximate likelihood ratio test:\t yes (aBayes branch supports)"); } PhyML_Printf("\n . Model name:\t\t\t\t\t %s", io->mod->modelname->s); if(io->datatype == AA && io->mod->whichmodel == CUSTOMAA) PhyML_Printf(" (%s)",io->mod->aa_rate_mat_file->s); if (io->datatype == NT) { if ((io->mod->whichmodel == K80) || (io->mod->whichmodel == HKY85)|| (io->mod->whichmodel == F84) || (io->mod->whichmodel == TN93)) { if(io->mod->s_opt && io->mod->s_opt->opt_kappa) PhyML_Printf("\n . Ts/tv ratio:\t\t\t\t\t estimated"); else PhyML_Printf("\n . Ts/tv ratio:\t\t\t\t\t %f", io->mod->kappa->v); } } if(io->mod->s_opt && io->mod->s_opt->opt_pinvar) PhyML_Printf("\n . Proportion of invariable sites:\t\t estimated"); else PhyML_Printf("\n . Proportion of invariable sites:\t\t %f", io->mod->ras->pinvar->v); if(io->mod->ras->free_mixt_rates == NO) PhyML_Printf("\n . RAS model:\t\t\t\t\t discrete Gamma"); else PhyML_Printf("\n . RAS model:\t\t\t\t\t FreeRate"); PhyML_Printf("\n . Number of subst. rate catgs:\t\t\t %d", io->mod->ras->n_catg); if(io->mod->ras->n_catg > 1) { if(io->mod->ras->free_mixt_rates == NO) { if(io->mod->s_opt && io->mod->s_opt->opt_alpha) PhyML_Printf("\n . Gamma distribution parameter:\t\t\t estimated"); else PhyML_Printf("\n . Gamma distribution parameter:\t\t\t %f", io->mod->ras->alpha->v); PhyML_Printf("\n . 'Middle' of each rate class:\t\t\t %s",(io->mod->ras->gamma_median)?("median"):("mean")); } } if(io->datatype == AA) { if(io->mod->s_opt->state_freq == ML) PhyML_Printf("\n . Amino-acid equilibrium frequencies:\t\t optimized"); else if(io->mod->s_opt->state_freq == EMPIRICAL) PhyML_Printf("\n . Amino-acid equilibrium frequencies:\t\t empirical"); else if(io->mod->s_opt->state_freq == USER) PhyML_Printf("\n . Amino-acid equilibrium frequencies:\t\t user-defined"); else if(io->mod->s_opt->state_freq == MODEL) PhyML_Printf("\n . Amino-acid equilibrium frequencies:\t\t model-defined"); } else if(io->datatype == NT) { if((io->mod->whichmodel != JC69) && (io->mod->whichmodel != K80) && (io->mod->whichmodel != F81)) { if(io->mod->s_opt->state_freq == ML) PhyML_Printf("\n . Nucleotide equilibrium frequencies:\t\t optimized"); else if(io->mod->s_opt->state_freq == EMPIRICAL) PhyML_Printf("\n . Nucleotide equilibrium frequencies:\t\t empirical"); else if(io->mod->s_opt->state_freq == USER) PhyML_Printf("\n . Nucleotide equilibrium frequencies:\t\t user-defined"); else if(io->mod->s_opt->state_freq == MODEL) PhyML_Printf("\n . Nucleotide equilibrium frequencies:\t\t model-defined"); } } PhyML_Printf("\n . Optimise tree topology:\t\t\t %s", (io->mod->s_opt && io->mod->s_opt->opt_topo) ? "yes": "no"); switch(io->in_tree) { case 0: { strcpy(s,"BioNJ"); break; } case 1: { strcpy(s,"parsimony"); break; } case 2: { strcpy(s,"user tree ("); strcat(s,Basename(io->in_tree_file)); strcat(s,")"); break; } } if(io->mod->s_opt && io->mod->s_opt->opt_topo) { /* if(io->mod->s_opt->topo_search == NNI_MOVE) PhyML_Printf("\n . Tree topology search:\t\t\t\t NNIs"); */ /* else if(io->mod->s_opt->topo_search == SPR_MOVE) PhyML_Printf("\n . Tree topology search:\t\t\t\t SPRs"); */ /* else if(io->mod->s_opt->topo_search == BEST_OF_NNI_AND_SPR) PhyML_Printf("\n . Tree topology search:\t\t\t\t Best of NNIs and SPRs"); */ PhyML_Printf("\n . Starting tree:\t\t\t\t %s",s); PhyML_Printf("\n . Add random input tree:\t\t\t %s", (io->mod->s_opt->random_input_tree) ? "yes": "no"); if(io->mod->s_opt->random_input_tree) PhyML_Printf("\n . Number of random starting trees:\t\t %d", io->mod->s_opt->n_rand_starts); } else if(io->mod->s_opt && !io->mod->s_opt->random_input_tree) PhyML_Printf("\n . Evaluated tree:\t\t\t\t \"%s\"",s); PhyML_Printf("\n . Optimise branch lengths:\t\t\t %s", (io->mod->s_opt && io->mod->s_opt->opt_bl) ? "yes": "no"); PhyML_Printf("\n . Minimum length of an edge:\t\t\t %g",io->mod->l_min); answer = 0; if(io->mod->s_opt && (io->mod->s_opt->opt_alpha || io->mod->s_opt->opt_kappa || io->mod->s_opt->opt_lambda || io->mod->s_opt->opt_pinvar || io->mod->s_opt->opt_rr)) answer = 1; PhyML_Printf("\n . Optimise substitution model parameters:\t %s", (answer) ? "yes": "no"); PhyML_Printf("\n . Run ID:\t\t\t\t\t %s", (io->append_run_ID) ? (io->run_id_string): ("none")); PhyML_Printf("\n . Random seed:\t\t\t\t\t %d", io->r_seed); PhyML_Printf("\n . Subtree patterns aliasing:\t\t\t %s",io->do_alias_subpatt?"yes":"no"); PhyML_Printf("\n . Version:\t\t\t\t\t %s", VERSION); PhyML_Printf("\n . Byte alignment:\t\t\t\t %d",BYTE_ALIGN); PhyML_Printf("\n . AVX enabled:\t\t\t\t\t %s", #if defined(__AVX__) "yes" #else "no" #endif ); PhyML_Printf("\n . SSE enabled:\t\t\t\t\t %s", #if defined(__SSE3__) "yes" #else "no" #endif ); /* PhyML_Printf("\n\n \u205C \u205C \u205C \u205C \u205C \u205C \u205C \u205C \u205C \u205C \u205C \u205C \n"); */ PhyML_Printf("\n"); PhyML_Printf("\n ////////////////////////////////////.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); PhyML_Printf("\n \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.//////////////////////////////////////////\n"); PhyML_Printf("\n\n"); fflush(NULL); Free(s); } void Print_Banner(FILE *fp) { PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp," \n"); PhyML_Fprintf(fp," --- PhyML %s --- \n",VERSION); PhyML_Fprintf(fp," \n"); PhyML_Fprintf(fp," A simple, fast, and accurate algorithm to estimate large phylogenies by maximum likelihood \n"); PhyML_Fprintf(fp," Stephane Guindon & Olivier Gascuel \n"); PhyML_Fprintf(fp," \n"); PhyML_Fprintf(fp," http://www.atgc-montpellier.fr/phyml \n"); PhyML_Fprintf(fp," \n"); PhyML_Fprintf(fp," Copyright CNRS - Universite Montpellier \n"); PhyML_Fprintf(fp," \n"); PhyML_Fprintf(fp," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Banner_Small(FILE *fp) { PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); PhyML_Fprintf(fp," --- PhyML %s --- \n",VERSION); PhyML_Fprintf(fp," http://www.atgc-montpellier.fr/phyml \n"); PhyML_Fprintf(fp," Copyright CNRS - Universite Montpellier \n"); PhyML_Fprintf(fp," oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Data_Set_Number(option *io, FILE *fp) { PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp," \n"); PhyML_Fprintf(fp," [ Data set number %3d ] \n",io->curr_gt+1); PhyML_Fprintf(fp," \n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Lk(t_tree *tree, char *string) { t_tree *loc_tree; loc_tree = tree; /*! Rewind back to the first mixt_tree */ while(loc_tree->prev) loc_tree = loc_tree->prev; time(&(loc_tree->t_current)); PhyML_Printf("\n. (%5d sec) [%15.4f] %s", (int)(loc_tree->t_current-loc_tree->t_beg),Get_Lk(tree), string); #ifndef QUIET fflush(NULL); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_List(t_ll *list) { t_ll *ll; ll = list->head; do { t_node *n; n = (t_node *)ll->v; PhyML_Printf("\n. list elem: %p next: %p prev: %p [%d] %p %p",(void *)ll,(void *)ll->next,(void *)ll->prev,n->num,(void *)ll->head,(void *)ll->tail); ll = ll->next; } while(ll != NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Pars(t_tree *tree) { time(&(tree->t_current)); PhyML_Printf("\n. (%5d sec) [%5d]",(int)(tree->t_current-tree->t_beg),tree->c_pars); #ifndef QUIET fflush(NULL); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Lk_And_Pars(t_tree *tree) { time(&(tree->t_current)); PhyML_Printf("\n. (%5d sec) [%15.4f] [%5d]", (int)(tree->t_current-tree->t_beg), tree->c_lnL,tree->c_pars); #ifndef QUIET fflush(NULL); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Qmat(phydbl *daa, phydbl *pi, FILE *fp) { int i,j; phydbl sum; double val; assert(fp); rewind(fp); for(i=1;i<20;i++) { for(j=0;j<19;j++) { /* if(!fscanf(fp,"%lf",&(daa[i*20+j]))) Exit("\n"); */ if(!fscanf(fp,"%lf",&val)) { PhyML_Fprintf(stderr,"\n. Rate matrix file does not appear to have a proper format. Please refer to the documentation."); Exit("\n"); } daa[i*20+j] = (phydbl)val; daa[j*20+i] = daa[i*20+j]; if(j == i-1) break; } } for(i=0;i<20;i++) { if(!fscanf(fp,"%lf",&val)) Exit("\n"); pi[i] = (phydbl)val; } sum = .0; for(i=0;i<20;i++) sum += pi[i]; if(FABS(sum - 1.) > 1.E-06) { PhyML_Printf("\n. Sum of amino-acid frequencies: %f",sum); PhyML_Printf("\n. Scaling amino-acid frequencies...\n"); for(i=0;i<20;i++) pi[i] /= sum; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Qmat_AA(phydbl *daa, phydbl *pi) { int i,j,cpt; cpt = 0; for(i=0;i<20;i++) { for(j=0;ja_nodes[0], tree->a_nodes[0]->v[0], tree->a_nodes[0]->b[0], fp, tree); /* mean_div_left = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_left[k]; */ /* } */ /* mean_div_rght = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_rght[k]; */ /* mean_div_left /= (phydbl)tree->data->init_len; */ /* mean_div_rght /= (phydbl)tree->data->init_len; */ /* PhyML_Fprintf(fp,"%4d 0 %f\n",j,mean_div_left); */ /* PhyML_Fprintf(fp,"%4d 1 %f\n",j,mean_div_rght); */ /* mean_div_left = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_left[k]; */ /* mean_div_rght = .0; */ /* for(k=0;ka_edges[j]->div_post_pred_rght[k]; */ /* } */ /* if((mean_div_left != tree->data->init_len) || (mean_div_rght != tree->data->init_len)) */ /* { */ /* PhyML_Printf("\n. mean_div_left = %f mean_div_rght = %f init_len = %d", */ /* mean_div_left,mean_div_rght,tree->data->init_len); */ /* PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); */ /* Warn_And_Exit(""); */ /* } */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Diversity_Pre(t_node *a, t_node *d, t_edge *b, FILE *fp, t_tree *tree) { int k,ns; ns = -1; if(d->tax) return; else { if(tree->io->datatype == NT) ns = 4; else if(tree->io->datatype == AA) ns = 20; if(d == b->left) for(k=0;knum,k,b->div_post_pred_left[k]); else for(k=0;knum,k,b->div_post_pred_rght[k]); for(k=0;k<3;k++) if(d->v[k] != a) Print_Diversity_Pre(d,d->v[k],d->b[k],fp,tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Tip_Partials(t_tree* tree, t_node* d) { if(!d->tax) { fprintf(stdout,"Node %d is not a Taxa\n",d->num);fflush(stdout); return; } assert(d->b[0]->rght == d); assert(d->b[0]->rght->tax); fprintf(stdout,"Taxa/Node %d\n",d->num); int site, i; for(site=0;siten_pattern;++site) { fprintf(stdout,"[%d: ",site); for(i=0;imod->ns;++i) { int tip_partial = d->b[0]->p_lk_tip_r[site*tree->mod->ns + i]; fprintf(stdout,"%d",tip_partial);fflush(stdout); } fprintf(stdout,"] ");fflush(stdout); } fprintf(stdout,"\n");fflush(stdout); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Edge_PMats(t_tree* tree, t_edge* b) { phydbl *Pij; #ifdef BEAGLE Pij = (phydbl*)malloc(tree->mod->ns * tree->mod->ns * tree->mod->ras->n_catg * sizeof(phydbl)); if (NULL==Pij) Warn_And_Exit(__PRETTY_FUNCTION__); int ret = beagleGetTransitionMatrix(tree->b_inst, b->Pij_rr_idx, Pij); if(ret<0){ fprintf(stderr, "beagleGetTransitionMatrix() on instance %i failed:%i\n\n",tree->b_inst,ret); Free(Pij); Exit(""); } #else Pij = b->Pij_rr; #endif fprintf(stdout,"\nflattened P-Matrices (for each rate category) state*state*num_rates[%d*%d*%d] for branch num:%i\n",tree->mod->ns,tree->mod->ns,tree->mod->ras->n_catg, b->num); int i; for(i=0;imod->ns * tree->mod->ns * tree->mod->ras->n_catg;++i){ fprintf(stdout,"%f,",Pij[i]); fflush(stdout); } fprintf(stdout,"\n"); fflush(stdout); #ifdef BEAGLE Free(Pij); #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_All_Edge_PMats(t_tree* tree) { int i; for(i=0;i < 2*tree->n_otu-3;++i) Print_Edge_PMats(tree, tree->a_edges[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Edge_Likelihoods(t_tree* tree, t_edge* b, bool scientific/*Print in scientific notation?*/) { int catg, site, j; char* fmt = scientific ? "[%d,%d,%d]%e ":"[%d,%d,%d]%f "; //rate category, site, state, likelihood phydbl* lk_left = b->p_lk_left; phydbl* lk_right = b->p_lk_rght; fprintf(stdout,"\n");fflush(stdout); if(NULL!=lk_left)//not a tip? { fprintf(stdout,"Partial Likelihoods on LEFT subtree of Branch %d [rate,site,state]:\n",b->num); for(catg=0;catgmod->ras->n_catg;++catg) for(site=0;siten_pattern;++site) for(j=0;jmod->ns;++j) #ifdef BEAGLE fprintf(stdout,fmt,catg,site,j,lk_left[catg*tree->n_pattern*tree->mod->ns + site*tree->mod->ns + j]); #else fprintf(stdout,fmt,catg,site,j,lk_left[catg*tree->mod->ns + site*tree->mod->ras->n_catg*tree->mod->ns + j]); #endif fflush(stdout); } else //is a tip { fprintf(stdout,"Likelihoods on LEFT tip of Branch %d [site,state]:\n",b->num); for(site=0;siten_pattern;++site) for(j=0;jmod->ns;++j) fprintf(stdout,"[%d,%d]%.1f ",site,j,b->p_lk_tip_l[site*tree->mod->ns + j]); fflush(stdout); } fprintf(stdout,"\n");fflush(stdout); if(NULL!=lk_right)//not a tip? { fprintf(stdout,"Partial Likelihoods on RIGHT subtree of Branch %d [rate,site,state]:\n",b->num); for(catg=0;catgmod->ras->n_catg;++catg) for(site=0;siten_pattern;++site) for(j=0;jmod->ns;++j) #ifdef BEAGLE fprintf(stdout,fmt,catg,site,j,lk_right[catg*tree->n_pattern*tree->mod->ns + site*tree->mod->ns + j]); #else fprintf(stdout,fmt,catg,site,j,lk_right[catg*tree->mod->ns + site*tree->mod->ras->n_catg*tree->mod->ns + j]); #endif fflush(stdout); } else //is a tip { fprintf(stdout,"Likelihoods on RIGHT tip of Branch %d [site,state]:\n",b->num); for(site=0;siten_pattern;++site) for(j=0;jmod->ns;++j) fprintf(stdout,"[%d,%d]%.1f ",site,j,b->p_lk_tip_r[site*tree->mod->ns + j]); fflush(stdout); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_All_Edge_Likelihoods(t_tree* tree) { int i; for(i=0;i < 2*tree->n_otu-3; ++i) Print_Edge_Likelihoods(tree, tree->a_edges[i],false); fflush(NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Dump_Arr_S(short int* arr, int num) { int i; if(NULL==arr) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n. Trying to print NULL array"); return; } fprintf(stdout,"["); for(i=0;in_otu); for(i=0; i<2*tree->n_otu-1; ++i) { if(tree->a_edges[i]) PhyML_Fprintf(stdout,"\n. Edge %p %3d, Length: %f LeftNode %3d [%s], RightNode %3d [%s]", tree->a_edges[i], tree->a_edges[i]->num, tree->a_edges[i]->l->v, tree->a_edges[i]->left ? tree->a_edges[i]->left->num : -1, tree->a_edges[i]->left ? tree->a_edges[i]->left->tax ? tree->a_edges[i]->left->name : "" : "", tree->a_edges[i]->rght ? tree->a_edges[i]->rght->num : -1, tree->a_edges[i]->left ? tree->a_edges[i]->rght->tax ? tree->a_edges[i]->rght->name : "" : ""); else PhyML_Fprintf(stdout,"\n. NULL"); } for(i=0; i<2*tree->n_otu-1; ++i) { if(tree->a_nodes[i]) PhyML_Fprintf(stdout,"\n. Node %p %3d v0: %3d v1: %3d v2: %3d b0: %3d b1: %3d b2: %3d", tree->a_nodes[i], tree->a_nodes[i]->num, tree->a_nodes[i]->v[0] ? tree->a_nodes[i]->v[0]->num : -1, tree->a_nodes[i]->v[1] ? tree->a_nodes[i]->v[1]->num : -1, tree->a_nodes[i]->v[2] ? tree->a_nodes[i]->v[2]->num : -1, tree->a_nodes[i]->v[0] ? tree->a_nodes[i]->b[0]->num : -1, tree->a_nodes[i]->v[1] ? tree->a_nodes[i]->b[1]->num : -1, tree->a_nodes[i]->v[2] ? tree->a_nodes[i]->b[2]->num : -1); else PhyML_Fprintf(stdout,"\n. NULL"); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// t_tree *Read_User_Tree(calign *cdata, t_mod *mod, option *io) { t_tree *tree; PhyML_Printf("\n. Reading tree..."); fflush(NULL); if(io->n_trees == 1) rewind(io->fp_in_tree); tree = Read_Tree_File_Phylip(io->fp_in_tree); /* fclose(io->fp_in_tree); */ /* io->fp_in_tree = NULL; */ if(tree == NULL) Exit("\n. Input tree not found..."); /* Add branch lengths if necessary */ if(tree->has_branch_lengths == NO) Add_BioNJ_Branch_Lengths(tree,cdata,mod,NULL); return tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Time_Info(time_t t_beg, time_t t_end) { div_t hour,min; hour = div(t_end-t_beg,3600); min = div(t_end-t_beg,60 ); min.quot -= hour.quot*60; PhyML_Printf("\n\n. Time used %dh%dm%ds\n", hour.quot,min.quot,(int)(t_end-t_beg)%60); PhyML_Printf("\noooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n"); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Time_Info_Brief(time_t t_beg, time_t t_end) { div_t hour,min; hour = div(t_end-t_beg,3600); min = div(t_end-t_beg,60 ); min.quot -= hour.quot*60; PhyML_Printf("\n. Time used %dh%dm%ds\n", hour.quot,min.quot,(int)(t_end-t_beg)%60); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PhyML_Printf(char *format, ...) { va_list ptr; #ifdef MPI if(Global_myRank == 0) { va_start (ptr, format); vprintf (format, ptr); va_end(ptr); } #else va_start (ptr, format); vprintf (format, ptr); va_end(ptr); #endif fflush (NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void PhyML_Fprintf(FILE *fp, char *format, ...) { va_list ptr; #ifdef MPI if(Global_myRank == 0) { va_start (ptr, format); vfprintf (fp,format, ptr); va_end(ptr); } #else va_start (ptr, format); vfprintf (fp,format, ptr); va_end(ptr); #endif fflush (NULL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int PhyML_Fscanf(FILE *fp, char *format, ...) { va_list ptr; int rv; rv = -1; #ifdef MPI if(Global_myRank == 0) { va_start (ptr, format); rv = vfscanf(fp,format,ptr); if(!rv) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); va_end(ptr); } #else va_start (ptr, format); rv = vfscanf(fp,format,ptr); if(!rv) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); va_end(ptr); #endif return(rv); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Read_Clade_Priors(char *file_name, t_tree *tree) { FILE *fp; char *s,*line; int n_clade_priors; int clade_size; char **clade_list; int i,pos; phydbl prior_low,prior_up; int node_num; PhyML_Printf("\n"); PhyML_Printf("\n. Reading prior on node ages.\n"); line = (char *)mCalloc(T_MAX_LINE,sizeof(char)); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); clade_list = (char **)mCalloc(tree->n_otu,sizeof(char *)); for(i=0;in_otu;i++) clade_list[i] = (char *)mCalloc(T_MAX_NAME,sizeof(char)); fp = Openfile(file_name,0); n_clade_priors = 0; do { if(!fgets(line,T_MAX_LINE,fp)) break; clade_size = 0; pos = 0; do { i = 0; while(line[pos] == ' ') pos++; while((line[pos] != ' ') && (line[pos] != '\n') && line[pos] != '#') { s[i] = line[pos]; i++; pos++; } s[i] = '\0'; /* PhyML_Printf("\n. s = %s\n",s); */ if(line[pos] == '\n' || line[pos] == '#') break; pos++; if(strcmp(s,"|")) { strcpy(clade_list[clade_size],s); clade_size++; } else break; } while(1); if(line[pos] != '#' && line[pos] != '\n') { phydbl val1, val2; /* sscanf(line+pos,"%lf %lf",&prior_up,&prior_low); */ sscanf(line+pos,"%lf %lf",&val1,&val2); prior_up = (phydbl)val1; prior_low = (phydbl)val2; node_num = -1; if(!strcmp("@root@",clade_list[0])) node_num = tree->n_root->num; else node_num = Find_Clade(clade_list, clade_size, tree); n_clade_priors++; if(node_num < 0) { PhyML_Printf("\n"); PhyML_Printf("\n"); PhyML_Printf("\n. ................................................................."); PhyML_Printf("\n. WARNING: could not find any clade in the tree referred to with the following taxon names:"); for(i=0;itimes->t_has_prior[node_num] = YES; tree->times->t_prior_min[node_num] = -MAX(prior_low,prior_up); tree->times->t_prior_max[node_num] = -MIN(prior_low,prior_up); if(fabs(prior_low - prior_up) < 1.E-6 && tree->a_nodes[node_num]->tax == YES) tree->times->nd_t[node_num] = prior_low; PhyML_Printf("\n"); PhyML_Printf("\n. [%3d]..................................................................",n_clade_priors); PhyML_Printf("\n. Node %4d matches the clade referred to with the following taxon names:",node_num); for(i=0;i 1 ? "clades":"clade"); if(!n_clade_priors) { PhyML_Fprintf(stderr,"\n. PhyTime could not find any prior on node age."); PhyML_Fprintf(stderr,"\n. This is likely due to a problem in the calibration "); PhyML_Fprintf(stderr,"\n. file format. Make sure, for instance, that there is "); PhyML_Fprintf(stderr,"\n. a blank character between the end of the last name"); PhyML_Fprintf(stderr,"\n. of each clade and the character `|'. Otherwise, "); PhyML_Fprintf(stderr,"\n. please refer to the example file.\n"); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit(""); } for(i=0;in_otu;i++) Free(clade_list[i]); Free(clade_list); Free(line); Free(s); fclose(fp); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// option *Get_Input(int argc, char **argv) { option *io; t_mod *mod; t_opt *s_opt; int rv; rv = 1; io = (option *)Make_Input(); mod = (t_mod *)Make_Model_Basic(); s_opt = (t_opt *)Make_Optimiz(); Set_Defaults_Input(io); Set_Defaults_Model(mod); Set_Defaults_Optimiz(s_opt); io->mod = mod; mod->io = io; mod->s_opt = s_opt; #ifdef MPI rv = Read_Command_Line(io,argc,argv); #elif (defined PHYTIME || defined INVITEE || defined PHYREX || defined TEST) rv = Read_Command_Line(io,argc,argv); #else switch (argc) { case 1: { Launch_Interface(io); break; } default: { rv = Read_Command_Line(io,argc,argv); } } #endif if(rv) return io; else return NULL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Set_Whichmodel(int select) { int wm; wm = -1; switch(select) { case 1: { wm = JC69; break; } case 2: { wm = K80; break; } case 3: { wm = F81; break; } case 4: { wm = HKY85; break; } case 5: { wm = F84; break; } case 6: { wm = TN93; break; } case 7: { wm = GTR; break; } case 8: { wm = CUSTOM; break; } case 11: { wm = WAG; break; } case 12: { wm = DAYHOFF; break; } case 13: { wm = JTT; break; } case 14: { wm = BLOSUM62; break; } case 15: { wm = MTREV; break; } case 16: { wm = RTREV; break; } case 17: { wm = CPREV; break; } case 18: { wm = DCMUT; break; } case 19: { wm = VT; break; } case 20: { wm = MTMAM; break; } case 21: { wm = MTART; break; } case 22: { wm = HIVW; break; } case 23: { wm = HIVB; break; } case 24: { wm = FLU; break; } case 25: { wm = CUSTOMAA; break; } case 26: { wm = LG; break; } case 27: { wm = AB; break; } default: { PhyML_Fprintf(stderr,"\n. Model number %d is unknown. Please use a valid model name",select); Exit("\n"); break; } } return wm; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Print_Data_Structure(int final, FILE *fp, t_tree *mixt_tree) { int n_partition_elem; char *s; t_tree *tree,*cpy_mixt_tree; int c,cc,cc_efrq,cc_rmat,cc_lens; char *param; int *link_efrq,*link_rmat,*link_lens; phydbl r_mat_weight_sum, e_frq_weight_sum; PhyML_Fprintf(fp,"\n. Starting tree: %s", mixt_tree->io->in_tree == 2?mixt_tree->io->in_tree_file:"BioNJ"); cpy_mixt_tree = mixt_tree; n_partition_elem = 1; tree = mixt_tree; do { tree = tree->next_mixt; if(!tree) break; n_partition_elem++; } while(1); s = (char *)mCalloc(2,sizeof(char)); s[0] = ' '; s[1] = '\0'; tree = mixt_tree; do { s = (char *)mRealloc(s,(int)(strlen(s)+strlen(tree->io->in_align_file)+2+2),sizeof(char)); strcat(s,tree->io->in_align_file); strcat(s,", "); tree = tree->next_mixt; if(!tree) break; } while(1); s[(int)strlen(s)-2]=' '; s[(int)strlen(s)-1]='\0'; if(final == NO) PhyML_Fprintf(fp,"\n\n. Processing %d data %s (%s)",n_partition_elem,n_partition_elem>1?"sets":"set",s); if(final == YES) PhyML_Fprintf(fp,"\n\n. Processed %d data %s (%s)",n_partition_elem,n_partition_elem>1?"sets":"set",s); Free(s); if(final == YES) PhyML_Fprintf(fp,"\n\n. Final log-likelihood: %f",mixt_tree->c_lnL); r_mat_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->r_mat_weight); e_frq_weight_sum = MIXT_Get_Sum_Chained_Scalar_Dbl(mixt_tree->next->mod->e_frq_weight); do { int class = 0; PhyML_Fprintf(fp,"\n\n"); PhyML_Fprintf(fp,"\n _______________________________________________________________________ "); PhyML_Fprintf(fp,"\n| |"); PhyML_Fprintf(fp,"\n| %40s (partition element %2d) |",mixt_tree->io->in_align_file,mixt_tree->dp); PhyML_Fprintf(fp,"\n|_______________________________________________________________________|"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n. Number of rate classes:\t\t%20d",mixt_tree->mod->ras->n_catg+(mixt_tree->mod->ras->invar ?1:0)); if(mixt_tree->mod->ras->n_catg > 1) { PhyML_Fprintf(fp,"\n. Model of rate variation:\t\t%20s", mixt_tree->mod->ras->free_mixt_rates?"FreeRates": mixt_tree->mod->ras->invar?"Gamma+Inv":"Gamma"); if(mixt_tree->mod->ras->free_mixt_rates == NO) { PhyML_Fprintf(fp,"\n. Gamma shape parameter value:\t\t%20.2f",mixt_tree->mod->ras->alpha->v); PhyML_Fprintf(fp,"\n Optimise: \t\t\t\t%20s",mixt_tree->mod->s_opt->opt_alpha==YES?"yes":"no"); } if(mixt_tree->mod->ras->invar == YES) { PhyML_Fprintf(fp,"\n. Proportion of invariable sites:\t%20.2f",mixt_tree->mod->ras->pinvar->v); PhyML_Fprintf(fp,"\n Optimise: \t\t\t\t%20s",mixt_tree->mod->s_opt->opt_pinvar==YES?"yes":"no"); } } PhyML_Fprintf(fp,"\n. Relative average rate:\t\t%20f",mixt_tree->mod->br_len_mult->v); tree = mixt_tree; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n. Mixture class %d",class+1); if(mixt_tree->mod->ras->n_catg > 1) { if(tree->mod->ras->invar == NO) { PhyML_Fprintf(fp,"\n Relative substitution rate:\t%20f",mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number]); PhyML_Fprintf(fp,"\n Rel. rate freq. (> 0 rates):\t%20f",mixt_tree->mod->ras->gamma_r_proba->v[tree->mod->ras->parent_class_number]); PhyML_Fprintf(fp,"\n Rate class number:\t\t%20d",tree->mod->ras->parent_class_number); } else { PhyML_Fprintf(fp,"\n Relative substitution rate:\t%20f",0.0); PhyML_Fprintf(fp,"\n Relative rate freq.:\t\t%20f",mixt_tree->mod->ras->pinvar->v); } } PhyML_Fprintf(fp,"\n Substitution model:\t\t%20s",tree->mod->modelname->s); if(tree->mod->whichmodel == CUSTOM) PhyML_Fprintf(fp,"\n Substitution model code:\t%20s",tree->mod->custom_mod_string->s); if(tree->mod->whichmodel == CUSTOMAA) PhyML_Fprintf(fp,"\n Rate matrix file name:\t%20s",tree->mod->aa_rate_mat_file->s); if(tree->mod->whichmodel == K80 || tree->mod->whichmodel == HKY85 || tree->mod->whichmodel == TN93) { PhyML_Fprintf(fp,"\n Value of the ts/tv ratio:\t%20f",tree->mod->kappa->v); PhyML_Fprintf(fp,"\n Optimise ts/tv ratio:\t%20s",tree->mod->s_opt->opt_kappa?"yes":"no"); } else if(tree->mod->whichmodel == GTR || tree->mod->whichmodel == CUSTOM) { PhyML_Fprintf(fp,"\n Optimise subst. rates:\t%20s",tree->mod->s_opt->opt_rr?"yes":"no"); if(final == YES) { PhyML_Fprintf(fp,"\n Subst. rate A<->C:\t\t%20.2f",tree->mod->r_mat->rr->v[0]); PhyML_Fprintf(fp,"\n Subst. rate A<->G:\t\t%20.2f",tree->mod->r_mat->rr->v[1]); PhyML_Fprintf(fp,"\n Subst. rate A<->T:\t\t%20.2f",tree->mod->r_mat->rr->v[2]); PhyML_Fprintf(fp,"\n Subst. rate C<->G:\t\t%20.2f",tree->mod->r_mat->rr->v[3]); PhyML_Fprintf(fp,"\n Subst. rate C<->T:\t\t%20.2f",tree->mod->r_mat->rr->v[4]); PhyML_Fprintf(fp,"\n Subst. rate G<->T:\t\t%20.2f",tree->mod->r_mat->rr->v[5]); } } PhyML_Fprintf(fp,"\n Rate matrix weight:\t\t%20f",tree->mod->r_mat_weight->v / r_mat_weight_sum); if(tree->io->datatype == NT && tree->mod->whichmodel != JC69 && tree->mod->whichmodel != K80) { PhyML_Fprintf(fp,"\n Optimise nucleotide freq.:\t%20s",tree->mod->s_opt->state_freq == ML ?"yes":"no"); if(final == YES) { PhyML_Fprintf(fp,"\n Freq(A):\t\t\t%20.2f",tree->mod->e_frq->pi->v[0]); PhyML_Fprintf(fp,"\n Freq(C):\t\t\t%20.2f",tree->mod->e_frq->pi->v[1]); PhyML_Fprintf(fp,"\n Freq(G):\t\t\t%20.2f",tree->mod->e_frq->pi->v[2]); PhyML_Fprintf(fp,"\n Freq(T):\t\t\t%20.2f",tree->mod->e_frq->pi->v[3]); } } else if(tree->io->datatype == AA) { char *s; s = (char *)mCalloc(50,sizeof(char)); if(tree->mod->s_opt->state_freq == EMPIRICAL) { strcpy(s,"Empirical"); } else if(tree->mod->s_opt->state_freq == MODEL) { strcpy(s,"Model"); } else if(tree->mod->s_opt->state_freq == ML) { strcpy(s,"Optimized"); } PhyML_Fprintf(fp,"\n Amino-acid freq.:\t\t%20s",s); Free(s); } PhyML_Fprintf(fp,"\n Equ. freq. weight:\t\t%20f",tree->mod->e_frq_weight->v / e_frq_weight_sum); class++; tree = tree->next; if(tree && tree->is_mixt_tree == YES) break; } while(tree); mixt_tree = mixt_tree->next_mixt; if(!mixt_tree) break; } while(1); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; c++; tree = tree->next; } while(tree); link_efrq = (int *)mCalloc(c,sizeof(int)); link_lens = (int *)mCalloc(c,sizeof(int)); link_rmat = (int *)mCalloc(c,sizeof(int)); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n _______________________________________________________________________ "); PhyML_Fprintf(fp,"\n| |"); PhyML_Fprintf(fp,"\n| Model summary table |"); PhyML_Fprintf(fp,"\n|_______________________________________________________________________|"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); /* PhyML_Fprintf(fp," "); */ PhyML_Fprintf(fp," ------------------"); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"---"); tree = tree->next; } while(tree); param = (char *)mCalloc(30,sizeof(char)); PhyML_Fprintf(fp,"\n"); strcpy(param,"Partition element "); PhyML_Fprintf(fp," %18s",param); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"%2d ",tree->mixt_tree->dp); tree = tree->next; } while(tree); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp," ------------------"); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"---"); tree = tree->next; } while(tree); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; link_rmat[c] = -1; link_lens[c] = -1; link_efrq[c] = -1; tree = tree->next; c++; } while(tree); mixt_tree = cpy_mixt_tree; cc_efrq = 97; cc_rmat = 97; cc_lens = 97; cc = 0; do { if(mixt_tree->is_mixt_tree) mixt_tree = mixt_tree->next; if(link_efrq[cc] < 0) { link_efrq[cc] = cc_efrq; tree = mixt_tree->next; c = cc+1; if(tree) { do { if(tree->is_mixt_tree) tree = tree->next; if(mixt_tree->mod->e_frq == tree->mod->e_frq) link_efrq[c] = cc_efrq; tree = tree->next; c++; } while(tree); } cc_efrq++; } if(link_lens[cc] < 0) { link_lens[cc] = cc_lens; tree = mixt_tree->next; c = cc+1; if(tree) { do { if(tree->is_mixt_tree) tree = tree->next; if(mixt_tree->a_edges[0]->l == tree->a_edges[0]->l) link_lens[c] = cc_lens; tree = tree->next; c++; } while(tree); } cc_lens++; } if(link_rmat[cc] < 0) { link_rmat[cc] = cc_rmat; tree = mixt_tree->next; c = cc+1; if(tree) { do { if(tree->is_mixt_tree) tree = tree->next; if(mixt_tree->mod->r_mat == tree->mod->r_mat && mixt_tree->mod->whichmodel == tree->mod->whichmodel && !strcmp(mixt_tree->mod->custom_mod_string->s, tree->mod->custom_mod_string->s) && !strcmp(mixt_tree->mod->aa_rate_mat_file->s, tree->mod->aa_rate_mat_file->s)) link_rmat[c] = cc_rmat; tree = tree->next; c++; } while(tree); } cc_rmat++; } cc++; mixt_tree = mixt_tree->next; } while(mixt_tree); PhyML_Fprintf(fp,"\n"); strcpy(param,"State frequencies "); PhyML_Fprintf(fp," %18s",param); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"%2c ",link_efrq[c]); tree = tree->next; c++; } while(tree); PhyML_Fprintf(fp,"\n"); strcpy(param,"Branch lengths "); PhyML_Fprintf(fp," %18s",param); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"%2c ",link_lens[c]); tree = tree->next; c++; } while(tree); PhyML_Fprintf(fp,"\n"); strcpy(param,"Rate matrix "); PhyML_Fprintf(fp," %18s",param); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"%2c ",link_rmat[c]); tree = tree->next; c++; } while(tree); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp," ------------------"); tree = cpy_mixt_tree; c = 0; do { if(tree->is_mixt_tree) tree = tree->next; PhyML_Fprintf(fp,"---"); tree = tree->next; } while(tree); PhyML_Fprintf(fp,"\n"); if(final == YES) { tree = cpy_mixt_tree; c = 0; do { PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n. Tree estimated from data partition %d",c++); Br_Len_Involving_Invar(tree->next); Rescale_Br_Len_Multiplier_Tree(tree->next); s = Write_Tree(tree->next); /*! tree->next is not a mixt_tree so edge lengths are not averaged over when writing the tree out. */ PhyML_Fprintf(fp,"\n %s",s); Br_Len_Not_Involving_Invar(tree->next); Unscale_Br_Len_Multiplier_Tree(tree->next); Free(s); tree = tree->next_mixt; } while(tree); } Free(param); Free(link_efrq); Free(link_rmat); Free(link_lens); mixt_tree = cpy_mixt_tree; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// option *PhyML_XML(char *xml_filename) { char *most_likely_tree; phydbl best_lnL; int num_rand_tree; t_tree *mixt_tree,*tree; option *io,*dum; xml_node *xml_root; mixt_tree = XML_Process_Base(xml_filename); io = mixt_tree->io; most_likely_tree = NULL; xml_root = mixt_tree->xml_root; best_lnL = UNLIKELY; dum = NULL; dum = (option *)mCalloc(1,sizeof(option)); dum->use_xml = YES; for(num_rand_tree=0;num_rand_treemod->s_opt->n_rand_starts;num_rand_tree++) { MIXT_Check_Model_Validity(mixt_tree); MIXT_Chain_Models(mixt_tree); Init_Model(mixt_tree->mod->io->cdata,mixt_tree->mod,mixt_tree->mod->io); Set_Model_Parameters(mixt_tree->mod); Print_Data_Structure(NO,stdout,mixt_tree); tree = MIXT_Starting_Tree(mixt_tree); Copy_Tree(tree,mixt_tree); Free_Tree(tree); if(mixt_tree->io->mod->s_opt->random_input_tree) { PhyML_Printf("\n\n. [%3d/%3d]",num_rand_tree+1,mixt_tree->io->mod->s_opt->n_rand_starts); Random_Tree(mixt_tree); } Copy_Tree(mixt_tree,mixt_tree->next); Connect_CSeqs_To_Nodes(mixt_tree->mod->io->cdata,mixt_tree->mod->io,mixt_tree); Init_T_Beg(mixt_tree); Make_Tree_For_Pars(mixt_tree); Make_Tree_For_Lk(mixt_tree); Make_Spr(mixt_tree); MIXT_Chain_All(mixt_tree); MIXT_Check_Edge_Lens_In_All_Elem(mixt_tree); MIXT_Turn_Branches_OnOff_In_All_Elem(ON,mixt_tree); MIXT_Check_Invar_Struct_In_Each_Partition_Elem(mixt_tree); MIXT_Check_RAS_Struct_In_Each_Partition_Elem(mixt_tree); Br_Len_Not_Involving_Invar(mixt_tree); Unscale_Br_Len_Multiplier_Tree(mixt_tree); Set_Both_Sides(YES,mixt_tree); Set_Update_Eigen(YES,mixt_tree->mod); Lk(NULL,mixt_tree); Set_Update_Eigen(NO,mixt_tree->mod); if(mixt_tree->mod->s_opt->opt_topo) { Global_Spr_Search(mixt_tree); } else { Round_Optimize(mixt_tree,ROUND_MAX); } PhyML_Printf("\n\n. Log-likelihood = %f",mixt_tree->c_lnL); if((num_rand_tree == io->mod->s_opt->n_rand_starts-1) && (io->mod->s_opt->random_input_tree)) { num_rand_tree--; io->mod->s_opt->random_input_tree = NO; } Br_Len_Involving_Invar(mixt_tree); Rescale_Br_Len_Multiplier_Tree(mixt_tree); /*! Print the tree estimated using the current random (or BioNJ) starting tree */ if(io->mod->s_opt->n_rand_starts > 1) { Print_Tree(io->fp_out_trees,mixt_tree); fflush(NULL); } if(mixt_tree->c_lnL > best_lnL) { best_lnL = mixt_tree->c_lnL; if(most_likely_tree) Free(most_likely_tree); if(io->ratio_test) aLRT(mixt_tree); most_likely_tree = Write_Tree(mixt_tree); mixt_tree->lock_topo = NO; } tree = mixt_tree; do { if(tree->io->print_site_lnl == YES) Print_Site_Lk(tree,tree->io->fp_out_lk); tree = tree->next_mixt; } while(tree); MIXT_Init_T_End(mixt_tree); Print_Data_Structure(YES,mixt_tree->io->fp_out_stats,mixt_tree); Free_Best_Spr(mixt_tree); Free_Spr_List_One_Edge(mixt_tree); Free_Spr_List_All_Edge(mixt_tree); Free_Tree_Pars(mixt_tree); Free_Tree_Lk(mixt_tree); } /*! Print the most likely tree in the output file */ if(!mixt_tree->io->quiet) PhyML_Printf("\n\n. Printing the most likely tree in file '%s'...\n", Basename(mixt_tree->io->out_tree_file)); PhyML_Fprintf(mixt_tree->io->fp_out_tree,"%s\n",most_likely_tree); /*! Bootstrap analysis */ MIXT_Bootstrap(most_likely_tree,xml_root); while(io->prev != NULL) io = io->prev; Free(most_likely_tree); tree = mixt_tree; do { Free_Calign(tree->data); tree = tree->next_mixt; } while(tree); tree = mixt_tree; do { Free_Optimiz(tree->mod->s_opt); tree = tree->next; } while(tree); Free_Model_Complete(mixt_tree->mod); Free_Model_Basic(mixt_tree->mod); Free_Tree(mixt_tree); if(io->fp_out_trees) fclose(io->fp_out_trees); if(io->fp_out_tree) fclose(io->fp_out_tree); if(io->fp_out_stats) fclose(io->fp_out_stats); if(io->fp_out_json_trace) fclose(io->fp_out_json_trace); Free_Input(io); XML_Free_XML_Tree(xml_root); return(dum); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /*! Check that the same nodes in the different mixt_trees are connected to the same taxa */ void Check_Taxa_Sets(t_tree *mixt_tree) { t_tree *tree; int i; tree = mixt_tree; do { if(tree->next) { for(i=0;in_otu;i++) { if(strcmp(tree->a_nodes[i]->name,tree->next->a_nodes[i]->name)) { PhyML_Fprintf(stderr,"\n. There seems to be a problem in one (or more) of your"); PhyML_Fprintf(stderr,"\n. sequence alignments. PhyML could not match taxon"); PhyML_Fprintf(stderr,"\n. '%s' found in file '%s' with any of the taxa",tree->a_nodes[i]->name,tree->io->in_align_file); PhyML_Fprintf(stderr,"\n. listed in file '%s'.",tree->next->io->in_align_file); Exit("\n"); } } } tree = tree->next; } while(tree); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Ratematrix_From_XML_Node(xml_node *instance, option *io, t_mod *mod) { char *model = NULL; int select; model = XML_Get_Attribute_Value(instance,"model"); if(model == NULL) { PhyML_Fprintf(stderr,"\n. Poorly formated XML file."); PhyML_Fprintf(stderr,"\n. Attribute 'model' is mandatory in a node."); Exit("\n"); } select = XML_Validate_Attr_Int(model,27, "xxxxx", //0 "JC69", //1 "K80", //2 "F81", //3 "HKY85", //4 "F84", //5 "TN93", //6 "GTR", //7 "CUSTOM", //8 "xxxxx", //9 "xxxxx", //10 "WAG", //11 "DAYHOFF", //12 "JTT", //13 "BLOSUM62", //14 "MTREV", //15 "RTREV", //16 "CPREV", //17 "DCMUT", //18 "VT", //19 "MTMAM", //20 "MTART", //21 "HIVW", //22 "HIVB", //23 "FLU", //24 "CUSTOMAA", //25 "LG", //26 "AB" ); //27 if(select < 9) { if(io->datatype != NT) { PhyML_Fprintf(stderr,"\n. Data type and selected model are incompatible"); Exit("\n"); } } else { if(io->datatype != AA) { PhyML_Fprintf(stderr,"\n. Data type and selected model are incompatible"); Exit("\n"); } } mod->r_mat = (t_rmat *)Make_Rmat(mod->ns); Init_Rmat(mod->r_mat); /*! Set model number & name */ mod->whichmodel = Set_Whichmodel(select); Set_Model_Name(mod); if(mod->whichmodel == K80 || mod->whichmodel == HKY85 || mod->whichmodel == TN93) { char *tstv,*opt_tstv; tstv = XML_Get_Attribute_Value(instance,"tstv"); if(tstv) { mod->s_opt->opt_kappa = NO; mod->kappa->v = String_To_Dbl(tstv); } else { mod->s_opt->opt_kappa = YES; } opt_tstv = XML_Get_Attribute_Value(instance,"optimise.tstv"); if(opt_tstv) { if(!strcmp(opt_tstv,"true") || !strcmp(opt_tstv,"yes")) { mod->s_opt->opt_kappa = YES; mod->s_opt->opt_subst_param = YES; } else { mod->s_opt->opt_kappa = NO; mod->s_opt->opt_subst_param = NO; } } } else { mod->s_opt->opt_kappa = NO; } if(mod->whichmodel == GTR || mod->whichmodel == CUSTOM) { char *opt_rr; opt_rr = XML_Get_Attribute_Value(instance,"optimise.rr"); if(opt_rr) { if(!strcmp(opt_rr,"yes") || !strcmp(opt_rr,"true")) { mod->s_opt->opt_rr = YES; mod->s_opt->opt_subst_param = YES; } else { mod->s_opt->opt_rr = NO; mod->s_opt->opt_subst_param = NO; } } } if(mod->whichmodel == GTR || mod->whichmodel == CUSTOM) { xml_node *rr; char *val; phydbl v; rr = XML_Search_Node_Name("rr",YES,instance); if(rr != NULL) { mod->r_mat = (t_rmat *)Make_Rmat(mod->ns); Init_Rmat(mod->r_mat); Make_Custom_Model(mod); // A<->C val = XML_Get_Attribute_Value(rr,"AC"); if(val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution between A and T"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } else { v = strtod(val,NULL); if(v != 0 && v > 0.0) { mod->r_mat->rr->v[0] = v; mod->r_mat->rr_val->v[0] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } // A<->G val = XML_Get_Attribute_Value(rr,"AG"); if(val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution between A and T"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } else { v = strtod(val,NULL); if(v != 0 && v > 0.0) { mod->r_mat->rr->v[1] = v; mod->r_mat->rr_val->v[1] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } // A<->T val = XML_Get_Attribute_Value(rr,"AT"); if(val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution between A and T"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } else { v = strtod(val,NULL); if(v != 0 && v > 0.0) { mod->r_mat->rr->v[2] = v; mod->r_mat->rr_val->v[2] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } // C<->G val = XML_Get_Attribute_Value(rr,"CG"); if(val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution between A and T"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } else { v = strtod(val,NULL); if(v != 0 && v > 0.0) { mod->r_mat->rr->v[3] = v; mod->r_mat->rr_val->v[3] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } // C<->T val = XML_Get_Attribute_Value(rr,"CT"); if(val == NULL) { PhyML_Printf("\n. Please specify the relative rate of substitution between A and T"); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } else { v = strtod(val,NULL); if(v != 0 && v > 0.0) { mod->r_mat->rr->v[4] = v; mod->r_mat->rr_val->v[4] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } // G<->T val = XML_Get_Attribute_Value(rr,"GT"); if(val != NULL) { v = strtod(val,NULL); if(v != 0 && v > 0.0) { mod->r_mat->rr->v[5] = v; mod->r_mat->rr_val->v[5] = log(v); } else { PhyML_Printf("\n. Invalid relative rate parameter value: '%s'.\n", val); Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } } } } /*! Custom model for nucleotide sequences. Read the corresponding code. */ if(mod->whichmodel == CUSTOM) { char *model_code = NULL; model_code = XML_Get_Attribute_Value(instance,"model.code"); if(!model_code) { PhyML_Fprintf(stderr,"\n. No valid 'model.code' attribute could be found.\n"); PhyML_Fprintf(stderr,"\n. Please fix your XML file.\n"); Exit("\n"); } else { strcpy(mod->custom_mod_string->s,model_code); } } /*! Custom model for amino-acids. Read in the rate matrix file */ if(mod->whichmodel == CUSTOMAA) { char *r_mat_file; r_mat_file = XML_Get_Attribute_Value(instance,"ratematrix.file"); if(!r_mat_file) { PhyML_Fprintf(stderr,"\n. No valid 'ratematrix.file' attribute could be found."); PhyML_Fprintf(stderr,"\n. Please fix your XML file.\n"); Exit("\n"); } else { strcpy(mod->aa_rate_mat_file->s,r_mat_file); } /* Free(r_mat_file); */ } char *buff; buff = XML_Get_Attribute_Value(instance->parent,"optimise.weights"); if(buff && (!strcmp(buff,"yes") || !strcmp(buff,"true"))) { mod->s_opt->opt_rmat_weight = YES; } else { mod->s_opt->opt_rmat_weight = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Efrq_From_XML_Node(xml_node *instance, option *io, t_mod *mod) { char *buff; mod->e_frq = (t_efrq *)Make_Efrq(mod->ns); Init_Efrq(NULL,mod->e_frq); buff = XML_Get_Attribute_Value(instance,"freqs"); if(buff) { if(!strcmp(buff,"empirical")) { mod->s_opt->state_freq = EMPIRICAL; } if(!strcmp(buff,"model")) { mod->s_opt->state_freq = MODEL; } else if(!strcmp(buff,"optimized")) { mod->s_opt->state_freq = ML; } else if(!strcmp(buff,"user")) { mod->s_opt->state_freq = ML; } } buff = XML_Get_Attribute_Value(instance,"base.freqs"); if(buff) { if(io->datatype == AA) { PhyML_Fprintf(stderr,"\n. Option 'base.freqs' is not allowed with amino-acid data."); Exit("\n"); } else { phydbl A,C,G,T; if(mod->s_opt->state_freq != USER) { PhyML_Fprintf(stderr,"\n. Please set 'freqs=user'."); Exit("\n"); } sscanf(buff,"%lf,%lf,%lf,%lf",&A,&C,&G,&T); mod->e_frq->user_b_freq->v[0] = (phydbl)A; mod->e_frq->user_b_freq->v[1] = (phydbl)C; mod->e_frq->user_b_freq->v[2] = (phydbl)G; mod->e_frq->user_b_freq->v[3] = (phydbl)T; mod->s_opt->state_freq = USER; } } buff = XML_Get_Attribute_Value(instance->parent,"optimise.weights"); if(buff && (!strcmp(buff,"yes") || !strcmp(buff,"true"))) { mod->s_opt->opt_efrq_weight = YES; } else { mod->s_opt->opt_efrq_weight = NO; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_Topology_From_XML_Node(xml_node *instance, option *io, t_mod *mod) { // Starting tree char *init_tree; init_tree = XML_Get_Attribute_Value(instance,"init.tree"); if(!init_tree) { PhyML_Fprintf(stderr,"\n. Attribute 'init.tree=bionj|user|random' is mandatory"); PhyML_Fprintf(stderr,"\n. Please amend your XML file accordingly."); Exit("\n"); } if(!strcmp(init_tree,"user") || !strcmp(init_tree,"User")) { char *starting_tree = NULL; starting_tree = XML_Get_Attribute_Value(instance,"file.name"); if(!Filexists(starting_tree)) { PhyML_Fprintf(stderr,"\n. The tree file '%s' could not be found.",starting_tree); Exit("\n"); } else { strcpy(io->in_tree_file,starting_tree); io->in_tree = 2; io->fp_in_tree = Openfile(io->in_tree_file,0); } } else if(!strcmp(init_tree,"random") || !strcmp(init_tree,"Random")) { char *n_rand_starts = NULL; io->mod->s_opt->random_input_tree = YES; n_rand_starts = XML_Get_Attribute_Value(instance,"n.rand.starts"); if(n_rand_starts) { mod->s_opt->n_rand_starts = atoi(n_rand_starts); if(mod->s_opt->n_rand_starts < 1) Exit("\n. Number of random starting trees must be > 0.\n\n"); } strcpy(io->out_trees_file,io->in_align_file); strcat(io->out_trees_file,"_phyml_rand_trees"); if(io->append_run_ID) { strcat(io->out_trees_file,"_"); strcat(io->out_trees_file,io->run_id_string); } strcat(io->out_trees_file,".txt"); io->fp_out_trees = Openfile(io->out_trees_file,1); } else if(!strcmp(init_tree,"parsimony") || !strcmp(init_tree,"Parsimony")) { io->in_tree = 1; } // Estimate tree topology char *optimise = NULL; optimise = XML_Get_Attribute_Value(instance,"optimise.tree"); if(optimise) { int select; select = XML_Validate_Attr_Int(optimise,6, "true","yes","y", "false","no","n"); if(select > 2) io->mod->s_opt->opt_topo = NO; else { char *search; int select; search = XML_Get_Attribute_Value(instance,"search"); if(search == NULL) { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->opt_topo = YES; } else { select = XML_Validate_Attr_Int(search,4,"spr","nni","best","none"); switch(select) { case 0: { io->mod->s_opt->topo_search = SPR_MOVE; io->mod->s_opt->opt_topo = YES; break; } case 1: { io->mod->s_opt->topo_search = NNI_MOVE; io->mod->s_opt->opt_topo = YES; break; } case 2: { io->mod->s_opt->topo_search = BEST_OF_NNI_AND_SPR; io->mod->s_opt->opt_topo = YES; break; } case 3: { io->mod->s_opt->opt_topo = NO; break; } default: { PhyML_Fprintf(stderr,"\n. Topology search option '%s' is not valid.",search); Exit("\n"); break; } } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Make_RAS_From_XML_Node(xml_node *parent, t_mod *mod) { xml_node *w; char *family; int select; family = NULL; mod->ras->n_catg = 0; XML_Check_Siterates_Node(parent); w = XML_Search_Node_Name("weights",YES,parent); if(w) { family = XML_Get_Attribute_Value(w,"family"); if(family == NULL) select = -1; else select = XML_Validate_Attr_Int(family,3,"gamma","gamma+inv","freerates"); switch(select) { case 0:// Gamma model { char *alpha,*alpha_opt; mod->s_opt->opt_pinvar = NO; mod->ras->invar = NO; alpha = XML_Get_Attribute_Value(w,"alpha"); if(alpha) { if(!strcmp(alpha,"estimate") || !strcmp(alpha,"estimated") || !strcmp(alpha,"optimise") || !strcmp(alpha,"optimised")) { mod->s_opt->opt_alpha = YES; } else { mod->s_opt->opt_alpha = NO; mod->ras->alpha->v = String_To_Dbl(alpha); } } alpha_opt = XML_Get_Attribute_Value(w,"optimise.alpha"); if(alpha_opt) { if(!strcmp(alpha_opt,"yes") || !strcmp(alpha_opt,"true")) { mod->s_opt->opt_alpha = YES; } else { mod->s_opt->opt_alpha = NO; } } mod->ras->n_catg = XML_Get_Number_Of_Classes_Siterates(parent); Make_RAS_Complete(mod->ras); break; } case 1: // Gamma+Inv model { char *alpha,*pinv,*alpha_opt,*pinv_opt; mod->ras->invar = YES; mod->s_opt->opt_pinvar = YES; alpha = XML_Get_Attribute_Value(w,"alpha"); if(alpha) { if(!strcmp(alpha,"estimate") || !strcmp(alpha,"estimated") || !strcmp(alpha,"optimise") || !strcmp(alpha,"optimised")) { mod->s_opt->opt_alpha = YES; } else { mod->s_opt->opt_alpha = NO; mod->ras->alpha->v = String_To_Dbl(alpha);; } } alpha_opt = XML_Get_Attribute_Value(w,"optimise.alpha"); if(alpha_opt) { if(!strcmp(alpha_opt,"yes") || !strcmp(alpha_opt,"true")) { mod->s_opt->opt_alpha = YES; } else { mod->s_opt->opt_alpha = NO; } } pinv = XML_Get_Attribute_Value(w,"pinv"); if(pinv) { if(!strcmp(pinv,"estimate") || !strcmp(pinv,"estimated") || !strcmp(pinv,"optimise") || !strcmp(pinv,"optimised")) { mod->s_opt->opt_pinvar = YES; } else { mod->s_opt->opt_pinvar = NO; mod->ras->pinvar->v = String_To_Dbl(pinv);; } } pinv_opt = XML_Get_Attribute_Value(w,"optimise.pinv"); if(pinv_opt) { if(!strcmp(pinv_opt,"yes") || !strcmp(pinv_opt,"true")) { mod->s_opt->opt_pinvar = YES; } else { mod->s_opt->opt_pinvar = NO; } } mod->ras->n_catg = XML_Get_Number_Of_Classes_Siterates(parent); break; } case 2: // FreeRate model { char *opt_freerates; mod->ras->free_mixt_rates = YES; mod->s_opt->opt_free_mixt_rates = YES; opt_freerates = XML_Get_Attribute_Value(w,"optimise.freerates"); if(opt_freerates) { if(!strcmp(opt_freerates,"yes") || !strcmp(opt_freerates,"true")) { mod->s_opt->opt_free_mixt_rates = YES; } else { mod->s_opt->opt_free_mixt_rates = NO; } } mod->ras->n_catg = XML_Get_Number_Of_Classes_Siterates(parent); break; } default: { if(family != NULL) PhyML_Printf("\n. family: %s",family); else { PhyML_Printf("\n. Please specify a model family (\"gamma\", \"gamma+inv\" or \"freerate\")"); PhyML_Printf("\n. for every 'weights' element in every 'siterate' element. Note that " ); PhyML_Printf("\n. a \"gamma\" or a \"freerate\" model with a single rate class amounts"); PhyML_Printf("\n. to no variation of rates across sites, if this is the model you'd"); PhyML_Printf("\n. like to implement..."); } PhyML_Printf("\n. Err. in file %s at line %d\n",__FILE__,__LINE__); Exit("\n"); } } } int nc = XML_Get_Number_Of_Classes_Siterates(parent); if(w && nc != mod->ras->n_catg) { PhyML_Printf("\n. component '%s'. The number of classes ",parent->id); PhyML_Printf("\n. specified in the component should be "); PhyML_Printf("\n. the same as that of nodes. Please fix"); PhyML_Printf("\n. your XML file accordingly."); Exit("\n"); } if(!w) mod->ras->n_catg = nc; Make_RAS_Complete(mod->ras); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Generic_Exit(const char *file, int line, const char *function) { PhyML_Fprintf(stderr,"\n. Err. in file '%s' (line %d)",file,line); if(function != NULL) PhyML_Printf(", function '%s'",function); # if defined(PHYTIME) PhyML_Fprintf(stderr,"\n. PhyTime finished prematurely."); # elif defined(PHYREX) PhyML_Fprintf(stderr,"\n. PhyREX finished prematurely."); # elif defined(PHYML) PhyML_Fprintf(stderr,"\n. PhyML finished prematurely."); #else PhyML_Fprintf(stderr,"\n. The execution finished prematurely."); #endif Exit("\n"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Write_Object(json_o *obj, FILE *where) { json_kv *kv; assert(obj); assert(where); kv = obj->kv; assert(kv); PhyML_Fprintf(where,"{"); do { PhyML_Fprintf(where,"\"%s\":",kv->key); if(kv->value != NULL) PhyML_Fprintf(where,"\"%s\"",kv->value); else if(kv->array != NULL) JSON_Write_Array(kv->array,where); else if(kv->object != NULL) JSON_Write_Object(kv->object,where); kv = kv->next; if(kv) PhyML_Fprintf(where,","); } while(kv); PhyML_Fprintf(where,"}"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Write_Array(json_a *array, FILE *where) { json_o *o; assert(where); assert(array); o = array->object; assert(o); PhyML_Fprintf(where,"["); do { JSON_Write_Object(o,where); o = o->next; if(o) PhyML_Fprintf(where,","); } while(o); PhyML_Fprintf(where,"]\n"); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Write_All(json_a *array, FILE *where) { JSON_Write_Array(array,where); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ json_o *JSON_Tree_To_Object(t_tree *mixt_tree) { t_tree *tree; json_kv *state,*kv; json_o *ret,*o; json_a *a; int string_len; char *s; time_t t_end; string_len = 20; ret = (json_o *)mCalloc(1,sizeof(json_o)); ret->next = NULL; state = (json_kv *)mCalloc(1,sizeof(json_kv)); ret->kv = state; state->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(state->key,"state"); state->value = NULL; state->array = NULL; state->object = NULL; state->next = NULL; state->array = (json_a *)mCalloc(1,sizeof(json_a)); a = state->array; a->object = (json_o *)mCalloc(1,sizeof(json_o)); o = a->object; // State num o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_num"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"state_num"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%d",mixt_tree->json_num); mixt_tree->json_num++; kv->next = NULL; // Time o->next = (json_o *)mCalloc(1,sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_time"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"time"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); kv->value = (char *)mCalloc(string_len,sizeof(char)); time(&t_end); sprintf(kv->value,"%d",(int)(t_end-mixt_tree->t_beg)); kv->next = NULL; // Tree o->next = (json_o *)mCalloc(1,sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_tree"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"tree"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); s = Write_Tree(mixt_tree); kv->value = (char *)mCalloc((int)strlen(s)+1,sizeof(char)); sprintf(kv->value,"%s",s); Free(s); kv->next = NULL; // Likelihood o->next = (json_o *)mCalloc(1,sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_param"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"likelihood"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",mixt_tree->c_lnL); kv->next = NULL; // TsTv { int n_tstv,i; scalar_dbl **tstv; n_tstv = 0; tstv = NULL; tree = mixt_tree; do { if(tree->is_mixt_tree == YES) tree = tree->next; for(i=0;imod->kappa == tstv[i]) break; if(i == n_tstv) { if(!tstv) tstv = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else tstv = (scalar_dbl **)mRealloc(tstv,n_tstv+1,sizeof(scalar_dbl *)); tstv[n_tstv] = tree->mod->kappa; n_tstv++; if(tree->mod->s_opt->opt_kappa == YES) { o->next = (json_o *)mCalloc(1,sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_param"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"tstv"); sprintf(kv->value+strlen(kv->value),"%d",n_tstv); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",tree->mod->kappa->v); kv->next = NULL; } } tree = tree->next; } while(tree); if(tstv) Free(tstv); } // Alpha { int n_alpha,i; scalar_dbl **alpha; n_alpha = 0; alpha = NULL; tree = mixt_tree; do { for(i=0;imod->ras->alpha == alpha[i]) break; if(i == n_alpha) { if(!alpha) alpha = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else alpha = (scalar_dbl **)mRealloc(alpha,n_alpha+1,sizeof(scalar_dbl *)); alpha[n_alpha] = tree->mod->ras->alpha; n_alpha++; if(tree->mod->s_opt->opt_alpha == YES) { o->next = (json_o *)mCalloc(1,sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_param"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"alpha"); sprintf(kv->value+strlen(kv->value),"%d",n_alpha); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",tree->mod->ras->alpha->v); kv->next = NULL; } } tree = tree->next_mixt; } while(tree); if(alpha) Free(alpha); } // Tree size { tree = mixt_tree; int tree_num = 1; do { o->next = (json_o *)mCalloc(1,sizeof(json_o)); o = o->next; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"type"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"t_param"); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"id"); kv->value = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->value,"tree_size"); sprintf(kv->value+strlen(kv->value),"%d",tree_num); kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"value"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",Get_Tree_Size(tree)); kv->next = NULL; tree = tree->next_mixt; } while(tree); } return(ret); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ json_o *JSON_Tree_To_Object_Light(t_tree *mixt_tree) { t_tree *tree; json_kv *state,*kv; json_o *ret,*o; int string_len; char *s; time_t t_end; string_len = 20; ret = (json_o *)mCalloc(1,sizeof(json_o)); ret->next = NULL; state = (json_kv *)mCalloc(1,sizeof(json_kv)); ret->kv = state; state->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(state->key,"state"); state->value = NULL; state->array = NULL; state->object = NULL; state->next = NULL; state->object = (json_o *)mCalloc(1,sizeof(json_o)); o = state->object; o->kv = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = o->kv; // State num kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"state_num"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%d",mixt_tree->json_num); // Time kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"time"); kv->value = (char *)mCalloc(string_len,sizeof(char)); time(&t_end); sprintf(kv->value,"%d",(int)(t_end-mixt_tree->t_beg)); // Tree kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; kv->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"tree"); s = Write_Tree(mixt_tree); kv->value = (char *)mCalloc((int)strlen(s)+1,sizeof(char)); sprintf(kv->value,"%s",s); Free(s); // Likelihood kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"likelihood"); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",mixt_tree->c_lnL); // TsTv { int n_tstv,i; scalar_dbl **tstv; n_tstv = 0; tstv = NULL; tree = mixt_tree; do { if(tree->is_mixt_tree == YES) tree = tree->next; for(i=0;imod->kappa == tstv[i]) break; if(i == n_tstv) { if(!tstv) tstv = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else tstv = (scalar_dbl **)mRealloc(tstv,n_tstv+1,sizeof(scalar_dbl *)); tstv[n_tstv] = tree->mod->kappa; n_tstv++; if(tree->mod->s_opt->opt_kappa == YES) { kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"tstv"); sprintf(kv->key+strlen(kv->key),"%d",n_tstv); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",tree->mod->kappa->v); } } tree = tree->next; } while(tree); if(tstv) Free(tstv); } // Alpha { int n_alpha,i; scalar_dbl **alpha; n_alpha = 0; alpha = NULL; tree = mixt_tree; do { for(i=0;imod->ras->alpha == alpha[i]) break; if(i == n_alpha) { if(!alpha) alpha = (scalar_dbl **)mCalloc(1,sizeof(scalar_dbl *)); else alpha = (scalar_dbl **)mRealloc(alpha,n_alpha+1,sizeof(scalar_dbl *)); alpha[n_alpha] = tree->mod->ras->alpha; n_alpha++; if(tree->mod->s_opt->opt_alpha == YES) { kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"alpha"); sprintf(kv->key+strlen(kv->key),"%d",n_alpha); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",tree->mod->ras->alpha->v); } } tree = tree->next_mixt; } while(tree); if(alpha) Free(alpha); } // Tree size { tree = mixt_tree; int tree_num = 1; do { kv->next = (json_kv *)mCalloc(1,sizeof(json_kv)); kv = kv->next; kv->value = NULL; kv->array = NULL; kv->object = NULL; o->next = NULL; kv->key = (char *)mCalloc(string_len,sizeof(char)); strcpy(kv->key,"tree_size"); sprintf(kv->key+strlen(kv->key),"%d",tree_num); kv->value = (char *)mCalloc(string_len,sizeof(char)); sprintf(kv->value,"%G",Get_Tree_Size(tree)); tree = tree->next_mixt; } while(tree); } kv->next = NULL; return(ret); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void JSON_Tree_Io(t_tree *tree, FILE *where) { // Append json_o *o; fpos_t pos; char c; fgetpos(where,&pos); rewind(where); c = fgetc(where); if(c != '[') { PhyML_Fprintf(where,"["); } else { fsetpos(where,&pos); fseek(where,-1,SEEK_CUR); PhyML_Fprintf(where,","); } PhyML_Fprintf(where,"\n"); /* o = JSON_Tree_To_Object(tree); */ o = JSON_Tree_To_Object_Light(tree); JSON_Write_Object(o,where); JSON_Free_Object(o); PhyML_Fprintf(where,"]"); fflush(where); // Print out latest tree + info /* json_o *o; */ /* rewind(where); */ /* /\* PhyML_Fprintf(where,"["); *\/ */ /* o = JSON_Tree_To_Object(tree); */ /* JSON_Write_Object(o,where); */ /* JSON_Free_Object(o); */ /* /\* PhyML_Fprintf(where,"]"); *\/ */ /* fflush(where); */ } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Print_Lk_Given_Edge_Recurr(t_node *a, t_node *d, t_edge *b, t_tree *tree) { PhyML_Printf("\n___ Edge %3d (left=%3d rght=%3d) lnL=%f", b->num, b->left->num, b->rght->num, Lk(b,tree)); if(d->tax) return; else { int i; for(i=0;i<3;i++) if(d->v[i] != a) Print_Lk_Given_Edge_Recurr(d,d->v[i],d->b[i],tree); } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Collect_Edge_Support_Values(t_tree *tree) { int i; for(i=0;i<2*tree->n_otu-3;++i) { if(tree->io->do_boot == YES) { tree->a_edges[i]->support_val = tree->a_edges[i]->bip_score; } else if(tree->io->do_tbe == YES) { int pminus1=MIN(tree->a_edges[i]->left->bip_size[tree->a_edges[i]->l_r], tree->a_edges[i]->rght->bip_size[tree->a_edges[i]->r_l])-1; tree->a_edges[i]->support_val = 1-((tree->a_edges[i]->tdist_score)/(tree->io->n_boot_replicates*1.0))/pminus1; } else if(tree->io->do_alrt == YES) { tree->a_edges[i]->support_val = tree->a_edges[i]->ratio_test; } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined (PHYREX) void PHYREX_Output_Tree_Structure(FILE *fp, t_tree *tree) { char *s; s = PHYREX_Print_Tree_Structure(tree); PhyML_Fprintf(fp,"%s",s); Free(s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined (PHYREX) char *PHYREX_Print_Tree_Structure(t_tree *tree) { t_dsk *disk; char *s,*buff; FILE *fp; fpos_t pos; fp = tmpfile(); assert(fp); buff = (char *)mCalloc(T_MAX_LINE,sizeof(char)); disk = tree->young_disk; while(disk->prev != NULL) disk = disk->prev; assert(disk->ldsk); assert(disk->ldsk->n_next > 0); fgetpos(fp,&pos); PhyML_Fprintf(fp,"begin\n"); fsetpos(fp,&pos); if(fgets(buff,T_MAX_LINE,fp) == NULL) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); s = (char *)mCalloc((int)strlen(buff)+1,sizeof(char)); sprintf(s+strlen(s),"%s",buff); fgetpos(fp,&pos); PhyML_Fprintf(fp,"%d %d\n",tree->n_otu,tree->mmod->n_dim); fsetpos(fp,&pos); if(fgets(buff,T_MAX_LINE,fp) == NULL) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); s = (char *)mRealloc(s,(int)(strlen(s)+strlen(buff)+1),sizeof(char)); sprintf(s+strlen(s),"%s",buff); do { fgetpos(fp,&pos); PhyML_Fprintf(fp,"%s ",disk->id); PhyML_Fprintf(fp,"%f ",disk->time); PhyML_Fprintf(fp,"%f %f ",disk->centr->lonlat[0],disk->centr->lonlat[1]); if(disk->ldsk != NULL) { s = (char *)mRealloc(s,(int)strlen(s)+9,sizeof(char)); PhyML_Fprintf(fp,"*%s ",disk->ldsk->coord->id); PhyML_Fprintf(fp,"%f %f ",disk->ldsk->coord->lonlat[0],disk->ldsk->coord->lonlat[1]); } for(int i=0;in_ldsk_a;++i) { PhyML_Fprintf(fp,"%s ",disk->ldsk_a[i]->coord->id); } PhyML_Fprintf(fp,"\n"); fsetpos(fp,&pos); if(fgets(buff,T_MAX_LINE,fp) == NULL) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); s = (char *)mRealloc(s,(int)(strlen(s)+strlen(buff)+1),sizeof(char)); sprintf(s+strlen(s),"%s",buff); disk = disk->next; } while(disk); fgetpos(fp,&pos); PhyML_Fprintf(fp,"end"); fsetpos(fp,&pos); if(fgets(buff,T_MAX_LINE,fp) == NULL) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); s = (char *)mRealloc(s,(int)(strlen(s)+strlen(buff)+1),sizeof(char)); sprintf(s+strlen(s),"%s",buff); fclose(fp); Free(buff); return(s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined (PHYREX) void PHYREX_Check_Point(FILE *fp, t_tree *tree) { xml_node *n; char *s; if(XML_Search_Node_Attribute_Value("add","true",NO,tree->xml_root) == NULL) { XML_Add_Attribute(tree->xml_root,"add","true"); } n = XML_Search_Node_Name("slfv",YES,tree->xml_root); if(n == NULL) { n = XML_Add_Node(tree->xml_root,"slfv"); XML_Set_Node_Id(n,"SLFV1"); } s = PHYREX_Print_Tree_Structure(tree); XML_Set_Node_Value(n,s); XML_Update_XML_Struct_Given_Model_Params(tree); /* XML_Update_XML_Struct_Given_MCMC_Params(tree); */ XML_Write_XML_Graph(fp,tree->xml_root); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if defined (PHYREX) void PHYREX_Input_Tree_Structure(FILE *fp) { char *tk,*s,delim[4]="\n\r "; int n_otu,n_dim,idx; t_dsk *disk; t_ldsk *new_ldsk,*root_ldsk,*ldsk; s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); do { if(fgets(s,T_MAX_LINE,fp) == NULL) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); } while(strstr(s,"begin") == NULL); if(fgets(s,T_MAX_LINE,fp) == NULL) Generic_Exit(__FILE__,__LINE__,__FUNCTION__); tk = strtok(s,delim); n_otu = strtod(tk,NULL); tk = strtok(NULL,delim); n_dim = strtod(tk,NULL); root_ldsk = NULL; new_ldsk = NULL; while(fgets(s,T_MAX_LINE,fp) != NULL) { tk = strtok(s,delim); if(strcmp(tk,"end") && tk != NULL) { disk = PHYREX_Make_Disk_Event(n_dim,n_otu); strcpy(disk->id,tk); tk = strtok(NULL,delim); disk->time = strtold(tk,NULL); tk = strtok(NULL,delim); disk->centr->lonlat[0] = strtold(tk,NULL); tk = strtok(NULL,delim); disk->centr->lonlat[1] = strtold(tk,NULL); tk = strtok(NULL,delim); if(tk[0] == '*') // disk has ldsk on it { if(root_ldsk == NULL) { disk->ldsk = PHYREX_Make_Lindisk_Node(n_dim); disk->ldsk->disk = disk; root_ldsk = disk->ldsk; } else { disk->ldsk = PHYREX_Find_Ldsk_From_Id(tk+1,root_ldsk); assert(disk->ldsk != NULL); } strcpy(disk->ldsk->coord->id,tk+1); tk = strtok(NULL,delim); disk->ldsk->coord->lonlat[0] = strtold(tk,NULL); tk = strtok(NULL,delim); disk->ldsk->coord->lonlat[1] = strtold(tk,NULL); do { tk = strtok(NULL,delim); if(tk == NULL) break; new_ldsk = PHYREX_Make_Lindisk_Node(n_dim); strcpy(new_ldsk->coord->id,tk); PHYREX_Make_Lindisk_Next(disk->ldsk); disk->ldsk->next[disk->ldsk->n_next-1] = new_ldsk; disk->ldsk_a[disk->ldsk->n_next-1] = new_ldsk; new_ldsk->prev = disk->ldsk; } while(tk); } else { idx = 0; do { tk = strtok(NULL,delim); if(tk == NULL) break; ldsk = PHYREX_Find_Ldsk_From_Id(tk,root_ldsk); assert(ldsk); disk->ldsk_a[idx] = ldsk; idx++; } while(tk); } } } Free(s); } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Output_Scalar_Dbl(scalar_dbl *t, char *sep, FILE *fp) { scalar_dbl *l; l = t; do { PhyML_Fprintf(fp,"%g%s",l->v,sep); l = l->next; } while(l); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ // s should look like that: "xxx={yyy},xxxx={yy},..." t_label *Read_Labels(char *s) { t_label *lab,*init_lab; char *s_cpy,*s_big,*s_small; char *label; char *key,*val; if(s[0] != '[' || s[(int)strlen(s)-1] != ']') { PhyML_Fprintf(stderr,"\n. Label is in wrong format. A proper label should"); PhyML_Fprintf(stderr,"\n. look as follows: \"[xxx={yyy},xxxx={yy},...]\""); assert(FALSE); } lab = Make_Label(); init_lab = lab; s_cpy = (char *)mCalloc((int)strlen(s)-1,sizeof(char)); strncpy(s_cpy,s+1,(strlen(s)-2)*sizeof(char)); s_cpy[strlen(s)-2]='\0'; label = strtok_r(s_cpy,",",&s_big); while(label != NULL) { key=strtok_r(label,"=",&s_small); val=strtok_r(NULL,"=",&s_small); Free(lab->key); lab->key = (char *)mCalloc(strlen(key)+1,sizeof(char)); strcpy(lab->key,key); Free(lab->val); lab->val = (char *)mCalloc(strlen(val)+1,sizeof(char)); strcpy(lab->val,val); label = strtok_r(NULL,",",&s_big); if(label != NULL) { lab->sep=','; lab->next = Make_Label(); lab = lab->next; } } lab = init_lab; return(lab); } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ void Print_Labels(FILE *fp_where, char *s_where, t_label *label) { if(label == NULL) return; else { t_label *lab; lab = label; if(fp_where != NULL) { PhyML_Fprintf(fp_where,"["); } else { sprintf(s_where+(int)strlen(s_where),"["); } while(lab) { if(fp_where != NULL) { PhyML_Fprintf(fp_where,"%s=%s",lab->key,lab->val); if(lab->next != NULL) PhyML_Fprintf(fp_where,","); } else { sprintf(s_where+(int)strlen(s_where),"%s=%s",lab->key,lab->val); if(lab->next != NULL) sprintf(s_where+(int)strlen(s_where),","); } lab = lab->next; } if(fp_where != NULL) { PhyML_Fprintf(fp_where,"]"); } else { sprintf(s_where+(int)strlen(s_where),"]"); } } } /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX) void PHYREX_Print_MultiTypeTree_Config_File(int n_sites, char *filename, t_tree *tree) { int i, j, n_demes; char *s,**deme_names; FILE *fp; fp = Openfile(filename,WRITE); assert(fp); deme_names = (char **)mCalloc(n_sites,sizeof(char *)); n_demes = 0; for(i=0;in_otu;i++) { s = strrchr(tree->a_nodes[i]->ldsk->coord->id,'_'); for(j=0;j"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); for(i=0;in_otu;i++) { PhyML_Fprintf(fp,"\n", tree->a_nodes[i]->ldsk->coord->id, /* tree->a_nodes[i]->coord->id, */ tree->a_nodes[i]->name, tree->a_nodes[i]->c_seq->state); } PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\nbeast.math.distributions.Uniform"); PhyML_Fprintf(fp,"\nbeast.math.distributions.Exponential"); PhyML_Fprintf(fp,"\nbeast.math.distributions.LogNormalDistributionModel"); PhyML_Fprintf(fp,"\nbeast.math.distributions.Normal"); PhyML_Fprintf(fp,"\nbeast.math.distributions.Beta"); PhyML_Fprintf(fp,"\nbeast.math.distributions.Gamma"); PhyML_Fprintf(fp,"\nbeast.math.distributions.LaplaceDistribution"); PhyML_Fprintf(fp,"\nbeast.math.distributions.Prior"); PhyML_Fprintf(fp,"\nbeast.math.distributions.InverseGamma"); PhyML_Fprintf(fp,"\nbeast.math.distributions.OneOnX"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); For(i,n_demes*(n_demes-1)) strcat(s,"1.0 "); PhyML_Fprintf(fp,"\n%s",n_demes*(n_demes-1),s); Free(s); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); for(i=0;i%s",n_demes,s); Free(s); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\nn_otu;i++) { s = strrchr(tree->a_nodes[i]->ldsk->coord->id,'_'); PhyML_Fprintf(fp,"%s=%s", tree->a_nodes[i]->ldsk->coord->id, s+1); if(i < tree->n_otu-1) PhyML_Fprintf(fp,","); else PhyML_Fprintf(fp,"\">"); } PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n2.0"); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); for(i=0;i%s",n_demes,s); Free(s); s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); For(i,n_demes*(n_demes-1)) strcat(s,"1.0 "); PhyML_Fprintf(fp,"\n%s",n_demes*(n_demes-1),s); Free(s); PhyML_Fprintf(fp,"\n0.25"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n1.0"); PhyML_Fprintf(fp,"\n1.25"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n1.0"); PhyML_Fprintf(fp,"\n1.25"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n1.0"); PhyML_Fprintf(fp,"\n1.25"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n1.0"); PhyML_Fprintf(fp,"\n1.0"); PhyML_Fprintf(fp,"\n0.0"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n%G",1.0); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); /* PhyML_Fprintf(fp,"\n"); */ /* PhyML_Fprintf(fp,"\n"); */ /* PhyML_Fprintf(fp,"\n"); */ PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); PhyML_Fprintf(fp,"\n"); for(i=0;iio->fp_out_stats; if(tree->mcmc->run == 0) { if(XML_Search_Node_Attribute_Value("add","true",NO,tree->xml_root) == NULL) { PhyML_Fprintf(fp_stats,"\n# before rand glnL: %f alnL: %f",tree->mmod->c_lnL,tree->c_lnL); PhyML_Fprintf(fp_stats,"\n# ninter: %d",PHYREX_Total_Number_Of_Intervals(tree)); PhyML_Fprintf(fp_stats,"\n# ncoal: %d",PHYREX_Total_Number_Of_Coal_Disks(tree)); PhyML_Fprintf(fp_stats,"\n# nhits: %d",PHYREX_Total_Number_Of_Hit_Disks(tree)); PhyML_Fprintf(fp_stats,"\n# true lbda: %f",tree->mmod->lbda); PhyML_Fprintf(fp_stats,"\n# true mu: %f",tree->mmod->mu); PhyML_Fprintf(fp_stats,"\n# true rad: %f",SLFV_Update_Radius(tree)); PhyML_Fprintf(fp_stats,"\n# true sigsq: %f",tree->mmod->sigsq[0]); PhyML_Fprintf(fp_stats,"\n# true neigh. size: %f",SLFV_Neighborhood_Size(tree)); PhyML_Fprintf(fp_stats,"\n# fst-based estimate of neighborhood size: %f",SLFV_Neighborhood_Size_Regression(tree)); PhyML_Fprintf(fp_stats,"\n# nucleotide diversity: %f",Nucleotide_Diversity(tree->data)); PhyML_Fprintf(fp_stats,"\n# length of a generation: %G time units",SLFV_Generation_Length(tree)); PhyML_Fprintf(fp_stats,"\n# clock rate: %G subst. per time unit",tree->rates->clock_r); PhyML_Fprintf(fp_stats,"\n# after rand glnL: %f alnL: %f",tree->mmod->c_lnL,tree->c_lnL); PhyML_Fprintf(fp_stats,"\n# ninter: %d",PHYREX_Total_Number_Of_Intervals(tree)); PhyML_Fprintf(fp_stats,"\n# ncoal: %d",PHYREX_Total_Number_Of_Coal_Disks(tree)); PhyML_Fprintf(fp_stats,"\n# nhits: %d",PHYREX_Total_Number_Of_Hit_Disks(tree)); PhyML_Fprintf(fp_stats,"\n# start lbda: %f",tree->mmod->lbda); PhyML_Fprintf(fp_stats,"\n# start mu: %f",tree->mmod->mu); PhyML_Fprintf(fp_stats,"\n# start rad: %f",tree->mmod->rad); PhyML_Fprintf(fp_stats,"\n# dist. in tree: "); for(int i=0;in_otu-1;++i) for(int j=i+1;jn_otu;++j) PhyML_Fprintf(fp_stats,"%G ",PHYREX_Dist_Between_Two_Ldsk(tree->a_nodes[i]->ldsk,tree->a_nodes[j]->ldsk,tree)); PhyML_Fprintf(fp_stats,"\n# dist. in space: "); for(int i=0;in_otu-1;++i) for(int j=i+1;jn_otu;++j) PhyML_Fprintf(fp_stats,"%G ",Euclidean_Dist(tree->a_nodes[i]->ldsk->coord,tree->a_nodes[j]->ldsk->coord)); PhyML_Fprintf(fp_stats,"\n"); PhyML_Fprintf(fp_stats,"%s\t","sample"); PhyML_Fprintf(fp_stats,"%s\t","lnPost"); PhyML_Fprintf(fp_stats,"%s\t","lnAlgn"); PhyML_Fprintf(fp_stats,"%s\t","lnSpac"); PhyML_Fprintf(fp_stats,"%s\t","lnRate"); /* PhyML_Fprintf(fp_stats,"%s\t","lnRateAutoCor"); */ /* PhyML_Fprintf(fp_stats,"%s\t","lnRateClock"); */ /* PhyML_Fprintf(fp_stats,"%s\t","lnRateRoot1"); */ /* PhyML_Fprintf(fp_stats,"%s\t","lnRateRoot2"); */ /* PhyML_Fprintf(fp_stats,"%s\t","lnRater1"); */ /* PhyML_Fprintf(fp_stats,"%s\t","lnRater2"); */ PhyML_Fprintf(fp_stats,"%s\t","lnTime"); PhyML_Fprintf(fp_stats,"%s\t","substRate"); for(int i=0;immod->n_dim;++i) PhyML_Fprintf(fp_stats,"%s%s\t","sigSq",(i==0)?("Lon"):((i==1)?("Lat"):("xx"))); PhyML_Fprintf(fp_stats,"%s\t","nEff"); PhyML_Fprintf(fp_stats,"%s\t","growth"); PhyML_Fprintf(fp_stats,"%s\t","dispDist"); PhyML_Fprintf(fp_stats,"%s\t","dispDistAlt"); PhyML_Fprintf(fp_stats,"%s\t","rootTime"); PhyML_Fprintf(fp_stats,"%s\t","rootLon"); PhyML_Fprintf(fp_stats,"%s\t","rootLat"); /* for(int i=0;imod->kappa);++i) PhyML_Fprintf(fp_stats,"tstv%d\t",i); */ /* if(tree->mod->ras->free_mixt_rates == NO) PhyML_Fprintf(fp_stats,"alpha\t"); */ /* else */ /* { */ /* for(int i=0;imod->ras->n_catg;++i) PhyML_Fprintf(fp_stats,"p(%d)\t",i+1); */ /* for(int i=0;imod->ras->n_catg;++i) PhyML_Fprintf(fp_stats,"rr(%d)\t",i+1); */ /* } */ PhyML_Fprintf(fp_stats,"%s\t","nu"); PhyML_Fprintf(fp_stats,"%s\t","rrNormFact"); PhyML_Fprintf(fp_stats,"%s\t","rrwNormFact"); /* PhyML_Fprintf(fp_stats,"%s\t","treeLen"); */ /* PhyML_Fprintf(fp_stats,"%s\t","speed"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accSPR"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accSPRsLide"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accNarrowExchange"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accWideExchange"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accLdskGivenDisk"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accMoveRootTime"); */ /* PhyML_Fprintf(fp_stats,"%s\t","accLdskTipToRoot"); */ /* PhyML_Fprintf(fp_stats,"%s\t","tuneScale"); */ /* PhyML_Fprintf(fp_stats,"%s\t","tuneLdskGivenDisk"); */ /* PhyML_Fprintf(fp_stats,"%s\t","tuneLdskTipToRoot"); */ /* PhyML_Fprintf(fp_stats,"%s\t","tuneRootTime"); */ /* for(int i=0;i<1;++i) */ /* { */ /* PhyML_Fprintf(fp_stats,"aux%dLocLnL\t",i); */ /* PhyML_Fprintf(fp_stats,"aux%dTimeLnL\t",i); */ /* } */ /* PhyML_Fprintf(fp_stats,"aux0RootTime\t"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccSPR"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccSPRsLide"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccNarrowExchange"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccWideExchange"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccLdskGivenDisk"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccMoveRootTime"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxaccLdskTipToRoot"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxtuneScale"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxtuneLdskGivenDisk"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxtuneLdskTipToRoot"); */ /* PhyML_Fprintf(fp_stats,"%s\t","auxtuneRootTime"); */ /* for(int i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"sigSq%d\t",i); */ /* for(int i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"auxsigSq%d\t",i); */ PhyML_Fprintf(fp_stats,"sigSqSon1\t"); PhyML_Fprintf(fp_stats,"sigSqSon2\t"); PhyML_Fprintf(fp_stats,"rrSon1\t"); PhyML_Fprintf(fp_stats,"rrSon2\t"); } } if(!(tree->mcmc->run%tree->mcmc->sample_interval) && tree->mcmc->sample_interval > 0) { /* Lk(NULL,tree); */ /* TIMES_Lk(tree); */ /* RATES_Lk(tree); */ /* LOCATION_Lk(tree); */ time(&(tree->mcmc->time_end)); PhyML_Fprintf(fp_stats,"\n"); PhyML_Fprintf(fp_stats,"%6d\t",tree->mcmc->run); PhyML_Fprintf(fp_stats,"%.2f\t",PHYREX_Get_Posterior(tree)); PhyML_Fprintf(fp_stats,"%.2f\t",tree->c_lnL); PhyML_Fprintf(fp_stats,"%.2f\t",tree->mmod->c_lnL); PhyML_Fprintf(fp_stats,"%.2f\t",tree->rates->c_lnL); /* PhyML_Fprintf(fp_stats,"%f\t",RATES_Autocor_Prior(tree)); */ /* PhyML_Fprintf(fp_stats,"%f\t",RATES_Clock_R_Prior(tree)); */ /* PhyML_Fprintf(fp_stats,"%f\t",RATES_Lk_Core(-1.,tree->rates->br_r[tree->n_root->v[1]->num],-1,-1,-1,-1,-1,tree->times->nd_t[tree->n_root->v[1]->num] - tree->times->nd_t[tree->n_root->num],tree)); */ /* PhyML_Fprintf(fp_stats,"%f\t",RATES_Lk_Core(-1.,tree->rates->br_r[tree->n_root->v[2]->num],-1,-1,-1,-1,-1,tree->times->nd_t[tree->n_root->v[2]->num] - tree->times->nd_t[tree->n_root->num],tree)); */ /* PhyML_Fprintf(fp_stats,"%f\t",tree->times->nd_t[tree->n_root->v[1]->num]); */ /* PhyML_Fprintf(fp_stats,"%f\t",tree->times->nd_t[tree->n_root->v[2]->num]); */ PhyML_Fprintf(fp_stats,"%.2f\t",tree->times->c_lnL); PhyML_Fprintf(fp_stats,"%g\t",tree->rates->clock_r); for(int i=0;immod->n_dim;++i) PhyML_Fprintf(fp_stats,"%g\t",tree->mmod->sigsq[i]); PhyML_Fprintf(fp_stats,"%g\t",tree->times->scaled_pop_size); PhyML_Fprintf(fp_stats,"%g\t",tree->times->neff_growth); PhyML_Fprintf(fp_stats,"%g\t",PHYREX_Realized_Dispersal_Dist(tree)); PhyML_Fprintf(fp_stats,"%g\t",PHYREX_Realized_Dispersal_Dist_Alt(tree)); PhyML_Fprintf(fp_stats,"%.2f\t",tree->n_root->ldsk->disk->time); if(RRW_Is_Rw(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) RRW_Sample_Node_Location(tree->n_root->ldsk,tree); PhyML_Fprintf(fp_stats,"%g\t",tree->n_root->ldsk->coord->lonlat[0]); PhyML_Fprintf(fp_stats,"%g\t",tree->n_root->ldsk->coord->lonlat[1]); /* Output_Scalar_Dbl(tree->mod->kappa,"\t",fp_stats); */ /* if(tree->mod->ras->free_mixt_rates == NO) PhyML_Fprintf(fp_stats,"%g\t",tree->mod->ras->alpha->v); */ /* else */ /* { */ /* for(int i=0;imod->ras->n_catg;++i) PhyML_Fprintf(fp_stats,"%g\t",tree->mod->ras->gamma_r_proba->v[i]); */ /* for(int i=0;imod->ras->n_catg;++i) PhyML_Fprintf(fp_stats,"%g\t",tree->mod->ras->gamma_rr->v[i]); */ /* } */ PhyML_Fprintf(fp_stats,"%g\t",tree->rates->nu); PhyML_Fprintf(fp_stats,"%g\t",tree->rates->norm_fact); PhyML_Fprintf(fp_stats,"%g\t",tree->mmod->rrw_norm_fact); /* PhyML_Fprintf(fp_stats,"%g\t",Tree_Length(tree)); */ /* PhyML_Fprintf(fp_stats,"%g\t",difftime(tree->mcmc->time_end,tree->mcmc->time_beg)/(phydbl)tree->mcmc->sample_interval); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_spr]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_spr_slide]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_narrow_exchange]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_wide_exchange]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_ldsk_given_disk]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_root_time]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->acc_rate[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_scale_times]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_ldsk_given_disk]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->tune_move[tree->mcmc->num_move_phyrex_ldsk_tip_to_root]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->mcmc->tune_move[tree->mcmc->num_move_root_time]); */ /* for(int i=0;i<1;++i) */ /* { */ /* PhyML_Fprintf(fp_stats,"%.2f\t",tree->aux_tree[i]->mmod->c_lnL); */ /* PhyML_Fprintf(fp_stats,"%.2f\t",tree->aux_tree[i]->times->c_lnL); */ /* } */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->times->nd_t[tree->aux_tree[0]->n_root->num]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_phyrex_spr]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_phyrex_spr_slide]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_phyrex_narrow_exchange]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_phyrex_wide_exchange]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_phyrex_ldsk_given_disk]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_root_time]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->acc_rate[tree->aux_tree[0]->mcmc->num_move_phyrex_ldsk_tip_to_root]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->tune_move[tree->aux_tree[0]->mcmc->num_move_phyrex_scale_times]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->tune_move[tree->aux_tree[0]->mcmc->num_move_phyrex_ldsk_given_disk]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->tune_move[tree->aux_tree[0]->mcmc->num_move_phyrex_ldsk_tip_to_root]); */ /* PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mcmc->tune_move[tree->aux_tree[0]->mcmc->num_move_root_time]); */ /* for(int i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"%g\t",tree->mmod->sigsq_scale[i]); */ /* for(int i=0;i<2*tree->n_otu-1;++i) PhyML_Fprintf(fp_stats,"%g\t",tree->aux_tree[0]->mmod->sigsq_scale[i]); */ PhyML_Fprintf(fp_stats,"%f\t",tree->mmod->sigsq_scale[tree->n_root->v[1]->num]); PhyML_Fprintf(fp_stats,"%f\t",tree->mmod->sigsq_scale[tree->n_root->v[2]->num]); PhyML_Fprintf(fp_stats,"%f\t",tree->rates->br_r[tree->n_root->v[1]->num]); PhyML_Fprintf(fp_stats,"%f\t",tree->rates->br_r[tree->n_root->v[2]->num]); fflush(NULL); time(&(tree->mcmc->time_beg)); tree->mcmc->sample_num++; } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX) void PHYREX_Print_MCMC_Tree(t_tree *tree) { FILE *fp_tree; fp_tree = tree->io->fp_out_tree; if(tree->mcmc->run == 0) { PhyML_Fprintf(fp_tree,"#NEXUS"); PhyML_Fprintf(fp_tree,"\n\nBegin taxa;"); PhyML_Fprintf(fp_tree,"\n\tDimensions ntax=%d;",tree->n_otu); PhyML_Fprintf(fp_tree,"\n\tTaxlabels"); for(int i=0;in_otu;++i) { PhyML_Fprintf(fp_tree,"\n\t\t'%s'",tree->a_nodes[i]->name); } PhyML_Fprintf(fp_tree,"\n\t;"); PhyML_Fprintf(fp_tree,"\n\tend;"); PhyML_Fprintf(fp_tree,"\n\n"); PhyML_Fprintf(fp_tree,"\nBegin trees;"); PhyML_Fprintf(fp_tree,"\n\tTranslate"); for(int i=0;in_otu;++i) { PhyML_Fprintf(fp_tree,"\n\t%d '%s'",i+1,tree->a_nodes[i]->name); if(in_otu-1) PhyML_Fprintf(fp_tree,","); } PhyML_Fprintf(fp_tree,"\n;"); } if(!(tree->mcmc->run%tree->mcmc->sample_interval) && tree->mcmc->sample_interval > 0) { Record_Br_Len(tree); TIMES_Time_To_Bl(tree); tree->bl_ndigits = 3; /* tree->bl_ndigits = 7; */ tree->write_tax_names = NO; PHYREX_Label_Nodes_With_Locations(tree); PHYREX_Label_Edges(tree); char *s = Write_Tree(tree); PhyML_Fprintf(fp_tree,"\ntree %d [&lnP=%f,precision={1.e-1,1e-02,1e-01}] = [&R] %s",tree->mcmc->run,tree->c_lnL,s); PhyML_Fprintf(fp_tree,"\nend;"); fseek(fp_tree,-5,SEEK_END); tree->write_tax_names = YES; Free(s); Restore_Br_Len(tree); fflush(NULL); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ #if (defined PHYREX) void PHYREX_Print_MCMC_Summary(t_tree *tree) { if(tree->mcmc->run == 0) PhyML_Fprintf(stdout,"\n. %23s\t%25s\t%15s\t%15s\t%15s\t%15s\t%13s\t%10s\t%19s", "run (aux.run)", "operator", "lnSpac", "lnTime", "lnAlgn", "lnPost", "rootTime", "substRate", "(rootLon;rootLat)"); if(!(tree->mcmc->run%tree->mcmc->print_every) && tree->mcmc->print_every > 0) { if(RRW_Is_Rw(tree->mmod) == YES && tree->mmod->integrateAncestralLocations == YES) RRW_Sample_Node_Location(tree->n_root->ldsk,tree); PhyML_Fprintf(stdout,"\n. %10d (%10d)\t%25s\t%15.2f\t%15.2f\t%15.2f\t%15.2f\t%13.1f\t%10f\t(%8.2f;%8.2f)", tree->mcmc->run, tree->aux_tree[0]->mcmc->run, tree->mcmc->move_idx > -1 ? tree->mcmc->move_name[tree->mcmc->move_idx] : "", tree->mmod->c_lnL, tree->times->c_lnL, tree->c_lnL, PHYREX_Get_Posterior(tree), tree->times->nd_t[tree->n_root->num], tree->rates->clock_r, tree->n_root->ldsk->coord->lonlat[0], tree->n_root->ldsk->coord->lonlat[1]); if(tree->numerical_warning == YES) PhyML_Fprintf(stdout," -- WARNING: numerical precision issue detected..."); } } #endif /*//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////*/ phyml-3.3.20220408/src/io.h000066400000000000000000000131451422404706600147700ustar00rootroot00000000000000/* PHYML : a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences Copyright (C) Stephane Guindon. Oct 2003 onward All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef IO_H #define IO_H #include "utilities.h" t_tree *Read_Tree(char **s_tree); void R_rtree(char *s_tree_a,char *s_tree_d,t_node *a,t_tree *tree,int *n_int,int *n_ext); void Read_Node_Label(char *s_d, char *s_a, t_node *n); void Read_Branch_Length(char *s_d, char *s_a, t_edge *b, t_tree *tree); void Read_Node_Name(t_node *d, char *s_tree_d, t_edge *b, t_tree *tree); void Clean_Multifurcation(char **subtrees,int current_deg,int end_deg); char **Sub_Trees(char *tree,int *degree); int Next_Par(char *s,int pos); void Print_List(t_ll *list); void Print_Tree(FILE *fp,t_tree *tree); char *Write_Tree(t_tree *tree); void R_wtree_Custom(t_node *pere,t_node *fils,int *available,char **s_tree,int *pos,t_tree *tree); void Detect_Align_File_Format(option *io); void Detect_Tree_File_Format(option *io); align **Get_Seq(option *io); void Get_Nexus_Data(FILE *fp,option *io); int Get_Token(FILE *fp,char *token); align **Get_Seq_Phylip(option *io); void Read_Ntax_Len_Phylip(FILE *fp,int *n_otu,int *n_tax); align **Read_Seq_Sequential(option *io); align **Read_Seq_Interleaved(option *io); int Read_One_Line_Seq(align ***data,int num_otu,FILE *in); char *Return_Tree_String_Phylip(FILE *fp_input_tree); t_tree *Read_Tree_File_Phylip(FILE *fp_input_tree); void Print_Site_Lk(t_tree *tree,FILE *fp); void Print_Seq(FILE *fp, align **data, int n_otu); void Print_CSeq(FILE *fp,int compressed,calign *cdata,t_tree *tree); void Print_CSeq_Select(FILE *fp,int compressed,calign *cdata,t_tree *tree); void Print_Dist(matrix *mat); void Print_Node(t_node *a,t_node *d,t_tree *tree); void Print_Model(t_mod *mod); void Print_Mat(matrix *mat); FILE *Openfile(char *filename,int mode); //void Print_Fp_Out(FILE *fp_out,time_t t_beg,time_t t_end,t_tree *tree,option *io,int n_data_set,int num_tree, int add_citation); void Print_Fp_Out(FILE *fp_out,time_t t_beg,time_t t_end,t_tree *tree,option *io,int n_data_set,int num_tree, int add_citation, int precision); void Print_Fp_Out_Lines(FILE *fp_out,time_t t_beg,time_t t_end,t_tree *tree,option *io,int n_data_set); void Print_Freq(t_tree *tree); void Print_Settings(option *io); void Print_Banner(FILE *fp); void Print_Banner_Small(FILE *fp); void Print_Data_Set_Number(option *io,FILE *fp); void Print_Lk(t_tree *tree,char *string); void Print_Pars(t_tree *tree); void Print_Lk_And_Pars(t_tree *tree); void Read_Qmat(phydbl *daa,phydbl *pi,FILE *fp); void Print_Qmat_AA(phydbl *daa,phydbl *pi); void Print_Square_Matrix_Generic(int n,phydbl *mat); void Print_Diversity(FILE *fp,t_tree *tree); void Print_Diversity_Pre(t_node *a,t_node *d,t_edge *b,FILE *fp,t_tree *tree); t_tree *Read_User_Tree(calign *cdata,t_mod *mod,option *io); void Print_Time_Info(time_t t_beg,time_t t_end); void Print_Time_Info_Brief(time_t t_beg,time_t t_end); void PhyML_Printf(char *format,...); void PhyML_Fprintf(FILE *fp,char *format,...); void Read_Clade_Priors(char *file_name,t_tree *tree); option *Get_Input(int argc,char **argv); void Print_Data_Structure(int final, FILE *fp, t_tree *root); int Set_Whichmodel(int select); void Print_Site(calign *cdata, int num, int n_otu, char *sep, int stepsize, FILE *fp); option *PhyML_XML(char *xml_filename); void Check_Taxa_Sets(t_tree *mixt_tree); void Make_Ratematrix_From_XML_Node(xml_node *instance, option *io, t_mod *mod); void Make_Efrq_From_XML_Node(xml_node *instance, option *io, t_mod *mod); void Make_Topology_From_XML_Node(xml_node *instance, option *io, t_mod *mod); void Make_RAS_From_XML_Node(xml_node *parent, t_mod *mod); void Post_Process_Data(option *io); int *Return_Int(int in); void Print_All_Edge_PMats(t_tree* tree); void Print_All_Edge_Likelihoods(t_tree* tree); void Print_Edge_Likelihoods(t_tree* tree, t_edge* b, bool scientific); void Print_Edge_PMats(t_tree* tree, t_edge* b); void Print_Tip_Partials(t_tree* tree, t_node* d); void Dump_Arr_D(phydbl* arr, int num); void Dump_Arr_S(short int* arr, int num); void Dump_Arr_I(int* arr, int num); void Print_Tree_Structure(t_tree* tree); void Print_Node_Brief(t_node *a, t_node *d, t_tree *tree, FILE *fp); void Generic_Exit(const char *file, int line, const char *function); void JSON_Write_Object(json_o *obj, FILE *where); void JSON_Write_Array(json_a *array, FILE *where); void JSON_Write_All(json_a *array, FILE *where); void JSON_Tree_Io(t_tree *tree, FILE *where); json_o *JSON_Tree_To_Object(t_tree *tree); json_o *JSON_Tree_To_Object_Light(t_tree *mixt_tree); scalar_dbl *Read_Io_Weights(option *io); void Print_Lk_Given_Edge_Recurr(t_node *a, t_node *d, t_edge *b, t_tree *tree); void R_wtree(t_node *pere, t_node *fils, t_edge *b, int *available, char **s_tree, t_tree *tree); void Read_Branch_Support(char *s_d, char *s_a, t_edge *b, t_tree *tree); void Collect_Edge_Support_Values(t_tree *tree); int PhyML_Fscanf(FILE *fp, char *format, ...); void Output_Scalar_Dbl(scalar_dbl *t, char *sep, FILE *fp); t_label *Read_Labels(char *s); void Print_Labels(FILE *fp_where, char *s_where, t_label *label); #ifdef PHYREX void PHYREX_Print_MultiTypeTree_Config_File(int n_sites, char *filename, t_tree *tree); void PHYREX_Print_MCMC_Tree(t_tree *tree); void PHYREX_Print_MCMC_Stats(t_tree *tree); void PHYREX_Print_MCMC_Summary(t_tree *tree); void PHYREX_Output_Tree_Structure(FILE *fp, t_tree *tree); void PHYREX_Input_Tree_Structure(FILE *fp); char *PHYREX_Print_Tree_Structure(t_tree *tree); void PHYREX_Check_Point(FILE *fp, t_tree *tree); #endif #endif phyml-3.3.20220408/src/lk.c000066400000000000000000003163031422404706600147640ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include "assert.h" #include "lk.h" #ifdef BEAGLE #include "beagle_utils.h" #endif #include ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Nucleotides_Float(char state, int pos, phydbl *p_lk) { switch(state) { case 'A' : p_lk[pos+0]=1.; p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+3]=.0; break; case 'C' : p_lk[pos+1]=1.; p_lk[pos+0]=p_lk[pos+2]=p_lk[pos+3]=.0; break; case 'G' : p_lk[pos+2]=1.; p_lk[pos+1]=p_lk[pos+0]=p_lk[pos+3]=.0; break; case 'T' : p_lk[pos+3]=1.; p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+0]=.0; break; case 'U' : p_lk[pos+3]=1.; p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+0]=.0; break; case 'M' : p_lk[pos+0]=p_lk[pos+1]=1.; p_lk[pos+2]=p_lk[pos+3]=.0; break; case 'R' : p_lk[pos+0]=p_lk[pos+2]=1.; p_lk[pos+1]=p_lk[pos+3]=.0; break; case 'W' : p_lk[pos+0]=p_lk[pos+3]=1.; p_lk[pos+1]=p_lk[pos+2]=.0; break; case 'S' : p_lk[pos+1]=p_lk[pos+2]=1.; p_lk[pos+0]=p_lk[pos+3]=.0; break; case 'Y' : p_lk[pos+1]=p_lk[pos+3]=1.; p_lk[pos+0]=p_lk[pos+2]=.0; break; case 'K' : p_lk[pos+2]=p_lk[pos+3]=1.; p_lk[pos+0]=p_lk[pos+1]=.0; break; case 'B' : p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+3]=1.; p_lk[pos+0]=.0; break; case 'D' : p_lk[pos+0]=p_lk[pos+2]=p_lk[pos+3]=1.; p_lk[pos+1]=.0; break; case 'H' : p_lk[pos+0]=p_lk[pos+1]=p_lk[pos+3]=1.; p_lk[pos+2]=.0; break; case 'V' : p_lk[pos+0]=p_lk[pos+1]=p_lk[pos+2]=1.; p_lk[pos+3]=.0; break; case 'N' : case 'X' : case '?' : case 'O' : case '-' : p_lk[pos+0]=p_lk[pos+1]=p_lk[pos+2]=p_lk[pos+3]=1.;break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",state); Exit("\n. Init failed (data type supposed to be DNA)\n"); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Nucleotides_Int(char state, int pos, short int *p_pars) { switch(state) { case 'A' : p_pars[pos+0]=1; p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+3]=0; break; case 'C' : p_pars[pos+1]=1; p_pars[pos+0]=p_pars[pos+2]=p_pars[pos+3]=0; break; case 'G' : p_pars[pos+2]=1; p_pars[pos+1]=p_pars[pos+0]=p_pars[pos+3]=0; break; case 'T' : p_pars[pos+3]=1; p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+0]=0; break; case 'U' : p_pars[pos+3]=1; p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+0]=0; break; case 'M' : p_pars[pos+0]=p_pars[pos+1]=1; p_pars[pos+2]=p_pars[pos+3]=0; break; case 'R' : p_pars[pos+0]=p_pars[pos+2]=1; p_pars[pos+1]=p_pars[pos+3]=0; break; case 'W' : p_pars[pos+0]=p_pars[pos+3]=1; p_pars[pos+1]=p_pars[pos+2]=0; break; case 'S' : p_pars[pos+1]=p_pars[pos+2]=1; p_pars[pos+0]=p_pars[pos+3]=0; break; case 'Y' : p_pars[pos+1]=p_pars[pos+3]=1; p_pars[pos+0]=p_pars[pos+2]=0; break; case 'K' : p_pars[pos+2]=p_pars[pos+3]=1; p_pars[pos+0]=p_pars[pos+1]=0; break; case 'B' : p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+3]=1; p_pars[pos+0]=0; break; case 'D' : p_pars[pos+0]=p_pars[pos+2]=p_pars[pos+3]=1; p_pars[pos+1]=0; break; case 'H' : p_pars[pos+0]=p_pars[pos+1]=p_pars[pos+3]=1; p_pars[pos+2]=0; break; case 'V' : p_pars[pos+0]=p_pars[pos+1]=p_pars[pos+2]=1; p_pars[pos+3]=0; break; case 'N' : case 'X' : case '?' : case 'O' : case '-' : p_pars[pos+0]=p_pars[pos+1]=p_pars[pos+2]=p_pars[pos+3]=1;break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",state); Exit("\n. Init failed (data type supposed to be DNA)\n"); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_AA_Float(char aa, int pos, phydbl *p_lk) { int i; for(i=0;i<20;i++) p_lk[pos+i] = .0; switch(aa){ case 'A' : p_lk[pos+0]= 1.; break;/* Alanine */ case 'R' : p_lk[pos+1]= 1.; break;/* Arginine */ case 'N' : p_lk[pos+2]= 1.; break;/* Asparagine */ case 'D' : p_lk[pos+3]= 1.; break;/* Aspartic acid */ case 'C' : p_lk[pos+4]= 1.; break;/* Cysteine */ case 'Q' : p_lk[pos+5]= 1.; break;/* Glutamine */ case 'E' : p_lk[pos+6]= 1.; break;/* Glutamic acid */ case 'G' : p_lk[pos+7]= 1.; break;/* Glycine */ case 'H' : p_lk[pos+8]= 1.; break;/* Histidine */ case 'I' : p_lk[pos+9]= 1.; break;/* Isoleucine */ case 'L' : p_lk[pos+10]=1.; break;/* Leucine */ case 'K' : p_lk[pos+11]=1.; break;/* Lysine */ case 'M' : p_lk[pos+12]=1.; break;/* Methionine */ case 'F' : p_lk[pos+13]=1.; break;/* Phenylalanin */ case 'P' : p_lk[pos+14]=1.; break;/* Proline */ case 'S' : p_lk[pos+15]=1.; break;/* Serine */ case 'T' : p_lk[pos+16]=1.; break;/* Threonine */ case 'W' : p_lk[pos+17]=1.; break;/* Tryptophan */ case 'Y' : p_lk[pos+18]=1.; break;/* Tyrosine */ case 'V' : p_lk[pos+19]=1.; break;/* Valine */ case 'B' : p_lk[pos+2]= 1.; break;/* Asparagine */ case 'Z' : p_lk[pos+5]= 1.; break;/* Glutamine */ case 'X' : case '?' : case '-' : for(i=0;i<20;i++) p_lk[pos+i] = 1.; break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",aa); Exit("\n. Init failed (data type supposed to be amino-acids)\n"); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_AA_Int(char aa, int pos, short int *p_pars) { int i; for(i=0;i<20;i++) p_pars[pos+i] = .0; switch(aa){ case 'A' : p_pars[pos+0] = 1; break;/* Alanine */ case 'R' : p_pars[pos+1] = 1; break;/* Arginine */ case 'N' : p_pars[pos+2] = 1; break;/* Asparagine */ case 'D' : p_pars[pos+3] = 1; break;/* Aspartic acid */ case 'C' : p_pars[pos+4] = 1; break;/* Cysteine */ case 'Q' : p_pars[pos+5] = 1; break;/* Glutamine */ case 'E' : p_pars[pos+6] = 1; break;/* Glutamic acid */ case 'G' : p_pars[pos+7] = 1; break;/* Glycine */ case 'H' : p_pars[pos+8] = 1; break;/* Histidine */ case 'I' : p_pars[pos+9] = 1; break;/* Isoleucine */ case 'L' : p_pars[pos+10] = 1; break;/* Leucine */ case 'K' : p_pars[pos+11] = 1; break;/* Lysine */ case 'M' : p_pars[pos+12] = 1; break;/* Methionine */ case 'F' : p_pars[pos+13] = 1; break;/* Phenylalanin */ case 'P' : p_pars[pos+14] = 1; break;/* Proline */ case 'S' : p_pars[pos+15] = 1; break;/* Serine */ case 'T' : p_pars[pos+16] = 1; break;/* Threonine */ case 'W' : p_pars[pos+17] = 1; break;/* Tryptophan */ case 'Y' : p_pars[pos+18] = 1; break;/* Tyrosine */ case 'V' : p_pars[pos+19] = 1; break;/* Valine */ case 'B' : p_pars[pos+2] = 1; break;/* Asparagine */ case 'Z' : p_pars[pos+5] = 1; break;/* Glutamine */ case 'X' : case '?' : case '-' : for(i=0;i<20;i++) p_pars[pos+i] = 1; break; default : { PhyML_Fprintf(stderr,"\n. Unknown character state : '%c'.\n",aa); Exit("\n. Init failed (data type supposed to be amino-acids)\n"); break; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Generic_Float(char *state, int ns, int state_len, int pos, phydbl *p_lk) { int i; int state_int; for(i=0;i ns) { PhyML_Fprintf(stderr,"\n. %s %d cstate: %.2s istate: %d state_len: %d.\n",__FILE__,__LINE__,state,state_int,state_len); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit(""); } p_lk[pos+state_int] = 1.; /* PhyML_Printf("\n. %s %d cstate: %.2s istate: %d state_len: %d ns: %d pos: %d",__FILE__,__LINE__,state,state_int,state_len,ns,pos); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Tips_At_One_Site_Generic_Int(char *state, int ns, int state_len, int pos, short int *p_pars) { int i; int state_int; for(i=0;i ns) { PhyML_Fprintf(stderr,"\n. %s %d cstate: %.2s istate: %d state_len: %d.\n",__FILE__,__LINE__,state,state_int,state_len); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Warn_And_Exit(""); } p_pars[pos+state_int] = 1; /* PhyML_Printf("\n* %s %d cstate: %.2s istate: %d state_len: %d ns: %d pos: %d",__FILE__,__LINE__,state,state_int,state_len,ns,pos); */ } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Get_All_Partial_Lk_Scale(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d) { Update_Partial_Lk(tree,b_fcus,d); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Post_Order_Lk(t_node *a, t_node *d, t_tree *tree) { int i,dir; dir = -1; if(d->tax) return; else { if(tree->is_mixt_tree) { MIXT_Post_Order_Lk(a,d,tree); return; } if(tree->n_root != NULL) { for(i=0;i<3;++i) { if(d->v[i] != a && d->b[i] != tree->e_root) Post_Order_Lk(d,d->v[i],tree); else dir = i; } } else { for(i=0;i<3;i++) { if(d->v[i] != a) Post_Order_Lk(d,d->v[i],tree); else dir = i; } } if(dir < 0) { PhyML_Printf("\n. a->num: %d d->num: %d d->v[0]->num: %d d->v[1]->num: %d d->v[2]->num: %d d->b[0]->num: %d d->b[1]->num: %d d->b[2]->num: %d root ? %d e_root ? %d\n", a?a->num:-1, d?d->num:1, d->v[0]?d->v[0]->num:-1, d->v[1]?d->v[1]->num:-1, d->v[2]?d->v[2]->num:-1, d->b[0]?d->b[0]->num:-1, d->b[1]?d->b[1]->num:-1, d->b[2]?d->b[2]->num:-1, tree->n_root?tree->n_root->num:-1, tree->e_root?tree->e_root->num:-1); assert(FALSE); } /* PhyML_Printf("\n. a:%d [%d] d:%d dir:%d [%p %p] [%p %p %p] [%p %p]", */ /* a->num, */ /* a == tree->n_root, */ /* d->num, */ /* dir, */ /* d->b[dir], */ /* tree->e_root, */ /* d->b[0],d->b[1],d->b[2], */ /* tree->n_root->b[1],tree->n_root->b[2]); */ if(tree->ignore_root == NO && d->b[dir] == tree->e_root) { if(d == tree->n_root->v[1]) Update_Partial_Lk(tree,tree->n_root->b[1],d); else Update_Partial_Lk(tree,tree->n_root->b[2],d); } else { Update_Partial_Lk(tree,d->b[dir],d); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Pre_Order_Lk(t_node *a, t_node *d, t_tree *tree) { int i; if(d->tax) return; else { if(tree->is_mixt_tree) { MIXT_Pre_Order_Lk(a,d,tree); return; } if(tree->n_root) { for(i=0;i<3;++i) { if(d->v[i] != a && d->b[i] != tree->e_root) { Update_Partial_Lk(tree,d->b[i],d); Pre_Order_Lk(d,d->v[i],tree); } } } else { for(i=0;i<3;++i) { if(d->v[i] != a) { Update_Partial_Lk(tree,d->b[i],d); Pre_Order_Lk(d,d->v[i],tree); } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Updates all partial likelihood vectors. Depending on whether // both_sides = YES or NO, only 'up' or 'up'&'down' partials will // be updates void Update_All_Partial_Lk(t_tree *tree) { if(tree->n_root) { if(tree->ignore_root == NO) { Post_Order_Lk(tree->n_root,tree->n_root->v[1],tree); Post_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Update_Partial_Lk(tree,tree->n_root->b[1],tree->n_root); Update_Partial_Lk(tree,tree->n_root->b[2],tree->n_root); if(tree->both_sides == YES) { Pre_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Pre_Order_Lk(tree->n_root,tree->n_root->v[1],tree); } } else { Post_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Post_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); if(tree->both_sides == YES) { Pre_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Pre_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); } } } else { Post_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); if(tree->both_sides == YES) Pre_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk(t_edge *b, t_tree *tree) { unsigned int br,catg,state,ambiguity_check,site; phydbl len,*expl,*dot_prod,*p_lk_left,*p_lk_rght; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int npatterns = tree->n_pattern; const unsigned int nsncatg = ns * ncatg; tree->numerical_warning = NO; /* if(tree->eval_alnL == NO) return UNLIKELY; */ if(b == NULL && tree->mod->s_opt->curr_opt_free_rates == YES) { tree->mod->s_opt->curr_opt_free_rates = NO; Optimize_Free_Rate_Weights(tree,YES,YES); tree->mod->s_opt->curr_opt_free_rates = YES; } if(tree->is_mixt_tree == YES) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif MIXT_Lk(b,tree); return tree->c_lnL; } tree->old_lnL = tree->c_lnL; if(tree->rates && tree->io && tree->io->lk_approx == NORMAL) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif tree->c_lnL = Lk_Normal_Approx(tree); return tree->c_lnL; } expl = tree->expl; dot_prod = tree->dot_prod; if(b == NULL) { Update_Boundaries(tree->mod); Update_RAS(tree->mod); Update_Efrq(tree->mod); Update_Eigen(tree->mod); } if(tree->mod->s_opt->skip_tree_traversal == NO) { if(!b) //Update PMat for all edges { for(br=0;br<2*tree->n_otu-3;++br) { Update_PMat_At_Given_Edge(tree->a_edges[br],tree); } if(tree->n_root && tree->ignore_root == NO) { Update_PMat_At_Given_Edge(tree->n_root->b[1],tree); Update_PMat_At_Given_Edge(tree->n_root->b[2],tree); } } else //Update PMat for a specific edge { if(tree->use_eigen_lr == NO) { if(tree->n_root && (b == tree->n_root->b[1] || b == tree->n_root->b[2]) && tree->ignore_root == YES) { Update_PMat_At_Given_Edge(tree->e_root,tree); } else { Update_PMat_At_Given_Edge(b,tree); } } } if(!b) { if(tree->n_root != NULL) { if(tree->ignore_root == NO) { Post_Order_Lk(tree->n_root,tree->n_root->v[1],tree); Post_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Update_Partial_Lk(tree,tree->n_root->b[1],tree->n_root); Update_Partial_Lk(tree,tree->n_root->b[2],tree->n_root); if(tree->both_sides == YES) { Pre_Order_Lk(tree->n_root,tree->n_root->v[2],tree); Pre_Order_Lk(tree->n_root,tree->n_root->v[1],tree); } } else { Post_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Post_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); if(tree->both_sides == YES) { Pre_Order_Lk(tree->e_root->rght,tree->e_root->left,tree); Pre_Order_Lk(tree->e_root->left,tree->e_root->rght,tree); } } } else { Post_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); if(tree->both_sides == YES) Pre_Order_Lk(tree->a_nodes[tree->tip_root],tree->a_nodes[tree->tip_root]->v[0],tree); } } } if(!b) { if(tree->n_root) { if(tree->ignore_root == NO) b = (tree->n_root->v[1]->tax == NO)?(tree->n_root->b[2]):(tree->n_root->b[1]); else b = tree->e_root; } else b = tree->a_nodes[tree->tip_root]->b[0]; } tree->c_lnL = .0; tree->sum_min_sum_scale = .0; #ifdef BEAGLE calc_edgelks_beagle(b, tree); #else if(tree->update_eigen_lr == YES) Update_Eigen_Lr(b,tree); if(tree->use_eigen_lr == YES) { for(catg=0;catgl->v)*tree->mod->ras->gamma_rr->v[catg]; len *= tree->mod->br_len_mult->v; if(tree->mixt_tree != NULL) len *= tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number]; if(len < tree->mod->l_min) len = tree->mod->l_min; else if(len > tree->mod->l_max) len = tree->mod->l_max; for(state=0;statemod->eigen->e_val[state],len); } } p_lk_left = b->p_lk_left; p_lk_rght = b->rght->tax ? b->p_lk_tip_r : b->p_lk_rght; for(site=0;sitecurr_site = site; if((b->rght->tax) && (tree->mod->s_opt->greedy == NO)) { ambiguity_check = b->rght->c_seq->is_ambigu[tree->curr_site]; if(ambiguity_check == NO) { state = b->rght->c_seq->d_state[tree->curr_site]; } } if(tree->mod->use_m4mod) ambiguity_check = YES; if(tree->use_eigen_lr == YES) { if(tree->data->wght[site] > SMALL) Lk_Core_Eigen_Lr(expl,dot_prod,b,tree); dot_prod += nsncatg; } else { if(tree->data->wght[site] > SMALL) Lk_Core(state,ambiguity_check,p_lk_left,p_lk_rght,b->Pij_rr,b->tPij_rr,b,tree); if(b->rght->tax == YES) { p_lk_left += nsncatg; p_lk_rght += ns; } else { p_lk_left += nsncatg; p_lk_rght += nsncatg; } } } #endif return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // First derivative of the log-likelihood with respect // to the length of edge b phydbl dLk(phydbl *l, t_edge *b, t_tree *tree) { unsigned int catg,state,site; phydbl len,rr; phydbl lk,dlk,dlnlk,lnlk; phydbl ev,expevlen; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int npattern = tree->n_pattern; phydbl *dot_prod = tree->dot_prod; phydbl *expl = tree->expl; tree->numerical_warning = NO; assert(isnan(*l) == FALSE); if(*l < tree->mod->l_min) *l = tree->mod->l_min; else if(*l > tree->mod->l_max) *l = tree->mod->l_max; assert(b != NULL); if(tree->is_mixt_tree == YES) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif return MIXT_dLk(l,b,tree); } if(tree->update_eigen_lr == YES) Update_Eigen_Lr(b,tree); for(catg=0;catgmod->ras->gamma_rr->v[catg]; rr *= tree->mod->br_len_mult->v; len = (*l) * rr; if(isinf(len) || isnan(len)) { PhyML_Fprintf(stderr,"\n. len=%f rr=%f l=%f",len,rr,*l); assert(FALSE); } if(len < tree->mod->l_min) len = tree->mod->l_min; else if(len > tree->mod->l_max) len = tree->mod->l_max; // value of rr should be corrected too if any of these two conditions // is true. Leads to numerical precision issues though... for(state=0;statemod->eigen->e_val[state]; expevlen = exp(ev*len); expl[catg*2*ns + 2*state] = expevlen; expl[catg*2*ns + 2*state + 1] = expevlen*ev*rr; } } dlnlk = 0.0; lnlk = 0.0; for(site=0;sitedata->wght[site] > SMALL) { tree->curr_site = site; Lk_dLk_Core_Eigen_Lr(expl,dot_prod+site*ns*ncatg,b,&lk,&dlk,tree); assert(lk > .0); dlk /= lk; dlnlk += tree->data->wght[site] * dlk; lnlk += tree->data->wght[site] * (log(lk) - (phydbl)LOG2 * tree->fact_sum_scale[site]); } } tree->c_dlnL = dlnlk; tree->c_lnL = lnlk; return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Core of the likelihood calculation. Assume that the partial likelihoods on both sides of t_edge *b are up-to-date. Calculate the log-likelihood at one site. Note: this function can be used to evaluate first or second derivative of the likelihood function with respect to the length of b, at a given site. Hence, be careful with the meaning of 'site_lk'. If 'derivative=TRUE', then site_lk is either the first or second derivative of the likelihood at that site, given the length of edge 'b'. */ phydbl Lk_Core(int state, int ambiguity_check, phydbl *p_lk_left, phydbl *p_lk_rght, phydbl *Pij_rr, phydbl *tPij_rr, t_edge *b, t_tree *tree) { phydbl site_lk,res,*pi,*site_lk_cat,log_site_lk; unsigned int catg; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int site = tree->curr_site; const unsigned nsns = ns*ns; assert(tree->data->wght[site] > SMALL); pi = tree->mod->e_frq->pi->v; if(tree->mod->s_opt->skip_tree_traversal == NO) { for(catg=0;catgsite_lk_cat[catg] = AVX_Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,tPij_rr,pi,ns,ambiguity_check,state); #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) tree->site_lk_cat[catg] = SSE_Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,tPij_rr,pi,ns,ambiguity_check,state); #else tree->site_lk_cat[catg] = Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,pi,ns,ambiguity_check,state); #endif } else { tree->site_lk_cat[catg] = Lk_Core_One_Class_No_Eigen_Lr(p_lk_left,p_lk_rght,Pij_rr,pi,ns, ambiguity_check, state); } Pij_rr += nsns; tPij_rr += nsns; if(b->left->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } Pull_Scaling_Factors(site,b,tree); } site_lk = .0; site_lk_cat = tree->unscaled_site_lk_cat + site*ncatg; for(catg=0;catgmod->ras->gamma_r_proba->v[catg]; if(tree->mod->ras->invar == YES) { int num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(tree->fact_sum_scale[site],site,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { assert(isinf(inv_site_lk)); tree->fact_sum_scale[site] = 0; inv_site_lk = Invariant_Lk(0,site,&num_prec_issue,tree); site_lk = inv_site_lk * tree->mod->ras->pinvar->v; break; } case NO : { site_lk = site_lk * (1. - tree->mod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v; break; } } } if(tree->apply_lk_scaling == YES) res = site_lk / pow(2,tree->fact_sum_scale[site]); else res = site_lk; if(site_lk < SMALL) { site_lk = SMALL; tree->numerical_warning = YES; } log_site_lk = log(site_lk) - (phydbl)LOG2 * tree->fact_sum_scale[site]; // log_site_lk = log(site_lk_scaled / 2^(left_subtree+right_subtree)) tree->c_lnL_sorted[site] = log_site_lk; tree->c_lnL += tree->data->wght[site] * log_site_lk; tree->cur_site_lk[site] = exp(log_site_lk); // note to self : add opt out option to avoid calculating this if not necessary /* printf("\n. clnL: %f",tree->c_lnL); */ return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, t_tree *tree) { phydbl site_lk,res,*site_lk_cat,log_site_lk; unsigned int catg; int num_prec_issue; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int site = tree->curr_site; assert(tree->data->wght[site] > SMALL); if(tree->mod->s_opt->skip_tree_traversal == NO) { for(catg=0;catgmod->io->datatype == NT || tree->mod->io->datatype == AA) { #if (defined(__AVX__) || defined(__AVX2__)) tree->site_lk_cat[catg] = AVX_Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) tree->site_lk_cat[catg] = SSE_Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); #else tree->site_lk_cat[catg] = Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); #endif } else { tree->site_lk_cat[catg] = Lk_Core_One_Class_Eigen_Lr(dot_prod,expl ? expl : NULL,ns); } dot_prod += ns; if(expl) expl += ns; } Pull_Scaling_Factors(site,b,tree); } site_lk_cat = tree->unscaled_site_lk_cat + site*ncatg; site_lk = .0; for(catg=0;catgmod->ras->gamma_r_proba->v[catg]; if(tree->mod->ras->invar == YES) { num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(tree->fact_sum_scale[site],site,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { assert(isinf(inv_site_lk)); tree->fact_sum_scale[site] = 0; inv_site_lk = Invariant_Lk(0,site,&num_prec_issue,tree); site_lk = inv_site_lk * tree->mod->ras->pinvar->v; break; } case NO : { site_lk = site_lk * (1. - tree->mod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v; break; } } } if(site_lk < SMALL) { site_lk = SMALL; tree->numerical_warning = YES; } // likelihood (or 1st, 2nd derivative) not rescaled here. Valid only if all partial likelihoods // were scaled using the same factor, i.e., when scaling_method == SCALE_FAST. In this case, the // scaling factors will cancel out in dlk/lk and d2lk/lk res = site_lk; log_site_lk = log(site_lk) - (phydbl)LOG2 * tree->fact_sum_scale[site]; // log_site_lk = log(site_lk_scaled / 2^(left_subtree+right_subtree)) tree->c_lnL_sorted[site] = log_site_lk; tree->c_lnL += tree->data->wght[site] * log_site_lk; tree->cur_site_lk[site] = exp(log_site_lk); // note to self : add opt out option to avoid calculating this if not necessary return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Compute likelihood and first derivative of likelihood with respect to the length of edge b *unscaled* void Lk_dLk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, phydbl *lk, phydbl *dlk, t_tree *tree) { phydbl core_lk,core_dlk; unsigned int catg; int num_prec_issue; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int site = tree->curr_site; *lk = *dlk = 0.0; assert(tree->data->wght[site] > SMALL); if(tree->mod->s_opt->skip_tree_traversal == NO) { for(catg=0;catgmod->io->datatype == NT || tree->mod->io->datatype == AA) { #if (defined(__AVX__) || defined(__AVX2__)) AVX_Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) SSE_Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); #else Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); #endif } else { Lk_dLk_Core_One_Class_Eigen_Lr(dot_prod, expl ? expl : NULL, ns,&core_lk,&core_dlk); } *lk += core_lk * tree->mod->ras->gamma_r_proba->v[catg]; *dlk += core_dlk * tree->mod->ras->gamma_r_proba->v[catg]; dot_prod += ns; if(expl) expl += 2*ns; } Pull_Scaling_Factors(site,b,tree); } if(tree->mod->ras->invar == YES) { num_prec_issue = NO; phydbl inv_site_lk = Invariant_Lk(tree->fact_sum_scale[site],site,&num_prec_issue,tree); switch(num_prec_issue) { case YES : { *lk = inv_site_lk * tree->mod->ras->pinvar->v; *dlk = 0.0; break; } case NO : { *lk = *lk * (1. - tree->mod->ras->pinvar->v) + inv_site_lk * tree->mod->ras->pinvar->v; *dlk = *dlk * (1. - tree->mod->ras->pinvar->v); break; } } } if(*lk < SMALL) { *lk = SMALL; tree->numerical_warning = YES; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Eigen_Lr(t_edge *b, t_tree *tree) { unsigned int site,catg,i,j; phydbl *dot_prod,*r_e_vect,*l_e_vect,*p_lk_left,*p_lk_rght,*pi; phydbl left,rght; const unsigned int npattern = tree->n_pattern; const unsigned int ns = tree->mod->ns; const unsigned int ncatg = tree->mod->ras->n_catg; const unsigned int nsncatg = ns*ncatg; if(tree->is_mixt_tree == YES) { MIXT_Update_Eigen_Lr(b,tree); return; } if(tree->mod->ns == 4 || tree->mod->ns == 20) { #if (defined(__AVX__) || defined(__AVX2__)) AVX_Update_Eigen_Lr(b,tree); return; #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) SSE_Update_Eigen_Lr(b,tree); return; #endif } assert(tree->update_eigen_lr == YES); dot_prod = tree->dot_prod; r_e_vect = tree->mod->eigen->r_e_vect; l_e_vect = tree->mod->eigen->l_e_vect; pi = tree->mod->e_frq->pi->v; if(b->left->tax == YES) p_lk_left = b->p_lk_tip_l; else p_lk_left = b->p_lk_left; if(b->rght->tax == YES) p_lk_rght = b->p_lk_tip_r; else p_lk_rght = b->p_lk_rght; for(site=0;sitedata->wght[site] > SMALL) { for(catg=0;catgleft->tax == NO) p_lk_left += ns; if(b->rght->tax == NO) p_lk_rght += ns; } if(b->left->tax == YES) p_lk_left += ns; if(b->rght->tax == YES) p_lk_rght += ns; } else { if(b->left->tax == YES) p_lk_left += ns; else p_lk_left += nsncatg; if(b->rght->tax == YES) p_lk_rght += ns; else p_lk_rght += nsncatg; dot_prod += nsncatg; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Rate_Correction(int exponent, phydbl *site_lk_cat) { int piecewise_exponent; phydbl multiplier,dum; unsigned long long int one = 1; dum = *site_lk_cat; if(exponent >= 0) { /* Multiply by 2^exponent */ do { piecewise_exponent = MIN(exponent,63); multiplier = (phydbl)(one << piecewise_exponent); dum = dum * multiplier; exponent = exponent - piecewise_exponent; } while(exponent != 0); } else { /* Divide by 2^exponent */ do { piecewise_exponent = MAX(exponent,-63); multiplier = 1. / (phydbl)(one << -piecewise_exponent); dum = dum * multiplier; exponent = exponent - piecewise_exponent; } while(exponent != 0); } *site_lk_cat = dum; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns) { unsigned int l; phydbl lk = 0.0; if(expl != NULL) for(l=0;l .0) /* Only bother ascending into the subtrees if the likelihood of state k, at site "site*dim2" is > 0 */ { sum = .0; for(l=0;lmod->ras->invar == YES) { /* The site is invariant */ if(tree->data->invar[site] > -0.5) { inv_site_lk = tree->mod->e_frq->pi->v[tree->data->invar[site]]; /* printf("\n. inv_site_lk = %f [%c] [%d] invar: %d",inv_site_lk,tree->data->c_seq[0]->state[site],tree->data->invar[site],tree->data->invar[site]); */ if(tree->apply_lk_scaling == YES) { exponent = fact_sum_scale; do { piecewise_exponent = MIN(exponent,63); multiplier = (phydbl)((unsigned long long)(1) << piecewise_exponent); inv_site_lk *= multiplier; exponent -= piecewise_exponent; } while(exponent != 0); } /* Update the value of site_lk */ if(isinf(inv_site_lk)) // P(D|r=0) >> P(D|r>0) => assume P(D) = P(D|r=0)P(r=0) { int i; PhyML_Fprintf(stderr,"\n. fact_sum_scale: %d",fact_sum_scale); PhyML_Fprintf(stderr,"\n. pi: %f",tree->mod->e_frq->pi->v[tree->data->invar[site]]); for(i=0;imod->ns;i++) PhyML_Fprintf(stderr,"\n. pi %d: %f",i,tree->mod->e_frq->pi->v[i]); PhyML_Fprintf(stderr,"\n. Numerical precision issue alert."); PhyML_Fprintf(stderr,"\n. File %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); (*num_prec_issue) = YES; } } } return inv_site_lk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Update partial likelihood on edge b on the side of b where node d lies. */ void Update_Partial_Lk(t_tree *tree, t_edge *b, t_node *d) { /* if(tree->eval_alnL == NO) return; */ if(b->left == d && b->update_partial_lk_left == NO) return; if(b->rght == d && b->update_partial_lk_rght == NO) return; if(tree->is_mixt_tree) { MIXT_Update_Partial_Lk(tree,b,d); return; } if((tree->io->do_alias_subpatt == YES) && (tree->update_alias_subpatt == YES)) Alias_One_Subpatt((d==b->left)?(b->rght):(b->left),d,tree); if(d->tax) return; #ifdef BEAGLE update_beagle_partials(tree, b, d); #else if(tree->mod->use_m4mod == NO) { if(tree->mod->ns == 4 || tree->mod->ns == 20) { #if (defined(__AVX__) || defined(__AVX2__)) AVX_Update_Partial_Lk(tree,b,d); #elif (defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__)) SSE_Update_Partial_Lk(tree,b,d); #else Default_Update_Partial_Lk(tree,b,d); #endif } else { Update_Partial_Lk_Generic(tree,b,d); } } else { Update_Partial_Lk_Generic(tree,b,d); } #endif } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifndef BEAGLE void Update_Partial_Lk_Generic(t_tree *tree, t_edge *b, t_node *d) { /* | |<- b | d / \ / \ / \ n_v1 n_v2 */ t_node *n_v1, *n_v2; phydbl p1_lk1,p2_lk2; phydbl *p_lk,*p_lk_v1,*p_lk_v2; phydbl *Pij1,*Pij2; phydbl *tPij1,*tPij2; int *sum_scale, *sum_scale_v1, *sum_scale_v2; int sum_scale_v1_val, sum_scale_v2_val; int i,j; int catg,site; int n_patterns; short int ambiguity_check_v1,ambiguity_check_v2; int state_v1,state_v2; phydbl smallest_p_lk,largest_p_lk; int *p_lk_loc; unsigned const int ncatg = tree->mod->ras->n_catg; unsigned const int ns = tree->mod->ns; unsigned const int ncatgns = ncatg * ns; unsigned const int nsns = ns * ns; if(tree->n_root && tree->ignore_root == YES && (d == tree->n_root->v[1] || d == tree->n_root->v[2]) && (b == tree->n_root->b[1] || b == tree->n_root->b[2])) { assert(FALSE); } state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = NO; sum_scale_v1_val = sum_scale_v2_val = 0; p1_lk1 = p2_lk2 = .0; if(d->tax) { PhyML_Fprintf(stderr,"\n. t_node %d is a leaf...",d->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s').\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } n_patterns = tree->n_pattern; n_v1 = n_v2 = NULL; p_lk = p_lk_v1 = p_lk_v2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; sum_scale_v1 = sum_scale_v2 = NULL; p_lk_loc = NULL; smallest_p_lk = BIG; Set_All_Partial_Lk(&n_v1,&n_v2, &p_lk,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&p_lk_v1,&sum_scale_v1, &Pij2,&tPij2,&p_lk_v2,&sum_scale_v2, d,b,tree); /* For every site in the alignment */ for(site=0;sitedata->wght[site] > SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = NO; if(tree->mod->s_opt->greedy == NO) { /* n_v1 and n_v2 are tip nodes */ if(n_v1 && n_v1->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; /* if(ambiguity_check_v1 == NO) state_v1 = Get_State_From_Partial_Pars(n_v1->b[0]->p_lk_tip_r,site*ns,tree); */ if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2 && n_v2->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; /* ambiguity_check_v2 = tree->data->c_seq[n_v2->num]->is_ambigu[site]; */ /* if(ambiguity_check_v2 == NO) state_v2 = Get_State_From_Partial_Pars(n_v2->b[0]->p_lk_tip_r,site*ns,tree); */ if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } } if(tree->mod->use_m4mod) { ambiguity_check_v1 = YES; ambiguity_check_v2 = YES; } /* For all the rate classes */ for(catg=0;catgmod->ras->skip_rate_cat[catg] == YES) continue; smallest_p_lk = BIG; /* For all the states at node d */ for(i=0;imod->ns;i++) { p1_lk1 = .0; if(n_v1) { /* n_v1 is a tip */ if((n_v1->tax) && (!tree->mod->s_opt->greedy)) { if(ambiguity_check_v1 == NO) { /* For the (non-ambiguous) state at node n_v1 */ p1_lk1 = Pij1[catg*nsns+i*ns+state_v1]; } else { /* For all the states at node n_v1 */ for(j=0;jmod->ns;j++) { p1_lk1 += Pij1[catg*nsns+i*ns+j] * (phydbl)n_v1->b[0]->p_lk_tip_r[site*ns+j]; } } } /* n_v1 is an internal node */ else { /* For the states at node n_v1 */ for(j=0;jmod->ns;j++) { p1_lk1 += Pij1[catg*nsns+i*ns+j] * p_lk_v1[site*ncatgns+catg*ns+j]; } } } else { p1_lk1 = 1.0; } p2_lk2 = .0; /* We do exactly the same as for node n_v1 but for node n_v2 this time.*/ if(n_v2) { /* n_v2 is a tip */ if((n_v2->tax) && (!tree->mod->s_opt->greedy)) { if(ambiguity_check_v2 == NO) { /* For the (non-ambiguous) state at node n_v2 */ p2_lk2 = Pij2[catg*nsns+i*ns+state_v2]; } else { /* For all the states at node n_v2 */ for(j=0;jmod->ns;j++) { p2_lk2 += Pij2[catg*nsns+i*ns+j] * (phydbl)n_v2->b[0]->p_lk_tip_r[site*ns+j]; } } } /* n_v2 is an internal node */ else { /* For all the states at node n_v2 */ for(j=0;jmod->ns;j++) { p2_lk2 += Pij2[catg*nsns+i*ns+j] * p_lk_v2[site*ncatgns+catg*ns+j]; } } } else { p2_lk2 = 1.0; } p_lk[site*ncatgns+catg*ns+i] = p1_lk1 * p2_lk2; /* if(site == 0) PhyML_Printf("\n+ site: %d %G",site,p_lk[site*ncatgns+catg*ns+i]); */ } if(tree->scaling_method == SCALE_RATE_SPECIFIC) { smallest_p_lk = BIG; for(i=0;imod->augmented == NO && tree->apply_lk_scaling == YES && (n_v1->tax == NO || n_v2->tax == NO)) { int curr_scaler_pow; curr_scaler_pow = (int)(-500.*LOG2-log(smallest_p_lk))/LOG2; sum_scale[site*ncatg+catg] += curr_scaler_pow; for(i=0;iscaling_method == SCALE_FAST) { sum_scale_v1_val = (sum_scale_v1)?(sum_scale_v1[site]):(0); sum_scale_v2_val = (sum_scale_v2)?(sum_scale_v2[site]):(0); sum_scale[site] = sum_scale_v1_val + sum_scale_v2_val; sum_scale[site*ncatg+catg] = sum_scale_v1_val + sum_scale_v2_val; assert(sum_scale[site] < 1024); largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = p_lk[site*ncatgns+i] ; if(largest_p_lk < INV_TWO_TO_THE_LARGE && tree->mod->augmented == NO && tree->apply_lk_scaling == YES) { for(i=0;imod->ras->n_catg; const unsigned int ns = tree->mod->ns; const unsigned int n_patterns = tree->n_pattern; if(tree->n_root && tree->ignore_root == YES && (d == tree->n_root->v[1] || d == tree->n_root->v[2]) && (b == tree->n_root->b[1] || b == tree->n_root->b[2])) { assert(FALSE); } if(d->tax) { PhyML_Fprintf(stderr,"\n. t_node %d is a leaf...",d->num); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s')\n",__FILE__,__LINE__,__FUNCTION__); Exit("\n"); } n_v1 = n_v2 = NULL; p_lk = p_lk_v1 = p_lk_v2 = NULL; Pij1 = Pij2 = NULL; tPij1 = tPij2 = NULL; p_lk_loc = NULL; sum_scale_v1 = NULL; sum_scale_v2 = NULL; Set_All_Partial_Lk(&n_v1,&n_v2, &p_lk,&sum_scale,&p_lk_loc, &Pij1,&tPij1,&p_lk_v1,&sum_scale_v1, &Pij2,&tPij2,&p_lk_v2,&sum_scale_v2, d,b,tree); Core_Default_Update_Partial_Lk(n_v1,n_v2, p_lk,p_lk_v1,p_lk_v2, Pij1,Pij2, sum_scale,sum_scale_v1,sum_scale_v2, ns,ncatg,n_patterns, tree->apply_lk_scaling, tree->data->wght); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Core_Default_Update_Partial_Lk(const t_node *n_v1, const t_node *n_v2, phydbl *plk0, const phydbl *plk1, const phydbl *plk2, const phydbl *Pij1, const phydbl *Pij2, int *sum_scale0, const int *sum_scale1, const int *sum_scale2, const int ns, const int ncatg, const int npatterns, const int apply_scaling, const phydbl *wght) { unsigned int i,site,ncatgns,catg,nsns; int state_v1,state_v2; int ambiguity_check_v1,ambiguity_check_v2; int sum_scale_v1_val, sum_scale_v2_val; phydbl largest_p_lk; const phydbl *init_Pij1, *init_Pij2; ncatgns = ncatg*ns; nsns = ns*ns; init_Pij1 = Pij1; init_Pij2 = Pij2; /* For every site in the alignment */ for(site=0;site SMALL) { state_v1 = state_v2 = -1; ambiguity_check_v1 = ambiguity_check_v2 = YES; /* n_v1 and n_v2 are tip nodes */ if(n_v1->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v1 = n_v1->c_seq->is_ambigu[site]; if(ambiguity_check_v1 == NO) state_v1 = n_v1->c_seq->d_state[site]; } if(n_v2->tax) { /* Is the state at this tip ambiguous? */ ambiguity_check_v2 = n_v2->c_seq->is_ambigu[site]; if(ambiguity_check_v2 == NO) state_v2 = n_v2->c_seq->d_state[site]; } Pij1 = init_Pij1; Pij2 = init_Pij2; /* For all the rate classes */ for(catg=0;catgtax) ? 0 : ns; plk2 += (n_v2->tax) ? 0 : ns; plk0 += ns; } plk1 += (n_v1->tax) ? ns : 0; plk2 += (n_v2->tax) ? ns : 0; sum_scale_v1_val = (sum_scale1)?(sum_scale1[site]):(0); sum_scale_v2_val = (sum_scale2)?(sum_scale2[site]):(0); sum_scale0[site] = sum_scale_v1_val + sum_scale_v2_val; plk0 -= ncatgns; largest_p_lk = -BIG; for(i=0;i largest_p_lk) largest_p_lk = plk0[i]; if(largest_p_lk < INV_TWO_TO_THE_LARGE && apply_scaling == YES) { for(i=0;itax) ? ns : ncatgns; plk2 += (n_v2->tax) ? ns : ncatgns; } } } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Return_Abs_Lk(t_tree *tree) { Lk(NULL,tree); return FABS(tree->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// matrix *ML_Dist(calign *data, t_mod *mod) { int i,j,k,l; phydbl init; int n_catg; phydbl d_max,sum; matrix *mat; calign *twodata,*tmpdata; int state0, state1; phydbl *F,len; eigen *eigen_struct; tmpdata = (calign *)mCalloc(1,sizeof(calign)); tmpdata->c_seq = (align **)mCalloc(2,sizeof(align *)); tmpdata->obs_state_frq = (phydbl *)mCalloc(mod->ns,sizeof(phydbl)); tmpdata->ambigu = (short int *)mCalloc(data->crunch_len,sizeof(short int)); F = (phydbl *)mCalloc(mod->ns*mod->ns,sizeof(phydbl )); eigen_struct = (eigen *)Make_Eigen_Struct(mod->ns); Set_Update_Eigen(YES,mod); Update_Boundaries(mod); Update_Eigen(mod); tmpdata->n_otu = 2; tmpdata->crunch_len = data->crunch_len; tmpdata->init_len = data->init_len; mat = NULL; if(mod->io->datatype == NT) mat = (mod->whichmodel < 10)?(K80_dist(data,1E+6)):(JC69_Dist(data,mod)); else if(mod->io->datatype == AA) mat = JC69_Dist(data,mod); else if(mod->io->datatype == GENERIC) mat = JC69_Dist(data,mod); for(i=0;iras->n_catg;i++) /* Don't use the discrete gamma distribution */ { mod->ras->gamma_rr->v[i] = 1.0; mod->ras->gamma_r_proba->v[i] = 1.0; } n_catg = mod->ras->n_catg; mod->ras->n_catg = 1; for(j=0;jn_otu-1;j++) { tmpdata->c_seq[0] = data->c_seq[j]; tmpdata->c_seq[0]->name = data->c_seq[j]->name; tmpdata->wght = data->wght; for(k=j+1;kn_otu;k++) { tmpdata->c_seq[1] = data->c_seq[k]; tmpdata->c_seq[1]->name = data->c_seq[k]->name; twodata = Compact_Cdata(tmpdata,mod->io); Check_Ambiguities(twodata,mod->io->datatype,mod->io->state_len); Hide_Ambiguities(twodata); init = mat->dist[j][k]; if((init > DIST_MAX-SMALL) || (init < .0)) init = 0.1; d_max = init; for(i=0;ins*mod->ns;++i) F[i]=.0; len = 0.0; for(l=0;lc_seq[0]->len;++l) { state0 = Assign_State(twodata->c_seq[0]->state+l*mod->io->state_len,mod->io->datatype,mod->io->state_len); state1 = Assign_State(twodata->c_seq[1]->state+l*mod->io->state_len,mod->io->datatype,mod->io->state_len); if((state0 > -1) && (state1 > -1)) { F[mod->ns*state0+state1] += twodata->wght[l]; len += twodata->wght[l]; } } if(len > .0) { for(i=0;ins*mod->ns;++i) F[i] /= len; } sum = 0.; for(i=0;ins*mod->ns;++i) sum += F[i]; /* for(i=0;ins*mod->ns;++i) PhyML_Printf("\n. %g",F[i]); */ /* if(sum < .001) d_max = -1.; */ if(sum < .001) d_max = init; else if((sum > 1. - .001) && (sum < 1. + .001)) Opt_Dist_F(&(d_max),F,mod); else { PhyML_Fprintf(stderr,"\n\n. sum = %f",sum); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit(""); } if(d_max >= DIST_MAX) d_max = DIST_MAX; /* Do not correct for dist < BL_MIN, otherwise Fill_Missing_Dist * will not be called */ mat->dist[j][k] = d_max; mat->dist[k][j] = mat->dist[j][k]; Free_Calign(twodata); } } mod->ras->n_catg = n_catg; Free(tmpdata->ambigu); Free(tmpdata->obs_state_frq); Free(tmpdata->c_seq); free(tmpdata); Free_Eigen(eigen_struct); Free(F); return mat; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Given_Two_Seq(calign *data, int numseq1, int numseq2, phydbl dist, t_mod *mod, phydbl *loglk) { align *seq1,*seq2; phydbl site_lk,log_site_lk; int i,j,k,l; /* phydbl **p_lk_l,**p_lk_r; */ phydbl *p_lk_l,*p_lk_r; phydbl len; int dim1,dim2; dim1 = mod->ns; dim2 = mod->ns * mod->ns; DiscreteGamma(mod->ras->gamma_r_proba->v, mod->ras->gamma_rr->v, mod->ras->alpha->v, mod->ras->alpha->v,mod->ras->n_catg,mod->ras->gamma_median); seq1 = data->c_seq[numseq1]; seq2 = data->c_seq[numseq2]; p_lk_l = (phydbl *)mCalloc(data->c_seq[0]->len * mod->ns,sizeof(phydbl)); p_lk_r = (phydbl *)mCalloc(data->c_seq[0]->len * mod->ns,sizeof(phydbl)); for(i=0;iras->n_catg;i++) { len = dist*mod->ras->gamma_rr->v[i]; if(len < mod->l_min) len = mod->l_min; else if(len > mod->l_max) len = mod->l_max; PMat(len,mod,dim2*i,mod->Pij_rr->v,NULL); } if(mod->io->datatype == NT) { For(i,data->c_seq[0]->len) { Init_Tips_At_One_Site_Nucleotides_Float(seq1->state[i],i*mod->ns,p_lk_l); Init_Tips_At_One_Site_Nucleotides_Float(seq2->state[i],i*mod->ns,p_lk_r); } } else if(mod->io->datatype == AA) { For(i,data->c_seq[0]->len) { Init_Tips_At_One_Site_AA_Float(seq1->state[i],i*mod->ns,p_lk_l); Init_Tips_At_One_Site_AA_Float(seq2->state[i],i*mod->ns,p_lk_r); } } else { PhyML_Fprintf(stderr,"\n\n. Not implemented yet..."); PhyML_Fprintf(stderr,"\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } site_lk = .0; *loglk = 0; For(i,data->c_seq[0]->len) { if(data->wght[i] > 0.0) { site_lk = log_site_lk = .0; if(!data->ambigu[i]) { for(k=0;kns;k++) {if(p_lk_l[i*mod->ns+k] > .0001) break;} for(l=0;lns;l++) {if(p_lk_r[i*mod->ns+l] > .0001) break;} for(j=0;jras->n_catg;j++) { site_lk += mod->ras->gamma_r_proba->v[j] * mod->e_frq->pi->v[k] * p_lk_l[i*dim1+k] * mod->Pij_rr->v[j*dim2+k*dim1+l] * p_lk_r[i*dim1+l]; } } else { for(j=0;jras->n_catg;j++) { for(k=0;kns;k++) /*sort sum terms ? No global effect*/ { for(l=0;lns;l++) { site_lk += mod->ras->gamma_r_proba->v[j] * mod->e_frq->pi->v[k] * p_lk_l[i*dim1+k] * mod->Pij_rr->v[j*dim2+k*dim1+l] * p_lk_r[i*dim1+l]; } } } } if(site_lk <= .0) { PhyML_Fprintf(stderr,"\n\n. '%c' '%c'\n",seq1->state[i],seq2->state[i]); Exit("\n. Err: site lk <= 0\n"); } log_site_lk += (phydbl)log(site_lk); *loglk += data->wght[i] * log_site_lk;/* sort sum terms ? No global effect*/ } } /* For(i,data->c_seq[0]->len) */ /* { */ /* Free(p_lk_l[i]); */ /* Free(p_lk_r[i]); */ /* } */ Free(p_lk_l); Free(p_lk_r); return *loglk; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Multinomial log likelihood void Unconstraint_Lk(t_tree *tree) { int i; tree->unconstraint_lk = .0; for(i=0;idata->crunch_len;i++) tree->unconstraint_lk += tree->data->wght[i]*(phydbl)log(tree->data->wght[i]); tree->unconstraint_lk -= tree->data->init_len*(phydbl)log(tree->data->init_len); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Log-likelihood assuming a tree with edge of infinite lengths void Composite_Lk(t_tree *tree) { int i; tree->composite_lk = 0.0; for(i=0;imod->ns;++i) tree->composite_lk += tree->data->obs_state_frq[i]* tree->data->init_len* tree->n_otu* log(tree->mod->e_frq->pi->v[i]); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Tips_Double(t_tree *tree) { unsigned int curr_site,i,dim1; if(tree->is_mixt_tree == YES) return; dim1 = tree->mod->ns; for(i=0;in_otu;i++) { if(!tree->a_nodes[i]->c_seq || strcmp(tree->a_nodes[i]->c_seq->name,tree->a_nodes[i]->name)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit(""); } } for(curr_site=0;curr_sitedata->crunch_len;curr_site++) { for(i=0;in_otu;i++) { if (tree->io->datatype == NT) Init_Tips_At_One_Site_Nucleotides_Float(tree->a_nodes[i]->c_seq->state[curr_site], curr_site*dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); else if(tree->io->datatype == AA) Init_Tips_At_One_Site_AA_Float(tree->a_nodes[i]->c_seq->state[curr_site], curr_site*dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); else if(tree->io->datatype == GENERIC) Init_Tips_At_One_Site_Generic_Float(tree->a_nodes[i]->c_seq->state+curr_site*tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, curr_site*dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Tips_Int(t_tree *tree) { int curr_site,i,dim1; if(tree->is_mixt_tree == YES) return; dim1 = tree->mod->ns; for(i=0;in_otu;i++) { if(!tree->a_nodes[i]->c_seq || strcmp(tree->a_nodes[i]->c_seq->name,tree->a_nodes[i]->name)) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d (function '%s') \n",__FILE__,__LINE__,__FUNCTION__); Exit(""); } } for(curr_site=0;curr_sitedata->crunch_len;curr_site++) { for(i=0;in_otu;i++) { /* printf("\n. site: %3d %c",curr_site,tree->a_nodes[i]->c_seq->state[curr_site]); */ /* printf("\n. init at %s %p",tree->a_nodes[i]->name,tree->a_nodes[i]->b[0]->p_lk_tip_r); fflush(NULL); */ if(tree->io->datatype == NT) { Init_Tips_At_One_Site_Nucleotides_Float(tree->a_nodes[i]->c_seq->state[curr_site], curr_site*dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); /* Init_Tips_At_One_Site_Nucleotides_Int(tree->data->c_seq[i]->state[curr_site], */ /* curr_site*dim1, */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r); */ } else if(tree->io->datatype == AA) Init_Tips_At_One_Site_AA_Float(tree->a_nodes[i]->c_seq->state[curr_site], curr_site*dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); /* Init_Tips_At_One_Site_AA_Int(tree->data->c_seq[i]->state[curr_site], */ /* curr_site*dim1, */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r); */ else if(tree->io->datatype == GENERIC) { Init_Tips_At_One_Site_Generic_Float(tree->a_nodes[i]->c_seq->state+curr_site*tree->mod->io->state_len, tree->mod->ns, tree->mod->io->state_len, curr_site*dim1, tree->a_nodes[i]->b[0]->p_lk_tip_r); /* Init_Tips_At_One_Site_Generic_Int(tree->data->c_seq[i]->state+curr_site*tree->mod->io->state_len, */ /* tree->mod->ns, */ /* tree->mod->io->state_len, */ /* curr_site*dim1, */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r); */ } #ifdef BEAGLE //Recall that tip partials are stored on the branch leading //to the tip, rather than on the tip itself (hence `p_lk_tip_idx` //is a field of the branch (i.e. b[0]) rather than the node. //Secondly, the BEAGLE's partial buffers are laid out as //BEAGLE's partials buffer = [ tax1, tax2, ..., taxN, b1Left, b2Left, b3Left,...,bMLeft, b1Rght, b2Rght, b3Rght,...,bMRght] (N taxa, M branches) tree->a_nodes[i]->b[0]->p_lk_tip_idx = i; #endif } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_PMat_At_Given_Edge(t_edge *b_fcus, t_tree *tree) { int i; phydbl len; phydbl l_min, l_max; phydbl shape, scale, mean, var; assert(b_fcus); assert(tree); assert(tree->eval_alnL == YES); if(tree->is_mixt_tree == YES) { MIXT_Update_PMat_At_Given_Edge(b_fcus,tree); return; } if(b_fcus->Pij_rr == NULL) { PhyML_Printf("\n. b_fcus is e_root ? %d node left: %d node rght: %d left is root ? %d right is root ? %d [%p] [%d] [%d]", (b_fcus == tree->e_root) ? 1 : 0, b_fcus->left->num, b_fcus->rght->num, (b_fcus->left == tree->n_root) ? 1 : 0, (b_fcus->rght == tree->n_root) ? 1 : 0, tree->aux_tree, tree->eval_alnL, tree->is_mixt_tree); assert(false); } if(tree->mixt_tree != NULL) assert(tree->mod->ras->n_catg == 1); if(tree->io->mod->gamma_mgf_bl == YES) Set_Br_Len_Var(b_fcus,tree); l_min = tree->mod->l_min; l_max = tree->mod->l_max; len = -1.0; if(tree->mod->log_l == YES) b_fcus->l->v = exp(b_fcus->l->v); for(i=0;imod->ras->n_catg;i++) { if(tree->mod->ras->skip_rate_cat[i] == YES) continue; //Update the branch length if(b_fcus->has_zero_br_len == YES) { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif len = -1.0; mean = -1.0; var = -1.0; } else { len = MAX(0.0,b_fcus->l->v)*tree->mod->ras->gamma_rr->v[i];//branch_len * rate len *= tree->mod->br_len_mult->v; if(tree->mixt_tree) len *= tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number]; if(len < l_min) len = l_min; else if(len > l_max) len = l_max; mean = len; var = MAX(0.0,b_fcus->l_var->v) * POW(tree->mod->ras->gamma_rr->v[i]*tree->mod->br_len_mult->v,2); if(tree->mixt_tree) var *= POW(tree->mixt_tree->mod->ras->gamma_rr->v[tree->mod->ras->parent_class_number],2); /* var = 1.E-10; */ if(var > tree->mod->l_var_max) var = tree->mod->l_var_max; if(var < tree->mod->l_var_min) var = tree->mod->l_var_min; } //Update the transition prob. matrix if(tree->mod->gamma_mgf_bl == NO) { #ifdef BEAGLE assert(UNINITIALIZED != tree->mod->b_inst); #endif PMat(len,tree->mod,i*tree->mod->ns*tree->mod->ns,b_fcus->Pij_rr,b_fcus->tPij_rr); } else { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif shape = mean*mean/var; scale = var/mean; PMat_MGF_Gamma(b_fcus->Pij_rr+tree->mod->ns*tree->mod->ns*i,shape,scale,1.0,tree->mod); } } #ifdef BEAGLE int whichmodel = tree->mod->whichmodel; //Only for some models we use Beagle to compute/update the P-matrices, for other models //we compute them in PhyML and explicitly set the P-matrices in BEAGLE if((tree->mod->io->datatype == AA || whichmodel==GTR || whichmodel==CUSTOM) && tree->mod->use_m4mod == NO) { if(b_fcus->has_zero_br_len == YES) Warn_And_Exit(TODO_BEAGLE); // update_beagle_eigen(tree->mod); update_beagle_ras(tree->mod); // len = MAX(0.0, b_fcus->l->v) * tree->mod->br_len_mult->v; int p_matrices[1] = b_fcus->Pij_rr_idx; double branch_lens[1] = len; int ret = beagleUpdateTransitionMatrices(tree->b_inst,0,p_matrices,NULL,NULL,branch_lens,1); if(ret<0) { PhyML_Fprintf(stderr, "beagleUpdateTransitionMatrices() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } //Retrieve a "local" copy of the P-matrix ret = beagleGetTransitionMatrix(tree->b_inst, b_fcus->Pij_rr_idx, b_fcus->Pij_rr); if(ret<0) { PhyML_Fprintf(stderr, "beagleGetTransitionMatrix() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } } else { int ret = beagleSetTransitionMatrix(tree->b_inst, b_fcus->Pij_rr_idx, b_fcus->Pij_rr, -1); if(ret<0) { PhyML_Fprintf(stderr, "beagleSetTransitionMatrix() on instance %i failed:%i\n\n",tree->b_inst,ret); Exit(""); } } #endif if(tree->mod->log_l == YES) b_fcus->l->v = log(b_fcus->l->v); // Print_Model(tree->mod); // Dump_Arr_D(tree->cur_site_lk, tree->n_pattern); // Print_Edge_PMats(tree, b_fcus); // Print_Edge_Likelihoods(tree,b_fcus,true); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Update_Partial_Lk_Along_A_Path(t_node **path, int path_length, t_tree *tree) { int i,j; for(i=0;iv[j] == path[i+1]) { if(path[i] == path[i]->b[j]->left) { Update_Partial_Lk(tree,path[i]->b[j],path[i]->b[j]->left); } else if(path[i] == path[i]->b[j]->rght) { Update_Partial_Lk(tree,path[i]->b[j],path[i]->b[j]->rght); } else { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d. \n",__FILE__,__LINE__); assert(FALSE); } break; } #ifdef DEBUG if(j == 3) { PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d.\n",__FILE__,__LINE__); assert(FALSE); } #endif } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Dist(phydbl *F, phydbl dist, t_mod *mod) { int i,j,k; phydbl lnL,len; int dim1,dim2; phydbl pi, pijk; // Compute likelihood of the model made of the // first class of the mixture. /* if(mod->is_mixt_mod == YES) mod = mod->next; */ /* assert(mod); */ if(mod->log_l == YES) dist = exp(dist); for(k=0;kras->n_catg;k++) { len = dist*mod->ras->gamma_rr->v[k]; if(len < mod->l_min) len = mod->l_min; else if(len > mod->l_max) len = mod->l_max; PMat(len,mod,mod->ns*mod->ns*k,mod->Pij_rr->v,NULL); /* PhyML_Printf("\n. p: %g len: %g",mod->Pij_rr->v[0],len); */ } dim1 = mod->ns*mod->ns; dim2 = mod->ns; lnL = .0; pi = -1.; pijk = -1.; for(i=0;ins-1;i++) { pi = mod->e_frq->pi->v[i]; for(j=i+1;jns;j++) { for(k=0;kras->n_catg;k++) { pijk = mod->Pij_rr->v[dim1*k+dim2*i+j]; lnL += (F[dim1*k+dim2*i+j] + F[dim1*k+dim2*j+i]) * log(pi * pijk); /* PhyML_Printf("\n. pijk: %g lnL: %g",pijk,lnL); */ } } } for(i=0;ins;i++) { pi = mod->e_frq->pi->v[i]; for(k=0;kras->n_catg;k++) { pijk = mod->Pij_rr->v[dim1*k+dim2*i+i]; lnL += F[dim1*k+dim2*i+i]* log(pi * pijk); /* PhyML_Printf("\n. pijk: %g lnL: %g",pijk,lnL); */ } } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Update_Lk_At_Given_Edge(t_edge *b_fcus, t_tree *tree) { Update_Partial_Lk(tree,b_fcus,b_fcus->left); Update_Partial_Lk(tree,b_fcus,b_fcus->rght); tree->c_lnL = Lk(b_fcus,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Init_Partial_Lk_Loc(t_tree *tree) { int i,j; t_node *d; int *patt_id_d; if(tree->is_mixt_tree == YES) return; for(i=0;i<2*tree->n_otu-1;++i) { for(j=0;jn_pattern;j++) { tree->a_edges[i]->p_lk_loc_left[j] = j; tree->a_edges[i]->p_lk_loc_rght[j] = j; } } for(i=0;in_otu;i++) { d = tree->a_nodes[i]; patt_id_d = (d == d->b[0]->left)?(d->b[0]->patt_id_left):(d->b[0]->patt_id_rght); for(j=0;jn_pattern;j++) { assert(tree->a_nodes[d->num]->c_seq); patt_id_d[j] = (int)tree->a_nodes[d->num]->c_seq->state[j]; } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Lk_Normal_Approx(t_tree *tree) { phydbl lnL; int i; int dim; phydbl first_order; dim = 2*tree->n_otu-3; lnL = Dnorm_Multi_Given_InvCov_Det(tree->rates->u_cur_l, tree->rates->mean_l, tree->rates->invcov, tree->rates->covdet, 2*tree->n_otu-3,YES); first_order = 0.0; for(i=0;irates->u_cur_l[i] - tree->rates->mean_l[i]) * tree->rates->grad_l[i]; lnL += first_order; return(lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Part_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree) { return -1.0; /* return PART_Lk_At_Given_Edge(b,stree);; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Part_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { return -1.0; /* return PART_Lk(stree); */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { Lk(NULL,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if (defined GEO) phydbl Wrap_Geo_Lk(t_edge *b, t_tree *tree, supert_tree *stree) { TIPO_Lk(tree); return tree->geo_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree) { Lk(b,tree); return tree->c_lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if(defined PHYREX || PHYTIME) phydbl Wrap_Lk_Rates(t_edge *b, t_tree *tree, supert_tree *stree) { RATES_Lk(tree); return tree->rates->c_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #if(defined PHYREX || PHYTIME) phydbl Wrap_Lk_Times(t_edge *b, t_tree *tree, supert_tree *stree) { TIMES_Lk(tree); return tree->times->c_lnL; } #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Lk_Linreg(t_edge *b, t_tree *tree, supert_tree *stree) { /* RATES_Lk_Linreg(tree); */ return -1.; /* return tree->rates->c_lnL_linreg; */ } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl Wrap_Diff_Lk_Norm_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree) { phydbl diff; diff = Diff_Lk_Norm_At_Given_Edge(b,tree); return(-diff); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int Check_Lk_At_Given_Edge(int verbose, t_tree *tree) { int res; int i; phydbl *lk; lk = (phydbl *)mCalloc(2*tree->n_otu-3,sizeof(phydbl)); res = 0; for(i=0;i<2*tree->n_otu-3;++i) { lk[i] = Lk(tree->a_edges[i],tree); if(verbose == YES) PhyML_Printf("\n. Edge %3d %13G %f %13G", tree->a_edges[i]->num,tree->a_edges[i]->l->v,lk[i], tree->a_edges[i]->l_var->v); } if(tree->n_root && tree->ignore_root == NO) { Lk(tree->n_root->b[1],tree); if(verbose == YES) PhyML_Printf("\nx Edge %3d %13G %f %13G", tree->n_root->b[1]->num,tree->n_root->b[1]->l->v,tree->c_lnL, tree->n_root->b[1]->l_var->v ); Lk(tree->n_root->b[2],tree); if(verbose == YES) PhyML_Printf("\nx Edge %3d %13G %f %13G", tree->n_root->b[2]->num,tree->n_root->b[2]->l->v,tree->c_lnL, tree->n_root->b[2]->l_var->v ); } res=1; for(i=1;i<2*tree->n_otu-3;i++) { if(FABS(lk[i]-lk[i-1]) > 1.E-2) res=0; } Free(lk); return res; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Computes the value of fact_sum_scale, the part of the scaling factors // that is common to all classes of the mixture and scale the // likelihood for each mixture using the part of the scaling // factors that is class-specific void Pull_Scaling_Factors(int site, t_edge *b, t_tree *tree) { unsigned int catg; const unsigned int ncatg = tree->mod->ras->n_catg; if(tree->apply_lk_scaling == NO) { tree->fact_sum_scale[site] = 0; for(catg=0;catgunscaled_site_lk_cat[site*ncatg+catg] = tree->site_lk_cat[catg]; return; } else { switch(tree->scaling_method) { case SCALE_RATE_SPECIFIC : { int *sum_scale_left_cat,*sum_scale_rght_cat; int exponent; phydbl max_sum_scale,min_sum_scale; phydbl sum,tmp,dum; sum_scale_left_cat = b->sum_scale_left_cat; sum_scale_rght_cat = b->sum_scale_rght_cat; max_sum_scale = (phydbl)BIG; min_sum_scale = -(phydbl)BIG; for(catg=0;catgsum_scale_left)? (b->sum_scale_left[site*ncatg+catg]): (0.0); sum_scale_rght_cat[catg] = (b->sum_scale_rght)? (b->sum_scale_rght[site*ncatg+catg]): (0.0); sum = sum_scale_left_cat[catg] + sum_scale_rght_cat[catg]; if(sum < .0) { PhyML_Fprintf(stderr,"\n. tree: %s\n",Write_Tree(tree)); PhyML_Fprintf(stderr,"\n. b->num = %d sum = %G root ? %d",sum,b->num,b == tree->e_root); PhyML_Fprintf(stderr,"\n. Err. in file %s at line %d.\n",__FILE__,__LINE__); Exit("\n"); } dum = log(FABS(tree->site_lk_cat[catg])); tmp = sum + ((phydbl)LOGBIG - dum)/(phydbl)LOG2; if(tmp < max_sum_scale) max_sum_scale = tmp; /* min of the maxs */ tmp = sum + ((phydbl)LOGSMALL - dum)/(phydbl)LOG2; if(tmp > min_sum_scale) min_sum_scale = tmp; /* max of the mins */ assert(isnan(tmp) == NO); } if(min_sum_scale > max_sum_scale) { #ifdef SAFEMODE PhyML_Printf("\n. Numerical precision issue alert."); PhyML_Printf("\n. min_sum_scale = %G max_sum_scale = %G",min_sum_scale,max_sum_scale); #endif min_sum_scale = max_sum_scale; } tree->fact_sum_scale[site] = (int)((max_sum_scale + min_sum_scale) / 2); /* Apply scaling factors */ for(catg=0;catgfact_sum_scale[site]; Rate_Correction(exponent,tree->site_lk_cat + catg); } break; } case SCALE_FAST : { int sum_scale_left,sum_scale_rght; sum_scale_left = (b->sum_scale_left)? (b->sum_scale_left[site]): (0.0); sum_scale_rght = (b->sum_scale_rght)? (b->sum_scale_rght[site]): (0.0); tree->fact_sum_scale[site] = sum_scale_left + sum_scale_rght; break; } } for(catg=0;catgunscaled_site_lk_cat[site*ncatg+catg] = tree->site_lk_cat[catg]; } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // Tree should be ready for likelihood analysis when calling // this function. void Stepwise_Add_Lk(t_tree *tree) { t_edge **residuals,**targets,*best_target; int *nd_idx,i,j,n_targets,*tg_idx,n_opt; residuals = (t_edge **)mCalloc(tree->n_otu-3,sizeof(t_edge *)); targets = (t_edge **)mCalloc(2*tree->n_otu-3,sizeof(t_edge *)); best_target = NULL; nd_idx = Permutate(tree->n_otu-3); // Remove all tips except that corresponding to a_nodes[0], // a_nodes[1] and a_nodes[2]. for(i=0;in_otu-3;i++) { Prune_Subtree(tree->a_nodes[i+3]->v[0], tree->a_nodes[i+3], NULL, residuals+i, tree); } // Initial targets n_targets = 3; for(i=0;ia_nodes[i]->b[0]; // Regraft each tip on the tree at most parsimonious position for(i=0;in_otu-3;i++) { Set_Both_Sides(YES,tree); Lk(NULL,tree); printf("\n. [%d/%d]",i,tree->n_otu-3); tree->best_lnL = UNLIKELY; best_target = NULL; tg_idx = Permutate(n_targets); for(j=0;ja_nodes[nd_idx[i]+3]->v[0], NULL, residuals[i], NULL, tree); Update_PMat_At_Given_Edge(targets[tg_idx[j]],tree); Update_PMat_At_Given_Edge(tree->a_nodes[nd_idx[i]+3]->b[0],tree); Update_Partial_Lk(tree,residuals[i],tree->a_nodes[nd_idx[i]+3]->v[0]); Lk(residuals[i],tree); if(tree->c_lnL > tree->best_lnL) { tree->best_lnL = tree->c_lnL; best_target = targets[tg_idx[j]]; } Prune_Subtree(tree->a_nodes[nd_idx[i]+3]->v[0], tree->a_nodes[nd_idx[i]+3], NULL, residuals+i, tree); } assert(best_target); Graft_Subtree(best_target, tree->a_nodes[nd_idx[i]+3]->v[0], NULL, residuals[i], NULL, tree); n_opt = 0; do Optimize_Br_Len_Serie (2,tree); while(n_opt++ < 3); targets[n_targets] = residuals[i]; targets[n_targets+1] = tree->a_nodes[nd_idx[i]+3]->b[0]; Free(tg_idx); n_targets+=2; } Round_Optimize(tree,5); PhyML_Fprintf(stderr,"\n. lk: %f",tree->c_lnL); Exit("\n"); Free(nd_idx); Free(residuals); Free(targets); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* | | |b | |d / \ / \ / \ / \ /v1 \v2 Set p_lk and sum_scale for subtrees with d, v1 and v2 as root, Pij for edges b, and the two edges connecting d to v1 and d to v2; Account for rooted trees. */ void Set_All_Partial_Lk(t_node **n_v1, t_node **n_v2, phydbl **p_lk, int **sum_scale, int **p_lk_loc, phydbl **Pij1, phydbl **tPij1, phydbl **p_lk_v1, int **sum_scale_v1, phydbl **Pij2, phydbl **tPij2, phydbl **p_lk_v2, int **sum_scale_v2, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int *dest_p_idx, int *child1_p_idx, int* child2_p_idx, int* Pij1_idx, int* Pij2_idx #endif ) { unsigned int i; assert(tree->is_mixt_tree == NO); assert(d->tax == NO); if(tree->n_root == NULL || tree->ignore_root == YES) { /* Does d lie on the "left" or "right" of the branch? */ if(d == b->left) { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; #ifdef BEAGLE *dest_p_idx = b->p_lk_left_idx; #endif } else { *p_lk = b->p_lk_rght; *sum_scale = b->sum_scale_rght; #ifdef BEAGLE *dest_p_idx = b->p_lk_rght_idx; #endif } *n_v1 = *n_v2 = NULL; for(i=0;i<3;++i) { if(d->b[i] != b) { if(!(*n_v1)) { *n_v1 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree); #endif } else if(!(*n_v2)) { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif } else { PhyML_Printf("\n. Issue detected with node %d.\n",d->num); assert(FALSE); } } } } else { if(b == tree->e_root) { if(d == tree->n_root->v[1]) b = tree->n_root->b[1]; else if(d == tree->n_root->v[2]) b = tree->n_root->b[2]; else assert(FALSE); } if(d == tree->n_root) { if(b == tree->n_root->b[1]) { *p_lk = tree->n_root->b[1]->p_lk_left; *sum_scale = tree->n_root->b[1]->sum_scale_left; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[1]->p_lk_left_idx; #endif } else { *p_lk = tree->n_root->b[2]->p_lk_left; *sum_scale = tree->n_root->b[2]->sum_scale_left; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[2]->p_lk_left_idx; #endif } *n_v1 = NULL; *Pij1 = NULL; *tPij1 = NULL; *p_lk_v1 = NULL; *sum_scale_v1 = NULL; if(b == tree->n_root->b[1]) { *n_v2 = tree->n_root->v[2]; *Pij2 = tree->n_root->b[2]->Pij_rr; *tPij2 = tree->n_root->b[2]->tPij_rr; *p_lk_v2 = tree->n_root->b[2]->p_lk_rght; *sum_scale_v2 = tree->n_root->b[2]->sum_scale_rght; #ifdef BEAGLE *child2_p_idx = tree->n_root->b[2]->p_lk_rght_idx; *Pij2_idx = tree->n_root->b[2]->Pij_rr_idx; #endif } else if(b == tree->n_root->b[2]) { *n_v2 = tree->n_root->v[1]; *Pij2 = tree->n_root->b[1]->Pij_rr; *tPij2 = tree->n_root->b[1]->tPij_rr; *p_lk_v2 = tree->n_root->b[1]->p_lk_rght; *sum_scale_v2 = tree->n_root->b[1]->sum_scale_rght; #ifdef BEAGLE *child2_p_idx = tree->n_root->b[1]->p_lk_rght_idx; *Pij2_idx = tree->n_root->b[1]->Pij_rr_idx; #endif } else assert(FALSE); } else if(d == tree->n_root->v[1] || d == tree->n_root->v[2]) { if(b == tree->n_root->b[1] || b == tree->n_root->b[2]) { if(b == tree->n_root->b[1]) { *p_lk = tree->n_root->b[1]->p_lk_rght; *sum_scale = tree->n_root->b[1]->sum_scale_rght; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[1]->p_lk_rght_idx; #endif } else { *p_lk = tree->n_root->b[2]->p_lk_rght; *sum_scale = tree->n_root->b[2]->sum_scale_rght; #ifdef BEAGLE *dest_p_idx = tree->n_root->b[2]->p_lk_rght_idx; #endif } *n_v1 = *n_v2 = NULL; for(i=0;i<3;++i) { if(d->b[i] != tree->e_root) { if(!(*n_v1)) { *n_v1 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree); #endif } else { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif } } } } else { if(d == b->left) { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; *p_lk_loc = b->p_lk_loc_left; #ifdef BEAGLE *dest_p_idx = b->p_lk_left_idx; #endif } else { *p_lk = b->p_lk_rght; *sum_scale = b->sum_scale_rght; *p_lk_loc = b->p_lk_loc_rght; #ifdef BEAGLE *dest_p_idx = b->p_lk_rght_idx; #endif } *n_v1 = tree->n_root; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d, (d == tree->n_root->v[1])? (tree->n_root->b[1]): (tree->n_root->b[2]), tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d, (d == tree->n_root->v[1])? (tree->n_root->b[1]): (tree->n_root->b[2]), tree); #endif for(i=0;i<3;i++) { if(d->b[i] != tree->e_root && d->b[i] != b) { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif break; } } } } else { if(d == b->left) { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; *p_lk_loc = b->p_lk_loc_left; #ifdef BEAGLE *dest_p_idx = b->p_lk_left_idx; #endif } else { *p_lk = b->p_lk_rght; *sum_scale = b->sum_scale_rght; *p_lk_loc = b->p_lk_loc_rght; #ifdef BEAGLE *dest_p_idx = b->p_lk_rght_idx; #endif } *n_v1 = *n_v2 = NULL; for(i=0;i<3;i++) { if(d->b[i] != b) { if(!(*n_v1)) { *n_v1 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree,child1_p_idx,Pij1_idx); #else Set_Partial_Lk_One_Side(Pij1,tPij1,p_lk_v1,sum_scale_v1,d,d->b[i],tree); #endif } else { *n_v2 = d->v[i]; #ifdef BEAGLE Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree,child2_p_idx,Pij2_idx); #else Set_Partial_Lk_One_Side(Pij2,tPij2,p_lk_v2,sum_scale_v2,d,d->b[i],tree); #endif } } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* | | |d / \ / \ / \b / \ / \x (either n_v1 or n_v2) Returns p_lk and sum_scale for subtree with x as root, Pij for edge b */ void Set_Partial_Lk_One_Side(phydbl **Pij, phydbl **tPij, phydbl **p_lk, int **sum_scale, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int* child_p_idx, int* Pij_idx #endif ) { if(Pij != NULL) { *Pij = b->Pij_rr; *tPij = b->tPij_rr; #ifdef BEAGLE *Pij_idx = b->Pij_rr_idx; #endif } if(d->tax == NO) { if(d == b->left) // if d is on the left of b, then d's neighbor is on the right { *p_lk = (b->rght->tax == YES) ? b->p_lk_tip_r : b->p_lk_rght; *sum_scale = b->sum_scale_rght; #ifdef BEAGLE *child_p_idx = b->rght->tax? b->p_lk_tip_idx: b->p_lk_rght_idx; #endif if(*p_lk == NULL) PhyML_Printf("\n. b:%d b->left:%d b->rght:%d d:%d", b->num, b->left->num, b->rght->num, d->num); assert(*p_lk); } else { *p_lk = b->p_lk_left; *sum_scale = b->sum_scale_left; #ifdef BEAGLE *child_p_idx = b->rght->tax? b->p_lk_tip_idx: b->p_lk_left_idx; #endif if(*p_lk == NULL) PhyML_Printf("\n. b:%d b->left:%d b->rght:%d d:%d", b->num, b->left->num, b->rght->num, d->num); assert(*p_lk); } } else { #ifdef BEAGLE Warn_And_Exit(TODO_BEAGLE); #endif *p_lk = NULL; *sum_scale = NULL; PhyML_Printf("\n. WARNING. p_lk set to NULL. d->num: %d b->num: %d",d->num,b->num); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Switch_Partial_Lk_Post(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree) { if(a == tree->n_root) assert(FALSE); if(d->tax == NO) { int i; for(i=0;i<3;++i) if(d->v[i] != a) Switch_Partial_Lk_Post(d,d->v[i],d->b[i],yesno,tree); } if(b->left == d) b->update_partial_lk_left = yesno; else if(b->rght == d) b->update_partial_lk_rght = yesno; else assert(FALSE); return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Switch_Partial_Lk_Pre(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree) { if(a == tree->n_root) assert(FALSE); if(d->tax == YES) return; else { int i; for(i=0;i<3;++i) { if(d->v[i] != a) { if(d->b[i]->left == d) d->b[i]->update_partial_lk_left = yesno; else if(d->b[i]->rght == d) d->b[i]->update_partial_lk_rght = yesno; else assert(FALSE); } } for(i=0;i<3;++i) if(d->v[i] != a) Switch_Partial_Lk_Pre(d,d->v[i],d->b[i],yesno,tree); } return; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void Partial_Lk_Inin(const phydbl *Pij1, const phydbl *plk1, const phydbl *Pij2, const phydbl *plk2, const int ns, phydbl *plk0) { unsigned int i,j; for(i=0;i 1.0 || plk1[i] < 1.0 || plk2[i] > 1.0 || plk2[i] < 1.0) break; if(i != ns) { for(i=0;i #ifndef LK_H #define LK_H #include "utilities.h" #include "optimiz.h" #include "models.h" #include "free.h" #include "times.h" #include "mixt.h" #include "avx.h" #include "sse.h" void Update_All_Partial_Lk(t_tree *tree); void Init_Tips_At_One_Site_Nucleotides_Float(char state, int pos, phydbl *p_lk); void Init_Tips_At_One_Site_AA_Float(char aa, int pos, phydbl *p_lk); void Get_All_Partial_Lk(t_tree *tree,t_edge *b_fcus,t_node *a,t_node *d); void Get_All_Partial_Lk_Scale(t_tree *tree,t_edge *b_fcus,t_node *a,t_node *d); void Post_Order_Lk(t_node *pere, t_node *fils, t_tree *tree); void Pre_Order_Lk(t_node *pere, t_node *fils, t_tree *tree); phydbl Lk(t_edge *b, t_tree *tree); void Site_Lk(t_tree *tree); phydbl Return_Abs_Lk(t_tree *tree); matrix *ML_Dist(calign *data, t_mod *mod); phydbl Lk_Given_Two_Seq(calign *data, int numseq1, int numseq2, phydbl dist, t_mod *mod, phydbl *loglk); void Unconstraint_Lk(t_tree *tree); void Update_Partial_Lk(t_tree *tree,t_edge *b_fcus,t_node *n); void Update_Partial_Lk_Generic(t_tree *tree,t_edge *b_fcus,t_node *n); /* void Default_Update_Partial_Lk(t_tree *tree,t_edge *b_fcus,t_node *n); */ void Init_Partial_Lk_Tips_Double(t_tree *tree); void Init_Partial_Lk_Tips_Int(t_tree *tree); void Init_Partial_Lk_At_One_Node(t_node *a, t_tree *tree); void Update_PMat_At_Given_Edge(t_edge *b_fcus, t_tree *tree); void Sort_Sites_Based_On_Lk(t_tree *tree); void Get_Partial_Lk_Scale(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Get_Partial_Lk(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); void Init_Tips_At_One_Site_Nucleotides_Int(char state, int pos, short int *p_pars); void Init_Tips_At_One_Site_AA_Int(char aa, int pos, short int *p_pars); void Update_Partial_Lk_Along_A_Path(t_node **path, int path_length, t_tree *tree); phydbl Lk_Dist(phydbl *F, phydbl dist, t_mod *mod); phydbl Update_Lk_At_Given_Edge(t_edge *b_fcus, t_tree *tree); void Update_Partial_Lk_Greedy(t_tree *tree, t_edge *b_fcus, t_node *n); void Get_All_Partial_Lk_Scale_Greedy(t_tree *tree, t_edge *b_fcus, t_node *a, t_node *d); phydbl Lk_Triplet(t_node *a, t_node *d, t_tree *tree); phydbl *Post_Prob_Rates_At_Given_Edge(t_edge *b, phydbl *post_prob, t_tree *tree); phydbl Lk_With_MAP_Branch_Rates(t_tree *tree); void Init_Tips_At_One_Site_Generic_Int(char *state, int ns, int state_len, int pos, short int *p_pars); void Init_Tips_At_One_Site_Generic_Float(char *state, int ns, int state_len, int pos, phydbl *p_lk); void Backup_Partial_Lk(t_node *d, t_edge *b, t_tree *tree); void Restore_Partial_Lk(t_node *d, t_edge *b, t_tree *tree); void Backup_Partial_Scale(t_node *d, t_edge *b, t_tree *tree); void Restore_Partial_Scale(t_node *d, t_edge *b, t_tree *tree); void Init_Partial_Lk_Loc(t_tree *tree); phydbl Lk_Normal_Approx(t_tree *tree); phydbl Wrap_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Part_Lk_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Part_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Geo_Lk(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Diff_Lk_Norm_At_Given_Edge(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_Rates(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_Linreg(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Wrap_Lk_Times(t_edge *b, t_tree *tree, supert_tree *stree); phydbl Lk_LastFirst(t_tree *tree); int Check_Lk_At_Given_Edge(int verbose, t_tree *tree); void Stepwise_Add_Lk(t_tree *tree); void Update_Eigen_Lr(t_edge *b, t_tree *tree); phydbl dLk(phydbl *l, t_edge *b, t_tree *tree); phydbl Lk_Core(int state, int ambiguity_check,phydbl *p_lk_left, phydbl *p_lk_rght,phydbl *Pij_rr,phydbl *tPij_rr,t_edge *b,t_tree *tree); /* void Lk_dLk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, phydbl *lk, phydbl *dlk, t_tree *tree); */ phydbl Lk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, t_tree *tree); phydbl Invariant_Lk(int fact_sum_scale, int site, int *num_prec_issue, t_tree *tree); void Composite_Lk(t_tree *tree); int Sample_Ancestral_Seq_Core(t_node *a, t_node *d, t_edge *b, int r_cat, int site, t_tree *tree); void Default_Update_Partial_Lk(t_tree *tree, t_edge *b, t_node *d); void Lk_dLk_Core_Eigen_Lr(phydbl *expl, phydbl *dot_prod, t_edge *b, phydbl *lk, phydbl *dlk, t_tree *tree); void Lk_dLk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, unsigned int ns, phydbl *lk, phydbl *dlk); phydbl Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns); void Core_Default_Update_Partial_Lk(const t_node *n_v1, const t_node *n_v2, phydbl *plk0, const phydbl *plk1, const phydbl *plk2, const phydbl *Pij1, const phydbl *Pij2, int *sum_scale0, const int *sum_scale1, const int *sum_scale2, const int ns, const int ncatg, const int npatterns, const int apply_scaling, const phydbl *wght); /* phydbl Lk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, int ns); */ /* void Lk_dLk_Core_One_Class_Eigen_Lr(phydbl *dot_prod, phydbl *expl, unsigned int ns, phydbl *lk, phydbl *dlk); */ phydbl Lk_Core_One_Class_No_Eigen_Lr(phydbl *p_lk_left, phydbl *p_lk_rght, phydbl *Pij,phydbl *pi, int ns, int ambiguity_check, int state); void Pull_Scaling_Factors(int site,t_edge *b,t_tree *tree); void Set_All_Partial_Lk(t_node **n_v1, t_node **n_v2,phydbl **p_lk, int **sum_scale, int **p_lk_loc,phydbl **Pij1, phydbl **tPij1, phydbl **p_lk_v1, int **sum_scale_v1,phydbl **Pij2, phydbl **tPij2, phydbl **p_lk_v2, int **sum_scale_v2,t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int *dest_p_idx, int *child1_p_idx, int* child2_p_idx, int* Pij1_idx, int* Pij2_idx #endif ); void Set_Partial_Lk_One_Side(phydbl **Pij, phydbl **tPij, phydbl **p_lk, int **sum_scale, t_node *d, t_edge *b, t_tree *tree #ifdef BEAGLE , int* child_p_idx, int* Pij_idx #endif ); void Rate_Correction(int exponent, phydbl *site_lk_cat); void Switch_Partial_Lk_Pre(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree); void Switch_Partial_Lk_Post(t_node *a, t_node *d, t_edge *b, short int yesno, t_tree *tree); void Partial_Lk_Inin(const phydbl *Pij1, const phydbl *plk1, const phydbl *Pij2, const phydbl *plk2, const int ns, phydbl *plk0); void Partial_Lk_Exex(const phydbl *Pij1, const int state1, const phydbl *Pij2, const int state2, const int ns, phydbl *plk0); void Partial_Lk_Exin(const phydbl *Pij1, const int state1, const phydbl *Pij2, const phydbl *plk2, const int ns, phydbl *plk0); #endif phyml-3.3.20220408/src/location.c000066400000000000000000000152001422404706600161560ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines that implement the spatial part of Etheridge and Barton's model of continuous-space coalescent and other models of migration/spatial dispersion. */ #include "location.h" ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #ifdef PHYREX phydbl LOCATION_Lk(t_tree *tree) { phydbl lnL; lnL = UNLIKELY; if(tree->mmod->use_locations == NO) { tree->mmod->c_lnL = 0.0; return(tree->mmod->c_lnL); } switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnL = SLFV_Lk_Gaussian(tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RRW_GAMMA : case RRW_LOGNORMAL : { if(tree->mmod->integrateAncestralLocations == NO) lnL = RRW_Lk(tree); else lnL = RRW_Independent_Contrasts(tree); break; } case RW : { lnL = RW_Lk(tree); break; } default : assert(false); } if(isinf(lnL) || isnan(lnL)) lnL = UNLIKELY; tree->mmod->c_lnL = lnL; return(tree->mmod->c_lnL); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Prior(t_tree *tree) { phydbl lnP; lnP = 0.0; if(tree->mmod->use_locations == NO) { tree->mmod->c_lnL = 0.0; return(tree->mmod->c_lnL); } switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnP = UNLIKELY; break; } case SLFV_UNIFORM : { lnP = UNLIKELY; break; } case RRW_GAMMA : case RRW_LOGNORMAL : { lnP = RRW_Prior(tree); break; } case RW : { lnP = RW_Prior(tree); break; } default : assert(false); } if(isinf(lnP) || isnan(lnP)) lnP = UNLIKELY; tree->mmod->c_lnP = lnP; return(tree->mmod->c_lnP); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree) { if(tree->mmod->use_locations == NO) return(0.0); switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { return(SLFV_Lk_Gaussian_Range(young,old,tree)); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { return(RRW_Lk_Range(young,old,tree)); break; } default : assert(FALSE); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk_Path(t_dsk *young, t_dsk *old, t_tree *tree) { if(tree->mmod->use_locations == NO) return(0.0); switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { return(SLFV_Lk_Gaussian_Range(young,old,tree)); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { return(RRW_Forward_Lk_Path(old->ldsk,young->ldsk,tree)); break; } default : assert(FALSE); } return(-1.); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree) { phydbl lnL; lnL = UNLIKELY; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { assert(false); break; } case SLFV_UNIFORM : { assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { lnL = RRW_Forward_Lk_Path(a,d,tree); break; } default : assert(FALSE); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl LOCATION_Lk_Core(t_dsk *disk, t_tree *tree) { phydbl lnL; switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { lnL = SLFV_Lk_Gaussian_Core(disk,tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { lnL = RRW_Lk_Core(disk,tree); break; } default : assert(FALSE); } return lnL; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void LOCATION_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree) { switch(tree->mmod->model_id) { case SLFV_GAUSSIAN : { SLFV_Sample_Path(young,old,sd,global_hr,tree); break; } case SLFV_UNIFORM : { PhyML_Fprintf(stderr,"\n. SLFV model with rectangle is not implemented. Sorry..."); assert(false); break; } case RW : case RRW_GAMMA : case RRW_LOGNORMAL : { assert(false); break; } default : assert(FALSE); } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// char *LOCATION_Model_Id(t_phyrex_mod *mmod) { char *s; s = (char *)mCalloc(T_MAX_LINE,sizeof(char)); strcpy(s,"none"); switch(mmod->model_id) { case SLFV_GAUSSIAN : { strcpy(s,"spatial coalescent (Gaussian)"); break; } case SLFV_UNIFORM : { strcpy(s,"spatial coalescent (Rectangle)"); break; } case RW : { strcpy(s,"strict random walk"); break; } case RRW_GAMMA : { strcpy(s,"relaxed random walk (Gamma)"); break; } case RRW_LOGNORMAL : { strcpy(s,"relaxed random walk (Lognormal)"); break; } default : assert(FALSE); } return(s); } #endif phyml-3.3.20220408/src/location.h000066400000000000000000000015321422404706600161660ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ #include #ifndef LOCATION_H #define LOCATION_H #include "utilities.h" phydbl LOCATION_Lk(t_tree *tree); phydbl LOCATION_Prior(t_tree *tree); phydbl LOCATION_Lk_Range(t_dsk *young, t_dsk *old, t_tree *tree); phydbl LOCATION_Lk_Core(t_dsk *disk, t_tree *tree); void LOCATION_Sample_Path(t_ldsk *young, t_ldsk *old, phydbl *sd, phydbl *global_hr, t_tree *tree); phydbl LOCATION_Lk_Path(t_dsk *young, t_dsk *old, t_tree *tree); char *LOCATION_Model_Id(t_phyrex_mod *mmod); phydbl LOCATION_Forward_Lk_Path(t_ldsk *a, t_ldsk *d, t_tree *tree); #endif phyml-3.3.20220408/src/m4.c000066400000000000000000001401161422404706600146730ustar00rootroot00000000000000/* PhyML: a program that computes maximum likelihood phylogenies from DNA or AA homologous sequences. Copyright (C) Stephane Guindon. Oct 2003 onward. All parts of the source except where indicated are distributed under the GNU public licence. See http://www.opensource.org for details. */ /* Routines for Markov-Modulated Markov Models (M4) */ #include "m4.h" int M4_main(int argc, char **argv) { calign *cdata; option *io; t_tree *tree; int num_data_set; int num_tree,num_rand_tree; t_mod *mod; time_t t_beg,t_end; phydbl best_lnL; int r_seed; char *most_likely_tree=NULL; #ifdef MPI int rc; rc = MPI_Init(&argc,&argv); if (rc != MPI_SUCCESS) { PhyML_Printf("\n== Err. starting MPI program. Terminating.\n"); MPI_Abort(MPI_COMM_WORLD, rc); } MPI_Comm_size(MPI_COMM_WORLD,&Global_numTask); MPI_Comm_rank(MPI_COMM_WORLD,&Global_myRank); #endif #ifdef QUIET setvbuf(stdout,NULL,_IOFBF,2048); #endif tree = NULL; mod = NULL; best_lnL = UNLIKELY; io = (option *)Get_Input(argc,argv); r_seed = (io->r_seed < 0)?(time(NULL)):(io->r_seed); srand(r_seed); io->r_seed = r_seed; if(io->in_tree == 2) Test_Multiple_Data_Set_Format(io); else io->n_trees = 1; if((io->n_data_sets > 1) && (io->n_trees > 1)) { io->n_data_sets = MIN(io->n_trees,io->n_data_sets); io->n_trees = MIN(io->n_trees,io->n_data_sets); } for(num_data_set=0;num_data_setn_data_sets;num_data_set++) { best_lnL = UNLIKELY; Get_Seq(io); Make_Model_Complete(io->mod); Set_Model_Name(io->mod); Print_Settings(io); mod = io->mod; if(io->data) { if(io->n_data_sets > 1) PhyML_Printf("\n. Data set [#%d]\n",num_data_set+1); cdata = Compact_Data(io->data,io); Free_Seq(io->data,cdata->n_otu); if(cdata) Check_Ambiguities(cdata,io->datatype,io->state_len); else { PhyML_Printf("\n== Err. in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } for(num_tree=(io->n_trees == 1)?(0):(num_data_set);num_tree < io->n_trees;num_tree++) { if(!io->mod->s_opt->random_input_tree) io->mod->s_opt->n_rand_starts = 1; for(num_rand_tree=0;num_rand_treemod->s_opt->n_rand_starts;num_rand_tree++) { if((io->mod->s_opt->random_input_tree) && (io->mod->s_opt->topo_search != NNI_MOVE)) if(!io->quiet) PhyML_Printf("\n. [Random start %3d/%3d]\n",num_rand_tree+1,io->mod->s_opt->n_rand_starts); Init_Model(cdata,mod,io); if(io->mod->use_m4mod) M4_Init_Model(mod->m4mod,cdata,mod); switch(io->in_tree) { case 0 : case 1 : { tree = Dist_And_BioNJ(cdata,mod,io); break; } case 2 : { tree = Read_User_Tree(cdata,mod,io); break; } } if(!tree) continue; time(&t_beg); time(&(tree->t_beg)); tree->mod = mod; tree->io = io; tree->data = cdata; tree->n_pattern = tree->data->crunch_len; Set_Both_Sides(YES,tree); if(mod->s_opt->random_input_tree) Random_Tree(tree); if((!num_data_set) && (!num_tree) && (!num_rand_tree)) Check_Memory_Amount(tree); Make_Tree_For_Pars(tree); Make_Tree_For_Lk(tree); Make_Spr(tree); if(io->do_alias_subpatt) { MIXT_Set_Alias_Subpatt(YES,tree); Lk(NULL,tree); MIXT_Set_Alias_Subpatt(NO,tree); } if(tree->mod->s_opt->opt_topo) { if(tree->mod->s_opt->topo_search == NNI_MOVE) Simu_Loop(tree); else if(tree->mod->s_opt->topo_search == SPR_MOVE) Global_Spr_Search(tree); else Best_Of_NNI_And_SPR(tree); } else { if(tree->mod->s_opt->opt_subst_param || tree->mod->s_opt->opt_bl) Round_Optimize(tree,ROUND_MAX); else Lk(NULL,tree); } Set_Both_Sides(YES,tree); Lk(NULL,tree); Pars(NULL,tree); Get_Tree_Size(tree); PhyML_Printf("\n. Log likelihood of the current tree: %f.\n",tree->c_lnL); Exit("\n"); /* */ M4_Compute_Proba_Hidden_States_On_Edges(tree); /* */ Get_Best_Root_Position(tree); /* Print the tree estimated using the current random (or BioNJ) starting tree */ if(io->mod->s_opt->n_rand_starts > 1) { Br_Len_Involving_Invar(tree); Print_Tree(io->fp_out_trees,tree); fflush(NULL); } /* Record the most likely tree in a string of characters */ if(tree->c_lnL > best_lnL) { best_lnL = tree->c_lnL; Br_Len_Involving_Invar(tree); if(most_likely_tree) Free(most_likely_tree); most_likely_tree = Write_Tree(tree); Get_Tree_Size(tree); } /* JF(tree); */ time(&t_end); Print_Fp_Out(io->fp_out_stats,t_beg,t_end,tree, io,num_data_set+1, (tree->mod->s_opt->n_rand_starts > 1)? (num_rand_tree):(num_tree),YES, io->precision); if(tree->io->print_site_lnl) Print_Site_Lk(tree,io->fp_out_lk); /* Start from BioNJ tree */ if((num_rand_tree == io->mod->s_opt->n_rand_starts-1) && (tree->mod->s_opt->random_input_tree)) { /* Do one more iteration in the loop, but don't randomize the tree */ num_rand_tree--; tree->mod->s_opt->random_input_tree = 0; } Free_Spr_List_One_Edge(tree); Free_One_Spr(tree->best_spr); if(tree->mat) Free_Mat(tree->mat); Free_Tree_Pars(tree); Free_Tree_Lk(tree); Free_Tree(tree); } /* Launch bootstrap analysis */ if(io->do_boot || io->do_tbe) { if(!io->quiet) PhyML_Printf("\n. Launch bootstrap analysis on the most likely tree...\n"); #ifdef MPI MPI_Bcast (most_likely_tree, strlen(most_likely_tree)+1, MPI_CHAR, 0, MPI_COMM_WORLD); if(!io->quiet) PhyML_Printf("\n. The bootstrap analysis will use %d CPUs.\n",Global_numTask); #endif most_likely_tree = Bootstrap_From_String(most_likely_tree,cdata,mod,io); } else if(io->ratio_test) { /* Launch aLRT */ if(!io->quiet) PhyML_Printf("\n. Compute aLRT branch supports on the most likely tree...\n"); most_likely_tree = aLRT_From_String(most_likely_tree,cdata,mod,io); } /* Print the most likely tree in the output file */ if(!io->quiet) PhyML_Printf("\n. Printing the most likely tree in file '%s'...\n", Basename(io->out_tree_file)); if(io->n_data_sets == 1) rewind(io->fp_out_tree); PhyML_Fprintf(io->fp_out_tree,"%s\n",most_likely_tree); if(io->n_trees > 1 && io->n_data_sets > 1) break; } Free_Calign(cdata); } else { PhyML_Printf("\n. No data was found.\n"); PhyML_Printf("\n. Err in file %s at line %d\n",__FILE__,__LINE__); Warn_And_Exit(""); } Free_Model_Complete(mod); } if(most_likely_tree) Free(most_likely_tree); if(mod->s_opt->n_rand_starts > 1) PhyML_Printf("\n. Best log likelihood: %f\n",best_lnL); Free_Optimiz(mod->s_opt); Free_Model_Basic(mod); if(io->fp_in_align) fclose(io->fp_in_align); if(io->fp_in_tree) fclose(io->fp_in_tree); if(io->fp_out_lk) fclose(io->fp_out_lk); if(io->fp_out_tree) fclose(io->fp_out_tree); if(io->fp_out_trees) fclose(io->fp_out_trees); if(io->fp_out_stats) fclose(io->fp_out_stats); Free_Input(io); time(&t_end); Print_Time_Info(t_beg,t_end); #ifdef MPI MPI_Finalize(); #endif return 0; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Allocate memory */ m4 *M4_Make_Light() { m4 *m4mod; m4mod = (m4 *)mCalloc(1,sizeof(m4)); M4_Set_M4mod_Default(m4mod); return m4mod; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Set_M4mod_Default(m4 *m4mod) { m4mod->use_cov_alpha = 1; m4mod->use_cov_alpha = 0; m4mod->n_h = 3; m4mod->n_o = 4; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Allocate memory */ void M4_Make_Complete(int n_h, int n_o, m4 *m4mod) { int i; m4mod->n_h = n_h; m4mod->n_o = n_o; m4mod->n_o = n_o; m4mod->o_rr = (phydbl *)mCalloc(n_o*n_o,sizeof(phydbl)); m4mod->o_fq = (phydbl *)mCalloc(n_o,sizeof(phydbl)); m4mod->o_mats = (phydbl **)mCalloc(n_h,sizeof(phydbl *)); for(i=0;io_mats[i] = (phydbl *)mCalloc(n_o*n_o,sizeof(phydbl)); m4mod->h_mat = (phydbl *)mCalloc(n_h*n_h,sizeof(phydbl)); m4mod->h_rr = (phydbl *)mCalloc(n_h*n_h,sizeof(phydbl)); m4mod->h_fq = (phydbl *)mCalloc(n_h,sizeof(phydbl)); m4mod->multipl = (phydbl *)mCalloc(n_h,sizeof(phydbl)); m4mod->multipl_unscaled = (phydbl *)mCalloc(n_h,sizeof(phydbl)); m4mod->h_fq_unscaled = (phydbl *)mCalloc(n_h,sizeof(phydbl)); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Fill in the (big) rate matrix of the M4 t_mod */ void M4_Update_Qmat(m4 *m4mod, t_mod *mod) { int i,j; int n_s, n_o, n_h; phydbl mr, sum; /* The number of states in M4 models is the product of the number of hidden states (or classes) by the number of observable states */ n_s = mod->ns; n_o = m4mod->n_o; n_h = m4mod->n_h; /* Set the relative substitution rates */ if(mod->m4mod->use_cov_alpha) { DiscreteGamma(m4mod->h_fq,m4mod->multipl,m4mod->alpha,m4mod->alpha,m4mod->n_h,mod->ras->gamma_median); } else if(mod->m4mod->use_cov_free) { sum = .0; for(i=0;im4mod->n_h;i++) sum += FABS(mod->m4mod->h_fq_unscaled[i]); for(i=0;im4mod->n_h;i++) mod->m4mod->h_fq[i] = FABS(mod->m4mod->h_fq_unscaled[i])/sum; do { sum = .0; for(i=0;im4mod->n_h;i++) { if(mod->m4mod->h_fq[i] < 0.01) mod->m4mod->h_fq[i]=0.01; if(mod->m4mod->h_fq[i] > 0.99) mod->m4mod->h_fq[i]=0.99; sum += mod->m4mod->h_fq[i]; } for(i=0;im4mod->n_h;i++) mod->m4mod->h_fq[i]/=sum; } while((sum > 1.01) || (sum < 0.99)); /* Make sure the multipliers are centered on 1.0 */ sum = .0; for(i=0;im4mod->n_h;i++) sum += FABS(mod->m4mod->multipl_unscaled[i]) * mod->m4mod->h_fq[i]; for(i=0;im4mod->n_h;i++) mod->m4mod->multipl[i] = mod->m4mod->multipl_unscaled[i] / sum; /* printf("\n. WARNING\n"); */ /* mod->m4mod->h_fq[0] = 1./3; */ /* mod->m4mod->h_fq[1] = 1./3; */ /* mod->m4mod->h_fq[2] = 1./3; */ /* mod->m4mod->multipl[0] = 1.0; */ /* mod->m4mod->multipl[1] = 1.0; */ /* mod->m4mod->multipl[2] = 1.0; */ sum = 0; for(i=0;im4mod->n_h;i++) sum += mod->m4mod->multipl[i] * mod->m4mod->h_fq[i]; if(sum < 0.99 || sum > 1.01) { PhyML_Printf("\n. sum = %f",sum); PhyML_Printf("\n. Err in file %s at line %d\n\n",__FILE__,__LINE__); Warn_And_Exit("\n"); } /* PhyML_Printf("\n__ "); */ /* for(i=0;im4mod->n_h;i++) PhyML_Printf("\n.%f %f %f", */ /* mod->m4mod->h_fq[i], */ /* mod->m4mod->h_fq_unscaled[i], */ /* mod->m4mod->multipl[i]); */ } /* PhyML_Printf("\n."); */ /* PhyML_Printf("\n. M4 model parameters"); */ /* m4mod->delta=.0; */ /* PhyML_Printf("\n. Delta = %f",m4mod->delta); */ /* for(i=0;im4mod->n_h;i++) PhyML_Printf("\n. multipl %d = %f",i,m4mod->multipl[i]); */ /* for(i=0;im4mod->n_h;i++) PhyML_Printf("\n. fq %d = %f",i,m4mod->h_fq[i]); */ /* Set up the stationary frequency vector */ for(i=0;ie_frq->pi->v[i] = m4mod->o_fq[i%n_o] * m4mod->h_fq[i/n_o]; if(mod->whichmodel != CUSTOM && mod->whichmodel != GTR && mod->io->datatype == NT) { phydbl kappa1,kappa2; if((mod->whichmodel != F84) && (mod->whichmodel != TN93)) mod->lambda->v = 1.; else if(mod->whichmodel == F84) { mod->lambda->v = Get_Lambda_F84(mod->e_frq->pi->v,&(mod->kappa->v)); } kappa2 = mod->kappa->v*2./(1.+mod->lambda->v); kappa1 = kappa2 * mod->lambda->v; /* A <-> C */ m4mod->o_rr[0] = 1.0; /* A <-> G */ m4mod->o_rr[1] = kappa2; /* A <-> T */ m4mod->o_rr[2] = 1.0; /* C <-> G */ m4mod->o_rr[3] = 1.0; /* C <-> T */ m4mod->o_rr[4] = kappa1; } /* Fill in the matrices of nucleotide or amino-acid substitution rates here */ Update_Qmat_Generic(m4mod->o_rr, m4mod->o_fq, m4mod->n_o, m4mod->o_mats[0]); /* Print_Square_Matrix_Generic(n_o,m4mod->o_mats[0]); */ /* Multiply each of these matrices by a relative substitution rate */ for(i=1;in_h;i++) For(j,n_o*n_o) m4mod->o_mats[i][j] = m4mod->o_mats[0][j]*m4mod->multipl[i]; For(j,n_o*n_o) m4mod->o_mats[0][j] *= m4mod->multipl[0]; For(i,n_s*n_s) mod->r_mat->qmat->v[i] = .0; /* Diagonal blocks (i.e, nucleotide substitutions), symmetric */ for(i=0;ir_mat->qmat->v[i*n_s+j] = m4mod->o_mats[(int)(i/n_o)][(i%n_o)*n_o+j%n_o]; mod->r_mat->qmat->v[j*n_s+i] = mod->r_mat->qmat->v[i*n_s+j] * m4mod->o_fq[i%n_o] / m4mod->o_fq[j%n_o]; } } } /* Work out scaling factor such that the expected number of observed state substitution along a branch of length 1 is 1.*/ mr = .0; for(i=0;ir_mat->qmat->v[i*n_s+j]; mr += sum * m4mod->o_fq[i%n_o] * m4mod->h_fq[(int)(i/n_o)]; } /* Scale the diagonal blocks */ For(i,n_s*n_s) mod->r_mat->qmat->v[i] /= mr; /* We are done with the diagonal blocks. Let's fill the non-diagonal ones now. */ /* Fill the matrix of substitution rate across classes (switches) here */ Update_Qmat_Generic(m4mod->h_rr, m4mod->h_fq, m4mod->n_h, m4mod->h_mat); /* Print_Square_Matrix_Generic(m4mod->n_h,m4mod->h_mat); */ /* Multiply this matrix by the switching rate */ For(i,n_h*n_h) m4mod->h_mat[i] *= m4mod->delta; /* Fill the non diagonal blocks */ for(i=0;ir_mat->qmat->v[i*n_s+j] = m4mod->h_mat[(int)(i/n_o)*n_h+(int)(j/n_o)]; mod->r_mat->qmat->v[j*n_s+i] = mod->r_mat->qmat->v[i*n_s+j] * m4mod->h_fq[(int)(i/n_o)] / m4mod->h_fq[(int)(j/n_o)]; } } } } /* Note: class equilibrium frequencies are already built in the h_mat matrix. No need to 'add' these frequencies later on. */ /* We are done with the non diagonal blocks */ /* Diagonal cells */ for(i=0;ir_mat->qmat->v[i*n_s+j]; } mod->r_mat->qmat->v[i*n_s+i] = -sum; } For(i,n_s*n_s) mod->eigen->q[i] = mod->r_mat->qmat->v[i]; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Init_Partial_Lk_Tips_Double(t_tree *tree) { int curr_site,i,j,k,l,dim1,dim2,dim3; dim1 = tree->mod->ras->n_catg * tree->mod->m4mod->n_h * tree->mod->m4mod->n_o; dim2 = tree->mod->m4mod->n_h * tree->mod->m4mod->n_o; dim3 = tree->mod->m4mod->n_o; Fors(curr_site,tree->data->crunch_len,tree->mod->io->state_len) { for(i=0;in_otu;i++) { for(j=1;jmod->m4mod->n_h;j++) { for(k=0;kmod->m4mod->n_o;k++) { tree->a_nodes[i]->b[0]->p_lk_rght[curr_site*dim1 + 0*dim2 + j*dim3+k] = tree->a_nodes[i]->b[0]->p_lk_rght[curr_site*dim1 + 0*dim2 + 0*dim3+k]; printf("\n() i=%d plk=%f", curr_site*dim1 + 0*dim2 + j*dim3+k, tree->a_nodes[i]->b[0]->p_lk_rght[curr_site*dim1 + 0*dim2 + j*dim3+k]); /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][0][j*tree->mod->m4mod->n_o+k] = */ /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][0][k]; */ } for(k=0;kmod->m4mod->n_o;k++) for(l=1;lmod->ras->n_catg;l++) tree->a_nodes[i]->b[0]->p_lk_rght[curr_site*dim1 + l*dim2 + j*dim3+k] = tree->a_nodes[i]->b[0]->p_lk_rght[curr_site*dim1 + 0*dim2 + j*dim3+k]; /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][l][j*tree->mod->m4mod->n_o+k] = */ /* tree->a_nodes[i]->b[0]->p_lk_rght[curr_site][0][j*tree->mod->m4mod->n_o+k]; */ } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void M4_Init_Partial_Lk_Tips_Int(t_tree *tree) { int curr_site,i,j,k,dim2,dim3; dim2 = tree->mod->m4mod->n_h * tree->mod->m4mod->n_o; dim3 = tree->mod->m4mod->n_o; Fors(curr_site,tree->data->crunch_len,tree->mod->io->state_len) { for(i=0;in_otu;i++) { for(j=1;jmod->m4mod->n_h;j++) { for(k=0;kmod->m4mod->n_o;k++) { tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site*dim2 + j*dim3+k] = tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site*dim2 + 0*dim3+k]; /* tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site][j*tree->mod->m4mod->n_o+k] = */ /* tree->a_nodes[i]->b[0]->p_lk_tip_r[curr_site][k]; */ } } } } } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// phydbl ****M4_Integral_Term_On_One_Edge(t_edge *b, t_tree *tree) { phydbl ****integral,*P1,*P2; int ns; int g,i,j,k,l; int step; ns = tree->mod->ns; P1 = (phydbl *)mCalloc(tree->mod->ras->n_catg*ns*ns,sizeof(phydbl)); P2 = (phydbl *)mCalloc(tree->mod->ras->n_catg*ns*ns,sizeof(phydbl)); integral = (phydbl ****)mCalloc(tree->mod->ras->n_catg,sizeof(phydbl ***)); for(g=0;gmod->ras->n_catg;g++) { integral[g] = (phydbl ***)mCalloc(ns,sizeof(phydbl **)); for(j=0;jmod->ras->n_catg;g++) { PMat(((phydbl)(i+0.5)/step)*b->l->v*tree->mod->ras->gamma_rr->v[g],tree->mod,g*ns*ns,P1,NULL); PMat(((phydbl)(step-i-0.5)/step)*b->l->v*tree->mod->ras->gamma_rr->v[g],tree->mod,g*ns*ns,P2,NULL); for(j=0;j