commit 0ff459072bc4dba97438889e36cec47add9c21da Author: Tony George Date: Sat Oct 5 11:04:20 2013 +0530 Initial release diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..89374f5 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,3 @@ + +Copyright (C) 2013 Tony George (teejee2008@gmail.com) + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + 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 +. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..6e90e07 --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/README b/README new file mode 100644 index 0000000..2b40bc4 --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +TimeShift +============ + +A system restore utility for Linux. diff --git a/THANKS b/THANKS new file mode 100644 index 0000000..e69de29 diff --git a/TODO b/TODO new file mode 100644 index 0000000..e3cadde --- /dev/null +++ b/TODO @@ -0,0 +1,12 @@ + + * Save only relevant settings to JSON files + * Remove/Simplify official folders + * Change package description + * Implement file monitoring + + single timeshift app + + Restore + --------- + --restore + --restore "path" diff --git a/build-binary b/build-binary new file mode 100755 index 0000000..bc13c93 --- /dev/null +++ b/build-binary @@ -0,0 +1,3 @@ +rm -rf ../builds +bzr builddeb --native --build-dir ../builds/temp --result-dir ../builds +ls -l ../builds diff --git a/build-install b/build-install new file mode 100755 index 0000000..ce6a910 --- /dev/null +++ b/build-install @@ -0,0 +1,4 @@ +./build-binary +sudo gdebi --non-interactive ../builds/timeshift*.deb +echo "Finished" +read dummy diff --git a/build-installer b/build-installer new file mode 100755 index 0000000..1003ea3 --- /dev/null +++ b/build-installer @@ -0,0 +1,32 @@ +#!/bin/bash + +rm -rfd ./installer/32bit/share +rm -rfd ./installer/64bit/share + +mkdir -p ./installer/32bit/share +mkdir -p ./installer/64bit/share + +cp -rfd -p --no-preserve=ownership -t ./installer/32bit/share ./src/share/* +cp -rfd -p --no-preserve=ownership -t ./installer/64bit/share ./src/share/* + +cp -rfd -p --no-preserve=ownership -t ./installer/32bit ./src/TimeShift.desktop +cp -rfd -p --no-preserve=ownership -t ./installer/64bit ./src/TimeShift.desktop + +chmod u+x ./installer/install.sh +cp -rfd -p --no-preserve=ownership -t ./installer/32bit ./installer/install.sh +cp -rfd -p --no-preserve=ownership -t ./installer/64bit ./installer/install.sh + +makeself ./installer/32bit ./installer/timeshift-32bit-setup.run "TimeShift (32-bit)" ./install.sh +makeself ./installer/64bit ./installer/timeshift-64bit-setup.run "TimeShift (64-bit)" ./install.sh + +rm -rfd ./installer/32bit/share +rm -rfd ./installer/64bit/share + +rm -f ./installer/32bit/TimeShift.desktop +rm -f ./installer/64bit/TimeShift.desktop + +rm -f ./installer/32bit/makefile +rm -f ./installer/64bit/makefile + +rm -f ./installer/32bit/install.sh +rm -f ./installer/64bit/install.sh diff --git a/build-source b/build-source new file mode 100755 index 0000000..e2ac945 --- /dev/null +++ b/build-source @@ -0,0 +1,3 @@ +rm -rf ../builds +bzr builddeb --source --native --build-dir ../builds/temp --result-dir ../builds +ls -l ../builds diff --git a/compile-install-translations b/compile-install-translations new file mode 100755 index 0000000..f00287c --- /dev/null +++ b/compile-install-translations @@ -0,0 +1,9 @@ +#msgfmt -c po/ca.po -o build/locale/LC_MESSAGES/or/timeshift.mo + +sudo locale-gen or_IN +msgfmt -c -v -o timeshift.mo oriya.po +sudo mkdir -p /usr/share/locale/or/LC_MESSAGES +sudo cp timeshift.mo /usr/share/locale/or/LC_MESSAGES + +echo "Finished" +read dummy diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..5929bc4 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,7 @@ +timeshift (1.0.1) quantal; urgency=low + + * Rev:1, 2013-10-05 + + * Initial Release + + -- Tony George Sat, 05 Oct 2013 10:00:00 +0530 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +8 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..ccba0da --- /dev/null +++ b/debian/control @@ -0,0 +1,20 @@ +Source: timeshift +Section: utils +Priority: extra +Maintainer: Tony George +Build-Depends: debhelper (>= 8.0.0), autotools-dev, valac, libgtk-3-dev, libgee-dev, libsoup2.4-dev, libjson-glib-dev +Standards-Version: 3.9.3 +Homepage: http://teejeetech.blogspot.in/ +#Vcs-Git: git://git.debian.org/collab-maint/hello.git +#Vcs-Browser: http://git.debian.org/?p=collab-maint/hello.git;a=summary + +Package: timeshift +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libgtk-3-0, libgee2, rsync, gksu, libblkid1 +#Recommends: +Description: A system restore utility for Linux + TimeShift is a utility which provides features similar to "System Restore" + in Windows and "Time Machine" in Mac OS. Snapshots of the file system are taken + at regular intervals which can be restored at a later date + to undo system changes. Snapshots can be restored from the running system + or by booting from a Live CD. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..d86b12e --- /dev/null +++ b/debian/copyright @@ -0,0 +1,23 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: timeshift +Source: + +Files: * +Copyright: 2013 Tony George +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package 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 + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..992d94f --- /dev/null +++ b/debian/docs @@ -0,0 +1,3 @@ +doc/README +doc/changelog + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..465d63b --- /dev/null +++ b/debian/rules @@ -0,0 +1,15 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +override_dh_usrlocal: + +%: + dh $@ --with autotools-dev diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/doc/README b/doc/README new file mode 120000 index 0000000..c9f82bf --- /dev/null +++ b/doc/README @@ -0,0 +1 @@ +/home/teejee/projects/timeshift/README \ No newline at end of file diff --git a/doc/changelog b/doc/changelog new file mode 120000 index 0000000..e43ffb7 --- /dev/null +++ b/doc/changelog @@ -0,0 +1 @@ +/home/teejee/projects/timeshift/debian/changelog \ No newline at end of file diff --git a/extract-strings b/extract-strings new file mode 100755 index 0000000..51ff6da --- /dev/null +++ b/extract-strings @@ -0,0 +1,4 @@ +xgettext --language=C --keyword=_ --copyright-holder='Tony George (teejee2008@gmail.com)' --package-name='timeshift' --package-version='1.0' --msgid-bugs-address='teejee2008@gmail.com' --escape --sort-output -o timeshift.pot src/*.vala + +echo "Finished" +read dummy diff --git a/installer/64bit/timeshift b/installer/64bit/timeshift new file mode 100755 index 0000000..110f7fe Binary files /dev/null and b/installer/64bit/timeshift differ diff --git a/installer/install.sh b/installer/install.sh new file mode 100755 index 0000000..bfc1203 --- /dev/null +++ b/installer/install.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +prefix=/usr +bindir=${prefix}/bin +sharedir=${prefix}/share +localedir=${sharedir}/locale +launcherdir=${sharedir}/applications + +echo "Installing files..." + +mkdir -p "${bindir}" +mkdir -p "${sharedir}" +mkdir -p "${launcherdir}" +mkdir -p "${sharedir}/timeshift" +mkdir -p "${sharedir}/pixmaps" +mkdir -p "/mnt/timeshift" + +#binary +install -m 0755 timeshift "${bindir}" + +#shared files +cp -dpr --no-preserve=ownership -t "${sharedir}/timeshift" ./share/timeshift/* +chmod --recursive 0755 ${sharedir}/timeshift/* + +#launcher +install -m 0755 TimeShift.desktop "${launcherdir}" + +#app icon +install -m 0755 ./share/pixmaps/timeshift.png "${sharedir}/pixmaps/" + + +if [ $? -eq 0 ]; then + echo "TimeShift was installed successfully" + echo "Use the shortcut in the application menu or run: sudo timeshift" +else + echo "Installation failed!" + exit 1 +fi diff --git a/installer/timeshift-32bit-setup.run b/installer/timeshift-32bit-setup.run new file mode 100755 index 0000000..7195d54 --- /dev/null +++ b/installer/timeshift-32bit-setup.run @@ -0,0 +1,446 @@ +#!/bin/sh +# This script was generated using Makeself 2.1.5 + +CRCsum="2159697763" +MD5="a759721086cf8275f83b2f38b79f108e" +TMPROOT=${TMPDIR:=/tmp} + +label="TimeShift (32-bit)" +script="./install.sh" +scriptargs="" +targetdir="32bit" +filesizes="15220" +keep=n + +print_cmd_arg="" +if type printf > /dev/null; then + print_cmd="printf" +elif test -x /usr/ucb/echo; then + print_cmd="/usr/ucb/echo" +else + print_cmd="echo" +fi + +unset CDPATH + +MS_Printf() +{ + $print_cmd $print_cmd_arg "$1" +} + +MS_Progress() +{ + while read a; do + MS_Printf . + done +} + +MS_diskspace() +{ + ( + if test -d /usr/xpg4/bin; then + PATH=/usr/xpg4/bin:$PATH + fi + df -kP "$1" | tail -1 | awk '{print $4}' + ) +} + +MS_dd() +{ + blocks=`expr $3 / 1024` + bytes=`expr $3 % 1024` + dd if="$1" ibs=$2 skip=1 obs=1024 conv=sync 2> /dev/null | \ + { test $blocks -gt 0 && dd ibs=1024 obs=1024 count=$blocks ; \ + test $bytes -gt 0 && dd ibs=1 obs=1024 count=$bytes ; } 2> /dev/null +} + +MS_Help() +{ + cat << EOH >&2 +Makeself version 2.1.5 + 1) Getting help or info about $0 : + $0 --help Print this message + $0 --info Print embedded info : title, default target directory, embedded script ... + $0 --lsm Print embedded lsm entry (or no LSM) + $0 --list Print the list of files in the archive + $0 --check Checks integrity of the archive + + 2) Running $0 : + $0 [options] [--] [additional arguments to embedded script] + with following options (in that order) + --confirm Ask before running embedded script + --noexec Do not run embedded script + --keep Do not erase target directory after running + the embedded script + --nox11 Do not spawn an xterm + --nochown Do not give the extracted files to the current user + --target NewDirectory Extract in NewDirectory + --tar arg1 [arg2 ...] Access the contents of the archive through the tar command + -- Following arguments will be passed to the embedded script +EOH +} + +MS_Check() +{ + OLD_PATH="$PATH" + PATH=${GUESS_MD5_PATH:-"$OLD_PATH:/bin:/usr/bin:/sbin:/usr/local/ssl/bin:/usr/local/bin:/opt/openssl/bin"} + MD5_ARG="" + MD5_PATH=`exec <&- 2>&-; which md5sum || type md5sum` + test -x "$MD5_PATH" || MD5_PATH=`exec <&- 2>&-; which md5 || type md5` + test -x "$MD5_PATH" || MD5_PATH=`exec <&- 2>&-; which digest || type digest` + PATH="$OLD_PATH" + + MS_Printf "Verifying archive integrity..." + offset=`head -n 401 "$1" | wc -c | tr -d " "` + verb=$2 + i=1 + for s in $filesizes + do + crc=`echo $CRCsum | cut -d" " -f$i` + if test -x "$MD5_PATH"; then + if test `basename $MD5_PATH` = digest; then + MD5_ARG="-a md5" + fi + md5=`echo $MD5 | cut -d" " -f$i` + if test $md5 = "00000000000000000000000000000000"; then + test x$verb = xy && echo " $1 does not contain an embedded MD5 checksum." >&2 + else + md5sum=`MS_dd "$1" $offset $s | eval "$MD5_PATH $MD5_ARG" | cut -b-32`; + if test "$md5sum" != "$md5"; then + echo "Error in MD5 checksums: $md5sum is different from $md5" >&2 + exit 2 + else + test x$verb = xy && MS_Printf " MD5 checksums are OK." >&2 + fi + crc="0000000000"; verb=n + fi + fi + if test $crc = "0000000000"; then + test x$verb = xy && echo " $1 does not contain a CRC checksum." >&2 + else + sum1=`MS_dd "$1" $offset $s | CMD_ENV=xpg4 cksum | awk '{print $1}'` + if test "$sum1" = "$crc"; then + test x$verb = xy && MS_Printf " CRC checksums are OK." >&2 + else + echo "Error in checksums: $sum1 is different from $crc" + exit 2; + fi + fi + i=`expr $i + 1` + offset=`expr $offset + $s` + done + echo " All good." +} + +UnTAR() +{ + tar $1vf - 2>&1 || { echo Extraction failed. > /dev/tty; kill -15 $$; } +} + +finish=true +xterm_loop= +nox11=n +copy=none +ownership=y +verbose=n + +initargs="$@" + +while true +do + case "$1" in + -h | --help) + MS_Help + exit 0 + ;; + --info) + echo Identification: "$label" + echo Target directory: "$targetdir" + echo Uncompressed size: 76 KB + echo Compression: gzip + echo Date of packaging: Fri Oct 4 23:34:10 IST 2013 + echo Built with Makeself version 2.1.5 on + echo Build command was: "/usr/bin/makeself \\ + \"./installer/32bit\" \\ + \"./installer/timeshift-32bit-setup.run\" \\ + \"TimeShift (32-bit)\" \\ + \"./install.sh\"" + if test x$script != x; then + echo Script run after extraction: + echo " " $script $scriptargs + fi + if test x"" = xcopy; then + echo "Archive will copy itself to a temporary location" + fi + if test x"n" = xy; then + echo "directory $targetdir is permanent" + else + echo "$targetdir will be removed after extraction" + fi + exit 0 + ;; + --dumpconf) + echo LABEL=\"$label\" + echo SCRIPT=\"$script\" + echo SCRIPTARGS=\"$scriptargs\" + echo archdirname=\"32bit\" + echo KEEP=n + echo COMPRESS=gzip + echo filesizes=\"$filesizes\" + echo CRCsum=\"$CRCsum\" + echo MD5sum=\"$MD5\" + echo OLDUSIZE=76 + echo OLDSKIP=402 + exit 0 + ;; + --lsm) +cat << EOLSM +No LSM. +EOLSM + exit 0 + ;; + --list) + echo Target directory: $targetdir + offset=`head -n 401 "$0" | wc -c | tr -d " "` + for s in $filesizes + do + MS_dd "$0" $offset $s | eval "gzip -cd" | UnTAR t + offset=`expr $offset + $s` + done + exit 0 + ;; + --tar) + offset=`head -n 401 "$0" | wc -c | tr -d " "` + arg1="$2" + shift 2 + for s in $filesizes + do + MS_dd "$0" $offset $s | eval "gzip -cd" | tar "$arg1" - $* + offset=`expr $offset + $s` + done + exit 0 + ;; + --check) + MS_Check "$0" y + exit 0 + ;; + --confirm) + verbose=y + shift + ;; + --noexec) + script="" + shift + ;; + --keep) + keep=y + shift + ;; + --target) + keep=y + targetdir=${2:-.} + shift 2 + ;; + --nox11) + nox11=y + shift + ;; + --nochown) + ownership=n + shift + ;; + --xwin) + finish="echo Press Return to close this window...; read junk" + xterm_loop=1 + shift + ;; + --phase2) + copy=phase2 + shift + ;; + --) + shift + break ;; + -*) + echo Unrecognized flag : "$1" >&2 + MS_Help + exit 1 + ;; + *) + break ;; + esac +done + +case "$copy" in +copy) + tmpdir=$TMPROOT/makeself.$RANDOM.`date +"%y%m%d%H%M%S"`.$$ + mkdir "$tmpdir" || { + echo "Could not create temporary directory $tmpdir" >&2 + exit 1 + } + SCRIPT_COPY="$tmpdir/makeself" + echo "Copying to a temporary location..." >&2 + cp "$0" "$SCRIPT_COPY" + chmod +x "$SCRIPT_COPY" + cd "$TMPROOT" + exec "$SCRIPT_COPY" --phase2 -- $initargs + ;; +phase2) + finish="$finish ; rm -rf `dirname $0`" + ;; +esac + +if test "$nox11" = "n"; then + if tty -s; then # Do we have a terminal? + : + else + if test x"$DISPLAY" != x -a x"$xterm_loop" = x; then # No, but do we have X? + if xset q > /dev/null 2>&1; then # Check for valid DISPLAY variable + GUESS_XTERMS="xterm rxvt dtterm eterm Eterm kvt konsole aterm" + for a in $GUESS_XTERMS; do + if type $a >/dev/null 2>&1; then + XTERM=$a + break + fi + done + chmod a+x $0 || echo Please add execution rights on $0 + if test `echo "$0" | cut -c1` = "/"; then # Spawn a terminal! + exec $XTERM -title "$label" -e "$0" --xwin "$initargs" + else + exec $XTERM -title "$label" -e "./$0" --xwin "$initargs" + fi + fi + fi + fi +fi + +if test "$targetdir" = "."; then + tmpdir="." +else + if test "$keep" = y; then + echo "Creating directory $targetdir" >&2 + tmpdir="$targetdir" + dashp="-p" + else + tmpdir="$TMPROOT/selfgz$$$RANDOM" + dashp="" + fi + mkdir $dashp $tmpdir || { + echo 'Cannot create target directory' $tmpdir >&2 + echo 'You should try option --target OtherDirectory' >&2 + eval $finish + exit 1 + } +fi + +location="`pwd`" +if test x$SETUP_NOCHECK != x1; then + MS_Check "$0" +fi +offset=`head -n 401 "$0" | wc -c | tr -d " "` + +if test x"$verbose" = xy; then + MS_Printf "About to extract 76 KB in $tmpdir ... Proceed ? [Y/n] " + read yn + if test x"$yn" = xn; then + eval $finish; exit 1 + fi +fi + +MS_Printf "Uncompressing $label" +res=3 +if test "$keep" = n; then + trap 'echo Signal caught, cleaning up >&2; cd $TMPROOT; /bin/rm -rf $tmpdir; eval $finish; exit 15' 1 2 3 15 +fi + +leftspace=`MS_diskspace $tmpdir` +if test $leftspace -lt 76; then + echo + echo "Not enough space left in "`dirname $tmpdir`" ($leftspace KB) to decompress $0 (76 KB)" >&2 + if test "$keep" = n; then + echo "Consider setting TMPDIR to a directory with more free space." + fi + eval $finish; exit 1 +fi + +for s in $filesizes +do + if MS_dd "$0" $offset $s | eval "gzip -cd" | ( cd "$tmpdir"; UnTAR x ) | MS_Progress; then + if test x"$ownership" = xy; then + (PATH=/usr/xpg4/bin:$PATH; cd "$tmpdir"; chown -R `id -u` .; chgrp -R `id -g` .) + fi + else + echo + echo "Unable to decompress $0" >&2 + eval $finish; exit 1 + fi + offset=`expr $offset + $s` +done +echo + +cd "$tmpdir" +res=0 +if test x"$script" != x; then + if test x"$verbose" = xy; then + MS_Printf "OK to execute: $script $scriptargs $* ? [Y/n] " + read yn + if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then + eval $script $scriptargs $*; res=$?; + fi + else + eval $script $scriptargs $*; res=$? + fi + if test $res -ne 0; then + test x"$verbose" = xy && echo "The program '$script' returned an error code ($res)" >&2 + fi +fi +if test "$keep" = n; then + cd $TMPROOT + /bin/rm -rf $tmpdir +fi +eval $finish; exit $res +‹ORì˜TSY·Ç£tøì8EH(*(RT@Daè!%„$ô"Eé(”’ ”„š„@hB'Ô JT¬0Š`ág¾Y³Öû|³ÞzSßrgÝœ»ÎÙçÜÜû¿ûwöŽªà7 Ï´´ ë-H üuûo€ÔÕÕ54 °†:‚µÀyàO° Š–—`áp/8üë~¿5þ5U5k„/ü¼'«êÇxcýPˆþš`ðWõk@ÖõA4ÀZZ`Mžþ` P ü¦ÿnö†?‰.o„Ä¢CEÍ¡¾pÝ_^ ѳ¼3ë\WÔ(ÓõðÆÈcy}˜õQyÑ/Cú(”Å"ü¢Æp$€}Yå| ÷•·‚c°~h¸ü, µ†£}H¨®;Ô5…ù!uÕ0h5Œ' WC!‚}¡(ŒÚ/WQE!=DOBQëëmM[•Ó†F*çyJbPæ~X„{ÈÏËŸ„bá~hóóÜ£¢¦Hõ±DÃÝáh8×ÕùrÛöp¤ó…󎿺{ÀÿSýù±ÿ½ø‚hi~ãÿŸ©ÿ/á¦ö×é‚Õ5ÔyûH¢ü¦ÿ_£?ÂêǨýUúƒÖõ‡5¾å­þ$Ì'À ¾¾ûþ.ùŸæWó?^Þ§õ“þ@°&â鯥}Ëÿþ K´47Þ$*½žêl251´âµ’뇰 ï[ni Êk]OÖÖ?ù̯Geò=†7clýØ`pÌëšž5š‘–ÜìHË6>75Ô·Öî¿‚sö¼qA¶ûøü1ο«µLüˆhMYþDæŽÓ†Â7 =§37oã—1ÒR £@Fí:U ÷ª‰‚H.Û¶SH¬áMÂÖ^DÜbr–KL£móY‘Õök˜HçÁWAotÂ$ž¾ßÒåÈ,¥j¹‚ .¦<ŒIÂõ¶Û¾Y]]žùLêf¿Ã¾µVyÛ×3dëîýJ/çtŸd¹zý+ö½ +úü¬ …àì3™§½¤ÔX›ÏóÖ„®ô ]¿%²øÖ's`dT‹Fݵmw I°gubÅ=ð`.#`Å8‡}ÜF;üì +à\ÑÇG.ÓŸ ˜Ÿâ«ƒzTQcöëêeJìàІ›÷7Þ;ž»©Èåýx»®UfæÉÓ³aè²Ée˜ZîÅ©½ñHó¼ÉíÒ´Àýó‘„ÚRÇî˜.Çñ>¬2 ý{ý·òM,»÷µNE%Úz+’2½¢§»íÎK$[Ç8ﺧNØÌ•[N ˆ_|‘W=™Ý]¸ò|8•û0:Ï{¾{ç%Dˆq åðÒã£õ¦°ÉÒJ°nœ’¾u.¦ Ö/±öœïA‰F‡”Ì’‰¦!"ôÓÞ*EaïN»YÓ¶5e®4l÷væuêæþÚSŸüŸŠ“ÊúùL”Ó ^÷Èä§bĽUXvü¯s|Þ¶}ãj;_]Hìr}«Öº#¥lDsÝl¨Ê\oSOÔÁ@u¸}Æ]1À3Â'ÏJ=åƇ½²ó]¯F|¶=Ü5þº ¡u©±¤âÓÝ©¼&ø‚ˆqŒ¤ügý™I;‘ðñaÝï<ük­$## Wo =‹¼‚S£ž*ôègù*›J“¶™!2:âʳ|ž›Cnï õõqR±o{^º·ã]–Ñ[¾,ó–^µ÷ÂÖ²îEæÕ:qÀ3ö‘ þÓsË]GÇ¥"¨Öæ±îŽÙÜ…ûõŒ@±é«b +Nê,_'1ÜÅ÷ŠwЋ¸ëB3µž $?Vpj›\+S#sCªKÌ?˜ÿ¼ZIÅ ù¿ï¿Å^ºÿ¥þjªCx5À:ÿÁàoõÿ߆ÿüSkaž… »%ð¨Îÿ…ê©]-Þvç¶u·,?£×Z Œ´°G˜ÀD*›Ú(+[Ô°/Žß=.ÏvhXÝßpÛp£ø÷_XÞ1¢(".Ëë…;|ˆüáA_ü"±ŒMÐØ-~œ°ô黇ÍÉ&tÏ&ÚQm+Ǧ}}}uu—nÞ¼ù{d?Tjñ("zLGOï»:;M¼2+Û5¥¬¢âÐ]¯ZBQQQ4TêÚ·³ðÔHM|ê©Y<"—A²RÖŽ–Üh Üé +z¼¢’gîQW_/1ÈáX3©œ¨µûä’;×ïZ•rÜIÀ+´êKò¿Ž‹ƒJ²l‡«Éw±G˜€ô†ƒ×û=xà” xôAï'v>„çF]ˆÅ¼.uPmq Ûéu[Ì)F d…2­,ÝùÄÌ4+ƒð“ÆfÆIy»<+Qaá•­V¢fÊ&Êc%¾€Ãý¹ƒóK;©'•ß:øûØ’ÜåZ“™á®žã¥š5‚D"¹"†§Dò3 ê'õœœ/1²9óÓAN› †Ë¬“N ê´ ¥â¤®u?ò7úÔOøeZÕìͮt<¢å°Ý%|&Ì;gßZuâ}'ž,hQÂõÂé÷Éú.Æ©6Å™Jï–—³ÌHËeÖÏtä‹rL§W#.À÷Š¤¦×_‘"ùæeËDØ*Éÿ(Ú}³ÿÿÑp·ß¡øMþƒÅŸòøÿÿ®ü—ý7ÿ-,¶žÛÖÅÁ?=Sr!}ü†Á¸Ëæܨr2;¡-•êp{(••ÿËJ»Ç÷ý´ÍÅÅk‘stB V(Xò³IC7à8TÄåÊKä¦ù +Uÿpbÿ°k‹A‚…wB»ï5ÿ|p'À24*,6kÖ‹í¿Ç¯å‹ÂÇÚ#—ïÉNÖ@}‘ +š¹âÓ©†·–±Ñ~86¢vȵ¼àò/Q>˜c¼!ÿ¢ˆÛÝüÔM3Š#•?nmkµßÑðB:º}/JØÿ–T)¢}s7ãøÆmŽ~MVøÑ}±U¥ŽB6lÎF¶;‡bNëNÝÙ²O¹/Œ4Þäˆ+Þälb¢  +2K‹9Ñ&É­ð]€1?zeML›’n2sÏí±/ØÄ_“6#,hsELG Fuö7êÙÇOÇ38ÂiúÒ–5ܼtÊ¥;üU‚Û\¦,ÐáråBžfîiqŸh“#Â,δ|—™Æ9ZÃdÒÃS«Ïž3*’õÌO­<_P›ÛÂo°ðyÒáÛ¾ðÏæ?…@"áhU„ûüÿÏ:ö¿ð_SSCÌ;_ç¿:ðÿÿ 36=¥­àA?ÐÒÒÅë][[SX37²>RßÒH]ȷ׫°Â/ð¯O\ŸØ(a¸M)¬ÿ¦¹tÍx2ýAÓö!lRHŸyæä–”Çó ßùŸ}®In9Øò]¦/ä2ýÁ±¯ùäHn9ìšœÑü.óÁ±í_ñ)cHn!dûYÉ8»}Üö5Ÿþ’†Q…,¯7)tÀ×|¼Y‡ðµk‰(TmÜ•2ʪþêïùï÷.ð[Ïðèß!þQh?4ƒùð?Ç?HCKüKü«kh~©ÿAêßâÿÏ‹ÿf€8`y —‹,Ýilg–rˆi72ò;ñ-m½==Iµ1Ïj˜õ”Z©¯€W‰FÑ7Y9 )I…¥D‹ä¨2·’’’À +4ábuuue?…ÑÒ„%ø„åbKiQ±Ñ±•áõ-I”ËWh‰·£ó9±µ¡TN9c¬±¡•^„é¿Ãö"9ØÄ™Õ Ö^o»Hò ¦úäuf„„Óü+{(P(´˜ÂyщîéuÃ5h,†Émòà £èíãíô”êºêø[±7èéÙ-¥½¤Ë q1U!ÅmDFóZfzq'‘Ô~ËÓ×3¾,Ê)ÅʯÀíFcú÷Ž¶g£ôâ’llmÂ.…ûcÐÎ.Îø‚V{w'k ‡L§VÝ®!“É ŒÛaáø|™Jéáôõ 0ÛšIÅÅU5ÕA ɉQ‘×qeeeŬBœ…Wž3¡5+¨™ÞL"ñx<.##1)Y'âÀÉËÀ ÝZ¡Jj²'cÔ;zºjGé™-©l6»‚]ßp)§—ÞœTØs“B¡VÓ®gfÞæÖô÷÷°û¹wêê›Z™ô:‡;¼ººZPR}‰ZI ‹ ÷Dx6··äÜ—W”³ïuöÒF(i 5ÃÕuwkRš._® s-´NnŒ ¡! +oÑ›êÈ5ÔJ6™XQìéëQÎ"edáfž=Ä"c#«ô°¨ðÒ¾¢œ|41”Íò$Ø_o¼F¡‘Kˆ,v7®9¥©IãPÚz:ˆÅE”þ +h–5í¥´¢Ä"Zß/OŠJ«Hn`Þ§v“‹KHÔ*j9¹,ŸA ‰ÍŒÒÒ’îÁ¾æŽÖŽÞ®Ú†Z2…Ü?2ȦUÓz{{q8ÜW÷<¯×~âõz˜„×kŸp°§Ãû. o=èÐC+舗ÜcF0©*ìJ–’)¯¾l–Ùz)Û«µ×¤šØ‹;p¾Üúýœ3)Ë͵ Œ‘Åãµ1z[NÑKhÆ:±Õ!ØÂýl¹;8öaÛ¢",‹Ì®”GŒ[”xQB·Wp)Ù«ƒ6U°’¾t>!óìzÔl» +º˜:ÅÈhí²7žjñØ+0q(+^N0aë!÷û¯6w§íYHÆ¿™aehœ¯ ¿ï?׃×ÙÏú¸ íy'E£?”o>+{ŒK^Ù‡H}1Ñ ìcãeöM¶ŽYª·Ù×]·Ë8äL%I„®´ÖÁÌ –xWFîþ€y1|;hÍææîpì›Yü‡ad,$zùõlËØ»‚æOå{¦%ô;?­É% µF.FÃŒw+•ºì|âω•<,!·å°'4v‹»IÁ1×lèetv~¼œžTa¿ŽdC‘CÍ$CÓ[ÅÀ\ÏÙ½ª¥Eb¸{OfÅpù°”»¶ç[ÓM”¾’º7ûg9NïV5»Øë–ikþ=)ÃÆU„tÃ^ñ>)˧Íð%Tõì÷©¹gnO©e»ŠQê&Ã(õœêöSØÓ/‘ý½d¼4€²š~äm½ž[x Ú:ºP¹k«d‘_sk0­c»ð~2pOâëÙ×’K˜x!Q›`ÇfcU]ÛaP§ †@ë–;*[ÝcópÕ+Þ²(¨äÜyxi§%ºÄÖö6h8Ö}&z¿¶P^œ’Ƙ£>?Ÿñ+è‘_1Ty;ºòz«Éˆíñ³o¹aS5\{‹©Ú±Ó±»Ga8f—xA7à0Æ%ªM +;’·I:xž¤th´éEýô!TáòCO7׶é9¾)Z/µwˆkpgÚ˜ÿW{_UÕ¶¶½iØt7l ¥$¥¥‘–’ÚlºE%aÓ ”twwIw#%Ý¥"¡ þ ½çÏwϹßøÆWÿýç€1p®5çZ>óyŸ÷}çšk®QZwÑRï8ψ†­H×%ïÍ´€¥ú¬{F»ºJ{qeÝ]”Ž/LE„l6J/>¼"‚^´Í)ßj"-ë¹I„\v‰$¦µzy-Ü‹üzöÖ•¶ålÙ˜¶õ|4ÖøÉÉv–1 + qqäW*×K¤p^—±H ñ˳ƒoß@Xé 4ù6DŠC_tåtDÒ¾6„J)D ôŸ ¤Â úô cA®<]ÒŸ}ý7ƒæ= + š½/¿,«7’Ú:90h¿t†½þÊÍÄS¯ª,ÄlU÷Æsø%À(pó ø#ùXÆ#¿<ÍXlŸÅš½7^Xâsó/Y£HïuÞ ãÞ œ«²ƱF·M¯;žr¦¯uvŒ^ØY¼_&üü³‡”A–²)ø[¸ï›ÜŠõÞðI± ¹†"nó'ÜíaÛ£éb®¾ enÖ^BV¥˜šI€A¿¦¡ŽNµ÷d+&Qò#LZn øÖŠ¯î'áÝ7R0Gí!{‹0è窢klëCU"Ø? €¡ Âü¡nTò‡i p¢1œÔåt¨67XÇùÒuAÖ¯ßLèÉ­&AwG¿X>UyN™.€÷™ øÚÌÚMâú"ž³ækµÒa'X ú8%ª4 ΈÐm­“Z…,·ÕõÉ +WÝ$3ü&@1þkŠIµ4º³‰EÑ&‡t$¬tFÒÑIg6ƒq +óG[«ÐæQõÕs¿ £ù”@†÷;d,d Yk:!]{nú÷PƒÍk ÿU(¯Q¶û’QDö$†¡2ãnØ`<׎ +ü +À?7¿†,)½ú2Y·P+¹Ñ–<µ¬%ú£ùSi€DÍÔìë@VéÀÂ&eÅsU§¾Íõfa +œk)”·»ê‚Ãù†æë„o9¼?!c‰y@F«ŠÀ´–)zN§”JÅ ûª="àMnÕöhÊmä¾ï$ÓHvÓu‹€p¨/UÅ >1ö@oS# Zõ=¢€h­÷ÅÒ>5ãÈD’û”©”ö!%i5€ÝIª³¥Éó[—,…Œ›|êçãèÍ€N¾ª6kƒi´OÁòÖ/Ò$ºe®5ž%0ª¶ÊZ`”| + ñZê”J›E}ˆ>~ž «*ËfN±^.öjFGm‰Ë(Ö³Jã=Ft&ÿ—¯}‘ B$ž•®úEÉûé Õs'øyŠ&*7|$¶náM] ½ŽB17…ÚÌ*}®P(³ÁTö‹å4a]—ý¥ðœÞèi7^u2éæú£µo,‚ù×@PZ@ŸýÙ*(éϺä Aþçÿ†<IaçO +Éòê´á¼8h§7´®cò“¨â~¦±ˆÔGyšåÖúŸ“ç¶Üà4˜à*ËM;–ª÷n`ÂmÍ’]kšÞbÌ’¹ÌTLp HŒ‡£nÎÔØÞq³6v’¹&Ï'—tï¨f ÉhJßÚ|íûÇ|!õ{¾pMléòôvä?NÈ>GTc›í«X÷GG"W¨dP "D ¿2§`¤bY@|2×_•—`9©¸2“N ÓZ»Œø*«É‡ 5%óÅ<ˆ”êü¬dÉ<7s€GiaŽû ¶¦·Eú„Þ¨E˜|õ•°_:ݹ¡†ª—è2T.ä*«£ó5Y›×Wáû3åeòH§‡¡ïçU‹–$§³·`.ÓÑKvq÷E»® ‹ƒ;"§?X9n®µ¹Á³„˜J Ÿü^«ÏK \:)×Ó––‹ ŸùŒ + ”ó“ù;Q½ú>‚’˜&!>³^èS‡b +à‡&(môy}GiSå~€ÏÀ(ã3–(m«2p(½1¥•:‰ay ÛŸüöÎ5J6Í™J9ׂ t-fþ¤V“…²"æEóuú(Ôåru¥IÉ­æ–-¿~<ÕN­\BfV#QÎg¯‚qßÎXÏ¥±#WÓðZÀ磶„øðDÀüÓ¶ÒjöýÂŽ^Îø5¶…bÞÜpÓ™ÃtYT‡)íh½ï8C‰›2 Jñ×7š¿˜ EìX/¤áðá÷(]zíMOÚÊ:pqvè=7ä¹DÞÏJÍŘ>Cg@úÏ3Jœ`‰Št€ì˜1—QL† ±LšAÖÑ@ÎÅ­ [îä\ä ¶dÑ·¹”8V20ýØ»lo$¯½J Óä uddD*Ær™‚™2ÎÑQ9ÙõØcûã²?ŒþÄV¼Ød +8œ¶º²eÄi¸|_ñw¯bê[WMBÀôyˆQ¤X®•Ò„ ü‘rcµ,Òä ¿ÓÜ¢Z—jªµç óHX~µB{ȹžRs…$1ùè4ŽGSy¨t{˜s,0}Çèh ³\bhG('­¸…Føîõ·‚€œ–‹3Ý$ªèúÝÄ‹óãx?:Æ–§MÄ‚jݾÈ$º²Ø¸ÊD?  €aÚÏžy–^ÀÐ|ÒÿâÌöF¯w¹ÄŒžù£rSÓ5Ý©sAà}áI¯]K%'*Á ?=Ò.ËW§Ä»|ÞV]0‰{䯘¢x’I-vViÓ2³—ªÀÙ§¾0“Ÿª²ý¸’ùÚ4*œÐëY9‡79‹ƒ3yAÞ¾HhµråÈÙÁ„¬±¥e뽤áír •›ÞH‘*\מ™— +Jóï>Ý öÛ:S„ Ü³ä3å&ßî|”çì÷Py©âªdåY.à™­VŒ–n“r^ÏÊE^•éÞ⟭²½Ÿ•ÜpV¥ËÒ‡Ny¯UÔÛ°E‘ÿ’ç?0¯ÿ±õÿ|||_ÿ/Àõãù/ׯõ?ÿÂëÿÙåɇˆ‡YñÛúÿáP*^ÏÓQ»³wïÌïòšJ#+(Ë/8c„¡ûÃIUTýÑ…X¤\Æ‹n­‰ãÅù¢á¶‹·™à‰5ÀŸS ì™v— %D ;Üiâ\t<›wÜäzU®‚ûM»[Sû¹Ü9ÚÕCçRKD¡¢»ª¡gÔ þ­R¯–)šÏ»oš¶7ŸLœì½Ç´xøeñ”•S6e½^–šýó5wéËmë2Ü.Š­ª'ˆ×ÇïMSœœB%W©õ{*ý]è.æé1¾”µ†mE@L©/¤öes*é:¾µë=/ÌÌ"Ú,ÿdA¿8‚óLÿ þË%fð!'¶,ñ! ¶ÔGÓ "óÅ—Fª¨z9+Å›ŒË!Ó_-U¸ ô`¬ D[¢O¡M‚“ð$ìuäujô¾®÷Åh)‚ÍÕ=á%Ñîɸ­‹­5W]¿gl:-ØM•hÙšÕt‚2ytËï´ñÈÎÍvîYÐ~Œ¼j}ÈLV}Œ[)©«)r%s&ÀÖ.gµ{Ó¿ ðÙ¤ +_DCCtvgñ%£±íã˨„;9÷ãÖý16Z›Ä“/ËÊÊÝ#ÀQ©^’Ùæ‚/S‚©\ƒkM(ƒÇŽˆá/@àÇHäÿIòms¬à¬9¯cO¢÷ÁÒü }©Øá¶áHË·åM*;à·þ£¡Þ§ÙÜN¥½Ís[ÕˆÙ•Ki÷ž³Œ Et-ááYgo^…·É_´¯³Ÿ¶F½.%öu1õ›ëÏX{ÓÕÈê©xô‰'t”Ù;ß^–ò€t>ÉÓƒ|–YñlÝ—SŠçH?¼Õ[ôÑÕôÀù ¬•Ä/-3š"“#º*“;Á!öQÄåìL_Í”:Ÿ¨s°¡ò&æ\v%S qú.eµûµŒC%‹…fLHmÌýøG[­,w´ä]¦¶Kh(Þ/¤ÕTýñ a߄ߤ[…:¥'¾w—™A0ïFòùª@F "ÒßX¨«ñÕÒڞѕžÅté~¯z‰d…ÍÄ¥ìRàW¹&7UŸÐ »I«Š_]XU_qÄ(Çùtùkª[Ï h+n#/b1ÁÔqQ–ÇÉÎPhE>Ê¿å³)O +Õˆ±Ej:ßÇ÷nŸõªRú->Z|}’1FüJ¹±mç"ûäh>­k8îYWgpŸÄÚ)ˆkMêkËóΙ¤ŽT1µÒHó¹Ý"e"ËŠó5©Ãá¯U³÷ÔŠŸ|øµÖóÿQý·tÁþÓ)À¿«ÿü¿ë?/ïuüÿ}ÿ‡_úÿ§þCþ®ÿ×ëÿƒ–åQ¿í¨¶ö§ BÎ+†Á9ø^v= ¿Dæ§ɲ]×9ë¡ y*QÇÁpÃa ¼&W,+mSè‘þ~ÈÍâÃ.é³›9[ ·„„B·}š9Ë—%OªñÆG#{s9UÈ<Ã"@¾5áËÇeÅy–)ä7ð.IM¬G‡Ñ]³èóõÜå©ÈvF•Û¿äzÍ3sþ –sx©ÎÕ†U9Õ¡*lLw~è)šù2’ÒœÎZ‰_Ö±îm• •}¶~4b¾ádí².’Å ƒiÂGØôÔû²ë¤ª3ïSRVOÑÊ„DÔK’8âuRȳéÚÌMÅ)–”ïDÔÞÌÉ$$õÉ‘g{ÁT´^wωã•ze‘ÐŒOG³cÝ;)[[Ù;SîØ5wÉ_€(r æÛ²ŠÌèÌ7^>O ‘c +jð%¢*É÷N§@`ÌF¼ô'³ØµŸ¿¹k (îr E ¡äT3G#Brsð,ðkàçS¹ˆ¤Ï‚ß)²LŸê"%»"KAV¨ØÐñÐ1òqš0 ÒÏG1¶Ž!æ;~Üôât@o_Ç —"=$GƒHJ@êƒçØÖ›^~Oа‰ S”¼ì?" .êÇžœ’¾1% i÷ q 4u.°ø6Ôð—3˲ð˽[ˆ Œ1ÜÜ“ùÓ¯Fõ±§H&ƒSk÷OÍy{S™çl6¿F¾ÆI!’ì’o ùåþÅõßÌÎö?ðþ/Ïwýêøoó}ÿëzK°_úÿ¯9ÿC‚JˆÐq!,ÿ˜ÿžP²Õ”$B;ü6Ô’­àS[] i,ø`ØXnpö¹[§kÏŸÙL¦Û>~±‹é[*‡³«™»!ûLõ”¦W6†Ãå½>.YøÎaYÀ°±.ó‡HO²<1<–I9žwÚ’úög­Íù­WúÓT'9f›¾Øäîdƒ@HøYÎÓ¸OÜsá'Ó«Kªˆ^ç©>E ÎǪ>ái‘Ä>² ßäáò¸šqkÜ¡qçcåا“Çrø Cò(Š$K¥Ï†Ö7^‰ß–®6 æ"È+:Ê!¦‹5ÞBéeÞüê¦ã‰Ñ¥q ør¨Î˜`<‚$%ªBŽ'%)¸§ ¨T4§»Û[%|A€¾>ï§Ø‰Í—¨ *.u³^Ÿ>EÏ+«Ðþmʾ„66T‹q*PžJp¶T%’uë½#’‡ƒÿa– o!Í ¾íò®·´ŸT{j5Ô$]PY ³Š¦³"Ä<§„V_/CWï]èrºàê¼kSãþ4sÊä¼4E³ßoLZðqšHYHz8þr_èV, +(X"}òü")É‚}ÏÈÍ7îÏNÞdÒhÜ3ùþ½ì‘‰°. 5[èë‚¢€ÂBA|–$ÄÄ€Á_\.+˜ÒgµvZ0åÜJ¯ïÔ”Dìë!“…WéãíÉ/`–¸htiB"kÊÜ ü¬’”‘VšÕA®ÛâÒá @ +^Îá\˜Åc?¬È}6¾5‡"—ûõŒ%¨ý¾­å¶´:‘εѹ™iBé»Ü(h1—0žWÀlÀHýæzÒÐL&Ã÷G&Y3¡“BËJi‡q髤…Eâ›îCqºAB·6]Vý¶,¨Hd›ã+Òº!h¾Ýl¡û66Nöîü'{|fïͦmÎ<¾b;nx3PiÓ³Ë/B#w.wX1‰‡´¥É“mµÔÎÙÕ‚gtîC¨ÊªÕ /(Ž¹ ßꑼg åäÔ­ì|^lõ¢º0ã ÏB#gLç7wx¼7d‘¼é´"Iz$JQ¬uÌë~Òa·tOhséð&áôÇKk“šÝ8Ûw¼ý°E°WÂo¢µOqò\*ìûÀß——òÔÂ­Ç 8GzTèÊ,®ûAxxB‹‚ÄZí—/Å÷.³VM›_PñÇô0bP>zõ¦â#`Wâvö0š™øغY»ú®l\)­Só¡–® )õDÚÝ)OÄc²÷—íìÞøÜ!Ž†}"ß .w¸ä^Ü?^ýÖa¦¼>Qj_ŽÑÅZ¶v@ïE覧¿µÉc;.„ƒÖºw²Õ|3Jq5ʼnÌñ™”—8_q¡îÁÑJt æö%/% äVçJÈ´ŽON“H‘ä—y<À‚EgÂN “߬•~“Ï{`‘g}i`˺£ù±áy¬`Yå¼±CÓb*']7o9Ç-F¼úØvŸƒÅ¶·ß ¾“|Öøƒ…ÅÙàcKî*Ž’ÂúÒ"Ì 7’;O^ç Ìh݇FBLò +ëºX)Žáoíìô*2Ù@‰“Z+Vtzmb--Bƒ>`D‡wz8ÃkjΛç±ï…Äæ¦RRNbGfvœ ÒììÔ¾Pi AîÑ`~£ÇfŽ2Q˜ÿÂQÿ­¤¢[d í#Ñé#ÑWኰu¸>Õmf…úì*^Û+fwKi¤l„3OGî§Cõ{½ Ÿ]&ç‹ +„Rü> ÕXÀ¥Ð͸3çld=þ¢ÌmFÜÙÖÎU>ƧL„‚*¡¨­õbýn?0¦„1Ïœ:N©ú¿å(Mêx¬ŸÁ:,ìQ„?ø°oõ«“AÄ«mŸä‘÷ÏÞ³‚E{ÝÔˆœ]ïEfl?Ó¢’0pâ·-HÅKƒyèñÅ^\lÔpÓK +Òë,ô”':R3¦ë°Pšw¹ÕäT4J(-í¥Ñ錡4yºgc¸ëD:OšyjXizc¥¥Ï¡8‡Æ@¨x‚I²¢Œ$°S˜O,¯®ýnJ(þ1¾heæ‘!’¨¼ãnéüýÒ®×ÕÕ+tñûÙ•[9Tχ©©{ °,''QSZtÔA'Á™¥BŸ°I”څ¢|¤Ö”¼~ø¥V?³=h€ùôõh|MÈ.1©# +AŽO‹Hâ‘»N"É[±o€„ážœm7o•‘°µ))Å¥KCMÆڹΕµµ§_IŒÛ!§ÓíÔ+݈½¼«Á¼ð2cêñZkëñ»×¢£ Yâûï RaV)"–#ãš……k”OžŽ s¼ðñžo5×|jºp{ëiŽÂrCbZ¹ š£é^ßœ×1%66J§ëæ`N«7+8ƒšº'Î%¹t縞au¼½=Y`4—\@¹oDV¡Sš "p÷2yX…CKI5ô%m¤ò¼—îS0Îæg„¾Ä FDµlKÕÂTgd±Ìào#doÕ½*KJ˜´p¶íøìëYfáˆLêt¾O„EÃì +¬—?~v›×˜ã{ ÔL¸Ém³“E0Ÿ6´Â†à0ÄêMJëÛ \ºGoµÝ$FIñnf+CIÒ&’(ŽØ\,àݺï'10 +`¡,ËrgÝ[Ói”­½Ëq c‚·HJ)SGC½R@Öxßm­’*Úò%+è#½K‚¾ÿŽîÚ{ +¢º¼ÜÊ#¸ÞUV¾ÍÒ~Š@Ù á7ùë&Z¡ )çz•ºš]É›ž€KÚt^9µÁâÙk2C°™ZÕ ä—q¯j˜êv ¸òD%½..àÞ+còÕÙåâé¤Èl<»ð™lœ¸OZñ~ÐÏ‹Ê s5y¦ž 55³E4ÉûÎÃê$¤:™õŸä6 +³Uꯚ“i~Ók¬Î׌*È÷â,©ìaKÐûúêyGÍýÏ€ýÝ—u9+ÍŒù‹;€?CSâø˜ât~^¾TœbZžÑÇokŽ2p£ääȶ×en”êú¼\ÄFË’²û®CpòƒMÛ/j"Û\BJÚÚ—_W;½ç)8+õ‹Ú÷OXqÒQ‹´5}µb¶ìÐ ;;…Š¸"vWãâ2ß CÂ'ô·¯Ž…’Î?v=Ë-µ6.,hË“Y&ï;}(Ê1ætü lêFÒ´þšgÝÛcpqÒ0ž€V³ ¤ÅƒãM÷]˜v·ø°ÆÔ6 ÇïwûçÙã,Éì9_e°cŽ™ELšû:&‚IA×Î;~pë–sQPÈ ¼CÓÞž—£æ&ˆXÁó¶€YEyÙs4TE£(mGPÝÅ×(¾¶c7¹Þ0†„l\`îQì©GýG;4 ÙöeágH˜„®"4½Øh¸k‰ãã—±™å -Ô¤ñä¢Ä¸xN|î'»ÍsðØÊ°}\ª¶ýö•0#N†Áó¥6P釽 "ümrTqñ÷|†fcU¥Þ×-"·úkk›ç¸eÛs;Ÿ;gH7¾âûÄHàåæ„Gú~.Àò®¸çœÇ0Â&G„É-ŒfívÂûVϤmݧx":aÚÚ‚ó«Eè‘ýȘ*ÒòyÜŒƒ;ø²@ÔåÅIÐN“Ò–°÷–½}¾€IÄhË+oÓª V1šËóŽeëdšqšÞ+º·²mãÏ=Ö€|&Õ$3Ü;÷Ø›¦ŒÍ ˆw "ùU#ó©n+UÝm>-dÑcá©ÓóÈquÑ;|/nßᥧDh³,,<ä/#µ¼¿‚œî-ÒÁdW\Ö[355+* 7FCl™ßÖ(™ ãœ~³2ˆIB´Ð'‡eY-`rÞSÞqÐrWæjßt¸]zäU·ÍjöŠînõÝ•›@nÐÔ(ŒÌˆñ~·Âoì•òš<_})“<3X7)(ÀTͱ"}Ê¢“ ¢“â:-5³£¬ –˜²à~$ª{Ï"£ŸÕøyºãzZã¦;2?j,…uI„ì÷„°x¡Ðâcáù=Ï7ñE•AA’Y¹ÁBAÄUoá{ƒQƒÛ¤µò¯hüÏ­Ó7–=jø/žÿµvpu3µ³ãpµúïºÆ÷ùÿ¶ÿ?7Ïß¿ÿÂËu=ÿËÃwû×þÿÿ#…þ§™µ§™©«ìä³°öúþ5&0Pkní"ÆðèGåãëÓÀߟü±ú{ØÎjj÷·#¿ô˜óG-ØÎÔÝjsù·‡Mÿp”+ ƒZ9Bè~°ÑÚÁbamsåàà ƒímv'ã7ö˜î•ïôÕ?]ù¯üþÄã¯NøÛ£‘ŸsÚ;¸ýÜLÜ•©‹7øoÆa·‡pÝæçÿé[Y?ß9˜þGï?þ‹`¨„ÝÜ è™ÝÁ‘ÀÕæâsôt€¹mƒnuÇ\¾Á†ZÙ;š¹À î.®Ö°·ò§=§ƒéCéîþ> ÷˜‚éQ„XCþ¡õ?}´ô§sý­- q;ÌÂy q³‚9€1~Ðãïwñ4u…ü튮îP(ÌÕÕÂÝÎΛµ]a×!®VŽ.nPw7àüïÿþ‰w{˜ƒ;ÄÑââî ôbîùiXa×_Ãø1´²0ÎüÆõ•¼¬Ý Ü` kð/_ò«ü*¿Ê¯ò«üë”ÿx÷í x \ No newline at end of file diff --git a/installer/timeshift-64bit-setup.run b/installer/timeshift-64bit-setup.run new file mode 100755 index 0000000..7f90da2 --- /dev/null +++ b/installer/timeshift-64bit-setup.run @@ -0,0 +1,1039 @@ +#!/bin/sh +# This script was generated using Makeself 2.1.5 + +CRCsum="3722420722" +MD5="ba7e849a2203309474b2993214e99732" +TMPROOT=${TMPDIR:=/tmp} + +label="TimeShift (64-bit)" +script="./install.sh" +scriptargs="" +targetdir="64bit" +filesizes="169092" +keep=n + +print_cmd_arg="" +if type printf > /dev/null; then + print_cmd="printf" +elif test -x /usr/ucb/echo; then + print_cmd="/usr/ucb/echo" +else + print_cmd="echo" +fi + +unset CDPATH + +MS_Printf() +{ + $print_cmd $print_cmd_arg "$1" +} + +MS_Progress() +{ + while read a; do + MS_Printf . + done +} + +MS_diskspace() +{ + ( + if test -d /usr/xpg4/bin; then + PATH=/usr/xpg4/bin:$PATH + fi + df -kP "$1" | tail -1 | awk '{print $4}' + ) +} + +MS_dd() +{ + blocks=`expr $3 / 1024` + bytes=`expr $3 % 1024` + dd if="$1" ibs=$2 skip=1 obs=1024 conv=sync 2> /dev/null | \ + { test $blocks -gt 0 && dd ibs=1024 obs=1024 count=$blocks ; \ + test $bytes -gt 0 && dd ibs=1 obs=1024 count=$bytes ; } 2> /dev/null +} + +MS_Help() +{ + cat << EOH >&2 +Makeself version 2.1.5 + 1) Getting help or info about $0 : + $0 --help Print this message + $0 --info Print embedded info : title, default target directory, embedded script ... + $0 --lsm Print embedded lsm entry (or no LSM) + $0 --list Print the list of files in the archive + $0 --check Checks integrity of the archive + + 2) Running $0 : + $0 [options] [--] [additional arguments to embedded script] + with following options (in that order) + --confirm Ask before running embedded script + --noexec Do not run embedded script + --keep Do not erase target directory after running + the embedded script + --nox11 Do not spawn an xterm + --nochown Do not give the extracted files to the current user + --target NewDirectory Extract in NewDirectory + --tar arg1 [arg2 ...] Access the contents of the archive through the tar command + -- Following arguments will be passed to the embedded script +EOH +} + +MS_Check() +{ + OLD_PATH="$PATH" + PATH=${GUESS_MD5_PATH:-"$OLD_PATH:/bin:/usr/bin:/sbin:/usr/local/ssl/bin:/usr/local/bin:/opt/openssl/bin"} + MD5_ARG="" + MD5_PATH=`exec <&- 2>&-; which md5sum || type md5sum` + test -x "$MD5_PATH" || MD5_PATH=`exec <&- 2>&-; which md5 || type md5` + test -x "$MD5_PATH" || MD5_PATH=`exec <&- 2>&-; which digest || type digest` + PATH="$OLD_PATH" + + MS_Printf "Verifying archive integrity..." + offset=`head -n 401 "$1" | wc -c | tr -d " "` + verb=$2 + i=1 + for s in $filesizes + do + crc=`echo $CRCsum | cut -d" " -f$i` + if test -x "$MD5_PATH"; then + if test `basename $MD5_PATH` = digest; then + MD5_ARG="-a md5" + fi + md5=`echo $MD5 | cut -d" " -f$i` + if test $md5 = "00000000000000000000000000000000"; then + test x$verb = xy && echo " $1 does not contain an embedded MD5 checksum." >&2 + else + md5sum=`MS_dd "$1" $offset $s | eval "$MD5_PATH $MD5_ARG" | cut -b-32`; + if test "$md5sum" != "$md5"; then + echo "Error in MD5 checksums: $md5sum is different from $md5" >&2 + exit 2 + else + test x$verb = xy && MS_Printf " MD5 checksums are OK." >&2 + fi + crc="0000000000"; verb=n + fi + fi + if test $crc = "0000000000"; then + test x$verb = xy && echo " $1 does not contain a CRC checksum." >&2 + else + sum1=`MS_dd "$1" $offset $s | CMD_ENV=xpg4 cksum | awk '{print $1}'` + if test "$sum1" = "$crc"; then + test x$verb = xy && MS_Printf " CRC checksums are OK." >&2 + else + echo "Error in checksums: $sum1 is different from $crc" + exit 2; + fi + fi + i=`expr $i + 1` + offset=`expr $offset + $s` + done + echo " All good." +} + +UnTAR() +{ + tar $1vf - 2>&1 || { echo Extraction failed. > /dev/tty; kill -15 $$; } +} + +finish=true +xterm_loop= +nox11=n +copy=none +ownership=y +verbose=n + +initargs="$@" + +while true +do + case "$1" in + -h | --help) + MS_Help + exit 0 + ;; + --info) + echo Identification: "$label" + echo Target directory: "$targetdir" + echo Uncompressed size: 572 KB + echo Compression: gzip + echo Date of packaging: Fri Oct 4 23:34:10 IST 2013 + echo Built with Makeself version 2.1.5 on + echo Build command was: "/usr/bin/makeself \\ + \"./installer/64bit\" \\ + \"./installer/timeshift-64bit-setup.run\" \\ + \"TimeShift (64-bit)\" \\ + \"./install.sh\"" + if test x$script != x; then + echo Script run after extraction: + echo " " $script $scriptargs + fi + if test x"" = xcopy; then + echo "Archive will copy itself to a temporary location" + fi + if test x"n" = xy; then + echo "directory $targetdir is permanent" + else + echo "$targetdir will be removed after extraction" + fi + exit 0 + ;; + --dumpconf) + echo LABEL=\"$label\" + echo SCRIPT=\"$script\" + echo SCRIPTARGS=\"$scriptargs\" + echo archdirname=\"64bit\" + echo KEEP=n + echo COMPRESS=gzip + echo filesizes=\"$filesizes\" + echo CRCsum=\"$CRCsum\" + echo MD5sum=\"$MD5\" + echo OLDUSIZE=572 + echo OLDSKIP=402 + exit 0 + ;; + --lsm) +cat << EOLSM +No LSM. +EOLSM + exit 0 + ;; + --list) + echo Target directory: $targetdir + offset=`head -n 401 "$0" | wc -c | tr -d " "` + for s in $filesizes + do + MS_dd "$0" $offset $s | eval "gzip -cd" | UnTAR t + offset=`expr $offset + $s` + done + exit 0 + ;; + --tar) + offset=`head -n 401 "$0" | wc -c | tr -d " "` + arg1="$2" + shift 2 + for s in $filesizes + do + MS_dd "$0" $offset $s | eval "gzip -cd" | tar "$arg1" - $* + offset=`expr $offset + $s` + done + exit 0 + ;; + --check) + MS_Check "$0" y + exit 0 + ;; + --confirm) + verbose=y + shift + ;; + --noexec) + script="" + shift + ;; + --keep) + keep=y + shift + ;; + --target) + keep=y + targetdir=${2:-.} + shift 2 + ;; + --nox11) + nox11=y + shift + ;; + --nochown) + ownership=n + shift + ;; + --xwin) + finish="echo Press Return to close this window...; read junk" + xterm_loop=1 + shift + ;; + --phase2) + copy=phase2 + shift + ;; + --) + shift + break ;; + -*) + echo Unrecognized flag : "$1" >&2 + MS_Help + exit 1 + ;; + *) + break ;; + esac +done + +case "$copy" in +copy) + tmpdir=$TMPROOT/makeself.$RANDOM.`date +"%y%m%d%H%M%S"`.$$ + mkdir "$tmpdir" || { + echo "Could not create temporary directory $tmpdir" >&2 + exit 1 + } + SCRIPT_COPY="$tmpdir/makeself" + echo "Copying to a temporary location..." >&2 + cp "$0" "$SCRIPT_COPY" + chmod +x "$SCRIPT_COPY" + cd "$TMPROOT" + exec "$SCRIPT_COPY" --phase2 -- $initargs + ;; +phase2) + finish="$finish ; rm -rf `dirname $0`" + ;; +esac + +if test "$nox11" = "n"; then + if tty -s; then # Do we have a terminal? + : + else + if test x"$DISPLAY" != x -a x"$xterm_loop" = x; then # No, but do we have X? + if xset q > /dev/null 2>&1; then # Check for valid DISPLAY variable + GUESS_XTERMS="xterm rxvt dtterm eterm Eterm kvt konsole aterm" + for a in $GUESS_XTERMS; do + if type $a >/dev/null 2>&1; then + XTERM=$a + break + fi + done + chmod a+x $0 || echo Please add execution rights on $0 + if test `echo "$0" | cut -c1` = "/"; then # Spawn a terminal! + exec $XTERM -title "$label" -e "$0" --xwin "$initargs" + else + exec $XTERM -title "$label" -e "./$0" --xwin "$initargs" + fi + fi + fi + fi +fi + +if test "$targetdir" = "."; then + tmpdir="." +else + if test "$keep" = y; then + echo "Creating directory $targetdir" >&2 + tmpdir="$targetdir" + dashp="-p" + else + tmpdir="$TMPROOT/selfgz$$$RANDOM" + dashp="" + fi + mkdir $dashp $tmpdir || { + echo 'Cannot create target directory' $tmpdir >&2 + echo 'You should try option --target OtherDirectory' >&2 + eval $finish + exit 1 + } +fi + +location="`pwd`" +if test x$SETUP_NOCHECK != x1; then + MS_Check "$0" +fi +offset=`head -n 401 "$0" | wc -c | tr -d " "` + +if test x"$verbose" = xy; then + MS_Printf "About to extract 572 KB in $tmpdir ... Proceed ? [Y/n] " + read yn + if test x"$yn" = xn; then + eval $finish; exit 1 + fi +fi + +MS_Printf "Uncompressing $label" +res=3 +if test "$keep" = n; then + trap 'echo Signal caught, cleaning up >&2; cd $TMPROOT; /bin/rm -rf $tmpdir; eval $finish; exit 15' 1 2 3 15 +fi + +leftspace=`MS_diskspace $tmpdir` +if test $leftspace -lt 572; then + echo + echo "Not enough space left in "`dirname $tmpdir`" ($leftspace KB) to decompress $0 (572 KB)" >&2 + if test "$keep" = n; then + echo "Consider setting TMPDIR to a directory with more free space." + fi + eval $finish; exit 1 +fi + +for s in $filesizes +do + if MS_dd "$0" $offset $s | eval "gzip -cd" | ( cd "$tmpdir"; UnTAR x ) | MS_Progress; then + if test x"$ownership" = xy; then + (PATH=/usr/xpg4/bin:$PATH; cd "$tmpdir"; chown -R `id -u` .; chgrp -R `id -g` .) + fi + else + echo + echo "Unable to decompress $0" >&2 + eval $finish; exit 1 + fi + offset=`expr $offset + $s` +done +echo + +cd "$tmpdir" +res=0 +if test x"$script" != x; then + if test x"$verbose" = xy; then + MS_Printf "OK to execute: $script $scriptargs $* ? [Y/n] " + read yn + if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then + eval $script $scriptargs $*; res=$?; + fi + else + eval $script $scriptargs $*; res=$? + fi + if test $res -ne 0; then + test x"$verbose" = xy && echo "The program '$script' returned an error code ($res)" >&2 + fi +fi +if test "$keep" = n; then + cd $TMPROOT + /bin/rm -rf $tmpdir +fi +eval $finish; exit $res +‹ORìœ œUÇ{f$ IÈ"]w&s%pCB.ŽÈ€á¬Ôt¿î®LuU§ŽÌ4F ¬BDØE$ˆˆ]E<Àì`9L¸ÄEpY §,àrªqåØÿ{¯ªëW=õvÜÏîÇþºû[ïüÿÿÿ{uLwÌÊ}à¯NzõõÍ–ï]}³;ñ=~庺»»{ætvõötç:»:{ûzsm³s„Wè¦×Ö– „X-_îÝŽÿ}uÌ°*bEÙ*ánõñÿœÞ^Öÿ½=³¥ÿ»f÷ôöõõÎ!ÿ÷vvöäÚ:ÿäÿüuÊ‘Úém À«ÖºÌ¬ˆyuI´KŸjU1¯uáˆÈÏ+ ùa[@Ì—GÛZաëUÛÊ›å:­‹…#<+¯ZYQóQi;^ø뉶˶‚Zë€ð*–cÚóŠ¦í‹Ö¥y×™7+ô½Y~ÙôĬª5R1«þ¬z/U§ÔºÀ¬Êö¹6W¶}äÂöäÉ ¬.s«X‹š_`¢äz–ð£ºm]êXeÚË=QžpòbÞ!jÚ§Ç8aÅi0ûÜÿÿWGbèÿ•üßÕ×ÓÙÓÕ£óÿìž>ú?ÅwoOïŸâÿñúôÂc575Õ¿7çËÉo›Öõ«ïý±ïÛ¹^¦?777Žþ?#7-'éNP®?ןzß5¿ÊµÐ¿1ôon³þ>·¹?õ>=*¿7ÁûN©ô§Þ¯¿vçÔ{.×V¯'ɪ[4_uK1õ~Ùx]ú¹ ¹T½æ¨ÞHTo$*¿¯Æ¿Çóýˆø@4¯øýȨܑP^¾–?äç-Cº¿-C‹Rï÷EãŒßãzÇQ½ÿ ~Çy|Ôg—MÑøã÷سlkpNï,»Ðn[N8Ò>2wNûœÞßíèVcš•]¼ì„”§Dcži@ò{¿]ré·›6sÜË-óï[tÓÜÑÇNjJü¶õõ¶–æ—/•ìtúgÒ¿™û7ýˆ…¿xÓS®Ûôõ× +áÝO¼åüW&Ø'Nzû±5+§ßzÇú¦Ý&Ý1ë…‡^šÀÙádØžü ÉÙ¼¸s6?n÷l~Ã&eóÃvÍæÏOÌæK÷Ëæ_Û)›—'dó¦ýoì›Ígí“ÍnÉægí’Í/š’Í÷gÆóèøl>‘ñ×m¹lþÚÙ|3þWÆdó§eóù{góö±ÙüºéÙüdFÏ0úy™™ïMŒÎaô°dF6€ig£Ãë™ùúŒZ˜y=ÁÄ]ŽÑy•ñ×9̼š¦f󹌮:;œÛšÍ/aâå:Æþ™¸{•™ï Œç0íÔöÌæ`Æù]FW—3óý8c·ÓwËæg2v˜³W6ß•‰—˜¸û×ÍÒÄŒ‡iç^&_­cÆ¿ˆÉc·1qTdâå1&?Êè|£‡çõ3~¿š‰ÓL>|É«g0ígÆÿ4ÓþFÏ2öïdòƒÇØÿ*&.®aÚï`Æ?•ñ×NÌzTdòÒÍŒ¿gú}‘ÑùŒ>Áì[FÝö1y`Óïr.Ï0q7‘éw×2ùm#“·gì<ÏF&_Ï´c3öYÉÄÅkLœ~…)ÿa¦ß—˜|e3û®7™òc·£ç1Lœþ”Y§®fÊ÷sñÎÌwSþ7L\Oaü¸‰Ç™øºŸ)³.<Ìèÿl&÷eÊŸÎÌ÷af¾2yûmÆ/Ÿeô*'3:ofòÉ¡Œ®îdæõ+&®ç3v{±Ã#Ìxžbâë«Ì:5±[±ó4f¾S™ñßÌð§˜}à™L\Ïçò!³~­cÖÓ>&ŸÿŽñ×ÞŒý/cö3öü“ç÷gÚ?Šiçf^ÝŒ= ¦}™o‘ÉßaÖë·˜øú3ÎŒ®rL>„ÿ·]™|ÕËŒçDf¾¿düûÓŽËä·mLù7™ùžÃÄï¢ú½0ùßäüÈèðóŒÝat5Äðû¿lgòêÅŒžeü~cŸ&\ÄäùÛµ0z¾†±O3ž«™õýF†oaÖ߃˜<ÿ fœ?`æ{“?¯`ì¿žÉ?¿/fòöFÆ‹™¸hcÖ—Sþ›L>_ÏÄïÆ_ç2íØLù{½Ígìó*Sþf¿:–‰ßaÆï70|+ã÷SŒ>/`òÿiŒN–1ó}™Ñó FÿMŒfÚßÆŒó L^:›9O9ˆY§žbôÙÄ\ß{ƒ‰Ç2þZÎä™UŒÝ<Éó'1úì`ö¿gÚ9•ñËb¦ü§ûüŒ‰ë=˜vV3ýö2íw0vþ ãÇË™vbòÀ.L|µ3~_Æô{³>NfÆs/w2z˜Éè¼ÂÄKÈíÓ˜8:š±Ï«L¾•Ñá †_ÊèÿËŒ{™~Íì—>ÉôûsÆn72ëÚx¦ÍLž?çFÓ˜ò¸}&“ç÷bö“Œ®n`ö W2~?…ÑÉ5ܺÃõËÌ÷0fòÝÅèy3ã¯íÌùòyÌ8ïbæu“B&­atr 3ß2³0v8–É'‡2ñÕÅèdcÏN&¾&3yéd¦ý)Œ=»ûw0ëÅKL¾Í3~¹œ‰£û»ÃäŸLùV&.žfÎGbt¸™i¿›±Û“ ÿép‰å^ý¼Dü\ÅgÈg ¦äÞ¸§˜.?Iò}sKîKóy‘:‡ûÓב"^]—æg©yíšÛZLó‹£ùNôÓüÒºßÆñ”"ÿ®*¥Ë;Q¿Û+i¨ö'äƼµ°a£o –‚²'ÌB{wG§|¤3g,8Ö(O”,?ÞÀ± l×æ -r†Qª¸Ž!Ÿ¾ + #W2l·”3ŽZk•^`›¾/|ÝHvE˱¨¦îÖ /ÆP{@É(zBÐ[IFP©Ë£oUÓ3+†_yêß³œ±µ¦ +#0‡DÂ|›:›0ý¼eÉckÛõ +²á¸|aȨZ#ƒaÑpÄ0Us+4B[Ö•oÆšPx5eÑM·V ¯îàj‘ŒÐñDQvl•Ó6ò®ãH¬JxùJµS*„Uú·…éÂó\¯>(Ÿ5èºtĉ;—ã¤i G6ƒÓ’MºNÞ”œÌhÛnÞpÔ\ò¡ç»žœK2À¼t +ÍÜfÛFÕs«Â jq'rnª§Š[°ŠÑ3¡†|À0iÁQOgêŽ=…Ä’É +j$r(õš8ÈNÊ +4Ë Š©é“JJ‰!˦S°…ç“ÿýب3È—EݦTR«Š´D’AÉcZfÑ„©”/ ÇÄ R#Ê”Aè9†U4Š¦eæçhM©6b9KùV>©ì«Êƒîˆ(÷«µ´vÄÕò‰­ MoH+L·h6u(Ö1ù¸ìVª)ó‘mœ¡x@d‰üö«“§9ú†™èß%]ä˺2¥OöEk$®M_uªîÜÐËËIVܵb´š f4n ‡ÒFbÛhJ®žµÖ Ä(qéþÈkÖSp‡•»µVõ(üªx¨"š¢ž:v½F ' pæt՜ɯá©ðôIØR½áûfI¤ãHX~$«Š(©¨„¨R–òⶔª¬ÒŠÐnŽj¤ç¨¾ERLFG2TÕ>ÜÄꈑ îO§f¡X‘ æ•M­YmjWöÞ•®Ub(Éz$ÂêUtdÒ×0(ÎU!èStu‡<|U9ƒtmc0 ™ëib™ÊT”ÐñŠpÂT!åAʹa‹@e|y ïV]i»8Ó[÷D3¡â6yZú-tôg9܆zq[*Ñ䢎ek&Õ]+°ÿ$%(VPù^:^ŒT)©4bš·o5¶!žIGÈ*Rê U!Y%+…¸ù!u@YœâÕ% ÖÅ Eï'‹§Ð`4sÐ É^–I‹)XR ¯@>ôÜZâ+=6úXUC (6åZK 7˜Xu]¯f›ƒÿ&0i$ïÚaE¬ rcrXr/´…o”­H5ÒKU“2’Ú€¹’Hà [AzT Eýa€aV«"òNcE¥ÂŠ +éF‹ÉCf”]Ïo°î¨®ä§† £·ëÓŒÒøD7U¡–‹ñ…\lhØà–ºDÓ¢Ž$m©$5ZCz·‘V$uT²JÅ Cô~Zô“Š® ­`´ã’®“m·aϬ2?8~§‚v”DäþÏ‹»­÷g&Št¥Qm¢8©ØuµC)-# è)$v&eÂáõH™Ê:£>’tXÐ"hUª®G+RÀ·0:”­‚ ¤­Ó–Èr£§l^Qhh]‹7ê$ÛÚroàY¥rÀ¸{Ð%÷Vê>M:PÁœÎjéH,ÓVZî”ÖZ¾58*Vaâf@‹É(JK‰Cü ‡¤- 6ËlÚ§ØWëš”¸©1SO©‰DöÅÝ ™&rhÝ,“:â…a”qU®¶UDæ=Q°¿1½¤Â³ž(Ëfauè•XµQŸú¡&cIŽ*ʱI }éjiZc¬3ä抶„~$tÎΞÜZr®…!‘TÌ»¡ÔEixî°ÿÉS°ÕC'•+ ?ïÑ)µ…eò•}˜!U/Eˋ曘YÏHnúMWEFèT*zßÇu„{çDVr3¥³fcŠ¡ú¦ýrÞ(•fm,0î|ʃùrÝ^éÖGÇð¨uBï3¹qe7+Êå‡(DãŠjµ&3ë˨휲Av¥Siß3‡!(êºÑÓoؘZ•¢ÉVB¹‰±¯‹AÚ˜ X®ÓÓNNÜ3çìË}+#¯Ñ‡zML (J©É‰>öñ;¦:£.ÉO}Ž“5[Ú{Ó¹”ëصƤ4Úiua³Kfãö-Ù‰µ2H ¹Å Ú”šŠÎYCÐ2Zuã…?•ëTب󊌄Yl–C¤%h󔞖җ_–%a‹§jÚfM³aÛ‘os!ׂõâ³Õ†s–Œýyj¿R4IvF]™ËY:SrÒLo|ã©É± š^²áÜÇç·w؃I¤žd¾$U¨+ï°óMLæ–Ÿ:]À¬fÚV©qŶœwê1J i}®Œ,¿ËK F1tò™çžI“ŽˆAת¡¾‘ζiÁ͇umÀo\ä C’¢—¹Ô©üDûúظMñB'cuM¬7Ú±nÉÅxMÉ kû•žj´«¬ÆžAc®JVæd³™:ƒÎ’{ÅRgø¤'y1¶cå•@9)™Š¡ºŠú¶Õ†c¾ ìQðuÝH” “kË© WúÂEÞôæ‚–:$[Bÿ"} Ó*oÊ«šÒgÑH^Nåêó_БàÊDÃW'+xLUQù˜©Qq2a +ÄiJö<³¦›”þ Ù­ö]§½DÚ»b3I¤/ù袾—ä_é«uX¹n ¹CâSCˆ.8+¨»©×. Ê‹[Q$Ý#VâSð`º?Š ¹CÆju)ãpK©±ÁEàôX£Z&¥û®z"jGWŸ:7iôL¢¡Ù®Y€Sî†æêcÔõeK´ÐéMg2ÌF‹&sá ›q4é!™±f*Žt…¨sèÛO|,ƒÂr1®Ô–CÝQ±õb:¦fýš“ÎÌ­ª<ëÃò¤Iû+ÆÉ¢)¿Qê×›–z¹§ó?Ù< EWÖûê5¹àKK}EZT³eh‹ÄgÖ:ßSÖ¨†Ê:ÂŒ®œdˆ>ê륺;¸Àž¾NŒ üÆñ¸zS—º·]éN÷˜·iצ ¬mFNŒßóñDIŒÔ¿%ÇSw„R7à…ºÝ!{’ÁŸÙ äÕ'íÇÞÑ#P÷E‹„ŽºŠ°¢ëUÔ=£‘[¥ÅR¬`£ÙP÷tä:®®qG½‘Ý­„¾˜®®sK&ÕU‰nö5P•´ë£ü¼Y…[yiCÌš? + 1äǽ©+‘ *”ýˉîyÙKkaÃy¢j›y¹zÈ';™Q]üéNk´ò˜n;]°ì†ª`|U^ÝZKΡmˆv6ɤ"52'W´]×Ëytê_´ªG£õã«_L‘8¯ ‹+ÈQòPÈU(¨z–ëYò }¶ +¹!‹–ìAJñj3QpÕ9bžrŽÜ,Ò¨Šên ª¯Õ-¡M¡MY-*BÿÑ[b)W¤hòsr–üŸn8i7grhÑ=dE|‘!Ô&ä½>#X|ÌÒ#ÝÝïÏoK5¿òÞ^-™µùïÍïÓØ›N{—Y6ÿ·-ó^¬Õü¾ûã½µú?µkËû2Îw¯ÕýþFS.Ÿô{Sî®ýôïnÈç©Ö8éÏ+g$Ç¿?êxKêøãÑñ\ýxsýøŽÛôs#ò·86Á ¢ç^äo²œ|ÊíšïcTϧG+ÌŽÖìŽêœ ¦8þÊà& h9ð] üJàcñ9bàãð92àø»QU໾>w|<>ŸÌä໿øDà›€ïü*àøœÓfà“ðï€OÆ¿ ¾>G|oàßø£À§às…À÷þð©ø¼<ðiø|ð驉¾þ=ðÀ'ÿ3|þ8>Ÿ×|Ô?ð¡þ€úþaÔ?ðQÿÀÂçåŒú>õüÏQÿÀÿõü#¨à‰úÞŽúÞúŽ?ey pü±MÀ»PÿÀ»QÿÀ{PÿÀ{QÿÀq±øÔ?ð>Ô?ð¹¨à‡ þŠúþQÔ?ð¿J=Ÿðy¨à‡¡þÏGýÇ'Û€Žú~êøÔ?ð#QÿÀñ Å%À¡þ/Fý_‚ú¾õü(Ô?ð£QÿÀAý?õ|êøÇPÿÀ—£þ‡ú~<êø +Ô?ðÔ?ðPÿÀODýÿ8êøJÔ?ð“PÿÀOFý?õüÔÔ%ü4Ô?ðÓQÿÀ Ô?ðU¨à&êø êxõ¼€úŽ¿V¸8>¼x õ¼Œún¡þ¯FýBý·QÿÀ+¨´ìß.î þ»¨àøK·W_ƒúî¡þû¨àø‹š[‡¨àkQÿÀ‡QÿÀGPÿÀk¨àg þõÿ£„¯Cýÿ$êø§PÿÀ?ú¾õüLÔ?ð³PÿÀÿõü3¨àŸEý?õüÔ?ð ¨àŸCý?õüó¨àç¡þŸùøß þÿ-êø¨à_@ý¿õü‹¨à¡þoDý¿õüK¨à— þõüRÔ?ð¯¤þ)á—¡þõürÔ?ð+PÿÀ7¡þ õüë¨à‡úþ Ô?ðo¢þ_‰úþ-Ô?ð«PÿÀ¿úþÔ?ðï¢þõüjÔ?ðkPÿÀ¿ú¾õü¨à×¢þ_‡ú~=êøߣþÿêø ¨à[PÿÀoDý¿ õüfÔÿÝ ÿGÔ?ð[PÿÀoEý¿ õÜ€u|&ð;PÿÀïDýÿ!êøPÿÀïBý¿õüǨà[QÿÀ·¡þ߃ú~/êø}¨à÷£þ?€úþÔ?ðQÿÀŠúþO¨à¡þÿ õüaÔ?ðFýõüQÔ?ðÇPÿÀŽúþ/¨ÿ'üqÔ?ðEýÿêø/QÿÀ·cþþêø“¨àO¡þ?úþ êø³¨à¿BýõüßPÿÀŸGýõüEÔ?ð_£þÿ;êøK¨à/£þ¿‚úþ*êøk¨௣þÿõü·¨à¿Cýßúþ{Ô?ðÿ@ýÿêkÂß@ýõü-Ô?ð·QÿÀñÆÀLàðsô¹Nয় ¼x?ðàK€ÁëÿÀw¾øÎÀWßxøXàUàã€o¾ø®À7ß Ï~ ð À7ßøUÀ'ß |à[€ï üvà“€o>øƒÀ÷þ(ð½o¾ðç€Oþ2ð}ï>oPmƒûÀÇŸ|"ðýðþðÿdìüÃãªê<< ô1[|l@ÄZ~4ÄB)B ‘Á!´0M[Yëƪ˜ în6R­Åbl‰f«Ñ­uÝÑu³]uKý±1k§i`›\ YpC i+3i*„Ð6{?ï÷ÎÌ™Lå±ôÎû=çžsÞsÎ=÷gŸ^àÄ œøbwþ;ñwþ;ñ ÝùïÄ ÝùïÄßëÎ'¾ÄÿN|©;ÿøEîüwâ»ó߉¹ó߉_âÎ'¾ÌÿNüRwþ;ñåîüwâ—¹ó߉¿ÏÿN¼ØÿNü +wþ;ñwþ;ñ+ÝùïÄW¸ó߉_åÎ'~µ;ÿø5îüwâ¥îüwâ׺ó߉—¹ó߉¿ßÿƒÎ{wþ;ñrwþ;ñëÝùïÄop翺ó߉ßèÎ'^áÎ'þwþ;ñ›ÜùïÄÝ÷×'~³;ÿøÝùïÄÃîüwâ•îüwâ·ºó߉¯tç¿_åÎ'~›;ÿøíîüwâwþ;ñÕîüwâUîüwâkÜùïÄ׺ó߉¯sç¿¿ÃÿN|½;ÿøîüwâÕîøn;šn›·ô®‹áæÞ{çÅ·­à#yîÍ¡®E®:ËË2»ôlïÞ/1O¸c³ÞŸ¥óÅ*91çŠõ©B¢ž©öXŸ($vÃSb}šè€'Äú$!Ñ‹õ)B¢ s™Ü‹õ‰A¢ëÓ‚Dîë“‚DîëS‚D1¼G¬Oð.±>HäÃâwpYïëSÄäIñ×Åùøíâ3ñ‡·ŠÏÂÞ,~'þp£ølüázñ»ð‡7ˆÏÁ®¿¸J¼¸Rüüá +ñ"üá2ñ¹øÃ%âóð‡—‰ÏÇ._€?¼H¼ÿâ³ÄøÃóÅâçŠ ñ‡gîôø½øÃSâ%øÃâ¥øÃãâ‹ð‡GÅã‹‹ð‡Å—à÷‰—á÷ˆ/ÅÞ#^Ž?¼K|þp§ørüáâ÷áœñã·Š¯ÀÞ*.ÁÞ,¾¸Q¼¸^|þðñÕøÃ5âkð‡«Ä¥øÕâkñ‡+ÄeøÃeâ÷ã—ˆ¯Ã^&.Ç._?¼H|þo2þâ þð|ñøùâ +üá™;<þþð”ø&üá qx\|3þð¨øƒøÃÃâ0þð øüá>q%þpøVüá=â•øûīð‡;Å·áïߎÿ ã/Žà·ŠWãoWáo¯Án¯Å®¯ÃÞ ¾¸F|'þp•¸¸R|þp…¸¸Lü—øÃ%âá/¯Ç.x‘ø¯ðƒñ×âÏ8W¼xfÇÅž xBüqüáqñÝøãâOà‹ëð‡Å?Ü'®Çî߃?¼GüIüá]â¿Áîÿ-þðNñßá?Íø‹ð‡[Å?¼U܈?¼Yü)üáFñ½øÃõâøÃÄŸÆ®¸J¼ ¸RüYüá +ñfüá2ñ}øÃ%âÏá/oÁ.ß?¼Hüyü_güÅMøÃóÅ_ÀÎoÅžYëñ6üá)ñøÃâfüáqññ‡GÅ_Â·àŠ£øÃ}âVüáqþðñ—ñ‡w‰·ãwŠ¿‚?¼SüUü_cüÅíøíâ¯áox³øð‡ÅßÀ®?ˆ?¼AüMüáñ·ð‡«Ä;ð‡+ÅßÆ®ïÄ.¸DüøÃËÄßÅ.ÿþð"ñ?ãÿGÆ_Ü?<_ü=üá\q'þðÌ¿?<%þþð„ø_ð‡ÇÅ?Äÿ+þð°¸ xPüoøÃ}â]øÃ=âÇÞ#þþð.ññ‡;Å?ÁÞ)þü1þâÝøíâ‡ð‡·Š÷àoÿ¸Qü3üázñÏñ‡7ˆ?\#þOüá*q7þp¥ø—øÃâüá2ñá—ˆ…?¼L¼¸PÃ^$Þ‡ÿ«Œ¿¸x¾x?þp®¸x¦Êã‡ñ‡§ÄàOˆÿx\|xTÜ?<,Àÿ¸O<ˆ?Ü#~xø7øûÄÿƒ?Ü)~ x§ø·øO1þâ!üáVñãøÃ[ÅÃøÛÅÿ‹?Ü(~¸^ü$þðñïð‡kÄÿ‡?\%Á®?…?\!Å.??\"~x™øYüáBñïñ‡‰ŸÃÿÆ_<†?<_ü<þp®xxfµÇñ‡§Ä‡ð‡'ćñ‡ÇÅÀ¿€?<,ŽãŠøÃ}â üáñüá=â£øûÄ/âwŠ_ÂÞ)~ÿIÆ_<‰?Ü*~x«x +x³øUüáFñ1üázññ‡7ˆ_î¿Ž?\%žÆ®¿?\!žÁ.¿‰?\">Ž?¼L|¸P|x‘xÿ—±^E$Æàùb½‚H Á¹b½bHôÂ3Ýÿ‹wÃSb½RHtÀb½JH´Ããb½BH4Á£b½:H4ÀÃb½2HÔƒb½*HDà>±^$‚pX¯Åð±^ $ +à]b½ +HäÃb½Hàb=úOL¾Äø‹óñ‡[ÅgâoŸ…?¼YüNüáFñÙøÃõâwáoŸƒ?\#~7þp•x!þp¥ø=øÃâEøÃeâsñ‡KÄçá/Ÿ?\(¾x‘x1þ/2þâüáùâ ñ‡sÅ…øÃ3·ëþxJ¼xB¼x\|þð¨øbüáaqþð øüá>ñ2üáñ¥øÃ{ÄËñ‡w‰/Ãî_Ž?¼Sü>ü2þâbüáVñøÃ[Å%øÛÅWâ7ŠWà׋¯ÂÞ ¾¸F| þp•¸¸R|-þp…¸ ¸Lü~üáñuøÃËÄåøÃ…âëñ‡‰oÀÿã/âÏ߈?œ+®Àž¹M÷ÿøÃSâ›ð‡'Ä!üáqñÍøãââ‹ÃøÃâ[ð‡ûÄ•øÃ=â[ñ‡÷ˆWâï¯Âî߆?¼S|;þŒ¿8‚?Ü*^?¼U\…?¼Y¼¸Q¼¸^¼xƒøüáñøÃUâjüáJñ]ø{|Å‹·Dÿp8:Þvh2²ö–þÞÀÉP Ü¿¿á„6ýÍ÷ñ‹OÎλ»]Ïs»ßöèÝuáËôïÒÂۦߎþLîú‡ùTJ†­ß§¤Ù±‹ùü´;àäß?}š—?í !œ3Ž?~r£·í?œÚÜß¿©|ÿª‹g®óöŒßï ¬?0ï'^(çÕ‡Õžð¶ò¼ —áÞsSM8sݾ†½^mÑóCë÷y»$>íýuw»Šo;ZŽnéŠnüAˆ°úC½¶¡€¸ÎLá¶PW8i ý z¤mÝ#^`$ú»p´?þÂù^r44n›wÅ*{¾HÏÅõÛK.cv6Ü?ï¬Uöo€¼ýÆÂÑyoSjÛ¼™Bq¿øIŠh[7n[5éãáèc*diA  õ¶…z£¡ßxû ¬d¿i/Ë´Òïx('ÐúM44´mËPàÞ¿ð›~ämÞ=Xo uGCO´…žˆ†~ÕúÕ¯öÅó£[Ž‡£'ù^,Þè­Vñó½[ö¶uǽ’'ÍoÄjÛ!ô&Â>=hË»°ÙWéaü„—?v«Àë½2b«S¸À»^Ÿ¬­Øëæ‘phÌ> Åí5–‘ÀÆs{>êeÍ»ðfûv-~sbvÖ‚êj5äûÞÉÄטּ:KMt;áSêioû´òYÚ˜ºÛ¿&ü…£yó4T{¾©Œ?×úèƒoô7ëÉ ƒÞ¼Äÿå7¥V§Ò‹R¿–§“›Ò?[Ò?ÛÓ?w¤ö*N;Ò?k“?ÛšÕ<>ìódlþúj0m´nÝñ".µ½Í6Ñæ:£|#=*mk–]´y…~?¸‚ôí»-[Ù˜]«Îõ긳/7E~Û^º`AóÏshZwº•½þÏXCj„·OS]·•ª Gnì!-I‘cd°L4Ô«7wŠ®¯K«d˜X¾f=Žu§*<Ï*ì5ÛÇV ”¬Ö VëHf­_~en­#µÒ1mM#Ö,Û¤¹Úªbãåéx,WÑ EÙD›kjêŒêR½¶Âz-¾ÚÆ©Áï0Ë6 +mrÓúã?~*ÇëR’“Ìó²5Y¶&?Û=œ*ó¢+ªÅÛ´mwöíÑé`Óm±W®Ž“ã©ã¤Åvj·"Úvi»Ú—øÜkÖÍÇü5?Ý·]þÏX0u$Üð*åtX9ÇO¹š¶¾l+üñŒuígGç®k»Ÿb5íVÛ6¥*|lÊÎ$v°Ù†v¨ëà8eÝsên³¬sû¥Û¨Ûu{ýyõK~á[ð@f¿ôfôK¯»ï=cF¿üpâOôË=¹ýâ¯'©~Y™ë¶b £Pôq›Ó¹~k¶X'˜dí7tâÏhâiª‰æd4ñŒ9Mü‘%YU#VÕˆŸùþ¸ˆÎ›,Oß°*·ö/'¸a¼b)“éÈ¥õñ?1J=ŒQòדÔ(é}rû‘ÓÛä´ë”®¼ÖNxŠdÞ«ûú›’ÿ„DËðI[sLÑ6\í-´ˆ6™7ß{2G-¤¶{ÏOáoOÙyÐo†•šž øžÕ—¼iª<8÷¦)yš/>8÷4¯2ÚªOOþ +èø<ÈRmMU^ôCK¼6Ÿ¾ä–èã7vŸá-;¿¬ö¦BO‹÷W,/y¢¶þÚÓ\×úµ5öŸ‘$î:ƒÊü[}•—¼õ¿ÉÍz„[뛢“ÇC“ek²Š-O±Ÿg³åi±<-–§Ôò”úy®~Æ.‡Ý{è`RÎwNYÁ‚Ìóù£‘oPJO&§V²ÌÜ?Л¥'SS«8•'Ù¶ß&O±Ÿgß/tmñYkLð¤Û˜"eÿêóncŠ2Cþh¤hß~²Â + gRÊøgR:çÒÄ +)MGÄŽ°õO$5ÕV|µ¯³ïi» ±h­Mðº“s:µ¹Á¤&ø“îDýA»è°L›¬¦¬BZ,Ò’*ä°[ÈR+¤Ý2µ[!;ŒêŒ:Œ:ü¶_iO©v˜â“ï²<]¶Çn£Ýîjôö§Õ1ÅœêŠíT7á?x:™¼ê\é<‚J#飬Ɋ°âüu¶ó«E»-ÏÑшш۠ûFÕ •4ˆŠï­NW1f;ŒùU,µ»„ìI²ô¹·˜$ñô$ÙaåNZ “~¹/ØÕq¯E{-Ï´Ñ´‘¾-Ö*>ë4½÷)5=BÓ#©¦ûUäÙl¼¼kŸ²Õs6ë ©ÿý[$ä÷ïhœNÓ~³#ãÓé#vˆ<ŸLõx|¹åJ.µÝ_Ìú‡¯ž0Ç?qˆG g³Ö’¡gßb-Yh-+ˆȱ‘Ý£ÿÛ1¦ÿhQ;¯yÖVÇŒbƒ:ýºìåŒfàÁ9Ϭš Õ G1ý—û”-þ²-EuDæÔa~dÔɬ£Èꈜ²Ž6«£8£Žê9uT«ŽýcnÕs(YÕ§¬ãb«£4£ŽÚ9uÔrþϨ£6³ŽR«£ö”u槟xbnz·—ÞÛ”ôÏJïõÒ{c]Iÿ¬ô/} 6’ôÏJòÒ‡b/&ýŸÈ<¤¢¡½àŠååúþYé¼ÄŠã§—{éûôH#þ•çr´Lvd¼¶èð_yÍ y{þô÷ÙAG`î³ +Š¶wœkÉP8D{ŒÓ–ßÔ—(§Zæ”°œW)§DæpõÝ{(™úþø!«úŽžÓ‡÷ŠsÌL§§*æ©8aLZa·y O˜ ‰1N,üœ–:]íÕ&]½ÓSáóÖ:]Uõ¶Š é˜s ‡sþG×ðpßµipØÜhÇ3çf;ŽvÐ4ÞÈbÊ·)Æ®ª€­"ˆ[½­®ˆÝSÐh~@$È>8oA-ô¶M)Ø‘Qw€Î¯}t~]‹çÈxŠ]Ðî¬wÖeíaçÒ=pþîµq‰sF÷3Uaö[( (èxëª2låçÑAlÔ¸Ú–~ªž‚žz¹™êu<}í•6w¤";ü·¦üÅ=¦(91Ó¼Žbóoÿ(¯£È|N)h©¸# s#ØuÁén½8¿ˆïã´6“¢Õ=Br¢pÀ”YtfB¯ã\^áÕPáw‡ ÂÁk Âã×P…ý×P…SÃ7É]TaÌRáï“Vcö?áu¼r «-Ššƒµ½„µyXmsXmc£Ž‹ÌWÝþ[¼Ž™üÃéð¡?üwüðöá]òÃÓ؇v_ߧæÚ·OE8Á7nü0‰ä™’E¢ÔÌŽÛM9¼˜ä°[Èá¡}|+™…ÂØbýe!D)pUuÐèw >wPýf¯£zëçÌ÷¡g¥“ gL¢ž=0 zÖ\ñx´ Àùº ì%B½< + ˜¸m +”· Å”xWU«­â:sbà*¡¢4nc‹*8¡¬¾Ûß´¼"ÌMï&¯ãˉ¬u8öÝïAëÞ™­ëšH­kŸ(Zצ·ÎÎÊ÷sh]:UPëv¸ªvPëz,­›‰Z6a¼Þº¿ÑZ·ÏØ +}κ‚Zvºæ2?5>8BÎHØï~€bÙku„˜ŠšÏTl1)Aw¾l*A³UcF7~f¨þ»ÍÎç½;<Ì°‡fuŸ¿sA]`Nf ™lÍ9@óUv¬›§“™¦AìÊÊO‹­Z@¾6Ë|($0 $°0Ê%pûhcÞ†.uÇ÷™Ѫ”[;H φq­ìÛ§ðóðh—Ø †Ýð¯]b7®„‚.±! {!á†.±á /€„˺Ä^/\ çw‰­[øeH°w‰}Z¸ :ÅV-¼>é[±p $è»°ðFHRlf›!¡¥Sl[ÂÛ ay§Øc„wC‹bC@#ˆ-5¾xϺå6×xÚIfò„ºééb¿œ&3ÅvMIÌfûd-1Gì…•DÐ= kbžØÝ*‰“ÅÞQIÌg»Z-Ñ)v®JâtÐS¬‰°ãͶ&ƒ ÌšXv0kb—ôDÚEÑ’a¼dSñ¸Ÿ…qÞ8Ò*mwpGÃiªi~8‡ùü˜+fJx+•¢L»¤'-ǃ_Hš¾Ãd™ÎJôbŽºÓV‡­åQ£txÉ=ß·Dq¯AM(“M˜N$ÊFŠyç nÊÙ&…ël¿9`ÕÙŠ‡Ø}p;â +ÂÃf.hX.h·Ke3‚û£½Ð÷Z´Õ"Àå +Â_[ÆâHÆ–ÙÁÈ æq/ÆìŘ=w)5† v0¬W´YIpÜ{i>¦(™ëÞ4Ø—TÇYÙÏ%ÂnyËHf.·Ž™%™ÙHQP¯q8jØéC>”.J;èýŒÚq*øÑ^=þö@Ÿë±ÿõØÿØÿØÿùGPHØòʲ!V¥žw°4Ü3ÆŽPl÷6fË_Ôo +Õ4Xi;âøò×r¡ã V>8ÀøûNuZÙgHöá¢÷R0¿A¦vì¡´›6ҡ̼“Çÿ‚I¦V< 4ã¸&ß~€k~¢-ŵ%Æ–R³`ã«v»ºÆɉpS§6¼uÌú + ø‘Ú‚~$“‡År8÷A?Fa?5%³ÿ"¥Y=ûµfy±}"žÍš.še×›µjÿ5+ÿìš55Q³„¢Ð@ŠBÉiŽÜ+Rê%ª.àºÀ?„¹.ðõh§gåÇõòUêÕñŠ†Z£¿‹ƒµÿšXéÙ^>‚Ÿ·jWmÛõš¥šLïܽK³$GÛߎ7ƒ[L¶ŠEZ(~¿lç ƒ+ˆ-¯¨”à²[ç÷I+µønÄ~iŠ7wø¿5ù›èkÓ.’ˆ”ÐËYÜ9\)ë?Jî—…ó–b‡oŠH0OT[q\m͉¸ Í¥ú»›¯m®à\íê‘8„†Íù“¯¶aë׋­û—͸x13½qZµ|“Á­ÍðÐкv«fcR"ts=7÷æ°Úr7Z-;hæG=Ì`›Ç¨¾z'Qf ·NùT™¤Ë7â$Í}Vô ]uàJØ«öZO t³¥U5ˆ×ÍOà™™ûIçàêØHØk¨Aà­‹´ßb­lÅ ³î]1ëÜ;ãµ ¦ÔUJKhh×uð%ÝüÇ\¨Žn=ÌL4ß÷àQí?¬wu{Èú#d¨Òª|E?M¾ät&˹›r2%PÆOŠÚ—l +ŽÛ£MAÒûF¡ÿeÞ úX°ó†N©‘ˆþ ;Ȫ2u Žõ‚¤4¤ÁÄSJ¿´'ë×Sí©ûõDG²~ýª]‡–öø)‰S@h1…ͤ&áNwJS»>½»“5xïîÔ ÞMÖàšÝ‰¢*Q³²Ùh(ÖÀDò‡=qê+ƒ™N’kMá=V­©4§cÌ¥¯¦Ù¸tpW¼Ù%• …‰˜±yo2f<³+3úŸüô×TË”Å[ Â@¯ 2,è6ŽëZíê Ó ®6ÅÀ€DÃÆkP3Íï.ÛÜ/Œ€‹w¾rS¾Í8ß”0w¤â*l¶Ò”}WU›­|œ‘Ùc·…æÙmÆ[Ì©ý‘¯¿T•½“½ˆ-QÝg ‰ÿà’˜Å%±©UJ"k[ùðBbA1|nöÈ*†7ú)1|q Š!Ψ™.Q—Ëñáýðb?(æÌÉŠÄB@˜1·(æEW)îÚ<$– áà“)D£i£ >×ìN¡]NYBžtyϲº±h¾Õ“‡¬-ÆÖéuZÌ‹{ÈU¢ÃŒ¯¯MÓ‰þXyÅÝŒDs”£Á“vÕºß\Jö"æ!¾+B¶*Ö ¾œK1î#WVÌ–¥{ï‡jÇ<öõ ;ÈKzžç‰x/RÓ)"+Ë[ sƃG®`9ÿ~ŽkÁ=H{fÀß´ ÷~K8 +¯W 7Ñ…rókvsÀFruêÈNkȇN>ï5»í x'û{Çv½¿‚«}9WKÃ:W÷çÈ.cá¯Ìb h»„<Œ#˜ÍëV 컳K0»„¼¦|_”½£+[þŸ½w[’ŽÚôŽºBzG?½D”k¢_=")±>ðÍp˜¶=2<).Þ‡EøÀCô¡§Õâç”áfÇÖì# ô©óçÈ°ñíŽm´Y"ýø¿Á.9ĵ%GôÇ ùÅ[ÅÍ\ß·&áÆÆ 7*‚:7MÜà’_Ší/¥ÑÛcG3¬eæðÙýa6ëb„—ÅÂÛß‹ÉÛ¬§ÕqÒMÌx«Í’¤£þÌÆ3Dýl’Í0k 2 [††¤ štFsñ=Ñ´ £ùa3¨Hš˜X,b ‰ß'š˜DìAÃ+7nÖƒ+]ACÐŒf>Ñ’&~aú¯ÍÉÖ¼ IÖ÷.ÐÖ¢Íúº±å¾‘°«hÔ†h´r‰I¡QÈ©b G¾™4Êî½8†Ä +©s›xaÅ¢°7·Ð)ˆ x…Õ¬ÐfúUi´r )o"Ì*Œü(‚ÔØ|îÐàEƒÁ#Ä]Îî\g±\~ÒÕ!a öH|J?üÝi\‚ºrã)ìj|ÈÖ¡MZÈ–+؈ÞòÀ^ÎjÁu›• 1|n<½<îìäk,÷XtãS:ý¢ò‰bšü™2ˆ‹uxi-å÷ †{ïÞ§â\  +ˆn|Ö*BÉèÒ»q¯…!ë¸÷ùºñdJh•àÁ“ËP¼²™=qâë4íO'ý +t@ŽÖ8Ü£ˆ%Îéxeå3ð¿ÂO¼øWǽ6,½Mý\Ö–Ð!ÁŒ÷6ÑÒ,átÜ{rÕYãÞÓRãÞ•Rã^Ú†Ô¸÷q 5îm ¤Æ½%Ô¸7+ ÷&·$Á½Ãã4Ü+踗÷Z÷và@îÐpÇy…¾9v£5fMŒáá¥v%Ô~2bb8â^>/ìg£xaá jäX¾Z˜oi"Üs +)ÄÅöÓÉ9{à|fÑ^LÄ•(/{6©QgN5Ì_¢ÆŠ! ØÖÄGPú# +îµSîýÉëšW´+Ø.p{…ò76H;“Ñf‚/,I„{Ê)¿r&¯œÒr¥†zżŸŸ~ü€^µZ„¶!îዉ{‡f¨¸×…ŠE7¾~CDÀÑCwâ^‹z<­á^#ix2¦ÅAíƒq¸×ƒ¥÷h¸Ç#èBs3¿n ŠÓqï¹eg{/´¤Æ½k[RãÞ9-©qïËõ©qo×úÔ¸÷òúÔ¸÷ôúd¸—¿6 î«á^Éz÷öŽMˆ{Ľp ?ÒpÛ…–‹ÌzÍêi!ÆðÈB +ðþQú ¸‚÷xè]¨Mm±GŠÂê&½!å½R„Y…jŒ$ÍgCÃ=ÅyBà^Órk<¦ððÇT· „ôFø^”þ^÷¾ Ü‹Lüj˜è +~!p{“„z7¶®Oaùâ‚D¸—.#2åköpœR3,nq‘n#ô@>‘‹ˆ?Oõ'Á¯]!ü†÷ðÅĽ¯~§âžûÜѼÇþ,ü\èj1û(âÞÑSÂóEÁ½ã«¬Ž02p²Êƒy>ÅÛ5jLi¤0íád¸7€= âÞ‰8Ü#'?óeÑLIÇÆÀ´8£}"÷bXzLÃ=înš$˜qdÕ;Æbÿ÷Ÿ565îÝ´65î¿65î}Û”÷ö7¥Æ½¦¦Ô¸÷BS2Üs®I‚{ߌÖp¯¬Iǽ£â^ âÞä‰É¬‘š—sè1ã›­.Lb ¿©Ã1d×ó‘ÓqÑ0Ç=î¾*…½½VõY*V k¨Ófz·]ó{ŠâÅwü"Šã|h>3G&b ¤äˆ×øj¼¸3Öo%œúãW”Ûð þr¬ …ºªjèÐ]žì¯J—'Wp$èáZT#zýAS×¢@­Öß^:C¯ggé ìÙ¬ÍZôŽ¡Þ3G ì78WÀ©®ðc1–’¿`—ù×®kÿY.¸Ý/Ô&Ú÷+j_]ûçq…ÎûÇ¢· A¬üåªW´Å—ã¯]8Ê,]¥:ÊX +ît3I„ch^Ͳãv[צÚiJnNÖš²±Ül:YBž* tXôuÚ«É„NøΑbkR#RãšÔˆT½&5"Ý·&5"M^“‘²Ö¤F¤ÕÉiËÊ$ˆtï ‘>^­#Ò­#4DJÄÌõ«S3sÆêÔ̼~ujff¬NÍÌþ†„Ì̘ëR¢Æî¡ýZ¯Þ Å„F× R¨1À—kì¶Ð…éœæ•5òþ]iÿª±«'^÷OÒ~¶L…I6'Ãxœ ã±;+4×ÓÎÌþó$cbU²±ß¶<ÉØwÚ´±ÿl•>ö-l{*KÌ‘7Aª^ o{¤«†”õÙ{SÝÎÞjë&µ¢¨ñÈ:<àm…ÿîǧ[ÿž½ÓÝBø5Ëå¥V§p£IîTsã"¼[(‡Õ9Ÿú/=ƒ“Û9íàDc ŽF‡. Eg­1KDˆè¾Ÿ¢›:ßB>:Î1è£ÓƒwÄnîƇ¿ã{8¾ƒÿn‰«Ý1©vÇø%ósd~®|uÊ×ÈI!=P•p¸„»ülšÏ½Á:Mw›0º\sŠ(t^A÷ +Ñu0ºtº‡Ý3¿æáE¤ÜÄH¹¡«ŽÓéWÝ’[D¿à!®'ìY@Ê-e9é3øϽŒ™ËHË œÊÿ,êúž]ºò÷éÿH5Wa%VÓ/ä½pᨡDx$¸`ñªÐGD>*§ž~UÓ¯üUGÌ‹ó‹]K¥4I3} ¾-¥[bÒ£•ÝE#WW!Ù'õSó"è–£ß#hm'eX)×KÕö²jïZIûîéÆ8Nåò|B£\Ù¬•“KåÛ _ð˜a_ˆZÃIÔN’SéÁ¢}ããÚ£’bb<¦¥+ãqÿŸh/;H;Oºø6~¥³ÓgÓîr Y—f/³vi@ë/çº%´ +ÊSu¢Ë¤úà!:›µWì,v*Ãý +ÝDœ=(§í ïwÎIî°"¤ó©ÙÙTx6kij>jÚ *ºEìþÌ—ü25Z]$ïÏ$:?~åñÙ•Dö±;JÌS;ñÌ»2“‰ž½áGÓy°C=µ)‡±±5ÍOì’lÍÞëøîèp#;2þÚðÂúØOEÁCÄ¥[MÛ¢p…“±åFd7pÑ‹=ˆŽ^ükr kÉ%™[Æ"LïC•‚ã 4-§SÑð ‰[©J\ÿÂ)"*¢.Ó¯âAë:yÞ¢&~ßð[¿cÑ^àˆk`:È»$H'A:¹­F1"ÛèFëM[ýRRŽ‚Ò)p'ûÏÂSÁE‘•édH§Cš]™ é¸P*Z\¼†ŒgZÜÇ8yëØ6Úø‘…•ŠÓ7ß%ïKÂoIø-€ßðöcÓð +ŽÙê øÖ€˜‡Ï>T Ñ·AêÖ—©§±x·Þ-H&À˜´¸@Žœ$1>öãéw¼®hm³§úŠÓåóÃÖ•üÞȧ§ŠRqU ‘÷ [?¡•ìaH¨]> Èm,^øU,<~@¹c3äcÕóñ'F¹V8 XT²B%klÏ© R®?0÷·ËÙ>3[|2»µýORXÎC#¹÷!_+â7ü`áI«›ñ +|DÅç'ÒȾ£íÌ/ÅVn@Ò#¼ÈžmŸs÷¡6Å"­xc^oï‘u{y?Ú;ø4ü€2vþ‡:ùX¤ŸÑš¦ ¿uñ7è•oPT…&æ×à½Ýø›ÝüN¿¹Óâóš¼çkLÉdñùÏ´|`ìÆrݪC#éi•­.Æ*§«Nu5Ò'ŠžùFm'î ⦒]êÝò½ê‰ÄL%-uW¯¼ë¼º+I%DÄ­,ÃÎHFƒ¤«Ø…ÖöÉ&ƒ/bD¹\%A¿ÑDø†.&×:Dý®× …z[Óp"õ¸l#L{ÜT¢ý;#< eutû¼‚uº?ˆÝ¿n,üPïÞ";=ǶIbã'5š¼kR áÃÉVÖÉß.³Nq®9½]f­ùvœ—¿xΘj(×9hn’D€_©¡£O2šÉ×} +ÖÇÒóÍâzþÈתЮ” ·„ꉨ—©Ñ£^:ÙpoÕxÛp×8ÚpqU¿¾7°y¹í5š×óÔ 8¬MFì*r–¶.ÙAq´ƒžz e¡bcSLjeRÃÿ³VÒà9v׋?1»«eÐa0Æ5ÙYåໃ1…ïâÎ9浊Uôe4o„Á&™Î¨MGØÌÀßÉ¢|eü‚p)R1q$RRÞƒ`f­3*ÒùÞ6]¬fÓ 7Ô:¸P¾PXr±ð³Š!½ Ò¥.K®,¹9~êü¸ î+K®¬Ozµ¢A°»ÜÁPgù¢D]¼ž»}ÆSgdžJ=Ï~éÊÔ£ ÄÍŸ+—è±'‡I€“rœ­dØrÚop˜æ›8eJ¯ÖN™À|ãçQ( *l]¯—ìٮ̷Dyü•È s<ñ‚)6J/P±¡¹I®Ù¥‹+±kâ¾£—!æ  [ù˜c)aao™µUfËq4¥Â[Ý_å-Ž¦Uy‹£*]ÄѯÓÄÑg•º8Š½NkŠ’G̦ô+GÒʶ +<Ã/ö›«¯NâØnxÄv‚IQƒ¾ +Òì¥Gc`êÕôñófÅÔUk«÷Xaÿ}Û'ÔAù¨Ú…‡ÔÛ‚wb¡pçH5'lëÄF˜‰X´fbcŸ<»ÄÙòÕ.N;ÂE§{‡²;nûTQÑ9 ’=j’mú^ñµòùaë;x‡ É;=²ÉXx´â/µâ„š|Ù%|%û‰9(Oú¹±Õž0ZØöïVRb»^¥”$Î8FHÛsécôbt>Fàv]t¢Nßà'cŽz*¢´#,tüˆ‡*Ç]PwÍ^Í'“›?”>E0ûv3¤òjàŒ^P8qlÝh±Xy§„Òö‰ Œ[ËÌ3 îúÉ1…SæeX.þ¢š[gvkˆº˜ÏÿÈÎAÂè>hžƒŒW.Žòä³õôÜ3Cm C!ÖÿQiÉDZèhŸtÝ\X GЯìÀjò×Y½ÛÜ©éG×x|±×3k·¹×ããõcG90êðÀ…Šã¯t¡{n—·Ðý²ÜMèÝå-t?.÷ºmåÞBwC¹‹ÐýåMè•ëB÷&0i…'NMПMh>eÐhÛKåä¼µ‚2h%ÚÜßÛèW{nÔ{V/ּѯŸ%‰F/ßéÝè»ö¸5z`§w£oÚãÝèi{¼ý|™÷æ©oÛæé“¥n›§e¥Þ›§Íen›§w•zožÎ)sÛ<õ•ºmž~Vâ¶yz²Ämóô—%N›§“&j*ñîðÚÝf‡‹^åbípÔ~v§ä¸Tl’ÜÝ:˽±{P»-KÆî6Ûʧ-KÄsNì@Ûñ¢i:9g*‚x*0ã²qÆÑn +^¤6dÞ;±ð’KÏ»vxÏ€‚]Þ3`þ.ïpv§‹Ø™;N;;u±óýq´‘ì³s~"¬¬Ÿ^H‹iîÞ'Žý£Ô{' QŸ jzoævSïÅR½Ç•Q¡¦ŒÎ 2ŠÀ·£}Ò»+£ë +5eô‡bsäw:*£ÃÅæ܉ôetÆQýº®Ø»_ÿ¾Ô»_7—z÷ë5¥.ýšwµÖ¯×—êýšr53:ßeæÁ 0¸_0ÍJ@šáÕ~©…šá¶fœ“P šT®Vˆ³¿®Vî}Èïko–ÊjïNg~WQüú‡ -$Z»«wkO.ñnm_‰wkÙá­GZw¸é‘%[ÝôÈô­Þz$g‡›ù¦È[œÝî¦GZ‹ÜôȳEnz¤ªÈM9é‘þ&Ú“ïʾn@ó7ž»ÒðNÞH‚6˜«†ï]zÕ€\ºÎ«ŸA§¡l¿ïXw´FVÍFêû/Þã¹BS&5]tIÍœÉwÐtùgroÒB1_xü ñÏq7ýf'ZÒS[iQ·ËluëÐêÖÊõÜG[p¼]4zI„àÒš„pX߬Øj§‚¥ÞüìEï/zº× Zœdk Y*ô€íEϦVù¢·˜/Ú«½¨Å_ôëÍh—¨íæ9ÿ9".A]Ì'˜Ä;¢ëˆ)ñˆ»¾”xÿ‘EDF@ê ^ÔAݨƒºúd¤®ƒžÙ é %›ÍYÓ娃~°ÙœwÝTõ~ôÉÃÞRqìVo©ø¿EÞRñÉ"ô?c5Äå‰ÔAcÕ’¦z¤•Éå¸#«Ü ãUrü©bxœƒ›?îFULòBìLÚ&CEˆŸ}6‡Øÿè0ΔÃxr¾W„;%ªH¶a|ó;,e{Õ«·ôAôä~–·mÒ)[ÑìÕ˜##1¬¯´h«YBÿ‰3«\´æñÞãã‹-Þããw[¼ÇÇŽ-ÞZóÑ-nZsüF7­9Tà­5§lqÓšÞZóÍÍnZóÑ7­™_à¦5—¸iÍéNZ³)ŽÕ<®B|? rÀg†IqºÌ;Êo@+=lååÒ§ñh +Ï£)ð3vŒ•â‘0ïhPZ[Vt”•Èqø6üÄAî2lݲ–Æ@04z`Ã¥5:Üå¢Ñ =¯ê7/÷«î”½‚ëîù<‡¸õC}PÁ¡¿h£mA³Æó‹ÑB-*èMLÄlt ×íÒØa®Ë7ÙatZ¡¼)m/woè¢<½tß1›aª¾þúõzSÍN$Xêç1•Ù +ºÕT™”ž@¨Ìçî£*ÓÒTæyT™½¨2­>éÎUfA®¦2'¬7§Œå¨2Ï­3']/U™çUæç|!È[ü_ðªÅëyNæÔÙÄèîuÞbôåo1ZYà-Fo+pQ³¥—kjvV®fW\®Ôì›Ð‹o¢šéFÑþ„œÙ=iÜú!;#‰c/)û/ǘ %BœW¢×iFœ[ÿmh%dP¿pã’£Q¿Y‹¯BîŠS˜;l3T”ýÑoÜo(L1:þn­Ûè(Yë6:V­õµùÞ£ã¡|ïÑñÝ|o%;1ßMÉþ*ÏMÉ>ç­d»ÞMÉ®ÌóV²¬wS²óÜ”ìÈ<7%Û“ë¦dßËuR²sc£Ã¯j­-¨„Á9"‚9`·’”Çùœ,,6iÐN+n÷gY +HÄÅg]|Œïl܃oE/ÞÜÁïÛȸÑÀ %!#^÷lvʸaþ$–N$Žò!î/t˜Ek©¾èŸ®1{ÙHN0œmÃrùÃ&rÒ$ËøG‹ýªzö¿‰¾Àëñ?ÄÈìïG¿X¹¹#(Âq JˆŒA"‡ÁDG2nÈFû†·Ö ðÖ_ÌB3œÞ¼$‚`ú&]<³ÂÔ&Ûfäi®ô-Ò” +¨Ø¹»+ˆô¹Ìéq‡d£ÏþS®ÆÑÈ’ÒÁM?þÝ«ÁM?¢ÓGåßjÅ™€!ÂV'^kQtkaëU¼ÖįÕC ¼VO­²èåö£(¤†¥âC §äÔa›è¼µ›èL^í&:¯_í-:—äy‹Î)yÞ¢óƒ\ÅÚà×ëG¹ºbÝA¢»Ø”Cì·¢X¡é àéLJ öˆÝ¶µÊ[`_•ë&°¯òØ/­qØ›V¹ ìe«ÜvÒ*7=i•“À~|zsK3n£_k+Û­eþ-Û»erÜZ¦>Û»eö帵̲l·–IÊvk™IÙn-3*Û¶Ø'üÙ!ÅüÙ”´¥}þìs)ö‡2ÁŸtØšÿ p¶ë¾,~}8n[éÖè+Vz7zõj·FŸ°Ò»ÑÇ­vkô³Üýí,·F?”åÖèû³†cÚÞw˜“½ðáß{¦0\î»OèЉ˜ +j˜¿+')2"Ò¿½rit¤¿uM4Õ³ÒJ®>"ÑÛ1Î(£ÿµ —˃ÔvÑaÍy×X&€ ûh~þܺŠ¸Þ½Ù,c.¤ãžXÇCëªwØâöniÈ<»Zb”¡†D)þ*S„%ø·Õn‹Â4Û´ã+M„²EV®²©HþÅ_óí bð k´ÿ1§…àÝU2B@ì*ÙM@ê*Ù«’ýêgx«k Öè|^ÌZºšµZý¤½Õ#}Z=­þåúL—•¯½2ÓǘYö!GÊÁÉàM/±“Ý÷ÚJ ÝG,²÷V)赬AßÊJ|pnN(”²ÈEç ”KMº'—9˜´âØ݈Óàxv…8–agÛ¯¸R¼Ä«:ÄQÑ OËXá®5Çòç÷Ú1Õs +*ô¾ šä#:äV¶çÝwÃX0ܾå(jþ2Ès>Äœ ÊÉñm0‡PÂxÎ!Ì ØCÅì_n†ŠI£E„>©[aFÑäц×@õ#‚£PZt…|ò¥ãí„É£_ɬ†®GïÚ?.•Ðct=¾TzÑ7öK%_›–Êø4¨ïb€n…éÎÁ¶/¦o¸€L߀bk~1ž³£hÇK@«¼ˆ ÐpõûÑ–Šã}˜âÜ•‰CEbŠ9§4§ò/ +W*S¯™¯Ð¦up3z>©2=­W P–€Y–£_†T_o[¢°©wÚŒ¡}Zeµ¬åF¸úŒª"]9̱£•;[Öo|>…Kµ‡;0‡g×ÐU˜F¶~³'‚´ì…Æ8?Àv½Îƒª½– pÛ–á«‘צÕ&`S,­l¶pJïñI—§tÖ"u1 ‡©'øË™Ìëzïaæu½û0z]o;̼®Yé¸êj®:.‹ JEpžßoÅþ×ïû/ŽXÅÆÌX¤J8¯†/æ™p¿n‘HÊv¥gÿv:Ú}ˆº£q«øÉC¬â'aÅÛÙ*Þo«8GÌbÅ;1@!Tü‚ª¸OL·Æe)ЭSÅ×/7+ÞO*þŸUü¦CÔ/~T|Tü»¼â£í½hV<žVü¨¸bÒ±ÿ¼âñ²â·ÎWÐ_§Š¿’iVœÃƒ¡â¡â;š©ƒ~Ù2VñÜfVñìf¬xf³ªø£üÔVñZñ¨ø(¨ø(UñYñ‡2þשâ_ßgV|¼ª8‹…&Ѧª”|å¾%ðá…E5SÞ‹)4:â›H¸ ¦úê{ È*ıV‰N§I/.v‡aðÖ%,úl»q¾y +ž¨‡Ò $ýÍÛÛx ä){6qÕL˜mAÁÿ|Úè$Î?ϹsÒTŽ@ŠÄÜã†9½PCŠf‘_¨1‹°Hœ2Òw,/ó{œß±C¦—C¡Ô‚kü9Xp],¸Ý‹M ŽCÕÀ ƒ‹yaݲP³Ç*ÁJõ£±: Û¸}3¿f†-ÛððƒÜ9¢o}p‡-N÷ ¨ÞyÅ$cÐAvÀÀÖ;áĤÁUÒã1'ì¿°pÊ ´F£ÖËï 2Zn+X¢“á!ì?x†¶‚ÂÁ,ç O®­¾ÒìÊ\HÇ…î…LìCò JÜ—aÉ9¡h¢Kn­Iq@<8i%©˜Ëü<«^;¶B£âP± eT¤ÉÌÈ   +~PŒ‘¦xÀé€:'{4BªÁãHúL”µòx!ƒÛkáŠuXÈÚLT¸ÿ1уj€ñ— Ëã2Éêã«ü&iê+ˆ[ÎQ‘çóU²pXô^ˀΪýápÚY<µ‚B éö«¤àz)…ÑæÌ÷gÿ£2hê•B½øcu2FN¯J‡äÎkiÆéÕ ù»·¦‹C²Å5ŽçV{ÒÌs«Ô)§NÝî—gFRígF©ö3£M©êÌHíJEôÓEôô»JF¿NTÔâT§<pöÝ}©N~j—ÿ $yt„È%rÍ"rÌÂ<š>!oŠék‹Û{|ªß'ˆØw¥("vqd³.Eão† ÚËRTmõæ‚>((àaýzG‡m2Ù2yqÃCÀ[\Õcƒ¤ÃV\šv׳¤ke[©”ó¥\¸ýeœ 颓MâQÚ×û~&úѶaHir·¢T…R¥™¨ YŒã£ð#¤àP8?XÄ\ TÂœxÎÇ9<©1möñ¸Ðè‘j—I„¼ù²Br9)¥Ïæ›J©qÈa[°ƒþ~„z‚™R: Äĉ{BÄ4²ÑT«} +†×. ÆRvÝÏdW2ü$)À­U©x=§¦àÖê°mÒþü™èlßÀ6GëBï«MÅ×ã·|ÐtÖÁ›üÔ_ÞqVDæé³ÂiÁ~jž¾`ç œxšÎË´ÎÓNîÿUŒÉtm[>2K€–ç^-*þóô¨Yø4œ22mÇOQô3ÃNèªè*èA¢ÀT”Zý¶~qGtÄ¥VD5hmjU]jUT†«Ë†‰Å†Â¸.Ö¦î«KÝ2¶ l+¼X_—ZS›z ªÝ榈 }ŠýNDi¬[Îto{ïô ­Ñe‚B—€¼†¬K=UÛ•{š|ÛóPÇצ¾P¹ç_ñÌh!úy{½“Y)JqÈvû¿X"ø›Q}²¼_*L¨Ýcù^Wua5œÏüXé«ž?ÖØÓŠ„VðÆFpq °¸m°ô @Õ0Èt”)Df•p‡ìûzÙ÷û§EûþÜhλw–] +£VQÜ\:ªÖ‹â¨áÕÑêš ?l"×1Ø>rMæ”’k‚­b-¹&dr†ºÆ׊¼ [éÏ903é‚À¢Mak`*Äûö?jßC:ÒlYÕ,CtÝÑ+åx2”É„òì? çdøŠYAHg@:ÒìÊ\HÇ…¬ËÐ×DñG‰ûغO®þúã›54ËU†séªÉiþ:Ä3lMù™qRåpÒQya«ë60Œ zk¡zù·ô&h¡o!ŠGR,KlßnضX#6ZZã®qု˜U éM.…t14j)4êÝ1ˆH–+*q_4jÙ„òø‰3Vj|ý„­¢-¨ bñ±[¤¦ ΰ-öL@`ÐɈÎI¦€ÀV>>Ÿ­O@ äÖ›æÎ6|D@ è`ËþxAáÃV='ŽuÊWh˜N@—uµo’ð”LU×—p¥.æL=ƒ­³õ|e*_ÞÌé{`ý«É`+ð¼Æ´P¬—C!Øp 5€y:ŠKÛÔFU?v‡Ø/L2ûõš{@ /—†åZ†Lë³O Ž²lg§~~|Ë[wT’¶v´|ɺ½PÙæ“e„ísj®fû°ó-iFvóú¶b™nU_1ÊgÂX,ùvCtH ,Ù²‘ëo„µHÀ£ +jx#Ûی긪®¨AÝsŒKAkÔVWAW²ÿ,hbïZùwÇÒ¿ú“?IôûÚ¿zô{wŠ¥'oT±Z_ཙj´ŒŒ2I÷B%Ôñ6 »§Ž IèZR +=Ä+A +«&aÌx!x„@Uc í(\ Ü<†¹pñÛă*aŒ èó_Ó ¯ë>Sçóâ`O€®’‹¥U\,=/,á^ÆZ2h‰„q'¶!ò„v{t€ÞÙƒ}­ß% ¢À%}“¼`ŠµGÏ–L÷ú³…j[ìëü´¿¥í29¤·Lç¢ÊÖ†~)Ó4:–Gø,m3wÚòUÒÃÇgQ}-ƒïž¥ŽÁ®4 ýÄ‹fWÌÒhFFlî,ûˆ‰1?i–}ÌÅ„6K›°]Sq-‚Lˆ{€O‘Œ3µ1ºâÿÚY^ø߆†·û÷!Ïﯰ} ‘uðX ~)ó‡øMäœä·{Kü~ª&F¥l›¬ zûL/¢?5Ó‹èá™v.‘’›lJl²Ûg\Û&»sÈMö›i°É +åí[³ø&+Pã‰ò÷3¼Pþ`†Žòmí%ú&kd  +îd7€Ql,„¦f€l¢År‡Ükí?]‡ò(¯òkkE’*¯°*<”@Ê®#%ÍEDð­ÙÐTÆÒ×}mA€?ÝeD˜Q`4;P%ôPÓˆ„ñQØÄC7r°Y2°ùz(X@Á2 +(CyáS%̪„\¹? óžx]_»>cA=0~â«R(/„ò(³'ó œz–ÏK\qñQ;«i‡žÆQ1>Õ“‚q1Î/\ç¸(…gø® va†±µda°NU¥ùGÖêZdàé>w +4ù_OW¬°ëª7ù¤ðìë—¸ÏÔ¹‚Åz€ +ˆwp‡¹‡4eÐ7¬ãÛdÐôË€FK¡¼Êå0TsÔPÍ‘CU!‡jT­‚ϪÄPÍŸøj”Ë¡\ åe0TÕt¨ +ø>.>ŠÃPa„žÂ0Roï4{à¾qª7ñËZk \Å ¾Û4J0Tö¡jáY»Û¢V’¸l*j% ÜÇi0TÚPÈ¡V"{gØ­DøP•Ú-cF}ˆÆ›(2‡¶róÁ$8­Wê \å•0Tç«¡*•C–Cu>T]Ÿ­Cu>üÄWP^ åÕPn„¡Z Cõ?D›R4ßm„ÑÚ8 …U¤áì©4 F©I¥DCKP]FµX‘*’µ!õ@ÌaBèOåéj«ɪ™l ß=>ESŸM=USŸuíàcY,Dz˜SûÇÓñ¸Ì©Øv±ÿKÎ'<¸Œ°~áý©ÒlaÐú%RMMb¯éПùÐ`ä•g+u TEÂÔâ`lÉ—‘bÝlh™¾8Í#ÀŠ„»N"16ÄIŠ›üá¡Sª‘0Þ›î¿J¿Tp;Õ?[Côöªœ)- G¥wn—¨Ýéžz¢´Uáã1ÜLãrìÄ•òÕè…¤Ö¡°,œ:M³,$GêÓìGêrþæë©x§ÎÀ">ˆâ¡ˆ–õùiZ´¬®4}­kóÆ]õ.¼uüÌŸ1BÔ¢l‚E·Êk …å$›ª´± B…f¨Ü,}~â«(G¡¼Ê-°è×âÏ÷S53ZHáw­°è¹EŸ²úç“<ÏÙ|ÄY: ¥ƒò ú,àÌ œây«3¹ã\Ò;§Å8ùdûàm>ÙÅѼoŠ® TGýôÝ$,vn‡rðÝSì¢%_Jy1ô+ë<ÅóZ33Üç÷òS¼æ÷ÅS¼æ÷éS¼æwÎùý„O›ßÃOÑç÷ +HÿL¸4ù½x]¯è0W5¹¦Ó!wk\4¿˜LÌ/Ò'hæ‰ó„ŠkxPbLJ•ùè)3àr|8vìPLJçòàøÐÁipÿÉàšÊä{"îgg¸ 56øÐ'­ŒØ )îçKYþàxK–¿5U¬¼J%÷U•·Y•_æBvGE¾G:ÍV>">-Æz¯ +Ô®m oNñŒ³Î=ƒezLsˆK; uÀ1Šýµ¤H¥~>æ$HÀÜDê„R O(AÕ‰ Ø/Ä+ìƒV)‚1/ öÚ€Ü|@n> Wå"(/§±ñý’S–HÔŠ¥×x¨º>cgŽ‡ŸøªÊ  ¼ÊìÉ<(ç„>ã§ô¹sŠï˜C…%Öö˽—úq¨çB‰¶›’QèÐöW¼h¡ªÚk°ÉÈ@Ÿ*çêpR\Ž‘4½MG–<ÍRë³IÛéŠsÎW$-æE$èÝùöHмñb»ÃE¨¾Ýé¦ÁÝ0¸ƒ„îj‘0f P½¨ºÊK \㛧ƷZŽï$¹n–ʑ΃Ê@¹é<ø‰¯* \å*(WÀHWÁH_ã'žüž¿[#½¾_J~HÓ)yve$MF¨ŽšM{‹€ŸÂñm)Œ4ô©òWÊ‘PA,Uòa51øhˆ4)¡‘C¼ ¶DÌhÁíáñX"ÚI’t“ Ÿ¡êFðß³M³¨Ö$ +—‘ íŽ×LÄÿ<‡ML³¹|š•Ëi&üf*OÔýfD*Ýu%a´ôù}Ê™‹ËËÄGD“:ŒN Nö`ÿÊ£‘Ãß>ŒÙ.ë'N'Öîýc´×rºç$À½K+d‰øörÿ(ž•ÊÕ0«E®*¿æåÃ…©ß)øˆH¿ÓÃã\¼/Z@fœ&1¨sÌ›2$ƒïr!!žÇ•÷ÌUáD +“¡NÌÄ•®31©AÄD$Eü‹âp€¸ ®¤3qŸ‰ÓäLœ4 +CÕ°ÛLLkM¢Ê+bP=4Y1ŽTK~„p ¨ìGbσÉYy[ò¡ê~lX™.ÏôknYlZ¶[–ÿP-Ûi#á0,i}!wNíj˜0ý.Z¶&I·¨º>[#˜_üÄWQ(¯†r3”£Ð÷fºÍqôи +¿kæÇÝœ‹$ó›6Î%þk±ƒù•hjÝI¦DñÏðD£Þä¶Í•ipðœ)§‡w€sëR-a ¯üå6çTÍø±¦šCA8×:ViänšŽµr‘UÕnÐÇ ô1èÖÇ9T2E‚TCp²°ŠÕÉ+ ßOt8—JS?Fã}üf€Wœ#7"€óñåŸÅË{èËkÃèc•ÒláÁÈ'üƒŒ|¦!Q$Œ|î`ãÄA£Z=,ì|¾â¬WnŸU|El=„.¯ÊXØi¾ôúHÝ|ÉÍ©ò‰CšVŸD¹-Ïv‹r‹bXØ=Md¶ ñ¢ñCmˆoú`C‘sŸ;–ñ¯Þîê=roÓǹ·z½z{ûp½··µGuÓ¢^t÷CŽ´ùjêC¹ƒºÄRÕä^—[ز~s°+˜¥ ßÅ^©ª\ŪLÆ*y¼Ê„QZ•sX•¾L¨’Ë«L׫ŒcUv¢qj‘´ä%CÅòáù$Ƶƒ‡áÜ=oÙUóF8ýstgv_%ŒSGºÜ$ºØ¶Ê52Ì·ƒàŽ }£ªZg­tdÝ…uò‹du𜛀:gQl„>‹” ¸b˜nž°ÝO^çÌs眡ÏýŠpÈ‘d…”d{‡K1Y´8v˜Môd Ö Ep¢½ÇªÆ­c{³í+v#²Î¦›,’ÕÃè×l‚9PqƒªWDVœúDS#rЗ«²½ˆ|R–Öåîkµè\3ÀC‹8 +ÏøÌïÎz†{5ôB¦Þ5Îä'–”vÀ8¾}ãG(ë×™ƒvÐüìÀÊÈ*¡ÄXeu&‘:l¬rͬò?›ŒUŠóÑÃàìÀ’íì ".Tƒ“–·£N5û¬cõòh¢p½æfT³<ê«<yU“d!ÉïM%¹"ƒOІê9pº°§fy‡¯2(â³ÇJF …T}¶ò>Ò)Øo±lº¡p}׉j¢ÚzîóûįŸÈœƒ2Çœƒ¬÷‹¬óé›/¡ µ¥íâò }ÆI~œŸ°Qîã§Ø†<ã¿,BÏÝ\ñøÉÆÀúÇ`ê[€ìÔOHêWrR¿ µçã‘Y"rt©Ô#2(úS©Ðô¼[>·nÅlËúÎ!%”~o“ ç¿²w3Ï«› 9É.<¤ºyJ&ïf÷2†|tÅâàE=ÆxíÇ~_[Ó~Ÿ±Ô:~tïÓÉa¡t²6YÆ%Y0PÑ¢<’ƒ«ÿlÕnl(ÜX_¸Þš"E5íe*u7`Tåm@«<;¨p7t³[à‡o'b²‡ädÿt¿˜ì¡jŽ°GùžqÉb°¾aëkB™ý-jT{]€0\έn){ HéA¢ÅjXTÍn‰ä ¦@l5LßB¿lT/Qìf|Y ‰Â2®š©ž´( h_9¯°5çQ¼ÊadbW9EÒZ ‰s˜S¾cŒm=¤[è´:òàÖwìÀÏ;À$>Ir€¹ˆzJG}ºõA½ Ãì§å4Ù(§Vœ—ÚÞ¶Ö²ñ<®7¢õà¯^üÕË~v¾HãÓ4Öña4øW_›¿Ø?eþ¶Ÿ‘e#É©mæ·­øQn\çøn.ýöú>ᕵ ÞÌî.ûäÝ%n3wâS¡vz8ƃ½ð¦G‘JŽ¯ˆUüÍv|S%R¸|2Åe.äa?ñLÜü>J¹‚>ÔÃáÃ|»gÝbf_bÀxTüZ}ÀêÞ¯1ß½çôiÃ?Ãùœ>µB9}rjg²   1âTPÅä*RÅbU,aØz¤Ð9ބƃØ8û§‹Sº¬¹>Q}ïTgà 7ði1)îsµŠÐ•J±R)v¦ŒÊ-Ý€Jú0D>V-ës±•í<„¼ «”#´*üÿ’ä;£½G˜“}ÛAœj:•ñ7-ø¦¬Ï¶!(A”ìÂáÜ1]ïêóš®Å½¦ë9½¦ë¤ƒÚte³¿ÉÀ7ùêMc€7ybŠÿ&Ÿ,Ç„ÑuÈ Áuܬ­¦s´¶Õqx#¾b  øb;ðÅ(³¿E×$ÙÑì· r ñê¨bF†0†yØ*61¸g¯ñgk’Z›B7…Î^YúȆûDp³NXo¿Tx6ª .÷£HФ/¿æýö‘hêsnb+Ž"ÀøùÀÊâ¦~Æ׸?qŽÂ›)ܯ Q†`ã2‰¬ñ=‹0Ì'öàÜѤqÜÈã:è/¾³ƒŽ»fIFbA¹³p•±ûǗЖ¶ëF‹ ˜_`ƒIl0‰`yƒ”ı‚â8 ?Ic¥4~bàzÅ€‰cïÁ½±GïÛhGßz´¾|n|ö-Ô3ÔOñ7ø&Õg®@^éÅ@½}î"ƒâ?زÛEšÑë`Ê÷Ïü_àùëa“ˆ<\äi”"O#¬¥$ì%É^w”hšu¼„*p ÄC(TÌM™CsõJ£5”Vq”VI”VJ;¥°×¯˜ˆö}ÁÃ66ÿbUr‚=Ëç0$ éû +·Džâ¯ø°=‘ŸËû~‚™ùðŸH­*S)¬¿ãÅ{¦Ç>ÁDX¿C$„x¨Åz$n} ó{|Sâ IÁä²–÷k’,$èTvYË$5‚^CA?ˆ Ã:èÍ_ÛA‡Ý@óäP¸A&šˆI· +`Cn)œ’¦ üëàëoL[ö&•¹ˆótÌ5Âþ37mik‘éß¾@yûRtˆ¤ +¥T¾+Ǭ¸1Hë´úËWvZ¥5Z¥øØ߀õRjì;ø›Eø¦Ã™mj¾iqÌž‰È¤úŽj{IR D¿úÒÁ5DWh¨.‚°œ)XÅ)`,3c)öÓ=·JlÀ«9?X-ùÁjà»Ònä_ǺòÈVÅ\UÌSÅ|U, .ývŠ4NH‘>J‘çp£ ökÙ½ÏNLsd›æE(G0«ƒ8“IŽ.fu!6X¬:É,OðqœžCpŸ¸%x +•©´RŽiùîW¦HvDúæsô­\ë›H•ê6=ÒCÅðM‰ƒÔUýtÑq›ájž—+#H`~fÚòŽñüJVê¸?[ŽÁþ„õþº,IëOÇ:ëÕ9°nÔ°n꧟×Ñ~•÷g4ýÀM¼U²°$ešHXÔjåùyÜúxò—&IO"ú¸à ‡t¦õ±•÷qÖkuô±C룖øhK[“ÄzÉ^Ó–ŒMæ3 +ñ´FnX/ÝgÊ\G +ëº PÃ:ű¾ë¥XsÓTÃ}é~ßmCRÑèG£=nK—ùÅ^’Kw.1’\ÎeéÞ 3ݱÌeé^Ÿp3î½¾f!îrÖëFЉø÷èò¿aï÷õ}ã¶x“y½[¡„‘‰oH#Nâÿá²o¬Ä1 £óÂçvt.¤&þn.£x‚ê étÍ°b%2J|%.’Ðeã]¦Ã§Ž:¦¹Œb?Ñ3é CW¨Lyê9Fq~W®÷íÏŸ9°Ö·2>Vÿ‚õʈ+/óOø¦Ä1ŠÜ‘L0`ꃵ¥-%—ùòM• +‘çéã>E¡:å‹æ´5LâY$ú³n¯ƒký^Jwb½º·CT#f¼?.'šX†ë„ì'–âƒuÐHxpG•Ìâ¯è‰e —PÖH e H(iPÒ‡¨8qÂR‡%=©P‘èC¡´õKŠRG©I¢Ô(í”ö Ð´‹dwL’9ÈeŵáÖÔ£" àlã›n+Ž9îÄÆ劗‰«—DÜqYq—aƒžÎ>.+n"ß>5G=P¯Û ý70îŽ"ú6ÊÑ7îN"ú&â›|bj¹n”/Òv|C2ܾiêé„b§å’n,Dt::·~âà›¦íj‰Ý$µýÌblÆ”LGLk…OÈF4%¡V\W[÷˜žX‚Ô)D‘œç_„â DÄqyìcÓ–™èH‰s\lŠ'`Cz=GŒfœ0 +>ÇâòˆÂm€¥ÊÚ¿›é!£°®¢¸®öГhD+/"Zè·•ïÓ‹ˆœO£v·IÚɨ•Í{L[ MawcÚ´e²É6Jð I¶!Bë\€o‚¦C#<-í¥>6­_`LA/0ø r˜yçÐsöŸ˜ÄÌ[tàÙ숻 ––¨"aü F ÞN8 ö§Oí+qP·Ì÷Ù€6À6» hJÐývMê(t×'^ú×½ôνôº½ôŠ½tî‡ú€§±£Ó¦‹Þ™×㉦ô‘Yv£Éq¿µç¬„=ÇRHÊéYZ*Dí¾^;KÔ¢¼X4} LÒ¹©½¸‡øãö{îÆ–ˆÔ³Çˆi‡]”탋‚}€\”ë Üˆ²¿ƒ9µ—#¢.‘Viì_eë ÊMmÖ§¦-À‹ËÕ-™CgÆBû÷X•»×‰†Š`7Ñãd;T4˜ [4˜/>4‰I©°ª¿¨ µŽÂ»¹Ãi‹ýÄ#úŒûß6]m±gXCéf‹ý‡¦»‘òÅyCÙb¯îTFÊÕïšÿl±«^uØbïØzt¶Ø+ßöèæUCNã ÛU7|ÇÊûB‹Øh‹ÞFm±½æÁKïºÏýç¶Øöli ’¦3&¾-A@Îñkæ`×Ã…k{§é™A ó”f*ØáÈTð;¼Qñ„aKÂT³Ótfð”¡åÔXÜiÚƒÄ/˲'drI:è–T£J%lDUs0ÝÒö;™Hô2¤RPÏ@Õš4m™ƒŠ~ ÃÖ°Hÿ)@äNVÑ"i€ ᯺f£O%äÑ, ׈%u⑵Cþós«Â£þ/ÝnRŸåɈñÒ7\£þxôpì¡Qÿ;!4’­‰~†Ê#zj¦82ñ¶©ŽžÉ¦$Ù tØCwß%ííÕR¶X÷Ž9HÓ;‰!ãñ(0ß+I±¥íú12ÿÅ6“F¯h²$¨&)íS *ö¦éH_«³¢/ãÊ)6ùºéÈa»Ÿ5‘™¥mîjíðånU‚Z¾eÚ2jˆQùõë¦GÄöÂ×íã*&ãŒ×µÉص&Ó™æ(V)I¼`‡)²é$ÆíI,)Ïßj]b£_&Mï<¸/½è“9n|Ítä4úÕkšô£¨ë?jêÎ{Ó‹ºþ×¼¨ûy§u_ëÔ©{I†j6gÅñ~mÄ“ú28hó‘)8D|óße~ì('`™$‘ðÞ«zÅtÍ´–0>ÜîE¢öí^$zj»N¢© +H¶áȤðGÏ6J=Û¸d»ã¦¥§tZxJ߬{´I†”þ¶„Z‘ԩΚ(Ý¿vÒRõá…m^}X½Í«·oÓû ¥V°Û@ýòÝb=Ô,ßí«˜Ôv‡µüŒ ¯š*ñ3_PÝÚØ;³ÝT.5ü-”ÉŸÞ4i(“Î7L[°KðêõUŒÒvsFwJHgénì0‰Í ¡…lTÅ&gÀ@ƒŽY/¨b\;T1éL A¯ÁT_& ¨b¯*ú”¨MRz$°È•âÓ´˜%>]9Ò*=´Ýó‚Šß¥‹„Õù˜NŒUŽâda\¸ûlG]šÊï µtòæÕ¤yøm«34ZìÞ1h}FÒ$Ÿ,™çÝ +f×ESOÜ cÉ€K´H¼EŠ«§ØÞÖËo˜4ØÜ} “›SX”(,ª›!«= ÔŸ0öõÓH”l7í’ä,[Ú¥0ssÜT?Ehog×XÆXÄ䕽®µÝ´e¯ËÓ‚%!í€ÁB•Ì…bp Í´Y ˆûµH\ÝÅÅr9ÿ†ˆxÅç qƒÀ 0(±cðÄ@ÏràŒ»›Ì1ø"OñúÍ€AÒAŠbÐ ¨\7ßÄLgÎgÄæØéƒß b—þ bv``P ’€A©L££apb@Œ&7cïñŽÁGÛL-þÊQ= z)ý€&òYbÇàËMÔ"ƒÛ]à5Z„‹Œ]È1¸1rȬWìrH -É1ðý.É„C1ø=b GgÕ#S1`±Ÿs vm5éY¸ùeMª1ú7™žÙ™Iv›ràÊÓæJ„°ËzÁtÉè#rñT@ü߀Ê¡¼°n9}ð3@rúT¸æôY¾L] %Å·&²óùð¬îÇor^æ+u>u¥vfQúr³)“¬_W‡¡.ÖhXx׃4/î•~Þn¿þâs X ö©…Ͳöþä–/Rª ±…| ò_æ ñÌsÈà3J‡±Þ”ÏD”­|‹ ôt«¦{\­<÷¸Z'´EÕz¦œ–V“L£9˜1‚fk—†e]¸+š¿Å”hµñŠÿ&÷@h–Vب™¤A¦$îÿzJ—lƒÉÐS6¢žîfnP÷FYªN$qùµÒը݇0›•ëTJHÌO¦ä³tùPÙ{·ßžÅ6OÞª{¦Yеgª“¹#êDîˆâ˜êÜrGœ ÌS¤z˜ðk +Ý8Š$;ÒíeFöK¦Kꇇ¡óݵ‚ç¤[M[z|ø‡dVÄ(B½ðÑ`ᥫ¸r‚O©"g‚À²É?4Aà Íl%dƒ4– B×H(„r.H{yøiˆ")ÿ ð¼¾v<Ô/¾l_åÁ«\5 Êy ðM‚$a‹ý43`™©¾Ë¹;j”ÉLž7™˵¼wÔ)T­ùâÉ=¢eJض©xíCšumX·Ë1‰ÃqPÍd B¶G¬>l2ø4OE¢ ôtB3ÛpµO ®X@[_ÔÝQ+gÅ´Û ã1½f×,þ5/·4…7¾h×ix£>€[”äÔ>£‡XŽ•KAä_ÿazYÏø+eÜåöð¹ #6žëLÊXëФl%¤´÷G?ýÃ;ô?LfÇ·NØ`û¬#+$ŒOÆX$¿ô¨°Ë;íI¦Nmm-g˜Lƒ52 Ö 0#Ü…¨ƒjç3c-ˆýI*':žß±œ¶’T­…àL€;“¤JÚ¾î±!Â~Ô‡›5ÌS&*ûàážL)ªÉ›0Sf +`¶h0Ó&*ò@y™= ‚I -]bƒ¹›ÂÜ 0×k0 +•t „pß)ƒjàþ0Óf`¶j0{(ÌJÁ9@ÆÏ–Úµ“æ +sÀܨÁì¥0ãJyáî[½T_6 èiP˜ÀŒk0¹‚a¶+Åhdþ€Šˆ-4`€ç> +sÀl×`fS˜JéáyÕ@—!tZ³‡Âì˜Ì\ +³S)4# ¤]€ÔRåÌýæ~€Ù©ÁÌ£0“JYáÞi«[è:Ïc0{)Ì^€™Ô`æS˜ýJýY8 5R“T0û)Ì~€Ù¯Á, 0Q‘ +ÅH‰JŽ)uCÓ¦o€Àd?êÃ>?e´ÅvU%Ìl0‰¼A A„:â­LÈ‚ôªY(œa7)RJÓ;\‚j}ÁtÑ(}»V©lHãh‰´äô¶äì}×TÄ¥”! ÁŸ;èËN$àØ‹¥vYZ¬Ú.u 8›0V>iºÄþ,jªôL½BhÖu.¡vË[Lž™¼f4\ù‹(MµMŒe2EIK>ê3D)€€/…[[;ÏlÕ.34a‘%Pu Èà¿Ð\£2¡¨ ê\Y·­3yŠïšMe´µ8o-.[‹÷‹ à5›–BkÓu¢ÄyV::ÂtÊ©}9£l¿ôŸ&€±f)É„Ÿ3ÉŘ:²¹Ùk¬ú›é¸ÌVÁ¡RyüïCnø•áÆ‹O; 7Ö>­nÌáòÓÝO›4·ºkjñšÕzjñšM¹²N.¯óO«µD_®'»‹Öùdwâ:ýdw[;Si(­K©2.¢$ +7*ã̸ñÙýŒ¯é±úq ¯Ê• g:øˆ0#Ò”ñ¼ü$Å?¹–ò›ÜA;Á­Ï‚~Ùoðr/¨màò>ÿ£5!…Ý`kQÍrÕW04ü MÍò$¾JB~h|•ÄàÀ­Rù“ouÙú¶ÒBcQá@3_°MaCa¿ÒÿT¡M";(Q;QÛ,K$­I‡*¶ªaƒÄ(ÂJ7)Õ([–¦#Й /Á =…HÂؾΤ¾k~Á¶¤f02<*W¨¡¸ßµá³ºÅm’‹5±±Ä¿%ò´iÏêkKQbOFrà:¶÷µ"-xúy}˜æ1E/j ˆè&z¹º•áÿù»éÌ£ír¯ŠðãI>X&_dP±Koó o8êô$ÜÊØSX÷å¡YS^^#pDºp #ЮC™$4-îà‡µÝ >îbcJn7Y³—‹PþÈx“7a“DƒŠ¨Ugj¨]fCí7™l®W'·"q’š¤fSáÝ›AßÙò•Ÿ„ž0¤ìoFNíÍ~-¶¿úÔv½²áÓ.}ü \÷×Á~ÅL¿]b0L»˜àâÍ{8jz&,A\TV¯3 ¼Ý •ÚLÉ(ó_5]ò%Œ%ÿÆä~žoX«9Þiäѵ¦1˜`T[Ð…©ß¤»ÍF#ê1ø´Ùê³ñ]¬ìlô/QÛõ=Û3àg×ÖÖFæ÷ú¼$zdœg»ãŒw¼N®Ž/ɾôî¨\Õùèu̲¯;‹çiIRãj¶ãF{O«†·i°ËéªÝÛ#ŽMêÃÕ&¥†u̽suôxMTж +sÀŸ0¥ÊÅ® ½bÒP +ÚƇAAÛÊ[»e­ð¸AŸÈ("MØz!tçÛGÌÁØ;êþ שÍûùøÕ¿ÙtP|Éã.·ä“*b#xÛ> @±©²Õn’«Æ¹ƒÚÿ·È-öš¿˜ƒ]‡³TJTN¯¯5e•D°ˆf|áy-ë‹‹ômi«w$ŸÒ aû€ÉÍÊà/îÒ¸I××îÙ„íêJ”—ÿ)¨c@}ötÁ)ø‰¯öAy”{ ÌžÌƒrN¨?ƒØû¯ßõ›p€6å&Àã#>âÓëuÙtí“lÓ¨ü­ç9pü1òN½CäÓ¬üÖÐ+×l‘µg—ËD}8Á†ëæòěŪ®L¹r˜¤/Ú­²áQ¥'(U:ÖžQ\¥`£µ¾: ¶Ä¾áxÜ<ÊTÝVqÇ›5Œoª¦¥˜|D±¡jPŽP\élK©œŸ0:·0ù½&|e? ¢ìgáñZá'}ºOa©´EƒKü¥ÊÔ7aLX »/?ÞJï¸ï†ç)îUUòý£&&žLË8f"½uè(.ûÝñâó<à5…½ô›³â­~2-Æw5éQ¶ëù~4@qZÜoý«Ýâž,w›Hué}lñµVN/ˆW #WžGD«˜oœ`¥OØ…)}#™{õãDYýÚ'LqúáÈø‘Îyf­ýœ·~Úš3<ÎyÛkíç¼Ûø'·dü·Îy÷=ä}λ²Éóœ7¯évγv™8æÁ1ÛÔL"Šhz°Ü^²î'¸è"äõ Ťª·;,êMË`ç,kgÇKàæ /Vú» Œè ÛÅQᮤÌòÓ¨dyš[\OÞcò´ ðy/ÎñúÚ%ƒl«X8H¶ +>¤ò³ “F ;†JPR_»ÊK \eöd”sB¦šUâ‹ +V+R¹Ÿ:pö>`öÅæ‡Ê£dͨØÏ1…ñÈÀñF"ŠLBì¾H“·“œ­%[ÑìËÆ”1vUxVÉ|$|˪]¬k¬ð©<ónb>Úôœi=iqŽÍ(‹ÃôÛøˆš~]Oñü¶T¤ø*ÒC`ÅË؉rÔS«Lîß碕Ž§Â®‡ºþ–Ë©öw‹©–åW®¿0U¥²ÒGêÀ"2d‰»{úµEŸÒ¼Z­÷7‡ØRm±f]}áúšåë}·^¯+È€Š)ÊÂçÃ'­,‡1¬ñP1ët¶·8ß0û õ/YM•m…ñîÓˆ4­x¦­¢$e±EJkžU¶HŠ=Š9½J/jI¥SC‚J{°R‹$¥ªä—•ÚdfIF«E)œÕе«äUvm#ØÓ­dt‰[ÈÖ¶×,o÷ÝÊ‚ôÈ“Pòþæû5ï–6+€‘9ãa“¦`îR‰IC+fÙ*ºm-ŽÉPüo¥è|¦_Σ¸Èú|S¿I'ZælU^Ä=ˆQÓ+aû¹F<‘Ç Ñ檇h ‰hÀ>QyšÂ•~˜O>´F§{±p¡Ç{8¨  þR|Œ¶?ÛÀg™y+3.«CåA º$ µ·-O ʲùY9‘;×Hâ%î'¬Ç##´'ú3’nu¶Ûjb\X²bÿvâžâ¸Ü÷4î±HjARjÍl4kÚ0Tg$ŒJæÁœí|W2b7‘8Åté™$züN½˜.£rPçÍëm‰1¤Þ3²ÞÞÑP/›×»P¯W+ëm-\¼?¾Ûy€ÖCÊé*·¸ZBoT– ;³Ú—u¬X‰”³ü™6Ë5[ü‹ZȈ©hÑ$õñM\÷_ЗCáÐÈß,¼Þ4ØBK&ŒóðMx@3m…ù}¿f™ºšG‘8¨º-\Âø²Ñ”¾7n~ù€A{'›:Õ}Æá¼–0£6W}¢FvðKåǹ_³¯«½çXT2qŒ¾ýšÍËùQ…˜Ô\)†¯×ͽAs5ÐÌþÆßï`8ï$ê1—Þ 0ÍPgkŸÔý$ÙgBmå{2XtðW •;wOYW%`qu} B™mªïÀ‘$²x@Z¼áž ¹D™ô¶„ÃS6·wãÓíÝ"Ô`Ï|®k(ê—‡á¸Á[.õÆãÿà=ºEŠ¨ãAù“]Z*B¢¹M­8‡ÞO.ÊrVñv]\–Í]eÒ˲®)~6<³É:wZÜ!MJ4š8]î8ÚyÚiB£BbŸË5šèoùÿ¶rü4‡ËlN“Ù’&è¨H¯ÇóE }ÚGPê\9@&B˜x¿Ns¤ Z\þ=|=|uzøÈÖ  uzã\ûþpÝJ€FOs0WÖ)A¬÷dÕ?Ž÷¸#ï5/i(Dd¹·#7ï…MgÚûmhQ)jUÖnŽûÃ4æcÜ˾ƒ6\ŠŸð ;Á•ï +Ùƒÿ&MvXªF‹õH6la…W²ûÛ _ÀY!»/`݉ô¸ ˜h(4 ¹-^‡6T) 0Dã´:“ZĦVÚw˜ªê„+ö¨–•ö=ªZ¹Ì + 9ns%ÙùËYl«+5GÈYñv†ÉÅ5¬ ¹NŒÕÉøæûèmeî€##Ï>C/ⶴ}"ÃœüîNÓy¿‰ú“W£¤ÝæÈ w{8{Å“¸í Œ·¥¡uUé€6ånÓSÌç­¦ +ÞÒÖ#{°ö—ËRT»†‚J›ìhó™gÐEESrIýlÿ]ö؉–è|£òKeÙ²ÿGÙ³†GU%ÙÍ3"Ú™!bt21*«A\‰gLK£!Ü@€„‡B‚ &!Ò6 =ßdÔ|N\z¿E'îÀgd¤ƒÊ¦ÃÊîßdpÕì‚Ú1èffŸ¡{ï©:ï{/ ?½}êÜóªSU§N=ž×•eL¾KRâ¦ÈžçõèÔÒÚ”Fœuôöª+Š^cvÙ‰^öÙ‰^í>;ÑëUŸ•è5e˜zÅ)Åœ\h„þ"ü +G›–ÝÒÕ%Eiz± ÈÌtC27×›Õˆî|à +¬–ÿu,._oJx;q·tÏÀÿhêq%ÿ_(Cq•Éd,×Y¸Á‡ÄÙÇy ùÛ‰þ˜®k!÷Ö—1}¥_üÚ œcð7¡ ôañæ€6};ä€6x»û§Êí.=ŸýÂXÓ>‡ +Œº1@x<áèq5A¿ê*UU4WKš +ô]à·Cß›vØ¡¯c‡ú~¹Ý +}Ki$îUò¹]o:ž·ëÍÎív½)Ýn×›üí:Ç´ð?Ù³ÝÞÿ$~Ëå®7ߪQüO~ÛÈŽŽÛlEœvýÔg7Ðß5Ø Ô×`7Ðõ ÓîÙz"A1Ê‚¯ü£ˆû<êêûMª„.~®ÚÌT Ó¨J€©3üî|î‹þ¼‹Æ~ôÛA/ÐO”oîó~÷ù“?¢ÝVÞî0S»Á+´{½e»Kõ¾Èw„$iðí›wŒ˜!¸¶Ûa + Nü³ž†ü`°GÁu½á|â|bW±æ +¢øŒ2•gøI>˜6[Z14YùîÍÏ^>ÞÎâ3Ieüz“Ul­p9oxñf)APÿ³ˆýÊ&³ ˆºh§W +áᲊÝMšñ·ZÆæé<ú6*!“Â{xÏÚ+c–©†x£ÁÞÿV²ÈPE%5 “¦wc%ªr¥àOÍ\q«æqz£\Í»"ulR%ÓêÎYF¹./×ãOÍ&jÚ&9CPÕ:†ª¡Ô†jC©’Œ%ƒr‹»Žvò™h©PëJ»ÂWa‘¥à)ÁŒS·™ŠDoߤ0‡Þÿmy)‹ø¡°ˆïËUÑ¡Ú.·r…/×1]•Â÷…B²ç¹ +KUøž+RH뜽AgŒùNÝ 3_&ŒÛ ~h²÷vªÌ¥ ÖUߦ¶t¶Ä®¥“%v-ý¾D?È×QQ ODQûuILä‹Öµÿ˜r9EmâjPÔ¶ÒÖþRÊTŒOá4:ÕüÜv#mGðÍz‹¹"ÁÈd ì cwW7êAåÙ毫näî&%\ixqE,ÞÛ€¦pà;½DsKµNö{!p±ÔÅ~_:™¨G÷úÝ{M 1÷Ò©?B–l#7XHìøÝŒNL<é)ËìÉR7¹ƒ>wK]u‹ê¸»•°Þ¬,"ŸùÝ!ŸûP]õ!GÍZ +¥VŠý^¿d3}c@ÜÉî_>£Ü¿ÀŽßóŒØñ}[بڮ3Rcˆ^}±·òvm˜›‰~ºJ·,Í*<}­¸šdÑŸJPuÚÜ ’ûH*m/_Â)… ߦÙö×€Æšèª žÕÊyÖ«• ä`Š©5è+ï¢Zt•=‹·yl9kóq´´ËhH‚ØÏ!Ò5ËdfwG!5 ­«îwPCY³¿õ¼ݨ0Ãå9x¤!5nv'­ƒÊ\©žÂ»7¸Œ)Ë_Æ”åùEvLÝ2xE¤a}jÿÜ{t\‘ÌàWºN DȳÞ)ž¡c@ÌPãt3=uA¼  Y¿Á¸éÑ&µ(&û¯~¼V B œ—ò㊗ÈkkcZÀpròÃ@|0ìÖžè²ÿe¡4©P–&çè¿8™§ùš3»d©$ýh…1µ1§”`Žuoq>­)ŠÉA&7D&óÉNçOBëó»"íX!‰À]€Áôf;EÎ7*W7yIÿÊýHœ]4úÇâ•Šmk¤á>ÑP+·Ï¢}~DÍû`^îCל£²±;Öéb[ÿúMò%1/ñº7q¸îõ&cIèhâÆ,J(oæIùëÄ¢v¯Ö•¡ExµŽ [VëèHzÒÛä·Ï[W‹îÔÁŒ9Ù ¯0:’ ?¹v$V½½Fê-"Gw:eL´fÃø‰í0¾+¶ƧŖÃ8 У¤t$¾V’ƒ¹dÇŽ"BUÚýëzN¡L4±ëªEúOÉé|T™Åv£ú¹í¨FZŽŠ“Ãô÷IÏ0“@Én#Ò0?YÅÝ¡[™ÑE§‹ç–0ºøN³–Û»²3?æë‚-ìh°¬Ð"Á(¥_JN6a£Šô c>“ý«ou\×Þ1ÃÌ9ŠD6K+n!6tôU7Q%óÀ;’ß<Qé@\>gIa†•ÓɘÕzVHp–gv6yœü ‘¶Jq7›¤UŠ›M“±:Úà¬û™e1j#Ã'å“•º Ðtºì4˜ +²‘À}ÈTò‘©PêÓI™ÊÄä Y»R_ ¯âËÖ2¥¾–ùÂWÖ“íÃŒîaí\èлcJ‚(U.:²~½êŒí;n`\¿b±E\&ÂÃ~¾RWÄÌFà«Š5²^›e&Ù»TÏLBy½CU²¯C8Ù†úñ¥º µÃ2“Åu«e#tÖ~’©ýd¥ýnzYðúRw,Š¡„ßåµ… vCÉ9ð<ÀBqù3²ª?È'ï«å1S HtÞ"Y À:ºv‰ÞÑbÑQÄò¯wü ) 0šóñ‚7ƃ–ôCh…‹ÐÓ‹0ª]‡­J "òRá…„à(4ðç|®ƒš<™îF×®íÒA<Ü*ÆÏÅJ¼,X´™Yóa—=© ›È Ò˜áÎùv§Yå/6/_—üÐmvÊo Ÿá=YºŒ›gvü‚Çu§ñוxÝ]× s\p=õNûÿ’}úö‚…ŠÈÍ”úæDìÏrîÌÇÓò„>ž.ŽlHœ¶=!3u!„>sü6x—ý¢Ûx ˆLwõhœ’c…Ü‘ç¡ ¤ôˆ@4ð×Øò|Ë7äÅâzð¡eÜ2_dÛþd±"Õ!1Áúe »¿¤Š|‰}7I±±2L礢Ifò hŽ)E¬åñèFW9…=ó²¢?Öxc$ú×Ù’"Ø@CT‰¸÷ +žHbìEM/ðDT.‰¦Õï>”énuÞ—2\CùaÞa²:ȧçÅìý×Eø–F“5œpf0ÉÆ,8Í~èUK¤S]õq,)eÙ!¥Û¥ïQ¨êª¿‘ ª?$UïNY¤ü‘ ÒGè:߶Ç!I¼ñAÚ²ó•ò3U£•°³Š/à÷¹l YT ¸qc‘áNs¸À‘©Ô€»M…û'·rˆ=àªNŒ §xxv©¢ú3daÈ0ÔF««æ0y&a „°*§êN8×8m–‘rtW>I¾îªÿ½èÀÌäpïsa!d\i4]ú<0ñr ØÇÏ…Ìä ìŒç³‘¯urµd—8RÒx®GŒ%dŒ¾¤Ôl©2Ë×ùÎÔ»lRv-P¼Uzèx\õÝ‚ˆ)@´_™§Üð’á¾¼‡ûªºL‡–f"šg33/;?™#fâoìŒÔ·‚î¸&­õ*hêˤqêXŽFئ{³áco$;š7‘¸µ;º=Jz»õA.){1Š‡!Sä5 Ï<ÅTF»„OH–³8ª‡g±ßÏ3µß4×ÂÉ.ªÊ§ÌðÉ_› ¥c§¹‰jªMŪ9IB<.çÿó|Ý΃Å8mŸ¯'¼c ¯Î×-@ÈG{?á¬cšyV$:mVN€€Åe+­Nrm;s¯mg’­;ã« ôý’S·xìá«ø6}jÀ HÑwóc?"G'/ûgC)4X¶\T@%Ë·è‘ëÉùixÖ T/å •”ÐÆw¡’ÿ­÷¶¡|¦ÃŃÙ/&Åãí^2ŠS¹²´ÎfìËyúŒyã!oQËr€'xSÓc¢ú#Ý"öÕþÎU²%n›§¯W·H—­øóôï–\~Xnf1;“†(³39O‘p÷t>r +庉­î4e2ä¸E—·R9:CÂXsôV®ÿ˜¡ž­rùÕ,Ðsù±YÉñÚíƒ;½vû Ñk¹²†Úù_JÆ;ý1¡¥Æœ?,áßY\3rQË“ÖH<`×Kså¸ôL<†¢Â¹²¦?6w®â‡ˆ"&eé ‘{Å÷¸<ïzÞžÇ1a«CÁ„[ç+sÛ·R’ ÐÏà‰rFSI7ƒÚá6n +Ä5œE#AF@мßäšwÌJÕŘþQ]Ó’9vkºpŽÝšNŸ£¯i}ÚÅBŸ>;'&Ò¸j<÷‹‰—39yñ09aÁ¶k¼ÜEÌ)/Áq*Ë'qÆB¢KRY\ I¯šOBL¬@”RYº£½m,;¶ü‡ÇÊOÄŠê|D¥O-¥×Ì5Ù„Çsí&ü‹\» ?×j‘ÈñNE@¡€PŒŒ¹I°úb9k +gõfÇâ½C®aáïÈ5g¸çé,G{)½É´’Ž j¯d‡ëQÂË¢Á~m¢Sy÷_ó,ìl-Bžö5 6`aø¿í–ö&‰H÷ ±ýt„DØ#Ñs•T¾½áÒâàêñ> È Ÿ¹-¬j›Õf‰cN?¡Ì`…PïåÚ ÔwC„ÚŸ«"T÷P›FKµF‘ž’×ÞçHÌ>cHQ]R•e@îK– &LÝ‚‡cqQC Âüæt‚†U _UhD¼F¶#/ëæÚÕŒÞi\v.áRrÕÖ¡nºÙX*ÒPÏM±Ëàë€ð@Ç£?¯a'4¿“Ee.@Îe¼&¡&ù[èÚÝ㔃ÔÍÀöB8æ½1.Žã$lyØB„׬¾?É5Ç‘gâ2ƒyó]iíµJ $IŒ?wf“©®‡aÔ#‚œ7Ýq jW,×udÅâ2&ÿñÌœBfÚ£º%ÃöKî+cû÷³®ŒíϲÁöÑNÛ_›¥bû7R—]õï_R4ùµ³”n÷"h>Ãñàcº/ŸšeS”aŽ½Šaþô*†ù­Çf˜~‡2Ì2̾õÁ¾‘"R>3jFG'°œnŠýËéüû™½ôLO|øAq=‰R&G Í~ÃGÃÙ§`/E”~¨ƒ²c“3ÆRüÓdÇ7S/';.›²#ËÌ2ÃØ$}©–ùõLµ#[O„œ¦äÇ´º|,ÊM#¸Ü´?Ãøl6ÓVWWý‡ç¹â3Ÿ¶·‰Â¼ÿÏ÷JÉ1.2„™¤Ö¨ý7±¶îÉ`Z§±dQüµ!°€0¾£„L¦_ñ•ŸÃÑNwñ}9Ì„ž„/å ú‚!\ÿhø=¥{sX¿æŸL†ŽQñöïA>ç·©XÅK‡x3ìô¬”¢ŒjÁ0,Hv? ôÚg¥WNáÈn;ë`(éô¤ü‰^œF|O©ÚJªúÎð8k‰„œÖHÖò'áf-œÎ­C`»äó¦`ɬé\áÂàêÞ4,¹g:·e A.Ÿ7Kn˜ÎÕî!Îëóf´“kçè™ü’:DDÃ×þáuFág™Ü`"q¯}Á íFá;™ÜÜ&a’}Á&zð‹ÀJ;ùÛ!ž¼µ*o‡È6¥ìm¥Œ(݇ò7’·p#×B£øÉ8‚¿uÑ2œŠQ™ÜÂ"vé¾`7í¡Í#èçr›ˆ&ÿF9h¿ÒӋʹý¹…¿‘Œ€ü ”@ÈÐ(ŠŠú¦nŒè†a,8:3¡_1M²ÀH´à—1Ü£BÓO’²4Ј²4©,ìßDYºT–ö?¢,C*Ë"'ƒ üÅú0Ì’=2 ä¼83ƒz$@¯ è%€o@¯˜/惨̗ dÀø°@,–!Àý°X,‘!Äu°D¬!aùlX!yR…[åwbžÀÁ¥t +ÑH!6>Ä!Uˆ …˜' ‚*DswM*D³Ö¯fF/E¿šÕÝâ“é¢[…ˆRˆ·DT…À#šÁßD¢SH¦å"Y…H¡óDŠ +‘F!¦ˆ4lY¤Ñ§Ó?Ëâ5ÒÕZ Zã¾}à'©F–V#‹Öø£¨‘¥Öðj5¼´†OÔðª5ò)ÄÌL‘Ï!†gïIupÞ”Û× @Èÿïâ(ÑõºA+‡ße@­—ßОñþ*GôDœ;GÂÍßp ÛÆûÝÈ k Ξh0‰vòýèÁ{dcíüÂ…_‡øBªC0mc÷UwúÊOx|„ãÍn> ²í»x”oͽȰüîuÎò[˜D·î;ã˜BÛîV"3ÔHÎJÄ&!jÔò¹?BqÑA ’§r^-~:.Ý¢DˆóÏþÈcr†X•C¤¹¤ÔlßÉì¶4c|oeŽ–‰ª4·ÇèfÐàîÅ\Çe1ºßÄôÑíœbܦî½?†££÷è' yìêF÷ལ»íÞ«]èÿY»úð¨Ê+? ™ äƒðÂW€ Åjótdaw¬³ŠÔ¯MjV¡†'X'ѱÑÔ¥-íÚ«»+ìxHˆJÍ H£emÚâÓTÁ½!T" +D˜;³÷=çý8ï½wºÏþ“ÌÌ}¿ïûžsÞs~çœD³Û»Ð>»­§#.i/¨GP@iîEr‹OXÓ)æÅç u錉:â(x…rÆ:2"Ç(½f‰kòŸÙ×;ñFÌó§) |Ü”v-‹\â%ÅmÖ: –ô¾¥ÎºílJVN¾Z¦œ|{˓ɨ„Y¹ÓظHiøù{ÝRåc$Y\ˆE¸Ø…KÅmr¸X¢­‡"ÇÅר›ÂæÇÄuØok/ô¹# Š@¨@Z +neðIŠôÐœX¼·ß#ÒŸLÄœêùjö¼K˜»0·sDeAA¸ñk7h‘ÒCük®†T&,e^z@0µÆÅJMQ¿å€§z#I²!:4x‡2ïÕµ7h©ˆ‚JÜv/ˆÉ»ü‹I.+N~>OwKõ4Ø‚eɹ®ÈZ^û‚©ç“ÙóÃC,Øã׺`iKHî±Rëý_V*ëúAWêî+ÔJ%/r®ÔQd¥Jw·Vª£³ôe?2 ë–ˆÊd1Q,Ȩقç=- k5“pÕT¡Ïg‰­¿ÛÅl:èl–kÐÙt-fëÖÍdˆÒãbZó¼béqK|•sø;n¾Ç_0î}BòF9È4[NQÖkùf@A£ÐsÍh¬Õ€J΂ò)]b-µ vÈqì+´¶X +æA&óñ‘V§óωE‰ƒ¾Só¡RÂ]â„)a¸w¹ïÏu(°óRíH8ÍñÌÝÓ#Ëf9MÀniå4‹PŽ¨‹¨¥¼`/Ž‰ÐT2·hX’Ž©0;ä¹¢~0·;Aþèûå'ù—tôSHlž¯ +´Ø<ÈŠä ÞK”³uí"=g«[~ØâE¶ô²2’~l¾=’~Xj€ÃB| W¾€6†·~Ö` ïžYÀð¼·Ÿµ‘—ÑdÒvcË‚+öÛNcÒ&{öÁL+ßkA,î´oOÙ4˜Ž.H#Ê¥'ecï°˜kÖp +ŒGaæúÂ7ga5´bÕ·m'˜{é:*±-u +—jÝó/éšP¡= ¸îti¶ÄÒsâ %Nùé×|1™qCIœX¢¬™Iœ6ǘÅ>ê#p=ÀÂpe ¾2}ÿ +ch)=@׶kí³Xë³ ñbÕ6ÀE°í/yÛÏaÛýZÛ ž»Ik»DoÍ5Õ6°bl;}4¶½ÛÖRÖŒ !—ù4C9«E¥©"@l<›7þñÐ87;óÃõ"4—< íÓÖ C¶ÖhÛÃÛ~ü šŽ·–¤ß½RkÛ¯·­Òï¢t<7Fó8VIÒ"®Wóâš—¸›eqOž~+v#QûæM¢šæ'"QwÎÑIÔÖCÍZ +d⬞à-|Ð9c­“ŒµbªE:“U*qžªÆ^ë'æ"Nò$ëºþ @C‚‚[´'ó‡q\>‰†Á-˜w7‰Ò5^¶Ð¢*ˆH"-¼Ô“TòsFË%¨®Cnǧ'é›ÿ=C­w¨ªõ0K4l1!êïë‘bœ™Ä×`_|HÎ…Co祅‰¶³™¯oç£2Bèp9±K.Âê.äE@úg¹ mC,CSöÐËðÙC/ÃmC/ƒ¯ Ñ2œŸ¦/C§s&_Íb&ïg =“§²†žÉ33‡žÉ}3Íä +}&}ëþ?ðVF–#>åMã´›€ ¹ëÜATç§&Q=?{°+ôä ˆ +öëÖCAM¦ùÙ$fÏ’¬þ¡Ÿc®/h éÌ¥Xa!Ûú¥IA ¯mõz‚,=Óz§±eÌÐÖËy†u-­Ü-©:MD>xRõ¿¨LÝQÃ-©zx¢æÏÝ¥ä÷nê¾+Ãð^œ ü˜¼¨G¼ÀT¬ôCÓ„eXã^šl 4 ×ÕœµPB&µqxýd’7ý#ž7}n@ü×åÓ<]b"R-0¼Hc)d@#êQ/ц¹1Gš"ä øñÉì‰7‰ !0°!êÖ&Ùuc²œˆºŒÜĈº³ êô T‰''†×ýû„ð:ëÙó êþiB‹—9á2qsI—‰››=ÉŽ›ó¦€‡~?uðÐç ðAž;xh—E)ÛSrxèþQ:xZØ›à¡gþÁCó34xM¾ *Ÿ^%…¯Ì­£.>ô‡ €Í¡ŒËØäæ&ØÜ–qð¡ð¡Õ£óöV‹ø6Ñú,ûærDߌv™ß‰Ñ—5¿@¢ùUÖçÇm€o°(ÃW—£yKgi„Ó’PiTãGçGÖæÉw–…S¶öd}i4É*³¬ôÄæV 4Ô|mõi°é„VÍöRìõq…yO+1ïÖ(ù€p”3úRxÛ ÆVÓc=»ë°Ð6!,pý {÷€ŸND*‘Ž¸Øû¸€%JTL·–²¹XˆGÓ,Q¢Êb,«¬Æ•.Y|1¢Ñ°®túãÐä…¼(°D€cPà`ã`:¼ˆôŠÀïÝP4EÕw*ýqCeÓt¢Û +£q²Ä}eÿ»«(×ïô£ö¤éå½0ýŽñjñu;&ÑŸH)ôÓ…š5îrrÔÑ!26–(,ȃœëÄë—cid1ÕßfÛ§êSMšÕõJv¢tÇÙ‰2<šmÏ@ÂW‹ëpZIÈ‘µ‚fÍPcïÍ¡è71öÇØ+âŽýt¶Åq±Ÿ:+Ù~ê=2DÛOGä~:"#"Õ·°ï'‡ó=}9%9Õ&z–} Uqu%µTbúoÚôÉ1Bü—펱· .÷ب÷äÆûqoÊ0Fha"<Ð×u™À¡®«„‚Í»2sÛT·ˆ\!ïx,Õb˜ÿ¡‡âR:âËùîÁgä?=R3w2ŸNTÚÖp™ûÃýâV¾pdLÓZ’ȩ́1=S˧að+úÃaÔˆÉ0°Ê£Ûûûû +<ö[¡Ò€d/¤¬UŒD± °€(ƒ»À¯ºº¡BVtý$yõnæ¨70„Þ ¸._›Þà ké÷5[ ·¿kºSop"ôÂký7ÖËï£Z–[÷[•ëþë­HÔ˨ßÆþ6€´¯W]Z*ÕAEåË)•VRy#Ù¢òÙÕ¿9ÍÅF§ ß§„Ãõ 8• 7°SYSîëù©\/Oåzø½*VËSÉq FŒ_eR †À.KÙ°-j º]X™9 ó5 òº„7\¨üÜLv¢Bw¡ò2b \õe‚¬·”V3h‚,1ÕÞQö©öÇh7±§Þe„ 4ü¯à“nõD(îGiŠ;ÌGH=Þ=Õ ¨=}†µiÆZŒÍv‘Øì»’ …Ú§Ê +d»äëÒÑMZÄËN£Ã›ZÖ ½B81¾•‚ä­Ü;:q€ ò˜ '.vãf“FÇÙ5qä¿M'Yžä»=Òþn¹„¿[M=9"¦¥ÂP¶˜÷GhaSÄÝ op³8£÷²3Zg´ +Tò3Z)_}%üNcôŒ:¢ëhœ35"ÕÅä|#ì“«ŒÛ³ºÙ÷5ÎùÚ(jßMÿwš½éZÚ´÷—<¯ÂXiYA‰ÏLþÅ‚a@!gn›Ÿä’Ì*äýKí6Ú02°Ð·¶È½‡¨wÉJWw(+λgÏÄä'Ã4Õc§AÅNwSvúi²b§Ÿ×Ø)è‹>®‚‚nì4¨ØiP±Óà=—ÍNÍT;ý£iÚØiP\~L#¹2  4Q¯oüpûë JfÌö–áÀlƒnÌö®äÁ˜ícq“1[af,·öaßUd`/¦&Ø–T}`[µjžÏÄy<²Ñ d£?¿dÆûŠBÞï¶ÎZé×õ[¾öTOäj=ìõ­g b< `½ eÃ;qÿUÖ†i¯’-Ûj¹÷w¾Ë¸z>›=”£Çg{Àz½p·nýñGY–ûã\ +PéqævÂT$ oƒæ¬à¹Ñ1-”OMz,NÂKG\0ɸ_AúBšúü«a°…úQW?-¡ìJ½RË·ûµXì÷/g+3ýÖEk¦%²ˆèŽçQªÛ÷ŽÔL Z4RùvYÛ„gžª^!ó[5‚Ven›3AÕÊ׌ֹXDë|8MEëìã¿/ÞBV@ Iw“ì—aò:wз\4õ8ÆÛÙ ï¸ÎшP¥ìv¢ÿô-Š²C„f¤ñ@ÕÚô±dJݪð‚ z"”(/˜¦Š‹ÏUŸ9Ã`‹tÕg7×Ìæc­·°–ÁkRô“dY«ˆÔ2@Ó µBX«Ÿ× é+ª–Ôêÿu¨U†µx-ÐnRµŠI­DI–vãÎ5õò|¼Í&À~´ÛäÚ’Hq8^ÍÔý·²}í“ûzƒµ^hl¦h(|ˆ¨Ñ^…¬ÑX2 +‚ÔÎÃÑ¿È^•Kp½ë†i¡‰¼€ ¬Á†bÐq!ßn¬²Ý©©ÐóÅ0ʼ87É=³ƒè1Wzf {Y§QýuVA²Bù +³VÕ·Aò¯”éµ0*žå+$÷½g˜L§" Û=6¤Sa_ûãÚ\{É€^QévG¥f%XV(܇Oâ> Må.ÇúM–Žxbq.1ÞE‡0ÛÊSRwÇ€Éót¡ä‹™°êÛ ƒVæ³aÝOÅ3,VçŸäêܘL3Uqˆ.¡ TŒÎK–niBý6Ž™ä?é–¢5 + …q"4ð…ýË7‚*Ȇb1{C=JF¯\‘àIØ} gþÏ$i÷ û‹˜}a›¼DÇ9}Ï>¹Êð‰O‹XÂU»SÀÂöÒ°° H«FR*ÚËž¬YnKÈéߥš”2¾2@)#¥~”úQ +÷è¥pHÅl6«W=v›ÕÝçL‡ÍêÓLh³º^=sD˜¡ž9ÌT©ê'µÞʈèã”! @¿) ¬#÷yŒZ¬1±¨g©E{7Πï~ij ha®•8“3êN¿ÜY úï– +‚¾ãKNÐûJ¿þò¼w¤é QÞß‚=Ûi̹`rá …{0Ü{q+6Ù€ÖnÈb|]L9лrÀŸõ ´\Ðzñ+“Ãw‘µPœ®¿YÝß|ÄcƒÇÿç"šèPÒCĵ°ëXR—¢›E‰”ÝÄhÍfõïMÌAjÑž-2Ë\k¯P¿´¨Fð.¶¬´5ó§ˆ&ös4±_^œývà±µHé‹Ô~F,Ò”$Sñ6¡ë"éÍ6@ U¦·Áí%¦<}Q •hé§ü8n?¶Ïj3­˜a¹úX¡>VªUr +ràëå§J5…ì¢;¬•‹Ü†ÛÈxç, ¨Ÿ×aé~ à· }Öi\9’-òƒQíÇ<ëÇúdž÷©*–•º‘—aõ ÀgsTé„_#ÔÆ +{ª§ÉÁvíçà•‰UíÍO¥s ãxÂŽ¹\ÀÅmÆçÍXºœÿÃo»è3ë4Œ`s©Æqâ3¶Awc©Ý¼Ô¡¤ +øk¶ÔÂ6E#©J¦øqLq9X©›àéÀoŽ‰,À‰DðyKWâ·JüÖEŸu/¥±‰ÔòSmJè7ëæÅ.ò Úøk6Õ3!uÉLÒq&]j&=|ìX¼ƒS)lýk?È'Áä‘ØžõmH2vp¯\Õ¯?`ÒÖ<¨WõÿÎÓ¬¡ÍQ +‡°>³¿þu nɪKÐÕ 8Ç~Úd§ñÀW°¥:HÖr·‰¤a×쟜H ÜÙÖÃDÖãD^ä/fŸHnŒ¶–ßòùDëc mƒÁoƒ‰á3û[o$á\r©7Ê{È ²bÚ\~vÖ>—¬K+άkq/cL®ãx6#n|T7Z­qÙ²(GÈ;õï +,9³&÷à[ÌâQgÑáïHë·7ÅúÛ—òFWx–AéšئÀùk³/áÖ{ÞϾÓHúð×☠+Øò[¶ÝùO*` –hò£Óe~ï,¦÷é•|hGØÐN2¶ä}t%ÚC+qh\‡ІV#æ’Nc*­‚+ˆëU8´€îߊ%š*ph¾ÞE0´þ›ùÐŽ³¡­„¡¿™ íã›qhGovZ¥6´*üV%ì¹}0´Z§•¸Áþ¸ß”?)7X,ÑTËÝ`{ÙN yÿQ í¯lh¿>ˆV +C»m©ÚF5´:mh¨Â–úhã”I¬ XïO±3¦üI…ÊÁèðmÝôÂdGpƾ£[9ÅzŸ´š6ŽfÍÿŒÆ$êõ&!^Ü:sû½Œ´•s‰J'm ‡%Qa ÷\ªÍø¼]† cŽØI3‰0AªÍÍÀ-|jg¿€a¶DmArmbšæÙÖi@Ù§mkT†6å­@е»…é¢1Kš²©—Q¡í@ζ#9»ˆnnßåmÎó?= +¢œÈÁaN¢Ü]¸UtK²îŒgè^X‡“C G5¯û«×=ñú•W¡”~šå§UQ[œ}ŽÊ ñÝ¢œ(Ó{ E‹‚'š(öj)Êõþé48÷¸än¤x$ìzgԖÉÂBz¯é`é™mJ Z[Ð]QíÇuMl{Ä6^‚L¨ã’ìã"tÀõm/K±Mä=~Ú¤yP]+çâ·%w”s)1\Ô¾ºµ¼<®™‘_3^µ;ªÔ¼!3ZÃè3.A<À¤‘T%Sœ×òm;‚9 $€H‰‰<;B¦ѳà… +øLŒ þuûL%Ò«¡ü §cis¨Q”'튑4i*x•%­´0d{ëwNv¿Øý +8wȶșñ<·¼óV0îP¸¹Ã”Œ;°Ò5ÉJy¢pa–²äÞ¦r¶æÌýl¯‰>ÊJÏÖÊ£‘å÷~Üéå¼ÿ±¬ÿlèÿ×ËYÿ¯.Çþ¾\ö¿ZõßÅû—Y לªÆ.ÁÁÁþ»ˆ¾®‹«!}}›CÞ•¢ói¬óLDó^ ûxçEªóUªsGŒ¤?|&õo†`„ç íJ‘hp­%ãèÑe˜ÔåFÄIØ?«8 êœýÌÐÎY=Pª$$XË€¸en_t‰íóQ‰í#giTŽ#Ù=Ój¸²›Õ§íìF°·ÃÎÞX#‡!¶a‚‚Ðw\î@•íºaËNCMدÂf…™ÝtžõRÚÃJÿó‰ïGoXFL½øà ¬Èþl +U;ê3iB^f#mé[x0ì)æÛV¯R®W‰pCl˜:è¬ÇªÒŠáUŽ_ÝZÞF€@Ïä_û¹=×n{^cMÏ(vfk4øº%XΞ² ¾¢±_:§âh­! •¨Z먚ÖC‰¢t¬‘°RitTŽ1ü9>(7-ÄÞ{ÊCî§cÈÖø‹Àîë%´I¾ôrãj‡Â´QbÔuku꿲iЯ·¾©®ìGlÝ°õüPx˜>28¹LÚÅ_Û½R7áú>Zù'OÛîD-⡆IJ2£íÑý?£L&Õ¡âƒõ W¼ñ-ôÆ¿Åb„©Ig®kñÄa´ùNÛ}9ŠÅÚi|ûI[‡†óP4ÛQý]|R‡ +˜Œ¿)à·'ìB™£ø[¥Ùƒ¿KáÖæR(l¼'´ÓPq&;£CžÉŠÎ×’kV"…UŒ¿¥$TRÄ„K‡ð =H¨p–Jñ BT(…hü!!Dåâí@\;J_#ž=B6ù,þû¨fƒ0½é|däÍtý5;õšøgêÈáß®ëŸô×ÔG›B‹Ør‘ öûùÆB³Óôf-µë£½íµkÙµ]º–áèÚÊÃz×v´÷¡kz×þÑÙµïë]{¬½]C¤E¥Ë.=@@1nPU‰rÍï>@ãÂ7ˆN‘üŽx(Ìèš³!Δd‰ß‰á²ùê•u¶$묆J +ôr6ã“Ó(oTÕ&A«DÿØÝ£›Í,|@LÔ·ËU_Ã?³%Fš¯ sˆ¢‡&7u÷h‹‚š´GÖ8&mÚ'Rà[>Õn%‹—>¦ÈD®ºP¯šìrý~Ñå×ówº$K…õl .—Ö†O¤MѹHPš®úÓáu|ŽF*¯GØÚÑWÁ’PŒ¸¢*c`¾¶«µª×ÞˆU’ö*Söê›}¢Wkõ^‘=èÕþµu¼Q… +ñî˜èU”÷ +Ñìý)šýÚ£šŒðþEIÿÚ,’_ÃÑ?.0ž²˜Ô€ý›róõ‹ÉZXÒ3Óû½e•,Æ ŸÚÀÈJNH²’¥ÌoÆ>BKa}Üo;ÈJî†=’"+Ùß#Ð&–±&ØGˆ}Xo¸417!(ã~o"<`4kãVhäî 'ez)»–ç0*ܵœ5Ì>BìÃÚö‰³á÷ŽaÃýùßÃg[Íš`!öamýÈÙÄ“¼‰â(ýˆÞDk‚}„؇õá>gãx)‚ŸÎhb3k‚}„؇UàÒĩϱ‰üï;Œ&v±&ØGˆ}XS\šØÀ›$ð¶l¡ò¶ŒWA  äP1=p@šµAžW„Û{ÓPß<øßÇs¿üD©¤ø92Ö|@¾øANP“‰WþÜ&_ž '¨ÉÆ+GÚ¤Ö +r/{^ÙÕ&uAƒ}sñJy›û9Ø׃W^i“ÖE»Íó °ï%‚šg?r‚}™}šì;ócW°/pËLQ×Ü2—¨kn;b»sËįP×t:æÿP×ôÌkìýT×òD<ü.~Ž­ê½‹Ó'pq+㆙p°Wpñä¸`î»Z€‹‡íÑÁÅÐÂCLKRZÇÿDv™CaA©Km°8[²KìÉ}gRTÁM3Éf¾n±{b÷&+âìç~0‹4³"ãI‘”59ñÇŽ¥"Ï)±Rãb;•¤ +¼ïhc6»M)òÒ9³ÈTVd)rÍf‘ŸÅ‹ô\fMØv’Ë,e?öJ.s<>µVücWúh'¹Ì¿Äëä20÷/Þí0÷­þ.æ>š]Ôܪš,ó_4‹UºH‚íHlÝKçG4„k01ã#4#êʘ7=âØ€cþ“vO¯G>„ïAØž0›ä£¿²[<:憜@ézN ©—¡æm²ì—ñÞ&v¬2]®Ã2ëcXÊ.8,£¹Ë}mÚ°€_"£ÍvDëŽnÓÎÄ\ì•í4XY)ÿ=Ú°gF{æW› {¦/LÌèöL_öbÖðfç:ùÜaÝž9Ú¦/µkYì#Ä>¬}»Müò°nϬl³ þ6×Ûãˆ^ž,¾Œ`¡–=‰Y¶ì¹` K©#Å¿Û¹¶-ß纶Áá÷ü}‰ƒUfís«EÖ“ Ÿ\`=i%Ö“F¶ ÷¶ž¤³õdóh±žÔ5èë ´0è ¬'ù£~âzòR“Mؼæ òžë7oLçíB¶óþÏÔ»ë ÕœtÞ,òBC_UsònÕ|¦©Oª¹qtÕ¼°Év$ Ïq :X‘QZ¹\$Øžz¡Àjú©ô ñrçFkåÖÊr¥ýGç•»ŒÑÊÍ—åþ³Ÿc£€7¶¡‡ûtß?¨<³K((häþêÓ=MéuaÛ$ñ÷ï8.oóØ—’4ëá¸8µ9uñrN½Œ¡ÄEȃ g‘#”ø†Á"”8mŒ3”ø›„oñþDÏç&Ë4q•I!þNψÿ_S ¢YÙÜ㾨¸µGj·”‡÷hKE”÷'uñ;‡þàõ}z·æõeÝÛŠÝ}ÛY:Ó,MF¢zo‚‘¸¥×‘ø¢ADS«ðÓ<ÎýeÆ„šôƒÎéPÿ Èï,°Ã[3óîWÑUúc=Õl>–èدšÍŽ±ª±ÈRJÀúÓÀÖÅ8©Ð_Dyè0|Ðõ)ÝÙЃÙÐP‚8fÌáNû¢ÌãÐKöÙ?uÉBD*g¨ñâ52I .‚ |ˆáÈûlÙ nNZ¡›@äsº–? y|sž’ï +>ºCZF7EÖçðÞöƒÞ>=…cÏ#ÜØ#g•]Ѷ¹Òö¥:›àäó8“>_>!ÞãðL’Õ‰Vö8aõ×^ÈË|YËNEçÁœÌƒÑ+€ñfŸ‚YyÉB[«s)(5øOEÚëáEþ·Á ûÂÈö7(„›±O`%Ï„û±?ã;â (‡!YöŒM1¥¾BΡ÷žn' UØÑBAû>oñX£-RñXyj6s{-o‹ºk@»«\/k¦Hù +ˆ…lù“ + +Àþr» ïìŒ&Ÿ%¢=‹‘dX³Kš‚ÊØÅôrÃ3¨0-ÿ.© -›, _÷V‚…/ñ·ò0RÎn° 3ùªAƒŠÄfôëK¢BÙ_ŽAãýÕ@ÒaëòÝ.„Ž4ù‹Öß·ÿÖãd>32­<Ø@1îxs‘M,ƒ”Ž½",›‚£èûz›rÅIÖ@ïªgµž™Znk¢¨è‰$­òëõ¶üIå=ÃT^œ“ûÇ3Óq×lí®9:̼­‘¢Û²I*ä+ð®Ùz*d,áG\Nnç<LÎoéÑnià3f5R ›‡äGÞRgËŸT~d,áGèGŽ‰¬„þYP§é/èÙd¢0Bvökêksÿ!›¶ Œ"§#Œïvä·r‡÷ õÁšÙYño ùƒ,‚ïEð},,$–ý‡bª…>(ì*3þÄK+àû2ø^ßÙ/Óá{jéSÉ4—OTZà +ú×@³|<_üN ‰¢ÃNÐ×SÉA&(Li‘礪m‡S—짓[™2yd^f&^UCN¹zû.Ø¥7t#w¹gªf£¼Y‹ƒÏ³)0=³Fîµ£Ây=›çu”{!²Áù5ï&Ó›Ù pzã8AëcÝ*3ÜDR v'Ë)Á&ïAF.RD D5Qàx'0˜v¶-‰ð@AM¹é¶ª6‘Q·¨Öͨ“¬TºéJžGª¯iÒâiQ{qwk³ÕÓƒ‰ 2ã&Ô™ LÛ‚¶ ²¡•`¡í_¿ÝvDD‚!†—×mw1ÀrÑLÓ³”ÛÊ{CÁ¸ö¶ºÖ2«ªÅ–öŒS1³ÝfTh¶ì8Ëå\±ºa ´Š»œâ%m`›´I ›[zéz³CÍŠëÚi>«»|)%b/= {Tµ‹ñ§‡¶æÓkaëÕýlt"Ѓôਖj% ùÊTeÚqÿX(g¿CZ¹Qù„!(Kå®j¨2±ÚAq-ßP3·P3s˶ÙNVI3מ2ÈJ CÅKNAGO µX â% fŽ}&Ï¿ŠDn>ºfDkkuŽÖØ4§·þ¬4 Åsî¨ÑŸÓßøX«Ž%Hþ^R§öPErϳ[§Ã-ÇÁn—2pNÎüyù­‘l5³S„FŽøˆÉß9Q8v~€–9»¨0´kÂPò¾íÌ,Åçë2ÍJ݈ [ÿt1Ї?U²)KñMXþ€åè&SÆ¢ÎØjÜŽK$èàn1e¾í_­Û·vÖÙ:‰ap3ö ’Z"ÂþŒïyvA¹aݸçi{’÷°Q³y£ÝÎà¾ø¦l'µ’Gö¨=ÏÜí¶üIíy°„Èa››Ò_Î4â*Ä]5îÝ°U±ƒÚÎ%¥ÜÏ›¯?ô±Ý(Û„ [ðŸoMd Úêf ‘´»¨•Æ+st¢“̈P!¨`xfΪë„É⬣_¸Ú³çßsá)bÎW«ö,e^š¨HvД=°\9yh[u©§:çˆÖ'¤F¡Ácã-cK”ö&l½õjbˆ¹Ñã€ó¬Ô¬W¥¥]”¬¦iëØ]vžxßÃÖ]Øv†j›3jePÚž°uÕ{ó„dׂ_J Ud(O ³öÖ¯A²…Ô¸êPÇ\¡4Ö×/×Q^ N¸Td›ùzw®£\FÀzå­‡YYŒWëßÕ¯¼õi²Œ âº6€~'¯Æ­•fïÄøŒ«4ÇGÌÊðJ}V¼õ9òŽ9¼ÌÔ 9ª6ë@lèHr'·“Ø\pávÊG¹*—r_.Ū⼠G¾+ Ô£¡$ÎŒ  +Ç6ÓŽJàŠf¯•kÄ^Ç޶ɱ§{ +àóÕ{ר¾¶ª¯I²õ6 –?VžwP¬é„"%T„wkÄV—ÃêôFˆÍQ­Q ‚¨B ·0ëÎku~¾EÛ[{ëë$„ ÌêÞ EÄàÅîg§gÇõ$<ÿ²´ó/ÞrÐ…²0u,ÊBê&ÛAeœÊ Ö)¤^¨gSÌé‘ðZ’âUçP•=„v ­Çë7Ûò'e=b ?ú0rÒKJÉ È’ÐZ‡ói:0è©6£îÜÀ¦§¦§¦§¦Øçßž{;|Í„Sdc¥û\ØÊ è³dðRd,n"*i:SIã »H!!;kÒõ Ò>Á×ïhO ©F ú´Ujç·±‡‡$Pb¿yËTbÜó¢ñ +Z*.V™èWA–ÚLBGE²Ì®`#8Ÿ@ÃÞ´I×°È–ÈÉ ½õÔô!nÁ«½{ŽCøyYºmzA$Žé†M”7‹»Kòt—Ǩ-”ä +ÛDÿáï7Ùò'éBä%üèiG¢hévì™L¼ã&÷3ù˜Va;ÏÕ +ú"I[ÉÇÞ·û$ juù˜6(|°÷G—7ù(Ôä£åI*kŠèI¡’ÅY™H>®¨0åc0•JM>|ÎÌGJ>Ê5ù ®)ÿPáâ62ü3ýÔ‡ƒm¢#ø׶üIú‚y L,Í<ª¥«+4¯«|x˜|\ºÑvwÓ\P>¢ï$’MoõI>Ú©ËÇ¥) äcìzS>Ýä£U“Ê‘ÖhaÝJ>./gòQ•H>ì ¦|Œ¤òQ¥É¡»Š:äÃÒäƒx|¤|üeƒ ‡á0:ù6=µÈ©í¤¶üIy0°„?ÊOmIKý7jÜ4ÊZ5ÜOµ.”U®)’„o繕lHÛ`1lƒÅ0ß#ðý˜oŒûFžI7Ž üj‡òìüO¾óŠ ¬¾ïQøÞd:ì{jéÉ”º#£GÕ;ÅÊúO)V-܆.Zk;NS{aÉÀÅŸûuÄÂ@ü:xŸõyè!%Üí»ÍxÔ4*™JFžv;ê,p¨p‹`1rè`}à´ÈÔ˜®[ìƒÓ¼’}ü˜—.S¥ÅaY.Íàþá2,»Lø*>[oã!’òUį=XÅ|ªå j¹‘ŸŒy(™Àœ7h˜ +z+­—¤SB:ÅBX<ñ2ع1,ÒKæ¡v¾·X­ éÑëGÊs,qÐ~3–$)89Uîxm +ù)´F vÿà¥pª¾Ó©¾w×iªÏ û‘d²‹)û€yUد©¯Ýþ=áq3”ã´4åØùÄ'„ªœ¥ +‘‚¾¥u¹Ò'Òºü³Ì?¾‚"Ê…ÊÇðmW[sá]ëüÕ‰v­%kíZŸ]›h×úÐZsך+ï˜ËËü5uno;ÛÝ`îlYoyÎÅó< Ô=ìf%~äó6À–_]Ô[›|?¤²8ãÖÌõ”xH—½Dîß›ØËË ì/Ö$Ø´5‰¶ûÍ ìß×ëËY¼_naÞ.ŠzFx'6]ƒX¹Åjë%>-¹7.R?v¹ì½½ÐÃ{þn, 9–xÏM>¦=Êyx¹—õr/Êr#Òÿs¿ :“*&)NQÕ]ÝãÀf†­ærµ·åçg0l]|ØšQ +e¾ÿ%ØQ}g+_Ò¿ÍaÞzxŽùSUÛvÁ/²t jØB+qK’v#Îk2¾%ÙHºuoŠæ­¾uæ­Ž]—Â&£Ð6ÜÚÆG H¡Þxxìô æ”9¸âʵà ÂMõ +Mý±F€Ó›ò(”#P#P…F7œU/¾~€é‹8€¯„^í³$bÛ?V ¶w¬N¼’™SÏ8Vñ®¦Cás{o¥‰gᬹ܄§KVš§ítÓR߈˜ï|ôŽƒ§°´†û»X‘»‹[áÅå¶òÑÅ×7l5j›°¨²´Ò´^"û/!_J›Ì›)ä ´œ±/Vë'"Þúñ(‹•ôU [5XN sb¥Ù¬"ž¬fµgus²y–”í$%DѲ´÷˜ž¡£ãÖÉŽžÌï 䤿ìsÙo92À åzêm[Ô²B;aW¶¤I>(xëmEtÍ×Ê\Gʈ‘œ[¦¤ëÚsW™¹öˆ™¾Âœy!;ß¿nʎ飯k2ÀظA:k²œˆ4Gâ6¾»Êîv0æâDéæ7nÂö†¢r¢Ú_µ›Nrp.‡xîK5ýu=–T”ü¨²ÒVéŠòæ%4Î9þ+µñ8ô 1 ¤.YÝ7ÕÄ•"ÙnJÕ4lœèüe~;Qþ_ø…ì’qD5Y+zÉ®G÷œ¥yÒEº[IuщϬ'õRxÖ,7"0.sm(à† –›pCHxd¹‘DMb~oÇ+$C1Þ2¾ÿíU}fqÝyÛ2Mw~ïë›îÜïûɺ3uÉÿsvýñQ×>‰D£" V%TyEÅšð^¬úP eaÃ/# "$@D€‰„@BÂ&²Ë²ªøRÕ´ k[c…~‚x˜äUý¼µZŸ>£Å›‡–)Fë;;gæÌœ™{7hÿÙ½ÙÜ;wæ̯sÎœóý>“¨–;Ms˜/wW%T@`£óŽö©ÙÐÑ6RŽŠ×‚‰´ P”8nÙ‹¡M?¬Ž’¡½Þ,“šåC±jcr®-§žˆ·¶¼´;ÞÚò»ã­-»ÝÖ–×yŽb‹.•v%•.Æ€dÃŽ¶\)•wP_!Û6g³‚üp·Vê=eÔÑ€ K×*„ì»×G«téiföj‰™í&ØÇ'Øü]ñ›µ+ž`Gír,c²­#³æÃxµ·6 +Å«Ms(^mž +™j«7¼áŠÞo…Àðæ–ax_uÙ@†÷Wµ`x·‹·uïF«o,¹5JSv6ôêŸÅkèG;ã5´sg¼†þn§‹ØY&d’f+û9 ³‚!”Û8âF˜Ðè +òìï'oXZ¼;«±íå¡ÅyÌr&ˆET`";þìôþäõíŒü¬ +ŽÞÀ +k‚ÀDŸ¹³vo?5 Ó¥Ÿw/Ü£°†ÁÜ î•ÐÃ\]ç˜Ã\+Ÿ×©¡‡ñ³š˜ŒçÃç˜Fm¡~©Jˆ|üí–“b@Ãî×b¹^"T ¡šM’FPÇ€²‡?ɽºÏóèÏ­âSëÍp&Ë‚nÜr¡Z ºËæ{f§Eöy òºf‡ ] ÁEc8âÙ÷òÄ̈UPB­`Æ„BõÜûÊrÏTØ-bSý¼Æ¢iXÏÌôª°–®÷=Êï#ñ²Ý”¤º¶‘œàƒ$Cz|3D;fñ•&Cé|)܇¼2‰ {}ä÷aØjïô$6,áEÇ!¾ö8×ç&RòÅÉ6^žPâä‹¿wçÀæ;·²:.­ÑW\6áòòX a<û)Œ‡ÅJŇ<åÚRâ&šq;]E÷ X.Û©‰…tÑÛÛÍ.ÂN>´=^ݳ۵ÁÇ-þÞ’´¸IE` Á‘î&‚@#Ï·pjÚ¦D(N$ÿ‘X Ã%Ó :H£Ê%”Z³üdèŒ\Ô¤Ô;õüpA #+AFìЇÑÿêYWÊþ/æÂ$1Ò%‹k|[±ªÌèÝbÙs½ýòz{nøcñz.V¯ç>©uë¹…ú ¦ ÇS%oz±6Þ›öÄ}ÓæZsb¥sÕ®˜jðÇZK&pšªÁ«ª'*@5@4ïÖ툰„Ë3Qo¬_®-x»&^ ոȊùÇ)úAïsz¼#s^q í¼¶Æ%zŠ¹ŸÛÊl7rùV+f†F?˜oú_Vº$¼·ËðÏw*]¢†DÂÁJ—4©°ü÷S•.~U… °±Ò%‹ªGþ;¿Ò%P&.äi'— ¥k¹jS%Ér­1\Ì~0²àx¡ôj´ÑwÊäCP7J¤Óšò¶ØÊ>‡§îq1Í»*êWyçO’ôzé´¶Ëõ.s¯¸wy— ×½ýiwBcܼ{•.™ë'§…ït´=!mžW+,ž„4“7ðR»,#ºÙ ª4RðOoWôznºòéZSW.p;Ó e¹‚5nÁ”R_k ·}Gq Ô/;q¯šuòG¢ß-ól¬þ͉ÅÁËôj¨vØ‘¤ôk›)%jóV™fKê¿f³p'P¸—ÑtØ_ešÍý4ŒRˆŸø›ùz¿ºq®õYÎ<÷.`WíýñzlRÙc~­Ç°œ¿o5Y¢–É&'û²»Ü§8¾Ö½¼/L·-zOH¿³‰YÛ\’§¢ºnøÁRH\nZ4Á¦nu˜`ýÔ]ƒO_³Õ\ÐEň5Ä+v€Vl_µukÈ6÷kT<—›ìn3e_§ÉËÙTéй,ÓÞ’²¿“%ŽÉ|­ šìÓɺ# r½‰Çª¬ ²±d/Ì&œ]æ´•pëáÓ ü¾±ŽŠß-¯Ø1Z±L^±¹j<>J»è”½§Ú”}½&{,ÇÚ¢ñ×(ÙËKʾg£%Ž%}­šìヸ7qÚÖél@»ŸrFàÊ2k‹¹²ÿ®XYðéQuPrkIV‘%ŸÂ§vÌX9˜/°°OT.V 0ž†¤pøÔsžUç™x†IÝä5×÷$š_£F‰[êð/’õ»X<þ“v‹æpu´½)·ÅÆG¥™ÕŒÁái›e6×H’Í倀MÂÇØcQ°èÎÈÚJiòµ#^ßkå2Û,Éö¯ã‘YPTXÉKòÞ]_)SàÂïW^.yïÆÞ»z=l \G~ÍQd¿N^+)áqi¢ä¡ðDðØô0w|G‚{ ½ÂSd†Ük¦g啲À§Š&»—*Î)Gòß*”#¹·ð³Œ$ZUŸg.ªˆçaÛº)ž‡mŦx¶™›ÌÅ·ùq›Ìmµ¡a›Lmµ/«ÌÔ¾Òÿ…ÿ'p•YvŸ +{ì”Ú3a`ùià {…ÿ×ÏtïÝÈPU¥ƒîÔtÐå@€UE»é¤~S‡¼iT¢ø¥~ß3ò¾o@[Ÿ0¶› ÐÅ”jÄ¿×W±7¡$— òù…ñ\¥;Öá™ëtÚ¼_lаLaNöVɃƒã'%§c^¹„›î‘ÎóDjâÖ<¨ õU‰¡.B%NFúŠIÉ+¡#rvzΊ.ˆ0‚Ñv=Ž<%¥Vô0?ðªPÔ‘Û2øìòV‰Ùå9Ë7Î2Ƴœqã¬@k˶´!·W¸h:=(ì=t}•|oô!ì­‹y×7È®W7½.o:©¦r»XûÌîY»•ué_ÅÞ¥a^ ÂF=Ò@œ'ÝâÑ»ÖXZŽj+s}yZ¶²§Ù^O‰#„g‰vé¶2+¦ÇØ"Ô»ô¥U±²@·ñ|-X©zWÉù + ¸¼îökñ"Š<0-¦KAÝó N‹›ÅyŸ²;í?“:TN~¬(b‡Ï¤¦yÂr…ìA jC$å\)&®)ôÜ&·Ö•Àœù*Å«³v¢ÊL÷'¨W{êÚ&ØÍŒœäý5—AhÜKõJ«±û(4[ÞPh"|qÔ¦ÐA®z„¯;q­EÓïÿ°ÁL«ÏÕÒôQ3Û±ÁÔÌò•þ„vèPVìlá'‰’æX‡ÇøíZ ”º•aÇýK¨›.e–M§VóÿyX‡m †ðF‡ü‡ZÅâJ© ©^Ã|*öÐ0ØñtZ¬úB'æ³£f=¥¶‘ÂY³ÞŠwÞzC¼¼'®×ˆÙ+zða¡h_€[Jô|‰ª^W>Ý4¯ëÄbÚnØ+p—š²JÛ¥° ¿)Ž×„ºb×&l*v4AØeö„‚oó×#ƒlEú†5p_¹”6Š?Å4GN$Õ±r˜µ‚"§ó‰Ø´Ú±y׫ùßÑ6K.acÔ"zfŒ™ˆÜrC¶vr¸>á!;:Ÿq¹4"“NÁ:I§IB(0û‰yn_O#×àé;×iÄ1-øä%ú“pï¹µÚ› î¯ÕêÞâJì(ளÐѦéI c±Óß}ü¶ +ôðW–°9MvFÛr+Ö»@E“yÝ뚆D8ëì@”â©+ èfq 4x­† ßB¦),GŠ…4ï! ~%ö.qGaÚëh+–ݾ±Xgƒ|n“ Òòô¼2’N¯e«Àð©ã”×Íî{é¹eìåœqr(ûýÈQ­ö¼ðÖ„žuÙ‚Þ“[ÎŒÄ$M¼§ ÷4•–ŽULªfò+Ã!öA8Ü#†ÚÕ‘K“8p/g}½ûèêpÂÌ—¬ÊWY_8Ñn4É‹Skr7.3Ìφ×Ý亇\G p!-‰‹{0Ó¼<{;³Å`ѹìov\™®¶@pjÙ LH|'ïǨ­äÂ>oI…)P(+¯A”ß$Êoå l=ðg±òÅwòh,¿w¹[ùÝfùí¢ü.Q~X”/ø¬À-ÆÊßÉ+ʸ–ßc–ß#ʈò£¢|$ZLå‹ïäÕX~¦kù¬WØz ßÞÔkt°?{äŸGÙŸÝòÏcìÏ0þ9%µg”_ΨO`úÀP4KMÍôÕ4º£E˜¯£Vs"xÕvK¿úíƒ hï%d0²­¯Ç’kÁ‡êŽ}ôÝHƒp±1‹ïä‹oîZæ&`¡[|·Ò%–ë&  ƒ’¸`µµôàlO*¢›Ë˜$øy ÿåÁ2M×€$Ä ]D—–)KÀ×zÄ'¬)‘%Ô3aJâ›å®’˜ÂÔÿ¿±Ç¯™¤, õØ-w§z7$¡‚R_/¥æ„~æPR®ßÈ$Á·<þËÒš$F$Ä "‰ÄJåöµŽILlKÉdðM‹©‹Å”Dô7Iœº£m{öW‹5fãٮϯ¤apåqLήsU&.ž'µšr«i $TZ¾ÂÙ¿òÞúÒû‚ýs»ëÏöæ /(ܵ‹Äy_µºÄ:KI·˜Ý=b.GÄìŠs¡€WqÜ/ð:¡€×sÜVà àó2DþøXƒ@4PÚ 3EÕ ~½ÚÂ9ò¶T¼µï§ØèbŽ²6›yp¥Î·e›ËÙà$kAöS{ðÁ_茰–/rªò<9ÓƒPº1”Ý=ÐO-Ò<Ð]èù}ÎÎ%{¬Aßbâu—@¼C–¨-4Ä4zÚg§-Ü9 !~QÁoV!ñUò#!a*Gm›ªýHf&Ÿ›û]672- `Óš¾B Éíc$¹ÞIîÍ™H’{å¢ï8œMï^ÔãEId6q3¼º™½ú/£ø«™ŸÓÚ™_’}\Ö&þyt×ÐôµªŽ˜¹-¡9»‹©v»FqÕŽ²M]ϯLÍxëLêýìû}g7{'û¸l¾3Éõh¿÷ˆ#¬ØöÎ’÷Dâ½W²b¡\²ïH}¡Û›Ð`ÚÙ}ÂwmÏóxt੆ŠÕjŽ·M`ýɨ^#ž…N·£ìÏvÞŸ^b2ˆðÇ2’Š…ÄWlV·ËYýÆ\œÕC’¨÷ŽE"ºØK i$­á'æ4S t=ÛGrÁ·š ¾Õù¤^|”C¯×ãÿÙžìkeŸI©»Xø¯zxÑ„ÍjãjA/ +s?nâàsU(î*ÕtyOëeö‘|ýuj¨ “×ùžö¾W†Ñ{‚¯ÖnáÒ”ôΟêöÎ&öNö‘üâµê=aç{"â=Q|O!OT.KªïZ×÷°‰ÉÆu>»êô ÏzÙÅ'¬Ó2£Š4 ŽÙ1Š»)׊bnñtÐ!;ÚŒm­Aº{s¥Ó“éØõržÓˆ”;µJó뢆Ù¹èf>:ĤPJ ÛÚ äÖž³Ø K ñãc{O`ƒ$'æÁ è'ûyž%õâÙ÷ix·Ub^ÃÈwŸæØÿˆû(Ÿµí%+ˆë½ MÀ#î}2–t÷øŸg‚K<œP2 ½úcr•WŸƒÍâ+±Á…´ðì W,Ø÷¿ZèÆ öm:P°ïé{ Øc[‹ð@k<=zƒøÈ…Zþœk÷y¾&_¿AbÆ Smi—¶ò+G;zÔ»$•_\ßÌÆÁõ8¿©½2µ›þ‚7*†c¼wæyš2IØä…4\µ ú‡Bç#ƒgÚŒTÞKIIÈòÿï±b„G榌Šû. ÑÃöBÅï+vð’ëŒæq,£~#Š®3òÿO½¥ù…< ¥#jX¶€ ¿ÙAhÑÌûŠÄÚ4÷;|BœÍÊ€¢˜: ð’ïé™_–d~Iy&ìù?ßr%+댼=ß”mºÌSHÇ<…!°Ts*séJ»| ¥ë–Ù°taôÑ•÷â,˜ .¹r†Í—W ‘'íFvu¿¼*sPg8ˆÐ ßëB¬k+l‘¯«’WEŽXuƒXáà*¦smøz¼¹·ÿ"ƒX¡h`b…›çÄ!VÐ`…âP,øZáL¤”2 §3¬¼ˆ>æ~ø«°Ž.ø&¦E®Ç´BÏÕ ªêƒÀcû¿Ïq4ˆŠi3á‘‘b÷s‡aZæø•Lø~>ÞÜû/j| Aø&|(E +ÿà,—à`ö408Ÿûµr)p!"a¼¨üæ…AtéêƒÜëÿr,´!_k=¥,)&É÷$0ÀŽñ¨cè=úQÇÉ´fŽäJ43f̶Œ€^ᆠ+ÞÑ\« µíQyE> bì.dU5/€š—X4a¦(¦þ£¾“´6MÊÕÛtOŒÍî'%MIzjœÀþy44aŸ>¸›‡phÿ…‡â/òTá[šÐ'ÁµF?Za£çQ¨‹ñ¢ô­¼tÂ)üÊãiÞ‘ÔÒ8Û{ÉÉge?.ø«4Uò›Ï]ŸPÛ^šÞÖË\vëì$² &¿lžº0˜ü‚ý=îN­}œ£v,5þÂlG ‡”Îzø~Ûù2à™³üL€ëÔPQ’JS: ÿ=,ùQÁÿL¾[qŠµâù\ÖŠ¯ö³V|±Ÿ·¢w¿ÙŠvG+š±œ +â ShøOñ\Ö +È¿‡O½]„ùô É25®SCûU+(ƒ»¿—e¾“sö‹V|ÎZñ×»Y+n…VÜ$Zq££ï8ZÑŽ­àÉ‚B êß°N†ƒð©·â\s6Ú¸>­`ש»>&)cŠž‰(ô²•1˜¼}ŸhÅiÖŠЊGö±V¬ÙÇ[±bŸjÅhEÄÑŠ0¶â3KÄ@ñVȪ“¬“†HÄÑŠ(áÑ= ×Qh»®¼ïêƒÿôIæÝS׺¨îÔ :®óàšqñ,mÍðÁ^HvsKBåÃÀûÑù5[èž pSª…®~©™x‚»âþ™µH‘A-ò¼¢^ñéWì[\©En]ªåá¬b$OÕ­ß +µ‡m$…¸‘\‡c–%LV·²Ovn… £BËäQªy—ìfki…s´ä/¤ª?}šv‚áí¿”,17\ü¶Í0?\t‹f˜‹.ª§sfÄSOo™aª§¬V<.V8lq¤ô«ÁÄ™ž¸PÓ)ñìú |†à÷=üNö,UPÒ¸ÝcVš¥±rqè99èn7B²à÷atd,±•Æ a¬±†.rV²R{4KÏŸ‘³ìu'ÇœoWñª; ÈZ»< ð¨¹àÑå’H)Hy¾!n9 Gþùƒ¶ŸKœn(Â8­×qÚÀqÚ0tœ&Ï¢8­wÀéúŒÓúKÃiƒD×…¼Aqªý>ïRpºtQ|œf-úkq:ìšÁqzvá 8}wá÷ãôàÂAqZøÿ‹Ó93Ãé¿å9à”*Ð^– aÎåQqÙÝ òŽ™ËÉÄbJ®Àâ/’pê•¥¸Ò³£öðƒv"k^™ËÌæ9QnùTq±¢”+܃%»{fEü/Í»²QÊÿ̼`|–æÅÈr,U´2?ÊÍŸüeßÜCA£—àçÍ /Ï\c¿çåVpKœŠôžù²¼¼¼ÿ¼J»Ëàž,ýjÓ{Õ`ååæêååeð 2¸ý†le/í-°„Š5©KÂH*8xí•^©©´JšJ×^­qq+mYÈ|^”·9¼*P6QÑ\-žÎ«‚}Á0y®æÕDÊ\­¨¬‡‡èmSsД2 P˜»mZ×TÝhé|øR6¸Û¥R…ºçyi¨ÕÔ«åU/¬aÃGSOñIµ(ììÀ2¡æðd£™1-Óqì ©°<—÷‘Eòy¡zio†³7ÏÀq•\é;wâȆ°ñß…Öù=Òíæn·Ï +Áíæqr»½>.žÙuÙ¬(vkôÏÚâ8Å–8\cÇq/ª?JŽ+u¿¡*¼ZQØ·Õh¹‰§ÑË®Zn¦ŸžcŸ:Ø +<60´ +¸9Óô*ÓøÑC,‘ Ìb  *ò©(€ª|þRŒàº½¶£)IÑ>·06æRkm¯ß÷´Ð ï”ÊSˑ­ÿƒ>#‹$ûäA’¾ó×”Ž÷»“]iú.ŽpVßm:]71Å—åRe·¶z{íw•¹d:¨-d[õuhÕD¶ô.ã/¶œh9Aœnu9øtÛ§N7ƒ¹‡f‚{hCj$/ŠLŽ´[¨b²YiWgË#-Ñš7Y¦ Æf^ÚÎîà…0Ý$œ_Vn÷§H¿[JË´B­|vˆH˵LZ–ñr›´¼yfV# +âÔ_žÂ3ùZpžÈ×êt¬åbóŸÑܯäës ¢§m¡‰Z–ˆ£C0ÑioÓTžûÑUŠé¹Åâá‰<¯ÞÞ@庵Ž›QN݇¾m¦vˆuGvßþ˜ºŒÙJÑp +ÿnˆÛ }<„ã±XïC׈ >ðËìþÙTlÃ{Ša tkewȈÎçüå‚)X/ÏÓ`Í4¨žSÐnØa–Þ%Ž³˜¹Ú, õ!¸èöiјÐ ™ýŸÉõµB®Ë¹¾ÖI®—'׋²A®‹h·Éªëõ0…(m¦î8nèž0•’`éõÈ'Õ²™Jïî.Ë·ÒO°O-Ûè§6ö©“-- ü·³‡$Ùƒ4¿ +s!軈Z‘ÈŒ_"ü¬¢ýÀD{ ‡ŠN~0€hß(i€ì…Ì©‹ª«üU¢}Ô$*Úë”°´—Èæ:&›­¯}q‘z-aT%qçgb‰[÷6Îh´Öé)¦F"b«¨ˆ]+Eì{S„ˆ­W»ͪiÉ›=O܆{t£«¿ä:Tܳw8œk+:;êž¡U¿{²c†æÝŽÑ·kÏŠ€Ý>J÷P(wÛ=Yìö Õ“ŒbÛ& é”tªi§[Xåom»Õué”TÚY¶D'!•Ê‘ßIžáp§¾z ‹Î¡ÓÅW^J#a±¯Ÿ‚qÝaÉ_U¹«š' vï’»ÿd’Ø}º[yÐä87heç‚%¬fR%…z'‚dÌO‹ÊâZ3®´†wP˜pŽžªCÍéh¨à(ÅI’„8Äz:ÄÞœ ò1¶dY²cÁÓ;šŸ @º½^¡ú_œ„<8i¶ÝfÉ;«%• ÛU(ûß\. ;/À²0ÓNÖn»ÄRG/å£ýRáØ?Ãr1Æo*N¹Y^*?ÅåM×ÁÛMW¬ ß8K ê '«1¹ÛïÛ#ák2er¸p.ÍUb]¨Hl'“Ëü‚U8wBTÞf‡WäxÙæWäxÄRXúq \­|¿4^Lm€–ß·”#aùJv[NXÿ5ø„e;y&ÙNŠ!Cœ!CCgÈ ãC–ö.!ŸÝŽK˜o_ÊX´¢Ñ)á½u"fè*=g[fjw¦øPRb¥ÄVI‰ ^A‰¿’ab?%ª4#mw.ΙÓe–-è$7\u¾dÍD-iDÎå@y7Gžê0_LÓq€V÷_º4·…ªùÕ|¯­:Gϲ`>8MËBìt.G‹éPèC"{S"¤‹€N p­(â¿`­Üóõb¦”EUb ‹ô-TõÎCUA¼\>M/ð«a–_!§®å¾[IŽ=øÝX15j)y¢yÔîÈÖ¥†ÑD û ((iEù¡ +GyÙz¼ŸñòT-ÓOzLÆfA´€oaÖãR^œ¤ef˜—ÀÖ»Âùä?›‰»äèþø©(áy#ÓJøb¦æt¹øx¦&#‚ „uZÝ·%^qCé âÞõ0e¶d¶š ÁlÝöÒ‡œîˆl,©åG¨ …üéÔ¨Œ—ù|ªcÁÁŽZªbŒÁá ==ž –ÇÔ=ž`GÄHÊ(#CÓ³jE€$¬qµ¾ÆZv£_ VÈ£°ZxËb‚ü~B<¤q<Üèƒ ìé,ad駱§X°Z}|‹êoƒ¥¥ÿµrkJ•EXþ6Küýa¬TXCw>îú¸ÿ”ãOÀþZÕAS+«@ì©lÍ_ t¡œE1W*…szuŽ&¢Àú'È2$é;_t+áGYÊ_È®u,JÂ#™–Toé/~ŽN¶J^ÕNés7MˆÆĻ׃÷´Bz$ïÌB2–:àøv×d!ß.[qy8 ðŠ?RÜ.uéZÞ“åýŸfúþöLËû+ï~5yWïfÔá÷ájò‡ŸüÛäbòR49SXz+DêƒÒ;ª¸ÞQ5t½£/Íïƒm%cꃴòÇ„˜o‰•ö×; Åî¢: »”q68KÙ`©dƒÒLLD.,e¸ð|¡Â¹Â»*ÔËÚô;qѱ‰@ZëxŽ;ØeŠ›eÏ€÷†ûÕoÉ°©¯5‡ ¾Ÿg_%sHQ¢$º¬—(¬›`‡¥9¡à¦@$|6l¼ë…·‚ ¸l¢väïæBˆç¯ý²!pð¼l÷Sš²ùX¾f»ýZ« –ÜëÃ]ÍG)šëX‡*X+™á°”|Më\Lö¢c·úø+<¡µ™<ÊéunOÓ„ÑìþVpb£l­0ÏÑeõ<Œ +èN­Ð¥ß'\Êrn»¤å̱-G2cƒÊóà& ²$·`sI[ž&xìJKùÊ.NÒ®ëC%J“®å"õ°m#ÕÁ:ÎÕãyª†äˆ:VË#ù[Få‘_Ï#¹¯®¸º5…Ï°LÌ@¿B³0]+sÊÕ©t9U郫>ɧtŸ·gœœ×£Ï‹œ}u¼öK—qíe¢­dý8zìÎpRðê ;e¯ L¸í^f×árWÎRR2ôÃìɌኔão§²'ñ{_™©ÞðíT¶ãâ‘ØvÜ)A™?R½=âªßäÉ£Á;³qIÆz'A±ŽÊŒ¦,ýa[*Š·sž©AÞoŸI=ü<ÓR$ò[5‡S5ÒΧÄH³Ùu­TïÍÕYæ¼ÙBv@+wµÝYôD²p­íä,’&ÇéTGçn©ív²ØlFĬò]þz¤Æ³"ÈvWöñ5tz5Ÿ¼Ãèòj¦–ìOR—¦V“%C<~iñÈxMdÂÛ×Õ '†ƒV­‰‹ŠdnE-US¤#YÃÁØ$ƒpšfb† H ¬ +ÿ²MñI±Z®êf‡¡k®µµ +œ C YK~*«b +Â^dËYr¨Ä ô$ödž ]4ŒÈæ"Šç§&ÀÝ"/îõO@mÃe³y‡7½Ev‹ç‡ýŠ¹ê{tÍÞ¼™ß«e\M kXè3Ý+íÈtH&º‚ 6Èmhc§¼œm¡Übû€µÏ 6^øÔG„c„¤ïnEžpœµµO³VXžI8ø+‹‚ˆ§Ò^k­õ_ÃÆöd©¼„딼ŸL×à€ç=5Dò·ü-ÅRÿ8ÀRŠŽ¥Ÿ¥[±”â„¥2†¥2+–Ð}²ÄÒ?y1–9–åºaõ'K'–Î镵|—º§h(×'1û ¸5©‰bé&‰¥ùcpf“*›pÁ°fÇðxº”)X»µÓ°1k´î€ßØp’8Ú 'nZ øfŠ“ò À‰GÇÉ;£¬8ñ8à$HÈU‘¯¾I+ñðÉxŒ‡Ã‡ì †ÕGºÞ×L¦n+TØÕŽnÍÓ¦‡]ýƒù›é–°+.ìª>…bònX«@Þ¾“f§z=MY¥¬P ØO¤9{/õ o¢À¾0÷Y¿*O³Ûëì6f@#`ƒ°—ÀÞ:»•»U®¥VÜÀîcÀî@n-­Æ¶<3þ³•!“À¾OûïFÛ[Qö‰È4cÕldÊ<-©Z‰r V¸`´ سF:›(wê„Rc£#Æ:² C=GkEAnÝ…¡¦¤~APf/u çÕfy^}3ùyõU‚8¯ÎzÀù^…ØyýKô"„8Z«]J~Ûsà·_\†I€.–’@©”¥²|$÷¼Yùmƒ5IVñÛ˜ãð›:ˆnJsæ·£‹Š’ø+krÂÓ[Síü¶*óÛ]¨Ø¦„Ù•©HŸƒ‡®å +æêtqÇ!r!Å +f{QQÄiØ–’`N‹Á\ÆÁ\&WQkÝ`Þsà´Í60KN{ù£8œ¶C‚¹o„3§­ï’®ø+ðôëávNûópÌiN`nîfÊi·†û¸ÓXÉiYL“4@“Lúž²Rý¶úþšÎ¹V~i8t +s)Î4¸&ù$5›–JÎ\i +ÎœK{º¤$³v®Œ/4²#ÃXÙ +[e|=ª›uâ‰ÝsÕ÷HGDôÛtLDý\\÷K Åd^ +Q +#¢W­=ÕÒb–þõ:!¿ÕÒ* æwÔ^µ]6xÍþSŒG×௬ÒO[’UDÓx¬ÐÓÉ€X|xχTÍè¦`½8ÀZ¬ÿjc²¬Å`%JÛ?.@%œ%(Aá TÂ> ÌPf0P>§åºz­pbî­–ˆ„àB—îÿ‚ñÓÓtv/ÀÎ °™Œ2"«“TFdžØ`Wžä»géa1%ŸÀîÈÜ¢@ü*7É +»µN°c‘ƒv š%ì®…agrØ™v&À. `—¥ÁŽ;šsl°“yÂÙùvÑÓ!K,lüÎ%þá¯0ºØÓ•‰(QžØ`—“è»Ûé ¹©¸»²øÕ¹+ìÊœ`×É.ììX{^»áiv.~¸äZ\°â|€]>ƒÝ³Èy¬µÌ6póÓ·Z–HØš1­¡æ÷ü/*ÔÁ_ÿ®yHÔL@}#በv†ÛvT¬')±.ÆvkéW9Rô^tuø2w=ÙSs†ò}-Å/J•ºSô¼4Ê-}€zÉå_JP}h¿‡ÓŠ.°aÿ•hó}íÃgð•ø–EÞ­wÚîÖ7&:ŸÂ';i M,¾¾Üê²¾w¸ìáw7ºôæàtá –z¿ï@Àw@yüüÛÛ-±]<ÒÂæ:i²/.ÝrÏw¦sÌ èš»œw÷õ)º»“ƒwZ|¹Ÿh¹ÖÝ=ľ3d^j¤»ÔU¿þmœUåªßs;¯z©ÓªÏ ØW}b ÞªË!ÔÓ_Ùà_W_ì/©±ŒB·“½, rÍsIbþà‚ æ߉[O2¨|š6èU9èÔãßóµA{ä ‚$N¢\›F­ D ò<#áu´Îô*ÿ´¶ðKdB¸F ¸›/šXó”€þ‚ß×.¾¬š¨-m»TðÃÎFµ !q»mû8 +ˆÜGÏ·Ö}´Ê}°[Ì0ŒÀ]¡ÃÆoØwZ…‹gÙwµzH›ô7+}§ýDÌV4ËÚ­6—µ +<8†Úl›ûÈ4¹È“›K³mî¼Ú‹ÿºhÚŽžØwúF¤$ˆžÚ­Ðd½:É>qQ{+Ó‡µLêݨbžH´Ú-ã{;$ŸÖŸ3QT%ÏZs³T¼ ¡k½‹iYë«ìôS§è.Á’Pqp]]q°²–]Ƈõ›’š"1ˆ¢Nà¾ø{¦”ª÷ûö +Èn‹`ÈŠ§ñµ~uõS} +xåJüJ-´îáö ýnôÙ~ôæ—&¾‡k`÷p z¯à§FƒXÐo¿ÑÔ ¹ Ï™ø¦ªÁj݃dz <|þfê{¬b¶öâRUºä~$ %Cû¶z/*©hcŸ ¢c š#àçú¸%rÜS 8“[«‹MäÁYÓ~/C%”Q@1å?&Ä»n¡p¢žêѱ¸•òciDç%˜à'D÷ev+'¸*Ô‡§ËÖFÖÓ&#&,xuÈ +[~2“™ònlh—ņÐ\*X“Å—´òlY#kCy¢‰MáõR©À’YªüÄ3 ¤æ.œý›ÈÞª×QÀo]%3JÙP½ª¼vÙÆ8ƒvê +ÐÔêÏLÑ©wþe]ADóVç:»È«É©Ÿ˜6g ¯Êxè—R”¯à-èa"êO©1=ÝV%.8÷•cr'"Ü”i°èܨa É>!)¸„˜~ÑD¼,ú-Äb !·â+%ä"ýæ5§0ªg·c¬T¨Ÿ•¶ôCqÀ5Ìù·Âìg¼P.-ˆüÁŠä¡{ùy1ëÜ]Œ +=¼mû£”¾Ë%}§(÷|›€Ì’‰MOéCÎœ!CN% ‹dbÓKúctÈ¡Äp›ŽêCž¥CK€„žråJ†èªæ÷±R=ý 36H‹NL ÍìG†ï"_^ÉmîÊoûÜÄ®üê#`›¥ïŽ¸9 ZŽ§À1ä{š%“…æ[ú!^è¶ó&aº|™y̘7PÉÄ'fõ·ù=›éî8aiÈ4p½ÉƒušÔ3¦-C¾§9p8çÊvDpCi+ðg‰Ëxn¨¡ß»‰É{€ì¥Ðº—?ã½4|nJ\)Ì@ÿVÉ^3/. îƒÏ“éøíu‰JUʘÚ-lŠ€è„âÔþQ°%½{1Ü_r®O~èo²]œñOS> ì£'€ÑÕ+”$Þ 4·‚ÝÞ™æhv°"‚•U>ÿQ¦ÇÞ/Þq<Åm-¨l`Š@Ï—ùXiŸŒ¯Ÿpt¾AÞt« ÇÍŽB[Éoû²]Ƽ/„‹ð…Ž‰QEwòÎŽëDm<òs5Yú+D`%?F~O#ÜƵÔýn£Ëh:KI¿b84®äí%Èç9Æ ò€W ØlpVyêcSëá +“œ9OÁ˜<ŸL­uÏ4ü•ÝA,î«Œù‘o ûLŠ_ð™ZÅYƒWœ%ïÏr~ÆC2OÅ:ª}¦›Œ)òuok|[«cí¯ìgmÌ×’~(0Q[¸ŸàZ‚Èà b«¼¢7‰Ï=ÈÚ*»È³[ß á}û‰œ§e&;9R‚>—‹÷späñq7T¡J†¶§w…â=}ù?â=}î_ã=ÝP‹ž2z $Ÿ^NYC™ºîeÒR~þçñ¦û v„Ûž–¾ï·ÃÆ{z½K§*Y©¼Ø_Òµøžp&óìQ/_™®ßoêÀý0è\¦ÃàÁ• +×Þ«¤oŠ7õ‹ÖN²—²êë×Û×ví‚@Õ^Éê <6O}}¾6ÅÿGÛ·ÀGU\ÿ'@4­´ÄŸ¶M­­)bVÛü}´QP¢ +²UШ ñIêsUШ¤®M¶& ‘U‰DŒ5*hDÔø$KPdƒEŠvUÄT±½µk á&ùß9ßyÞ; ±¶|ødîÝ9÷ÌÌ9gÎ<ÎÌ95ÕnÖˆy/ŒXöF}Œem%r’„AJ5ý ²µ½ßøå»”œoÒ´•ÓÓ´ìoдì@Óômí÷/ûŸ5íÅAqmÈ7hÚ]6mÈÿ®iÿðsÍøQ¤'¦±3BÊö¾éº0‰¥hF„ñ…w]ÍÈB3vëkl@wùËÌ|63.#qG×všö:ÛUÜ4õØ«³¾PgtÕcžzÌWê±P=©ÇbõX¢ËÔcH=–«Ç +õX©Ãê±J=FÔczŒ©ÇfõتÛÔc»zŒ«ÇNõØ¥»¿Žå·ËÓ òi£"cÏv¹``”7§:7¥h ÆxÁ’,¿§S‰_þÕ¿a¢ÁznâÇhÓBw³‘Ži«þ![±-›]Ô‚ŒI„¯I+ê¹øõSo;)+q0P;_|BÓ•ŽfŠ>šú¡x())da÷ð K°x”^§*¬*QRMA³ý”Mo˜Ü´™ {Ý è¬/5°¤séG´ÂH¡h‰€z€#¬ÞÄc2›#§rš€º(oÇ;.[«±Œ¬µq×o_¢ ÿ +¢L¶!Q‹‹%Ѽ/UL£íX›I]Hcm +ÎG‰H(¾C~a‰¹ÛÚº¡Ÿ–_Šøy¼_¤¨¢TÄwàœy%†Ë!zb—}ü˜ ûîûvÍÊZòx´¢î˜à}ß.OÓ”5ò†%G7‹íçX눂¶¼‡mM4§ˆ×õ]GJÓº|zZèû‰ìûØW‰4¸& Íó-F™,ÑÂ0-Ó¥î_ ÔÃ[2B +JR0l“;àLz =ä–ñ}Ëß ‰^‹õÿÆ·lö5©$7Ø&àe—°|ßGC(8$[Åî‰%:ôVíÿ×`e¼ >,ç5~î]jGš÷-¦ þÌ{ò„-T©ÐÈ¡V‚VHZ¥6º«Þó:O|H…æŧþæ¯cž…`y4&}ä'X^`ÀÊ |­BÁ,‘ÚnÁæ`éõÑÙìÕyÕVVñYCÉP‚áMÌùІ¤Ž!é•HŠ€$‹4U‚áHÒ›l¼ŠˆÍP7ƒØH$—¿g«I+À¹æfoJs70ͽ߱à÷O­é½8ChmC mœW‡ùå¡$ß«|:Èû¡ŸWùA^o(?ð}´·ë¼úìÃ`éõÑ89ìXAæuQÅsAf$Ã)tN I'Cr”DR $y@‚„`8’qïÛxÕàCÝ â# ¬zÇV“”Á«”Á«Gu^Å<^¬*e¼:ëªmÍ8¯"ùÑZxUHçƒzü¼* ò +xC…ï£o·Î«ÿ,ÝÓ1 äLIæC!äƒÌH†SèñM6$½ ɹI +’Z$|" 4¿gãUVï€un/¤™$û¤l5ÉëÕyÅÞ¯’:¯6{¼XuãÕâ÷Ñd”@ ;É V…Wt?d“ŸWA^o¨ ð}´³Dòêî‚¥{S 2K’ùšØO@f$Ã)”ý¾ IC2["9 HŠ€ Áp$Ÿ¼cãUq€W u ˆ0@2ãm[MÊ ^•¼úXçU±'”«æ0^õcÆB !Ϋ€)²ðªˆÜ¾ïçUQWÀ* +|-GÁå:¯þñ~°toHf -’Ì/m¢ŠƒÌH†ShÊ{6$•&’” ‚áHJR6^…¼b¨«@|$€áû¿l5‰¼Š¼Z§ñjŽÇ ç9ÌÃꀼŽ³éVô¼FcÈŒá­o,‘³é߬w5ˆV@´ê¤ÿÀªôÛ Ìí¨9ä¡¡o¼éIÕ"&UmïPuã‰óê¾@^l‘ªb9_3¤ª8(UÀ*|ídmzJ²ùž˜Å‚Íe|¨S?ä`ż¡Ž!Y.‘L’ !Ždß·m¤ëÈ +C ‘Hæ¾a«I!+=†¬œ¡ËJ…'«^cø_3óâ9BýèK,(¡8²ïø9Päð†JßGÓŒx)I¼@Í”ƒxå|Tí~ä/ÁŠy£ CÒ#‘¼I|TðQP!¹sƒuüjÀ‚:÷+Œ‚È$ ùÎ붚ä}eŒ‚_éëØ´Qp`áÛQ%^þ«ïúÑ—Y8PFÛáñs Ì2 +ÞPYàûh—“È-ˆ×„.Y â!!ÞîƒÞVÌ +’}%’„$ÌH…$ïMŠ`¨‹AR$€’†×l5)18PbpàvS=Q[UèUÙɯ(¡Œs`B ³‡,‘”·ýY¯à@(ð}4Ĉw„$Þ>è’U ‚áí~hC°b^—aHŠ%’WÿBH"@‚„`8’Û_·q "À†º$E ùÖ«¶š„ „ ,Ñ9ð®GáÄ2¬å^/£Ý(¦Š³á¥@/·°¡œLTül(²xCåï£Ìªé›T°toxd9ñ d 1ò¤7, ÍʳÏ[AJ$€áúß¡e’Û=|Øç i¾×÷òŸ±nÅ×mœ 3¸ÂBÐ +Z¾é'h…eÝ +‚V¾¶£`–Ð.Ó¥#ÎîLœ5{2´V÷šhñ-¶NÐ `@‹¯™ÎíoR[»ÛÅÛZ÷–¥¥­•ï [+ƒmÞPeàûh7 +f‰œ$]¶&Xº7¦3 +ɺƒ6PÅcè¨1¾A¬Z}ËF¢ž‰j‡÷AØŽ^š¡ž®>‰)põIÌqÔ&1wyÂà|Ö“ ðSÂæ{mÑjïq­\æf¬ñ÷¸VkC±Ö@¢h‘—ŸØ){\ &®qô¸8·õ("TtXëééx´‡%²_ø\à—èÀo/Í\`–$îæÀë<µålÃ< „ü§äñà8^£åÈ,Ç[ÞX¢¾2Fë@÷¯ÊPJS˜Þ‘Pž.Ò;2µ¥Ê@1EzÍÓB¤yF•!Òçý"ýé‹Dº. Ò¼Ô ÀÀÍ ŸÎPÏfC¤› ‘ÎoÐDšõ/çG`D+ð·rF,õo*Dší"ÝÌ™:oµ_¤›­"bÍ‘næ*šIÊð1B¤¯„bî„Hwòy™"Bã +k==UŽö´ëRz6pÀ,I„„ü¯ÊÜ àNCþ=^8?]Žu ò»8%/ÇñíFf7ÞRxKíB¤×¯ÌP“‘FByºHüL$iI¯)ÒŸ?)Dšg¤ ‘þUDz¿ÕD:«oÀ^jnVÈ'0¾ßød†zæõ>]¤ÿ­‹4ë_NYÛ<ÀO ó‡¨g›]¤Û8SW'ü"Ýfik ˆtb¼üÄÞR¤tBL Ò]Üô¡ˆ°â9k=½Qía‰¼ê§2¸H.òzƒsó2Xª‘_̉ó&cx– ³oexcI&)ýÙŠ Õ˜Êû°7…Yž.¥·¶g@Ra ©ì3¤ô´Çåö2*út)Ý{¤tf"ƒ”†RÊK­‚Ì!´e‰«U'‚üHŸ1¯ÛO§Nîrýƒ:C–ë Y>Ý«mâ@|ëütµa¸8ã)lᢼgÜð€šŠÛ¥:.æ»Ïû¥:n•j‹¤:ÎGÔ£Y°§­•ñF³D®„~¿<p€Y’žiþO:>À:Ž!#X—ð¡sO;ÆävrB¾˜uÚ ÙÉ«ôà +?!;­„D±Î!(ÚEõÈ9ò»tv»µBBGžRø%%zKâP]¶VB×õ¨"æpÃ]B4eú—×.CýyûŸYJ[Œì5+SUÓ@˜ÖyþÞ3ØØàÇ’Õó˜Üë«âNEw>Ó„ÈÍå~^ + ƒ]vîtñj [îçN—•;( Öhry¨9MÉ;ù¨âN~a ¸Òiü“ç°^P!ît¡ýH¨ w6`®RÄÛÿ½g‰;Eý6îðª!K$wŽËÔ#Kú¬XÊP;$w~ïu›Ä"¹Øx³nŒ_ÝÜØñ$¦õÜÿ8¯ýŒÀðÐmç^7¯öÉÏù¹×må +ˆuHÒÍ7‚Pr$‡>•$’p,• €$W{­uN]‚SÈ ó&Ï h7rl2ýÌâE-ó7™î}[£ÉYÙþ&Q´ +õ¨Ò›üëö MŽšÌ±Ô¡ÉH†&Ï~Blÿñ8Æ#€Äx»g6zí¬îåu;o©¿Ý½öñíî °º—G¨G³Þîˬ•ñÆ#·êÀÿ÷d¦ñ(@$Ž¥DBÂ]kÿ‹GçˆÅX#7Îé350»ë±Ó§‡Wkô³~úôXéƒb=úôðe êÑ©7ù€'24¹+ÐdŽšx|.Õä‹—¹Xñµ;o÷ÅV¤ìíN‰ó ÏøÛ²¶ÄRv§ø: õèÑÛýå3ÖÊWñ”HàK2) ÇMÜË{Zi¬Gg¿6ÜJ€÷€,î“a\`×!m§OZ¬OŸöÓ'm¥ +ˆ¥ôIgéAX"›¼g¦&s'A,p’ÒÄ}¥ä)w ¹xðQ×â$fB`MîØÛíðºýü)»k»Q@Ì ´Ûá«)-ˆæÚÇ;ð170ÞåòñŽê‘³mÈYÒñ5MÍàô“²*}jUO—î gJ3÷Žb™ˆö˜+cÐÍ]ìj1è‚•³CIûÎ6;í™ÃËÇí?Œ<}Tìý]êÜ-ƒã}aRþ÷/{Q:%ÔP؉_À‰ÿ·ÇýÄ/°J—Gyú¦!ç®lª†ôxXº…ùXbik:è:íÌ+× àQø®xÚrôœ»^0cž¶·„< “¯Á0š÷¹rÁ¿zÅ#l }±\5¯leÕLm7ºŒ7jxOõ±ý5¡b_ DI†hŒDtàŸ¢~D ѾÙZ8¼ý4RÕKLw5l0%|åu`Jú$ ÛL7ßE<0”Á#KJ˜r³7`Ê ³¾Æá& OÃ*o§„‰K˜8‡Y˜¸‚aƒ¸3~Úb`ÊvH˜ SÀanL‚a'µÓËÏ…M e†ëLŒ?0”¡Iè­kØåxî¡ÆÙv7bß©y›aNRÉÒO¸c¨^î%E!¼Nžˆœ&\1íÛ".Ѷ ¿™äÏ€‰H}iš"€ýÈÿó¶†Òm쾩2MÐ?ºÎÓ" åŽ_ÛáafJ¯æKå÷W+Ï®ž‡¢ž½ÏR§Ô]ÇÜa~‚˜óŸH¿q%ÃÈOÙë—2›`2ºy§¸ÚÞ³SÝäwÕý~WäkâÀ0Hò„$y¶/äùÝ÷!¢.a½"áÎòàœïÞçÒ%òr<§¸ØÍuçµ܆&n¥ÔÍšõÃG°œÝp×¾Jü“àÑûI/éé³0ÑMì úY0œÌáû sfMGšêû=E•zÚòä÷H»-u ž›Šu«n”2´ÜdZÂËŠ,DÇu¥`c#ý‚>WÝFUÙFϽôÌþÖtf×ôqÛ¯øzO—{©dìÉY=zÿM’­‹ÂØ©T ŒJŸõ*±^µ=ì*KiÀªR¬D·Ò¡X®ÀæÖÈMo×â:xR®7À`(jâ¦÷¸ÂvÐ#:˜ÍDtW›á3ݽˆ ..‰‡K¢’e´Í0%ÛZ™o1Ræ2ñfwŽˆÎ%Êçüý+’fͼ$UÓþÓû5ÕàuäV9ŽÛߺEÄÉVÅIÁã¹øy,ºÂ¬Œ®À;×,,–$WjgFÿ¿ZìòZegªÕ‘kõUk¦Z}Ðj«ÕʽáäCõ3G=¦Õc¯ì}¹ü)‘œ¯ è=>ƒ›Ù xK=ÝÐÅ­_H`ÙJ”I´Õ@ËíxŽm׃Aû,H Hm ãÆð]¡^¤³â~"R®Úø-4*ZÀáî\‚ãM SL6aÖie3´4!çÁ Š›K”é*ЄWp5“”h—ò7¡Ìh‚˜i½ö's¦%›R)¦•†eÒJß}ÄUv,$lL^äªWa­ªPÖ*M+Ý·ÐU–Ö&nW­T[àŸ.pµÃÊödj¥_Ý«ƒqKïfUš=õAL³TI­Ô÷Ó6~€i¥\ÌrIÙ wõ¶ùLQŸßË´ÒpÌ#­ÄþöŽˆÒÁÁ¨_>ìSr²\Á 9 Š¦ÂϤó¯¿5j±©¥ß!]ùü¶‘~s–Еés|º2XûZ3U碌Õo­ÎϾ/G}ÊË‘zlïªh_¡Š:e‡¾¤ÙØ,nÞŸ°  8h˜À¸!JÌ/4CÐ寡+:Í6e¡,5ø?|ÂR0;q‹RcZYª]þÝûÐeLsÝ°{‰ˆŠ¼½F›Ònãx"Rp=<çäô¨Nf˜J/ÈûVœ VVIK㎾/hµâ¶£F$„6и¾¨ò~£q/ð7.¿_o\ßT¸n‡úýMЬR»ÔgÇ?´O%x«0WqK¬KS%q^¹'¡¸A¶XíxþønÍŒ%ŒN,1õÙ¥7Aq}Q¦°­ºOÓŒLRŸ~¿¡™èüC ¹]'}¶/©)~PƒW螤óÓùLŸåàþ¤Ïö‡>[Z§øzyúáƒTo¡|êÌy¤O„ob‹ßÎ'dbŸf¿L}òÕ|›>y;—ÔÛÆŽT&,J¤zÛ{ŠO½«“¸7SujçgªÎeÖ꜂êLDutc™<ì¬Y®ø-[nžeµ ,nžâ  Õ ¬F·’'äÚ{÷„C9Q°U=¶©Çvõ(â +'é\(uú˥俉ž«™È/‘WDz@07å„>é³Ä¨Æwi¸Ïà6J¼óÇ‹kOõw@!éf'nniL)ÃV@×ÜÑŒ)«2ˆ(‹‡0Ó<ÞDÌÓb$sOéiݘAŽÄrÙÌä½Ð€iï·ëÿæ Ýƒ[µÈÑAý?ßÕ|«§yE‡¡¢é@ c^Ñ\¾·q†aåœ7Asë.¢Yù£ûlf‹¦{õˆA÷‰×$q/Ðì€MÜX¤6ÿwÄ\íc;©"OºC㦮sJ¶–fL³#Hùí:„Ïþwæ3Y@*²€4ß(Wo›á?éôßÁTä(,$ÉþîøS¾1->X(÷PEtŽc P +ý,ôÆ¿;ýB ”ÐÇwڔРC3ñöÝ™Šh1‹Ø2y(vfT4«Jõ†NFºÃ‘"1¿Ù<ÀÒ_>œçZbŠ—Æ´=›IÍZ|©Fw7èAÍódD&Š;Þu‡«Å§˜{k"¬Àþù|ÍÐÓÈw´° ìmûe&ö6 ;…sÚeo{üW‹2ìçÍ"P +þ§õ­Óçkñš° +Ôh”‘Èjaö§«Ü””T¹7;¥IæÂ>!zÏú»e†tÜšº‹ušÃ¨ÓF}ÝJº«}ãvò&OùGQ_9 +Ó‰ÛÛWòî1ûJu',hŸyFXbÅsuVÈÎÑ5×Ö90«Éyìï#¥³h9UøÛsª`”|Ï]Á’/±—|º­ä­¿ˆmÍŽièüOlðrÓçÝ«½gy=ì¯'AÀ;…?T +Ťú!6·‹ä¦u~­;°å-„ªŒ°üʱF~o—¿&ž*ìa¶ ò¹ aRo‚<Í@®H%™o‚Ìe `” +‹0¯Ü{?ðd1” _ð!öž† ; +™ÓÊCs´Ÿ°|Àåcx¯M‚-B‡Ä)ÀìpÔ¿ ÇBÖÖüÁÕ¢„Sì Ö »çouEÕî¬YßJ–¶ÇÓÑd„/ÑŠgïÿèÒ‘3þï—50òÌ€ˆóS{ëK[J[¼¯ö`EpÊÌôˆMà À*ôYŠœ9´Ñ•‘3©Š}Eà¶=îPÛþqÑÅ$Orçs¯å[ÖûÅDå¿Îò—XÄD<Á@ê-b¢@È¥1Q • ä$CLÚ¾¶˜´íRL¦Ü¥‹I» ëiWö[‚À“t´“tÜwËO:~Óè“Žö]KÇ J:>þã.¤Ã¹Ý"¸†h·É<)™™À‡a‰ÂÝr¹HŸ*ØñŽ×æ-Í2Ò-— •¿œåWe+¹šmæßÃòË5¹ª7óodùŦ\Í7AÎb ßËA)‚PÕ Ä¡‹C|—âp2M>i ï$^“*â; ¯Î¢jß— †ïK¬|?§ñ}ICéÎ÷Î]óýÑzª\»àq;­ Ú¿»%·WÛx¬òߪ¶ñXå/­¶ñXå7Ugà±¹¶úËã çx2x¼úæÿgÕ=¿t›…Ç ãÌnÎJ-Åʨ‰VUIZ¶ü—B¨• &19i—LzţіÁDzl¬²˜¼bò¢ r¹_‹çgÜX1bŽ%›"zÙJ!Ê)hñ´PzÏW#2Ø÷XB‰©à¥u¨qb'ÄnèÌ=˜Øe»Ž,VÖØT®âˆEv)’¯ÍqµX±1K,u‹XÏðõ(ü£}^ëʵ©òˆ)ÍÜ)šX¹Þy>såîõE§Ň®#qŠèz⶟öÕu®.GƒT,¦Œé +&"Y>ïFåq¿‚Qù3oT +H)•?ùF¥€”‚QùGÝ(©`ÈÞ äèÿDÁ´ JÁd7 +†¢î¾×Ò¯ÇùUÊfò >e³p0Êf¡UÙäF™²a‘Õ§lÊkÔD¢å÷ÆD¢M( ªýýP1ƒ@â^î¬VÏ´t¥>Ö¹öò~骓ׯð&tÉûïGù¨kuó®”rÆÊOÄútûøä +|¢ÇNïæóù4«R¤=JóÏ÷ˆ0Š¬l(]ÉØLQ¢ö«Ù—£Zü`F}Ê¢3O"«ÁÁã¾0&,b¢E9¼˜°`efÄ“ÝQgòe~ê|›7õÖ¨óÓËüÔùK>9}ÁDçw‚:_¦‚ôY\›‘>sk¿}?}„&é€>^Êôv²tŽYèêf§ð·¢áÍá¦Ðð)÷½M«±žtþU)¾jç_µñ¯¸gÀœÝ{rž]"CdO¼ ß ° •ß#6G>ß;Œ¼{yË»h$ùË@·§Îe e +Ÿsä-*ð¼H|À-* qCé¼úÒ9¾­‡ŸÔh[5ÕmYªo­Q}³¡tÎny1û›ñ¢e†Ÿg\ª®›Ÿ™—ÎðóbþÕ]ówÍ‹ÕÓwÍ‹¦]^0Y—Ü ù¼wT[3rcÖ­_7¹Q ¡dïØÝü­†Àä0’cÜá×zcܸa´ÓµzÃÈ,¿=$éô¼Ñ7à¼zI?]²åÆäQ³Ý󂈴5äT¿ï„üôúîx¬jÒlÜB!ì°æÈÀZd.¨é Ô¬Ë|Š°]Iù+Ébw°/ò*¬‰Û?ÇÕçC¼î½å†‘D³f$žøÀ†x`[/µÕIEuRQ£ýűۀ#áI/‹8.`ô{]Û³àz=T¬/îo˼Á…ÔV‹?_Í6_×ô³Í×5³‹ž»èy=…j~¶€þ±¸<Æ*`—³üú†8Øáj:³ëéG‘µž×ÓsŠžÙ/£éyDã~FDîŠõÝFÛ´±_Nä!õO^o‰?\©¾ :TX›Ôß}ó ‚ +sU*ðxæiºXJ°5Á”&xôe†ÙÝIWS˜¦J#Ÿ×¯­F’Îõ¤:¤©dˬ~Š¿Œ›=±Ú7[H£\ÿP¬T´„- XZ6§$:<v¬ß4‹+nØ•‘©ä<^ò›³q–BÔOKs¸0=9Û0©5'TSñàTS±®š +¤jºóJ¯›®Ëa»„øµÏ²,&ßv’í2.ÛÉèùâOÌþÿé&ý" 溚]'»g€ô‹}¦ Ú£ïŒ+XÇ« ©¯ ©¾˜ž/¦çJªÜd£ãõH{úýƒë‚I:»§©ýÂ0™JSiaÑ-'Ó+²fÒs%=WÑóLê–UÔ-' %ÁêVpñÝlê–³•Ž‡Tå_g1œ â2jwÒµ€¿‚'µuÖáB FÔ~ÞoX²Ï½É´0¾¡¬èbAÏRýýáÕß9ŽÜÁõwÞ HMyr‘Nßgèõ/gF­2¢^„( Á)žœó^™eLÜÓgbpPO¼Y•¯ÓyHˆòÞÀ¤À¤<ôÚP6à7¶þ;=.6®­ßVB†£BõÑZb\-õÿ|Ѽ:j^=ãèQÎ-ëqk@‘”B4›™Uªyúî * Ÿsé÷êÔÑm—†>âZÙˆìü›j½mSyÛT·™JUŸCm›c¶-Fm‹Ñóèf.¬ã\CX¿ÁÖƒ\î–ª²›Ö°[–>Ï£ÒÙ߬OÇÙ-œ¡©é “9Uû‰[¨J-²J[•m%p:½Sõm¨=qý¢_w>LE»} 8èfw øA³¨æBR )·´™û+¼ÌXµaìÉYNÁ°]6º7zîõÔèvÿøÐŽñ¡ÁëÃýƒÝ…$6È Ér}Té/F•13¼Qåù=°£e´Ö8oÅŽ»5à”°~‚Ê8h¸ë»$x +g8{HëÕA~:Ô‰ûೈTuBòõls K:·]ojj:.&ÔõÓ†f:¹•HËÓ Þ`=£ÄÆٯƊ£UWAÓc£>&âÌBßXm³h4>é6Ý?\v VËá&¬°Iç8Àu)¸°l¹%¢ö—\ïw& kt‰¨}ûµ™x9öCYÕøÄ6˜5öªñ>pè£ôZý0—hõÕWû[Íy…ÍáñÀõúO™yú9N€Ú¢I¶üÙòe×ègÄ‚k!´|J‰Öòškôs]¢_åoAÑ‚|>[Œ._ÍSµÎU¥F1^{Œ`MEú91R*W^‚8ókƒC›tð[èûÉûìgתqñoðѲ7¯4[&;柆óÏטó–!ªy|Nê´Gû5­P¢¦(ÚA´‹*5Eá8|ÞuXêшê´\%l媬¿_ŒM“óÿbm†‘A˜(è¼,f?á̳Ÿ_Î$îU­© Ò•ýÚ¹­¤³.*ì)Â`l•É؉aew7Ø8fYசs†P©°ŠÈƒ:?x«Õèo/Ž4V={½Ð§„^ü™q.z܃Å0dÕôËåqb)÷ØÕÆRN4˜J*9Ê(‡ò÷ã¤sÚåV9¤¯ëLýP×o5³tp³J\4ù–ß ãe²t/¤Ê°×ÉáñÇÞð8žD<穈h]d1UÇÈ–ìåÍå‰Ìt"­á2WÁ‰ÓNf3›)”¶ÔT·d3SÄ2EìC?¶ÖT·á³Ò9 ¥sêKÖT/Ìš9Ã?'¦I•m˜, ݉°üiz˜E&’}ƒ;f Ûܦ‹úDÿþ[UÇ-—gK’br⯽¢H¼{¯×ƒ©W©žµém›3éä¥n[M”¢}uDëÇã}”mÏ£íÁ6íÃSaû~mõ¥Kjª—dÍ,è‰Çe%~µËw,YÀvúRo_Á‘9å}GnNÝò»Sñ]ñÚñæUСälèTÇÚØÏ7¯íÐêwdz@­ßj¼xŒ"¡ôuw4ñŸè}C¥¢·Ö¼¡$¬tÇ+IšQDPW!õ¨v¥¸”ýª. UÉKBùêLj|ä†Mq(OìaswÉèþê£:劀.AJs¥ì7OõúͽÃérd?ØÀ¯µé¶jß±W+]uaßTK:D#°fŽayÉ*Ìó‹¹ÊPw š÷ãÌ P´?QÉ&Œ5DÑÆŒ«ÿ”ò´ã +yß'‘{‚øuóÚE—Ævße .kçVôËŒ¨½¯Ïµ—­Ø2m/I3Ù/{Bž(’…^Bqq¯‰ßßëU·ŽK~é±bä¤~îy’y®HTÌ(!T]’ùÂWO]êÍ/*\ß0~ÙËY…SêžáŒi7ýn “3BãÂW#-]Ó +ÁÉ—0^íOlÔäky¶\ãSfùçó6¤Qwi /ê£ÃûØ^Sžÿù4ªO,?‡d!IC!$ wõ꣇õÑÁ]zfHت9O~˜G¿чE`ìUÙcÅÅ4~l¢SÎbÈ% ¦.ÌLÃç+žòÆTIó{˜šF‡î©ˆñ +ïþš7Fu9M•Ö£JsTiiUÍeúä\†}a.sÑå®v_d«ìÓ.²5åé·Û¨æŸïJ01à"T33€@ è*[£ð‚”¯ýu*#Ã(âÆ(ÉØ-#û3ȬvÉú×Å®åë3ôfù.ºýbv†nò›~eü•œÍêxÕñ(ªc1=ÓóÄ}ûôMϲA®öµkÉØÀã‚z¬{¡ã¤xîK—Q%Ø_ÚzÛ—^‘5žÇÐsˆžÙ/£éyDãÝ9j㛶â»É ¶irŸœÓ‚IÃÏwÕ=~7O,Ž8ƒiC4{ X\À(‡»ÝlúÍgélΧèl.%æçq>ŸÆÝmHèY);w¹¯sO¥4¨<[—¹H¿¶" ^S©zMXõš*k¯‰dî5‡WºZ?1¯¥¨¾ ÔwJ›aM­úÆ +‘«ö·l3oÖaªw¨­åóm.Ú?½Øèa[+U{ÛÐÇ*üž «Ïa\('9(—”Õ iÖ{~ÒYy‘QÈ–3õÆv}Û:él®ÐV(åX©”cX)Ç*S9†TÏójœ˜$‡Ä©ÖÊ ºšÖBÿÎÚUœ v +&œë®zòžÆ.u]4°á1ù7“E¤)Õï˜97D91Î>ß«NîÿœïÛÿÉùù2Ý*Ö7qš}g‡ +Zæé¹zR ô.ÄÈVA=¢“Ÿ_dÃÁ…Ò'bÿ%–äí»Hß +k6¾—ã¶ë&쵫îäý´Ü ˜Cø¶L£vƒ/@ÞíÓ]ß–Ü›iä[4½>§ö#Öög’ο§Â=Å€ïB`Òygªß²ÆÎÇ=æÊôõ +ceºµZõ§Â¯«?Øi}£góYdwä%ô•±ët¶Yò–5_ÑL¸X.Œ‹Å€Àb¹«>_L|¾˜¦5cÙ}]ÞÔD³dì¨ ]µÕX¤‘T[c­<ˆD°í™Àns[°¼OIyÒÉþh@={“ñúùÏÕäV¬˜^)„S29¿®§Ë§›®§k::%Œ¸o|Ôtó¾±m7ݘa«“#X‰‘óŸÝ,ƒÊÔÔ¯L­£’äʇÿXÐ7Ø}t Ó%Ÿâòi¥|Z¯ªÂ‹dáš×·6}9V!—cgMò–c£¾ ƒy@5û|ý?ÏaäuÊKMGž$nžð> ½H»ð­<ØH8=Xñü\6ÞtÒu7¢¡\„…TK˃‹°YÐ (—B<}º»û0oÑ/[0¢vÄw  x}>j´bKš–°”ë <‹—¤³5c5ƒýÍq{£o†®ä.±IVø Ì–È LÖ‰â×füŠÕkcX Àz3¾k4£l¸ÑŒŸùšqÈpªæl$(¾E÷Ig¸>§0|òìl9_,ñêÔ¥v–x;ÃA×/ÂyJ°Lß’ü5Œ¦c¡6 lË$yǜ痼6Còøf@{Ÿœvjÿ?9‹Ž¹r×7¢ÝIm/“{Ìö·†îf>ë²I|JöÎòòá³”ßCR@Þ£FÔn5¤&.°t¹ŽWñƒzÍÚ '®ªøÎ$rQIh©Ø™ÓT«:ÊŽÒá(Ó%›­æªÙjg_ÆÙê-^fG¨ò.µïRõ9‡ê³‘®³n”$Ù‚ÉGNÃã#µ8¹jk@n $·¯Ò÷)ÎV»ÞúOlð8Ç•€IúUÍ°ó„X1<‘~ 5À¾BÎÎ%#}¡ ø©¾.ïåu:ñ*}ýŒ#%ZôŸ˜#Ér!I¿êËX¾ >Æ2œÓ²³‚1 ®9Ï 8ƒá®[¸Ã—&ô}¼År0ßwÒÙz¦o1{-M»ˆm]Ķͮ^¤±ÊEÿo ¸ófò!W{/Fš<9ùÞfž:Ûô6SÓÑ,ûj3§r#`š}þøÞ€ð4ãlÓ7’Tsìi¨¹±g›jîÄ=¥n“[f7Pl[<2Ë¿xO:­w2š¬§æ­Çðƒð…9k¯/ïïÅ-–iü¼Ç\|¤»•¬éË ~¨Ãˆ ­g;O?¥Á&l¿i¥T2+‰#ŸP•?’áUÞ{±ÅwJIö.}§äl|tdÐaJØgËÇXù55\¨ôž«W9Ϋ—UŽS•ÓTå4ªüÛ!†‹•dt›ð‚ ¬wœ­9GK`ÍCã…û©‘Ì{sQa/4H;!`Z ¾ƒ±|uƒmT±^Ý÷cÒYUÀêÜKY.ÕÙE—fg:FÀ&žj…Vß6Òï±…b“åí +djëÄDÁ‰¸Ró\߀¡lªƒ—úCäDáê³4«ÎÞ@­A*Ô0àc‰f,ÁÖ®:öD±D;õ4ˬíùJ/n[¢ _úa}Š‹WU“\ù“ºxˆ&¬éî•8]6‰ºu–Zª¥ô…¢\¸}VHS ”ÔDb=}ð™Æz:Q")vÜÍÅaÎÏž Šé]@1Ë‹¾gª;`†Ô +¬¤ +mžË +~ãŽ8ûœÀkâ~Ý0«6§Ó]Ãn$Ž±%o!§Hæä|¹®pM#ú±§±½nê Ý$îY´7EkÆa´f½»p0æ¨D¹$óÛgjöùÆj‹¾š¼ÊkPâù̓gÊÃͦ9gj®P+ÔÉg}.<ä”þ-÷Æ"–¨“˜83è%PÇ—¿o|Ó†ty’h–¿:gh^F«Ô=½ŽçŸÜ/ +P±‘~˜a(½4´û¡ôÄÐ`†ÒýCÖ¡Ô˜@÷N2†Q¾.®¯&chº&+›¥ÓÌ+òÚÈ”tÃúµeéO}{ļյëf¦kú³1x•¹€n–4”ärëjš\¿{ûËvÿƒT„÷ž,Éã×Czq=„¬±gM2®›¤YÿË'0é×î¼ëgm—¯à› +n(ÝP_úIMõ';˜íݶ÷ pÝí +Û»ã5«¾t[Mõ¶¬™yü{ªßöñZ9Œ½õ³¶±ÛŽ S¶1Z ‹Îð]]awÃäYn¹_;Ö[od®m¨¿.&êÒt2 ÆR\&k<žÑeŠ×às=j³ uÑo8ÑØõ´úPž$hÃqOæñÓ9[’p½  N £à ñóG®d¦ŽËJ<ËÇ¢è)5oÿó=g"½SÚO0%éÐ ŸÛàåþJÇëp¼QyMS¾Öv·é²»”ßiyαLÞõ¹¥c˜:Êd¬C}‡ÝO9Õš§à¯{þŸã]óøêˆh&ê¨{«š8„Z-xsV`g4?Ýr”ÏÜUÕveåd¸ÿD×< ;ó¯ÜÔý#}‘^´ÈšæûÑÑ´ï•KÙ{ö4óÈ?ó;¢v¼~šÞ›¥fœûÝrèÐ ,1¶z=ü'ݬÑPìœ{ºØŽÐ¶S·Ïï¿VøïÙ\ì hÇÓ6œìòCÆ»ßh‘G—“t2Œm“›°ó( Q} ¨²5[?ôÉM؃Ù(SU\=ÖåG‘k:í9¾)ªldh`PÛíêX[(ó±¶ò‰®6CÕo#amð[Öq¢v°òÐ27Ó±;-fö‘Æë¯K±q«æ:íÚ™2aRúãÓÕÂ}6È…ÿ:ÀøÅôÁ,CL?.3Å´Æ fÕ€ÜÑÎBp<ãGÙHÛ¤Hlq°o¬Ë­eÖºÇ䧙õ*5•‡JUÚdÍM¥v)2Æu•Ú*Ujö1žJ=*5è¿ÆMȤ³m\Pa%W¦îÿŽdË8q¯¦cM¿¾aœ«f{”“è’s´qãåê$‘’¿þb¼4@åúfn ÇôK'õ™Ð{+O6ôžÐgñÝé³Íc2é³?Ž·è³ƒŽ…>k9ï?ÔgÃHów JŸájd'é³õR´ÔUNy·±¦cƒ¡Ïz¿‰>ûüX—ßȬéXoè³ÔªÏRƒÒgue®¶Æ„>r’¦ÏÎ=i÷úlÎÑÆ댿>KiúLÌ.gZ…m:ä¸q~Òkè3!¦ßgŠé`ôÙ5ǸÆíVˆDf}öÔIÖºÓ„Æ“ŒzØ&ËßçÆ+©gþ?o×]euåo€@Th®-HxÉ-^yhx¨QP.H4.Ñug†Ø,_g”ÉÌ,84n›40sµ¦F[ÇT­fͪ6N¥^± ÑEM˜êòŠfÔ”Òñfð ÷Bæ;û·¿óúN²ÚÅZýçžï~gï}ÎÙgŸç·-ÍœëíSJ%Mت7Õ‡ ÌíðU åîûÏzvyeÕˆg—ÇW svùªüÏsv¹ä²?íìòWÞúÒ­yIîL]­:ÚðvT*{î“ÅÞ +qëÿ˜_–·\ +ù‡y'ñÄ¢¼ôÔ)Ž< ç ey’w©í^So÷–ë‹.ÖÀĨY›g[idJ¤3=ÙÜ5á +áõb*µ¡£HÑF‰ºYå¤mVßú“] o9óu]UÙ•I.¸ÝkLÓö›|7¬á»c!¬0—.ÔVh­fþ¶ý¹fý÷ÿt…ù~ +æ¥Ìs—:¢Wø«\Å*="ŸÆÍBü¥‹LRq&µi‘ù>Áï×/'Ó†'¾¯ ¬^«ôÛ±ômž\|¹á1²]êIß±åyÛ{ ùñ*[¦üx)‚˜–V°ùHÆ亞*Ê%-›üë¸ÊEËÁuI©d/58Òºxë40$¡ØNMô»â' È_T:´~²ïí¥`‘òö"tÓd‹·>2ÔæoÉÑ0«Së9¨ã?…„GªKih€gYÔxÓl¯*cf_ÝøÎÊÔ«_ …^‰{ÜÞÙàý@l•ÓÜ”DÛ¥C°Ç<6÷ýƵ¤ßß+܃ã™%æû^Íþ™/s¿ß}I^×_wœï$¤ý0y)®¦\¨]?ŒµÆ¯ÐßYnœÜdÙ·w‹)‹£½™¦ ;ÖÃÖÖ°ñÉYê’ó=~|c”Îïò*»ùó˜^1´¼¼½)!Ji,ߺeóÖÍÉb«ÓÎjX4Žé˜òÑ„Û.‰–Ú´4GwôѶmÙ¼M¡u­b84òD1ºi¾»ÀCpçò´O= £Ø4ïÏVØðˆs\ÞãÃ?ÒT)<Äô¨ó© Áå½>| EÖ,ïüCxÄËõV6†ÿQSåÔŠukÁfËû}øÖ&± .ïü¢<â®z+,Ã?ÓTùŒX¶_°Â^Ÿ+7¤7)é«|!:2ßÛ¤l†7²³v&W™¿™Õ*:`˜¢fhRšf¿þ¬©ü3¡»AÍìçÙÈvIU¾0oß<ò\÷ö(AÔð”ÓŽ±ek¹i¾‰CÔ©%½F,­²)㽦ôÝ3 +án„Z«@úæy ×c<Õ ù¾b¨q‰MCbw¿‰öŽgóËë½u^L—燴\Õþ5GÛ&Û«Ø8šo9‚ç_fƒ±Y}°10c>ð§Å–‹¯ä7i#ë¶Ñr…Ùî­—wl›¥k¥õ’œäb1i]­­—£° Ñü™UÒŒâˆAÛµ”d…V3–ªU§ï»ÃÕÅ«Âß5)+-® I êÒ­×eãEê‚ZTé¨Ë2Ô…¶¾,Ñ·¾ÒD0u®GõÄroâ/”qTÿ'*Nuú>KÄQ¥‰<)„d3z'ÊiÖZ)Š·D9ÜäÁ»ìaÙÖCvþa™kôÁé¹?¾s‡õô…áÛÇ„0+öæ–Ïb^=»7ìöêØ­\NÉ:îô¸Ñ÷<6Ýl!\D³^ùîÆò÷š*ßSSÞåËØó Àªh²`=ðhÈ3ÝdÌ œ%È}M•ûÔ÷¹·© ×½ìó ¯_Îáõ-›`}éD¸ßDï>9Ìdó/!k²áü®ò<÷’:àE$Rs½éñ2ŸÆãstéø‡•«µ ™_ÍöƒyvÎWÖT™oL–èBAÌö½Ã”ïãR»eÈÒþ+ýRWÍõC‘þFc~S} ÉAï–ͽ¡õ íךÊxu|ãÅà.Ê +è ŒWÉÂ{ŒSk•<µÒòw©[ÏU>%[fÀWçì“«Üxm†àõŒp¨î”­_í‘9¸Zò‘›—¥£ëBûµèP¯^é2þèc´Z¦c7Qøš?Ü!V¾BËð±†ÇÉ*K…ž­’ñh'ª—ÕòåxùT¢²kÕc +T$HËOÊ6Çgû=^y}pùä;0ÌæÀx9ù©¿oD☠kÁ’@”4&’ô¯pH¶ ¯E‘lÅ›VIÒ˜ì'd€Ú@²ÝKö}ìyø ÅqE‘݉§¢Äî™tT„þ±EÎÛâ3ÿD¼ïä˜TXuiR¡Jm"èÆÄtzžNÏz¿[²Å[^çoÉŽ*Þúå(ñ0TœØ[H½fŠŸ®öŸ{–À45Hs –D!o«ùíµ¨Wµª¢hÀ‡KpHàÞœÓÛC÷ðÅ „¶¦0¿âŽ9çôöÐ ”¬Y›] ìÚdÚô3Ü£€ë×àŽÞ8Z+׾ё ÷ûçЦÃB³šž®9p»·Êö½4Zè¾ê”2¿~1T¸Y}5›:çâÎ9o4òÃùv##yË£ç'ïdyåùPáxi Àa’ËòN–ÏJ̬͚@mbFmʸ-³W–ŽåËã`y\Ñ1ËÅro\¥³ü¸ÌZ9Ú¼,¦õX«U°ÙÂ{¤ñY¯"& j¼B…F‚ÉZ/&KóV$gŠ5;¯Jöù6qžÍ·¤«9^rƒ +|¨¢xŠÃÖ:T|Ëk» +˽ž%_Ëæ8"E“Kq¹_ÑO1zÉy{Ò§ ¨<-\·Â)˨ÉÛS*–sÐþg~^ œì7zæyv£;F§˜eƒQD¬Ï›êïbÿŽœ6•ÃŒÒ0;Ä}ªc„]ÖÃ);Ä}É|= °ß‚›£v zôp=/\Ï°âž1ÄÁu›ûU˜`?ÞâL—¸³¤a3Ú¾ƒ•Ž©L+–;᮳]Tµ@ÆòXõ¼')IM™M‘×gSäõñXàér{¦%ñ;Ú×.OëÐxÊ^@Ùâ7´þ:£|¾Éð-ÚÁX´4—(ƒÇùå>o#vp“Û%$yBµ¨2VpP[x®Å¾3ñ•±³Ns™®Aÿ?3àÿç~h#›áŠ÷“U| qöDÅ[Ù…„f*|Â!2|ã*fþÀ¨¥¹ZE/v´èƹv‹pK#–…rNxw¾‰¹¹â„ÉøûÓ‡¡SK¯%¦ùy¹9®{t :?ôd¯ïúêZX¼y–Ã’eô~±*%Á)%ÁYJ,[ +–½\`9ÂPî-ºÈ€eXîµ܃-Ks«2:qpoÆœaZMî$î”­nžg[ß`JÙ£û¡ï«ùœ`£2éxPZ3O³zßÞ ¼=¦Ø‡AÍó·¹[ù³ðõc¦æu‡ÍçÀNU±+Å9÷!'åd$7>MÂe[°Û… QsRw2äžèômãOê¯zGê«Œ1vaÒܯ\O8úê®s†é«¬ÙW}Q;Ö±£¯–b ©X¿lÒ±[j!˜Ålgë˜"—®õÿbà´áXÁšÿˆè”¼²"éÊô}¾ÉÔGuß"åm䡯4“9ÿOž–ÊüÍ9ÁXÁlTR¸ñÛúBâ7ÐF¨ë]m.èU†[~Ež6LÐŽzÏW@Z´_¸í7£ûŽ˜r®P¾—~%ýH'U¾!Ó¯C%ê s +ÑõNNáÚ·©`‘3Њ<‡ÈŒØ"—á©F°ì-))1VaÃÑ\¯;X¤¿h²!cÿ˜0¶Ò¯EÊ°é†Fds§®I¤ï›,­2ÓÖQ{QZJ¤(üãì¼rSŒTpDZ|C箹™¿sŠÃ#4“¶³‚RÆ5ßlŒ £­Ô‘—ÙN>è2:ä äGTbÂôYx¥Æ™ùáü¾û^|ÃêcöÅóº¡Cvºí4ÜWYùxº©²¢"¾îžnG|õ5·þcºáÚ±oÎh¡µœ8¿†9Ïé„y,:ü1þ¼\¢Ã¼ÉÀ7üæZu=îÔôaD§ÎÒYÒJÃo@œˆÎ’ÉAßóB/ãÚzV® +tóʳóCF`ÚqWú%ÿâ›A«G`Ú¡20m ¾ÐÀkŒêék¿žòÃö9M…íóCA˜JïX³:$}SU§¾¿+ÁÁ®£?ÈG :C\ÀVRD"G,æîƒò´Ö?‹@%¢‰æŸÆÄZæþÚ÷wLÊëq|m–½9=o„´é8S2}eÄW¯¸6%¿óè¸Ééί<~˜¤ß…Õ—ŸL1”šèâþ¡)ZàòàÙ•ÙŒwì¬=¬Â8×JÕ0ßÉÅS3lÇ1 ã»Wº0±“#Ĥ¿a†“Þ?l÷—® 8çƒû:´s~‰œví^…sžBN2'=å4ë°¯ƒFú~4 +ë/HQ¶!.ž +ŽvÄùx|¹è¢®XéŒW[÷ê™%EäuÄ÷ïIdâý]UF¯éZ¾]úõ߈(e»Ìþq>AÿDgq~H*Ô‘Ð’ñó,ý¿XO§±ˆW]FaôéÊC™m¼ç'Vd!…m$Rù¨6‘ÂR‰TBßwM¤ )b#EÒÑ©RÄBŠÚHQÒo0‘¢R©TJš &R©…Tf#•‘ý»‰Tf!Ål¤í§L¤˜…Ta#UÐ÷À)R……·‘Ⱦ3e"Å-¤*©Šü¿™HURµTMãßDª¶jl¤4ÅDª±jm¤ZÒÏ.1j-¤:©Žâ˜Hu&’ôë;Ï~'ôé Tͳ¯„lp`7øúŽ&vC;éÀN2vv² b·8°[{§‰ÝÄnu`·2ö&»5ˆÝæÀnóçK»-ˆr`§;db§‚ØìNÆ~ý,»3ˆÝíÀîfì­&vw;íÀN3ö•&v:ˆÝãÀîaì"»'ˆÝëÀîeìÿšd`÷±3ì co3±3Aì~v?c_gb÷±³ì,c‡Mìl;TÄñb½w¢*`9°‹û»(ˆq`Gûz;"± gÿý¬Ü> ‘@{ i¿þv(­öÅ/xۺ“5³D&튼¹ÎÛNŽÖ£=&¦÷þ/Êü›Oà36æm;¦â(–ù·1Ú¡ñ ùðtEý´GÚPÍÉ4n8PÑXÙÝÛ*ÒÐYÿ¬ r0ÖTž¯h©Ø>ñ×r Yàó Ô.šµ¥<_àÁ,+?°)åÔl hºö鹆õm8bÐn¬ïkBW®xfh½…I£m½. ¢qC?JÀ¦wà¡á!*ûµÍÕÚµ–ê’l¼¶w íé7÷¹µ@Ü@ +VW7RufVœò£WŸò…לò»k†eŽ‡LRJN¹ÅQN­ªN¡´Øu§€üa< É"Ù¬¹ëù‘r/{q¤Ü/~>Rî‘'FÊmyr¤Ü‡~_¤O°{ óþ,]cĥ̻×h—2Ož&Aäwî3Fß+–ïvñ^v¼ÎëðÇTFásÕô9£ç(®šJ%¯^¼ .1¯_z®jDIc¢ÿ(ém¥Ðú‡ö,> ÷©€Î:4¨ueÎ.‚âÑQPgWÌ€#ªÞz¿V|äANtŸ­mþýçÉœøÀ!2BÅ[ŸæëÐAôþ¸äKOájXx[ª~ðÑ3/ªÓÃ(¸%"·‰ÞˆÄ4¦©:v‚\ý âëgH]™„´¨RaUÃ\?Ãn†ž„ÝÌ ãÈn ¶ìfN +½Zs¥·ÏY´›©Ê »4¬+sëi¾úàÝ1ÜqFªÚ èÂ4¿ýw4»Tc´8™7I‡rú+áŸüô¼è߬hpÍD¬1œ™[ÏA ]Æ܉L0)ðeÌ<ûðßaæ_Éè¥n¼(€Ÿˆ¡`‘`¬Ýwç]ßelÞnwc¢ÂfQ‹ÓÛHf%ÑxEŒÇþ Üë ÔŽ küéàn ¦0½‡™~sn©AªŠ3n¼Í˜°ƒ1tçôY‘͘p1 wˆf#äÑ{˜ÇªQp5ü¯gØ—8 +¦{«»— ÝxI?Qƒ‚kFè‘É;˜_èA®.ð6,¾7bî@²aˆ–ù'=îƒ'T`gžxÒ¸æɽ§ÛÕˆ8xB×r=ÎæI$ÈÐG‚H!¬¹[Ð$€a{%o¸wÜ/ìë˜{!`"‘Š`¯ñÁnÆ@l±V ù6ük“óÚôn˜”vµ%Åó5óè'±*rømì4›sQçènrÎX›sÑ ç@7Õ +~«ÚjZo㜟#§Må˜e&ºQY‘È…ô…±Á{% Ó:äîÁœ²=>'׫³ã‡ÌMwo¸JèžH:Fs ³ŽæÒ ÈˆÀ  dä o˜Ó2 ÿøõSpYfU Ä¡¬K +‹²ðŠLú‡–y%dÖ!ºaäR"úœÝÖRGÿÓ5óœ1vÿ—ûtã¥üD +ÉΉB‚oc&nÏ熂à/L~‹¶EQ G¹Ö[)Ô¯ÚÈ-ÊyÂÏÍ?ÅÀ¸ü}ÉÙA¥ö‰Ëèí$ÃKÍ}þ>â‚“®ÚÆÀzÞrÆ$®°B]{ÛêPÇS°L§ÇïÌ«‡¨+*PR7jG¡ÝeŽ® ËûÇGÙ]Qì +Зðqç‚:DÕÉ ò"‘¾(› +âW_$r°}÷°!ÅHq5 «¹¤½å"æh"}jx¹Ànḇv¡‰±~¢‹D6fL ëdm@DëСH‰úò˜‹H=àDqléxQŸ£7žÈ9ņ@é‚\¥# ûÏðJÏìo[Û¼Ý8Úæm…ƒ·ôEæÆÍÛŠ oA7^ÀO´ +¦¦ä¢vÙ((€ðiC_ÔvÉE­«OêL‰·^áŸH°¨íÒV ”€R@é䆗­Š3ƒ,©ÌªíêÅ_ÿë+ç\ŽœvÎÉ\Ží]7(v3T# id¦u–ÔòicÈoCþ5òo9:Æ[†ˆäv¦Ü“5ýõ}•sàôjÂ"Ö·/r0€ßÁTz©0òzgç“·­†}ùk g‚'Jè{‘ì­ñÊÊüí –&äf™U'BvûâÁ£¯zû­1 <·j‚ºä½ÕÄO„Žyüß#o7æ­,z ë¼bl‹ý‚oÄ?‘8o_ŽPJT”ýkFB5aÎÜ%†2¼¿ŸdI¼Ä_ÿ¬Ê9¿FN˜s2·P1QPŒ2ÔÏÐ[ø›(=64äCÙ1øEfÙ1Svžÿ2çÀ‰3d§á3_v˜ŠÈW²³eçÅ.Ù©pÖ*! 8´À++s.Z[…Ü*ník)¹Ê!;ôq÷Ùœ-;UŽSÑWðÕBv>²Ó€³U7!¡£NÙym ê\ƒ.©å8*nÙiJ€ê€RÎ ¡šøöåG¨Mõ̧’„Ô+Ù©åœFäÔsí”Eó@[$r†zÏCÊ a¯‘D~’é]~ÅßDK ?ÉVHg¶ZRvÕç9N›)e³þÏ—2¦ÒfHÙ”Û!e×ä\RÖî¬U +¼Dðò>o²_vðsÄEèà"¾Üzè+‚˜4scY`ZíBÒˆ³¥°Úq‚Vkgù"š«Ý(¸› ~=ÐðGÁ¤qð\Ö.¸&X0èÆkø‰4 +Épgù÷ägùž@/r½·ÕbMAß ÙÎ0D2ó®ÇýLǧĉ~äö3'RÇíÂkœ 5Š'mNÔ9ºñÚ~"‹‚³þ|ËÇ"ȉHä~qéçÁ:ySÆqLǵ‘ö½Œ±ù=ˆÎ.$%â¾3°s¬s4‘”>vµ›Xl"èÆëø‰0 +‰l̸ÃÁÒ½5îø£‰‘ãXëI0c‡¾p‰N$Ãm~ï9”sHQi tA® ¥# »{OÀÛrcÌÛ{ìsŠTŒ)u¼ûËÃzàkÉ(€ã_ %*¿³Î"ìJ M%îeeÓaŠ£ ”x #þ‰Ä±¬\ ”jU¥ŒBB5aF„àÖ0sÖôÓâ!þú†Ùœ³9Uœ“ÙK»‚D-(Ö2Ôt 8üMÔÙæ³¢þ8®ð_Ü\/&šs£57–Œ/ï/LHä«%ãz^2J\c39\ÝZÀ*$«’^q™&4»¹­Üì9öÝT—*u¼çËöL58e +$2Ån=Û„L–2õf¨d*â–©(¶v4¡]•Â¿”[¦ú±2Ï€Ò F!¡š0£=Hëfæd?'ÉéV2•âœ‘“òeê~Ú$Ò ˜f¨n,6ø›è ëJõ®ð„¨GIO"9@†ÄÿOÛ×ÀGU\}o€´©?*©¯mÓVmðISkmô±o£X]Ðè¢ ñ#ZðZÔ€‰]t1 &„èV]ÊkÓ5 +Òm –Uшº(Å•RºRª7€º~ToȾwÎ9óuï,ñëùý {wïœù:çÌœ93ó?ðIŽº—ÑQ÷_8¥ô§_m¤’ðUZêu•v§#K±aq•v‚™ÛÎT‡bÂú§]bíß—ƒÌÒźè .Ö”‘¥‰õë±ï›Ä:ãk*‚Gð“!·Ö§±^Û‹6.^pñÑã‹Ü8ÇWføÙ!øqÆ-Öa£Xcá°G¬1£æç}ìk¹X ÓRëR³X_Œ£}!6¡îÜâ·"Û(ÖÇ!I1&*¦‹µ6îPâÉ"nár‹:gôÞRy4»ˆÞ|ßpœëa4cÊèö¥z×íet×Îf]á‡íôÞoë2uð ÛL°õõÿ.S”{/e*o.­ÿß5ÉTe®º!Úý¨”]5gÉJ¯±M¾TífœcÏ8c‚38¿6 +þÚµà¯]ûqÃËø³#±#„Œì};e¤ŒŒømÿ¶=×ûÖuw¯u˜åš2­zÛ-×F¹ÆÂì¥bÐÿl/.ôœÆw_‹ƒªe†ŸþÍAw%:•ÀÂåê¤ÉW¢Ëä²ïÿc™ìûPŽaÏ ‚ïGš~´‡UÄß·öXE»qJ•5àÿuÛâ£TTz¤K tìTÊ6Ÿ¶Í +LŽŠ…VŽÄµ€¢#¸yêS¹‰¦…îúwŽ|êô|†a>•˜~äóôÞùNIÅ oB>.< Ù¨Š! ÄŽ6`š ,¤ý-Š!-DÚ› -$›ƒN½­—÷Ù +TP˜’ö{:.i&ømƒÔ¿Ý‘4X@8™k˜èðD’ÂÀbs;%5÷ä=¶™¢Kb ˜ñfŽÄ f(Ö(y:ZƒÕÈHü ("¼/þ¯ù0ü Ø2‘Ï{ÈÈÌ?rí£tŽ|ň¯sØ7¹Î9Ë1c´Î9ÛŠÍ]Œ“ùÿ²]¨D°¿íÐRfNò›Gîss2eä$NåâdÒÃIB‡@ ¤HJF‚Θ½Û6S RZåä=ûr$fHF±'®Aã²9Pû‘í(ûFŽ|2z>'‘Šùàb(a>oíÉ‘OŸÆÉ>“SUN68œ²:ÑÎR”Ø«+Q»ð«4)ðª-~ã]´oŸm6tò(R F݆FìÝåÓ3L˜ºÓ¶!À÷^OŽi³0ñ‹@O½á¦´Q˜°€p:—0¬’§Â5åÛ»l3…‚QôÞ{s$fhK±—…*D!ÀŠ‰Žçcÿ™#ÇK‰|váb#„ùàA6A>÷íΑA%‘0©Âtƒ*L¥Ìh¿s‡-q‘ðƒá{yÆ®Œ™‰üFÕÀ?ÝLÌ™ˆ„3&Z’”§¨õÃQŽµ¼™/Ví›GAQ ëßúÌMá×»Nñ4¥ÏØ, ÜçiJŸ@Õ/øyÄxŠùÙò‘€jëc= ·oÁVjÕÖ|T"%¾:+D°‚BLá¼/b7¶ý™{pÞ?dØlä,{xÓ§XE:Ô`íPÜÝ{s´©S“ÑNMF;˜Œ~í"”Ѧ½œ»ËpÔëR!¤V½grô™­R~ýîÒ¸¹ë3Z¥X@Øç±J ÄÁdÅŽºˆs÷¤¢‰„Ü ¤@ia|øÝÆzòXî‚»+±•zVºDÒ¦¥DxOìîöîrX­+vÛ.X-/w“îR *’òàgu§s´)­q7­q÷q•»¥9wWïÂóhI äÇ£fîòë‘ ws·ÀÈ], \àánÅ9fÜ-ܽèxú +¹Ûñ‘Œ=qäßõÁá9wŸÃVjè] +Š"©€y±‰×¿Õ»¸[ *8ÜVh—í‚Ûòr— ¾¼5ÔѾ +%ÜÑ®=9ÚT<¨r—}“ÜÝ¡r·ÇÉÁúŸ—lCùMu(23¶ˆ»âu7c‹ŒŒÅÉÚ¸ˆ*óô–@˜b‘r5z=Î×Ïs-HÙP±„õ¾‡÷Åæ¦ðK¸ÛS‚„‹=M)–áãcg }e«e?ò ÛqeÊXOxÆוÇc+5Ô³„5[I h{©ñD¯xd´FÈ(GFÛýÈhQF‰µÞP A-R§Âª!>Ùîm +j2Ôdô}UFKvsӖXh–>aí1KÍÜåX,ìts·ÔÈ], \êá.fÈn±I‚»Û+]È]ü@d8ì‰å;õäxq‚»çb+;T¨7g}ŒÚ…_Š‰áÎÉBæ%»‚»D?ø7ànçá¸Ûåá.ÕÕG(^}—,®zWŽ6ukÜíÖ¸[8Oáîy»l³5é +Ô{ÅÛ<*hAzysÒYïm±={Ö×ÜYDÍff”ãìp JÔhfbᨧ_£´TÖc¿º7…ÉQ϶To5VQ‹¦)ï3¾–#±S$¾éYí,Ì?_°³ÞXÃÏ{D´ÛÜCW£ëUwu{ w{z¨›V×2¨è‹ƒ/+# ö¼íö¢í‘˜n!GVJÌã\gdª^αQä©eŠØy‘b5 (Tã§Ö:ìùÒ¬@Íc¯&ýÍ]JÜÜó“ääWÜ=7ö<Ž{z>Nëh7C b_ŵf7bÝ)¸}Є^0ÖSõ2·ÿE§½ßÜj{ðüÖtT- Þ> l¸]}‘†—^ÌQ0Æm§,\ðtÖÏœ‘ÀÚû¢í´sæ;”]üÊ#zó¯U‘ëà›šÿkÏä¨âö­«‘ÑAÕ›Ž×ªM{†ÕñÛ1âáaƒƒÏ[CÝcÈ|-j½ÎÎQ/KIìT7N;Õ Œ>,÷¨Ož‡{ÔãÙHÕVÊuŒãômæˆáøÊ&T?†ðÂôèfåHEHοž§)qD%:GÏ8Š&|´>‡öÁ†§l%î`Âúd»»z]f¥â C¯¿äVª.“RU9¹‡»<Õ%‚?UDsÜa+xÁX#€êãýÐ-ûa뇇i¦<æUó@8…Þd!uö‹ÏÙê)…q ´‹Íù£µ¯'ž$¾n8ÄTzUâžÍèvºÝº;‰|¥bæÖ² ^Q«[™Ù2+#ËlÊ‹îþ/3YfUI§ÿËJ3Óøút»|ÉmBA.­òf ü'³ÙiüO›-vFÓ†p •…¨š€S‡9m\ÜÁâ=ïˆw,ôK¾{|ê“v¶wF¼³÷;õ÷G±÷cñ} {¿_ÿþçýh|bï?Öß¿ÂÞçå!(r`þ$-ÉŸX’=ª• š4÷:MqFÊ@”j«dßÓx-Ï‘ývgìmo€èxc×gsúþ¨ Ñv·Mëâqf­ßl´ϵqqÜÇ‚,¯t‰10P"`Ãwø³óoLE$Ô¬o¹FÔ'µµbu[Åj‡ê+¬‘jÝþ^6.ÙÒ"ƒ•Á´€‰k~Ñe‹Ö;]¶ÔÍ5ù~*{?×Í5ùþLöþ<7×äûcØûÿ6pM&éïv’ Ïû2¹–§r­w«äZ@e[å.¶­ü4l[idÛˆgmZ±ÒŶõ(A»tó +,)4(î}Ú–\ú¬õ‰~ýý&ÖÊ÷Kž0±V¾Ÿñ„‰µòýØ'r°V&9î‰/µÃTÖù|Ö6¬ûòXûÃg>koxJ²6ÿ2Yÿï×çÖ™X+ß?´ÎÄZù~é:kåû¹ër°V&9gÝ—ÎZm¬ýŸDÖÞ÷×/µ=5kš¤â?m–¬ýW,kÎÆeôè@ë: “Áð¥°æ›€ëFn:q€ñDE71¨ÓqŽþ’ÓöÞ«0zn%Ù©'YÅ’\0L‹Á»_OÒÂ’œ ÇàýXO2‡%IªµÉV$Ç’¼‘§†=ïä+ß6â9È€E2!è ´O ;rrä€a¸u&Î-aÞ•lbD ûßúüØîad‚j#ù÷Ÿ…þ‹0ºßAîX;“fs¼¡’#°³(À-ï:‘ý)üúkæaX²c&q@ô•Ý6Dïï&`g!F2ôŽã8’;ä·¼­b¹³(=‰X¯Á<ºyÉZÝ´dE¾CœÞ +ÈËBÐ'­dèSõÙÒ&!ÉIE’“B’SHHrJWoŠ1Inj«h"IŽ“$3‰G|ym”Ú±ºê]¤×€ïGàoa‰`ù¹ì !-GÿÙhgˆ÷Fv†x¿#j´3ÄûµÑ\v†HòÛèÿîd´äé#–µæ˱VlüL“ÑÛäˆuʆÌX¡<Ä<—ê:ðý'À‘Æ¡å£!…ÜH4¯ô¦H€pxAù¨Ä ïTF<Ÿ`Ún§ïz:’„)IÉ$-Éz–ä¨8¨]XpùêÿS‡î9ï·UÅVè§ó¾Q\–ýh6«;À=1PúÔ=ò%Gà£;ù úÑþ,ÙqÔäNÌZÍk‰sù!ÉUÇ}Tfêü7.©!Èy¥rÎcmt8Ua¼ ´ãO;óÏA&‡õõ̼üB­üNY~—,?*ËïÆm£Ö浃,zÚZ„Ä¢ò%ªt’¿UË]îùÙY}(ѼZ<±Í£V}ýQg¬º í*_VÎd’ý8I~IúhÄ;EO’`Ià $Šd+ŽâÒ—k/è¯klsÐ$kÊ“|ì+—[2®Â±¯èÁl®ÀI$.|Œò©cT¤ŸSˆˆñšGm +·ÃÆ+6-AxŸ(ŽTÂb +¨»'0WÇibí!ó/IÆTÊJP“ö†8¨‡£ÿó!Å<6R-uQè vsíh?öW q°ªNÍÂò0O’Z’4#¥AΊ°u{à‡OZ{(<‘·5Ðú\ õ5«ò!Û£¥|K•}¸Gw,hÊx§ÕöB\n  >€Z¢ù\)Ä¥Ú\4ó•ÎØûÈpHR¬-ÁE’R–d)&)Ò–à"I>K2 “jKp‘dï$þáÚl‚Kp‘d3KrìpDžÊªCZÁ§Y…·ã ©”ƒLíg1Ãëì¬ßµÑqŽ'¯bŠ}.tí¨¦e.Ë_˜!ùH!ßÖ‘1ú ¨;à™ý ÌbRŠÑøna+c¬Ø:ó1}JØÒì—~ÍRƕﮇm>$ðL>^íÊ„ Õ\‹¤ý[#ì_˜â¢Ö;ä!h\…ÕgRÆÂ`‹¿cø3,þºy:°k…a,´þ[ÃzäL ¹çü¥U`§\íwVûo®¶•ªÆ¥Q'çtªÎˆ‘rñUM*UUý”NTUuI¼÷«ªªê—Uõ:&jUۘնʿE«Üüã'-fâ›j· %¬¾©ü,“›ÿK2ÅìÇ= BYr:¸÷=ôP”©¦ŸLòîïœ$/åiÃÏ)z’m,ɪ<9}jg•4Ã,am^i+Z¥4Ь9æ6_µ´ù|@›¯ä~÷H+–²¬'Ž$ZyµÒÊëéü4VÞv_ÚuµC-6òÿliY‰©ˆÆˆHP÷rd½õ°®j…uÅÍÅ<Zj¥òsH‰.[•)!€5ÃAáòan¶pÛI>ÖÉÇ |"ºx®bð( +2Š‚|ôI·L|,”Eò1%ÉÒò1$´ÈÇ°|ì–$Ë(uSn|,”r—á8Ù¡O«›ò„@®®‘F²—¾%¡K¡Ž.Ýù5Ÿo½B±±ˆ¡o. üÿßCÞ«nx“¬=òÜ+»¦K½ŒCW–𦠿„—dðþFy—7}j)àé¿÷‚†x¬ö ŒÕh˯-¯»ÁG[ˆí@·6¯ä &oíë:e}Ín–ôý¶R¸V­I­ì†HìÚIü,ÕwV+wMñ*hûº¸»ps¦VzZ+ÝÒJÏh¥C4õEé÷¯ÂÃ6XzKO›J׆ûîc±"tCCáéý©—4jdPuÉSŠŸN<-4𔢞SsèR5‡®&Psð"B~ÓÀh×…Däñq[¤V<8OGÞ§öª_«F@«F¥V và?vèÕŠGÑsª\Ïm_犧·Ý«–^£•^«•^§•ÎîÇ¥3‡¸êIcé5ƒCñ´ð^àiÈÃÓÄJ[žõzªñ4¬ñ´ÃÄÓN­9]Zs¢ZsðÜz~ô“ÑüÞ(] mƒàª­Í§IO‡âiy‡¦§Z5z´j$µj0‡wl½èÕ]xõ +{Õ"=’§îÑôT+ÝÒJÏh¥Ã1ìÍ¢ôƳâXz†ôtHžžyêiÖÍÓþ`+^(®§YMO³šžfMzšÕô4«éiVÓSø–¿»o4¿ÃK×tñÄ6ÞÒo‹ÄIO³CðtöÝšžjÕhÕ¨ÔªÁÌ·Øë¢Wi¾¢{å}¤§Ù¡xúfDÓS­ôZ­ô:­tž¥ÿ!å‚z>ÚùaåÃð´–•Îöƒ5†ÿ{nÒ7™UG¬d†ñ–ba)†•‡­¬9n÷âžšüÿúx´¼4 m¡À¸-À¸-Ðw°1‘›kkîRú ÖUTn,7)ËMÅl)ÿh›(×íÑÖ= ›ÎÖŠKËâ,Y\F×óUòâš°8ºÝ_xHX¾‡áKòN›ƒd¨0‹bõâ80ì·SòjõâvÂÚkºXñ,¦ý=z$¹læèWÀf°ç ¸p›Y>ÖÉÇ b¯ÊÇù–ʯýò×~ƒái4,`òg’¬«ÿsÙíQIÖÝÿ¹ìö¸$ëéÿ\v{R’¥ú?—ÝžîÿÔƺ%¹2öÊí’jn¡ï ;zÅÑÜBgb~ÝB·ïóB àïæcá·FÞC’ò•ÚˆO.ö\¾ï?Àܳû™û‚ýElpg!§vÇl>eÿXÕêÈ öÅ}x©^Á…—8}ó%Œt!’é¤Ë=¤EZû¡þ\‚ øI±ƒÿ¿30ù)Ø¿x¦µy>“÷ûËŒAÊ÷“\;OkÚmEj‚Z¥ÒZ¥,­R­Rd¦AP”¶þ7ëô)éçZ!ÔÄ I-x³CÅÄ!-(8¤jAá!U he¯kA‹Öšð¨=´Ø¦öÐ2ÚC>i VVR6 +*îwö bŽ½ÅkÑB¨à´àH$éR} XÑ‚°ˆÞßN þQSⶠYX@Gâ¨Ô)-¹µ ­Í–à kucµH‰ŽÒ›;ðMT¾áàÌA|ÓéÑ‚A~AA•ƒÐ&É/~´@A+n m-¨-¨C- |{rjA×2U(SZ¥j´JÕj•ªÓ*$sù‚^ Zp“G ~¦˜þDuG¥¥¤#š;j@sG hî¨Í¥i¥ÏZ{º´öDµötkZÀðŠ•µçPP1ìC;EȘ„p Nà{܇B¨À´ I +T`ÀV´ +€¡%Ú)ÂD¡m¨Àš§%±@ŽÀ‡ð¬Y¹µ€a¦ +„â„õÐhìÊ[K…ôf9¾)”o8–óB|ã³ÝZ@@Ç|.ÐÔ£1(©1]ò¿»=MÜ‘µZ›ëA êûU^©K þp«*”åZ¥ÒZ¥,­R­R}‡T‡]¹(m}“G NÑ +˜eáÀóK€Ö]wh¼Í7 9ð4ž¦­=Ü7 ¹ó4wÞ€âÎãZÀ–•Õú»w+JÚ)PI¥Iz'$X‹jB‚c®1kÁ0$ÑЙ@YÑ‚«ïV"•´SÀ’:SÖÞá…@& âHÈV}‘;§ÜÜlsàbÆ™ÎÛ1Ž”hŽï¼ßÔÉ75ôf>¾©ñhA‹Æ ¿Æ €Æ JAˆw’ô[£ ä0hÁ6Ђ hA°_uy¶äÔ‚MªPvh•ªÑ*U«UªN«À˜g‡Ô‚VüH+°µ€\žR vÜ®¹<4—ç€æòÐ\žštiíéÔÚÓ¥µ'ªµ§[Ó†ž¬xBzQP1jM;¯‰š„ð'a´±Ý(„ +ä²A nG —(Ì·¬hA-V£ß´Sœ¤©k07h¦›¦„ÌIÛª÷¶+·\‹-žßrè´”è$½ ᛤ|§7sñMÜ£–>h êєԄG¢óÜZ `G#èhkó"ЂEýª“ØÊ©w/Q…²OŸ ´JYZ¥2Z¥úU§pŸÔ‚Û=Zð­@À›NbŸâ|i¹æ$МĚ“x@skZP0 ÍYm.ÈjsAV› ˜·ô!vï¡4cè¤Hº_u äŸ3BjS µºøµº´ºTjuÁcšùÇîíBÍn ÃCÀðP¿êA.ÈÅðoV+U¬UªF«T­V©:­R¸!/<Ƈ™üOÓ +pmô +8ÛéeÒƒ< =ÈÒƒ< =ȇËÔ ?y@ú“¤?»cQÁÕïᡆÇB/rYn–λI3´Âã²ðYxRžrØ89»Hé62L¾Öæ&`cS¿p/—çäá‹ÕZ´Z¤e-,Y‹Œ¬E¹“’i숬δ›±ÅïV'q¾©ÜœàÞ§"ǹ£lÖ­º£¬qSŸ¸NÏã}MoCp€~—O9¬\Ïsßµ¾Ç™‹ìlï y,¾­óÈ@ëÓn÷㢥¶<5ŠòtË[f]¸ï æš~“bAß`DzÖ½¿Ç´zèxLyÎŽú'¬ßȯ}µV´8òÝZ± © +$Ÿ!ÎÅñKWwP5eÃZS»’&/þ]³†t—° +±©aYQĹã¦-5µá ¶%šYÌñ —âš^Rw ŠÅbo³óSo)Ee +ZxFñ"J¡|Tífü€. +€ö ‡©ž]ˆ fQQ¯(ÕkCýj®R–5½CǼyûo±5µjÜT*rãž#±•¥2·'¬f½'LB±¥Ù-¬VmÕ#ø“Å׫Ž¸yIAëÔ§ F”ŒoÝ>¶Îmù&8SŒßù+à ttð¶¥Lý›°Þt8ÛÂ+‚ͪžštýµÞèÅùÙúI ?5™’’µ5ˆ§&ßY š·xÐtg°½**.,A§ÃzÀs<2NÓJM+™CêMC8MÁY'³­ª¸d…0±Õ‚ØÎGgÏ_ /š ëIu(âö1ûåÀdéQPî –_]VÜi3åûj£;ߢ¬â=É¿óµÑæŽ> ,YÔõFD»Ð½ø¯%¬FBÀ ^?fóV¶ÏvÄ ¶<¯!d½äf]ÖùeøåÀé›_a¤/_¯¢ÌqÒޛܤþ¬êù!fÓå<ýT+Z i²,Ù.²ÎKÕ‹žeƒŠ½‰nVÑiý$óMœ[R”ÅϬ‚*×:¡¤ 1¢„Ù_ã[ûÇvç™Nð¿s­5ª„ëfÔÎF[qf•SG \í>øïÅš›}Ô7t€g8’×t"t&Ÿ½eÑÿ0ÕkÖ÷ÚÂ@C¼%ÊuéÄ[’·5,!pÕn&¦±$›8K=Ε,zœó-zœÛÒǹ%[˜)#ï]Gñê +̶ð!ª +ËáµÎðÕœÇßõÎ)e¶–[ÙÚ ”°N1Ýh˨-p¯r9Ü«\./B£×lrÓ1g>¿™å†ÜÂÛ] uwáõÎq#˜U',ªzñO‹¤¡sÿ«èrשù9œÈ'ÔD¸gðc‡jR)ƒ!?vµêµêµžÁs'äÖÉs ª¹}sSFJ~0o%ä°rÂsž» ·.ž[½šÛ󯌖¸¡ðÁn®”WƒëṞ£[”çV§æv#榌¶âp/ä°r¨ƒç:q«mõ2³zgÙ7ª¹tøÐG4Íó¥…=ÄÕ×-RÍ\ªÝrvæ—z;ëçqŒ·¶‡øìª ëóàì¾2k¾¾Šç[²(”Øí ’†fÈjìõ6]Éêr]Ùnn‚›Ê=âîw“¸“ܸiJû yêäøt7VçŠåx`¨› ? +±kÔ!(9 ÜLò«é!øŠ¯vÀ3ûÛØ7¢¡ZV©òSÜ9¥µ{¥¨â‰jõxæ*;ËìW‘1^Ÿ‹r‡dÑ›î{£A…Øû8Žoåxl•O»þÙ}#¢ðÑhÞ»<7z„Gº´É'a½´=WWûèF÷°Vç©îÚ†;ÁËR†„ýºrí0‰cw9HI¥\Æ?×Ù«N9ÀÒ“_ _Îç—Í/h>â,#žôG le‰Ò¥­Íêäò"¶Kx¨®_dgõõ–Æz‡ƺ{C]€o©®öß"‰fM“ÝNÆttÐàTŸTQ9ꨧp HŽ+)­mÓã—˜.©@Ó›±ø&îYwÞuFôǯntÀcãN¾XiÜÚßع0@Ú3r¶õ4nÒõé{¨Þݸ>­qÎà¦z ÎÀ™æosOUd&+Ó £¬™ã5Ò]€Úœ°öÖ2ͽ 4÷2ÐÜjx®†ç© äøP+ñ$ÚàGt" Ʀ ð_͆ç©ð\ Ïì—1ð<ª}¿º¨èáDóÁB™£u.ï^ãE¹W(ökÝ>Dw2ñT•‰ï6ØäÁtþÃø7‘)ïù/Lا°ìƒ….–9o9¿Ðëµ}¡ôzqGצ…ÒÑÕûÜ xÂðN0Z‰Ô÷_‡VbÖ-ªÊ|ghÏ÷Ô¥ ¯éxwMùˆ­ +lfŒv1ׂYA·;Å0*¬ÁÉÛˆÿ @²õQáÆz/L6ÏÇŸ5(Î9õêpÌÛvÕwÛjµ¶ñ¿bûÚ(¿ú£ÚåPÙpq9 úãRTÜ°tðÀµ^|mfV0èlÈÐÓ¬ù@=¼M÷Ö¹%«EJàìþ¦NÁÙÒŽEEm¼ÎíÞ2Ô6³ßl†iß1ØÍÍŠ°§’‰…¶Øì J~x»’]²’€o )ÈN•Üêñ­qiQ»âªùnP ¨uÃ~èuàè¬Ø.ÑÂgPÖµë[ógœb< püJ¡]DÚ]×bZ(?¥cë8òµP>/¹Ê¦y=ÝÔqtSÃË×BkãZkûãj­›ÐKCãÁÂ@ëbÄ>p’þ’Vô);J +ìªÉ#* ŠK±Î@÷¨#˜Æ nµ“1ïÞØVDë,g5¹(O¹ Ÿ°jGr„u.|;½òóØ>C ÃfÕôÄPƒ+îŠO=¬`ç7+½o«wfw¶A‹êkmuc#ž¨X®ÞÏ×vC’ä K¹.˜g®a•ZÞ¸x¹¯áWFÊ4Q:#>@`{Ÿ¬–³™MU}+ãÖ·À#•÷,›j ¬B (…°w¾*¬aÌAKà"£ÈÁ¶¸e4|¤!‚ƒ·׋ù:LslÔj·É·ÌàWÅ¥­:l$‡î3Ÿ 8SVh›áƒ€ÆDK|A‡üsª(w4Ò¨2Pêœ+¾òcC²ò‘¹ªWD¥ºJˆòÝ,èýêxTsµ(¬ñ~ =Êóï¡MÖZ£@D ñÏ«XA¡ µF±ˆÄâæ¹ÂËÅ¢VŠEÝ¿A,ö?K, /\©5"DbÜÂQ° ±À‰<¸®B-~V±ð ±xlºW,|íðbñ«Yÿ+bqÇìO/U±?_‹ëõÅ¢ç×_L,jgN,¦ü ÄâÕøaÅbmíg‹ýý±H*9pk4ø‰ød.wNs$c—Ž»´ð+bÓôP›õ:wÖÏgx]fSí0š‰Bn¬HÕ:‚ìMoÑ0ÅûD6JÏe3m•Å\lÒ€?…² 2-¶E¢³9z Ç:›Òuò!ùíÂÒá¸"GÌsኀ¥Ã¾˜@ä23ç\¿ÛÅE^ä¶q®;·n·5,wû§Ï’ß"Æ#Ñ= ù-:î‡"ù-É Öt &É/7J~‹Aò¯ž! M¹ä+qÓÓ ù¯oÊ!ù¢ž˜ãîh^çµyÄ}Øå¬Ä]$žQÍ»e͉²*‡è¥TÇ|J4Ÿ– ÝIhÉU¿p´dÊpx+a­¡„RQT°ø‘'qÊâíjö™3ÔÍËæ@ÚŒXO®Ÿçú¡o®ë‡o×ØÂkdÏ’Ï£æh§­úøï_Á—Ž5.Π•¯ÍÖNŸ£{ËD÷^S¥uïÈKx÷ž7÷ uï­³ôî}b®«{9†Ûm—»zꪹžþþîlWš{98“º¯]ºb¦|ŽÎ2woÇ´œÝ{ì,c÷.9ˆú ¶ì„áà—!›–›=Úf°`ÒÖK)ª§¨žA÷ƽë´Ç¦é¶ëÐûõœI*€4ï W±7K×Þ•Õ96ðhÇM^žÆF¹ô§ÚqKƒ×w7¸™÷‰bK8RvÃûƒ°÷v÷Þ’y*òaÙ§Ú{«Šë¡7NfUÜÙîÃlGå!n•ô1zû¤\ÝoLX“/·s¡äµó†Q,éðlîmÀzµ&þ<Õ,É zÐw¹­‚ñ&3úü¯í¶øµ)o<äOum<úÀµSvÉd;ÇiÜ$T,—W±N·`+À|ﮟÚ´f”B1£ð£F-ÓñŽœÛìÓÖÌF˜y«L[?Ç«„ýWÉýã›k/UÙYÓÒ9V,†ÆÍp7m‰ÍjHÃ릹O Odëççuâ4–Œ¬Å¿aŸÜŒ_(xþX±îXPT쎷oÚP±Lµ•S˜‰Liº½÷¿0a’Wlß­bIªX¬·ñ]R±T,-*Ö/ Uˆ0éÝ} Lã4”ÔËJ+œ€)E¸—ó îå'qM•á#ú1÷¢I{’âÛ½R…³€îC> ôc·ÀþCš1ÄôÍéÒAûéòùç—Cм>œR৭S¥ß—·ðîjûð. —À†„Ànœèì`ÅØPx­ßK_å÷mfçÔ­ÁË…îvwP@A„×_¾IÀuq‚, 4mù;ÿ4Ú'±“ý•ªëxg@5Ó…?H,z¯œÀÝO(¥è©iƒ¿Ž”$šë³|Ó‘Žkcœ”6xÇÞa˱ÈðÇåüØûò1áQí‘Y’<É]mUw1ÉEŽÞu©æNåt¥ ¦ø¼)p +¿qq“¯á#e†(éà¼0f¾~‰ågù;„ µÞQtj¾%vF¨ðÝÚ:1að²²ÅPì˜}–Cgù¾E>c!+á íìó¹ösìxþúù¼ú«ÀÒák”e³–dy’y—)[ sSJqn +ófˆ ˜éñ)#M¢”f‰†=q£ç—§äù×&÷c“¼;Èú¡¢„õƒó€/õH&Yï$VE@Np;/³ÉXñä…±2JòÐÝ©p2L4(ÌœûÀ.éC»d[žzØ”Îõ¸Ž“r'%ˆ:³.ÒÒº¨ê¨Qü—ì¨Ñ>(y&羿¾â+¬ZÙߣneù9„ÏÖ\zž/딕ÿì*°3ªA%Ñ´!=&mö¥5Ìαõbéü;W Ë„SH+ãoc4ôÞÛbRÔ*#¥IÒ ìßéNòS1y’¼PNÚm€Ý‡`âʘücò ’üh9•¶E @@x#ÅQ°€̬><¿£Û‡Ð} +N÷~=?ðèhŸŠw]yK®ƒØ7T:©‚˜*¬Kw™êï3VÐâ8“ íoŒ:$Vì`QqÀÚÿ;Ù Xût{hîË¡ÇñËþñyŽŸèÑcC4‹_˜#š…b”O—#t.phú:ë=΀­ØÏ#.¶³|5”F÷Ÿ?ý¡KyþÞ0ÅC¶û}PjtµA£µ+}ï\Î4:#ô¯ þ‚FÃI[zU•b¿2êÖJÐèÒè®Ñ<¬èçAUÛjm‹ÃÜ…FÁS+úyPU¸ZEáàJï?P£oXQуªÎÕ):ÇÄ«æO{XÑR¤(Rµt!Ì.òXä$?’W„xZR*Jk˜IìK„ù˜°…'ÄiÄùÑFZÃìŽìþãC¨›Úþ,ìK¿ ÒóàAå\Êa¤Wš_Ï~ ?žGµÿI=Áø‰Dç‚« £µãµU¡3çÿm¥ÑîÀ¡Š.€õ“\› —«¾×üe˜ÚÉp¶O ¨ƒ{÷"×ÄÓŠ£²ð%¢wJDôÚ ª¿\ÝË?KÅ ¦mþ:M׃QY¾Pêõñh-|‡†J-¦R‹E©Å"˜Kã¦Ë ÔS²ºþ8Ú'ÜØY +H»f¿}ž S¸àB¦°÷ÍCx–Î{7äÊIšÏÚu´†­Å„e,ôâ:¿cä¦nËx;Ç™=•ŒóùYÖ¶ü Ð’iéZVÒzph©¿ì–Ò +W ¬§`;þie5™:œœÎ×q~Ý·î‰-JüËq¶B…é#¬åŽW¿³ë€Ñ"Vp>qdgÔFR¢ýàДi4þQ¡›¨ü×5¢BQ‘›¨îÿêDE.¢b7Q1¬t¢bQ©›¨âÃëD¥.¢27Q¬¨t¢2Q¹›¨îNЈÊ]D~7‘ü³:‘ßEp@>u¢€‹¨ÒMTɈ.Õ‰*]DÕn¢j¸¤U»ˆjÜD5p?îB¨ÆETë&ª…ó:Q­‹¨ÎMTö¬NTç" +º‰‚Œè(¨…˜ƒÑèþíÏh¤ð³‹ºÅ@ÝBÔÛ/Ш[¼Ôau˜¨ïÔ©Ã^êuQWéÔ^êNu'߯ҩ;½Ô]ê.¢~}¼FÝ奎¨£D}¿NõRw¨»‰zšNÝí¥Ž¨ãDý}:î¥î1Ps×áºÇK4P'‰ú:uÒK2P§ˆzŽNòR§ Ôi¢>A§N{©-µEÔ½çkÔ–—:c Îõ*:ã¥î3P÷ñýBºÏKíËóRûhÿ‰NíËóP¨ ˆú½ó4ê/u¡º¨ÿªSz©‹ ÔEDÝ Sy©‹ ÔÅDý3ºØK]j .%êþ +ºÔK]f .#ê'uê2/u¹ºœ¨ëÔå^j¿š{ºÏÖ©¥›;ÿØûFû„1g:8¦óú¶¾–•›ì…£Ö8–kþÇ÷Žfe4|ssÙ¶¹>«ã,²þ«p皢]9ßO±²cí,úéÓ—2ÇÇ¥tÞ槊I×úfò̹°a·ÂÉúùgæ†=Flý‘Ü(}ä4ÇxÅRDÅÊÀ ÜÚƈ֚ý¾öŸ¯µb ­b@KîäÕ@q­ÓÀü_œÆ¸|ìdI«^j|+yÌxWYŸ…8ï¢/@Ü5é ·^üˆ¯¼ô £ÊEŒ>–¡ aI¿û ç³½‹!òTl«:ÈGÈÇç{–)¬B´ÏÎ*»ŸµºçMö,œ”¬×ßu¸·?é8Üۿݸ·o6îí²¥‡{ÛØr¸·‹–îmSûàíÛSâÿOÛ³FYýˆ¦H%U«ñý  AyôJÚІz*´±¢É‘»p'y\sw*Ô`HMŒÔÔM+­±¾¢¢F«mj%Äg⣚ÚÚF«6Z[µ6¾ ^€ü»3ûþöÚ–Ö|ß};ûš™ÝqÍ̸UçÌY|´¿_ldÀ‘ +½‰·Öz†§§½WÜùÚ/_äë |MÈ×!ù:,_]2†€|Í”¯YòÕ•¯Ùò5W¾æÉ×|ùZ(_}òµX¾–Ê×|È×ZùZ'_åk‹|m“¯íòµC¾vÊ×.ùÚ#_ûäk¿|PÊýD¸_Pòuk»5çσ¿4¡ç¢¯9;úÈŸÄÖ|¼XùðÁÀðøgŽð/8M {æ/^¤øüv¾ûÛÓçy¿MÉßnw<6­Céþ Œƒ»ðtì.q¯S¿Ðº$¼©Vÿ…ÐàÑÔ0¼ ×càö§h>ÆwØnO»Ñ±i·Ö›È; ¯Û%¯´A¸L„ƒRÉô½œú˜`Jîn¼ff·‰¿çfÕ$4Á™¼ùv±Ènæº/ÙͲÓ}jˆK¿[Þ(õ žÄÝ £Q!pVìbø7ËlüBúO53a7 +/ŠèMôÍÂÓ¤¬V4?³NÆ*Ù;^µoôª¥Xø9 ‚«–|ã©{ÁJzÕÒJïUK?Ë…«–°c½‰ËæsÂWòñ,–ðâYx¢IØžNÃnç)ˆ–F­lã=¿`Dä¦-® +kÊL䟉^YXv>ÃÎü¯ê%0ÃÖLó]ÿ™•qó–Z–ëËôäo(ÄŠéÇÚA˜u¥Âì˾2bö»©Ág"J+†¯á`CÒõÆ7¨Ýñ•\lÁÁÔƒHïaH_w:Þ’€E•2ÄLYd"¦Ö‚°¡4ßDL­1X®¯¶›v{GìG¡Ì +aÅ!VqÇÂù³!‚‰‘1°vÔ™#ÕzÐVKõãHÆÇV8€âd|ê\‚° a+à%ˆ0úžêW­äžêw|ÏJcaØîüÕ"ÆéÔ&Ç0Kµa–v&sQ¢³~°¯W-0;›e! ˜U«óL²dyÉ‚åú²”Šš‡¤˜ja){çâ•x2E¯³¡ÛÉ{]>ù;=Ý×±žÍ/çm?˜>Ä„Ò“gƒìAöH¶`¢ø<‚®ÄÊH/LícÍþö|³$ׂ3°*/øŠ‰3׋3,×çzò7ôcÅý¬âeóðî8dŸ~uº|ñ4o›š0ÿ€Š‡ìlä â¿Â/ÿtÓ·çô§ûFÄzb)a˜$poã8æXQ‚5tÞYfÙ ýè3M e{1„åú²=ù†°búèÏzX~º·v2É{0í·3ŒÑä†qNWè?ËVHÂÑŠp +ìTÇâÀ[ÆL¬*ŸíÌ!|¶±˜…©ð {ž¦øÆ …™æ7zÿÝ<‹¹^,b¹¾\Oþ—¤tÿFˆ©‡pj@5ÃÚüRŽ·aD•ÀÖÓ‡`¶o’’GÎAw +LÏe½ËÄÞáφéWϳ ܵUd7| ’·ÿ8w1µ–õöò3Ìòó,ì»QÓMvËó²–ëËóäo¨£,ò²`·¯¡XDvÃÀ°6—“æ&6ÍÄYÛÜÈÚü,â6´Ð³Âþ &ÉÑP÷ ^ÿGŸlyç“gy;N&S$l VØföÚi¶<í:a+§p²RÚ5ž6 {ýé6ÂvxKkèDÂv²D‰¤/‘º“I]˜ÚÅtû\³ü| aaÇ°9×$l¾—°X®/ß“¿¡‡öuAØJÔHØSe›·œBÚÜ‘s,¶¹µùCÄ þlèÇÄ~NBÇôÒiiŽ® \rš·ŸDŠ!YŸ™jË3¨Óñ¶9Y)ƒÃŒŽÏçÚè˜ðБÖ0„tÄ N–’ºK'ÃlVb8yÝ3³Z蛸Ï2éXè¥#–ë+ôäop>%tü» ãm¨:!ñ0¬ÍO5)1x2ÆEÂì’ô™Øæ O€EBúT¡cÛT“Ž×Ïôö“LŽ@ƒ‘õ©NÇqSlyÜO5:¾v<§#+…¦K:ÞÎèxÐl³?µÔ‹7ñãa'›H]‰ ˆ“ a_}ä4“Ž>ËŠÊõù<ùò)‚Ž¯¡š1ŒtÄÀ°6ïNÚœ5§Bls!kó*ÄI!‹4äÁ­ oÞßâ“ñ/U +•ž8bÉSªShÁqb*Ä„RBg +äX§Bk«"H!| »ÏãXÒÛW¦áTˆ©µ¬·1ÏŒPl¡81\xªI¡bËTˆ*öä‡@Ýï +-ÈAƒÓ.ÔJÑJU'Û|inbíI#JÌN² 'gD èÁE± NÉÛ +u?bÉÓ®Sè§Çˆ9 Ú5 +¹óBjÓ¬­Âm­,N[‡ìí"RW÷'9' ’–XÉØe]=‡³•Ðkøà1°àaY=Ÿ™­Ä©Â„zŸÒ%Š>¨}Ð3ã”ZøüVæœbòI©—O°\_©RñËÓðB²µ‡¥ìÀ”žOm«çRûB!øo‹y<x¤Xg›nˇqq[Yx\eUs8AZfÃËás•‡žª…Õ‘At!'…Xˆê³ö­äH+Wê¼É¥+Ó‹9· ‚Ás‘[2™µö»' ©Ñx!~n÷ÿ‰œ¿ÆœY˜3K’}+L“v²`—…Ñu“JÄÜÞÄÏQcñn³Ù×£<Ó[ÈÂ4à·´çd“iB^¦Ár}!¥â[§âÝÑIk„Xð\W°ÆåÓ¼íâar[3Õh¹€îÌ™6pŒ£Ûš¯FDð´màQ—› +“ªÙá~"JºÏ¿˜Ÿ#µ%~8÷%El]¸§ÃcЈXð .]Û¦›øŒxñ‰åú"žüjÄ^µ;òÖ®GóÕФjÁC8X˜ÝëÇèŒùSž‹«ÝïLt_¤²`Õ[Õ'w Ë_«G½L¼Bš›h@aV—T"ÛúcýuI5`S÷±'€©ËÕLÝã³Fd¸\þv»)¤…¿a®å3½¿ÀXý¨^‡j °‚–:3ÄCåö%S[Õ=ÁfUï7©ÌKHÚÌíƒ8¬ð±e@†Öe ðUéÞþÒˆY6Áps³)Ý„Wa®å3½ÏnŠ‰›+n°‚–n° ˆ;ËÂÏ"n¨™²;¬äÛŽ±ca؃V(†¨me‘j‡¥|ùÙÑ°;zK o‰W‚Ô2;䈋¶»VmÈi'¦ŒF›îÃ"Y<ØlY¤Û‹lS‹|'\±5oD„Sí¦ Õƒ'Ý% +j! Cøosi.ü!s-ŸéúûD“b}VŠapÒÇŠ\ßȨ­b µ•ÅIõÉø—Ó²Fì9” ªbÆøŽ›˜FQíî"g6Jél\ àƒEZ…JwŸ¢œˆ^ÎÛˆÝ\,,*”sÇ1)ÊaáXyXá¤$†eaV—NQ¢®²8©­j W¨¤æDØÙ¦ x ¢‘å?úŒ´Æ‚M*\qÖ§M}؃½!;Wp—Ï®ãM®²rVÐ2”Š+Ú<\5`ÔæV| öùÐ#Gì9X Ó•+Ÿâ™öjC4©‰€a•ÞylŠrºôrþ€ØÍÇrðÁ‚žB9?ÎJQ‹ˆšÏéœ7job.E%"*©¤_ÆRe•¬<¸¢_pN:þ8-8éŽ>ÒîÄ/ŽñÆGíMôy×igîó}DZ&CtZ+€CÁV†ô0»º䶲h©ƒ²»{±çPB¢ +†È=.0 UÚýGAÈ T& ‘øÀ ¨XiÛÑ)Ê¡‘K»_åô !}X>Ôè¦uG¦(–rc‹r~ÒD‡b:ü¡„)v SJþ Õ^ô>0O»ì”äþ÷¯mR²ËJI¬N_[)É”zj`¡F[]À”!cîa#öÙJ‚’åǤ¦A;»¹„S૨M#ðÁBÙ}‹G¥('O/gŽ“R,÷Ëùõ)ÊÉ×(™¯Qr¦JÉ%tS}؈ʳñ,]…,,¬ ´)<‹ŽúˆøÆQô«cFìŠ ØÉÊ)–¸Ÿ¨0;'}N\yäˆo·”µã~O‰=vfâÇ1ZŽ2™©ÇÊLXAKO*f +y˜©‡MËØû7$»òÏÉ#ö,ll­Š½£³R×Q¨|€C,„Lb–DYé¦/§(§‘–“-ʹˉ`9øVNø°å´hÌÔ¢1S¡ÊL» ¥«&â’…gD|ÏÓÙ~;ù¹–g¿l±ßJD¬Nd[UŸvûÙÔÍz…éío¤~¤ÊKâ+G “$‚t²®LñteÀÞ~ÈÆñteÀÚ¬ eÀÓ•6ïSz.ô|GK-Ò³–Íû²?=ÂÚN2ïïÑ´Áó°—}øµõr¢>‘…,+‰Šóþ1ï³ü‡óþ‹áŠ“`ÀCÖÂA¬†Õ³Rô)¡ñhBãÑrÊ£^‚°¬¤k"P×'¨ëcùÏÍÄØ'cQ·ØC]ÖÂR¬ÆÖ3G¤èSH£nH£î/UêÞ@JHŒ›€Ó–aM¾Ú3†í„å'×L6 ;l%,VÐ2ìÁ[DÕzð0Ìfqì>ŒÍ×£IÆ£ù"r‚4²®<ú%³+Nšµ+ü8bû¡fWä‰Dµ+X\5b+¨¡…òè5‚G×#oµ â`x<ÚC­í$Sÿ^m]ùö²¿¶³^þ96t0@˜6YÉÀ£‚G;Xþ»¿<ÚaåQF‚NmX »°:| V—~XŠ>õh<Ú£ñhÊ£}‰K OÁy+écíþ»GEÌ°S—}l’IÝ +u±‚– u± †~JÝ›uo<Õ4¤.>†ïOO²¶“LÚ:uŸ„._øuõr/òþdA][Yl×YÉ™u‚º –ÿ÷‡`PÖ±¨;ä¡.k!†©mÅ œ ÕÍÈLÑ'gŸJ]úKR÷u•º_αk“x'i»“4gâˆ]*d*!Â)¿¸DO2)Ãœ‹ˆ°Ñ,¢Å.ÑøÉÿŸN4¥Å*Ñ°‚–^[ØôŒíàÑky0_äúî¹3ky¬fxˆ…á+“R³pȹ*𲑤ê›|oš-®p›§Ä6;†øíë¾`b¨ÍŠ!¬ ¥Íƒ¡66 c;èCàâwéÖƹyߨ½ß>d:| ²i{ZŠ¢ŠeßT>ËÓÒSl@”zšÁ + a3B,0šlÆѤ‰Íˆùˆ—ð„CÌZÚí˜ç7Cì=ØÄ|»}¶EÌ·{0ßÎf[Šòû…ûóð$ +1|`ÀJìÂ.ÇÚN-ˆ£¼}<éï[£I#¼Mš…C ª±ÞRmèþ||ŠŠ1òÚ–#Ûõ:ˆH‚Äýã•fø óò.þa<=åwbùÖ8š‰Û?MÚ³aü·:dOõÐP÷%J×®¥mܾ/iú¤ÅŒmÄŸ<À§·2ë³OèÔüÿRµq`Ÿ¶ûûÊ'I¶ûÛ'ÃSËÝß=gàîïøƒÅ…ØʘyRíÑPZ +É4˜ªÞ³5¡†Ï†[A%&’>m"9ëL2‘<Ï&’窺#…l'Û€Mé§PXµ;9ª¾†ýÞƒÍ67ÚG ¿Uæ² æl´/Sq6zF`#[¦Ê+âS8ÝìX›Æ쨊œK)rFrîËH!ÄØMŸÞ¢ñÂÀÖLõ¦z Èò=I•ižüIÏÙ&vîa ?ùþ`»7ñ`· Uټΰ8À­XÇŒ72,s/´Ì—‘8¸×¼vö)ôvíÊ!¿‘ã¶q&U]«rˆ´¸¦rˆ'G=XÅâÙµ™­¹êš€¥}ɤ=½PO9e|&®Õz­{T?¿/–p?¿MNÊKñ[ Õ«:¡êp°òk7ïM1I¼òéºåkNøP¯ð¼Ñ=èqç“I/¦{“ö&ŽÃá¤ÇõñVw¶–ªW B%“ö¥À`D$müèLÅØziW⥓£ÞÕ—{fŸ,;ñka.qL6ʲ²VÐ’ec#zk£·lzûáŠFå¢ÛLJ“£VÀ–îJ8‰ö¡ÖÑÏV%v¾Y +s‹.Ìla=Cgr¾ë’‘¤sÔ[y‡Rù&¬|ùâVÆë>æÌ12ÇCãG´ØBéãD¸.kE=¤•]ÊÕŒö¤@GŸ`‚‚>ÉÛThTÈLµñiÚ9ê“OÐ~n.¶xâ=ŽBúºÙ€+HÄ®ÅIã-žYÈÈ&¢¸ÌOïl£'ÈáoSÃVúÞº{7ˆˆxvÜ€¯ÞcÞc›]\¿½T\áȯ½é¨ `xtˆz„é“— +w˜S‚0¦EÀ´0˜Ó"a|Âæíc¶ã£Æ'mÞ|•üÚ0¤äˆnÁ{SÜQ.ufÃrÛ™ÇÓŽ=Óž0¦‘Á܈0&"`" fÂD¤3i&KY„­È”¹‘Ûa0ganGÂP¿q†%æüe„iùTbIÀøÌ#ˆ% “)`2Ìï&SÂÐó:l‡¢¹a µGÀ´0˜„i‘0>ãc0~Ö “'`òÌ"„É“0‘Ý»ì¨ìÑ1Î@oz‚Þ¬rÑÅpÑJâÉ:vèã£ó;y}ÊõÙMaÄúVdà-T™.b +º¼ã^ ÄoÉÎ-¡—ø®á^7O¿›ÝIïí Øc ‹tÛ)È ´0Bçé õ$† = 䤔‚œ‡ ] ¤BYDAfM@¯w\ ˵Fasfa½{Ê—×á4ûèï!<Øm¿¡ùƼž~ +…Íé—.›b:B/RõêãØe2&Sñ‡PûKw±$UWó^6Ž9t)KÎ÷ ÉdÕÐÃoÀ¥Ä£7àŠ[¿½a‹’_(oT­#4%Öl-Ê]oâíã÷ŽxBtó[_¢¬†>Ü•´‡÷ìÞ ¦ÈKÐb…©oÉ3bÚ¨1ZnÝ•Lq¿3V]§V½€Õ0:üºü¶Ä³o'14NýÆ6'>Izw1(xÈqüüAA;‡ƒ ÖŽf +¿Q{=QÁÕˆ$ûXìš4’¡úâ¾ç#Ð, "Ë„’j̸µzèä†Qæå“Z¼!9íøP›ÇvþM%7:Ú§Ç0L;nï¨7H +„%¡÷Á÷'¶þ3‰‘Øê7öº*ºútõ t p8.5á7>NjÁ˜HöƒhuW}\]÷!à +âý |Tâý`ŸH)Ç(ËÚ—>IªbΈ_¾‘.NÐNʦeuE"Šl'‹U×&¤`©<DìlKƒô!eú-4½Ó…ü“éõ4½Óë„ð“ée4®”Ô+t| +òå4Î 2òäþÄÞŠN”y]c +¼\P©aÈôƒ€7o»œ0Ã5o©Ìð…Þ‚mÀ N8Úà +lp¤Áç‚6lk.ØÆ gløÉP5b~gß÷qÔtZâm$݈,±µÆ:\Šx$T¦Á3J¥óš_&½ÜùœB©Ezúoiú6Rçé ×S&‰Œ*“‰Rò4-8X…⣠ç¤)ƒÆpè€HÞÎHÞ1&ÉíJ*ò´“¯s.?"¥XèNhxÓà„­ [­œpÖå„­Í['tŽÍ MïKQðû©¢€4žqô¢ÿ¹Zû¹ÃDùÝ›6îé7¾™‚;$Hí›)¸C‚¬x3wHÓßüŸslj[¹cááûáŽÕƒÿ=î8öýÏÆkÞ“Üqß»cpÇÿ¶pÇg/òÐ6?ÈôúAÛü ÓËmóƒL?g0Åü AÜÁÿíüù¡g~È×æ‡ê×ÿ{óÃIï}¶ù!úŽe~xþ_–ùá³Ò¸G xÇë6Ëô›^·ÑX¦_þºÆ2½äõ4– _ÿßÒø´!C›_ýïÑøÿÞùl4¾&a¡ñ;ïþ×t€:æ—^µIy™þЫ)¤¼¹öÕR^‚T¿šBÊK¢WÿçRþ¬÷­R~úÑû‘ò›^ùïIù3ŸMÊ7üSJù§ÿ1†”n§EÊ£7àvÜ x£yµfc×RêG†²/’¡]CÒF êø È:!A±Ÿ´à…”gc¸-ìþ×’,Ž ®§1PM3ü-l“¡Œr•PFŒ»ÖgKò× ¶Àm^QW˜Ö/£“e³B ¤Ôœm2‘Zц9³Õš ƒÕoìpjO“_:e!]@ÿ]“6ˆB…§PDá)„ÎCžb†¤+t$Å_æH:y›µ«‡T݃U³/}²ê~ ø‚‚~^u«ºHT]U¯„ªW²ª¯Ò«NðªÉnSÅÒdx{ù‚‚ÁûðµzîGxîwWˬ ™uH~e!sȈlúCá)6õá…έÀiÏ6=UØô—Ä+/[ì$ŠiEp-ÞÜ¿+zwâØFà–L”lÈÃ>ɯÅòUröÉÄÙ£ŠÍ/_Ê¿¿±sçxqG›Ÿy€‚üA²´e¹†‚”!H¦¶  $A2´eYJAŽ¯ÆÞ)û³û“‚[ÀZµ¥ãìéf§å!$ߪjtiÓÓ‹»Æ±ÝM<³3©XÀ”pcÝ·¡Í)Ñõz’Eîªß¾#í]e‚æùaôúÔÑKý^N²°Z|ìÁ;ý[XF¹¾ND¬Ÿ?¢Æ9㆟§õ .ÍáË»ù²Îno +ü•oz‰B6™…P çÄ,!7<Ä£±;µJ¢d¨ßØ 6¢…£Š¨S±uŠ¹ ‹Ã  +œN~3)¨Ñ¿lRh—“B‡eRˆ &•¦öC¥¢½üþ†9+ôÀÌYù£)ÌY—½‘ñÝòeS½šL‡j¡|òoI•~ýͤß~ïuH)6©7ñ"¦øÌÀ|cMnùf`rëNXY¸³ýß䳎¬[ ‚w~€*M.ù•²ž‚<Ÿ¦‰ŸäÛäî49}jî4†¥zé@Òn©Nüû-î™Q,-èW½„žÇüÜ”´R°äªƒ½[–µ ñ þEçÿ‰ï ƒºƒh2½‹m)×1Ý©‘ña ›ÈÚ€ ·´æ£Xêa…©©ý ‹dE&X‘J@;feê¾Rî¥(zù‹Iõ,©<Ìb3J…d@Äõ¼W“Ö ®œ§Ú$ˆk=€É¥V˜sÀò?°í¢DÏ—ö‚Sš¸¼dsžÂú5õ‚[Z½U¼uò«2$lb÷·÷ŽêNHÆðÊ`½ÛOÇùƒ`¶~6Yºà½ ÞÚ;XMôô^˜«,Rí6±}Ó¥õ@É=<rüĤ'àýxïƒwúe¼OÞr)jœ¬žó=Ga[ŸÛ'„9‹þ—¤¹e%6¨Ø¾P¶ŒO«xî|ü×ä~#ÓÊ2r$Ô,w_b#Õ$dÜÜÔŒ{ã ÉQtgD‡@t¼¡çcús`ÛMõ 1E GeØÓÉ›{Y0Éë®wß 7èPl¤/›3Å M*ÊV#“b&u÷ª÷1Úá±ê£Q£reEN¸ÿ÷¦ºÿ· ãÃnÑcr·ˆ*Å’©¶rþ{‚‡„,Ž±ÀؼÓÃսɛçïÕ<Ê6ã`ç¡6w‹ñb!/x:B%¿ +j§GãYèPŠÛ—|ËòVéɪøƒ4Ê=«º‹†R0q:ÎöF†6^!ìǵ¾…jc÷û½BnH8eðí¢ÛÿjÛ.ª¯´°i#aÖx;“[½2Õˆ²pWâOíÅ †²0TqÚ 8»¿÷&ÚwïÅÃõÛ¡‡ñÂLƒèã0¢æìMüù/@î±óUé¦Ï] !*6Т©/ˆ>ÇË’w íNt…y,;R×ïûŒötø|8sŠc¨!bjÉÄi 4ŒØ𓜥,Ö°îoâJsÏ :9³¤«°6ëwÿU}ò™÷‰ä¢| yh@Ê4²°IrN­SýMö£Ìn¡¢‡iúЂmÏ$…ë +QW…$1Ê¿ú{sD2GàÎnŒ_žÝ£ñËí/éü²m÷ˆâùÉ„Ø#‹ÏÞ§ÝgÊ&pÖGTZ‹GMßà—€Æ¬Õ8¿sÇÄKtmÛ(_ wÞ›Xö¢f<ÚçQü5gáûžIÚ±vûs:Öê·· ~päŠ?¡ó „©0u æ„©³»]lWMšÂæ$&ÿ“dø>áÙÄÛäí·ùç±núÜ1^HûË^HJ&ÃkÍbA'Ÿ¡ »Â%½ÒÔ­†ÃäótobÂ5ÂbÐ'â“‹I™ÌïOPCõææ‚ÍD<®m*¸šÌx,nü Ρu4ž{A ¡uðóºæ‚«©nRpÝ‚‚¶«X¡ HÛÚ¼b+^±…žMr ä  C2N93ëäù¨ˆ@¶§ž‡9®±Ú…Påûq’ï‡ùÿEègó&uÀüI’`4Š[Þ8 œ}lzÎ>öÂѺÏe.0V@½p¾ß&í“QÖäk¦ä2ÚihÜ2÷qÂ-'dÈÐ^ÕÐ @2)ÈÈÁíM–íÊ×l1ŽÓë§O1Žä±Ëì +å¹:Ëýx“pc‡ï|lØÃÓš)Ùñû¿@ÕãgèðŒ;8ÇÀzI‹ÅRÄ°aQŽ|!ÜpšP²Ä(ä'>P+É’% ÅN†¦·M›â +vU9Íf¹·oÊ Þ#m¨@‰®¶È®žôûdJŠk]“ŸÓ}¡M]‹u5>Ÿ.KD7ùÒ^À%‰Ì~Øðeg…†šQ§„ÈTÔ3…˸¦¦ihx¨EÑÒôpheÛ÷PaÖ)ÚÅ•½ß> +í2k%$Ûü>Ûqàý6© +¦CiÙ æìe¶„ñbâíçuLؘâñçM¦ ­Â¨lðF£²½þ ;CjQÙ¦~a¬¨lÈX+Ü"Î#ÿƒPvgúéâùiÕ€gèºOXtAª*&fýð$g=ý(®—.lÚŸÒÈ5½N]ÓË{69j±Ô¶ và[µ ‹ÿSOQí<ôe±bA݌ԛx Qš“lžù{ÀÜä_Þý¶ ¡n¤éM|·Qž,³•ûâsf¹Y²\"®u-ÞÈÅR;dÝOyvëÍg(&@ˆÇìø=Ëò…ǧ^Áë'õé¼Î÷EáË»gíx™f}þ±¤â˜Ì³&zͬù2«$6S( Ü4:ñ~1E-[UÔX̸³iol㨟)¢½K¦eâ3s—Ñ>S4-£wÂ4ºQ³´éÓÅ]i¶Í¤= +ˆwHhÛD?|.i9¨¾ú‡æ”÷ÌÖšÉÑ'‰Ý•À.B@Oi¹cÌ" •FÀA¨¿$Nø]R(hÀL¼Ô†g€µrã0!Ž/Ðü“dâœñÔþåÜIÏì_Î>½9÷קu9·é ªÊ\$ÎHô£­"VÐr¥ Ó Å*_åk‹|m“¯Š: ê ÷è q-䪇ù~óDÁ³¸ÿÜ‘4L +¦µ¦î7„§ü¼gM#‡%ÒÁå½É1Í 8½¯nDaM"óƒÕýÖÃߘïÌ7 [h¾úº¦KÐúÖÏàŽD¸~ ÇX{7Xièø˜†ë@Ærf©Ò¹ê§RlÎ ÉiÃÓ¹¯`¾a½sþÇÍÎ kãÆij׌‰DÔÎ8Ör„¤Ø»Çpå^A¯­é=}þ›¤f¶ávšba§é› ÛÿÈ–ŽÒ8ÁÞS¤Øxð¾ÞCð{Oì=ï¨3JAÏTÆž +´ôáµVSè‒†áþ{O¢¤5YU1¨XúóŠ6=ò–N0[ʧG]*Љ¯{a©ˆÒkªä¶ø'X¡¶kªn4X¤Â™˜ÅvÜgK©ÜGñ`ßcª9‚÷-»Çì[HëßwzÌ]p¾× òRÛ˜aø? ŸÀÇ¡8pã®…>f?J´¬.Õá£ñóD¢OËw˜œÕ(9 öcNß¡ŸÞa»Ý]¢µ¥OšK$Kkï~Ô<¼ N'{yv(¼¯Ûld‡l$¸ÇméÖ4G”ãAK›zðÖhSš®î¿ôTRqìM¬xTjpì~Sôð¨Ù㲯âÈòÆ-ća#Œ_Ù~êï` ’§Ã¶>†°âˆñOðýGÂ_Ê÷…DÁÂy= M=hê€Ä8°{´Þ’õÇv M¸Œ¶«\Ï¡Jyflÿ~b#ŒÆ¡õºÔv‰÷c¬O˜'5™ªQ'TàªÆoÇ+Ç5OxøÃR n÷ýîÇã¡ÃÆ„-íÚìÓ›xm{Ò²yá297ñ‘Ç(óÚ×q`gxöUÙügÔ©M½‰ð¯“¦™Ågbòã|y¨\ìpׯpy8ÿ²QÅRìݨ|`‡¶Q)Wº@á¨Ø,PÌÐÁßñClûÛ2@½õ—^8˜‰Ô2Žl~ ©Ñ<ý®¶ôÀ^îÐ+&æóLê'AcË^ñ½uX—-N½?L†uûå…—"ÊŒëEÛ3ªÄ@ÉNÄaú„ÃÔôá}Þ…No"´^]ð¨›í,v»¶ÿÞ›èßž€½ðU~Ä-ùiŠ¦Ú›8ó5m„³Æ°ó…à (Ž"cXI/ן·]çzæl7vËß’¢§þ½Ì¦èEJ×Û] ¼†µ jRúȇq_ò)è9æ{‡PÇjˆg2Š‹.Ó./¤ÅÓ÷$GwnHSÜ + )&Ù\™•¸5Ê ÷S3y#u®Ÿ¼yzș3‹4 󳮊—yËΩöbÊ‘ÍУHªvùžÞ‚«UOG͘ßÏŒ9†«^îôQW×o¼Ú‰‡­9YN2¨+)5ÁCÎ?? ¼]†pË]µÄ÷%€…O¦,ÌÜ~ÕÛqò™úuò¡ƒÛNÐM{2³mlw¤ïz–âAeœlØÎÎ04¢0QÖå!Í/OqÂ6ît' ã&ñ›Uø1iŒ¨½‰žû舭¿ÖZô +ù^k<¥¹œ©ê„ï½à‚ºg¥)Ó6HʪîPÐÙÛ°AºœvòÍflõ+ªP{—à8ùÑÿ<ùÁø¢SŒn“!:- qbíàè ´Ø"de‹N [ìè†DÎÊnÛýÿ¶˜ùÅTl8DïD¸‡<™ ž^À!Àປ¶gTÿ|lѳš³Å¿îô²Å»_›-î¼çÂ/Þ{àl1Ne‹¦_ëlñÛ_ý‡l‘ñëÿŒ-:î‹-~ö°ÅᇌÉ?ðYÙâO-lѯ8§8 9òÖ Îøã„3^ÑO°Ô„W@Ú\fC£¶){ãÝ×øUãÔ% ›‰˜­®ðÔ;˜´3kœ¢k3m¹çºmIÅ¿0®ô™¶žäAÞžVý¡{¹>óŒýƒkç"9g›XdqíoÜoxhÃ"‹þ|·ˆe‡õ”X™ß&nžzáWœåEi{:ÍҺ̅¸Ü¬¾énÁùB ôç7êÔ +ç7Z8ÿPÐÑŠE‚óó¬œßháü{ï§9ç+šyûÀùGg¤à|„Ý÷™H€î Þ§vQ6é|¨ä÷Lnx}½¾Ì½»FU_fÓe>[?=ÓÛ0/Õ91JŒ’ Ç+G˜zwO·ÅÀÍ)ÿ«ƒ¢} }Ž’7Æ)a*¬¼òCó§±ÝR¤LCéê44®“FQÜlOq}²¸lۨ䕘3~?S¿È¯¶1(‹0Çæaê1O><• ½´×ax~Bªáɱ\¼Í¼+‘wø«ÛŒ3†ƒAÊVâù8H8H‹Å åƒêG£êàKYêô™¾óšO+7ˆdŠáyèÍÜÐqéF÷D?7Lýã~v¨9Þ®=ô8pû„i{áÆÑv1³9ú[zCŸ¾â=ù>Õ&Ý›ø6®ÜcG8 äÜBVô¡¹ï¼`‡„)ëÓûyæ‡ïÜ•ë÷Ê÷sïÓœ…†ù÷¯ÜÉ—„ê7¡–IÜ«Û»?z‡ÊE<¾›4ôNèýaç„ÞÞ{tôîî4ÐËOÃ=³©{:=øþî½ÌËœœHÃ¥¯n“ïC÷ØÑ;pGJô^|½›ÞC›\Ž¦Ú þÃsXÚõm}ÚIA¤‰¿ STÆxy”¶ïl8+ì½3é9Ó›ø÷jï‰nôi˜ ïú¥÷†Z~¨¤]—@“a< «Ú 8V 5ÒFÚ )ÆEhýiêÒÜ·ªåÊ&îiç—}Õo ‹Œ÷«Éý> NòÔûg{×ßœLuUí~mrÊv…©mràzµ%™iªZ2´Õ'ÚÁ ¹rŸkjüÚ”À÷< n7ö<-80\®mO¦pf@Ó¡b`¹á&ýÊ0¤ûÎñºQËKŠSô1ŠyºïN¼ÒTûôÅQ¡T®Æ>?íY3‰¡vÓÏÈPóç»üN{r? $èdwž›ßºÛܪCEã‹êæÜOïH.˾<›B•wðe‘X’ýìVãú8Êa¬Y¨g×ÞªéÙüö€îFÑÎÛïJZ7µv~p»é©»ŒÚ<ìCÀN¥‘ŸÜb6²S6,Œ¼Eº­*·t‹F¦ÝenbZY„u+çt–Q)ÐåiäIد4Òçid¿l$œ­™u‹vSkä@wþ*ÞÈ•(pµ½UËÞöm·ñ©HÔþâ/ÍÚMöÂTlä¥Y6ò&árHì‡ßÉç?Ô!ˆ$øçÜ„“ž¾[·ñ¦¤<)@gD¯oߎ°2Þe‡´Gÿ6ùþ#:Bê7ã +ŸŽ½]š¹•Þ¾u³ÖÛ§-î<‡¯Òĸ<ø2.9ˆú/RÜ/p³ê“gHLvÙµù™îÿCGdJ/¤ðÝû}2 Þ„ÙšÓýÔu gÇ溼452Û+5 KS99 +‰nLÝZ“™# 8s„„¿†æ ⌚‡ˆzÁ¯ßä)º{Ä ¨˜Í}¤Þ+à}¼×‚ûÈpùUš2{´óLpº¶õA6ÿ#/­ÙšôlÊÁšÏC‘”^ÿy¿¤8ˆÀœ ]ˆ§¼£˜{NãnWžÇy&) +¯Á¢þus’üeWÔò³0ËÙY˜åEËÅÁàúíÀþÛwT¿¦ôðVñ1K~ÑV÷»þèzÿg”ö õÛéß´É›ïG| IÔ ³×î­B‡k»)ÉÀvw‰¯WàWµÚ¼eXF‡}8M)¾v½G= ÓÍXmžx(ô§‹ÇCÞ +pœÊ;C¡•²ç~58kobÒÏ’2.¯º»ï;£"Ø«­uk·šøe`~:Y@XôµíZŒS§Æm…`®‰¯ÞÄz\mïåkС'ŒÊÆFu‰FqT¼q£† +à•Å;pÂM¹²’ën ´?nϘ(TŒ¡^ëŽ\Ú.x&@z.ðQîÕ¡‡ñh=0ÓƒËuS mb6 Õ‚CëUþÞ2@”j4äïMi<˜ñ æÐà +/Ü+Vå…²=iÐÚífø‹(á=sßÏ¢Åv`AÅj0W2ÿ¯ÀÝüŠ šCú‰úÿÿ4)5‡Ÿ+–;ô¤ßÿ/WF…ez™¥òõè­`ê¸Ák•8«8=²È«u üÍ壞`«ΔG5åKÛXŽá&ØÞDÍDåÁ{¼/>ÊØ#”–ö½œ¥òKeèÈFÿ‚‚’?1©ÞÂ{¼Ó/ à}ò–q¨o³æáeU˜ïV +Ûzë1í"m?iIzb­2=$ýÂ÷\s ñZ¬y—j!‹” ˜èüØ}«ß=Œ”:KÕnRAji¥êg›#²Ô¹×$ÕK¡ü‰¶G±óVæÆÝ"B„¶0êÜuBÜk‘˜\cñdyÌØ¿G4Ô°¯,,>xœW|P|^ w?a|€øåð¾Þ‹&Iè,)äËJÁ “ S)PÊ™aüĤ¼Ã{ÞÀ !`†-È ¬¡hUÃ|mÀ m{ÄêQ›øQÒ€–­:Ó‹ÞqhnŒlŽfgÄ5@k†ºŠƒ²·^G³˜zH•Ö­B„§¿·Óu<15J墕‹†V×/Êß +åC±\_¤ˆ¥úb¦@k&à @ÛA¾R¾\ƒ ÐCt„¤òΠ_™ Œo¼:©9îÇÚbiçdÆ—]‚/»ËÖŠÓ™àËôÁ„Ëðò»ˆ‹5 no"ß7ê ¥«Ÿã1o‡XŽo7P,U«T"ð÷°ç’=‡{Ö +ì  ÛΔGÀOLªƒ÷¼o†÷:`Êͪ„bÍï0ßuÀ”×íG¥¯\êvÏ©³kWÒó¶ëxó†äY¨NõÊ•Ö>õ(û`XeÖ'Ô + åÛk¹R´RÑdÓ:¨Ør°Ô_•Tï„9ì혰PÞ Æ(Ëxãÿ$:fâ–&´‹ì¡†EôàôßüÓ5ccK³ÔèÂ,@o««Æ Æþÿ˜öß…þ»²ÿXª“—­T\+1~vûßóì1X ;h¯hŠ!ý°=ì'ƒVÖÜÒÜpõq>¿¹•þhj)Äéþ±¸Ž~¿¹Ž&‘É:Ò‚šØdô‰èÜs`—³éMŒˆÃý œ)'û—4 +Ñ:éz›ZØ…NmÞ²´‹z“7%• ”cÿ‰ø¸b‘uölFÅØW4šê$~Iã¾R;¥zؘú‚šŒë€ç½g‡m:÷xoP" ×ozÎý7×ù OýDàoI +À^øʈТ!ijñ¥¥¸€äµk´ Hx»˜÷v'[)ü† =c‘DOÉ;”a¦ÃпÃñ#Yj÷ßϬ#Êñük’}½®.©Æí>£}¿•» ”vt°vÌÆvtÈEžw©uÈ5Ö… ¶òyûGÚÊGX +Jñª¶(I/Lìu@¾ +©þ ü˜¯CòuX¾:ò(‹¼Ô㑽2JÞ^å¨J[b—s×&òý²þÍx¸D mnhTHu$ÖØ' šªÌˆ¶óo8SháÈU)f;ÿ†YrUÆÛ–<).½çßšq_wŸÒæÞDvSRUêøõ"¢oÜÊã \žq¹=ÿÖhžågø ‚²Û)çß®ÁS¹R°kNueIó–bã²µsSšÕËKxç¾Ùhv®Të¿Öä¤FóZÖ*æºsE¾‰Ê¦¢¼XºpýUIïÙH”[j¥ôôtá’«ÔSü Wš]¨ÓºP˺PŠpµÒŽù­¿¹Þëå"\(²ð“7· ´‹Ðªˆ—t©w͡ч§¿ûºëÊaºvã +í¦µG=UŽóy‹zmÝTó壼ÞpÉB$Ð^hòNtjè“£»ßC9ªÛtw +Êýøjó(¹Œo–ñÁøjcrÌK;,ľ³1™j›kË°Ô²<Äþ^£ºsĉ}cƒIlvj‰›oœEô>òžƒ Ì{>èê¦;!ð±©Ù¼Ö;w\@éÜsW&SùÞ’%÷O<»îJÕ«†w®{³Ù9Wë÷ɹ~³yt™uAYæX(qâ•ê¶¯t©§ÒÜQ‹è†ÎS;e8•e‰EtßûÔ~2Šw„&º/ûa2UÜÂ-ÅÒ ÇƒÐs~¨lÄ‹¾UÖ{¤›Ö7î´XPo^ÓÍ §Ö›Î’\îQ|ä +|\€ú<.̶°õYÈÖÒŸ6¨Ž3¼¥_a¶4b£8œôˆZ_k4WQ–ÉÙ IÏ"îHkÐ\ð‰º»¬-•_ÊK›¹oˆèÀ8³Ô ËZO7%Å©5î«òÜ&ÍW ÃÃ&–&^²Yxšðj›7™ÕvšH+èê><È1v÷•æºË·»êM¯’‚>Ëà¡žû”ðKæ– XOn¯î¼Ý¬3Û=(ÑWÕÝ|ƒ)?¯ÓRXÿ„›È„Tn"ÿhÔÝD‚WJ7ePÿ.C[ñ!¼BÞØ`ó Y°ïEª°©bÚ@QS`Ú`á–œ·w¸NÑ–é;¨‰eå´þ"’˜(jŠM*jÚ0(|ïåòÅM£K›v>ºwüÒ¦—æü5ñ¥0)¯á_±c&Ÿ˜ï5½SÔ´kIÓèâÑ#^-¬<­ð¬wãï6Ó›S›+¦e5¦e‘7·¨96-»¨yôÜÂú'òŸ|"ÿ/o!õdo;ÞiÎ8g¬±pe0 +—Ç'+ÏÉsfÇ£5³£!MpvEu™¿"èDƒåî”Eî·V9Ë üÞ­ +Qר W¹þ²²`4êƪÝUþ²5ñˆë¯ +¸5Áh¬º&èF×GcÁJ·<\ŒÎr&b½¾Š ?tkâUn,tý‘HE¸Ì W“Âx©Ùñh¸jµ;#TÏ8ÅY cUç¿×βp –#Áª@°ª,Œ:³×úkf“²iÖÌ–}„ßÎ[I۱ؖ…‚xE0à^Z½Ê GݲxMM°*V±Þù×Тý¼ Ñ*$ªŽÍí_çÇÜòêS\ç’ÆcÁ(t?V³Þõ¯ö‡«fA=UÕ¤Ÿ5n¸*óW•ÝêrW´K¯•´»ŠT;EÅicÙ7\Ž»!ÿÚ [¯ˆ…#¤ áª@õº¨[Mú?Ë)¨©©®ÁþWT¯V»îL¿0gzeÎô€;½0gú²œé8³ˆsA'E;y9óÝ郡êÊàìX0xi08;RS}i°,•ÅÍŽÖ”Í^F;·Ö_áŸUæÐœ$ß|·"\E^óÝxU™?¾:sƒ´I´P7{zô4’vŠÂdÎì`¬L–;ëÒhu•ãùÍ@Áµ³g:´9eôI¨B•Á@Ø/U1úˆUF胒¦ä„™)„!fRFˆÆN-¯ŽW”Úhô{æìY±P¼rU•?\•ßÊü„È¿â[eõ÷ÃþÙå„Ë«kgÏœ–û qfŸ#¡þÜòrŠ<Ì&à Ykü³Ëô02Ù(]^㆜S]‘8Sö‚¼æä0fç/9UÕëœj2T* —’¯„¡×å”UWÒŸQò;\_í|ôœ 2¢É *œ £º¦z½S]_U欪X8r'w* 6cNåñh°Æ)«©®ŠùW9e§¦Ò‰UÇËBNE•Y£¡xŒ0n•Sª©®Ž9çP§Ã- ŒäY³f!þ¾V]QQ½ÎLv È  0ß™8QŒf ["¤ÛþÕ˜ŽSúwÖX&ã:àúWU“Å-®ulsQ£¶ÀYLj¬EQ"Ä¢åa"™¦W„?ϸwÜlßÒ%‹¦Wqò ý4ŸH·Š mi¸ŠŒ·pÀ9FûA²F…p–òˆFûJØ,äsWÉîXUÚ¢òÇ çܪä™·XbŠ³ŠR+T¯©XïÈ·õκ`p yTb‡Èól ²!‚UþU$³Sä'­Y¥¦»U´hˆôŸ€ ©º"¤´óW Qó×Ä õÎùˆ°£ …ôf‰ÞBGR4—•ÒaÔ&[ÓIÍ•tæƒÏdh“ž´”OÒh•híŠï±pÐ äòú £¹ÿzÞÚ”ðbõF‰¶~¸b¬Æ®Ó!t.àÉîŒéÑ.íÀjÒ-øE”†Ú²Šx 8‹ +pÕP5}…úr˜êIW þš@™VafÔ-¯©®t#5ÁµáêxTÎl¤—² ÙÚ2¹9þŠtq ûâ5¸~EÔâl'&áã‘A=¡} \ÎU^úŹ€´<$šÉf>˜fIåa—ÎÌ€¸œœªxe°&\–&sXél)emP@ä0ìlåð÷ÚëEÐwö,l–]ŒÅkªè,X…ªUJƒ‘Wˆ¾¿NvîÿZÚRõm°Ì¥:ªd ')$ƃ*_¯ sÑ +ÑS2ÉË5éÿ2m¸2^ÉÖQ—t‡¬;Hn:™³ÅFEpm°Â‰Wå09?XY Íã™äôáÐñåÐÍ­ ’Fý HG^,a8Ð×Ï>ea¼DÒÃrš™ ·5X“^4GP`1E…æßsˆ¾]QEh]_¹ªš¬ƒT¢ËåÄL®cD!9(ëE Í´âøwÆm6€ÍRG)¥ÌP‹™áð_%?‘\\Zˆ‘* Qƒ©³.g<¢,*…9ÑH°,L5$„i>xql3AE:͉ÇÃøB°NtPgά\‡,sÖkè +†Šˆ¨PŠœh,PR—m¤¿ ‹ß³ýsèH¾æàp$¯,ñ…,•ö¢ñ¸<³®{‚µˆJ;Ëʧ„¬Næœ^‚ϯ°g^‰»p‘ ¯g•à:F°‰"Ëè¿0-ÑVžM½šÕÁÑqkba*JX³ˆø'kFU{ש’ì@.TŸœ`Y¨Ú1c"׉&H{®Š‘6Ç#1 $ï7]o‘±1…årH6"¬@ [GÖ2/9ÉÌd,ŠXvB²Š`0âÎNTäÙÚp!œ§ç]¦È2,U^w"¬ȃuÁÈÆ]Óù)Ÿ}ýügŸê`E5éx yIÅF˜ôÓ¥‹I–’.]ºt5¹€âñJ´a²®v§N C½äA ‰™ý-ؤÕ5ñU¼vº¸Z'dŸ¨ÁáXÌ¡à$E÷Œ.r½³ÿvÆYCËÍöä %c¡´L¾Ø"B€zï…:/•Óþú]‚m¢ˆú+Ü`eœˆ ÒŒjj¢!òK›¢Ùox¯iÍteCWb¥æ)Ê0Œ8ó':µåeÁy9ruY¸ÊŸµôÍ]S]­®ÒåÝ~øzé<ò,jJ„?‰Ø +Ö†cdÑŸ`:WC„Ê ¬Qg•r°!3Rù¨Mdø9àÄjâA§Ü_ 2ÓR ¡Z¸,X"+-F&‡¿•ðÕ’øÀVQâ7®­ÄO¶â¿a6=LaQþbEá,ßY!øJ¨ô×–ÐùÐ!/Á™ŒJgq$BðTU^36¥»X‘žs/öEc06…,TAú3Í“-ÖH-†eÀ::36iI'jÔ0¤£Â¿š„³DAúw‡)NcE%‘j"úÔu´,‡Yœ)©¢$ÌèNu¦Òÿ<ð¬ËþQâÉo’ľ¬¨´#À*ü˜ÙÄU ŠWiEEÅÍ!r’¶ï›a”ttð1ùL†D\ÌÂ5ºEÇ?ϼF«aMXæ&*:P’ÕJˆsN é(Q]´)Îœé:.ù“ãZÚ(çŸ)”Ì– ó|^š9›èV3Ùÿ¼Æ‡Z•Éã”`$7§‚4_‰$ +VFbëEš¡Óø—&Qs.d».ù + , t7Ž ¸3 Ì „Rf Õê‚–b1!àYïP…Ðñ ÿZR •#€==PMˆFÀ¤¬ªŽ¯¡:9Åùšn¹s;ÑLgÍ)§º)N1«ÔÒæS£HŒ,iQýè«‹5ÁH)“êERý¡fR}E¾88ÕCã••þšð÷é4L${¡rØX6VžbÜÙƼBn¸uU´ÜrÖ~Ã:E“ˆºDZ¾ìlç\P¸¹U:*PŽæHijˆ«<¡fj‡py$XC¸F³Ç°}{þYgœNTÕãF8Btú7k˜áéH¯n)]²’É›>?o}gÎsáCñŽIý–Ä@8±^:[lk|æúæäΛûùòÍ›7ÆþRcŠïžmýbÏ)ß=;å~U 4¥„Í´dÚ)ᘰ¥¯ÖÒ÷_Î%d¢"kŒŠØ{ÿLÏO,d¡#¢$E­ûͯÕNdø™ó#Ôõ òGiÿÆ(ŽâM'’qÌü¤)„íâe±ÏDßríô+e;»«çØÓ+ýT !$Ó”&#}µ™_é4SBÖƒÞòʨ1«„ˆ’¨½>2É•Q •ôœH ’êòL%Â~A@&Ö&G=ùi[øB™)~ÕUtAÈ˧®DÓ =ý±¦òüdº)!Ó £¥·ý<ÐÒÖ?d)œ×JÈ$P#Ä ïå7•íáà¢>+žú˜Và錙Ž‹W LK·àÒS–®¥[J×ÒǦµ÷¨,`¦Sv+]0„.°(b„Ò¤À¨é¶" jÏ”ÓKP›öŽ¢MŒ•ŽËY~,D9$eº…Ÿ`å)€1S´B"Ô +o–·ŽhšÁ0 ÐQªÊ\%]Ôv€¢ÙÀ‡*’KÈŒ]¢VÆ„·É:õ Ý¬„ÌÓÆøý¸Y-þ ‚…°Dê*˜îǪ9³8jù¹ä® +”ÔTÇ´ét÷ÏJ][º¥ÿDžU„×Ò€±ÈB˜R`Ò*O±ÿ©ÓAjÛ¨:þéæ^‰âb䇩°„ ï87õ!ß‘GÄÎÜQÒ¹õ'ß>·ç@ÑïÞo?O$nžµßZò=í%K#ÿj¹ qŽ½h΂¹y ÎX0w^¥s‘s±K¾äV:‹¦G/&*áÄ×÷VÄÂáØzîB‘Òž˜ÚB4fΙ¤ lm®øô0{>oÜ|h :Ê‹ÖèÓ”LÕ߇¬ù²SÖÔ%d,,­*¯>3&µ{éÚ+¸zTDWQã6µ9‹ÈÂyÉÒ –Ÿ¿ôì’¥KÄëùE‹/(¿Ï9wIÁ·/“–\pÎùK}Ë—žû-,´:*Ê$å|»àü H-Òw~Áòå–@îuD!ÝúéØlò_œ®³ÓÜ+–.Yäkc§Ó?séŸydá&ëæò({™çÔ’÷KÉ«bô+_ŒÍv`QCË‚U`Nå*ºLá iXâ4“Så¯$K©€¿ØüÀQìã“àY,[>;?ÍŸsÖÜ3>÷zeá­¨ŸÝ‚Ïjö¼–=bÏ?³ç§ìyËG»E}EÊÈ„Ì9z }ûœãdþé¹gÎÝïòö³Úå5F ”»9ËÝœ³—QÓÎ’3ü=7g;çtg— M¿Æ~úÀç_ØsÙ¯ð¹èA|æ<„Ï[ØóH–OTÁÊ} ¿¯ØÏgÙsq>ç<ŠÏÙó\{ÎŽ® +WÍFw}ýMíb°0'ÄGÔ™ï->» hÑÊ©Ù]²rêÅ3OY9ÕA }Y~¡¯@ÿÂLcÙÏÀ³DX´Œöèf-ÜÝû?³$AI38#®à樀‡jU³œÅŽ§–âyËXf©Íç_U–¯…/]SQYUùY/Ä×®«]ÿ}ôK[ŽfÑÀô¨“ Žk¤´ÙkÉ|G½óØÏÊj2Ç;³a6¥"tpƒÄ…B˜•¥Y×”+[–ŒÑJJwÇä² íË6·/ëGÅhÖÞÜE5l 'GÚËÈ?Ÿž¾%tr‹Ð–„B4meSëãéxVO®^Ö“Ëòåɲ%Z¹áRÇ*u\ %41þµÐøÙ31,ꆭŽëÂZÈ4µhk÷ÚÄA]³†¹]×BzZ åù¾Ok:—L’É2ÓÁ&YžM°1¶,Ñ®þï©mPç„2LñòGšìѦ‘Ëû?ñ¤Úø.܃ITOòIPl×±•a>‡;9p7L ®×^hŒ‘#¡5év1&‡á”;-/]ÜÊç$ÝkbâC±âžü-æË]ƒ¡’ãÓµ±@‹|Ÿs›¸ƒó뤳KRÛK,DÎÊÃÜð¬²mçÝõì´¼iOÒ6‡"§Yçzˆ)ƒÿƒ±O$s¦óƒÆ¬±\ZÏJh +÷„%þ%ŸŒøD(f 󩦚˿BN}[]rÞ/Ûÿ +…ÈÒqT'$vÿ™SLÚOüeB.T&È·ÏÄ¿ÁwèD'ÍW÷ e~ÂÎÃü¥1¾‡êØÚ§~îÞºe@c9(ßéa·óG­í¡„óÙÇر#y¼¾˜rð +,ÿ9ú ã…Á¿®Ÿ¼=‰,ž«‘ÍûFpåUg™6asYSxÅPåé…à5îÐ;²“ä“@fÉYGîw©öœYk+›K ã]6RQù=f]ï,L]e3ñ°;#N$bôéU¿’Î6š¥©ŠK\w%âɤÿ +½#,Âä›À²Ÿîc±ndÛFêR6žíË£P^ÍUhoóiÁ +Ï¡û»¯‡% UÒËÿãÕËÊ‚#U2™”Ôu_þœX«Eº©ã"ëãV?º”]·S?•§‹D™ä“ç&¨TŒÏ ÎEásXžOOÎ5þ¼çhŸÊ‹ a8ÇÕms,¢Þ^ç…‰8»ùÍ|Fó"*ÒG¸ãPEyfÜ¢A'LõQéÕ½®úKßfÕRöå©ì¼¹å+dT~a’©´À8ŠLŽuhœg%LV<•ñ>ƒªõÓeͪ֟lIÜŽ—³29kîöʆªô˜‘Ê,rgÎðÛ7½ãŸÄHCOOÅÚoÉñxDùq‰ìi¯‘ÉõJç–鲿<–':mñ™Í NçÜ€ Þö9Ë‹*éü´:!ƒŒž2=öd¬$±t4F*óÇäš©ì~¤×¡£±~«6^²£Q=b¬PÓiåŠdÊVµ}¢þ<\A>n±Ç”ŸœbžCÚª™5Œ$¹È'n”¿Ì¾®Ò¥–ä9^°oü9öcþ7)ªíÏœþÍàýe{£JzµöÈmªHDXÝ]Õ¿žü¾—¨Žý¥U×OÙÿÆ÷5V_FÜ^³h>¤ü`£òÜlT#=aF”…i^í£ûGRÑy÷7wÕH6±àtÚ´L&Ò¹IþØ™ç(ß3¼P}4Þ`ý½òûHõËç§-ÌhÎÌW» ´á}uÅƉϚ]müÿȪýþžëªý¾ª²ù*Ç}ý|ß¹ü> »xÔ˜ŒPQc´y#_ŠX-7 ‰=³&Méqa•êX²´m]¸-ܶ„îK‰k1 Oh=áÔïD8Õï¿: Oð†‡Õ +“ÿõŠ¥ëyï$Ûb¸oº¦ÞñÊöÓˆvÇ¡ë¿ï‰ÏªøŠðØ þIóV[ºü;qõS!Tþüžï†Œ(kmõúz"ŽØfuÈCp£ž;9€'=Õqý»âô¬å¹¹“×s›ú]óûƒ8JEñø믖Ýrvq.|FF¨ªß'tùš:Ò‹n™1ÒXbx7E³Üɦ¢]žÞ§ï;uV‹½q\ž¥¡/ˆŸó!#–TÅä¦2C6‘&"òu™|–ì®ÚÓV…W^´Þ\·uŽ¦ÐÔL¯+x šü¯i€Beø·POÑÅéL< _Oò9šG©e‡øj”ºDA-°¢GM#‰ sÚ@f³˜Æò-Úg1£QvË[¾ XºÑg¢)/«Q˜Bom‹F“¦ž³ÆP:Ÿ‹éA`>N&øàåÇ– m1À5B<‰6W©{©(Ôã–ÖÒÄÆ,+ÓÞÚ¼ò®ð—©¹žÈ¸†*ù0ðx®® ©_j¿‹¯xQŠêÿ¨µ°mòèÞÂM´9ÐÝÓz[—OÏÀ-Ô t²FžP*l.à+Çz}âýþ“bÜ ÿPÓ3„›KêYkýÁT«ŠÙöRX°X>nÒý}joxD„±ò8ñÅÌ Æǧ_;ZJ-ý>|fðõ{§§¦~y¬Jºð×ãÅJ7/”PÓ?OæWn‘r! I#Ó@þyÜJýÜùs‰*é¢ePÕ¸C`vÎòÝüò-‰ÐÛέFΪ#ÿ\÷ó %Ès»Vþ¨•Žp(¢tÅÚ÷§ü4÷r×RzçkÈÕ”w[Ñ9îQ.åZ©ÇtŽ”ËË}•zª(¯\Y•xyz¹kmy1í‘NöÕjã{ŸÊ×…ß|ÎúËUdå}æÈo—{¡V©­‘ý¬Ø!¬ÈO–´ˆTQ«¦»·©H3³“£"‚ÂkÉóW<8Ýp§°ÍÕ¿‰tÂÂBªtïîNò;U>¨Œí¸Ù±‘¸ÖrÛU-sU]ö*UF¹ÍŠÍ×n¥>ƒ,HÿVŠ‰2¢ˆÙöv}˜öÁ”UC|5)ˆÉ¥oŸüÂoâg9ôxÌ«ër–Ú&¶Q¡›©„UaÞ`ëbãtÀR¬ÌªV{}5Mž÷f•ôh2çé½2&vcZP˜´D¥¼põ +’7}V¸‡1šnºÊ]×oÃ%âÙI±åK/î¼Ç5 q°‚É=¾e…´Ïà6›+ï^o‚ãQyËvá\£šãÜEýî +SŠÖ§[X¬¤… Ã1šS† ~ ?:ŠïéÉ#~äé#d¬•uvjÇJq-›ôÃ0=µ¤ßbôa´mŒQ²–®ïb´JâŽQ5µí:\™¯Ñ˜«(«SyØ­tª¾;K3,ñÅ™>ò¨¡*Y(:[šT%vò¨*h¹Çϳª’.NdÒñWõÒÿHǯH£±®€Æ<+R÷ÞJ“üeòu¨X2Q°8-PðŽ1¬‚GÜsWÜCW–†»n\îrü Õ¨åvávnêhb|8šä,'ÎNð8ÃÔ]t¯I¬U£qMkb-kÇ-šÐµ)ï'&b1ª™8½"MúUZŒèDºbD“¢ê7¡yMFOùŽ7–¡îr»[I#lPÁE©ê’)BÔ›¶²üLKFÇ^}õÕJW‘ï,½DÜM^y[Ö#]Ò0§r&jEÊ +ÈbQq®7Ò—Ä®ö*·øì1CÛ²u@u=3^qcghæÒüq;gXêÚx%ª›¸)·GTÔFqä¥*€ôU§ƒU9)Ñ|û¦ä,ùª`ººµsð“ã`8AâTˆ:ïD÷¨Œ=WôŠýdÉý’¯H~D¼h©àÉ»$H—<óJÁ¤ÿÛ/YE?kjî ¼¾AS%½ü?g=ìY“Š¹¾r¹<ÖŠ*pŠGQÉÃ:‘—ÑEu‰É;'dÔs‡ ö ¹úôƒ ù,}»ýñfUï$/uU!¸|Þâù…>åx©UK§Éªžò1×ä"òmå¡ÅâÎUÛ2·<•\ÿqyÕõÞòåÛ^~§ºå©¿O¾±ú')œPº–ò‘ã¬ëê{þ&&¹á1÷˜KC¬ñþRíÕü2ªÉ{tFuŒÌ|å+ƒ“W}Ð<_yª u¢G7Ÿ¼Ô-bc«Ê«øJRtæS>oyDì!F”‚Õ€¼,Ÿâ,Ì '߆ê?ù, àÚâµÚ_f9hXž+ø!Ê—ýt7ÎTùdÌSý¯Kÿ—e©ÿóÓÿxd½„ò™ ½¿Ý«øGs–e¤U`¦ô½‘ê¿” v‰àÞ üPrk¸ÍäçÅF¡$J—‡.ç`7Ϲo‡¾‰ƒËâêˆ<¹wÐŒõ-w‘À²vE…8kw BÙ­fUø{Âož M ¶œyÚ4ÞöQƒÎD¯ÄX·°-üo˜´f:Š’­hÜ~PÛQŸüXöû ÍO+.×_ùa¼yÏëÑ°¦Úåôȵ\I¥·•ìßW×êŒa]lúóXCÚcÎ>?õð*„[øß“È«>rwBLxòHy'·ˆßMOšw/rî4@¾1qM„;¹gw:OZÞÒUáMá/´\¸.×Ä,¯æZ2‡Ë¿HÑ¢zÞÿ™ô[¨œ¦Mhy4™çO4HWÌ«¬ºÊ«íÍþ‹Éžà=Ú”Ž‰4pùdi,Ò“§ŽÈ9ŽüŒSÞü#t­Ö”mà N}o‹æÒVNí.Wü%ÕnTÜ82ad·‹ýÿ¤Ažô”܃/è¦Ð‡5è¼UsWÐq­-Ò=¨gc÷¦u7÷n~Tä°fŒXº8SúÐèq;زÕq;Mp= h#›öß5éÆ‘ˆºŽ®;A}ÞL>TÁ؉…³ö \{ñ¼Y»¿?wþ¬=þÜ®¾`ÖÞ> Ï#?x ¸à\Æ\5k7ƒ‚ÀÓn˜µÇÀ«;fí]`¼wÖÞ^²~ÖžÓà ø¸p!cÇ6ÎÚm –B¹àp˜÷o˜µ‚¥#(|îY”{ÊqÖƒ»ÏÚƒà¼9pëI”Þ ¿žß¶QÞùŒýñ™» ükpL}´`ï—6ì}àÛ+ öQð¼Uûxêú‚½ð\_9pMäÀß'ÁÀ=à~ðxê–‚= ^zkÁfŸd¬ÔÀ8Ø ~Ïì]`ô÷ +ö~ºÏìðŽÏ£Ü »e{Áƒ9°üxº`gÀ;Œ‚½Ü™)ØÁgî,ØS`, yðÌ{ÑEŒÝ ¶ïƒƒàö‚}_A{ÁÁÛ÷¢Þ`ük¨÷Åè·GPoðÏ¿zƒŸßzƒS߆<˜yòà®ï¢ÞàcßC¹àÏ ÜEh×?¡\p?8΂“àÿ 9ðûGP.Ø} åÒu} +ýð\Án·?ö‚ï¼9𼣟Á®ÑÏ`ò¥‚ý*ØùrÁ> ~\t cç¿Žú‚W½ú‚þ ý ½~ÿö¨/˜ø%ê ^ðúùRÆvÌ ŸÁŸƒ}à±_¡\ðÀ»¨/¨½‡ú‚·ƒÓàC » ÷9…ú‚3¬h÷ݧí xëéE{7xꌢ}<묢ý*¸< ^|vÑ^ôiÆ~l€ƒà½ME{ü¸L} òàÒO@üì§|à¢Ëû‘yðpüÖUÓÍ/ºòà%!ȃ[À“ .ºã¹òàÅ­'ÁIð'àðXòàÞ•ïZyðé닶¦¡?o(ÚôG©_¿±h·ÜT´w€gÿVÑÞv€GÁ>ðø±ö¢½`1ò­.ÚÍàŠ5è7p7˜[:Ðoà^ð øÈZ” >µ®h³%›Q.øWƒ(Ü»½hÿräÀïíD}Á?|rà’ݨ/ø'ࢥŒ½ögh/Øò%´ü8 Ú_F{Áûö@~)½K_ƒ·=W´§Á¿òË1ßMAŒ¼y°ý” vü¤hïÏy å‚O¼^´§À‡Z´gÀ¿œ.Ú ›1ß(Úa0ù&ž8ôŸxNàñ·PopïÏÐ^ðñŸ£ÞàM3h/¸ÿ]ô× +ÆÞÛÀ5ï¡¿À¦÷Ñ_àƒÿ…þÓEȃ¯ÚŸ8«dŸ[>Z²]ùl÷.(Ùƒà?œ]²'Á—Î)Ù{À¿;·dµ Jö«à…Ažò}ªdk× þ`'È.)ÙC`7¸Ü áKKö48²k1î@ ü1Ø þ +Ͻ ò`ÜÞ +à4¸d!Œ P_;Á÷Á!ðüOCÜ +îSàaðqp< +2è¨g]yð~°ü:8Nƒ;À¡+ ÞŸ§ÁÕä[1O€t,ú—ÁNð8¾îÏ] y°< þîPÉ>¦ÁaÆõ’Ý nž,ÙÀ»ï*ÙcàÞ»Kö.ðž{Jö~0º£d_Ù yð?îƒüJ´û~ȃ§=yðp \üȃ;wAü6x\øGWƒ VAþAȃ<ypíW!¾ý0äÁÜȃ_|òà×Á`ÇS¿ïØ þܾô›Ÿ¾Ö 8Øo@½ÐýÐDè5htÏ«å@ç´ zñ ƒÊ AoÁºc3üÿ‚¼¶þÐYÛàõì€?´|'ü¡~»á}ZS hM üÿŠýb)ü¡ã ‰ÐסiÐ#Ðè¼Cð‡^„–AC>‡?´/4d æ´+t74zší^htt3´l wžÃÚú0üiZ2´+ô h"t-4 ºš-‡nƒþ-ƒ†?´34d0ÆÚºšÝMƒž†æ@«¡Û -ŽÂº8ŒèôhØMÛÕ’Èûß·çµ&ºº§ Ñ|èñH¢µÐ¢¶D» Ú‡îíhz4ü‡b¿ÚþPWwøC/Üè¹^ð‡õ†?´K_øCÏöƒ?tÏ`¢ðxä­áDý “F¥@—@BwA7@Ÿ¸Ÿ¨ºjÑYèÆd¢ÐCÂö«á=’ +è“àÝ7þÐ¥ÓáÍH‡?ô,øC¿_ ÿœ¯9ð‡Îƒ¦@ó¡ ¡Ã_„?´ZM\Gt1¡öŠÎU÷û¶Óü†ùE†‡¬õ óþ;¶˜Ú ÿêf¹¬ßu ûðŸþô]KhMÚ†hÖøé%ÚÀˆ{»Ýíû-½6ÞoàäÔП¾/¸5 [á?´I5JªåÞ«þé5ÔÛÊÓ}Ødz½ïµÿÅÊš¼þ¾„•¿ØgàmçAïïOŒ²ðÄå÷FÕ"ʩŸÛ:àÚÔZÎcf=¡ˆ;ü1 ˜äïµðòðIj¨µÕœéŸ><•ù?(ýÓÁ_¼£†î ±òè:ž þjº—ñ>>î³¼×ÒÅ~> qîðcqžÒ·†’Y‘ãQ ž ÞÙʧÖá­Ç…ög÷ó·ÕÓÓ_Ö㵋Ïíz:Ùúý¾N¬=Ó`W’ªî÷lðý +î­§¼ òWõnOñq«†]ëûÝ”ØÀ:߆6¨Ë.ø¯nG,x‹ õ·ÃË“ÁÛ‚¿Ìæó:¹d€ç¥¸i$ËC ~u<üã‡P>ã%/?ò°›3'ùIð'ºéMÖþ|¹^Vƒ§§ºic3ûùÝŒõSþ^9ÇM Y9OÊ~ˆƒÆ¥×Ï}ç?4|ËVÏs.~þãïÆ7añ|&ã)߶ÌM X=鲡‚¿ÄøZÉ+¡s—»©ïFr¼jÚ#9nêÉø’GƒÏyÞMÄÚW#Û>b›Î2þ•äÓÀý_tÓ VþTY~6xâzŒóM®Kàe/»)<ÀÖXÞ*‡]É«nêb³s…0»jØí~ËM£Úì5äãuðô7¥³~iŽ?xÇB7%0>ØÌà‰àã%çGø"ðbçcÿ²µã»à·ÝÔ‚OMäùtüÏ8ï­ëUÀ3u¼|â»õÇámG Öç­àçíí8i¶Ãk»GŠnn— »ÛŠÝ”m_?Ÿæëgì潯Ϋùà À{³y#çU)ø²ÜÔñ;$¯ÏýÐM'YÜ_ÈñÑÁ•ºi.ã³d¿D…âZ |š=Ÿ>Èói<ìŽ|ê&—u~4 ¨›¿ÓÀ?:䦟íå|ÇËÉ…ÝsÇÙ8'Èq.ßuÜMÉŒ‘û„rðÊ7ŸOÕ°[ð•›þ‹Å½Yö‹ ë©üqÖ¯i²_cÁO©çS2xøE{;Nóy’»¤ÓÎv¾ù»À3nÊ`õÍ3óx +x+_`ΣJð¹àõ]_ùæSô=ø©¶ñ)kÀòF ìú㦕öq\ÄÇ1v*ÝôkïhÙÞ ð£à!¬d¾Ë÷’›vÚ¯s +øuN©·=ß»)”•lÎð;®¸é6k;F›ý¢ƒ‡ƒ›·5uþQXÿøÑM¬þO™þqàÍ«Ü”Éâ\`æ?ð™à0^,y–÷ÙèOêüš> +¼¾ë^_üàoƒ×·oöÅ>ôæEs+ïݼŽëàùéÊ}_ökSÁG³þ.û7|¿N]¬þšþ©àëÁ‹Ùº·K®{YàÝCtú”•ÿ‘,?üXC¶±ø6ÉøJÁ'„êÈ8™ã> ©N±ÖöͳŒ?øhpÕüˆjîýgαþ?m®ͽsHÍSÁßk¦ÓTÆSÍñ¿áÀóÁû‡éÊ}h)xhsŽ1~Xò +ðÀY~ñ?'󔾨…Nñöë¡üú,ºÆÑ¥ÓuVÎ/²žxðô–ºršžÙJWæËlðàÛÏ÷b~¾Âî¡põx–{ŸÝ‡«Ç³ +| +ø‡¬{e¡ptƒdq y)<"B§ ö|}ŠçëdØ} »™¬žGÍü©ÓŒ¿"yøúHuÞÈÞ_šË×°;¥;î}û_ìÏ‹Úétw¨5îž¡rÿ þywvZï‹loT×/ñàãûèäia«çZ ÖžtØu®SŒýº£]3f—»ž):UÛ×™ïù:S +»šÉ:}a½¿p¤±<ÿÁ·ÏÑé6žyr^êà×i6ëçér¢Z¢Íàc™’™ÿÀ_Ÿ«æ©àÇæéô +¡yþƒwŸ¯S2[ÆÈõ'|ò“:=ÇÊ_bîÿÀfèt‚ñ™ù<3S§­,ÿ¾%ó¯îYŒóí›÷Ê}sT+¬ãKÿYû‡›ùüø)Æ›ù|ñR¾aü¬?x¿e:bü3ÿŸñqfþo¹\¯÷~ž/~ðϲušÏÖ‡9r¿¨{ýWâ<ó·Í³É¶ü×ygUýyÞ7ÿÁ]«uúµ©ý~QS>ÿaw~ƒNöúšðúò¼ïÔ¼ªS«oyþƒÇ¿¦SÇ [9-ƒøù»¿¾©Ó%{}gy}áÈ{›tŠfýØNöc48è4‘µg‚™ÿÁlÖ)ÎÊŸ6óî4ð àªëœlð^þ0ø6Vÿ&sÿ þ¯Ÿ½E§é,¾)2¾À6šöÎVN2þ…?øcÛëç¾ño½óÃ~½wŒ_ï¥ÃîÈ;:°ùhÈrrÁßÞùlÏןò|]»ñÅ:½ÅÚóºyÿüÌ^~fýñƒyÿ|Ë{È׌ß0¯"4my‰NãXù£Ìëðâ÷uú;‹c‘Ü—%ƒ»J‘¿™ÿÏÒ?üÊ>3žiîÿÁ‡~|óý@)ì¾Þ¯SËŸeþ¬ˆð^—êô<ã9’ëÞg¥:-`q¤Ë8¢"5-ç°N#X? 3óøž +^qX½?Ë_}D§lÖ7÷¿àWbÿf=ÏÎÉü¾óÖ/ßt3~ð§t:Ãòÿ 3ÿƒ¿sãÈê_$ë¦ßè´—µ·?~8ðTüp^§v¬üY~~ô¿ S[ZËõ'?îùo¾eþæú‡×+âÇAWtúï53ÿƒ·üQ§ûùö2?ߢÛjÚ‹WÕûÎxðÍWÕûÎiàÀ‡Zù³–üþ!x#¶¯´ä?Qþ<ÖϳÍü^ ®º?P žø³®¼?x»¦MW=Ï¿ËÊg[âÿOðÛ­ü!Kü«x6ÀJ^ðœ?°ÜW,W=l§iëü£Á×:ðxðœâÏuŠ|µCÿ€ouŠ|³ƒ%øÿÀöš¶ßiüÁ¿W݇ˆ÷¾ÓyÍ!~ð{¯©ËÏO¹¦.¿¼Ä¡üƒà{ʯÿÊ¡üÀšv÷/ãÞûuùñà£Qϯià“QßgÉŸ ÞÞÊ'ZÆßûÞ<Æþ|¼>^»9½<Ê<Š Ø$ðX?]’ýÞµ·‡~oÅòi«º|›î¹ÏCw±|ÛÍ|ÿ}µ‡`û±Ñr?– ¾a‡Ž³þ?*û¿<1Ï£|ß üoyñƒÏËsˆýOžCüà½_ò(߯Hè ~À~T̯ƒ2`÷å+ºŸÍƒ‘räûå{¨µc«lGøóàª|yRðÏYùdùÕà±ÿô(¯]]°·gÏùüÿm>ÿ_´Q]²àªýZøapÕs‹<ðâ7ÕþEàoy”ëÉIðPðK,O_”yºüËdå'˜ñ£`½D=ÏbÁ{¼<ÉÎó«ò¼Ê'ƒ7< æàxøPpÕ~¢<ÙÁÿ$ø^íý®¸j¿ãê†\äÀcÁW;ðdðž¾Âçg;ð"ðeü$ø^ þ¬Cÿ¸°@¾æÐÿ±à…àÑV>Ù?ø.§øÁw*¸ïþ‡(ÿ‡x[ý&žßÿ€ÝÜ`£ÞýœïþøTpö¾¨·œmü9A`Œ¦] 1èœÝî·‹Ý›nn— »äPg;ßõ?ì‚›t†åéòú<ü£°›—sv Zt­›_›ï€÷jmPWvŸ “¼OØCÓúEÊç¨ÑàÇ¢ êÂÊï(Ë?ÕÞ ¥Ì?KúOïÓÉ Xöœâ.ùœ"|DOƒ’Y¾#óuø³ñífëE¡¼_v¼Y‚A_ÛßûùWßÿÃî“Ñ•²ýÇ{rÿÚSÓI6¨7{ÿ8F¾Ÿ>7ÕPæÕ$ðùཬ|ŽÉÓÁ—€`qì“ë^.xÇIµfýØÂ|ÿ¼Í5/{Ô Îlœ;Èq®o5Ý ÍŒo”<ô.œ÷iMfí{X¶/üëYjžÞfŽAy¬ü5²ütðççôkÿsÿ ·À {ïeÆ>öIƒž`ëæãæþ|x«ÿŒ?øä§ ÚÁø3~ Ü‹ êÀx”ä1à?>cP_kýOXÆÜÿYC¹¯HïÞÃÊÓ,×?àÀ77dãÓPÆþñJC¹¯(Ë1”û‚*ðppÕ}¬P$ü.àªu!<Þ'OuàéàÏ:ð\ð×x!x‰/?®zï¿ +¼á*C¹.…þòñ*‡øÁ£ü“À;:ðtðö<üv^åÀËÁ#xx¸Süw#?8ðp—Cÿ$÷WíÒÁ‡€«ö ¹à NñƒÇ+¸ïý7Qþ¬a¶u uÿvËÊû@®XMËïÈÖ‰¶rˆ_ø•¡¼“ wÊPÞçɈõ~çXÍóÀûý[]~¸þµšŸß_¡.¿ü£óêõÞubøV½ÞÇ‚O¼¤^ßåüÞ £ÌÿôϸÇû^˜A:;Oÿ0¯À‡þd(ïÓïÀîÃDÉû0'ÁÇü¦Þ/Tƒ_¬¾ù~! +`ë<êý@ø¦D‹Yœ™2ÎTp£!©¿ÿà½ÀkDÊýB>x¸j¿P +¾§1)÷àÛ›¨¹¾±)÷ QX趴 å~!¼{+RîRÁg·Vó,ðíá¤Ü/䃷":ÈøÇ’—‚ÒŽè76®ÊyPÑ×{/…¨[{/+LÆïýp¢ál_/÷¥Qý4íóÁ¤Ìwqà•àªõ>¼ÙR®÷YÞÍæ×69¿òÁ· z×{ß÷_Ào€¯òò+‚rÌh:hyðó/¬ñ÷Oi"¾ßX »)#‰üµ[Ÿ[Ÿ[Ÿ[Ÿ[Ÿ[Ÿ[Ÿ[Ÿ[Ÿ[ŸÿŸ)Ï òé ¡u?…æØŽ[¶âÇÛŽ lÇËZóã÷ÛðãˆH~œm;~§-?þÌv\!ŽCÅqٌڸšˆã@£öÿ5nSÿ¾Úßô'ªÑê¾o!4Mð(ÿ]Ü.Üà_[~ñï‰ÑµÇAâøŠàâ×Øk{n¯ÕÆâ8¼®mãP÷—ýµõ×]cÌo_«uÿ¿J°PÑ­ZJ öï]Åq]»ë~‘wC[ý†¸*VkO⸮×ÄqÍAÿ§ósá¾õþ{ÐÌÚv´ÚYh¡ B'!4Sè +¡ë…nºWè!¡§…^z]hPš¨_hg¡}„& t†ÐL¡+„®ºEè^¡‡„žzYèu¡A³DýB; í#4Aè¡3„f +]!t½Ð-B÷ +=$ô´ÐËB¯ š-êÚYh¡ B'!4Sè +¡ë…nºWè!¡§…^z]hÐQÿÿ²væáQÙn4{H–°›­AŒÎÖ \¬MÆ [‚$¶B#ê‚`dQÄ«fçbDŒ ÈÄ­EEÌ Tã \ã#F¹c4!—ÔIRoµ9EÂ?n?þè—S§ÎWU_Õ©úºiÔŽºP7êA½¨-AKÑrÔV¡5hÚ„ZS?jG]¨õ ^Ô‡– ¥h9êG«Ð´mB­K¨µ£.ÔzP/êCKÐR´õ£Uh Z‡6¡Ö¥ÔÚQêF=¨õ¡%h)ZŽúÑ*´­C›Pë2êGí¨ u£Ô‹úд-GýhZƒÖ¡M¨µ€úQ;êBݨõ¢>´-EËQ?Z…Ö uhj½úQ;êBݨõ¢>´-EËQ?Z…Ö uhj-¤~ÔŽºP7êA½¨-AKÑrÔV¡5hÚ„Z—S?jG]¨õ ^Ô‡– ¥h9êG«Ð´mB­EÔÚQêF=¨õ¡%h)ZŽúÑ*´­C›Pë +êGí¨ u£Ô‹úд-GýhZƒÖ¡M¨ÕGý¨u¡nÔƒzQZ‚–¢å¨­BkÐ:´ µ®¤~ÔŽºP7êA½¨-AKÑrÔV¡5hÚ„Zo§~ÔŽºP7êA½¨-AKÑrÔV¡5hÚ„ZWQ?jG]¨õ ^Ô‡– ¥h9êG«Ð´mB­wP?jG]¨õ ^Ô‡– ¥h9êG«Ð´mB­wR?jG]¨õ ^Ô‡– ¥h9êG«Ð´mB­wQ?jG]¨õ ^Ô‡– ¥wµŸO·ìg¦¦¤L´S?¸9cáÒù…Ël±ŽxGÌÕQ+ZaÔ•ê½ÅâX¾jIÑü[›µ¨PižþÓÂ¥E9…ÇÒeE9Ž¤äiWÍÏå]îÒŽ[W,\œÝò«t­ïòæ/ϳ8²W-mö§´¨Pý/§pyËÏõµ}3¯ùï +sÏo1äO‹‹Zª\ØüÿÖß—sx›ß4ÿݲìùEó-Žœ¼yÞÂùKræåeþòN•˜×òƒ<«T ýçü…­aÌ_²pAsÕËŠZÿ§jQo]¾ÜâP¿xWôÿ°ßJÛëýVû·À°vú©ík{/]>“ò™›aoþ–j£ýp‹ñ|$ n>7¹©Õÿ`KwâÔ÷‡·õÏ—¶çýøÉ2ülkµ¿´_öwp]oQ¯zõ}]gðsÔëÿªw’Îk:)Þ/†÷ëÔ⧯¥ë·xžý—*ûL>IðàyÉÂ&üÄowÁsð_os‹ç!«;©ø¿^¯‚ü)x‘Á_ƒßnð÷‰Ç½#QÎΪ2ŒvH…g||–ÁÃo6x1<ËàO5ñèç{û°O4ìÁS ^O7øø ƒÿD½Ô{…^O»Ð¿WÈñ /0âœÏ0ÚÓ ·ÁGévè¢ú¥[vRëû‘ºàWüiüÔW~Fèy^9\Ž‡“øI)HãªGWe_†ý@½ïíªìÇ,Wö~æ'ö÷—óƵð8m-Ùøyâ¿e½›±Ï.Ûs7Ü ×ûóCÚÏnåg&üxãnÙ>uð{’Ä8ÿ>y´ïgå>2≰*ûçüÒ>~Ü/ý{à ûÅðð—¥ý:ê­—õîÀ~ìeßßòŽâWÁßÄOu¸ì÷¿Á+àú¹øÿâ§oôÔMñ ¿Jÿú1þÃåxvÁ ÂåøÏ€g<î4ø:xˆÁwÀë‡)ÞO¯›ðêaòºþ¯0øYÿ09ßZ»ÿ0Ùþ¶î¬wVµ®õe›œïÞUñÛôõ§‡(þ3‰B<¼—âü¬¤ÞŒaryûUøþ8ö‰Øë}Êkp›áç#¸Åh·oáµCåõöèÁ¼1Töï(xÙPÙ/“àÅCåLò=Ĺx¶ì¯*ø®›¯Õçðu·HÒ[ñ÷æ(¾„ûô*øøÓ:¯ë­úËiô׊ÞÜa²¿6ã'›|XŸaïìÝ~žÿþ×þ«á[ Þßjð}/3øÄ>*έ nÁ3á›áúf)|=\Ÿ ­‡$Èyf'<#AΫàÎ9nkú¨öy¿HµÏDx|õ +Å_…+ÞîÓû¸`u½!GåõÎ +f~‹—ý¢÷AOú’Å>è6ìÇË|&ÿ¬LùÏ&ì« û'áñržÑû¦á÷¦´»o:]’"öMop]õF^zÞhð¯áç ~~Ñà}û*n9*ù(xƒÇû\ï#B7%‹|fz_ÖÙxcÏŠ—yïj¸ ®ÏÓ¶Ák]Š_©ç=x~/ÜW¦xþ÷†ªö9bÌcŸOm¬¼¯á±r½ îÇuÅÊõh\?â|JÕû9|*üú=Š÷$Î¥ðôÝŠïÀ~ü üäŸí§â¯4âÿ˜xlFü:_ºùi™/}}¯X™/µüÛã­ëcŒÌoíðÚ™%«cd5^#çó–s¼%žO.¨xòõ8ľ{ýy×mðâ9ï½ÏŠ‘yæ1ü×ý¤üÿ'üì§ÆÈyµyipò‡¹îŒƒ×GKžÜ_Õ{0DÍ·Á(4%ð¼¤åu ~ŽGËö\ ¯Œ–ç0ÂË¢e~õ þ' Qþ?Õy;ö[¢e¿|/ˆ–ãùÛþj\UóF犿hðAðý¿ +~Àœ¯°ŽGË~œ=@Åo‹H Jòýðê(¹Où ¼Âàgá[¢d~hH»EÉñlƒgDÉq8îŒ’íœ ·Àõº¶^ë”õ®‡W:强¾Å)ã? ãtÊv¨':å|U¯ãëçP=Ñn‘òºFÃ+"e?N†o‰”í3 ^)Çm!<1R® ÷ÁûGÊû¢n‰”ã¡þ•CÚ¢ãwÈøuüOpñ;ä~s\˜ŸÇÖ¨ñ¹‹ùsöYÙž^ì÷ߣìSôsvø¸Î‡ÿ¦î—ÝÆ|þ9þ-Žöóÿ"ò:ÿŸk?ÿï9Xù3òØQƒYÈ#uÁCŽ)~Ž.‚oÂ^Ͻð¦n©j}b½~¾Ç°ï2Dñ«Ã”} ÏhøaÃ>~ÿ•ÊþÎ7î‡eØÿþDOe¿‘‰¾ Þy½´wU|í¸T±.Ï„À>JÏÛð†sŠ?ÊwüzÃÿãðƒŸ‚×:T½Õø ¦øfÃþ×ðŠ˜Tq>¹¾×°>%NÙÂÿø»ëå~¡G¸âüCñÞôc$¼Ûé1|ŸEùOç $ÿ³Aúßßüƒâ66~oÁo5üŸ‚~† W¼ë)Æ-qN€¿Ž½Þ¥Á'm”þ—Áçn”þ÷À¯?­ø)ÆÃøÖÒÿ‡ð°MÒÿOp×&éßu…â±u)ç@­ã¾|“ô?Þ`øß½OúÿÜuFÆ~Ý}r<±qÞ{VñArÿµ{½NÅcÿ\¯GùpûQÅÏèóøaÃÞÿCŠ?_1ϼo#ß›®æ½1ØÿûûSÅùØÏð™×(¾>‚uyº<ˆ‡;§Ëuy&<Äà‹àõ×ÊuáxõµÒþ1x…Á__+÷MÇG¨ø­OçäµðÍߥˆýÑEø+ðsúþÉýø½´ÿ>Ÿñ ŸØ(í¯ƒçÀ`?~䜴×ç?Fû¬É~ĸÞáµÓ$^1Múy›z7&©þ]¦÷•ð®)’wÅyø$Å3žcFÑþÓdÞõkxÖ4™_åâ'mlªÈsVÂç·ëû~ž~ 닾^?õÚ¦ÉçkÕðÚtçxYº<Çè2šøÓe{­êí+ãwÀÅÊøáÏÅÊøgÀÇÉø—P¯3]æ«úÜ©aAª8wºWÇ3Qñ úe7~,é²Á«§JÿŸáçGîwÝ_Ö1ŠŸš’ø\_ëó±1´ÛTyÎp ¼`ªœ<ðŒ©2¿-À~’¬w;üŸðÞÜ/~üØð£ŸÓUÃëݲÞ3ðJ·lýœ½ˆq®ÇC;ùª[>7nWökæ(ûéð8xø\ÅX¯¯…#óŠl;Ÿ1òÆõÔ›èn?/]M¿ë¼ôq{ûyéËøgø×ëND¶¼Þ‰3®Û³ÏXÅ6)~€ü0îÃ^Ÿï­·_ñÏÉ‹ž?†½^O¿…ÿs¯â/Ñ¿aãÿÌ°Ÿ ß·OñO±_ œ#í߆o¨ögáÃ>òJÎÿŸ—ö7ÁÂ^¯ïÁ«_§=Ù¿¿eøï=ž¼ñEÅÿÊ}ïä•ö«à_–ñì„OÆ^ß¿'á#ú§>‡ÑzxûÃ~2ü¥AÊþ}â¹~‡aÿ4|Ýe‡ýÇ𭆽-BñÝ]”ý!âÿ ÜoØÿžoUöƒðþ¡av5÷cwi?þ½a¿¾µ§²·Ó>‡á!¹Ò¾¯ƒs§>ÊþIì§À¹²¿ÖÂ÷½©øXÆÿ^ø¢\9~áV| ñ‡G’¿aØÿÂÇ\Ä7öx¥ÿÛðW†©øõÇEëà' ûp'Ÿ‹«ìãõú÷¼«ìc9@̆oü(5pþÒò*q’Ì•çÿeðĹrý}nÕó¼rŽ´ÿ‡ö?Gúï…ƒ„[æÈõýxåli¯Ÿ¯LÏ<Øï™-Ï9 àņŸ:ƒïÒñÌ–çu<³äºv"ŠþúFÅó÷Ñ]ï,ùa@4ûÍÿQöŸ0N&DÏ,Y¯Î3õ#t;߀}åM²Ý–àßÃ}­ã\ ¿®Ï»ÀO1~ôyÈì„*ûy\W•Žó&ynV‹ý¡~Ò^~Ï‚ýãù`¥GÖ«?×Wì‘þ¢Þ Ü_„Åyd¾ ·xdûÏ€WÞhœ_Á‹o”ñÃo”ùÉöu½W…«ëýŒùçMx·Š??~´â#àýb‰óF9#à•™ò¾sË3åxÈ‚'fÊë½#VÕÛs\šÈ‹ß ’/œìƒß¿û£±<¯7ò–Fê­½AæE}âÚÏFÆñ9òŸ­Ñiâº&Ç1Âu¿<ô%Åïd>þ-özþïìâó«wq_/EÀ#b¤}~´Tñ÷¸Þù“™?ÉùöNxÖ"¹Ž<O\$ÏIþ·üxm¾\/¾„WæKûu<ùrž×yÎÒûÓDž3hŠ²ÏË—yN<1_® ÓáƒçÀ+ÊzWOQõþþQUïE/Á¢õyÂ.ü/”ç–±ÿ|gšÈ‹juœ eõö[v¥‰¼(<‘øÊu-^™'ûq&¼8Oæ:/øjûyQ«2/Z„ŸDü8ôùg¢²uXæ9ë8ódþðöw‘ö'tü¹Ê>ûïuü¹²ÞÞIÄ“+ýÛá!¹ò\%^ï•ùÒx¥W¶¼Ø+Ûy³®×+ãÙ ·ö‡’È?O«ëÆ~ä ì«sä9çxYŽŒg@2ç 2o‰„g6*þ,ãd*|l£Ì[²“ù^ƒ‘olJæºrdÞÒÑ÷¡vµÚ‡Z*ž—ß {>¹ýïIY:ðs°ÕþÒïNVO³Íï=€›ßoú¦Õ촧 ë”Òbݼ?]®Î«ý:O†{“ÕçC²9»&å—gèm_Ó:às;à-Õ…ZÂ,çß•ŸX×ýCð:ào³øwÅô«ºû³\oêEu½3¹ï‚R?–™ØŸ´ÎÇ©-ñÿò½9=NbÿÅÚ¹GÉQÕy¼1<\ADHê9€ÂÆzuwU „¼“Éd’ÌäÁ#¤RÝ]ÓÓ™ê®NWu’³Àºd#<À"%k@8° A8Æå½,°HNVyÃ"ÊC]‡CvȲ·êþª»^ßNÏà?þÜßýÝß}ßß}ÔÌL׿ppð+¿ð‡Èþã_áï¶Ò9ònâ½ô¾)øÃëÄ—>Êó»/P:+]ÿ €«³¸žñ˹žà; Ë€ü0É7Þáò;iØä øC€ÿð)Ý“¯áéÞJv~mvº|ðù€—wßø€ÿà¿ü}À™“Î'>i/7îöQ™ +ä—’üéÜ3¸ocù’—Éÿ +ä7ùßø¯çxw½Æg>Ž½‡Ý äGö¸?ãù•é"þÇ@þ«sÓyð€Ÿ3—§[8›—Û´nÿ; -à÷þà¯QºÔ§GÊÿâ÷e¹='Q½ÿÍ<0>Ìãòå.¿'( ?ðÕ€›ôç¾Èõ/'þ# àþàÿ øÑ=éüÔo Ÿ|-÷pûo¹‡—ó6ºðÔô4¿¼Ç›ÚïÖƒùô‡@þ~J÷ ºOkÈ¿ øAóÓùñ€ðÀoÎçöŸx4·ög¾äø/ß øë€øA½éüë½Üþ5tÏM æâgŽãùÚAýkÐã¾ð&ýOËÓµh¾»È?Hò3¦pùß=»€ü[€g¤óÏ>ð©€÷/àvn ÷õÁ¾ÄrâýÏòò<Ö?&Ðó$½Ãú ñ-@þ_H~s~FÄÙäŸ|à‡ôqý³èé·i~B_ºü$¿ƒöC*ô‹eÄ{黿¥þ²’xý(nÿ¯‚sâ»7O´Ï«@º·þ4ào¾—ÒýÝs>‘ögŽZÈùgoæöÜŒ' A9¾p‡ô¦ñtMjçÿä¯|;ã_øÌøÌ»±qþaÒ¿ŠÞ9öó/ñ÷¦ótÇQ|è?l—ÿ˜Îûþ4“ö?‰?úO~h-Ð9à·þ#^¤÷ûT_ù]€¿ ø¸%éüËKxºß™Àó»•Ò䮓žùô½‹³i¸Èo"ù+Fxyþ.Øç$þµÉÜžK©#=@|òK\ÿ4’èðO?v)×évޖІ£H¼Kô=ò +âuz—ÔGÜ^ +ü’߸izd?ü É'sùt~z/ +ðÿà{?|ð[—ï[Æóõ&Ý[>ÆùñGh¾žJõû g àw’áG\AüYâ÷låõûuÚ€Ûô¾œË¿Øäííqª°S—§ËO|%à À/üzÀï|'àoQ¾N0yùl¤~úw6µÿ¥¼¾Ž¤ý„cÎN—?‰äOZÄåߧzœ ä‹€»¤çέ¼üß#;¯ò7~7à;žÒ-¯áö_Lö¿I||?çû½ç¤ëùÒ9ä/7¢ûä§ù…$_¡ïüÜOë+È_DòÛ¾õÇ7ùÍ€ÿðÇIü;x;‰¿ÒËÓÝCõ²èÉœ›Î\;—ÖôŸÅtÙG|Ç<žîÑÔ@ÏÀ·þsÀïü À_üÀ;”àgœÇË¡ç(^ÏQ;\Büóóöv ùkC@Ï$íƒí"=WÏðòßEçæÛž_þ*àï~à +¾~¾$v>ò¹´o¼6ÚÎOY‘®§—ä¯æùz–Êa=¿œägÑ÷^£ün%¾ç<®g õÇ]>O~Oò ÿ¤ç*š‚w(‡žöÁÎçþ`üûŠ§ù,àsÏçé:s;çÒÁírâÊ;<¿ëƒùˆøvyZ¤=\Eüàoðr˜Håp H÷.ÀwþâG:ÑòüóùÉo +ûë7²ç÷S¹&?ãWrnOŽî;}c%(ÀÏ|ðë¿ð{ÉÎïï‹žîò¿|œöÇt®ÿýë¸þàÝúé@þLÀçn¾ ð¿—ìœF¿ŽÊa7ßCòO_&’ü¡«ÒåüÄU\Ï…/óösñoù•€;¤çÅú~&}0å2 ¿ðHÏsÑ»3ê_/ùqX‡ž|àƒ€_ø÷ :âö¯¦yù ÿàÿ ø[€TçG€O)Ðþy“Ûy<ù•=@Þ$ùûߎŽ“—_6ŸëÙÔoŸÆÏkn#ù,ÞN‚ïF? Ò}™äg\ÿ«´Ÿ¹××?!3÷ɨþžcŠ|>=26ŸN,¦Ë+€/|=àß|3à7y~7Ñwwÿìù§ðÿüÈO÷±]¼~çÒ:á4âÛÈOßN¼¯”®g à—“ž½3i}Eýâ'@þ—€ïüÀߦtß wUÁþØ&W_¸øÅ&ÝÏËy}øf3¿ðÇHÏåxyž¬€ü»€<Èõì¢sêO¨^Nëm’ŸHûðÁí¬AÞã÷t’/^Íå¡þ~Ðqa]týós ÿ8à/þ߀Pævžõnç 4@œB¼¾ïg^Ì#ep‹ä/½žëyšxÈ_CòÇžIßÕ¡qø. ¿ð?’ž;mžnð>ô !ÐΟ øÀ×?®FçìÁw±€üZÀ7’ž#‹Ñ÷Ô×ùm€?ø ¤÷]´oø›@þ +—¿—öóƒ÷¼ÇUÒåO|6àƒ€_Lé>AßþŽÍ5Äϧï~¯ ~{À¿Äí¬èðßøÄÕ`_k5·ç€}Ñó‘)ħÈíÜMídñí‡s~µó +ñ›Ðþåk#ñ£ãü=úàÎMÀž;ß ø[€ ø„anÏO†é Ù/ÿ÷›¢ç¼‹‡Áþà—~Ý0_·ÿž<¿ ð_þ +à{(_7oˆÞ7;Ü÷1,ò‹¯‹žCÍ$~+­÷ˆ÷=$ÿ>£ãç¿Šäÿ–¾óüƒà½?quEtŸäâë\ÿ¥Ô>Ÿ%~ý½€àÞþ« Ý¿ü„˜_9¡ +îí>½šîׯò¾ð»ªÜÎÛbç’/~B÷KƒwsÄ3t~×ú{W@ÿµt~2àg>Xãé¾v+/ÿoÑü»ŽxAŽÏßz6þSÀŸüJ÷?æòto¤vòg ÿàŸ·¹ž^®§ŸôälÐþIþ£|´ÝÄ¿|'/Ÿàû  çJÀïü1Ò?™æÁ)ÁzÈÿàGÕÓ¹PçúkFýââÿúÎ7P¾  çÀ¯ª§÷£­@þnÀw¾è?b ·ç£çkÒ° x ð€_ø€? +øs€¿ ø¡ 0?6x9\{c´Ýj@~Éÿ”ö]¯¦í•€üÀ¿G¼;—Ù äøãdÏ3o‡¯_±á:nsppR1£ë=3úõÞyKt=S2f¹â¸fCw«zѲk¦“IAº^²õ²e K/¹vÃÑæúLÑ®Ö-Ó5K“ryQMÒÛpR7knc$ÃÿDe©Y­Ž°(¡_zûïT’è£R›´Ö° fw•ý[¯ ¬2'ãVXLg¨2èê£8ܬGƒýŽéê–]4,3ã¸J­¬{ÿ«³„õÏZ²ä}öÒ¾Kæ-ìÓõIY!›ÓZé8&3¥Üôþò%Ë¿g™f™µ²;Aƒ Ó*óJ.à +². +ºeLKðXNˆ0Ñgb„I>“"Lö™œÑËî°îÛ¹¦ÉJÌûµ®R*³¬–L–={Ù¢e}}RÈM#ßMñUED!y „hr…dYÒ~.\c˜Udͨ;C¶«»C Ó(±\ñÿ6kE¤!§¢Õ+%½d¸¦î7“†9(xÄ.¬6‹.ýL‹*Ššê—ˆ’o•’()B„‰>#Lò™a²ÏäS|ŠXÌʤAk§žÍ«&úL‹0/õ¬*D˜ì3PebUŒ˜Ï£²QGUAUH‚ Q_éqìZŸ]2©»´ØB^'¸I’˜G!²J¨Áš¾ÝK;’¤¼Ò¬JY! È +YÊ’%ÓÇbDVe+å%S°mKwm›*¼iþT´ë^§O¡BB¶C9çe%^WqÍ-($k0. EIªâµ˨J†¬³¶þ­—½é… è +Mó:WzˆªµK!ÅRWŠe6  $)‹¢€B$GVPHô\Öز($‡´IyÐ?eEÌf¨±ZlØ5×(Ðüëso^ 05?Ÿ{L_mXĪ½ÖŒA£TB ÊrÐÛŠžÖJÍA’h¾‘•¬„BÐì%ûCkzL'«¢89VÙ”‹†Y· 4jÈ99BÐô%甉<¬a8j³UŽ·.òWYÔw[õ[oØu³áŽ„¹æ>aK9ê\@UÍêÍ5jE“+äùHý,±!À¶ ·b™^êš–a3±É"›$P´Y€ +3©Ê +É£úPUTÌš g*57§ðU’‚WƒWCJPÞ!' MLYÒ&ê,)’RI¡Hm&ƒ[U› ŠÖs2<¥ÒQR+d#+ç`Áº”E¬¸#Áb¿Éê%æˆøQ£Kû ˜A·âVìZ™’¹¶R4SŠ¦e±¾[ó| †W6e¶„p¤¨XH  +ɉpñÂ*jz,$ —ârJ!…K2°UÅÉ h'ÃSªXPÕô~-¨ÐÐ"Á•|VŒ/ˆMËÅÄŒåã bÆÔø‚˜1¾pÖBË{ÎZhy/¨b„I>“Ó ¢…±˜•¡£´IÒ8"RÈ7!A +¹&rÄ©ó=oÑF¾c"G¼Aß/‘sa”õQ>Œr>RÃ(ï# Yœ…yÉÁ< Q‘ã$ÁÒ”d›,Ih(I »@.2ö™DÇ‹…§÷¾˜PJdkG%µ ²˜e䧉 +ëœic&,‰°Pj1„’ƒO( ?!‰´Ü+’˜ž{EBÍGÉ"Ï.EUF´†B$A•¹ÇÖaÅ! r™Ù@ƒBXÖJv³`™U‹hA+‰ª†œ`! ½o•´?ñû[iÁA»Q5\ä‹È3“³ÈYmùá6-¯×íA ©@W\¡Ni‘’¢æ#Lô™a’Ï´“=¦!×5ëÍL¡¥ óxP©çTyQA!’„BdR>‹N^…8Ú’Täé²T…¬vMFh9¨Mƒ^¸ˆ\6:sB-ä5 ½}èÓ+(Ž¨AÏ]Ò ŽâÈh0e´'ËÐ=–aNÖÞÐ’¸aG±™[ƒb‡f$Tš{©äóéî¥ÂkÞùÁr6”Øë"§ë|[è‡CìÖFž¹Ö‰ì°·y¦Cœ¨Â‚[k;t•â°YòuºÞQhº®] x¦s´¤Ú`ßs´zcñRìmØëœÐVæ¨ OŸL(¾g:Ú„@üdBÌvÙäâŒ:…xÄÖ΢(êá†9ÈÊuHw×R½9íG& L˜º¶b®kçȲˣ¶j‰õº'åŒ-¡xìd"FÁnŽ¾n#±¢JýQ‚z­ù˜á+÷C-cÄ‹^2\ƒoöv?–Lµ“*µ2å¡hW ¶^°×4ÓUÜv’ÓP"f¨ɼujB~ÞüÓ¯ÑI(ZÛL%´…Î~ðúk˜&¯ý¢m5«LqF׬ŽÁ˜HĶ9Ù°9ÙQ›ã¬¥ŽÞ˜P´¶)¹°)¹Q›R2âX*© )5K7h¥‘ Õ5×»šé5ªØ›™+¾kÒeÇn6ŠfÒP#fðYÖÙôï6¬+,vŠØz(¥Y÷[r³¡\EÁhèU¶¦0ÊèÜ^FÇ/B9JóP<9Ï¢%»EKv!ë;«A£ã]³ý+q¾e#‚Y,˜‹æ°`>"˜ïêhMÈ+pSS‚!91­nƒ¥¡W« w?v½sC`îïÙ²¾‡ìЀ…¢ å3拼۲<ò»YóHk £†ÀGë,¶wœäÔíòíExÊ(Š2 ÉãMÈ7SŠ™-¥š>I¥Ñ˜ííIFŠ(R•¢ŽEè±-:˜´-“ýŽ'1A¸©ˆvËd¸á+{µÐ©%B›b‚P?ÜÛû~èÄX”Y#ãlÛW ãèÉ_k|ORHÚv]6›~$IJ™Z`GµÖ²;Õa‹‡:¬ÿ‡t‡M¥¦Z¦—~j¶[Ét/™_xbºY3¼=8×.—­ô9Ö 2]«ê&Õý®ºUÑ11‹¹±Ö§J+¬¡cRÝ­ºSâwôFsÌå—ÔÐ9)«R­¸Ý-ºUÓM‚Ÿ*sak².ï|ºÄÂ*’‰ñ- +_p>ãþ£¦«_g4jþ-”1èÅEö{§îæú¢Õ,y…ë¸cÌ R“L¶jÖš-Q£Tb#·eF}z_¤âyUFÑ­¬eSNftZºIÕ¶¼†ñ©“¨EºvÍõîíþÕ ˆé–Tjr‡ZºIuìåŽÕ€‘ ('$ÛH¢¢›ÄÆ>¨¦¨I&hÕ†½uŠÑ´\ÞÛ‚‚óS´*µÖÞK+Àƒ™®õ¤ŽëºÂqÒµ½š5Z½ÑX ‘Ð6g°lê$CÓ]*]ªD´ú$tj&HȤ, ÉÃh,ÃtÊ$Èè,IPÐ3AAÞ„œ w*sjé(²˜ŒÜŽäÞb£›üí@Ù¿bìy¸þ}j‡_íÖC<Ý·–Åd[ägþ0ˆ¢eÍÆÐÅ"X²l‘þ%£t÷_†! +º˜"°v—R -G„wnßqÒi³?± R#rÀ"x;ÞSÅ<¼Æ$JÉQ¸í_ƃZ>f< êg&r˜âkJR.Ý×”Xëç_QW38 Kõ4c¬L[—sœ`4­û¾}â¸B¦eNp48J} h£Öß}u†—Î~çßnU¤'6èŒ-…A§£ZÇÛ“âPÌtÕM‡ÍvcRŠ™®Ú¿26ÝᨠZ½ñrlµÙŽÙÚ°SCûujpüèïLP3km;thåF³ð©XHA"¡Qøyû™ª¼[/oÿQí£öñF¥%‘èØ<¼Q)é"Í®üŒÑié>Õ.½»1ªK·cԾݨ”t‘æ˜K¼“c—ÖiGç×u©¡‹¤ºòêºÔ’Hn¬>]·jÐظšÓÕX½˜“"³¯n¿‘â!ß¡½ABþõÛvÛ—RÝ'xê ïq ²Ý't!R€G"‚ŒnŸ³õ::kT  +t.•vàÚµÐl¬uwXêšàŠêìäe™÷š\jvëãÁóoþÔ?ýñ *Ó¼ª%Zd®s @¬NžŠ|1AÍIð`>M•®)0ž· ‚CPQJ´ÿô”-ø˜ƒR©šøøR€Ç—‰’ yf±–cãQ¿,ÞÒÒÞ+ ·LöoÒÏ`–>«o¦®ÓW*èß3Ï零`Þ #_ˆ(E¿ Ïé]8}Z¯¾pöìYKô%Ó¦÷ÎÒÛ*vÑ󫘱ÍjÚc7þ–­lÝæµÍLûøÐ\—‰^î Hû˜çGUí’ie–:æ 6€ÚûŸe7_Ž[ñ’Óœ§À+™L°xôŽ¨}ùЧ bfõ:ÓAWZY]íØüm§÷!“þjÐ5ÊÞ,–qÜ›ÕÏ:kNï¼é3ti’4)› í{¢ÞDçÍŽ¬€2á+xÃȈix, ërÁ — ^|£´ºé¸Þ'4ü÷‡Ì×nòa^{ÁÌøf×¼GæâyægËU»YkM8ÉïF´2î[kYáY¬ÌŠÊ(8nÃðŸ£[–Ésã‰zž¤÷¢ÁkŽ­/Ÿx×*ÅLú3Ê Ôüú÷©œ¼z +[á_¤ ‹ UHÍl¬£ÐƒLÓuGþŸ½+‹ª\ûGA½*š%©¥x˲”}q7D4@ ÓkÊ0Ìœ™92›sfr oîä% +š©TdZ¹vQÜR4Q)1,7ÒÌÝÏÒÏÈ•ûnçœ÷œ9ƒ÷ûîíV¿ŸS +Îœå]žçÿüŸå<ƒEƒãE eA´¢wh•bß69e„?”.CÈZsF«§§‰`ÂÔÁÙÑ.TeÄ»CÖ?æ­VÝuºà:AË™'‰Ább²Án.œC&#NLöe‘çFà‚A©áY gzX?³Ye†0ÑÊkLœÕé&oX6ƒw_~xì5ààŒ&¼;ˆ¢‘¶¬Sœ#Z#2E ´v.+ÝeTOX3Åoølzàí±ÈÊ +à΃+‚ÿåJ¤E¬Èp£ÁæÚYÒMVkoºœ†pP.»úÄ´.§  ¸€{3ãSJ|«ÕzD´TžDÇÄfÙµ]Öá‰FÀ…Œ<Ùåàmñ¾l«s9ac‹œªÁÒ¥á³qæÇîàlpœa¨m“÷±YпÀ. O)È9< •i¡@ +ƒºùXõ`ÍÜŸY¥—E€ý Žˆ5Xy$ŽŸ­ï²J™CþáÑZs,и‰<¡s°=‚Ÿ³f7n€Ÿ™B–E@açÁ€¬xÂ(H„:¡Y¢kô—DÀ¥%˜~¥kf×âBI` é‘ ¡q çÑrHFÜ:|.-Qy›A#ª'©Ͻ.J•P[C LÅ';è9+Š³1+gÜ´Qù¸¡h%‰äÊ-§ J°E¦ÅMÏ àn€¼(@ ƒ¶¸æTd9:-Á|´y:“̓m#R¬H\pËt yù+ØrÞ̲vÕE„M³œ6,2jA­¡bÖX˜Ø%½» G¦Ö»P[¦u‚Ý +Æz~&VçlL±Øå—¬Aè3³V¥v£uB„ +¹Ò +BGîÌÅ!5tŽÞ,!ZQøLø9ÄvÂÉÜ5Ñ®ušÜ 11†Zµ´ß¸b­é`íóÒÛðÌÀÁšx*òÐ#!zœ] +Ÿ AA=°‹ç@9¢Œóvp/¹¤!‘6"˜ÀnqŠìFf÷5S‰O‰Ëæf?›.X´ ˜m´ ñ#ÔA#ÇbUûe׺Nªã»bjJBgºÀÈb²vZC‡Kå„!¸dj?¬Éº‘DC|sw´$¤^ºhÚ„ûP +aµá‚–DC0וÒɈgZÄ¡#¦ð—7pFOQsQéI,Lœ´KÇ %1(9Tà‚ Ó7ø!+þCUŽ•,Ža¶€„>äÒ¹«Ž¸Ix™‘ˆðäˆ3p:ä¢ûHVYn}D¶CÞ`,&8‘¾“–G4èÙªS8x˜ Xòuø'YS§g¥Ž’O‹•—ö4„êFoãeÞ´)“ENÜ‚„Œ[\Ð#4³n!? +#PôüʲVB¦dëÁB(D7ÛÀX)‰zHZiÖai(|]ì»ÉáåÛ[Ý}ŠÂCÐhR’L“@ E&H:~Ã3¤Žœ™?F¨¢£óýÀ§Z#|M€ +^]cíÆ¡Z,öñŠÔb?ïÒ:2d‘G#iì;$S“LÒaJå)R3دa>rAIÔJÛ$ÅPU¹$R“VH{ªÏ:¸†Póå–ˆ$¸¨4„:Bûá6ÚG’›)ñt€†±!äêQqdaåQ×fŠdËY î%‘çÚ2矧] ÉrÐ.B2©ˆWK“6¦ï”íä"uˆc¯@Ыb:Q?Сyñ" ,PqôÅãÕ„^ÜG +-°M£Ãh´pa¶Fç ŒBÌM´Â*"äCI gÓ€©Z‘Æ–YJœ~A*Á(Ÿb!_v[}§"jL­=1 BFW-â #J’à¨êyšYƒ Õm¥¾#0ר¤ˆZ#ð3¡¸§ ñ`vV â: +Å! +›Ig 6&7ÿ‹ÜÓ X÷£‡<¾¼ØÖæ›”X‚L§X:8Z§Ü\­¿£rã""1ÔeȲ:"QT†SÄ€¿"ÇN¹üÂãæ"Ê‚Hžƪ”Q™˜SC@ðÓ&ÊrzMz¶sÅ‘È +)oïHWÏé=V*8\V·€•°nãÑÛtèë=X¯s´sÒ 8ñF’zõ7É­‡i½¡(¿Öû •q0•Úµˆ äi¬têM +Ÿ©µ|MZ~¹=‘{;FeèY£Iûnü E‚5¡#ë”™Ñ ”äÕ­’ÜÒþ P£L¹C «.ðtu.3Š­Âˆ€Í€YäÁi€ +¤ë4:Þ…÷ Ðî_æ—Š¸Ð(÷ðÂSÑZÞf†–³°N*“õ˜pY Gz HüXä˜xµ–Ð"[U_×ä9h€ÓÁÔç/¹ëвHg\ /ÓqÔ§M/ ì njɌ¬ÄtI Kp†X-‰žÈ¢öhÆÔ—üp0ÍŸ„Ây:ûT‘ŽÅ ¡c Ž%h¬*d\™³Øm`ªx +«HyŒ[«†Bˆõ 3q9i ãñþ2²oû¡ø£¬ŒŒdÿQèžtñ"ÚêXLÒT$&î2*Ó|naàßB^Ý]9¹cù §ÍŽaÄ“¡—æEC x´»ï¼èç#:êÎÖLRêXÎÀì,›!ä¡Š#l¤HÔ$ÕžÊD!1ÄoPŸ<ñ–µB–t‰Nå9Xk=á1àQêÆN© š€¾28i¤f`RB€ĘW Rƒ+bljÎhºÍÙlÌ6›Ã-vFb}¼Ëc}žòH`Ì¡d×S½—Éñ\:mþ€³f¸%ÎŒÊtÆsÙñ¢‘JÊ„¡”’ß"-UÌÏi“|ÊÝ‘!´€ óaFçëð¡ ^–½„•”5rHpKŸ=&©ZJ²¸jÆSÍŠÃhGˆ´N&—PÑ6ˆ.,}»z½ì”#*íVw%+Ÿ%˜Žã&*pê +*ˆ!"»„Ñ_ÅèÒÞF9T|¤äF9ÿ“¥˜Y©ÖbD―¥aòš2¹Ëýmìm»C¸˜Ä—%8€­S­J%¯Ñ-6ÁüiT¢]¤dKÕ{ƒÜ0/Á}Û$†ŒåDXd¨²ª +û(¡Æ’®VB[’{býc¡ÛåV>B{nF!!!fÞDzÅ› lŠ9¹Ók³e¾:QdM„p’"L=GRU¤ù)^¨g%ÜÄZøW_ ñòš y ÂHçË ç°ØƒÝ4Lº' £ @±{4LP@πLJʽþ¯À ÞèKÐoy`ðŠŠŠ€?C¢"‚éŸÂ‹ ‹   e‚CB"¢"™NÿpAêÔ ¸?ì8 ¶_ûüO¾ÿ¨vÒ® ßoÿC`ó–Ðp°ÿaQÁöÿ÷Ùd·ø ßkÿCàþG‡…?ÚÿßuÿÉ3ãö߲ ŽŒ ÷´ÿ!aQxÿƒÃ#áWª€OCƒC˜NÁöÿ7Í–×¼i»¦à×æñƒc’ÁO?øǧ1ø»ãÍ:ø=ðÓ‡ÆÅ0uð¿eäÁoO·þÎ8ÿ4ˆ~¾0 ¼ÙÄŸÛä”o»–[3?]Ä0 ¯ÆÇ HéQñfžÆôΈûú_èSy×öÖ¦²Âª¦KVœÈbhŒÏ;11¦­Ce¶jãݾÑëU±QA¯[q´qãÑ{W>Ô4¤8­Íãk‹Ëi~Î5±îÚäwË*oÝ,âKGmOð½³{>?Esøú„Ÿ{NjÔòÒ¯Ï6é[Ù¾vµÿ¦êÌYѯÎû>gNÞ—»Gý|çNíÙÅÁ} ~qÞJ ¬ºu`ÿW£ ×û-:ÁËï£Ð-×}»fÃ…¯-Ò˜O.ëq³Ké¦àèHíí_½uáÝvÙ7n™óVút]ƒimžÚXÜxÿ· ™/,Ý꺷äPÿ‘=&%Üf†¯ºw&­æÁ{e÷g®Ÿð‚ñ³u9ÏõíWð Å´Ù_T~zdÛìçJ¿;ÖióUi¿ßÝ2ogû³/%Lt”œ¬ÕmË{qmêîÒ^Û/ë§ÖÄ2†½fmzgŸ¯ãkgxݽS<ëJRÅ3ãó:Qk8°«[®}ö¨ŒÎųòǽQZ³oô+-ç¦ähžü6´¨UuÇÚ\×Ì×–­?Y°oåí«Gr«¿cYÆ…}m§rÙMâ2‡¹y®÷–xÝÉ? ï;£Ë€”½y9%ºŠ–uW½Nö…û›ƒ#c¸×ï?óYgŸŒ=£ˆßU×µºî©γ?嶪Ø4èþøKÍÂç”Tx îº0ú§ãû;0Çžšîj‘ѽ|´77n¸WƨEŽµ½>b^Ä“é·‚vÖåøwý8¼Z?êùÀöoÞ,tvl^Û³ú@ÜÞœà—}&ø_ªÎ >’‘Z°"}ö[“Œê¶÷øOÛÿÉQSK?Xsÿ›S“ #ÃGøÆåøuz0àìÉѾ“Žé{ïãøMÉ-O™²òÎ;M¾:ÝqÊ›yAë­4V”[ºÆ·+n3„[´'`ÌŒ1-6_~ÞúøÅTæ:oí¿öâ·Oü²¸ÙêŒJòßí·>ãÊc%ûn´/{ks æò¡^*†ž¯ÝÛû¸ÿäu)kï9 c ª¯|·ekf³š·š¤†–[R›å=ßù×Î_;nœÈ{»ÉÙ{QÎ=ºë$T«øØĘuÑi9büw²–îÀ£Íþ÷-ÀÃðÐ}ˆÿ!Á‘¡À€øöÿÿ(øïÍGǧø€×$ý,€êÞÕs÷.Ú‘1zx›};j/oØ”t°j×K¯qƒu¾³Ö|>{Û®µ·ëµñЫǿéßéИÒFwžûü1 [ü­áµa_Ç®íÌý½S¿IcîNùñôÛÌ«K…=ÕbRÿ¢›÷Ÿþ~ûÜ{½gíûaöèµ™£>9Vc±Xú6bNlžº|ùò)ÿãìõœÖÿFon†¶OÏ~ýžÞ<º»1²°kyAú¼’5k^üfܦ¢U«V½¡õŸ_W½gå ª3sýPÈ-ÝZœÜu€Ï~ £}ö¤‡œ»™Ý}Y¢qó–--WV&­Î?Óý¥M£ï§-=_‘þY}lÛ"Þ'`gÏ8?ïŸ&wœ¡õ+udýÇß8{•1L»/¼}àÌéÓ©‹Bs¹Û¯Oåô Ùà°uWrBfD¿÷Ó‡cwŒøDÄ—úKÞçìšä'+5x1«ó$GW…_,ݾµ_t§ÑË’›FûøÜ~lQrÓ!]w=ö…éV±ôð…›mK× ìzKÃxWüØzîÞôõ sòB—Œ \\eµZ«}c5 X‘½å„ëðáÃýR5š©e +*/ÔLÈÌLm}¤$eΠèÃ=wÇøÏðŸ¿ïŒ)¼Ô¼å„-?y‹.eÈ›_œùtÉ!CKó‰Ä=?üÜ„ÙÙs¦åÄÅÚ»;ºä}ÉnøîãFÒâJsG¾Ÿßå—ÚZÍâ!ŵ%)—{2¿º¦cYêõª´à_;o»ûöõâ)^çK;”øê>÷O…v^ÿ7üw°úÿ€ðPü§ð? óÿˆðGøÿGÅÿþ'%=6¼ÍÞÊÂK/0báñw¢§µºw´‹õdÁ¬]¹ëÆüã«ÜòWgMiZ[¾Ì7dü›íw4 y¦üb㔥>);#-ïu/¾vÐyþÐD~ìÑèã%¤ÞphÕžœ0mC`fé{!ï÷ï0û`ÿÄض3"žmÄ°•AÛ‚ŽÖtÑÎÖha­f炧o¯X½xßú%úô󆳼˜“e“SúMÞ¼eê¹9I|ï #‡LfÆjËgfŒ<¶!lË‘…—|c«çLËpuœ~aEyrý–_kF¾zcþ”óŠö7b65Éò›_¶-¬¯«HHÉ„êêN-—.°4YÿãKG ¿ßÛ:zW^h¸øéwã.\=Ü–öú´‰ÓŸ×}éÜü[ï(‹½púkÖÚo;œÜ¨µX"—¶¨Éy·ÖùÆéûT½˜f¯½’ö—´¦^º±3c¼oøê¿Y‘ÛülçªOþ·A‡];_{âók´G¯óšæãý®ÿ‡ÜîVû¶öoØf¬Í¸-¹ðè³Ó¿ôïÑ Uuç džÛËjúžúºõ³]Ì +·Æ5›÷~sÍàÁ}}kò伴˯z劮ìÞ¸Å'j™9ËË–ÿkÒ¤÷š{o\pÖ§ñÈçí«ç´àìGƒ7¿¶üà–Cý‡ÎÜZé³`ò€vÃ6ž£×ó£v_Œïžµ+íT’cRÇg–F\Ê¢ýÉíÇ:®Ö%½¼ãéy•§‚g¤Æ¤è:0펜ºsùjYªkÍÜ~‰ƒn_½t¾µwô•'Ç<² nüçíœÕÊ:œá7Žÿ@ØGø~‡øüÿÿ¯¸øA=zjÐ_èÅìرcÚ´iàݺºº€ºf‰±)¯ 0,640Ø«x7භ/Ãx1Ýà‰ð¦a˘6]&V,Ol·ñøÜ §·©SÔ<`áÙË©ú9ËÀ1“Úª3߯õ ;žÎ·Dü}Ãé>žŽYâ׺[úÜEÛÉ?ÝçqÇ”lõk]T`Kn¯Ñßkã阊k~1ÓV–ûyÞÆÓ1âuŠ<ÝË7ೆOΫ +Y¼ÞãxÜçÞèakØû ÿBÍÐê×ÿ°¨ÐpQÿCÃ"ÿÙÞW€UÕmko6Jwn))i”–F%6Ý‚º©MƒÒÝÝÝÝ݈´´ +ˆ +Ê¿Ðï|ÇïžóûßçÞ{î=ÿÏx6Ï«öâïxÇsÍ5çúŸ“ëÚÿÿyþß +Â^‚âSíòŒÆ¦;[òDz#c£Ó»“Úº;úûá5¾ïö÷«[êJjÊs3€Jôi±SjoBP(<3?ûAˆ˜CI^^ž[‘¥QfeeeÙPIS[³K²W¢K~yÌÏǯ̻®­^ò¿üipƒOJS‚_͓ұ¦¹Æúö&ï,硉«}­ùÚÑšWán96¥6)Ýq®ž®ÞåŽeý%FFFC“#1æYUÙfQúµ“ÕN.Î-³ÍöÎv°*·Î×ÑU¡•µ•i~±UQñmÑù9/‚|+´Ï0‰mŒÒy¤­»ÒÒÖòzîíèìd`h”‘’]”gniÐä×™>˜ø¬Î9¼= n®¦|ªØ½Êºe±Ù±ÌD1X$©-–׃V ÆÁâDQœÓ›¡­d‘ü¨¹©ÙÙÉyxzlzzº»»»ª©ÖÅÕ%»0·º¶:òetMCm÷`og_wïpqUiECuqqq}Sƒ×Sï¤ôäâÒ’þ±Áñá–ŽÖœÜ\ssóŠêJWw· à§°gѯb + + +r{3õcX¥$·Ç¹çÚEÕ‡ädg'%%ÅDGÃCž2J¾àæp§¼û„ÝBÒ—««¿§fºêe[ØÈÈHÑH^`ý󄮘¨VxfjIIiådù«—/f놇†úGGg'êêëšÛ[ªª«Æf'¿~ýš‘—õÌçyiYé¯'^ϼ-,-Z;ÛÒ’ +‹ +GfÆûFʧJ"ƒª'+kgªC›_¼¨ö2ÎTiôó,·ËÈL«j®-®.-)Î.ʵ°5/ì͉Ž‹Yß[MÊH~æ÷¬¢©Ê æ?˜•‘ä“ýddvÜ"YïUcDIyqÞpvïH_LkhsgKùXIGWvnVÉP‘QœzùDI~QÞqûxÓÀXdQH}Kƒ·wi_qn^NiEiaqAzSrvvvckS~~^ßè`kW{×@OM}MqIñÐÔèØÜdyeùÀÀ@LLÌŸÆ<@¯/êõ•›€Ð/A—ßb »“ôÏÑñ™õûË3ºqhå“e+2{BHÈ +_È¿loÕ> [™=èV¨~¶egb<˜ÌäL‘”Äï|ï~U^¹Œ€_¥§KæíjF"ÆGƒ.°§*YòþÌË©ÜyV%O‹fK4›˜G¾ò2kU@ó£Ð”ãë6:ï8å–.5E·,é)O.µ™Ó¡,²ÄR£᳘‰Ýo틤Ýqö8ZïæV«õ^pÜêO¸Ý{Aêd1Ê=ôi;.~®ò…Þ2ìýb=“cÌH9ý›ö9®½Úp,ÝhƒÒìŒ'ãY +eZèÎ[£yÖeÏ(ÏßO6¸_j¥Rz»m$OÚùñúœn´Í}ÎhývNé_ÁïþvI4Þþì£T†!ßÈmÇqÌç¾65«…‘ž™l†?¦q¼Ñ r§øô@ê{$™A7ãXŠ=×ÖC8žDµcòÌZlбuçgaÆÌïl`Æt§CCg´ÕÚ£dt`´ù·1*¯«úØä5L^j+ëäDkcäÄêÑ,äÄ)û’š!4ñìnÞ.v]ÛJr€¯ö&»Ì’p8línqDMïæ‘GÕ§›§¢ˆõd1ÈKÓ’ oìdEŽBÑ©àšƒÙñʺ™qÆà‚Ü$š×yá¾dÌ„ò<ò…"Å>k{Ee÷.Ç{‹«gÁrå[{V‘Ó{Öä‘$YÖ¥RR†=ý Ö=4ž«ïªÆב‚*™‡lªç•õJjFŒ1Kji¼JêÆ|ÉK ï»(|.v\ûÐôA¨·ùÓ¬PçáÖþNüéý2R|œ,ûÖvò.BôÛÅ´Á‡‡]8ÇÎh`­PŽ.\sáŠBh2g7¹sryµEe¿Öê¤ÃVÛGTƒnÖcb•l£ã~k‰Žaá>EŸÛüh) ÜŸ†§m2>M*ÚgôC¾HÝ9™þrˆ/;¥-ªt2« ]ªžÕ{°T3§àGé6 iéÁªMqeu6„u¸L¥Ü$óØ.qg`™n~_·ÂâyºjabܱD} ‰(ôî~",~‰±·/µ”Ǩ]…K=ßƺ‡7lE8/{n¦ù-×ïd=xܸ«ý¶Sa/¶¬§›Üþ¥‘€ÕÛÒóIÐóƒöÅÇŠ·›ˆËzË.DÔ×.ŽÇµ|úo}T·ÿvòQ}UìÓ›ßN_;S·œ®P·žÅ<;ÙÎ2@!",ŽøFá|Æí4!&zqzpy º‘B“mG$;„¡+¦#÷·#TJ`!b ÿêЈ Ð À¡Ï@—odÊÓÅ}ïÌ£ÿÅ¡¹„‚‡¾S‹“_–ÕAi™8´œO:]ŠÎ@åæ ⣙$¹*3:kå½7 ãÈ9¼b~`¸IÜK6†™þÈ'O-榔w¼|ÍÞ´Ç Ñ…ÅÁW,‘ĺî‡rîú/TYŒ`Y¢[§.ÖÏ +8ÒÖÚIÚG½ÙYÒ* µ¶~ûª©tãfQü[ÄÒ@?˜eØáû3n®fi˜pY½‘ÝZëæFD!-ÎEE¨V¨ÏĤÇ ¨PA»Ãï¼7©Ø7˜&†ùŒ>7"ËØ[ù-í­©<•*=¢ê½¸yèKƒ¯@üBø§ï˜Åj‹'àÚô2±;l ž<Iìö 8TYªceŽ:'Pë +ÂwçT£¹'†[,›ª¸ LãÇýB +|åf†±ýá,ùjE­47ãÍF𽔚øˆç„h¶6ˆ-BVÚëúe«H €¸ PŒ7øŠb-®¬"áÔÉÁñ«]T4’™Í`¬Â|ƒ±Vù*´E{]Õ\ nšR}Š'Áù+dÌdz Y«:>•MGnúTƒÕc7)„„ûq¶ÏŸ$£(ˆèMR dúÝС8ŽGl¸@ü +4 »‚,1½ú +2i9— ™±–<•¬eÚ£[ù3i€DÍÖìkBÖhÀ‚†eÅ UŸaÍõƒnÆ¡rìëƒ)äw»ë‚Âx†‡êoÛ½?#aŽN £VF`\Ï>£QH¥ “NêˆG#ó›Î­ÚK¹‹ÜÿƒdjÉœ·ðð‡ûS•ô’áÞìkª³D«¾W­þêçÆl™H2Ÿ2Ò>„£$®ùÝqèjirÿÀÚ-M&å"›úåx'*EÍï‘LÙj}(ú9˜+á¯pñ]3ì?Ê0©ÿi†ü Úqþ>ÃBtÿ>ÃŽ ÿüwþ.ÔÙÑþ>Ã6©ü9ÃT¸t~KG¹Êý9VÑ~Sý£•ßÖ›ñg cú#èg˜üŸ1 ïÏ&%鑤 +qƒÜH6H2¡&…!k]AM$Œ\d–HZ…Z<Ÿ Õ!¤[Qˆ] Uæ±ôËG9Õ»SZÙ]¡ž¾ØlåС­Ê'2RÏ|jw–G¼BB‘‹Ù­}rê6 ðTbÎò°b·Ç³ »Žtõ«Š½+£O‡qIñXø‰ó%Z›¿0Pic7[J'¹œç8ÔXì¯X=¾¦Ö„ZÖ\ÀõåR+:ƒ¤Û/"É%Û›• ”•ô9à®Êœn Êêþd9µ.JFç=oYË—ñib=RWŒšÈ’U[e© 0J6…™p=õJ¥Õ’.D7ÏE™y3§X§ +ûæZFgm‰óØ)äœÑlÇ{ô茾¯Ú`HzÁb/J×|"e}t†ë9ã}Ü…õ>Z¶cQ§®ú…\e¡˜o…ÚÊ*}¡P(ã¡Ô;ç+i‚ÚNûËa9}Q³.ܪ$’ÍõGë—ÌüùW‰@PZ@Ÿýù*(ñ¯ºä AúÀCˆ¸ ã'¹dYUê0n,´Ï·Ô¯rò“ÈâÆñðT/€<Í2ëHÏD ÈÉs[n±?æ›ä(ËK;–¨÷l`ÄnÍ’YošÝ¢Ï’ºÈ”O´÷Kˆƒ£n.ÖXßs±|,è uEžONéžÁ;‘Í@‘=Ø”¾µÙûc½ú£^¸"6dyz‡¯ò;¤UXçû+6|D‘Hå*é䈨Ìédh©@Ÿ/ TåÅLéƒ)å«-º€Fd|4¨4"C6E^ƒ+K»Ê*¥_F"¶Ì°Ę̈Ö&#®ÊbêICcMÉb±—a¼B…4‰fphí‘0Í,ѱ_ÄVó4K¿ßy«“§¾Ò4F£½0ÜPõ +]ŠÂ‰TéIuäP¾KóÆ|®¼LéóaÈûEå¢åG éwÚý0WhhÅ»9û£œWG„FˆžÓ‡¤ˆ»ÐÚÜà^BH¡ŽKú Õû•6„óç––ó€_ùŒ + ”ó‹û;P$ýhAñ?t“žZ¾éW…bòá†$(½íw#ùÒ¦4ÐÊŸVÆ¥/PÚV¦cóPš6¢–8‰f~¤‹=ôúÞJVÍ™J9W‚ t%ƾÄS…ÒB&E‹uº(”å2u¥¼$K¬å–­´=é T¬7Rf<–ÇÂì/’‚°_ÁXÇ©±3ž[Mÿ%ZÀç£GÖø¸ðÀýÓ¶Òjö}BñŽ’€`ÜvÓL>oa¤éÔn¶ÌªÉØv´Ñœ¡€ÏIžH¥hۭ毆há;–+£)±xp +ˆ”.<öf§¬¥8?=t€–òÇZ"ïW¥Œâà\Ÿ®Ë/ý×%v°XE:@vÌè‹HF ýøFµË¨ + æâ€Ö†nú5)5IÞ]N %ŒÏ\?æ>ë´øUT©aœº¥ŠŒŒ@E_.U0WfÈþ1*2 »Nüþÿ8€ìO¢>±/5§½®lq.ÊSü#ªX„Àê*  @J¸>!=*3•Râ•{)6VK)Mþã‘×`B¼ÛMµ¶l4nñË#I«”ØZ@ÍõÌŸ’#8‘Ñ[g´ùKšÒ…»#ìã±€ëÛGE‰çB;CØ©E͆íîP^øå´œŸj'RDÕh'œŸÇùÐз€/ +ý—<ÿùmRºÆøžßÇÿóqü|þËq=þç_xüÿYÒaB `VüeüÿH…)Nïó·1›ÓwïLîsI"Ë)ʾqÄ.B÷…+)û¢ 0K8MÝ>Zʼn…¡awˆ¶âˆ4À)øöŒô{Êâ#Gìn 5qO-ÙŸ.Úor$•«cO£iô¨iÊœ¡}âXjŽ(Pt_9ä”Ä»UêÑòv†êËî냦íÍg“'{ï&0Íž|]úÌÂ.–‘P>…Ún‹%{Îò¬¼ú¥uâóW¯wÞt~túK_ÙŸ±U{Ÿ$4ñô8L6㙹þ=£2éøϬ“ÞÉo›ª&l³ËN¾~£A&¹ïÍyü6c#ìþÄ+ÚÆ îÍñ™$œÞêlÝ_øEt=B^ŽËù=6¢0ðØ+©oþ|ÛŠ[ÄièvïüIDA°q§¤LÃ÷‘ÍḠ³Ëwæ)yX¢Ä¯ß¼tN1’f‰p?-IìžÜ¨ôž,ë3ó0WëìX¬¹O[n]—árñDdM5^´>no–ìä3T|ŸR·ïq¥¯S< âÁÅÑ"-ÆײÖЭpˆå¹Ä¾ôþœJzšÎËÀÂÌ,‚}ÿòOf´K£X/”qê¿^`²siHRÝ”øhPd²ôöÕceT¼Õâ®Mz¶•àÙoæJœtz:¦, [lÂÏ¡MüSðěȔèýÝï‹ÑRø›1 +ª{ÃJ¢\ñ’±[—Zk¾?q¾œÈØtxc3S¢—glVÑ ÈäÒ¶/¿×Î%½0ßµgÆGEüa(â{ëNd’êcìJ©m5¡ïR§b~¬]a2» ¾þ/¦”x¢²»Š/è ¬Ÿ^DÆßËÑŠ³ÛðÅxÛbçnPÂ˯(­šSÉû¦4:,lò|oýàö=“¸x·˜ÑNnˆy˜Ã`Ѩ²r$ïË2áõm÷2aºm¯uϛ޳Csÿ¿ _úÇã?=MmlìÝÿ³1àßÿÉÅùûøO@ÿ¹®^ +»Öÿÿ­ã?Ñÿ2þSIV]• ïùéÈpvÞ´ ¢ê`n"W¾4 g/[¥.zIf»®T ¦.r ¶%¾ÎD _><zßOâ/©s˜bøç½M¸í{<–×y£iKE·õG[.W6)°lÜ‚^ûŽ…x~Îæt(ík&[تFÌ®\N{Èâ7fP€Þ½Œƒc™½ù=¬]ö¼cãÎÄçÖȶRB˜“‘ÏÂ@Æútw“?‹»üÑ'®}PnD{ÌbGYÊ#âÅDw7Òy&úÓIt»בnX«§°×÷ÙÁ[‹7V ¿6¶Ìy5E$‡÷ùd¢w2¸6–Z·úfa!<©&®âˆÝ_†ýùÊ·T—Þ9ÐVìÛ¼ð¥TL#û%Uj.}UÙHß]”/F\)$£ÉPÓy>¾wù¢Sý8eÀ죙_Á·gã„IŠí;çÙ'G‹iÝ#6ÍÚšCûD–®ŒhßZ»æ;SE@– +£Íg6Kä Ì÷^Ê/Ö¤Ž„µ)gï©?#úp=ÖóÿQý7¿šÈù?]ü»úÏûWý¿Zü÷jïÕü×úÿ¿Sÿ!¿ëÿÕøÿ€¯<Ê×Õ–¾d!ÈÙà ùP8Ï«îaȼ4BYÖš§½”ÁÁÏÅêØènÙ£ƒ×eŠ¥%­ +üÝÒß»˜}xƒMü‚!§q‹î¶€@ȶw3{ùŠøg¾jœ‰±ˆ¾\v%÷0ºp¬&l帬8ïÀ<…ôα!åØÚ’smžWï}®ŠlGtP¹í+Ž6®¹³O¦9‡ªôP Ó +‡:t¹·³]z‚‹æ¾Ž¦4§³TbÅ•unxZ$F@eÆ^lš¼u°tÚ Ê¢“Â4äÁozîyÑ}RÕ•÷)±îFoÑê¤ DØCœ0¼-)ø™ñlmæ¦ü s Êöµ/sÊ Iuj´ÓÑ–?­ÏÕ}òxµžOQ($ãÓÑüxÏNÊÖÖˆ^æÎŒëÍšû¤/Ad9“miy&t¦[¯ã©dZù`ceXqžédôÙ(W¾`f›ŽSÂ× WµbB>ù]6¤Èa”œj¦(DHrn¼n ül&‘øEþ;yæÂÏÚHÉÎÈU +VttŒ|¬æGŒüÔ‹Eô­ãˆùö7=ØíÐ;60h%HcIÑ xâbúû…;GM¯.…ãZE„Ê‹_  Üœš‘¼5#éðvò7r,0»nø‚ÍžrüðëƒÛˆ ŒqìÜ“Å£oëc>#‰ͬk}6áîKeZ°Úüц•B Þ-Û|þÅõßØÆÕôŸðþ/×ý¶ñÞåùñþ÷uþÿ¯ÚÿC„Š¡'ü;„°ò³ÿgdRÁZMœíðr¸%[Î.º¶ºîGÔXðA¿±\ïô rf÷ž9.“±TmÜRý Ƴ›9ìÝÍ<œ ٧ʠT}ÒÑlNïu±)HDG)°ËüF Աɘ>D¸“ä‰à0OÉ(q½Ó¯Ðµ=mmÆËoý®;Kq¢—c¼ùá«UîN6„„›å8‹ýÌe)~2»¶ì§Œèq–‘êæ]TÑàx¬\à–Aè- ‚%”ÇÖLXbO8+ÆöŸ {µ/p;$–>už;^¼¿_²uþ~ôUQ³ŽˆìM§,[ÔϾÕ:h Þy&’–w¹;”VMx—PM\=ö,qÚk¡ÿW×K[#çÿ–yàþCó?ýÈÿ¹¹x¹®çúŸhÿßó€ÿŠ?ÿwïÿprÝåýÙþw㻊ÿ|œ×ïÿýOÅÿÈ«Ÿñûþzý?Šÿ˜øW? Äd’_â?%˜„_Z㪠ÔEZÛEòç:¢ É3þš@®fh…ÈÈ)©hù`ƒ@xôWI‚Çë÷)^.ä› ½i ¶÷'û£)õZû½}ôå`b5]ùŒŒòò÷>Œšt_¤²½ˆ»£2Çt¡vè!cŽHÆ»T ½ÁJ…'KÌ›ä±zäxx·×IzŽ–bï Eß'“ãN\Í|K×mf2@5°âŒè¼>aûiê´å༅¸°¤D WÕ'3k‚±S +eààÔ„ˆ«zëÄÆñ ÊÇñPF “Ê&N}€ ¡™D«áUwÆBq£ˆ<@í/÷}&,¨Ùôe?¬ +kî‡S +\*ÇèIñàã‚ÐŤ!4ˆ8¸AAA )) Øþ÷wh„+Þ÷¤U« ¥œ`„rRàIßÈ{H¢ƒ£E@G€"àÆ-í%™NÑîtäï²ë#uŠu¤(æù"2Ì3ÞåyŒz$ϔ⠢;ò i˜†Ð¸¥qÛn¢"€nÀ°b{ä›(Í…R´ß;¤÷˜Ñ®8Ð#D™ +s ÂÍûzqÔ^f +›“µ‹«vŸ||L·ŠÔ:Y9yìX{ß%3¤ñÔBtc]èÛ7ô§ˆœ‡­^™’2"(‘•¨xÃSÕÉèÎX—-.â Jú‹ÌÕÖåÇÍÑ_¸¶%ü +'Ç·WM±nóëï8­I¤öé`¡ K¾ÇCn&ÇBº +VÄn‘§ËÉuŽˆˆì„öÜpŽÑym8¾ ë;šŠÂ-ç «¢ÄJŽkXzïÏXXÜN*—sèçƒÐü¤3bZJÕ£¹†PËS˜ÞS©°¶–Ïüyz¬¿´ é]7wèsáÇš)¹ HS(lÄÊP®Ö¹HÖ sZZ61c²¤hÄÃÏpB”Ø—½NùFD¦B¸ÐÅ÷J?41Ü·d£6 «½D?Â?¶Û8üÜd¥}RQÑ<~ÉÚ­ú–JFÕë%+=O¸‘Gòv†_S(…¿o­Ý*_AÀn¶¶¹Ôƒb,@"W‚¾Z +ç¦Ä*®\œè¨´¨Ô A‰’BÔËË=œìFÆ‚g–ö-«kiq¡e˜€DÞ¬` Œ•A™úÖ¬"Ðö=¨‡ h0àÓT†ú˜à‰#7®ö”‹R¥¹Ùßƃûbg©z{H¨QŲfàDE„wøȉtKuJ,jÆM*`Ðø˜TIM ä‡L¡rxOð1¼ià;DÒïÂ{À`¯jí’³ï™Òüs»¬ììÅÜD]çµl©F‡ãþõ½®ƒìÓP¾.(4§Ëq2l‰:Ä(b1”᯲vG™òÀ¾›à} [NÙzÏvKDEdJŸGi3‚ëfæ6öONèE—™0ÄÆÂÂL¿éùõøn+ )ÅáZe2»ð—O®µ+ݶ‰Z¤Å½`"ëù,‹¬¶ë²`ëWYH£ÿöô©ÿbØyb¢Ù½Ç.°h¸ïÒ&ÃFƒÞ©÷ï¥ µ‰(YCÚ +Šü + ù!ðy¢`C=:_Q™¬ rï!–ÚYþ”33(­fœCS"!ÌM* §ÒÛÓ—Ï8aéñ…!‘´SðY#*#®,4®ƒ\‹Mƒ €)xµ€un‡ipü¤"÷ÅÄÖŠ,Nî·Sæ€-+kómIUÍ+§s1VƒÒv»Qc .cV˜Z‘Lt$¡™Œúï ³æB¦ììV*ÒÅbÓ׈ ‹D7]‡cµžlm:­ùl™QI7ÇU¤ ö@Ð`=¬!ûVV¶®¼'{a óæÓ6çž~g=i˜¬´0Õ±É/B-w&‹sX1Œƒ´§É’lµÔ.ØÔ‚ç4µ Ge|Uˆ*WƒdÇœ…¯uˆÞ³†°³kƒVw¾,µzPœsŽç¡’1 ñY8<Þ6KÞtX•ˆÃ$>&+Ö„Úçõ<ë´Y~ °¹|È€?ûñB·IÚG4 +f@àH—Ð ðpüû\uL”÷CŒVk´U¬ù²–Å…†Œ41ú^= +8±b[»s¬¿ ÚíŸ[AwLÿ ÏB0¬œ•6Z™¶€1R'œÊX×’Œî–»Æ•ÀÌìÞ´Z E°ô…N¸4s°{7ÎÆŽ›ñntšreø™:>a`s X²Ûyÿút¤ÚS [½·æ‘ù†.wÊã©{hô#ØqÍ… âww+0è°ê³k¢LÃœ4šEÔH@†åÝ„¢Aœt¤#þÇýÅ|Â}XssÓ«Uvw·bà­¤æμi]ú; kíú5ÏEŸ¢¿õÏ0î@‰·g³®ìöºÞS.¤ðòµÅ×ooéJ÷÷É4D5`}ºzkŒÎ28 GíÇåæG\ß= AðŽ±ìÚóoO÷†î>iáïó™¬Dí—Ÿ:“ˆÃù¨±±É?›¹ôÇHŽ |7Žíy_Æ,'¶^ûõkñƒ‹¬5£æ—¼Ñ½ôä^O"§+>~%jcëoJ5÷6îmLݼMý-gVŽ”Ö™Åsgº”‘Zž”g¢ˆÑÙûŽ+66ÓÞ÷£L?‘î„Ž”Û]p.í¯]v…*nLZW"Fµo¬XÚ¡Šö!ôŽÐÒÞÞ䲞ÀBkÝ;Ùjfˆ”_Kq ±!á!ŠçS\¨}p´å¹}ÁMN¹Ýµ<«éÓ$T$þuÑð`áù7¡'ô…ÉÓ륗²yÌò,/ô¬YvÔ>6ÆÈžUÎ3<+¢tÒ}ÀpÛ1v)<éc»³§éÞ~„ò^òi#Þ,Í›sV±•Ö—až»Ý{Ö–ƒ2§®€æAV7´ox!#à“Ã_ÛðÙèTd²‚¦ÕW-htÈÚEZZ†¼ÝÀˆvï>ôp†ÕÔœ5/Þ|“›JN>u3Â?ó°óŒŸjgH¯ö¥RK0rïC¦iV”ÉBÀýß ÜN,ºMÚ>ž=u¬Ý€ëRÜe’«Ï®â¶þîÆäj.‰ôîù¨V:T·ïØúÅéÍÔbQÁŸ~Ã5fp ´!cΡÌ+i@¿*rvµwp”ó(  ŠÉkD©¿Ü¸ÄàÚ?ú…£\çgŠË<…)í·Ïð£N3[Á>ÌÏðo¬ ¡ò,ÞØdÍu,ò?¡Âfsmh]p 4ÒLßè~HЪ®æÇòÆΆŠ´ƒ½¯wË„œ)gï‘þ;§µÊBf ŽÏ3óó›w -–šËðfëdýË‘£05º!¿Â½š¨T§x•ÿJŒgw¥Š|¼0^}#Šµ¶^$ +[ß Æhá5íhZ¶Ú“P= % ²åÓ“¦6%±Ãª©)òx/ÌÂFÓ‡¢ ´B¡pٸ㎫+×h;æÓ( „aŽg2‹(Âc¸HТå®âÃDœ¬¡z4“\üKÓ¦¤rÒÌ®”!sÚdšpßE“Î|ºM%°Æ)ïÚÞž•„\OŠw² >{TûæùçÝ'ÃòM"Öºà ÑÏ_oQ““MRò¶®lŸ«Ðdz¢«h — +QŸ;khóuE‚\ààXsSAp¤8Hðuϻ֑ÒJË–EÛÔqäté-ÄÆîeUñmuätRFF¹³åÅíc»Óä»64 R)@cö™GÂc·qvÕz4/­½õçNÌMÛc%|ÔÁ24€0¯K‡ÊãÉ› OYÕ—3ý*}6ÉP•øSÐS‚0c•íŽw# v¦=Ñ™…´eH6CQåÏß¾”0 sqÀ^¹ }Ï(°ÔTóÂËÛáM©}ÄKø<ÁZ‰ +º( k¾Ærªö Ú¯#`ÓEnê8dÆK¯ã*Ñ¬Þ áå5„㸦FÒ½yþ6èÃ\š2à»üѲ«+B‚7–¶J×CwJ=¼_ëV'ƒ×Ú?ùÉ"g ÷¹¨8:?ˆÈØ~¡N!¦çúÌg›Ÿ‚› +óл¹´ÔøÐE'1@§«Ð]–àHÅ€z¡ÓLaÑeôv“[@Ѿ¤¤ÇÃ.G …©³=+ý]7 ÓyÖÌUÃBÕ#)yÅ:4RÅL¢UE$¾Â|BYUw3q'ˆqE«s^úHÂfðÎûeÄ‹Z¥ÝmÕÕ«4qûÙ•[9#””}z7̧¦PSZ4UA'A™¥Ÿn)tÜo£ òRiJÞ8üZiZ?·=¤‡ù¼m,®¦ d“؉ ãN æ媙@ôZä0ì“Óíæ­2"Öv…ØtI¨áxÇ™¢†Æl[‘Ø(© r:ÍNÐh½Â­˜‹û™Þ¼ÊØyzšÊÒr"ŦMxŒ.KtÿD"Ô"eRÈßÜtB­°püÙóQäKûsoÏÅVµG©Aç.¯ÝMP˜o‰Í*T³5ÝÆé_ð8&¿y¥ËyXm('Å“œŽAIÙë”\ºs\O·6ÑÑ‘Ì7–Kʧؿ "©Ð,Íá¹z>©Â¢&§þŠ’6ZyÖGó)kó BÂ$=¢Jp¶¹raª#²HfÐåè$É´¼ªGeI #’:Ö¶#¢ m=ó<‘Q•öLP8Ô¦Àråã—Ň <šñ79 Mm¤Lf¦,nB°èbt¦$umù.\£¶ÚQR<›YË„5ÄŠÃ7— +8Ƕ´|ÄfãÇ,¥™ï½aB÷Tscíè¶Fǘä.’PÈÔ|¨ZÉ'm°ï²^Imùšð‘Ö)^טwG{ý=™fQ]^neïc¸Î÷¬|«å¯¼dþÒ£b‚Óù†ê! )#Ÿu:+µÕº“7Ý´é¸6w$luƒk¯ÉÁjfMÇŸWʵªa¦Çï»7$ò4±­¸€ó­H#Ls—ƒ«‹,³ñôÜ{ªqR‹¸âý…^×Zò\= jKf‹4h0“û›ÅIpu2Ë# >Émd­Ô]3!Ѭá©ÓX¯÷œŸçåibÙ“–€÷tUóŽš^)ú»IËrª9“—÷€x†¦À3ø1Åáì¬|¹8-ب<£Ÿ×ÚeðVÉÉ#¡m‹ÜHåE™ð·-ˆÊ´œ‡á uäG›nÖ_U„¶944.¾­uy.’±Wê:u쟰`¥£i¨ÁìÕ£·lÐñ»ºŠ8Âw×bc3_ë!CÂ&u·¿ Ä'ž}ì~‘[jiPXÐñš+?¢L6{(Ì6îp|‰6r!jÚh£ÆÚx|Óm q’¦\~­ÆçHKÇ›®»¦=¢#g¶=¶{¿;°x'ÖœÄÆΞ=)ƒ•sÜ8|Êf¸&M÷ÄÁíÛŽEÁãDðN5[[n¶¡œû]>㊓²@4Tù‡G‘šÞö† ºóo‘<íÇ.2}¡Ì¦bÒ±þ¹G1ŸÝê?Ú aHw¬P ¾@ÄÄw.¢ê»‰†½ž01qq“YÞÐBIG*LˆãÀãz²Þ¼© ÝǦhßïX }ÌN7t¶Ü*ý°7I€»MŠ**úžGßx¼ªÔóꌈ­ÚÚæ?NéŽÜ®@Çã ÉÆ$žOôx.8ÄïüÌïËð†iuÎÙH4½éÔ¨ ©Ùãy›°¹7k§’Ö®3\á]¦ü‹kbE#¨ȘJ’²yœôC;¸Ò@ÖåÁŽ×A•Òž°÷¶­m>ŸaøX0s’§QU‹ÕE§IçŠe2U‹(Ußwš×Òíî||ë@=“Îbæ™{ìIUƪÀ½ÿö0ó¹v+EÝ]udác;Á™ÏgªÂ÷x^Þ½ÇMKŽÐn^XxÈ[Fl®µŠœî)Ô•ÁhS\ÖW333/,7@ClZÜ~X²Ê>;½:„IDð¦N2aš Tµ@Éþ@qÇNÝU‘- cÓîné‘Gyì6‹qÍýêû J @mÐÐ(ˆLñ~¿BgcÖ…ÞEvU¿–ÛWúˆÍ˜qÏz k?0ËÒè¿öjüÚÝqÕ­ñ7Ý™.‡v‹ï÷3{ ÐâÞÀñ Ì7„¡ K¡ I­Þb& b«v€p=‚À¨Aí’êùß©}Ï,Ó7¯\?jø/îÿýmµe6g‹ÿ®ïøÑÿÿæÿçäú}ýnŽ«þ_.ž»×óÿÿSŒö»±¥»±‘³ìàdjfé!Âîê춚X:‰ÐyýÜøôê0ðgÜücøÇZw¿íùËAOÙnÛ¹ÚA-Lþíî_½tƒM¡ö¹Ÿl´´3‡\­÷äÌÆÆFÛZ'@î8@hè¼~ÞØSš?lüý¢ÜüË7ÿÙ }âñgüöhä×Ýì¶v.¿ž¦îÊÈÉü›3AîØB8îòòB~?æw¦ýyõŸÿ"ê¹câ\ùŽý«;¹™ŠØ»Û™:ç;]þìŽ!;|ƒ µ°µ7.æd +uur¶t3ýy+÷ +Àá`Ú¿ ô7w¯¦öãaÐoK|þ-¦`Z !Wk þÍÙÿðÑÒß…˜¸ØÒ ¢¡…Ü1u„p@ A\,LíÀ?éñûAÜœ!¿}#¤³+ôj9°«ÕŒ=iþr°†³éÕÉg {'¨« pü¿áäjé5ˆ½ÄÉÕN¸Š‰=ä—f5µq6ýËÅ~#æϳ̌€†3¹uõM–.N°™%ø:–\Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Ûµ]Û?ßþ#%Î H \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..9d06089 --- /dev/null +++ b/makefile @@ -0,0 +1,11 @@ +all: + cd src; make all + +clean: + cd src; make clean + +install: + cd src; make install + +uninstall: + cd src; make uninstall diff --git a/man/ChangeLog b/man/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/man/Makefile.am b/man/Makefile.am new file mode 100644 index 0000000..b59e945 --- /dev/null +++ b/man/Makefile.am @@ -0,0 +1,30 @@ +# Makefile.am for hello/man. +# +# Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. +# +# 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, 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 . + +man_MANS = hello.1 +EXTRA_DIST = $(man_MANS) +MAINTAINERCLEANFILES = $(man_MANS) + +# The man pages depend on the --help strings and the version number. +common_mandeps = $(top_srcdir)/configure.ac + +# Depend on the source, not the binary; we don't need to regenerate the +# binary when any source file changes, only the main one. +# Use -o so that the `missing' program can infer the output file. +hello.1: $(top_srcdir)/src/hello.c $(common_mandeps) + $(HELP2MAN) --name="friendly greeting program" ../src/hello -o $@ diff --git a/man/Makefile.in b/man/Makefile.in new file mode 100644 index 0000000..356aa69 --- /dev/null +++ b/man/Makefile.in @@ -0,0 +1,916 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile.am for hello/man. +# +# Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. +# +# 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, 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 . +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = man +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ + $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/closeout.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/configmake.m4 \ + $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/extensions.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/fpending.m4 $(top_srcdir)/m4/getopt.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/gnulib-common.m4 \ + $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/locale-fr.m4 \ + $(top_srcdir)/m4/locale-ja.m4 $(top_srcdir)/m4/locale-zh.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \ + $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \ + $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \ + $(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \ + $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/string_h.m4 \ + $(top_srcdir)/m4/sys_socket_h.m4 $(top_srcdir)/m4/unistd_h.m4 \ + $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/wchar_h.m4 \ + $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wctype_h.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkglibexecdir = @pkglibexecdir@ +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_INCLUDE = @CONFIG_INCLUDE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ +EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ +ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ +ENOLINK_VALUE = @ENOLINK_VALUE@ +EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ +EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ +ERRNO_H = @ERRNO_H@ +EXEEXT = @EXEEXT@ +GETOPT_H = @GETOPT_H@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_ATOLL = @GNULIB_ATOLL@ +GNULIB_BTOWC = @GNULIB_BTOWC@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ +GNULIB_CHDIR = @GNULIB_CHDIR@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_CLOSE = @GNULIB_CLOSE@ +GNULIB_DUP = @GNULIB_DUP@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_DUP3 = @GNULIB_DUP3@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ +GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ +GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ +GNULIB_FFSL = @GNULIB_FFSL@ +GNULIB_FFSLL = @GNULIB_FFSLL@ +GNULIB_FSYNC = @GNULIB_FSYNC@ +GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ +GNULIB_GETCWD = @GNULIB_GETCWD@ +GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ +GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ +GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ +GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ +GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ +GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ +GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@ +GNULIB_GRANTPT = @GNULIB_GRANTPT@ +GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ +GNULIB_ISATTY = @GNULIB_ISATTY@ +GNULIB_ISWBLANK = @GNULIB_ISWBLANK@ +GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LINK = @GNULIB_LINK@ +GNULIB_LINKAT = @GNULIB_LINKAT@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +GNULIB_MBRLEN = @GNULIB_MBRLEN@ +GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ +GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ +GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ +GNULIB_MBSCHR = @GNULIB_MBSCHR@ +GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ +GNULIB_MBSINIT = @GNULIB_MBSINIT@ +GNULIB_MBSLEN = @GNULIB_MBSLEN@ +GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ +GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ +GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ +GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ +GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ +GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ +GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ +GNULIB_MBSSEP = @GNULIB_MBSSEP@ +GNULIB_MBSSPN = @GNULIB_MBSSPN@ +GNULIB_MBSSTR = @GNULIB_MBSSTR@ +GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ +GNULIB_MBTOWC = @GNULIB_MBTOWC@ +GNULIB_MEMCHR = @GNULIB_MEMCHR@ +GNULIB_MEMMEM = @GNULIB_MEMMEM@ +GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ +GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ +GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ +GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ +GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ +GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ +GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ +GNULIB_PIPE = @GNULIB_PIPE@ +GNULIB_PIPE2 = @GNULIB_PIPE2@ +GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ +GNULIB_PREAD = @GNULIB_PREAD@ +GNULIB_PTSNAME = @GNULIB_PTSNAME@ +GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_PWRITE = @GNULIB_PWRITE@ +GNULIB_RANDOM = @GNULIB_RANDOM@ +GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ +GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ +GNULIB_READ = @GNULIB_READ@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_READLINKAT = @GNULIB_READLINKAT@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_REALPATH = @GNULIB_REALPATH@ +GNULIB_RMDIR = @GNULIB_RMDIR@ +GNULIB_RPMATCH = @GNULIB_RPMATCH@ +GNULIB_SETENV = @GNULIB_SETENV@ +GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ +GNULIB_SLEEP = @GNULIB_SLEEP@ +GNULIB_STPCPY = @GNULIB_STPCPY@ +GNULIB_STPNCPY = @GNULIB_STPNCPY@ +GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ +GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ +GNULIB_STRDUP = @GNULIB_STRDUP@ +GNULIB_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ +GNULIB_STRNCAT = @GNULIB_STRNCAT@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOLL = @GNULIB_STRTOLL@ +GNULIB_STRTOULL = @GNULIB_STRTOULL@ +GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ +GNULIB_SYMLINK = @GNULIB_SYMLINK@ +GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ +GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ +GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@ +GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ +GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ +GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ +GNULIB_UNLINK = @GNULIB_UNLINK@ +GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ +GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +GNULIB_USLEEP = @GNULIB_USLEEP@ +GNULIB_WCPCPY = @GNULIB_WCPCPY@ +GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ +GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ +GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ +GNULIB_WCSCAT = @GNULIB_WCSCAT@ +GNULIB_WCSCHR = @GNULIB_WCSCHR@ +GNULIB_WCSCMP = @GNULIB_WCSCMP@ +GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ +GNULIB_WCSCPY = @GNULIB_WCSCPY@ +GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ +GNULIB_WCSDUP = @GNULIB_WCSDUP@ +GNULIB_WCSLEN = @GNULIB_WCSLEN@ +GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ +GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ +GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ +GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ +GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ +GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ +GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ +GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ +GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ +GNULIB_WCSSPN = @GNULIB_WCSSPN@ +GNULIB_WCSSTR = @GNULIB_WCSSTR@ +GNULIB_WCSTOK = @GNULIB_WCSTOK@ +GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ +GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ +GNULIB_WCTOB = @GNULIB_WCTOB@ +GNULIB_WCTOMB = @GNULIB_WCTOMB@ +GNULIB_WCTRANS = @GNULIB_WCTRANS@ +GNULIB_WCTYPE = @GNULIB_WCTYPE@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ +GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ +GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ +GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ +GNULIB_WMEMSET = @GNULIB_WMEMSET@ +GNULIB_WRITE = @GNULIB_WRITE@ +GNULIB__EXIT = @GNULIB__EXIT@ +GREP = @GREP@ +HAVE_ATOLL = @HAVE_ATOLL@ +HAVE_BTOWC = @HAVE_BTOWC@ +HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ +HAVE_CHOWN = @HAVE_CHOWN@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ +HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ +HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ +HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ +HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ +HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ +HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ +HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ +HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ +HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ +HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ +HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ +HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ +HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ +HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_DUP3 = @HAVE_DUP3@ +HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ +HAVE_FACCESSAT = @HAVE_FACCESSAT@ +HAVE_FCHDIR = @HAVE_FCHDIR@ +HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ +HAVE_FDATASYNC = @HAVE_FDATASYNC@ +HAVE_FEATURES_H = @HAVE_FEATURES_H@ +HAVE_FFSL = @HAVE_FFSL@ +HAVE_FFSLL = @HAVE_FFSLL@ +HAVE_FSYNC = @HAVE_FSYNC@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ +HAVE_GETGROUPS = @HAVE_GETGROUPS@ +HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ +HAVE_GETLOGIN = @HAVE_GETLOGIN@ +HAVE_GETOPT_H = @HAVE_GETOPT_H@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ +HAVE_GRANTPT = @HAVE_GRANTPT@ +HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ +HAVE_ISWBLANK = @HAVE_ISWBLANK@ +HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ +HAVE_LCHOWN = @HAVE_LCHOWN@ +HAVE_LINK = @HAVE_LINK@ +HAVE_LINKAT = @HAVE_LINKAT@ +HAVE_MBRLEN = @HAVE_MBRLEN@ +HAVE_MBRTOWC = @HAVE_MBRTOWC@ +HAVE_MBSINIT = @HAVE_MBSINIT@ +HAVE_MBSLEN = @HAVE_MBSLEN@ +HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ +HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ +HAVE_MEMCHR = @HAVE_MEMCHR@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ +HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ +HAVE_MKSTEMP = @HAVE_MKSTEMP@ +HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ +HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_PIPE = @HAVE_PIPE@ +HAVE_PIPE2 = @HAVE_PIPE2@ +HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ +HAVE_PREAD = @HAVE_PREAD@ +HAVE_PTSNAME = @HAVE_PTSNAME@ +HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ +HAVE_PWRITE = @HAVE_PWRITE@ +HAVE_RANDOM = @HAVE_RANDOM@ +HAVE_RANDOM_H = @HAVE_RANDOM_H@ +HAVE_RANDOM_R = @HAVE_RANDOM_R@ +HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_READLINKAT = @HAVE_READLINKAT@ +HAVE_REALPATH = @HAVE_REALPATH@ +HAVE_RPMATCH = @HAVE_RPMATCH@ +HAVE_SETENV = @HAVE_SETENV@ +HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ +HAVE_SLEEP = @HAVE_SLEEP@ +HAVE_STPCPY = @HAVE_STPCPY@ +HAVE_STPNCPY = @HAVE_STPNCPY@ +HAVE_STRCASESTR = @HAVE_STRCASESTR@ +HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ +HAVE_STRPBRK = @HAVE_STRPBRK@ +HAVE_STRSEP = @HAVE_STRSEP@ +HAVE_STRTOD = @HAVE_STRTOD@ +HAVE_STRTOLL = @HAVE_STRTOLL@ +HAVE_STRTOULL = @HAVE_STRTOULL@ +HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ +HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ +HAVE_SYMLINK = @HAVE_SYMLINK@ +HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ +HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ +HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNLINKAT = @HAVE_UNLINKAT@ +HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ +HAVE_USLEEP = @HAVE_USLEEP@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCHAR_T = @HAVE_WCHAR_T@ +HAVE_WCPCPY = @HAVE_WCPCPY@ +HAVE_WCPNCPY = @HAVE_WCPNCPY@ +HAVE_WCRTOMB = @HAVE_WCRTOMB@ +HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ +HAVE_WCSCAT = @HAVE_WCSCAT@ +HAVE_WCSCHR = @HAVE_WCSCHR@ +HAVE_WCSCMP = @HAVE_WCSCMP@ +HAVE_WCSCOLL = @HAVE_WCSCOLL@ +HAVE_WCSCPY = @HAVE_WCSCPY@ +HAVE_WCSCSPN = @HAVE_WCSCSPN@ +HAVE_WCSDUP = @HAVE_WCSDUP@ +HAVE_WCSLEN = @HAVE_WCSLEN@ +HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ +HAVE_WCSNCAT = @HAVE_WCSNCAT@ +HAVE_WCSNCMP = @HAVE_WCSNCMP@ +HAVE_WCSNCPY = @HAVE_WCSNCPY@ +HAVE_WCSNLEN = @HAVE_WCSNLEN@ +HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ +HAVE_WCSPBRK = @HAVE_WCSPBRK@ +HAVE_WCSRCHR = @HAVE_WCSRCHR@ +HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ +HAVE_WCSSPN = @HAVE_WCSSPN@ +HAVE_WCSSTR = @HAVE_WCSSTR@ +HAVE_WCSTOK = @HAVE_WCSTOK@ +HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ +HAVE_WCSXFRM = @HAVE_WCSXFRM@ +HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ +HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE_WMEMCHR = @HAVE_WMEMCHR@ +HAVE_WMEMCMP = @HAVE_WMEMCMP@ +HAVE_WMEMCPY = @HAVE_WMEMCPY@ +HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ +HAVE_WMEMSET = @HAVE_WMEMSET@ +HAVE__BOOL = @HAVE__BOOL@ +HAVE__EXIT = @HAVE__EXIT@ +HELP2MAN = @HELP2MAN@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBHELLO_LIBDEPS = @LIBHELLO_LIBDEPS@ +LIBHELLO_LTLIBDEPS = @LIBHELLO_LTLIBDEPS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ +LOCALE_JA = @LOCALE_JA@ +LOCALE_ZH_CN = @LOCALE_ZH_CN@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ +NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ +NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ +NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ +NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ +NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ +NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ +NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ +NEXT_ERRNO_H = @NEXT_ERRNO_H@ +NEXT_GETOPT_H = @NEXT_GETOPT_H@ +NEXT_STDDEF_H = @NEXT_STDDEF_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ +PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ +RANLIB = @RANLIB@ +REPLACE_BTOWC = @REPLACE_BTOWC@ +REPLACE_CALLOC = @REPLACE_CALLOC@ +REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ +REPLACE_CHOWN = @REPLACE_CHOWN@ +REPLACE_CLOSE = @REPLACE_CLOSE@ +REPLACE_DUP = @REPLACE_DUP@ +REPLACE_DUP2 = @REPLACE_DUP2@ +REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ +REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ +REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_ISATTY = @REPLACE_ISATTY@ +REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ +REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LINK = @REPLACE_LINK@ +REPLACE_LINKAT = @REPLACE_LINKAT@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MALLOC = @REPLACE_MALLOC@ +REPLACE_MBRLEN = @REPLACE_MBRLEN@ +REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ +REPLACE_MBSINIT = @REPLACE_MBSINIT@ +REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ +REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ +REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ +REPLACE_MBTOWC = @REPLACE_MBTOWC@ +REPLACE_MEMCHR = @REPLACE_MEMCHR@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NULL = @REPLACE_NULL@ +REPLACE_PREAD = @REPLACE_PREAD@ +REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_PWRITE = @REPLACE_PWRITE@ +REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ +REPLACE_READ = @REPLACE_READ@ +REPLACE_READLINK = @REPLACE_READLINK@ +REPLACE_REALLOC = @REPLACE_REALLOC@ +REPLACE_REALPATH = @REPLACE_REALPATH@ +REPLACE_RMDIR = @REPLACE_RMDIR@ +REPLACE_SETENV = @REPLACE_SETENV@ +REPLACE_SLEEP = @REPLACE_SLEEP@ +REPLACE_STPNCPY = @REPLACE_STPNCPY@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ +REPLACE_STRDUP = @REPLACE_STRDUP@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ +REPLACE_STRNCAT = @REPLACE_STRNCAT@ +REPLACE_STRNDUP = @REPLACE_STRNDUP@ +REPLACE_STRNLEN = @REPLACE_STRNLEN@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ +REPLACE_SYMLINK = @REPLACE_SYMLINK@ +REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ +REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ +REPLACE_UNLINK = @REPLACE_UNLINK@ +REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ +REPLACE_UNSETENV = @REPLACE_UNSETENV@ +REPLACE_USLEEP = @REPLACE_USLEEP@ +REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ +REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ +REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ +REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ +REPLACE_WCTOB = @REPLACE_WCTOB@ +REPLACE_WCTOMB = @REPLACE_WCTOMB@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +REPLACE_WRITE = @REPLACE_WRITE@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STDDEF_H = @STDDEF_H@ +STRIP = @STRIP@ +UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ +UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ +UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gl_LIBOBJS = @gl_LIBOBJS@ +gl_LTLIBOBJS = @gl_LTLIBOBJS@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ +gltests_WITNESS = @gltests_WITNESS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +lispdir = @lispdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +man_MANS = hello.1 +EXTRA_DIST = $(man_MANS) +MAINTAINERCLEANFILES = $(man_MANS) + +# The man pages depend on the --help strings and the version number. +common_mandeps = $(top_srcdir)/configure.ac +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ + uninstall-am uninstall-man uninstall-man1 + + +# Depend on the source, not the binary; we don't need to regenerate the +# binary when any source file changes, only the main one. +# Use -o so that the `missing' program can infer the output file. +hello.1: $(top_srcdir)/src/hello.c $(common_mandeps) + $(HELP2MAN) --name="friendly greeting program" ../src/hello -o $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/man/hello.1 b/man/hello.1 new file mode 100644 index 0000000..cf30045 --- /dev/null +++ b/man/hello.1 @@ -0,0 +1,48 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.4. +.TH HELLO "1" "April 2012" "hello 2.8" "User Commands" +.SH NAME +hello \- friendly greeting program +.SH SYNOPSIS +.B hello +[\fIOPTION\fR]... +.SH DESCRIPTION +Print a friendly, customizable greeting. +.TP +\fB\-h\fR, \fB\-\-help\fR +display this help and exit +.TP +\fB\-v\fR, \fB\-\-version\fR +display version information and exit +.TP +\fB\-t\fR, \fB\-\-traditional\fR +use traditional greeting format +.TP +\fB\-n\fR, \fB\-\-next\-generation\fR +use next\-generation greeting format +.TP +\fB\-g\fR, \fB\-\-greeting\fR=\fITEXT\fR +use TEXT as the greeting message +.SH "REPORTING BUGS" +Report bugs to: bug\-hello@gnu.org +.br +GNU Hello home page: +.br +General help using GNU software: +.SH COPYRIGHT +Copyright \(co 2011 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +.br +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +.SH "SEE ALSO" +The full documentation for +.B hello +is maintained as a Texinfo manual. If the +.B info +and +.B hello +programs are properly installed at your site, the command +.IP +.B info hello +.PP +should give you access to the complete manual. diff --git a/push b/push new file mode 100755 index 0000000..117247e --- /dev/null +++ b/push @@ -0,0 +1 @@ +bzr push lp:~teejee2008/timeshift/trunk diff --git a/src/Main.vala b/src/Main.vala new file mode 100644 index 0000000..7c4dac1 --- /dev/null +++ b/src/Main.vala @@ -0,0 +1,2402 @@ +/* + * Main.vala + * + * Copyright 2012 Tony George + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * + */ + +using GLib; +using Gtk; +using Gee; +using Soup; +using Json; +using Utility; + +public Main App; +public const string AppName = "TimeShift"; +public const string AppVersion = "1.0"; +public const string AppAuthor = "Tony George"; +public const string AppAuthorEmail = "teejee2008@gmail.com"; +public const bool LogTimestamp = true; +public bool UseConsoleColors = true; +public bool DEBUG_MODE = false; +public bool SHOW_COMMANDS = false; + +const string GETTEXT_PACKAGE = ""; +const string LOCALE_DIR = "/usr/share/locale"; + +public class Main : GLib.Object{ + public string app_path = ""; + public string share_folder = ""; + public string rsnapshot_conf_path = ""; + public string app_conf_path = ""; + + public Gee.ArrayList snapshot_list; + public Gee.ArrayList partition_list; + public Gee.ArrayList exclude_list_user; + public Gee.ArrayList exclude_list_default; + public Gee.ArrayList exclude_list_home; + public Gee.ArrayList exclude_list_restore; + + public PartitionInfo root_device; + public PartitionInfo home_device; + public PartitionInfo snapshot_device; + public string mount_point_backup = "/mnt/timeshift"; + public string mount_point_restore = "/mnt/timeshift-restore"; + public string snapshot_dir = "/mnt/timeshift/timeshift/snapshots"; + public DistInfo current_distro; + + public bool _is_scheduled = true; + + public bool schedule_monthly = false; + public bool schedule_weekly = false; + public bool schedule_daily = true; + public bool schedule_hourly = false; + public bool schedule_boot = true; + public int count_monthly = 3; + public int count_weekly = 4; + public int count_daily = 10; + public int count_hourly = 6; + public int count_boot = 10; + + public string app_mode = ""; + public bool is_ondemand = false; + + public string snapshot_comments = ""; + public bool is_success = false; + public bool in_progress = false; + + public int cron_job_interval_mins = 30; + public int retain_snapshots_max_days = 200; + public int minimum_free_disk_space_mb = 2048; + public long first_snapshot_size = 0; + + public string log_dir; + public string log_file; + public string lock_dir; + public string lock_file; + + public TimeShiftBackup snapshot_to_delete; + public TimeShiftBackup snapshot_to_restore; + public PartitionInfo restore_target; + public bool reinstall_grub2 = false; + public DeviceInfo grub_device; + + public string progress_text; + + public static int main (string[] args) { + set_locale(); + + App = new Main(args); + bool success = App.start_application(args); + App.exit_app(); + + return (success) ? 0 : 1; + } + + private static void set_locale(){ + Intl.setlocale(GLib.LocaleCategory.MESSAGES, "timeshift"); + Intl.textdomain(GETTEXT_PACKAGE); + Intl.bind_textdomain_codeset(GETTEXT_PACKAGE, "utf-8"); + Intl.bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); + } + + public Main(string[] args){ + string msg = ""; + + //parse arguments (initial) ------------ + + parse_arguments(args); + + //check admin access ------------------ + + if (!user_is_admin()){ + msg = _("TimeShift needs admin access to backup and restore system files.") + "\n"; + msg += _("Please run the application as admin (using 'sudo')"); + + if (app_mode == ""){ + Gtk.init (ref args); + messagebox_show(_("Admin Access Required"),msg,true); + } + else{ + log_error(msg); + } + + exit(0); + } + + //check dependencies --------------------- + + string message; + if (!check_dependencies(out message)){ + if (app_mode == ""){ + Gtk.init (ref args); + messagebox_show(_("Missing Dependencies"),message,true); + } + else{ + log_error(msg); + } + exit(0); + } + + //check and create lock ------------------ + + lock_dir = "/var/run/lock/timeshift"; + lock_file = lock_dir + "/lock"; + if (!create_lock()){ + if (app_mode == ""){ + Gtk.init (ref args); + + string txt = read_file(lock_file); + //string pid = txt.split(";")[0].strip(); + string mode = txt.split(";")[1].strip(); + + if (mode == "backup"){ + msg = _("A scheduled job is currently taking a system snapshot.") + "\n"; + msg += _("Please wait for a few minutes and try again."); + } + else{ + msg = _("Another instance of timeshift is currently running!") + "\n"; + msg += _("Please check if you have multiple windows open.") + "\n"; + } + + messagebox_show("Error",msg,true); + } + else{ + //already logged - do nothing + } + exit(0); + } + + //init log ------------------ + + try { + DateTime now = new DateTime.now_local(); + log_dir = "/var/log/timeshift"; + log_file = log_dir + "/" + now.format("%Y-%m-%d %H-%M-%S") + ".log"; + + var file = File.new_for_path (log_dir); + if (!file.query_exists ()) { + file.make_directory_with_parents(); + } + + file = File.new_for_path (log_file); + if (file.query_exists ()) { + file.delete (); + } + + dos_log = new DataOutputStream (file.create(FileCreateFlags.REPLACE_DESTINATION)); + log_msg(_("Session log file") + ": %s".printf(log_file)); + } + catch (Error e) { + is_success = false; + log_error (e.message); + } + + //initialize variables ------------------ + + this.app_path = (File.new_for_path (args[0])).get_parent().get_path (); + this.share_folder = "/usr/share"; + this.app_conf_path = "/etc/timeshift.json"; + //root_device and home_device will be initalized by update_partition_list() + + //check if running locally ------------- + + string local_exec = args[0]; + string local_conf = app_path + "/timeshift.json"; + string local_share = app_path + "/share"; + + var f_local_exec = File.new_for_path(local_exec); + if (f_local_exec.query_exists()){ + + var f_local_conf = File.new_for_path(local_conf); + if (f_local_conf.query_exists()){ + this.app_conf_path = local_conf; + } + + var f_local_share = File.new_for_path(local_share); + if (f_local_share.query_exists()){ + this.share_folder = local_share; + } + } + else{ + //timeshift is running from system directory - update app_path + this.app_path = get_cmd_path("timeshift"); + } + + //initialize lists ------------------------- + + this.snapshot_list = new Gee.ArrayList(); + this.exclude_list_user = new Gee.ArrayList(); + this.exclude_list_default = new Gee.ArrayList(); + this.exclude_list_home = new Gee.ArrayList(); + this.exclude_list_restore = new Gee.ArrayList(); + this.partition_list = new Gee.ArrayList(); + + //default exclude entries ------------------- + + exclude_list_default.add("/dev/*"); + exclude_list_default.add("/proc/*"); + exclude_list_default.add("/sys/*"); + exclude_list_default.add("/media/*"); + exclude_list_default.add("/mnt/*"); + exclude_list_default.add("/tmp/*"); + exclude_list_default.add("/run/*"); + exclude_list_default.add("/var/run/*"); + exclude_list_default.add("/var/lock/*"); + exclude_list_default.add("/lost+found"); + exclude_list_default.add("/timeshift/*"); + exclude_list_default.add("/home/*/.thumbnails"); + exclude_list_default.add("/home/*/.cache"); + exclude_list_default.add("/home/*/.mozilla/firefox/*.default/Cache"); + exclude_list_default.add("/home/*/.mozilla/firefox/*.default/OfflineCache"); + exclude_list_default.add("/home/*/.opera/cache"); + exclude_list_default.add("/home/*/.local/share/Trash"); + + exclude_list_home.add("+ /home/*/.**"); + exclude_list_home.add("/home/*/**"); + + //check current linux distribution ----------------- + + this.current_distro = get_dist_info("/"); + + //parse arguments (final) ------------ + + parse_arguments(args); + + //initialize app -------------------- + + update_partition_list(); + load_app_config(); + update_snapshot_list(); + } + + private void parse_arguments(string[] args){ + for (int k = 1; k < args.length; k++) // Oth arg is app path + { + switch (args[k].down ()){ + case "--backup": + app_mode = "backup"; + break; + + case "--backup-now": + app_mode = "ondemand"; + break; + + case "--show-commands": + SHOW_COMMANDS = true; + break; + + case "--debug": + DEBUG_MODE = true; + break; + + default: + //normal + break; + } + } + } + + public bool start_application(string[] args){ + bool is_success = true; + + switch(app_mode){ + case "backup": + is_success = take_snapshot(); + if(!is_success){ + log_error(_("Failed to take snapshot.")); + } + return is_success; + + case "ondemand": + is_success = take_snapshot(true); + if(!is_success){ + log_error(_("Failed to take snapshot.")); + } + return is_success; + + default: + //Initialize GTK + Gtk.init(ref args); + + //Initialize main window + var window = new MainWindow (); + window.destroy.connect(Gtk.main_quit); + window.show_all(); + + //start event loop + Gtk.main(); + + return true; + } + } + + public bool check_dependencies(out string msg){ + msg = ""; + + string[] dependencies = { "rsync","blkid","df","du","mount","umount","fuser","crontab","cp","rm","touch","ln","sync","shutdown","chroot" }; + + debug("Checking dependencies..."); + + string path; + foreach(string cmd_tool in dependencies){ + path = get_cmd_path (cmd_tool); + if ((path == null) || (path.length == 0)){ + msg += cmd_tool + "\n"; + } + } + + if (msg.length > 0){ + msg = _("Following dependencies are missing:") + "\n\n" + msg + "\n"; + msg += _("Please install the packages for the commands \nlisted above and try running TimeShift again."); + debug("Missing dependencies"); + return false; + } + else{ + debug("All depenencies satisfied"); + return true; + } + } + + public bool create_lock(){ + try{ + + string current_pid = ((long)Posix.getpid()).to_string(); + + var file = File.new_for_path (lock_dir); + if (!file.query_exists()) { + file.make_directory_with_parents(); + } + + file = File.new_for_path (lock_file); + if (file.query_exists()) { + + string txt = read_file(lock_file); + string process_id = txt.split(";")[0].strip(); + //string mode = txt.split(";")[1].strip(); + long pid = long.parse(process_id); + + if (process_is_running(pid)){ + log_msg(_("Another instance of timeshift is currently running") + " (PID=%ld)".printf(pid)); + return false; + } + else{ + log_msg(_("Warning: Deleted invalid lock")); + file.delete(); + write_file(lock_file, current_pid); + return true; + } + } + else{ + write_file(lock_file, current_pid + ";" + app_mode); + return true; + } + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public void remove_lock(){ + try{ + var file = File.new_for_path (lock_file); + if (file.query_exists()) { + file.delete(); + } + } + catch (Error e) { + log_error (e.message); + } + } + + + public bool is_scheduled{ + get{ + return _is_scheduled; + } + set{ + _is_scheduled = value; + } + } + + public bool is_live_system(){ + return (root_device == null); + } + + + public bool take_snapshot(bool ondemand = false, string comments = ""){ + + in_progress = true; + + is_ondemand = ondemand; + snapshot_comments = comments; + + try { + is_success = false; + Thread.create (take_snapshot_thread, true); + + while (in_progress){ + do_events (); + Thread.usleep((ulong) GLib.TimeSpan.MILLISECOND * 100); + } + } catch (Error e) { + is_success = false; + log_error (e.message); + } + + in_progress = false; + + return is_success; + } + + public void take_snapshot_thread(){ + bool status; + bool update_symlinks = false; + + try + { + //create a timestamp + DateTime now = new DateTime.now_local(); + + //mount_backup_device + if (!mount_backup_device()){ + is_success = false; + in_progress = false; + return; + } + + //check backup device + string msg; + int status_code = check_backup_device(out msg); + + if (!is_ondemand){ + //check if first snapshot was taken + if (status_code == 2){ + log_error(msg); + log_error(_("Please take the first snapshot by running 'sudo timeshift --backup-now'")); + is_success = false; + in_progress = false; + return; + } + } + + //check space + if ((status_code == 1) || (status_code == 2)){ + log_error(msg); + is_success = false; + in_progress = false; + return; + } + + //create snapshot root if missing + var f = File.new_for_path(snapshot_dir); + if (!f.query_exists()){ + f.make_directory_with_parents(); + } + + //ondemand + if (is_ondemand){ + is_success = backup_and_rotate ("ondemand",now); + if(!is_success){ + log_error(_("On-demand snapshot failed!")); + is_success = false; + in_progress = false; + + } + else{ + is_success = true; + in_progress = false; + return; + } + + return; + } + + if (is_scheduled){ + TimeShiftBackup last_snapshot_boot = get_latest_snapshot("boot"); + TimeShiftBackup last_snapshot_hourly = get_latest_snapshot("hourly"); + TimeShiftBackup last_snapshot_daily = get_latest_snapshot("daily"); + TimeShiftBackup last_snapshot_weekly = get_latest_snapshot("weekly"); + TimeShiftBackup last_snapshot_monthly = get_latest_snapshot("monthly"); + + DateTime dt_sys_boot = now.add_seconds((-1) * get_system_uptime_seconds()); + bool take_new = false; + + if (schedule_boot){ + + log_msg(_("Boot snapshots are enabled")); + + if (last_snapshot_boot == null){ + log_msg(_("Last boot snapshot not found")); + take_new = true; + } + else if (last_snapshot_boot.date.compare(dt_sys_boot) < 0){ + log_msg(_("Last boot snapshot is older than system start time")); + take_new = true; + } + else{ + int hours = (int) ((float) now.difference(last_snapshot_boot.date) / TimeSpan.HOUR); + log_msg(_("Last boot snapshot is %d hours old").printf(hours)); + take_new = false; + } + + if (take_new){ + status = backup_and_rotate ("boot",now); + if(!status){ + log_error(_("Boot snapshot failed!")); + is_success = false; + in_progress = false; + return; + } + else{ + update_symlinks = true; + } + } + } + + if (schedule_hourly){ + + log_msg(_("Hourly snapshots are enabled")); + + if (last_snapshot_hourly == null){ + log_msg(_("Last hourly snapshot not found")); + take_new = true; + } + else if (last_snapshot_hourly.date.compare(now.add_hours(-1)) < 0){ + log_msg(_("Last hourly snapshot is more than 1 hour old")); + take_new = true; + } + else{ + int mins = (int) ((float) now.difference(last_snapshot_hourly.date) / TimeSpan.MINUTE); + log_msg(_("Last hourly snapshot is %d minutes old").printf(mins)); + take_new = false; + } + + if (take_new){ + status = backup_and_rotate ("hourly",now); + if(!status){ + log_error(_("Hourly snapshot failed!")); + is_success = false; + in_progress = false; + return; + } + else{ + update_symlinks = true; + } + } + } + + if (schedule_daily){ + + log_msg(_("Daily snapshots are enabled")); + + if (last_snapshot_daily == null){ + log_msg(_("Last daily snapshot not found")); + take_new = true; + } + else if (last_snapshot_daily.date.compare(now.add_days(-1)) < 0){ + log_msg(_("Last daily snapshot is more than 1 day old")); + take_new = true; + } + else{ + int hours = (int) ((float) now.difference(last_snapshot_daily.date) / TimeSpan.HOUR); + log_msg(_("Last daily snapshot is %d hours old").printf(hours)); + take_new = false; + } + + if (take_new){ + status = backup_and_rotate ("daily",now); + if(!status){ + log_error(_("Daily snapshot failed!")); + is_success = false; + in_progress = false; + return; + } + else{ + update_symlinks = true; + } + } + } + + if (schedule_weekly){ + + log_msg(_("Weekly snapshots are enabled")); + + if (last_snapshot_weekly == null){ + log_msg(_("Last weekly snapshot not found")); + take_new = true; + } + else if (last_snapshot_weekly.date.compare(now.add_weeks(-1)) < 0){ + log_msg(_("Last weekly snapshot is more than 1 week old")); + take_new = true; + } + else{ + int days = (int) ((float) now.difference(last_snapshot_weekly.date) / TimeSpan.DAY); + log_msg(_("Last weekly snapshot is %d days old").printf(days)); + take_new = false; + } + + if (take_new){ + status = backup_and_rotate ("weekly",now); + if(!status){ + log_error(_("Weekly snapshot failed!")); + is_success = false; + in_progress = false; + return; + } + else{ + update_symlinks = true; + } + } + } + + if (schedule_monthly){ + + log_msg(_("Monthly snapshot are enabled")); + + if (last_snapshot_monthly == null){ + log_msg(_("Last monthly snapshot not found")); + take_new = true; + } + else if (last_snapshot_monthly.date.compare(now.add_months(-1)) < 0){ + log_msg(_("Last monthly snapshot is more than 1 month old")); + take_new = true; + } + else{ + int days = (int) ((float) now.difference(last_snapshot_monthly.date) / TimeSpan.DAY); + log_msg(_("Last monthly snapshot is %d days old").printf(days)); + take_new = false; + } + + if (take_new){ + status = backup_and_rotate ("monthly",now); + if(!status){ + log_error(_("Monthly snapshot failed!")); + is_success = false; + in_progress = false; + return; + } + else{ + update_symlinks = true; + } + } + } + } + else{ + log_msg(_("Scheduled snapshots are disabled")); + log_msg(_("Nothing to do!")); + cron_job_update(); + } + + auto_delete_backups(); + + if (update_symlinks){ + update_snapshot_list(); + create_symlinks(); + } + } + catch(Error e){ + log_error (e.message); + is_success = false; + in_progress = false; + return; + } + + is_success = true; + in_progress = false; + return; + } + + public bool backup_and_rotate(string tag, DateTime dt_created){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + string msg; + File f; + + string time_stamp = dt_created.format("%Y-%m-%d %H-%M-%S"); + DateTime now = new DateTime.now_local(); + bool backup_taken = false; + + string sync_name = ".sync"; + string sync_path = snapshot_dir + "/" + sync_name; + + try{ + + //delete the existing .sync snapshot if invalid -------- + + f = File.new_for_path(sync_path); + if(f.query_exists()){ + + f = File.new_for_path(sync_path + "/info.json"); + if(!f.query_exists()){ + + progress_text = _("Cleaning up..."); + log_msg(progress_text); + + cmd = "rm -rfd \"%s\"".printf(sync_path); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + ret_val = Posix.system(cmd); + if (ret_val != 0){ + log_error(_("Failed to delete incomplete snapshot") + ": '.sync'"); + return false; + } + else{ + log_msg(_("Deleted incomplete snapshot") + ": '.sync'"); + } + } + } + + DateTime dt_sys_boot = now.add_seconds((-1) * get_system_uptime_seconds()); + + //check if we can rotate an existing backup ------------- + + TimeShiftBackup last_snapshot = get_latest_snapshot(); + DateTime dt_filter = null; + + if ((tag != "ondemand") && (last_snapshot != null)){ + switch(tag){ + case "boot": + dt_filter = dt_sys_boot; + break; + case "hourly": + case "daily": + case "weekly": + case "monthly": + dt_filter = now.add_hours(-1); + break; + default: + log_error(_("Unknown snapshot type") + ": %s".printf(tag)); + return false; + } + + TimeShiftBackup backup_to_rotate = null; + foreach(TimeShiftBackup bak in snapshot_list){ + if (bak.date.compare(dt_filter) > 0){ + backup_to_rotate = bak; + break; + } + } + + if (backup_to_rotate != null){ + backup_to_rotate.add_tag(tag); + backup_taken = true; + msg = _("Snapshot") + " '%s' ".printf(backup_to_rotate.name) + _("tagged") + " '%s'".printf(tag); + log_msg(msg); + } + } + + if (!backup_taken){ + + //take new backup --------------------------------- + + DateTime dt_begin = new DateTime.now_local(); + //log_msg("Taking system snapshot..."); + + string list_file = sync_path + "/exclude.list"; + + f = File.new_for_path(sync_path); + if (!f.query_exists()){ + + //create .sync directory -------- + + f = File.new_for_path(sync_path + "/localhost"); + f.make_directory_with_parents(); + + TimeShiftBackup bak_restore = null; + + //check if a control file was written after restore ------- + + string ctl_path = snapshot_dir + "/.sync-restore"; + + f = File.new_for_path(ctl_path); + if(f.query_exists()){ + string snapshot_path = read_file(ctl_path); + + foreach(TimeShiftBackup bak in snapshot_list){ + if (bak.path == snapshot_path){ + bak_restore = bak; + break; + } + } + + f.delete(); + } + + if (bak_restore == null){ + //use latest snapshot + for(int k = snapshot_list.size -1; k >= 0; k--){ + TimeShiftBackup bak = snapshot_list[k]; + bak_restore = bak; //TODO: check dist type + break; + } + } + + //hard-link selected snapshot + if (bak_restore != null){ + + progress_text = _("Hard-linking files from previous snapshot..."); + log_msg(progress_text); + + cmd = "cp -alp \"%s\" \"%s\"".printf(bak_restore.path + "/localhost/.", sync_path + "/localhost/"); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error(_("Failed to hard-link last snapshot")); + log_error (std_err); + return false; + } + } + } + + //delete existing control file -------------- + + f = File.new_for_path(sync_path + "/info.json"); + if (f.query_exists()){ + f.delete(); + } + + //save exclude list ------------ + + save_exclude_list(sync_path); + + //update modification date of .sync directory --------- + + cmd = "touch \"%s\"".printf(sync_path); + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + if (ret_val != 0){ + log_error(std_err); + log_error(_("Failed to update modification date")); + return false; + } + + //rsync file system with .sync ------------------ + + progress_text = _("Synching files..."); + log_msg(progress_text); + + cmd = "rsync -ai --delete --numeric-ids --relative --delete-excluded"; + cmd += " --exclude-from=\"%s\"".printf(list_file); + cmd += " /. \"%s\"".printf(sync_path + "/localhost/"); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (ret_val != 0){ + log_error (std_err); + log_error(_("rsync returned an error") + ": %d".printf(ret_val)); + log_error(_("Failed to create new snapshot")); + return false; + } + + //write rsync log -------- + + write_rsync_log_file(sync_path, std_out, std_err); + + //write control file ---------- + + write_snapshot_control_file(sync_path, dt_created, tag); + + //rotate .sync to required level ---------- + + progress_text = _("Saving new snapshot..."); + log_msg(progress_text); + + string new_name = time_stamp; + string new_path = snapshot_dir + "/" + new_name; + cmd = "cp -alp \"%s\" \"%s\"".printf(sync_path, new_path); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error(_("Failed to save snapshot") + ":'%s'".printf(new_name)); + log_error (std_err); + return false; + } + + DateTime dt_end = new DateTime.now_local(); + TimeSpan elapsed = dt_end.difference(dt_begin); + long seconds = (long)(elapsed * 1.0 / TimeSpan.SECOND); + msg = _("Snapshot saved successfully") + " (%lds)".printf(seconds); + log_msg(msg); + notify_send("TimeShift",msg,10000,"low"); + + log_msg(_("Snapshot") + " '%s' ".printf(new_name) + _("tagged") + " '%s'".printf(tag)); + + update_snapshot_list(); + } + } + catch(Error e){ + log_error (e.message); + return false; + } + + return true; + } + + public void auto_delete_backups(){ + DateTime now = new DateTime.now_local(); + int count = 0; + bool show_msg = false; + DateTime dt_limit; + + //delete older backups - boot --------------- + + var list = get_snapshot_list("boot"); + + if (list.size > count_boot){ + log_msg(_("Maximum backups exceeded for backup level") + " '%s'".printf("boot")); + while (list.size > count_boot){ + list[0].remove_tag("boot"); + log_msg(_("Snapshot") + " '%s' ".printf(list[0].name) + _("un-tagged") + " '%s'".printf("boot")); + list = get_snapshot_list("boot"); + } + } + + //delete older backups - hourly, daily, weekly, monthly --------- + + string[] levels = { "hourly","daily","weekly","monthly" }; + + foreach(string level in levels){ + list = get_snapshot_list(level); + + if (list.size == 0) { continue; } + + switch (level){ + case "hourly": + dt_limit = now.add_hours(-1 * count_hourly); + break; + case "daily": + dt_limit = now.add_days(-1 * count_daily); + break; + case "weekly": + dt_limit = now.add_weeks(-1 * count_weekly); + break; + case "monthly": + dt_limit = now.add_months(-1 * count_monthly); + break; + default: + dt_limit = now.add_years(-1 * 10); + break; + } + + if (list[0].date.compare(dt_limit) < 0){ + + log_msg(_("Maximum backups exceeded for backup level") + " '%s'".printf(level)); + + while (list[0].date.compare(dt_limit) < 0){ + list[0].remove_tag(level); + log_msg(_("Snapshot") + " '%s' ".printf(list[0].name) + _("un-tagged") + " '%s'".printf(level)); + list = get_snapshot_list(level); + } + } + } + + //delete older backups - max days ------- + + show_msg = true; + count = 0; + foreach(TimeShiftBackup bak in snapshot_list){ + if (bak.date.compare(now.add_days(-1 * retain_snapshots_max_days)) < 0){ + if (!bak.has_tag("ondemand")){ + + if (show_msg){ + log_msg(_("Removing backups older than") + " %d ".printf(retain_snapshots_max_days) + _("days...")); + show_msg = false; + } + + log_msg(_("Snapshot") + " '%s' ".printf(bak.name) + _("un-tagged")); + bak.tags.clear(); + count++; + } + } + } + + delete_untagged_snapshots(); + + //delete older backups - minimum space ------- + + update_partition_list(); + + show_msg = true; + count = 0; + while ((snapshot_device.size_mb - snapshot_device.used_mb) < minimum_free_disk_space_mb){ + list = get_snapshot_list(); + if (list.size > 0){ + if (!list[0].has_tag("ondemand")){ + + if (show_msg){ + log_msg(_("Free space is less than") + " %d GB".printf(minimum_free_disk_space_mb)); + log_msg(_("Removing older backups to free disk space")); + show_msg = false; + } + + delete_snapshot(list[0]); + } + } + update_partition_list(); //TODO: update snapshot_device only + } + } + + public void delete_untagged_snapshots(){ + bool show_msg = true; + + foreach(TimeShiftBackup bak in snapshot_list){ + if (bak.tags.size == 0){ + + if (show_msg){ + log_msg(_("Removing un-tagged snapshots...")); + show_msg = false; + } + + delete_snapshot(bak); + } + } + } + + public void create_symlinks(){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + try{ + cleanup_symlink_dir("boot"); + cleanup_symlink_dir("hourly"); + cleanup_symlink_dir("daily"); + cleanup_symlink_dir("weekly"); + cleanup_symlink_dir("monthly"); + cleanup_symlink_dir("ondemand"); + + string path; + + foreach(TimeShiftBackup bak in snapshot_list){ + foreach(string tag in bak.tags){ + path = mount_point_backup + "/timeshift/snapshots-%s".printf(tag); + cmd = "ln --symbolic --relative \"%s\" -t \"%s\"".printf(bak.path,path); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error (std_err); + log_error(_("Failed to create symlinks") + ": snapshots-%s".printf(tag)); + return; + } + } + } + + log_msg (_("symlinks updated")); + } + catch (Error e) { + log_error (e.message); + } + } + + public void cleanup_symlink_dir(string tag){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + try{ + string path = mount_point_backup + "/timeshift/snapshots-%s".printf(tag); + var f = File.new_for_path(path); + if (f.query_exists()){ + cmd = "rm -rf \"%s\"".printf(path + "/"); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error (std_err); + log_error(_("Failed to delete symlinks") + ": 'snapshots-%s'".printf(tag)); + return; + } + } + + f.make_directory_with_parents(); + } + catch (Error e) { + log_error (e.message); + } + } + + + public void save_exclude_list(string snapshot_path){ + + try{ + + Gee.ArrayList combined_list = new Gee.ArrayList(); + + //add default entries + foreach(string path in exclude_list_default){ + if (!combined_list.contains(path)){ + combined_list.add(path); + } + } + + //add user entries from current settings + foreach(string path in exclude_list_user){ + if (!combined_list.contains(path)){ + combined_list.add(path); + } + } + + //add home entries + foreach(string path in exclude_list_home){ + if (!combined_list.contains(path)){ + combined_list.add(path); + } + } + + string timeshift_path = "/timeshift/*"; + if (!combined_list.contains(timeshift_path)){ + combined_list.add(timeshift_path); + } + + //write file ----------- + + string list_file = snapshot_path + "/exclude.list"; + string file_text = ""; + + var f = File.new_for_path(list_file); + if (f.query_exists()){ + f.delete(); + } + + foreach(string path in combined_list){ + file_text += path + "\n"; + } + + write_file(list_file,file_text); + } + catch (Error e) { + log_error (e.message); + } + } + + public void save_exclude_list_for_restore(TimeShiftBackup snapshot){ + + try{ + string list_file = snapshot.path + "/exclude.list"; + + if (exclude_list_restore.size == 0){ + + //add default entries + foreach(string path in exclude_list_default){ + if (!exclude_list_restore.contains(path)){ + exclude_list_restore.add(path); + } + } + + //add user entries from current settings + foreach(string path in exclude_list_user){ + if (!exclude_list_restore.contains(path) && !exclude_list_home.contains(path)){ + exclude_list_restore.add(path); + } + } + + //add user entries from snapshot exclude list + foreach(string path in read_file(list_file).split("\n")){ + if (!exclude_list_restore.contains(path) && !exclude_list_home.contains(path)){ + exclude_list_restore.add(path); + } + } + + //add home entries + foreach(string path in exclude_list_home){ + if (!exclude_list_restore.contains(path)){ + exclude_list_restore.add(path); + } + } + + string timeshift_path = "/timeshift/*"; + if (!exclude_list_restore.contains(timeshift_path)){ + exclude_list_restore.add(timeshift_path); + } + + log_msg(_("Using the default exclude-list")); + } + else{ + log_msg(_("Using user-specified exclude-list")); + } + + string timeshift_path = "/timeshift/*"; + if (!exclude_list_restore.contains(timeshift_path)){ + exclude_list_restore.add(timeshift_path); + } + + //write file ----------- + + string file_text = ""; + string list_file_restore = snapshot.path + "/exclude-restore.list"; + + var f = File.new_for_path(list_file_restore); + if (f.query_exists()){ + f.delete(); + } + + foreach(string path in exclude_list_restore){ + file_text += path + "\n"; + } + + write_file(list_file_restore,file_text); + } + catch (Error e) { + log_error (e.message); + } + } + + + public void write_snapshot_control_file(string snapshot_path, DateTime dt_created, string tag){ + + var ctl_path = snapshot_path + "/info.json"; + var config = new Json.Object(); + + config.set_string_member("created", dt_created.to_utc().to_unix().to_string()); + config.set_string_member("sys-uuid", root_device.uuid); + config.set_string_member("sys-distro", current_distro.full_name()); + config.set_string_member("app-version", AppVersion); + config.set_string_member("tags", tag); + config.set_string_member("comments", ""); + + var json = new Json.Generator(); + json.pretty = true; + json.indent = 2; + var node = new Json.Node(NodeType.OBJECT); + node.set_object(config); + json.set_root(node); + + try{ + var f = File.new_for_path(ctl_path); + if (f.query_exists()){ + f.delete(); + } + + json.to_file(ctl_path); + } catch (Error e) { + log_error (e.message); + } + } + + public void write_rsync_log_file(string snapshot_path, string std_out, string std_err){ + try{ + var log_path = snapshot_path + "/rsync-log"; + var f = File.new_for_path(log_path); + if (f.query_exists()){ + f.delete(); + } + write_file(log_path, std_out); + + log_path = snapshot_path + "/rsync-log-error"; + f = File.new_for_path(log_path); + if (f.query_exists()){ + f.delete(); + } + write_file(log_path, std_err); + + } catch (Error e) { + log_error (e.message); + } + } + + + public bool restore_snapshot(){ + + if (snapshot_to_restore == null){ + log_error(_("Snapshot to restore not specified!")); + return false; + } + + try { + in_progress = true; + is_success = false; + Thread.create (restore_snapshot_thread, true); + } catch (ThreadError e) { + in_progress = false; + is_success = false; + log_error (e.message); + } + + while (in_progress){ + do_events (); + Thread.usleep((ulong) GLib.TimeSpan.MILLISECOND * 100); + } + + snapshot_to_restore = null; + + return is_success; + } + + public void restore_snapshot_thread(){ + string sh = ""; + int ret_val; + string temp_script; + bool reboot_after_restore = false; + + in_progress = true; + + try{ + + string source_path = snapshot_to_restore.path; + + //set target path ---------------- + + string target_path = "/"; + if ((root_device != null) && (restore_target.device == root_device.device)){ + target_path = "/"; + } + else{ + if (restore_target.mount_point.length > 0){ + target_path = restore_target.mount_point; + } + else{ + //mount it somewhere + string target_mount_point = "/mnt/timeshift-restore"; + var f = File.new_for_path(target_mount_point); + if (!f.query_exists()){ + f.make_directory_with_parents(); + } + + if (mount(restore_target.device,target_mount_point)){ + target_path = target_mount_point; + } + else{ + log_error(_("Unable to mount target partition!")); + messagebox_show(_("Error"), _("Unable to mount target partition!") + "\n" + _("No changes were made to system")); + is_success = false; + in_progress = false; + return; + } + } + } + if (target_path[-1:target_path.length] != "/"){ + target_path += "/"; + } + + //save exclude list for restore ---------- + + save_exclude_list_for_restore(snapshot_to_restore); + + sh = ""; + sh += "echo ''\n"; + sh += "echo '" + _("Please do not interrupt the restore process!") + "'\n"; + if ((root_device != null) && (restore_target.device == root_device.device) && (restore_target.uuid == root_device.uuid)){ + sh += "echo '" + _("System will reboot after files are restored") + "'\n"; + } + sh += "echo ''\n"; + sh += "sleep 3s\n"; + + //run rsync ---------- + + sh += "rsync -avir --exclude-from \"%s\" --force --delete-after \"%s\" \"%s\" \n".printf(source_path + "/exclude-restore.list", source_path + "/localhost/", target_path); + sh += "sync \n"; + + //chroot and re-install grub2 -------- + + if (reinstall_grub2 && grub_device != null){ + sh += "echo '' \n"; + sh += "echo '" + _("Re-installing GRUB2 bootloader...") + "' \n"; + sh += "for i in /dev /proc /run /sys; do mount --bind \"$i\" \"%s$i\"; done \n".printf(target_path); + sh += "chroot \"%s\" grub-install --recheck %s \n".printf(target_path, grub_device.device); + sh += "chroot \"%s\" update-grub \n".printf(target_path); + + sh += "echo '' \n"; + sh += "echo '" + _("Synching file systems...") + "' \n"; + sh += "sync \n"; + + sh += "echo '' \n"; + sh += "echo '" + _("Cleaning up...") + "' \n"; + sh += "for i in /dev /proc /run /sys; do umount -f \"%s$i\"; done \n".printf(target_path); + } + + //reboot if required -------- + + if ((root_device != null) && (restore_target.device == root_device.device) && (restore_target.uuid == root_device.uuid)){ + sh += "echo '' \n"; + sh += "echo '" + _("Rebooting system...") + "' \n"; + //sh += "reboot -f \n"; + sh += "shutdown -r now \n"; + reboot_after_restore = true; + } + + //invalidate the .sync snapshot -------------------- + + string sync_name = ".sync"; + string sync_path = snapshot_dir + "/" + sync_name; + string control_file_path = sync_path + "/info.json"; + + var f = File.new_for_path(control_file_path); + if(f.query_exists()){ + f.delete(); //delete the control file + } + + //save a control file for updating the .sync snapshot -------------------- + + control_file_path = snapshot_dir + "/.sync-restore"; + + f = File.new_for_path(control_file_path); + if(f.query_exists()){ + f.delete(); //delete existing file + } + + write_file(control_file_path, snapshot_to_restore.path); //save snapshot name + + //run the script -------------------- + + if (reboot_after_restore){ + temp_script = create_temp_bash_script(sh); + ret_val = execute_bash_script_fullscreen_sync(temp_script); + + if (ret_val == -1){ + string msg = _("Failed to find a terminal emulator on this system!") + "\n"; + msg += _("Please install one of the following terminal emulators and try again") + ":\n"; + msg += "xfce4-terminal gnome-terminal xterm konsole\n\n"; + msg += _("No changes were made to system."); + + log_error(msg); + messagebox_show(_("Error"), msg, true); + + is_success = false; + in_progress = false; + return; + } + } + else{ + string std_out; + string std_err; + ret_val = execute_command_script_sync(sh,out std_out, out std_err); + } + + //check for errors ---------------------- + + if (ret_val != 0){ + log_error(_("Restore failed with exit code") + ": %d".printf(ret_val)); + is_success = false; + in_progress = false; + } + else{ + log_msg(_("Restore completed without errors")); + is_success = true; + in_progress = false; + } + } + catch(Error e){ + log_error (e.message); + is_success = false; + in_progress = false; + } + } + + + public bool delete_snapshot(TimeShiftBackup bak){ + snapshot_to_delete = bak; + + try { + in_progress = true; + is_success = false; + Thread.create (delete_snapshot_thread, true); + } catch (ThreadError e) { + in_progress = false; + is_success = false; + log_error (e.message); + } + + while (in_progress){ + do_events (); + Thread.usleep((ulong) GLib.TimeSpan.MILLISECOND * 100); + } + + snapshot_to_delete = null; + + return is_success; + } + + public void delete_snapshot_thread(){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + in_progress = true; + + try{ + var f = File.new_for_path(snapshot_to_delete.path); + if(f.query_exists()){ + cmd = "rm -rfd \"%s\"".printf(snapshot_to_delete.path); + + if (SHOW_COMMANDS) { log_msg(cmd, true); } + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (ret_val != 0){ + log_error(_("Unable to delete") + ": '%s'".printf(snapshot_to_delete.name)); + is_success = false; + in_progress = false; + return; + } + else{ + log_msg(_("Snapshot deleted") + ": '%s'".printf(snapshot_to_delete.name)); + is_success = true; + in_progress = false; + return; + } + } + } + catch(Error e){ + log_error (e.message); + is_success = false; + in_progress = false; + return; + } + + in_progress = false; + } + + + public void save_app_config(){ + var config = new Json.Object(); + //config.set_string_member("enabled", is_scheduled.to_string()); + + config.set_string_member("backup_device_uuid", (snapshot_device == null) ? "" : snapshot_device.uuid); + + config.set_string_member("is_scheduled", is_scheduled.to_string()); + + config.set_string_member("schedule_monthly", schedule_monthly.to_string()); + config.set_string_member("schedule_weekly", schedule_weekly.to_string()); + config.set_string_member("schedule_daily", schedule_daily.to_string()); + config.set_string_member("schedule_hourly", schedule_hourly.to_string()); + config.set_string_member("schedule_boot", schedule_boot.to_string()); + + config.set_string_member("count_monthly", count_monthly.to_string()); + config.set_string_member("count_weekly", count_weekly.to_string()); + config.set_string_member("count_daily", count_daily.to_string()); + config.set_string_member("count_hourly", count_hourly.to_string()); + config.set_string_member("count_boot", count_boot.to_string()); + + config.set_string_member("max_days", retain_snapshots_max_days.to_string()); + config.set_string_member("min_space", minimum_free_disk_space_mb.to_string()); + + Json.Array arr = new Json.Array(); + foreach(string path in exclude_list_user){ + arr.add_string_element(path); + } + config.set_array_member("exclude",arr); + + var json = new Json.Generator(); + json.pretty = true; + json.indent = 2; + var node = new Json.Node(NodeType.OBJECT); + node.set_object(config); + json.set_root(node); + + try{ + json.to_file(this.app_conf_path); + } catch (Error e) { + log_error (e.message); + } + + log_msg(_("App config saved") + ": '%s'".printf(this.app_conf_path)); + } + + public void load_app_config(){ + var f = File.new_for_path(this.app_conf_path); + if (!f.query_exists()) { return; } + + var parser = new Json.Parser(); + try{ + parser.load_from_file(this.app_conf_path); + } catch (Error e) { + log_error (e.message); + } + var node = parser.get_root(); + var config = node.get_object(); + + string uuid = json_get_string(config,"backup_device_uuid",""); + foreach(PartitionInfo pi in partition_list){ + if (pi.uuid == uuid){ + snapshot_device = pi; + break; + } + } + + if (snapshot_device == null){ + log_msg (_("Warning: Backup device not set! Defaulting to system device")); + snapshot_device = root_device; + } + + if (mount_backup_device(snapshot_device)){ + update_partition_list(); + } + else{ + snapshot_device = null; + } + + this.is_scheduled = json_get_bool(config,"is_scheduled", is_scheduled); + + this.schedule_monthly = json_get_bool(config,"schedule_monthly",schedule_monthly); + this.schedule_weekly = json_get_bool(config,"schedule_weekly",schedule_weekly); + this.schedule_daily = json_get_bool(config,"schedule_daily",schedule_daily); + this.schedule_hourly = json_get_bool(config,"schedule_hourly",schedule_hourly); + this.schedule_boot = json_get_bool(config,"schedule_boot",schedule_boot); + + this.count_monthly = json_get_int(config,"count_monthly",count_monthly); + this.count_weekly = json_get_int(config,"count_weekly",count_weekly); + this.count_daily = json_get_int(config,"count_daily",count_daily); + this.count_hourly = json_get_int(config,"count_hourly",count_hourly); + this.count_boot = json_get_int(config,"count_boot",count_boot); + + this.retain_snapshots_max_days = json_get_int(config,"max_days",retain_snapshots_max_days); + this.minimum_free_disk_space_mb = json_get_int(config,"min_space",minimum_free_disk_space_mb); + + this.exclude_list_user.clear(); + if (config.has_member ("exclude")){ + foreach (Json.Node jnode in config.get_array_member ("exclude").get_elements()) { + string path = jnode.get_string(); + if (!exclude_list_user.contains(path) && !exclude_list_default.contains(path) && !exclude_list_home.contains(path)){ + this.exclude_list_user.add(path); + } + } + } + + log_msg(_("App config loaded") + ": '%s'".printf(this.app_conf_path)); + } + + + public bool update_snapshot_list(){ + + snapshot_list.clear(); + + if (is_snapshot_device_online() == false){ return false; } + + string path = mount_point_backup + "/timeshift/snapshots"; + + if (dir_exists(path)){ + + try{ + var dir = File.new_for_path (path); + var enumerator = dir.enumerate_children ("*", 0); + + var info = enumerator.next_file (); + while (info != null) { + if (info.get_file_type() == FileType.DIRECTORY) { + if (info.get_name() != ".sync") { + TimeShiftBackup bak = new TimeShiftBackup(path + "/" + info.get_name()); + snapshot_list.add(bak); + } + } + info = enumerator.next_file (); + } + + return true; + } + catch(Error e){ + log_error (e.message); + } + } + + snapshot_list.sort((a,b) => { + TimeShiftBackup t1 = (TimeShiftBackup) a; + TimeShiftBackup t2 = (TimeShiftBackup) b; + return t1.date.compare(t2.date); + }); + + debug(_("updated snapshot list")); + + return false; + } + + public void update_partition_list(){ + partition_list.clear(); + partition_list = get_all_partitions(); + + foreach(PartitionInfo pi in partition_list){ + if (pi.mount_point == "/"){ + root_device = pi; + } + if (pi.mount_point == "/home"){ + home_device = pi; + } + if (pi.mount_point == "/mnt/timeshift"){ + snapshot_device = pi; + } + if (pi.is_mounted){ + pi.dist_info = get_dist_info(pi.mount_point).full_name(); + } + } + if (partition_list.size == 0){ + log_error(_("Failed to get partition list.")); + } + + debug(_("updated partition list")); + } + + public Gee.ArrayList get_snapshot_list(string tag = ""){ + var list = new Gee.ArrayList(); + + foreach(TimeShiftBackup bak in snapshot_list){ + if (tag == "" || bak.has_tag(tag)){ + list.add(bak); + } + } + list.sort((a,b) => { + TimeShiftBackup t1 = (TimeShiftBackup) a; + TimeShiftBackup t2 = (TimeShiftBackup) b; + return (t1.date.compare(t2.date)); + }); + + return list; + } + + public TimeShiftBackup? get_latest_snapshot(string tag = ""){ + var list = get_snapshot_list(tag); + + if (list.size > 0) + return list[list.size - 1]; + else + return null; + } + + public TimeShiftBackup? get_oldest_snapshot(string tag = ""){ + var list = get_snapshot_list(tag); + + if (list.size > 0) + return list[0]; + else + return null; + } + + public bool mount_backup_device(PartitionInfo? dev = null){ + PartitionInfo backup_device = dev; + if (backup_device == null){ + backup_device = snapshot_device; + } + + if (backup_device == null){ + return false; + } + else{ + return mount_device(backup_device, mount_point_backup); + } + } + + public bool mount_target_device(){ + if (restore_target == null){ + return false; + } + else{ + return mount_device(restore_target, mount_point_restore); + } + } + + public bool mount_device(PartitionInfo dev, string mount_point){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + File file; + + try{ + + //check if device is specified ----------- + + if (dev == null){ + log_error (_("Failed to mount unknown partition")); + return false; + } + + //check if mount point exists + file = File.new_for_path(mount_point); + if (!file.query_exists()){ + file.make_directory_with_parents(); + } + + update_partition_list(); + + //check if mounted + bool mounted = false; + foreach(PartitionInfo info in partition_list){ + + if (info.mount_point == mount_point && info.device == dev.device){ + mounted = true; + break; + } + else if (info.mount_point == mount_point && info.device != dev.device){ + unmount_backup_device(); + } + } + + if (!mounted){ + //mount + cmd = "mount \"" + dev.device + "\" \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error (_("Failed to mount device") + " '%s' ".printf(dev.device) + _("at") + " '%s'".printf(mount_point)); + log_error (std_err); + return false; + } + else{ + log_msg (_("Mounted device") + " '%s' ".printf(dev.device) + _("at") + " '%s'".printf(mount_point)); + update_partition_list(); + } + } + } + catch(Error e){ + log_error (e.message); + return false; + } + + return true; + } + + public bool unmount_backup_device(bool force = true){ + return unmount_device(mount_point_backup,force); + } + + public bool unmount_target_device(bool force = true){ + return unmount_device(mount_point_restore,force); + } + + public bool unmount_device(string mount_point, bool force = true){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + bool quit_app = false; + + try{ + //check if mounted and unmount + foreach(PartitionInfo info in get_mounted_partitions()){ + if (info.mount_point == mount_point){ + + log_msg(_("Unmounting device") + " '%s' ".printf(info.device) + _("from") + " '%s'".printf(info.mount_point)); + + //unmount + cmd = "umount \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (ret_val != 0){ + + log_error (_("Failed to unmount device")); + log_error (std_err); + + if (force){ + //check if any process is using the mount_point + cmd = "fuser -m \"" + mount_point + "\""; + string proc_list = execute_command_sync_get_output(cmd); + + if ((proc_list != null) && (proc_list.length > 0)){ + + log_msg (_("Killing all processes using the mount-point...")); + + //kill the process + cmd = "fuser -mk \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (ret_val != 0){ + log_error (_("Failed to kill process")); + log_error (std_err); + quit_app = true; + } + else{ + + //ok, try again + cmd = "umount \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (ret_val != 0){ + log_error (_("Failed to unmount device") + " '%s' ".printf(info.device) + _("from") + " '%s'".printf(info.mount_point)); + log_error (std_err); + quit_app = true; + } + else{ + log_msg (_("Device unmounted")); + } + } + } + else{ + quit_app = true; + } + } + + //critical error - exit application + if (quit_app){ + if (app_mode.length > 0){ + log_error ("** " + _("Critical Error") + " ** - " + _("Failed to unmount partition!!")); + log_error (_("Application will exit!")); + } + else{ + messagebox_show(_("Critical Error"),_("Failed to unmount partition!!") + "\n" + _("Application will exit!"),true); + } + exit_app(); + exit(1); + } + } + else{ + log_msg (_("Device unmounted")); + } + } + } + } + catch(Error e){ + log_error (e.message); + return false; + } + + return true; + } + + + public void cron_job_update(){ + string crontab_entry = read_crontab_entry(); + string required_entry = get_crontab_string(); + + if (is_scheduled && snapshot_list.size > 0){ + if (crontab_entry.length > 0){ + if (crontab_entry == required_entry){ + return; + } + else{ + cron_job_remove(); + cron_job_add(); + } + } + else{ + cron_job_add(); + } + } + else{ + if (crontab_entry.length > 0){ + cron_job_remove(); + } + else{ + //do nothing + } + } + } + + private string get_crontab_string(){ + return "*/%d * * * * timeshift --backup".printf(cron_job_interval_mins); + } + + private string read_crontab_entry(){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + try{ + cmd = "crontab -l"; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + debug(_("Crontab is empty")); + } + else{ + foreach(string line in std_out.split("\n")){ + if (line.contains("timeshift")){ + return line.strip(); + } + } + } + + return ""; + } + catch(Error e){ + log_error (e.message); + return ""; + } + } + + private bool cron_job_add(){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + if (is_live_system()) { return false; } + + try{ + string temp_file = get_temp_file_path(); + write_file(temp_file, get_crontab_string() + "\n"); + + cmd = "crontab \"%s\"".printf(temp_file); + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + + if (ret_val != 0){ + log_error(std_err); + log_error(_("Failed to add cron job")); + return false; + } + else{ + log_msg(_("Cron job added")); + return true; + } + } + catch(Error e){ + log_error (e.message); + return false; + } + } + + private bool cron_job_remove(){ + + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + cmd = "crontab -l | sed '/timeshift/d' | crontab -"; + ret_val = execute_command_script_sync(cmd, out std_out, out std_err); + + if (ret_val != 0){ + log_error(_("Failed to remove cron job")); + return false; + } + else{ + log_msg(_("Cron job removed")); + return true; + } + } + + + public PartitionInfo? get_backup_device(){ + var list = get_mounted_partitions(); + foreach(PartitionInfo info in list){ + if (info.mount_point == "/mnt/timeshift"){ + return info; + } + } + + return null; + } + + public int check_backup_device(out string message){ + + /* + -1 - device un-available + 0 - first snapshot taken, disk space sufficient + 1 - first snapshot taken, disk space not sufficient + 2 - first snapshot not taken, disk space not sufficient + 3 - first snapshot not taken, disk space sufficient + */ + + int status_code = 0; + message = "%s ".printf(snapshot_device.free) + _("free"); + message = message.strip(); + + if (!is_live_system()){ + if (is_snapshot_device_online() == false){ + message = _("Backup device not available!"); + status_code = -1; + } + else{ + if (snapshot_list.size > 0){ + if (snapshot_device.free_mb < minimum_free_disk_space_mb){ + message = _("Backup device does not have enough space!"); + status_code = 1; + } + } + else { + long required_space = calculate_size_of_first_snapshot(); + message = _("First snapshot needs") + " %.1f GB".printf(required_space/1024.0); + if (snapshot_device.free_mb < required_space){ + status_code = 2; + } + else{ + status_code = 3; + } + } + } + } + + debug("check backup device: status = %d".printf(status_code)); + + return status_code; + } + + public bool is_snapshot_device_online(){ + //check if mounted + foreach(PartitionInfo info in get_mounted_partitions()){ + if (info.mount_point == mount_point_backup){ + return true; + } + } + + return false; + } + + public long calculate_size_of_first_snapshot(){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + long required_space = 0; + + if (this.first_snapshot_size > 0){ + return this.first_snapshot_size; + } + else if (is_live_system()){ + return 0; + } + + try{ + + var f = File.new_for_path("/tmp/exclude.list"); + if (f.query_exists()){ + f.delete(); + } + + save_exclude_list("/tmp"); + + cmd = "du --summarize --one-file-system --exclude-from=/tmp/exclude.list /"; + + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error (_("Failed to estimate system size")); + log_error (std_err); + return 0; + } + else{ + required_space = long.parse(std_out.replace("/","").strip()); + required_space = required_space / 1024; + } + } + catch(Error e){ + log_error (e.message); + } + + if (required_space == 0){ + required_space = root_device.used_mb; + } + + this.first_snapshot_size = required_space; + + debug("check first snapshot size: %ld MB".printf(required_space)); + + return required_space; + } + + public void clean_logs(){ + + Gee.ArrayList list = new Gee.ArrayList(); + + try{ + var dir = File.new_for_path (log_dir); + var enumerator = dir.enumerate_children ("*", 0); + + var info = enumerator.next_file (); + string path; + + while (info != null) { + if (info.get_file_type() == FileType.REGULAR) { + path = log_dir + "/" + info.get_name(); + if (path != log_file) { + list.add(path); + } + } + info = enumerator.next_file (); + } + + list.sort(strcmp); + + if (list.size > 500){ + for(int k=0; k<100; k++){ + var file = File.new_for_path (list[k]); + if (file.query_exists()){ + file.delete(); + } + } + log_msg(_("Older log files removed")); + } + } + catch(Error e){ + log_error (e.message); + } + } + + public void exit_app (){ + save_app_config(); + + cron_job_update(); + + //soft-unmount always + unmount_backup_device(false); + + clean_logs(); + remove_lock(); + + //Gtk.main_quit (); + } +} + +public class TimeShiftBackup : GLib.Object{ + public string path = ""; + public string name = ""; + public DateTime date; + public string sys_uuid = ""; + public string sys_distro = ""; + public string app_version = ""; + public string description = ""; + public Gee.ArrayList tags; + public Gee.ArrayList exclude_list; + + public TimeShiftBackup(string dir_path){ + + try{ + var f = File.new_for_path(dir_path); + var info = f.query_info("*", FileQueryInfoFlags.NONE); + + path = dir_path; + name = info.get_name(); + description = ""; + date = new DateTime.from_timeval_local(info.get_modification_time()); + tags = new Gee.ArrayList(); + exclude_list = new Gee.ArrayList(); + + read_control_file(); + read_exclude_list(); + } + catch(Error e){ + log_error (e.message); + } + } + + public string taglist{ + owned get{ + string str = ""; + foreach(string tag in tags){ + str += " " + tag; + } + return str.strip(); + } + set{ + tags.clear(); + foreach(string tag in value.split(" ")){ + if (!tags.contains(tag.strip())){ + tags.add(tag.strip()); + } + } + } + } + + public void add_tag(string tag){ + if (!tags.contains(tag.strip())){ + tags.add(tag.strip()); + update_control_file(); + } + } + + public void remove_tag(string tag){ + if (tags.contains(tag.strip())){ + tags.remove(tag.strip()); + update_control_file(); + } + } + + public bool has_tag(string tag){ + return tags.contains(tag.strip()); + } + + public void read_control_file(){ + string ctl_file = path + "/info.json"; + var f = File.new_for_path(ctl_file); + if (f.query_exists()) { + var parser = new Json.Parser(); + try{ + parser.load_from_file(ctl_file); + } catch (Error e) { + log_error (e.message); + } + var node = parser.get_root(); + var config = node.get_object(); + + string val = json_get_string(config,"created",""); + if (val.length > 0) { + DateTime date_utc = new DateTime.from_unix_utc(int64.parse(val)); + date = date_utc.to_local(); + } + + sys_uuid = json_get_string(config,"sys-uuid",""); + sys_distro = json_get_string(config,"sys-distro",""); + taglist = json_get_string(config,"tags",""); + description = json_get_string(config,"comments",""); + app_version = json_get_string(config,"app-version",""); + } + } + + public void read_exclude_list(){ + string list_file = path + "/exclude.list"; + + exclude_list.clear(); + foreach(string path in read_file(list_file).split("\n")){ + path = path.strip(); + if (!exclude_list.contains(path) && path.length > 0){ + exclude_list.add(path); + } + } + } + + public void update_control_file(){ + try{ + string ctl_file = path + "/info.json"; + var f = File.new_for_path(ctl_file); + + if (f.query_exists()) { + + var parser = new Json.Parser(); + try{ + parser.load_from_file(ctl_file); + } catch (Error e) { + log_error (e.message); + } + var node = parser.get_root(); + var config = node.get_object(); + + config.set_string_member("tags", taglist); + config.set_string_member("comments", description); + + var json = new Json.Generator(); + json.pretty = true; + json.indent = 2; + node.set_object(config); + json.set_root(node); + f.delete(); + json.to_file(ctl_file); + } + } catch (Error e) { + log_error (e.message); + } + } +} + + + diff --git a/src/MainWindow.vala b/src/MainWindow.vala new file mode 100644 index 0000000..e401ea9 --- /dev/null +++ b/src/MainWindow.vala @@ -0,0 +1,1285 @@ +/* + * MainWindow.vala + * + * Copyright 2013 Tony George + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * + */ + +using Gtk; +using Gee; +using Utility; + +class MainWindow : Gtk.Window{ + + private Box vbox_main; + + //snapshots + private Toolbar toolbar; + private ToolButton btn_backup; + private ToolButton btn_restore; + private ToolButton btn_delete_snapshot; + private ToolButton btn_browse_snapshot; + private ToolButton btn_settings; + private ToolButton btn_refresh_snapshots; + private ToolButton btn_view_snapshot_log; + private ToolButton btn_view_app_logs; + private ToolButton btn_about; + + //backup device + private Box hbox_device; + private Label lbl_backup_device; + private ComboBox cmb_backup_device; + private Button btn_refresh_backup_device_list; + private Label lbl_backup_device_warning; + + //snapshots + private ScrolledWindow sw_backups; + private TreeView tv_backups; + private TreeViewColumn col_date; + private TreeViewColumn col_tags; + private TreeViewColumn col_system; + private TreeViewColumn col_desc; + private int tv_backups_sort_column_index = 0; + private bool tv_backups_sort_column_desc = true; + + //statusbar + private Box hbox_statusbar; + private Gtk.Image img_status_spinner; + private Gtk.Image img_status_dot; + private Label lbl_status; + private Label lbl_status_scheduled; + private Gtk.Image img_status_scheduled; + private Label lbl_status_latest; + private Gtk.Image img_status_latest; + private Label lbl_status_device; + private Gtk.Image img_status_device; + private Gtk.Image img_status_progress; + + //timers + private uint timer_status_message; + private uint timer_status_check; + private uint timer_progress; + private uint timer_backup_device_init; + + //other + private PartitionInfo snapshot_device_original; + + public MainWindow () { + this.title = AppName + " v" + AppVersion + " by " + AppAuthor + " (" + "teejeetech.blogspot.in" + ")"; + this.window_position = WindowPosition.CENTER; + this.modal = true; + this.set_default_size (700, 500); + this.delete_event.connect(on_delete_event); + + //set app icon + try{ + this.icon = new Gdk.Pixbuf.from_file (App.share_folder + """/pixmaps/timeshift.png"""); + } + catch(Error e){ + log_error (e.message); + } + + //vboxMain + vbox_main = new Box (Orientation.VERTICAL, 0); + vbox_main.margin = 0; + add (vbox_main); + + //toolbar --------------------------------------------------- + + //toolbar + toolbar = new Gtk.Toolbar (); + toolbar.toolbar_style = ToolbarStyle.BOTH_HORIZ; + toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR); + //toolbar.set_size_request(-1,48); + vbox_main.add(toolbar); + + //btn_backup + btn_backup = new Gtk.ToolButton.from_stock (Gtk.Stock.SAVE); + btn_backup.is_important = true; + btn_backup.label = _("Backup"); + btn_backup.set_tooltip_text (_("Take a manual (ondemand) snapshot")); + toolbar.add(btn_backup); + + btn_backup.clicked.connect (btn_backup_clicked); + + //btn_restore + btn_restore = new Gtk.ToolButton.from_stock (Gtk.Stock.APPLY); + btn_restore.is_important = true; + btn_restore.label = _("Restore"); + btn_restore.set_tooltip_text (_("Restore Snapshot")); + toolbar.add(btn_restore); + + btn_restore.clicked.connect (btn_restore_clicked); + + //btn_browse_snapshot + btn_browse_snapshot = new Gtk.ToolButton.from_stock (Gtk.Stock.DIRECTORY); + btn_browse_snapshot.is_important = true; + btn_browse_snapshot.label = _("Browse"); + btn_browse_snapshot.set_tooltip_text (_("Browse Snapshot")); + toolbar.add(btn_browse_snapshot); + + btn_browse_snapshot.clicked.connect (btn_browse_snapshot_clicked); + + //btn_delete_snapshot + btn_delete_snapshot = new Gtk.ToolButton.from_stock (Gtk.Stock.DELETE); + btn_delete_snapshot.is_important = true; + btn_delete_snapshot.label = _("Delete"); + btn_delete_snapshot.set_tooltip_text (_("Delete Snapshot")); + toolbar.add(btn_delete_snapshot); + + btn_delete_snapshot.clicked.connect (btn_delete_snapshot_clicked); + + //btn_settings + btn_settings = new Gtk.ToolButton.from_stock (Gtk.Stock.PREFERENCES); + btn_settings.is_important = true; + btn_settings.label = _("Settings"); + btn_settings.set_tooltip_text (_("Settings")); + toolbar.add(btn_settings); + + btn_settings.clicked.connect (btn_settings_clicked); + + //separator + var separator = new Gtk.SeparatorToolItem(); + separator.set_draw (false); + separator.set_expand (true); + toolbar.add (separator); + + //btn_refresh_snapshots + btn_refresh_snapshots = new Gtk.ToolButton.from_stock (Gtk.Stock.REFRESH); + btn_refresh_snapshots.label = _("Refresh"); + btn_refresh_snapshots.set_tooltip_text (_("Refresh Snapshot List")); + toolbar.add(btn_refresh_snapshots); + + btn_refresh_snapshots.clicked.connect (() => { + App.update_snapshot_list(); + refresh_tv_backups(); + }); + + //btn_view_snapshot_log + btn_view_snapshot_log = new Gtk.ToolButton.from_stock (Gtk.Stock.FILE); + btn_view_snapshot_log.label = _("Log"); + btn_view_snapshot_log.set_tooltip_text (_("View rsync log for selected snapshot")); + toolbar.add(btn_view_snapshot_log); + + btn_view_snapshot_log.clicked.connect (btn_view_snapshot_log_clicked); + + //btn_view_app_logs + btn_view_app_logs = new Gtk.ToolButton.from_stock (Gtk.Stock.FILE); + btn_view_app_logs.label = _("TimeShift Logs"); + btn_view_app_logs.set_tooltip_text (_("View TimeShift Logs")); + toolbar.add(btn_view_app_logs); + + btn_view_app_logs.clicked.connect (btn_view_app_logs_clicked); + + //btn_about + btn_about = new Gtk.ToolButton.from_stock (Gtk.Stock.ABOUT); + btn_about.label = _("About"); + btn_about.set_tooltip_text (_("About TimeShift")); + toolbar.add(btn_about); + + btn_about.clicked.connect (btn_about_clicked); + + //backup device ------------------------------------------------ + + //hbox_device + hbox_device = new Box (Orientation.HORIZONTAL, 6); + hbox_device.margin_top = 6; + hbox_device.margin_left = 6; + hbox_device.margin_right = 6; + vbox_main.add (hbox_device); + + //lbl_backup_device + lbl_backup_device = new Gtk.Label(_("Backup Device")); + lbl_backup_device.xalign = (float) 0.0; + hbox_device.add(lbl_backup_device); + + //cmb_backup_device + cmb_backup_device = new ComboBox (); + cmb_backup_device.hexpand = true; + cmb_backup_device.set_tooltip_markup(_("Snapshots will be saved in path /timeshift on selected device")); + hbox_device.add(cmb_backup_device); + + CellRendererText cell_backup_dev_margin = new CellRendererText (); + cell_backup_dev_margin.text = ""; + cmb_backup_device.pack_start (cell_backup_dev_margin, false); + + CellRendererPixbuf cell_backup_dev_icon = new CellRendererPixbuf (); + cell_backup_dev_icon.stock_id = Stock.HARDDISK; + cmb_backup_device.pack_start (cell_backup_dev_icon, false); + + CellRendererText cell_backup_device = new CellRendererText(); + cmb_backup_device.pack_start( cell_backup_device, false ); + cmb_backup_device.set_cell_data_func (cell_backup_device, cell_backup_device_render); + + cmb_backup_device.changed.connect(cmb_backup_device_changed); + + //btn_refresh_backup_device_list + btn_refresh_backup_device_list = new Gtk.Button.with_label (" " + _("Refresh") + " "); + btn_refresh_backup_device_list.set_size_request(50,-1); + btn_refresh_backup_device_list.set_tooltip_text(_("Refresh Devices")); + btn_refresh_backup_device_list.clicked.connect(()=>{ + App.update_partition_list(); + refresh_cmb_backup_device(); + refresh_tv_backups(); + }); + hbox_device.add(btn_refresh_backup_device_list); + + //lbl_backup_device_warning + lbl_backup_device_warning = new Gtk.Label(""); + lbl_backup_device_warning.set_use_markup(true); + lbl_backup_device_warning.xalign = (float) 0.0; + lbl_backup_device_warning.no_show_all = true; + lbl_backup_device_warning.margin_left = 6; + lbl_backup_device_warning.margin_top = 6; + lbl_backup_device_warning.margin_bottom = 6; + vbox_main.add(lbl_backup_device_warning); + + //snapshot list ---------------------------------------------- + + //tv_backups + tv_backups = new TreeView(); + tv_backups.get_selection().mode = SelectionMode.MULTIPLE; + tv_backups.headers_clickable = true; + tv_backups.set_rules_hint (true); + + //sw_backups + sw_backups = new ScrolledWindow(null, null); + sw_backups.set_shadow_type (ShadowType.ETCHED_IN); + sw_backups.add (tv_backups); + sw_backups.expand = true; + sw_backups.margin_left = 6; + sw_backups.margin_right = 6; + sw_backups.margin_top = 6; + sw_backups.margin_bottom = 6; + vbox_main.add(sw_backups); + + //col_date + col_date = new TreeViewColumn(); + col_date.title = _("Snapshot"); + col_date.clickable = true; + col_date.resizable = true; + col_date.spacing = 1; + + CellRendererPixbuf cell_backup_icon = new CellRendererPixbuf (); + cell_backup_icon.stock_id = Stock.FLOPPY; + cell_backup_icon.xpad = 1; + col_date.pack_start (cell_backup_icon, false); + + CellRendererText cell_date = new CellRendererText (); + col_date.pack_start (cell_date, false); + col_date.set_cell_data_func (cell_date, cell_date_render); + + tv_backups.append_column(col_date); + + col_date.clicked.connect(() => { + if(tv_backups_sort_column_index == 0){ + tv_backups_sort_column_desc = !tv_backups_sort_column_desc; + } + else{ + tv_backups_sort_column_index = 0; + tv_backups_sort_column_desc = true; + } + refresh_tv_backups(); + }); + + //col_system + col_system = new TreeViewColumn(); + col_system.title = _("System"); + col_system.resizable = true; + col_system.clickable = true; + col_system.min_width = 150; + + CellRendererText cell_system = new CellRendererText (); + cell_system.ellipsize = Pango.EllipsizeMode.END; + col_system.pack_start (cell_system, false); + col_system.set_cell_data_func (cell_system, cell_system_render); + tv_backups.append_column(col_system); + + col_system.clicked.connect(() => { + if(tv_backups_sort_column_index == 1){ + tv_backups_sort_column_desc = !tv_backups_sort_column_desc; + } + else{ + tv_backups_sort_column_index = 1; + tv_backups_sort_column_desc = false; + } + refresh_tv_backups(); + }); + + //col_tags + col_tags = new TreeViewColumn(); + col_tags.title = _("Tags"); + col_tags.resizable = true; + col_tags.min_width = 80; + col_tags.clickable = true; + CellRendererText cell_tags = new CellRendererText (); + cell_tags.ellipsize = Pango.EllipsizeMode.END; + col_tags.pack_start (cell_tags, false); + col_tags.set_cell_data_func (cell_tags, cell_tags_render); + tv_backups.append_column(col_tags); + + col_tags.clicked.connect(() => { + if(tv_backups_sort_column_index == 2){ + tv_backups_sort_column_desc = !tv_backups_sort_column_desc; + } + else{ + tv_backups_sort_column_index = 2; + tv_backups_sort_column_desc = false; + } + refresh_tv_backups(); + }); + + //cell_desc + col_desc = new TreeViewColumn(); + col_desc.title = _("Comments"); + col_desc.resizable = true; + col_desc.clickable = true; + CellRendererText cell_desc = new CellRendererText (); + cell_desc.ellipsize = Pango.EllipsizeMode.END; + col_desc.pack_start (cell_desc, false); + col_desc.set_cell_data_func (cell_desc, cell_desc_render); + tv_backups.append_column(col_desc); + cell_desc.editable = true; + + cell_desc.edited.connect (cell_desc_edited); + + //hbox_statusbar + hbox_statusbar = new Box (Orientation.HORIZONTAL, 6); + hbox_statusbar.margin_bottom = 1; + hbox_statusbar.margin_left = 6; + hbox_statusbar.margin_right = 12; + vbox_main.add (hbox_statusbar); + + //img_status_spinner + img_status_spinner = new Gtk.Image(); + img_status_spinner.file = App.share_folder + "/timeshift/images/spinner.gif"; + img_status_spinner.no_show_all = true; + hbox_statusbar.add(img_status_spinner); + + //img_status_dot + img_status_dot = new Gtk.Image(); + img_status_dot.file = App.share_folder + "/timeshift/images/item-green.gif"; + img_status_dot.no_show_all = true; + hbox_statusbar.add(img_status_dot); + + //lbl_status + lbl_status = new Gtk.Label(""); + lbl_status.no_show_all = true; + hbox_statusbar.add(lbl_status); + + //img_status_device + img_status_device = new Gtk.Image(); + img_status_device.no_show_all = true; + hbox_statusbar.add(img_status_device); + + //lbl_status_device + lbl_status_device = new Gtk.Label(""); + lbl_status_device.set_use_markup(true); + lbl_status_device.no_show_all = true; + hbox_statusbar.add(lbl_status_device); + + //img_status_scheduled + img_status_scheduled = new Gtk.Image(); + img_status_scheduled.no_show_all = true; + hbox_statusbar.add(img_status_scheduled); + + //lbl_status_scheduled + lbl_status_scheduled = new Gtk.Label(""); + lbl_status_scheduled.set_use_markup(true); + lbl_status_scheduled.no_show_all = true; + hbox_statusbar.add(lbl_status_scheduled); + + //img_status_latest + img_status_latest = new Gtk.Image(); + img_status_latest.no_show_all = true; + hbox_statusbar.add(img_status_latest); + + //lbl_status_latest + lbl_status_latest = new Gtk.Label(""); + lbl_status_latest.set_use_markup(true); + lbl_status_latest.no_show_all = true; + hbox_statusbar.add(lbl_status_latest); + + //lbl_status_separator + Label lbl_status_separator = new Gtk.Label(""); + hbox_statusbar.hexpand = true; + hbox_statusbar.pack_start(lbl_status_separator,true,true,0); + + //img_status_progress + img_status_progress = new Gtk.Image(); + img_status_progress.file = App.share_folder + "/timeshift/images/progress.gif"; + img_status_progress.no_show_all = true; + hbox_statusbar.add(img_status_progress); + + snapshot_device_original = App.snapshot_device; + + if (App.is_live_system()){ + btn_backup.sensitive = false; + btn_settings.sensitive = false; + btn_view_app_logs.sensitive = false; + } + + timer_backup_device_init = Timeout.add(100, initialize_backup_device); + timer_status_check = Timeout.add_seconds(60, check_status); + } + + private bool initialize_backup_device(){ + if (timer_backup_device_init > 0){ + Source.remove(timer_backup_device_init); + } + + update_ui(false); + + if (App.is_live_system()){ + statusbar_message(_("Checking backup device...")); + } + else{ + statusbar_message(_("Estimating system size...")); + } + + refresh_cmb_backup_device(); + refresh_tv_backups(); + check_status(); + + update_ui(true); + + return true; + } + + private bool on_delete_event(Gdk.EventAny event){ + + this.delete_event.disconnect(on_delete_event); //disconnect this handler + + if (!App.is_scheduled){ + return false; //close window + } + + //else - check backup device ------------------------------- + + string message; + int status_code = App.check_backup_device(out message); + + switch(status_code){ + case 1: + string msg = message + "\n"; + msg += _("Scheduled snapshots will be disabled."); + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK_CANCEL, msg); + dialog.set_title(_("Disable Scheduled Snapshots")); + dialog.set_default_size (300, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + int response = dialog.run(); + dialog.destroy(); + + if (response == Gtk.ResponseType.OK){ + App.is_scheduled = false; + return false; //close window + } + else{ + this.delete_event.connect(on_delete_event); //reconnect this handler + return true; //keep window open + } + + case 2: + string msg = _("Selected device does not have enough space.") + "\n"; + msg += _("Scheduled snapshots will be disabled till another device is selected.") + "\n"; + msg += _("Do you want to select another device now?") + "\n"; + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, msg); + dialog.set_title(_("Disable Scheduled Snapshots")); + dialog.set_default_size (300, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + int response = dialog.run(); + dialog.destroy(); + + if (response == Gtk.ResponseType.YES){ + this.delete_event.connect(on_delete_event); //reconnect this handler + return true; //keep window open + } + else{ + App.is_scheduled = false; + return false; //close window + } + + case 3: + string msg = _("Scheduled jobs will be enabled only after the first snapshot is taken.") + "\n"; + msg += message + (" space and 10 minutes to complete.") + "\n"; + msg += _("Do you want to take the first snapshot now?") + "\n"; + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, msg); + dialog.set_title(_("First Snapshot")); + dialog.set_default_size (300, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + int response = dialog.run(); + dialog.destroy(); + + if (response == Gtk.ResponseType.YES){ + btn_backup_clicked(); + this.delete_event.connect(on_delete_event); //reconnect this handler + return true; //keep window open + } + else{ + App.is_scheduled = false; + return false; //close window + } + + case 0: + if (App.snapshot_device.uuid != snapshot_device_original.uuid){ + debug(_("snapshot device changed")); + + string msg = _("Scheduled snapshots will be saved to ") + "%s\n".printf(App.snapshot_device.device); + msg += _("Click 'OK' to confirm") + "\n"; + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK_CANCEL, msg); + dialog.set_title(_("Backup Device Changed")); + dialog.set_default_size (300, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + int response = dialog.run(); + dialog.destroy(); + + if (response == Gtk.ResponseType.CANCEL){ + this.delete_event.connect(on_delete_event); //reconnect this handler + return true; //keep window open + } + } + break; + + case -1: + string msg = _("The backup device is not set or unavailable.") + "\n"; + msg += _("Scheduled snapshots will be disabled."); + msg += _("Do you want to select another device?"); + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK_CANCEL, msg); + dialog.set_title(_("Backup Device Changed")); + dialog.set_default_size (300, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + int response = dialog.run(); + dialog.destroy(); + + if (response == Gtk.ResponseType.YES){ + this.delete_event.connect(on_delete_event); //reconnect this handler + return true; //keep window open + } + else{ + App.is_scheduled = false; + return false; //close window + } + + } + + return false; + } + + private void cell_date_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + TimeShiftBackup bak; + model.get (iter, 0, out bak, -1); + (cell as Gtk.CellRendererText).text = bak.date.format ("%Y-%m-%d %H:%M:%S"); + } + + private void cell_tags_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + TimeShiftBackup bak; + model.get (iter, 0, out bak, -1); + (cell as Gtk.CellRendererText).text = bak.taglist; + } + + private void cell_system_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + TimeShiftBackup bak; + model.get (iter, 0, out bak, -1); + (cell as Gtk.CellRendererText).text = bak.sys_distro; + } + + private void cell_desc_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + TimeShiftBackup bak; + model.get (iter, 0, out bak, -1); + (cell as Gtk.CellRendererText).text = bak.description; + } + + private void cell_desc_edited (string path, string new_text) { + TimeShiftBackup bak; + + TreeIter iter; + ListStore model = (ListStore) tv_backups.model; + model.get_iter_from_string (out iter, path); + model.get (iter, 0, out bak, -1); + bak.description = new_text; + bak.update_control_file(); + } + + private void cell_backup_device_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo info; + model.get (iter, 0, out info, -1); + (cell as Gtk.CellRendererText).text = info.description(); + } + + private void refresh_tv_backups(){ + + App.update_snapshot_list(); + + ListStore model = new ListStore(1, typeof(TimeShiftBackup)); + + var list = App.snapshot_list; + + if (tv_backups_sort_column_index == 0){ + + if (tv_backups_sort_column_desc) + { + list.sort((a,b) => { + TimeShiftBackup t1 = (TimeShiftBackup) a; + TimeShiftBackup t2 = (TimeShiftBackup) b; + + return (t1.date.compare(t2.date)); + }); + } + else{ + list.sort((a,b) => { + TimeShiftBackup t1 = (TimeShiftBackup) a; + TimeShiftBackup t2 = (TimeShiftBackup) b; + + return -1 * (t1.date.compare(t2.date)); + }); + } + } + else{ + if (tv_backups_sort_column_desc) + { + list.sort((a,b) => { + TimeShiftBackup t1 = (TimeShiftBackup) a; + TimeShiftBackup t2 = (TimeShiftBackup) b; + + return strcmp(t1.taglist,t2.taglist); + }); + } + else{ + list.sort((a,b) => { + TimeShiftBackup t1 = (TimeShiftBackup) a; + TimeShiftBackup t2 = (TimeShiftBackup) b; + + return -1 * strcmp(t1.taglist,t2.taglist); + }); + } + } + + TreeIter iter; + foreach(TimeShiftBackup bak in list) { + model.append(out iter); + model.set (iter, 0, bak); + } + + tv_backups.set_model (model); + tv_backups.columns_autosize (); + } + + private void refresh_cmb_backup_device(){ + ListStore store = new ListStore(1, typeof(PartitionInfo)); + + TreeIter iter; + + int index = -1; + int index_selected = -1; + int index_default = -1; + + foreach(PartitionInfo pi in App.partition_list) { + + if (!pi.has_linux_filesystem()) { continue; } + + store.append(out iter); + store.set (iter, 0, pi); + + index++; + if ((App.root_device != null) && (pi.device == App.root_device.device)){ + index_default = index; + } + if ((App.snapshot_device != null) && (pi.device == App.snapshot_device.device)){ + index_selected = index; + } + } + + if (index_selected > -1){ + //ok + } + else if (index_default > -1){ + index_selected = index_default; + } + else if (index > -1){ + index_selected = 0; + } + + cmb_backup_device.set_model (store); + cmb_backup_device.active = index_selected; + + debug("cmb_backup_device refreshed"); + } + + private void cmb_backup_device_changed(){ + ComboBox combo = cmb_backup_device; + if (combo.model == null) { return; } + + string txt; + + if (combo.active < 0) { + txt = "" + _("WARNING:") + "\n"; + txt += "Ø " + _("Please select a device for saving snapshots.") + "\n"; + txt = "" + txt + ""; + lbl_backup_device_warning.label = txt; + App.snapshot_device = null; + return; + } + + set_busy(true, this); + + TreeIter iter; + PartitionInfo pi; + combo.get_active_iter (out iter); + TreeModel model = (TreeModel) combo.model; + model.get(iter, 0, out pi); + + App.snapshot_device = pi; + App.mount_backup_device(); + App.update_snapshot_list(); + + refresh_tv_backups(); + check_status(); + + set_busy(false, this); + } + + private void btn_backup_clicked(){ + //check snapshot device ----------- + + string msg; + int status_code = App.check_backup_device(out msg); + if ((status_code == 1) || (status_code == 2)){ + messagebox_show(_("Low Disk Space"),_("Backup device does not have enough space!"), true); + return; + } + + //update UI ------------------ + + update_ui(false); + + statusbar_message(_("Taking snapshot...")); + + update_progress_start(); + + //take snapshot ---------------- + + bool is_success = App.take_snapshot(true); + + update_progress_stop(); + + if (is_success){ + statusbar_message_with_timeout(_("Snapshot saved successfully"), true); + } + else{ + statusbar_message_with_timeout(_("Error: Unable to save snapshot"), false); + } + + //update UI ------------------- + + App.update_partition_list(); + refresh_cmb_backup_device(); + refresh_tv_backups(); + check_status(); + + update_ui(true); + } + + private void btn_delete_snapshot_clicked(){ + TreeIter iter; + TreeIter iter_delete; + TreeSelection sel; + bool is_success = true; + + //check selected count ---------------- + + sel = tv_backups.get_selection (); + if (sel.count_selected_rows() == 0){ + messagebox_show(_("No Snapshots Selected"),_("Please select the snapshots to delete"),false); + return; + } + + //update UI ------------------ + + update_ui(false); + + statusbar_message(_("Removing selected snapshots...")); + + //get list of snapshots to delete -------------------- + + var list_of_snapshots_to_delete = new Gee.ArrayList(); + ListStore store = (ListStore) tv_backups.model; + + bool iterExists = store.get_iter_first (out iter); + while (iterExists && is_success) { + if (sel.iter_is_selected (iter)){ + TimeShiftBackup bak; + store.get (iter, 0, out bak); + list_of_snapshots_to_delete.add(bak); + } + iterExists = store.iter_next (ref iter); + } + + //clear selection --------------- + + tv_backups.get_selection().unselect_all(); + + //delete snapshots -------------------------- + + foreach(TimeShiftBackup bak in list_of_snapshots_to_delete){ + + //find the iter being deleted + iterExists = store.get_iter_first (out iter_delete); + while (iterExists) { + TimeShiftBackup bak_current; + store.get (iter_delete, 0, out bak_current); + if (bak_current.path == bak.path){ + break; + } + iterExists = store.iter_next (ref iter_delete); + } + + //select the iter being deleted + tv_backups.get_selection().select_iter(iter_delete); + + statusbar_message(_("Deleting snapshot") + ": '%s'...".printf(bak.name)); + + is_success = App.delete_snapshot(bak); + + if (!is_success){ + statusbar_message_with_timeout(_("Error: Unable to delete snapshot") + ": '%s'".printf(bak.name), false); + break; + } + + //remove iter from tv_backups + store.remove(iter_delete); + } + + if (is_success){ + statusbar_message_with_timeout(_("Snapshots deleted successfully"), true); + } + + //update UI ------------------- + + App.update_partition_list(); + refresh_cmb_backup_device(); + refresh_tv_backups(); + check_status(); + + update_ui(true); + } + + private void btn_restore_clicked(){ + TreeIter iter; + TreeSelection sel; + + //check if single snapshot is selected ------------- + + sel = tv_backups.get_selection (); + if (sel.count_selected_rows() == 0){ + messagebox_show(_("No Snapshots Selected"), _("Please select the snapshot to restore"),false); + return; + } + else if (sel.count_selected_rows() > 1){ + messagebox_show(_("Multiple Snapshots Selected"), _("Please select a single snapshot"),false); + return; + } + + //get selected snapshot ------------------ + + TimeShiftBackup snapshot_to_restore = null; + + ListStore store = (ListStore) tv_backups.model; + sel = tv_backups.get_selection(); + bool iterExists = store.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + store.get (iter, 0, out snapshot_to_restore); + break; + } + iterExists = store.iter_next (ref iter); + } + + App.snapshot_to_restore = snapshot_to_restore; + App.restore_target = App.root_device; + + //show restore window ----------------- + + var dialog = new RestoreWindow(); + dialog.set_transient_for (this); + dialog.show_all(); + int response = dialog.run(); + dialog.destroy(); + + if (response == Gtk.ResponseType.OK){ + //ok + } + else{ + return; //cancel + } + + //update UI ---------------- + + update_ui(false); + + //take a snapshot if current system is being restored ----------------- + + if (!App.is_live_system() && (App.restore_target.device == App.root_device.device) && (App.restore_target.uuid == App.root_device.uuid)){ + statusbar_message(_("Taking snapshot...")); + + update_progress_start(); + + bool is_success = App.take_snapshot(true); + + update_progress_stop(); + + if (is_success){ + App.update_snapshot_list(); + var latest = App.get_latest_snapshot("ondemand"); + latest.description = _("Before restoring") + " '%s'".printf(App.snapshot_to_restore.name); + latest.update_control_file(); + } + } + + //restore the snapshot -------------------- + + statusbar_message(_("Restoring snapshot") + ": '%s'...".printf(App.snapshot_to_restore.name)); + + bool is_success = App.restore_snapshot(); + if (is_success){ + statusbar_message_with_timeout(_("Snapshot restored successfully"), true); + messagebox_show(_("Restore Complete"), _("Snapshot restored successfully"),false); + } + else{ + statusbar_message_with_timeout(_("Restore Failed!"), true); + messagebox_show(_("Restore Failed!"), _("Restore was not successful!"),false); + } + + //update UI ---------------- + + update_ui(true); + } + + private void btn_settings_clicked(){ + var dialog = new SettingsWindow(); + dialog.set_transient_for (this); + dialog.response.connect ((response_id) => { + if (response_id == Gtk.ResponseType.CANCEL || response_id == Gtk.ResponseType.DELETE_EVENT) { + dialog.hide_on_delete (); + } + }); + + dialog.show_all(); + dialog.run(); + check_status(); + } + + private void btn_browse_snapshot_clicked(){ + TreeSelection sel = tv_backups.get_selection (); + if (sel.count_selected_rows() == 0){ + var f = File.new_for_path(App.snapshot_dir); + if (f.query_exists()){ + exo_open_folder(App.snapshot_dir); + } + return; + } + + TreeIter iter; + ListStore store = (ListStore)tv_backups.model; + + bool iterExists = store.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + TimeShiftBackup bak; + store.get (iter, 0, out bak); + + exo_open_folder(bak.path + "/localhost"); + return; + } + iterExists = store.iter_next (ref iter); + } + } + + private void btn_view_snapshot_log_clicked(){ + TreeSelection sel = tv_backups.get_selection (); + if (sel.count_selected_rows() == 0){ + messagebox_show(_("Select Snapshot"),_("Please select a snapshot to view the log!"),false); + return; + } + + TreeIter iter; + ListStore store = (ListStore)tv_backups.model; + + bool iterExists = store.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + TimeShiftBackup bak; + store.get (iter, 0, out bak); + + exo_open_textfile(bak.path + "/rsync-log"); + return; + } + iterExists = store.iter_next (ref iter); + } + } + + private void btn_view_app_logs_clicked(){ + exo_open_folder(App.log_dir); + } + + private void btn_about_clicked (){ + + var dialog = new Gtk.AboutDialog(); + dialog.set_destroy_with_parent (true); + dialog.set_transient_for (this); + dialog.set_modal (true); + + //dialog.artists = {"", ""}; + dialog.authors = {"Tony George"}; + dialog.documenters = null; + dialog.translator_credits = null; + + dialog.program_name = "TimeShift"; + dialog.comments = _("A System Restore Utility for Linux"); + dialog.copyright = "Copyright © 2013 Tony George (teejee2008@gmail.com)"; + dialog.version = AppVersion; + + try{ + dialog.logo = new Gdk.Pixbuf.from_file (App.share_folder + """/pixmaps/timeshift.png"""); + } + catch(Error e){ + log_error (e.message); + } + + dialog.license = +""" +This program is free for personal and commercial use and comes with absolutely no warranty. You use this program entirely at your own risk. The author will not be liable for any damages arising from the use of this program. +"""; + dialog.wrap_license = true; + + dialog.website = "http://teejeetech.blogspot.in"; + dialog.website_label = "http://teejeetech.blogspot.in"; + + dialog.response.connect ((response_id) => { + if (response_id == Gtk.ResponseType.CANCEL || response_id == Gtk.ResponseType.DELETE_EVENT) { + dialog.hide_on_delete (); + } + }); + + dialog.present (); + } + + + private void show_statusbar_icons(bool visible){ + img_status_dot.visible = false; + img_status_spinner.visible = !visible; + img_status_progress.visible = !visible; + lbl_status.visible = !visible; + lbl_status.label = ""; + + img_status_device.visible = visible; + lbl_status_device.visible = visible; + + //if (App.is_live_system()){ + //visible = false; + //} + + img_status_scheduled.visible = visible; + lbl_status_scheduled.visible = visible; + img_status_latest.visible = visible; + lbl_status_latest.visible = visible; + } + + private void statusbar_message (string message){ + if (timer_status_message > 0){ + Source.remove (timer_status_message); + } + + lbl_status.label = message; + } + + private void statusbar_message_with_timeout (string message, bool success){ + if (timer_status_message > 0){ + Source.remove (timer_status_message); + } + + lbl_status.label = message; + + img_status_spinner.visible = false; + img_status_progress.visible = false; + img_status_dot.visible = true; + + if (success){ + img_status_dot.file = App.share_folder + "/timeshift/images/item-green.png"; + } + else{ + img_status_dot.file = App.share_folder + "/timeshift/images/item-red.png"; + } + + timer_status_message = Timeout.add_seconds (5, statusbar_clear); + } + + private bool statusbar_clear (){ + if (timer_status_message > 0){ + Source.remove (timer_status_message); + } + lbl_status.label = ""; + show_statusbar_icons(true); + return true; + } + + private void update_ui(bool enable){ + toolbar.sensitive = enable; + hbox_device.sensitive = enable; + sw_backups.sensitive = enable; + show_statusbar_icons(enable); + set_busy(!enable, this); + } + + private void update_progress_start(){ + timer_progress = Timeout.add_seconds(1, update_progress); + } + + private bool update_progress (){ + if (timer_progress > 0){ + Source.remove(timer_progress); + timer_progress = 0; + } + + lbl_status.label = App.progress_text; + + timer_progress = Timeout.add_seconds(1, update_progress); + return true; + } + + private void update_progress_stop(){ + if (timer_progress > 0){ + Source.remove(timer_progress); + timer_progress = 0; + } + } + + + private bool check_status(){ + + string img_dot_red = App.share_folder + "/timeshift/images/item-red.png"; + string img_dot_green = App.share_folder + "/timeshift/images/item-green.png"; + + //check free space on backup device --------------------------- + + string message = ""; + int status_code = App.check_backup_device(out message); + string txt; + + switch(status_code){ + case -1: + txt = _("Backup device is not mounted!"); + txt = "" + txt + ""; + lbl_backup_device_warning.label = txt; + lbl_backup_device_warning.visible = true; + break; + + case 1: + txt = _("Backup device does not have enough space!"); + txt = "" + txt + ""; + lbl_backup_device_warning.label = txt; + lbl_backup_device_warning.visible = true; + break; + + case 2: + long required = App.calculate_size_of_first_snapshot(); + txt = _("Backup device does not have enough space!"); + txt += " %.1f GB ".printf(required/1024.0) + _("is needed for first snapshot."); + txt = "" + txt + ""; + lbl_backup_device_warning.label = txt; + lbl_backup_device_warning.visible = true; + break; + + default: + lbl_backup_device_warning.label = ""; + lbl_backup_device_warning.visible = false; + break; + } + + if ((status_code == 0)||(status_code == 3)){ + img_status_device.file = img_dot_green; + } + else{ + img_status_device.file = img_dot_red; + } + lbl_status_device.label = message; + + // statusbar icons --------------------------------------------------------- + + //status - scheduled snapshots ----------- + + if (App.is_live_system()){ + img_status_scheduled.file = img_dot_green; + lbl_status_scheduled.label = _("Running from Live CD/USB"); + lbl_status_scheduled.set_tooltip_text(_("TimeShift is running in a live system")); + } + else{ + if (App.is_scheduled){ + img_status_scheduled.file = img_dot_green; + lbl_status_scheduled.label = _("Scheduled snapshots") + " " + _("Enabled"); + lbl_status_scheduled.set_tooltip_text(_("System snapshots will be taken at regular intervals")); + }else{ + img_status_scheduled.file = img_dot_red; + lbl_status_scheduled.label = _("Scheduled snapshots") + " " + _("Disabled"); + lbl_status_scheduled.set_tooltip_text(""); + } + } + + //status - last snapshot ----------- + + DateTime now = new DateTime.now_local(); + TimeShiftBackup last_snapshot = App.get_latest_snapshot(); + DateTime last_snapshot_date = (last_snapshot == null) ? null : last_snapshot.date; + + if (last_snapshot == null){ + img_status_latest.file = img_dot_red; + lbl_status_latest.label = _("No snapshots on device"); + } + else{ + float days = ((float) now.difference(last_snapshot_date) / TimeSpan.DAY); + float hours = ((float) now.difference(last_snapshot_date) / TimeSpan.HOUR); + float minutes = ((float) now.difference(last_snapshot_date) / TimeSpan.MINUTE); + + if (days > 1){ + img_status_latest.file = img_dot_red; + lbl_status_latest.label = _("Last snapshot is") + " %.0f ".printf(days) + _("days old") + "!"; + } + else if (hours > 1){ + img_status_latest.file = img_dot_green; + lbl_status_latest.label = _("Last snapshot is") + " %.0f ".printf(hours) + _("hours old"); + } + else{ + img_status_latest.file = img_dot_green; + lbl_status_latest.label = _("Last snapshot is") + " %.0f ".printf(minutes) + _("mins old"); + } + } + + return true; + } + +} diff --git a/src/RestoreWindow.vala b/src/RestoreWindow.vala new file mode 100644 index 0000000..5208bdb --- /dev/null +++ b/src/RestoreWindow.vala @@ -0,0 +1,967 @@ +/* + * MainWindow.vala + * + * Copyright 2013 Tony George + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * + */ + +using Gtk; +using Gee; +using Utility; + +public class RestoreWindow : Gtk.Dialog{ + private Box vbox_main; + private Box hbox_action; + private Notebook notebook; + + //target device + private Label lbl_header_partitions; + private TreeView tv_partitions; + private ScrolledWindow sw_partitions; + private TreeViewColumn col_device_target; + private TreeViewColumn col_fs; + private TreeViewColumn col_size; + private TreeViewColumn col_used; + private TreeViewColumn col_label; + private TreeViewColumn col_dist; + + //bootloader + private Label lbl_header_bootloader; + private CheckButton chk_restore_grub2; + private ComboBox cmb_boot_device; + + //exclude + private Label lbl_exclude; + private Box vbox_exclude; + private LinkButton lnk_default_list; + private TreeView tv_exclude; + private ScrolledWindow sw_exclude; + private TreeViewColumn col_exclude; + private Toolbar toolbar_exclude; + private ToolButton btn_remove; + private ToolButton btn_warning; + private ToolButton btn_reset_exclude_list; + + private MenuToolButton btn_exclude; + private Gtk.Menu menu_exclude; + private ImageMenuItem menu_exclude_add_file; + private ImageMenuItem menu_exclude_add_folder; + private ImageMenuItem menu_exclude_add_folder_contents; + + private MenuToolButton btn_include; + private Gtk.Menu menu_include; + private ImageMenuItem menu_include_add_file; + private ImageMenuItem menu_include_add_folder; + + private Gee.ArrayList temp_exclude_list; + + //actions + private Button btn_cancel; + private Button btn_restore; + + public RestoreWindow () { + this.title = _("Restore"); + this.window_position = WindowPosition.CENTER_ON_PARENT; + this.set_destroy_with_parent (true); + this.set_modal (true); + this.set_default_size (500, 400); + + //set app icon + try{ + this.icon = new Gdk.Pixbuf.from_file (App.share_folder + """/pixmaps/timeshift.png"""); + } + catch(Error e){ + log_error (e.message); + } + + //vbox_main + vbox_main = get_content_area (); + + //notebook + notebook = new Notebook (); + notebook.margin = 6; + vbox_main.pack_start (notebook, true, true, 0); + + //target device tab ------------------------------------------------- + + //lbl_exclude + lbl_exclude = new Label (_("Target")); + + //vbox_target + Box vbox_target = new Box (Orientation.VERTICAL, 6); + vbox_target.margin = 6; + notebook.append_page (vbox_target, lbl_exclude); + + //lbl_header_partitions + lbl_header_partitions = new Gtk.Label("" + _("Target Device") + ":"); + lbl_header_partitions.xalign = (float) 0.0; + lbl_header_partitions.set_use_markup(true); + vbox_target.add(lbl_header_partitions); + + //tv_partitions + tv_partitions = new TreeView(); + tv_partitions.get_selection().mode = SelectionMode.SINGLE; + tv_partitions.set_rules_hint (true); + tv_partitions.button_release_event.connect(tv_partitions_button_press_event); + + //sw_partitions + sw_partitions = new ScrolledWindow(null, null); + sw_partitions.set_shadow_type (ShadowType.ETCHED_IN); + sw_partitions.add (tv_partitions); + sw_partitions.expand = true; + vbox_target.add(sw_partitions); + + //col_device + col_device_target = new TreeViewColumn(); + col_device_target.title = _("Device"); + col_device_target.spacing = 1; + + CellRendererPixbuf cell_device_icon = new CellRendererPixbuf (); + cell_device_icon.stock_id = Stock.HARDDISK; + cell_device_icon.xpad = 1; + col_device_target.pack_start (cell_device_icon, false); + + CellRendererText cell_device_target = new CellRendererText (); + col_device_target.pack_start (cell_device_target, false); + col_device_target.set_cell_data_func (cell_device_target, cell_device_target_render); + + tv_partitions.append_column(col_device_target); + + //col_fs + col_fs = new TreeViewColumn(); + col_fs.title = _("Type"); + CellRendererText cell_fs = new CellRendererText (); + cell_fs.xalign = (float) 0.5; + col_fs.pack_start (cell_fs, false); + col_fs.set_cell_data_func (cell_fs, cell_fs_render); + tv_partitions.append_column(col_fs); + + //col_size + col_size = new TreeViewColumn(); + col_size.title = _("Size"); + CellRendererText cell_size = new CellRendererText (); + cell_size.xalign = (float) 1.0; + col_size.pack_start (cell_size, false); + col_size.set_cell_data_func (cell_size, cell_size_render); + tv_partitions.append_column(col_size); + + //col_used + col_used = new TreeViewColumn(); + col_used.title = _("Used"); + CellRendererText cell_used = new CellRendererText (); + cell_used.xalign = (float) 1.0; + col_used.pack_start (cell_used, false); + col_used.set_cell_data_func (cell_used, cell_used_render); + tv_partitions.append_column(col_used); + + //col_label + col_label = new TreeViewColumn(); + col_label.title = _("Label"); + CellRendererText cell_label = new CellRendererText (); + col_label.pack_start (cell_label, false); + col_label.set_cell_data_func (cell_label, cell_label_render); + tv_partitions.append_column(col_label); + + //col_dist + col_dist = new TreeViewColumn(); + col_dist.title = _("System"); + CellRendererText cell_dist = new CellRendererText (); + col_dist.pack_start (cell_dist, false); + col_dist.set_cell_data_func (cell_dist, cell_dist_render); + tv_partitions.append_column(col_dist); + + //bootloader options ------------------------------------------- + + //lbl_header_bootloader + lbl_header_bootloader = new Gtk.Label("" +_("Bootloader") + ":"); + lbl_header_bootloader.set_use_markup(true); + lbl_header_bootloader.xalign = (float) 0.0; + vbox_target.add(lbl_header_bootloader); + + //hbox_grub + Box hbox_grub = new Box (Orientation.HORIZONTAL, 6); + hbox_grub.margin_right = 6; + hbox_grub.margin_bottom = 6; + vbox_target.add (hbox_grub); + + string grub_msg = _("Re-install GRUB2 bootloader on the target device (recommended)"); + + //chk_restore_grub2 + chk_restore_grub2 = new CheckButton.with_label(_("Re-install GRUB2") + ":"); + chk_restore_grub2.active = true; + chk_restore_grub2.set_tooltip_markup(grub_msg); + hbox_grub.add(chk_restore_grub2); + + chk_restore_grub2.toggled.connect(()=>{ + cmb_boot_device.sensitive = chk_restore_grub2.active; + }); + + //cmb_boot_device + cmb_boot_device = new ComboBox (); + cmb_boot_device.hexpand = true; + hbox_grub.add(cmb_boot_device); + + CellRendererText cell_dev_margin = new CellRendererText (); + cell_dev_margin.text = ""; + cmb_boot_device.pack_start (cell_dev_margin, false); + + CellRendererPixbuf cell_dev_icon = new CellRendererPixbuf (); + cell_dev_icon.stock_id = Stock.HARDDISK; + cmb_boot_device.pack_start (cell_dev_icon, false); + + CellRendererText cell_device_grub = new CellRendererText(); + cmb_boot_device.pack_start(cell_device_grub, false ); + cmb_boot_device.set_cell_data_func (cell_device_grub, cell_device_grub_render); + + //Exclude tab --------------------------------------------- + + //lbl_exclude + lbl_exclude = new Label (_("Advanced")); + + //vbox_exclude + vbox_exclude = new Box(Gtk.Orientation.VERTICAL, 6); + vbox_exclude.margin = 6; + notebook.append_page (vbox_exclude, lbl_exclude); + + //toolbar_exclude --------------------------------------------------- + + //toolbar_exclude + toolbar_exclude = new Gtk.Toolbar (); + toolbar_exclude.toolbar_style = ToolbarStyle.BOTH_HORIZ; + vbox_exclude.add(toolbar_exclude); + + string png_exclude = App.share_folder + "/timeshift/images/item-gray.png"; + string png_include = App.share_folder + "/timeshift/images/item-blue.png"; + + //btn_exclude + btn_exclude = new Gtk.MenuToolButton(null,""); + toolbar_exclude.add(btn_exclude); + + btn_exclude.is_important = true; + btn_exclude.label = _("Exclude"); + btn_exclude.set_tooltip_text (_("Exclude")); + btn_exclude.set_icon_widget(new Gtk.Image.from_file (png_exclude)); + + //btn_include + btn_include = new Gtk.MenuToolButton(null,""); + toolbar_exclude.add(btn_include); + + btn_include.is_important = true; + btn_include.label = _("Include"); + btn_include.set_tooltip_text (_("Include")); + btn_include.set_icon_widget(new Gtk.Image.from_file (png_include)); + + //btn_remove + btn_remove = new Gtk.ToolButton.from_stock(Gtk.Stock.REMOVE); + toolbar_exclude.add(btn_remove); + + btn_remove.is_important = true; + btn_remove.label = _("Remove"); + btn_remove.set_tooltip_text (_("Remove selected items")); + + btn_remove.clicked.connect (btn_remove_clicked); + + //btn_warning + btn_warning = new Gtk.ToolButton.from_stock(Gtk.Stock.DIALOG_WARNING); + toolbar_exclude.add(btn_warning); + + btn_warning.is_important = true; + btn_warning.label = _("Warning"); + btn_warning.set_tooltip_text (_("Warning")); + + btn_warning.clicked.connect (btn_warning_clicked); + + //separator + var separator = new Gtk.SeparatorToolItem(); + separator.set_draw (false); + separator.set_expand (true); + toolbar_exclude.add(separator); + + //btn_reset_exclude_list + btn_reset_exclude_list = new Gtk.ToolButton.from_stock(Gtk.Stock.REFRESH); + toolbar_exclude.add(btn_reset_exclude_list); + + btn_reset_exclude_list.is_important = false; + btn_reset_exclude_list.label = _("Reset"); + btn_reset_exclude_list.set_tooltip_text (_("Reset this list to default state")); + + btn_reset_exclude_list.clicked.connect (btn_reset_exclude_list_clicked); + + //menu -------------------------------------------------- + + //menu_exclude + menu_exclude = new Gtk.Menu(); + btn_exclude.set_menu(menu_exclude); + + //menu_exclude_add_file + menu_exclude_add_file = new ImageMenuItem.with_label (""); + menu_exclude_add_file.label = _("Exclude File(s)"); + menu_exclude_add_file.set_image(new Gtk.Image.from_file (png_exclude)); + menu_exclude.append(menu_exclude_add_file); + + menu_exclude_add_file.activate.connect (menu_exclude_add_files_clicked); + + //menu_exclude_add_folder + menu_exclude_add_folder = new ImageMenuItem.with_label (""); + menu_exclude_add_folder.label = _("Exclude Directory"); + menu_exclude_add_folder.set_image(new Gtk.Image.from_file (png_exclude)); + menu_exclude.append(menu_exclude_add_folder); + + menu_exclude_add_folder.activate.connect (menu_exclude_add_folder_clicked); + + //menu_exclude_add_folder_contents + menu_exclude_add_folder_contents = new ImageMenuItem.with_label (""); + menu_exclude_add_folder_contents.label = _("Exclude Directory Contents"); + menu_exclude_add_folder_contents.set_image(new Gtk.Image.from_file (png_exclude)); + menu_exclude.append(menu_exclude_add_folder_contents); + + menu_exclude_add_folder_contents.activate.connect (menu_exclude_add_folder_contents_clicked); + + //menu_include + menu_include = new Gtk.Menu(); + btn_include.set_menu(menu_include); + + //menu_include_add_file + menu_include_add_file = new ImageMenuItem.with_label (""); + menu_include_add_file.label = _("Include File(s)"); + menu_include_add_file.set_image(new Gtk.Image.from_file (png_include)); + menu_include.append(menu_include_add_file); + + menu_include_add_file.activate.connect (menu_include_add_files_clicked); + + //menu_include_add_folder + menu_include_add_folder = new ImageMenuItem.with_label (""); + menu_include_add_folder.label = _("Include Directory"); + menu_include_add_folder.set_image(new Gtk.Image.from_file (png_include)); + menu_include.append(menu_include_add_folder); + + menu_include_add_folder.activate.connect (menu_include_add_folder_clicked); + + menu_exclude.show_all(); + menu_include.show_all(); + + //tv_exclude----------------------------------------------- + + //tv_exclude + tv_exclude = new TreeView(); + tv_exclude.get_selection().mode = SelectionMode.MULTIPLE; + tv_exclude.headers_visible = true; + tv_exclude.set_rules_hint (true); + //tv_exclude.row_activated.connect(tv_exclude_row_activated); + + //sw_exclude + sw_exclude = new ScrolledWindow(null, null); + sw_exclude.set_shadow_type (ShadowType.ETCHED_IN); + sw_exclude.add (tv_exclude); + sw_exclude.expand = true; + vbox_exclude.add(sw_exclude); + + //col_exclude + col_exclude = new TreeViewColumn(); + col_exclude.title = _("File Pattern"); + col_exclude.expand = true; + + CellRendererText cell_exclude_margin = new CellRendererText (); + cell_exclude_margin.text = ""; + col_exclude.pack_start (cell_exclude_margin, false); + + CellRendererPixbuf cell_exclude_icon = new CellRendererPixbuf (); + col_exclude.pack_start (cell_exclude_icon, false); + col_exclude.set_attributes(cell_exclude_icon, "pixbuf", 1); + + CellRendererText cell_exclude_text = new CellRendererText (); + col_exclude.pack_start (cell_exclude_text, false); + col_exclude.set_cell_data_func (cell_exclude_text, cell_exclude_text_render); + cell_exclude_text.editable = true; + tv_exclude.append_column(col_exclude); + + cell_exclude_text.edited.connect (cell_exclude_text_edited); + + //lnk_default_list + lnk_default_list = new LinkButton.with_label("",_("Some locations are excluded by default")); + lnk_default_list.xalign = (float) 0.0; + lnk_default_list.activate_link.connect(lnk_default_list_activate); + vbox_exclude.add(lnk_default_list); + + //Actions ---------------------------------------------- + + //hbox_action + hbox_action = (Box) get_action_area (); + + //btn_restore + btn_restore = new Button(); + hbox_action.add(btn_restore); + + btn_restore.set_label (" " + _("Restore")); + btn_restore.set_tooltip_text (_("Restore")); + Gtk.Image img_restore = new Image.from_stock(Gtk.Stock.GO_FORWARD, Gtk.IconSize.BUTTON); + btn_restore.set_image(img_restore); + btn_restore.clicked.connect (btn_restore_clicked); + + //btn_cancel + btn_cancel = new Button(); + hbox_action.add(btn_cancel); + + btn_cancel.set_label (" " + _("Cancel")); + btn_cancel.set_tooltip_text (_("Cancel")); + Gtk.Image img_cancel = new Image.from_stock(Gtk.Stock.CANCEL, Gtk.IconSize.BUTTON); + btn_cancel.set_image(img_cancel); + btn_cancel.clicked.connect (btn_cancel_clicked); + + //initialize ----------------------------------------- + + refresh_tv_partitions(); + refresh_cmb_boot_device(); + + btn_reset_exclude_list_clicked(); + + chk_restore_grub2.active = true; //keep enabled always + chk_restore_grub2.sensitive = false; //don't allow user to disable + cmb_boot_device.sensitive = chk_restore_grub2.active; + } + + + private void cell_device_target_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo pi; + model.get (iter, 0, out pi, -1); + if ((App.root_device != null) && (pi.device == App.root_device.device)){ + (cell as Gtk.CellRendererText).text = pi.device_name_sdaX + " (" + _("sys") + ")"; + } + else{ + (cell as Gtk.CellRendererText).text = pi.device_name_sdaX; + } + } + + private void cell_fs_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo pi; + model.get (iter, 0, out pi, -1); + (cell as Gtk.CellRendererText).text = pi.type; + } + + private void cell_size_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo pi; + model.get (iter, 0, out pi, -1); + (cell as Gtk.CellRendererText).text = pi.size; + } + + private void cell_used_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo pi; + model.get (iter, 0, out pi, -1); + (cell as Gtk.CellRendererText).text = pi.used; + } + + private void cell_label_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo pi; + model.get (iter, 0, out pi, -1); + (cell as Gtk.CellRendererText).text = pi.label; + } + + private void cell_dist_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + PartitionInfo pi; + model.get (iter, 0, out pi, -1); + (cell as Gtk.CellRendererText).text = pi.dist_info; + } + + private void cell_device_grub_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + DeviceInfo info; + model.get (iter, 0, out info, -1); + (cell as Gtk.CellRendererText).text = info.description; + } + + private void cell_exclude_text_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + string pattern, color; + model.get (iter, 0, out pattern, 2, out color, -1); + (cell as Gtk.CellRendererText).text = pattern.has_prefix("+ ") ? pattern[2:pattern.length] : pattern; + (cell as Gtk.CellRendererText).foreground = color; + } + + private void cell_exclude_text_edited (string path, string new_text) { + string entry; + + TreeIter iter; + ListStore model = (ListStore) tv_exclude.model; + model.get_iter_from_string (out iter, path); + model.get (iter, 0, out entry, -1); + model.set (iter, 0, new_text); + } + + + private void refresh_cmb_boot_device(){ + ListStore store = new ListStore(1, typeof(DeviceInfo)); + + TreeIter iter; + + int index = -1; + int selected_index = -1; + int default_index = -1; + + foreach(DeviceInfo di in get_block_devices()) { + store.append(out iter); + store.set (iter, 0, di); + + index++; + if ((App.restore_target != null) && (di.device == App.restore_target.device[0:-1])){ + selected_index = index; + } + } + + if (selected_index == -1){ + selected_index = default_index; + } + + cmb_boot_device.set_model (store); + cmb_boot_device.active = selected_index; + } + + private void refresh_tv_partitions(){ + + App.update_partition_list(); + + ListStore model = new ListStore(1, typeof(PartitionInfo)); + + var list = App.partition_list; + list.sort((a,b) => { + PartitionInfo p1 = (PartitionInfo) a; + PartitionInfo p2 = (PartitionInfo) b; + + return strcmp(p1.device,p2.device); + }); + + TreeIter iter; + TreePath path_selected = null; + + foreach(PartitionInfo pi in list) { + if (!pi.has_linux_filesystem()) { continue; } + + model.append(out iter); + model.set (iter, 0, pi); + + if ((App.restore_target != null) && (App.restore_target.device == pi.device)){ + path_selected = model.get_path(iter); + } + } + + tv_partitions.set_model (model); + if (path_selected != null){ + tv_partitions.get_selection().select_path(path_selected); + } + //tv_partitions.columns_autosize (); + } + + private void refresh_tv_exclude(){ + ListStore model = new ListStore(3, typeof(string), typeof(Gdk.Pixbuf), typeof(string)); + tv_exclude.model = model; + + foreach(string path in temp_exclude_list){ + tv_exclude_add_item(path); + } + } + + private void tv_exclude_add_item(string path){ + Gdk.Pixbuf pix_exclude = null; + Gdk.Pixbuf pix_include = null; + Gdk.Pixbuf pix_selected = null; + string text_color; + + try{ + pix_exclude = new Gdk.Pixbuf.from_file (App.share_folder + "/timeshift/images/item-gray.png"); + pix_include = new Gdk.Pixbuf.from_file (App.share_folder + "/timeshift/images/item-blue.png"); + } + catch(Error e){ + log_error (e.message); + } + + TreeIter iter; + ListStore model = (ListStore) tv_exclude.model; + model.append(out iter); + + if (path.has_prefix("+ ")){ + pix_selected = pix_include; + } + else{ + pix_selected = pix_exclude; + } + + if (App.exclude_list_default.contains(path)){ + text_color = "#0B610B"; + } + else{ + text_color = "#000000"; + } + + model.set (iter, 0, path, 1, pix_selected, 2, text_color, -1); + + Adjustment adj = tv_exclude.get_hadjustment(); + adj.value = adj.upper; + } + + private bool lnk_default_list_activate(){ + string msg = ""; + msg += "" + _("Exclude List") + ":\n\n"; + msg += _("Files matching the following patterns will be excluded") + ":\n\n"; + + foreach(string path in App.exclude_list_default){ + msg += path + "\n"; + } + msg += "\n"; + + msg += "" + _("Home Directory") + ":\n\n"; + msg += _("Hidden files and folders are included by default since \nthey contain user-specific configuration files.") + "\n"; + msg += _("All other files and folders are excluded.") + "\n"; + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, msg); + dialog.set_title(_("Default Entries")); + dialog.set_default_size (200, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + dialog.run(); + dialog.destroy(); + + return true; + } + + private bool tv_partitions_button_press_event(Gdk.EventButton event){ + TreeIter iter; + ListStore store; + TreeSelection sel; + bool iterExists; + + //get selected target device + PartitionInfo restore_target = null; + sel = tv_partitions.get_selection (); + store = (ListStore) tv_partitions.model; + iterExists = store.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + store.get (iter, 0, out restore_target); + break; + } + iterExists = store.iter_next (ref iter); + } + App.restore_target = restore_target; + + //select grub target device + refresh_cmb_boot_device(); + + return false; + } + + + private void menu_exclude_add_files_clicked(){ + + var list = browse_files(); + + if (list.length() > 0){ + foreach(string path in list){ + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_exclude_add_folder_clicked(){ + + var list = browse_folder(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path + "/"; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_exclude_add_folder_contents_clicked(){ + + var list = browse_folder(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path + "/*"; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_include_add_files_clicked(){ + + var list = browse_files(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path.has_prefix("+ ") ? path : "+ " + path; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_include_add_folder_clicked(){ + + var list = browse_folder(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path.has_prefix("+ ") ? path : "+ " + path; + path = path + "/***"; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private SList browse_files(){ + var dialog = new Gtk.FileChooserDialog(_("Select file(s)"), this, Gtk.FileChooserAction.OPEN, + Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL, + Gtk.Stock.OPEN, Gtk.ResponseType.ACCEPT); + dialog.action = FileChooserAction.OPEN; + dialog.set_transient_for(this); + dialog.local_only = true; + dialog.set_modal (true); + dialog.set_select_multiple (true); + + dialog.run(); + var list = dialog.get_filenames(); + dialog.destroy (); + + return list; + } + + private SList browse_folder(){ + var dialog = new Gtk.FileChooserDialog(_("Select directory"), this, Gtk.FileChooserAction.OPEN, + Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL, + Gtk.Stock.OPEN, Gtk.ResponseType.ACCEPT); + dialog.action = FileChooserAction.SELECT_FOLDER; + dialog.local_only = true; + dialog.set_transient_for(this); + dialog.set_modal (true); + dialog.set_select_multiple (false); + + dialog.run(); + var list = dialog.get_filenames(); + dialog.destroy (); + + return list; + } + + + private void btn_remove_clicked(){ + TreeSelection sel = tv_exclude.get_selection (); + TreeIter iter; + bool iterExists = tv_exclude.model.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + string path; + tv_exclude.model.get (iter, 0, out path); + temp_exclude_list.remove(path); + App.first_snapshot_size = 0; //re-calculate + } + iterExists = tv_exclude.model.iter_next (ref iter); + } + + refresh_tv_exclude(); + } + + private void btn_warning_clicked(){ + string msg = ""; + msg += _("Please do NOT modify this list unless you have a very good reason for doing so.") + " "; + msg += _("By default, any item that was included/excluded at the time of taking the snapshot will be included/excluded.") + " "; + msg += _("Any exclude patterns in the current exclude list will also be excluded.") + " "; + msg += _("To see which files are included in the snapshot use the 'Browse' button on the main window."); + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, msg); + dialog.set_title("Warning"); + dialog.set_default_size (200, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + dialog.run(); + dialog.destroy(); + } + + private void btn_reset_exclude_list_clicked(){ + //create a temp exclude list ---------------------------- + + temp_exclude_list = new Gee.ArrayList(); + + //add all include/exclude items from snapshot list + foreach(string path in App.snapshot_to_restore.exclude_list){ + if (!temp_exclude_list.contains(path) && !App.exclude_list_default.contains(path) && !App.exclude_list_home.contains(path)){ + temp_exclude_list.add(path); + } + } + + //add all exclude items from current list + foreach(string path in App.exclude_list_user){ + if (!temp_exclude_list.contains(path) && !App.exclude_list_default.contains(path) && !App.exclude_list_home.contains(path)){ + + if (!path.has_prefix("+ ")){ //don't add include entries from current exclude list + temp_exclude_list.add(path); + } + } + } + + //refresh treeview -------------------------- + + refresh_tv_exclude(); + } + + + private void btn_restore_clicked(){ + + //Note: A successful restore will reboot the system if target device is same as system device + + TreeIter iter; + ListStore store; + TreeSelection sel; + bool iterExists; + + //check single target partition selected --------------- + + sel = tv_partitions.get_selection (); + if (sel.count_selected_rows() != 1){ + messagebox_show(_("Select Target Device"),_("Please select the target device from the list"), true); + return; + } + + //get selected target partition ------------------ + + PartitionInfo restore_target = null; + sel = tv_partitions.get_selection (); + store = (ListStore) tv_partitions.model; + iterExists = store.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + store.get (iter, 0, out restore_target); + break; + } + iterExists = store.iter_next (ref iter); + } + App.restore_target = restore_target; + + //save modified exclude list ---------------------- + + App.exclude_list_restore.clear(); + + //add default entries + foreach(string path in App.exclude_list_default){ + if (!App.exclude_list_restore.contains(path)){ + App.exclude_list_restore.add(path); + } + } + + //add modified user entries + foreach(string path in temp_exclude_list){ + if (!App.exclude_list_restore.contains(path) && !App.exclude_list_home.contains(path)){ + App.exclude_list_restore.add(path); + } + } + + //add home entries + foreach(string path in App.exclude_list_home){ + if (!App.exclude_list_restore.contains(path)){ + App.exclude_list_restore.add(path); + } + } + + string timeshift_path = "/timeshift/*"; + if (!App.exclude_list_restore.contains(timeshift_path)){ + App.exclude_list_restore.add(timeshift_path); + } + + //save grub install options ---------------------- + + App.reinstall_grub2 = chk_restore_grub2.active; + + if (App.reinstall_grub2){ + DeviceInfo dev; + cmb_boot_device.get_active_iter (out iter); + TreeModel model = (TreeModel) cmb_boot_device.model; + model.get(iter, 0, out dev); + App.grub_device = dev; + } + + //last option to quit - show disclaimer ------------ + + if (show_disclaimer() == Gtk.ResponseType.YES){ + this.response(Gtk.ResponseType.OK); + } + else{ + this.response(Gtk.ResponseType.CANCEL); + } + } + + private int show_disclaimer(){ + string msg = ""; + msg += "" + _("WARNING") + ":\n\n"; + msg += _("Files will be overwritten on the target device!") + "\n"; + msg += _("If the restore fails for any reason and you are unable to boot the system, \nplease boot from the Ubuntu Live CD and try again.") + "\n"; + + if ((App.root_device != null) && (App.restore_target.device == App.root_device.device)){ + msg += "\n" + _("Please save your work and close all applications.") + "\n"; + msg += _("System will reboot to complete the restore process.") + "\n"; + } + + msg += "\n"; + msg += "" + _("DISCLAIMER") + ":\n\n"; + msg += _("This software comes without absolutely NO warranty and the author takes no responsibility for any damage arising from the use of this program."); + msg += " " + _("If these terms are not acceptable to you, please do not proceed beyond this point!") + "\n"; + msg += "\n"; + msg += "" + _("Continue with restore?") + "\n"; + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, msg); + dialog.set_title(_("DISCLAIMER")); + dialog.set_default_size (200, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + int response = dialog.run(); + dialog.destroy(); + return response; + } + + private void btn_cancel_clicked(){ + this.response(Gtk.ResponseType.CANCEL); + return; + } + +} diff --git a/src/SettingsWindow.vala b/src/SettingsWindow.vala new file mode 100644 index 0000000..99da66f --- /dev/null +++ b/src/SettingsWindow.vala @@ -0,0 +1,983 @@ +/* + * SettingsWindow.vala + * + * Copyright 2013 Tony George + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * + */ + +using Gtk; +using Gee; +using Utility; + +public class SettingsWindow : Gtk.Dialog{ + private Box vbox_main; + private Notebook notebook; + + //schedule + private Label lbl_schedule; + private Box vbox_schedule; + private Box hbox_auto_snapshots; + private Label lbl_header_schedule; + private Switch switch_schedule; + private TreeView tv_schedule; + private ScrolledWindow sw_schedule; + private TreeViewColumn col_sched_enable; + private TreeViewColumn col_sched_level; + private TreeViewColumn col_sched_desc; + + //auto_remove + private Label lbl_auto_remove; + private Box vbox_auto_remove; + private TreeView tv_remove; + private ScrolledWindow sw_remove; + private TreeViewColumn col_remove_rule; + private TreeViewColumn col_remove_limit; + private TreeViewColumn col_remove_units; + + //exclude + private Label lbl_exclude; + private Box vbox_exclude; + private LinkButton lnk_default_list; + private TreeView tv_exclude; + private ScrolledWindow sw_exclude; + private TreeViewColumn col_exclude; + private Toolbar toolbar_exclude; + private ToolButton btn_remove; + private ToolButton btn_warning; + private ToolButton btn_reset_exclude_list; + + private MenuToolButton btn_exclude; + private Gtk.Menu menu_exclude; + private ImageMenuItem menu_exclude_add_file; + private ImageMenuItem menu_exclude_add_folder; + private ImageMenuItem menu_exclude_add_folder_contents; + + private MenuToolButton btn_include; + private Gtk.Menu menu_include; + private ImageMenuItem menu_include_add_file; + private ImageMenuItem menu_include_add_folder; + + //actions + private Button btn_save; + private Button btn_cancel; + + private Gee.ArrayList temp_exclude_list; + + public SettingsWindow () { + this.deletable = false; + this.title = _("Settings"); + this.window_position = WindowPosition.CENTER_ON_PARENT; + this.set_destroy_with_parent (true); + this.set_modal (true); + this.set_default_size (450, 500); + + //set app icon + try{ + this.icon = new Gdk.Pixbuf.from_file (App.share_folder + """/pixmaps/timeshift.png"""); + } + catch(Error e){ + log_error (e.message); + } + + //vboxMain + vbox_main = get_content_area (); + + //notebook + notebook = new Notebook (); + notebook.margin = 6; + vbox_main.pack_start (notebook, true, true, 0); + + //schedule tab --------------------------------------------- + + //lbl_schedule + lbl_schedule = new Label (_("Schedule")); + + //vbox_schedule + vbox_schedule = new Box (Gtk.Orientation.VERTICAL, 6); + vbox_schedule.margin = 6; + notebook.append_page (vbox_schedule, lbl_schedule); + + //automatic snapshots ------------------------------ + + //hbox_auto_snapshots + hbox_auto_snapshots = new Box (Gtk.Orientation.HORIZONTAL, 6); + vbox_schedule.add (hbox_auto_snapshots); + + //lbl_header_schedule + lbl_header_schedule = new Gtk.Label("" + _("Scheduled Snapshots") + ""); + lbl_header_schedule.set_use_markup(true); + lbl_header_schedule.hexpand = true; + lbl_header_schedule.xalign = (float) 0.0; + lbl_header_schedule.valign = Align.CENTER; + hbox_auto_snapshots.add(lbl_header_schedule); + + Box hbox_schedule = new Box(Orientation.HORIZONTAL,0); + hbox_auto_snapshots.add(hbox_schedule); + + //switch_schedule + switch_schedule = new Gtk.Switch(); + switch_schedule.set_size_request(100,20); + switch_schedule.active = App.is_scheduled; + hbox_auto_snapshots.pack_end(switch_schedule,false,false,0); + + switch_schedule.notify["active"].connect(switch_schedule_changed); + + //tv_schedule ----------------------------------------------- + + //tv_schedule + tv_schedule = new TreeView(); + tv_schedule.get_selection().mode = SelectionMode.MULTIPLE; + tv_schedule.set_rules_hint (true); + + //sw_schedule + sw_schedule = new ScrolledWindow(null, null); + sw_schedule.set_shadow_type (ShadowType.ETCHED_IN); + sw_schedule.add (tv_schedule); + sw_schedule.expand = true; + vbox_schedule.add(sw_schedule); + + //col_sched_enable + col_sched_enable = new TreeViewColumn(); + col_sched_enable.title = " " + _("Enable") + " "; + CellRendererToggle cell_sched_enable = new CellRendererToggle (); + cell_sched_enable.activatable = true; + cell_sched_enable.toggled.connect (cell_sched_enable_toggled); + col_sched_enable.pack_start (cell_sched_enable, false); + col_sched_enable.set_cell_data_func (cell_sched_enable, cell_sched_enable_render); + tv_schedule.append_column(col_sched_enable); + + //col_sched_level + col_sched_level = new TreeViewColumn(); + col_sched_level.title = " " + _("Backup Level") + " "; + CellRendererText cell_sched_level = new CellRendererText (); + col_sched_level.pack_start (cell_sched_level, false); + col_sched_level.set_cell_data_func (cell_sched_level, cell_sched_level_render); + tv_schedule.append_column(col_sched_level); + + //col_sched_desc + col_sched_desc = new TreeViewColumn(); + col_sched_desc.title = " " + _("Description") + " "; + col_sched_desc.expand = true; + CellRendererText cell_sched_desc = new CellRendererText (); + col_sched_desc.pack_start (cell_sched_desc, false); + col_sched_desc.set_cell_data_func (cell_sched_desc, cell_sched_desc_render); + tv_schedule.append_column(col_sched_desc); + + //auto-remove tab ------------------------------------------------------ + + //lbl_auto_remove + lbl_auto_remove = new Label (_("Auto-Remove")); + + //grid_auto_remove + vbox_auto_remove = new Box(Gtk.Orientation.VERTICAL, 6); + vbox_auto_remove.margin = 6; + notebook.append_page (vbox_auto_remove, lbl_auto_remove); + + //tv_remove + tv_remove = new TreeView(); + tv_remove.get_selection().mode = SelectionMode.MULTIPLE; + tv_remove.set_rules_hint (true); + + //sw_remove + sw_remove = new ScrolledWindow(null, null); + sw_remove.set_shadow_type (ShadowType.ETCHED_IN); + sw_remove.add (tv_remove); + sw_remove.expand = true; + vbox_auto_remove.add(sw_remove); + + //col_remove_rule + col_remove_rule = new TreeViewColumn(); + col_remove_rule.title = " " + _("Rule") + " "; + CellRendererText cell_remove_rule = new CellRendererText (); + col_remove_rule.pack_start (cell_remove_rule, false); + col_remove_rule.set_cell_data_func (cell_remove_rule, cell_remove_rule_render); + tv_remove.append_column(col_remove_rule); + + //col_sched_desc + col_remove_limit = new TreeViewColumn(); + col_remove_limit.title = " " + _("Limit") + " "; + CellRendererText cell_remove_limit = new CellRendererText (); + cell_remove_limit.xalign = (float) 0.5; + cell_remove_limit.editable = true; + cell_remove_limit.edited.connect (cell_remove_limit_edited); + col_remove_limit.pack_start (cell_remove_limit, false); + col_remove_limit.set_cell_data_func (cell_remove_limit, cell_remove_limit_render); + tv_remove.append_column(col_remove_limit); + + //col_remove_rule + col_remove_units = new TreeViewColumn(); + col_remove_units.title = ""; + CellRendererText cell_remove_units = new CellRendererText (); + col_remove_units.pack_start (cell_remove_units, false); + col_remove_units.set_cell_data_func (cell_remove_units, cell_remove_units_render); + tv_remove.append_column(col_remove_units); + + tv_schedule.sensitive = switch_schedule.active; + + //Exclude tab --------------------------------------------- + + //lbl_exclude + lbl_exclude = new Label (_("Advanced")); + + //vbox_exclude + vbox_exclude = new Box(Gtk.Orientation.VERTICAL, 6); + vbox_exclude.margin = 6; + notebook.append_page (vbox_exclude, lbl_exclude); + + //toolbar_exclude --------------------------------------------------- + + //toolbar_exclude + toolbar_exclude = new Gtk.Toolbar (); + toolbar_exclude.toolbar_style = ToolbarStyle.BOTH_HORIZ; + //toolbar_exclude.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR); + //toolbar.set_size_request(-1,48); + vbox_exclude.add(toolbar_exclude); + + string png_exclude = App.share_folder + "/timeshift/images/item-gray.png"; + string png_include = App.share_folder + "/timeshift/images/item-blue.png"; + + //btn_exclude + btn_exclude = new Gtk.MenuToolButton(null,""); + toolbar_exclude.add(btn_exclude); + + btn_exclude.is_important = true; + btn_exclude.label = _("Exclude"); + btn_exclude.set_tooltip_text (_("Exclude")); + btn_exclude.set_icon_widget(new Gtk.Image.from_file (png_exclude)); + + //btn_include + btn_include = new Gtk.MenuToolButton(null,""); + toolbar_exclude.add(btn_include); + + btn_include.is_important = true; + btn_include.label = _("Include"); + btn_include.set_tooltip_text (_("Include")); + btn_include.set_icon_widget(new Gtk.Image.from_file (png_include)); + + //btn_remove + btn_remove = new Gtk.ToolButton.from_stock(Gtk.Stock.REMOVE); + toolbar_exclude.add(btn_remove); + + btn_remove.is_important = true; + btn_remove.label = _("Remove"); + btn_remove.set_tooltip_text (_("Remove selected items")); + + btn_remove.clicked.connect (btn_remove_clicked); + + //btn_warning + btn_warning = new Gtk.ToolButton.from_stock(Gtk.Stock.DIALOG_WARNING); + toolbar_exclude.add(btn_warning); + + btn_warning.is_important = true; + btn_warning.label = _("Warning"); + btn_warning.set_tooltip_text (_("Warning")); + + btn_warning.clicked.connect (btn_warning_clicked); + + //separator + var separator = new Gtk.SeparatorToolItem(); + separator.set_draw (false); + separator.set_expand (true); + toolbar_exclude.add(separator); + + //btn_reset_exclude_list + btn_reset_exclude_list = new Gtk.ToolButton.from_stock(Gtk.Stock.REFRESH); + toolbar_exclude.add(btn_reset_exclude_list); + + btn_reset_exclude_list.is_important = false; + btn_reset_exclude_list.label = _("Reset"); + btn_reset_exclude_list.set_tooltip_text (_("Reset this list to default state")); + + btn_reset_exclude_list.clicked.connect (btn_reset_exclude_list_clicked); + + //menu_exclude + menu_exclude = new Gtk.Menu(); + btn_exclude.set_menu(menu_exclude); + + //menu_exclude_add_file + menu_exclude_add_file = new ImageMenuItem.with_label (""); + menu_exclude_add_file.label = _("Exclude File(s)"); + menu_exclude_add_file.set_image(new Gtk.Image.from_file (png_exclude)); + menu_exclude.append(menu_exclude_add_file); + + menu_exclude_add_file.activate.connect (menu_exclude_add_files_clicked); + + //menu_exclude_add_folder + menu_exclude_add_folder = new ImageMenuItem.with_label (""); + menu_exclude_add_folder.label = _("Exclude Directory"); + menu_exclude_add_folder.set_image(new Gtk.Image.from_file (png_exclude)); + menu_exclude.append(menu_exclude_add_folder); + + menu_exclude_add_folder.activate.connect (menu_exclude_add_folder_clicked); + + //menu_exclude_add_folder_contents + menu_exclude_add_folder_contents = new ImageMenuItem.with_label (""); + menu_exclude_add_folder_contents.label = _("Exclude Directory Contents"); + menu_exclude_add_folder_contents.set_image(new Gtk.Image.from_file (png_exclude)); + menu_exclude.append(menu_exclude_add_folder_contents); + + menu_exclude_add_folder_contents.activate.connect (menu_exclude_add_folder_contents_clicked); + + //menu_include + menu_include = new Gtk.Menu(); + btn_include.set_menu(menu_include); + + //menu_include_add_file + menu_include_add_file = new ImageMenuItem.with_label (""); + menu_include_add_file.label = _("Include File(s)"); + menu_include_add_file.set_image(new Gtk.Image.from_file (png_include)); + menu_include.append(menu_include_add_file); + + menu_include_add_file.activate.connect (menu_include_add_files_clicked); + + //menu_include_add_folder + menu_include_add_folder = new ImageMenuItem.with_label (""); + menu_include_add_folder.label = _("Include Directory"); + menu_include_add_folder.set_image(new Gtk.Image.from_file (png_include)); + menu_include.append(menu_include_add_folder); + + menu_include_add_folder.activate.connect (menu_include_add_folder_clicked); + + menu_exclude.show_all(); + menu_include.show_all(); + + //tv_exclude----------------------------------------------- + + //tv_exclude + tv_exclude = new TreeView(); + tv_exclude.get_selection().mode = SelectionMode.MULTIPLE; + tv_exclude.headers_visible = true; + tv_exclude.set_rules_hint (true); + //tv_exclude.row_activated.connect(tv_exclude_row_activated); + + //sw_exclude + sw_exclude = new ScrolledWindow(null, null); + sw_exclude.set_shadow_type (ShadowType.ETCHED_IN); + sw_exclude.add (tv_exclude); + sw_exclude.expand = true; + vbox_exclude.add(sw_exclude); + + //col_exclude + col_exclude = new TreeViewColumn(); + col_exclude.title = _("File Pattern"); + col_exclude.expand = true; + + CellRendererText cell_exclude_margin = new CellRendererText (); + cell_exclude_margin.text = ""; + col_exclude.pack_start (cell_exclude_margin, false); + + CellRendererPixbuf cell_exclude_icon = new CellRendererPixbuf (); + col_exclude.pack_start (cell_exclude_icon, false); + col_exclude.set_attributes(cell_exclude_icon, "pixbuf", 1); + + CellRendererText cell_exclude_text = new CellRendererText (); + col_exclude.pack_start (cell_exclude_text, false); + col_exclude.set_cell_data_func (cell_exclude_text, cell_exclude_text_render); + cell_exclude_text.editable = true; + tv_exclude.append_column(col_exclude); + + cell_exclude_text.edited.connect (cell_exclude_text_edited); + + //lnk_default_list + lnk_default_list = new LinkButton.with_label("",_("Some locations are excluded by default")); + lnk_default_list.xalign = (float) 0.0; + lnk_default_list.activate_link.connect(lnk_default_list_activate); + vbox_exclude.add(lnk_default_list); + + //initialize ------------------ + + btn_reset_exclude_list_clicked(); + refresh_tv_schedule(); + refresh_tv_remove(); + + // Actions ---------------------------------------------- + + //btn_save + btn_save = (Button) add_button (Stock.SAVE, Gtk.ResponseType.ACCEPT); + btn_save.clicked.connect (btn_save_clicked); + + //btn_cancel + btn_cancel = (Button) add_button (Stock.CANCEL, Gtk.ResponseType.CANCEL); + btn_cancel.clicked.connect (btn_cancel_clicked); + } + + + private void cell_sched_enable_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + bool val; + model.get (iter, 0, out val, -1); + (cell as Gtk.CellRendererToggle).active = val; + } + + private void cell_sched_level_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + string val; + model.get (iter, 1, out val, -1); + (cell as Gtk.CellRendererText).text = val; + } + + private void cell_sched_desc_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + string val; + model.get (iter, 2, out val, -1); + (cell as Gtk.CellRendererText).text = val; + } + + private void cell_remove_rule_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + string val; + model.get (iter, 0, out val, -1); + (cell as Gtk.CellRendererText).markup = val; + } + + private void cell_remove_limit_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + int val; + string units; + model.get (iter, 1, out val, 2, out units, -1); + (cell as Gtk.CellRendererText).text = (units == "GB") ? "%.0f".printf(val/1024.0) : val.to_string(); + } + + private void cell_remove_units_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + string val; + model.get (iter, 2, out val, -1); + (cell as Gtk.CellRendererText).text = val; + } + + private void cell_sched_enable_toggled (string path){ + TreeIter iter; + ListStore model = (ListStore)tv_schedule.model; + bool enabled; + int count; + + model.get_iter_from_string (out iter, path); + model.get (iter, 0, out enabled, 2, out count,-1); + model.set (iter, 0, !enabled); + + //update switch_auto_backups + bool atleast_one_enabled = false; + for(int k = 0; k<5; k++){ + model.get_iter_from_string (out iter, k.to_string()); + model.get (iter, 0, out enabled, -1); + if (enabled){ + atleast_one_enabled = true; + break; + } + } + + switch_schedule.active = atleast_one_enabled; + } + + private void cell_remove_limit_edited (string path, string new_text) { + int count = 0; + string units; + + TreeIter iter; + ListStore model = (ListStore)tv_remove.model; + model.get_iter_from_string (out iter, path); + model.get (iter, 2, out units,-1); + count = int.parse(new_text); + if (units == "GB"){ + count = count * 1024; + } + model.set (iter, 1, count); + } + + private void cell_exclude_text_render (CellLayout cell_layout, CellRenderer cell, TreeModel model, TreeIter iter){ + string pattern, color; + model.get (iter, 0, out pattern, 2, out color, -1); + (cell as Gtk.CellRendererText).text = pattern.has_prefix("+ ") ? pattern[2:pattern.length] : pattern; + (cell as Gtk.CellRendererText).foreground = color; + } + + private void cell_exclude_text_edited (string path, string new_text) { + string entry; + + TreeIter iter; + ListStore model = (ListStore) tv_exclude.model; + model.get_iter_from_string (out iter, path); + model.get (iter, 0, out entry, -1); + model.set (iter, 0, new_text); + } + + + private void refresh_tv_schedule(){ + + ListStore model = new ListStore(3, typeof(bool), typeof(string), typeof(string)); + + TreeIter iter; + model.append(out iter); + model.set (iter, 0, App.schedule_monthly); + model.set (iter, 1, _("Monthly")); + model.set (iter, 2, _("Keep one snapshot per month")); + + model.append(out iter); + model.set (iter, 0, App.schedule_weekly); + model.set (iter, 1, _("Weekly")); + model.set (iter, 2, _("Keep one snapshot per week")); + + model.append(out iter); + model.set (iter, 0, App.schedule_daily); + model.set (iter, 1, _("Daily")); + model.set (iter, 2, _("Keep one snapshot per day")); + + model.append(out iter); + model.set (iter, 0, App.schedule_hourly); + model.set (iter, 1, _("Hourly")); + model.set (iter, 2, _("Keep one snapshot per hour")); + + model.append(out iter); + model.set (iter, 0, App.schedule_boot); + model.set (iter, 1, _("Boot")); + model.set (iter, 2, _("Keep one snapshot per reboot")); + + tv_schedule.set_model (model); + tv_schedule.columns_autosize (); + } + + private void refresh_tv_remove(){ + + ListStore model = new ListStore(3, typeof(string), typeof(int), typeof(string)); + + string span = ""; + if (switch_schedule.active){ + span = ""; + } + else{ + span = ""; + } + + TreeIter iter; + model.append(out iter); + model.set (iter, 0, span + _("Monthly") + " " + _("snapshots older than")); + model.set (iter, 1, App.count_monthly); + model.set (iter, 2, "months"); + + model.append(out iter); + model.set (iter, 0, span + _("Weekly") + " " + _("snapshots older than")); + model.set (iter, 1, App.count_weekly); + model.set (iter, 2, "weeks"); + + model.append(out iter); + model.set (iter, 0, span + _("Daily") + " " + _("snapshots older than")); + model.set (iter, 1, App.count_daily); + model.set (iter, 2, "days"); + + model.append(out iter); + model.set (iter, 0, span + _("Hourly") + " " + _("snapshots older than")); + model.set (iter, 1, App.count_hourly); + model.set (iter, 2, "hours"); + + model.append(out iter); + model.set (iter, 0, span + _("Boot") + " " + _("snapshots older than")); + model.set (iter, 1, App.count_boot); + model.set (iter, 2, "reboots"); + + model.append(out iter); + model.set (iter, 0, _("All snapshots older than")); + model.set (iter, 1, App.retain_snapshots_max_days); + model.set (iter, 2, "days"); + + model.append(out iter); + model.set (iter, 0, _("When free space less than")); + model.set (iter, 1, App.minimum_free_disk_space_mb); + model.set (iter, 2, "GB"); + + tv_remove.set_model (model); + //tv_remove.columns_autosize (); + } + + private void refresh_tv_exclude(){ + ListStore model = new ListStore(3, typeof(string), typeof(Gdk.Pixbuf), typeof(string)); + tv_exclude.model = model; + + foreach(string path in temp_exclude_list){ + tv_exclude_add_item(path); + } + } + + private void tv_exclude_add_item(string path){ + Gdk.Pixbuf pix_exclude = null; + Gdk.Pixbuf pix_include = null; + Gdk.Pixbuf pix_selected = null; + string text_color; + + try{ + pix_exclude = new Gdk.Pixbuf.from_file (App.share_folder + "/timeshift/images/item-gray.png"); + pix_include = new Gdk.Pixbuf.from_file (App.share_folder + "/timeshift/images/item-blue.png"); + } + catch(Error e){ + log_error (e.message); + } + + TreeIter iter; + ListStore model = (ListStore) tv_exclude.model; + model.append(out iter); + + if (path.has_prefix("+ ")){ + pix_selected = pix_include; + } + else{ + pix_selected = pix_exclude; + } + + if (App.exclude_list_default.contains(path)){ + text_color = "#0B610B"; + } + else{ + text_color = "#000000"; + } + + model.set (iter, 0, path, 1, pix_selected, 2, text_color, -1); + + Adjustment adj = tv_exclude.get_hadjustment(); + adj.value = adj.upper; + } + + + private void switch_schedule_changed(){ + tv_schedule.sensitive = switch_schedule.active; + + if (switch_schedule.active){ + + bool atleast_one_enabled = App.schedule_boot + || App.schedule_hourly + || App.schedule_daily + || App.schedule_weekly + || App.schedule_monthly; + + if(!atleast_one_enabled){ + TreeIter iter; + ListStore store = (ListStore) tv_schedule.model; + bool enabled; + int index = -1; + + bool iterExists = store.get_iter_first (out iter); + while (iterExists) { + store.get (iter, 0, out enabled,-1); + switch(++index){ + case 4: + store.set (iter, 0, true); + break; + } + iterExists = store.iter_next (ref iter); + } + } + } + else{ + tv_schedule.get_selection().unselect_all(); + tv_remove.get_selection().unselect_all(); + } + + refresh_tv_remove(); //refresh the item colors + } + + private bool lnk_default_list_activate(){ + string msg = ""; + msg += "" + _("Exclude List") + ":\n\n"; + msg += _("Files matching the following patterns will be excluded") + ":\n\n"; + + foreach(string path in App.exclude_list_default){ + msg += path + "\n"; + } + msg += "\n"; + + msg += "" + _("Home Directory") + ":\n\n"; + msg += _("Hidden files and folders are included by default since \nthey contain user-specific configuration files.") + "\n"; + msg += _("All other files and folders are excluded.") + "\n"; + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, msg); + dialog.set_title(_("Default Entries")); + dialog.set_default_size (200, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + dialog.run(); + dialog.destroy(); + + return true; + } + + + private void menu_exclude_add_files_clicked(){ + + var list = browse_files(); + + if (list.length() > 0){ + foreach(string path in list){ + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_exclude_add_folder_clicked(){ + + var list = browse_folder(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path + "/"; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_exclude_add_folder_contents_clicked(){ + + var list = browse_folder(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path + "/*"; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_include_add_files_clicked(){ + + var list = browse_files(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path.has_prefix("+ ") ? path : "+ " + path; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private void menu_include_add_folder_clicked(){ + + var list = browse_folder(); + + if (list.length() > 0){ + foreach(string path in list){ + + path = path.has_prefix("+ ") ? path : "+ " + path; + path = path + "/***"; + + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + tv_exclude_add_item(path); + App.first_snapshot_size = 0; //re-calculate + } + } + } + } + + private SList browse_files(){ + var dialog = new Gtk.FileChooserDialog(_("Select file(s)"), this, Gtk.FileChooserAction.OPEN, + Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL, + Gtk.Stock.OPEN, Gtk.ResponseType.ACCEPT); + dialog.action = FileChooserAction.OPEN; + dialog.set_transient_for(this); + dialog.local_only = true; + dialog.set_modal (true); + dialog.set_select_multiple (true); + + dialog.run(); + var list = dialog.get_filenames(); + dialog.destroy (); + + return list; + } + + private SList browse_folder(){ + var dialog = new Gtk.FileChooserDialog(_("Select directory"), this, Gtk.FileChooserAction.OPEN, + Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL, + Gtk.Stock.OPEN, Gtk.ResponseType.ACCEPT); + dialog.action = FileChooserAction.SELECT_FOLDER; + dialog.local_only = true; + dialog.set_transient_for(this); + dialog.set_modal (true); + dialog.set_select_multiple (false); + + dialog.run(); + var list = dialog.get_filenames(); + dialog.destroy (); + + return list; + } + + + private void btn_remove_clicked(){ + TreeSelection sel = tv_exclude.get_selection (); + TreeIter iter; + bool iterExists = tv_exclude.model.get_iter_first (out iter); + while (iterExists) { + if (sel.iter_is_selected (iter)){ + string path; + tv_exclude.model.get (iter, 0, out path); + temp_exclude_list.remove(path); + App.first_snapshot_size = 0; //re-calculate + } + iterExists = tv_exclude.model.iter_next (ref iter); + } + + refresh_tv_exclude(); + } + + private void btn_warning_clicked(){ + string msg = ""; + msg += _("Documents, music and other folders in your home directory are excluded by default.") + " "; + msg += _("Please do NOT include these folders in your snapshot unless you have a very good reason for doing so.") + " "; + msg += _("If you include any specific folders then these folders will get overwritten with previous contents when you restore a snapshot."); + + var dialog = new Gtk.MessageDialog.with_markup(null, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, msg); + dialog.set_title("Warning"); + dialog.set_default_size (200, -1); + dialog.set_transient_for(this); + dialog.set_modal(true); + dialog.run(); + dialog.destroy(); + } + + private void btn_reset_exclude_list_clicked(){ + //create a temp exclude list ---------------------------- + + temp_exclude_list = new Gee.ArrayList(); + + foreach(string path in App.exclude_list_user){ + if (!temp_exclude_list.contains(path)){ + temp_exclude_list.add(path); + } + } + + //refresh treeview -------------------------- + + refresh_tv_exclude(); + } + + + private void btn_save_clicked(){ + tv_schedule_save_changes(); + tv_remove_save_changes(); + tv_exclude_save_changes(); + + App.save_app_config(); + + this.destroy(); + } + + private void tv_schedule_save_changes(){ + TreeIter iter; + TreeModel store = tv_schedule.model; + bool enabled; + int index = -1; + + bool iterExists = store.get_iter_first (out iter); + + while (iterExists) { + + store.get (iter, 0, out enabled,-1); + + switch(++index){ + case 0: + App.schedule_monthly = enabled; + break; + case 1: + App.schedule_weekly = enabled; + break; + case 2: + App.schedule_daily = enabled; + break; + case 3: + App.schedule_hourly = enabled; + break; + case 4: + App.schedule_boot = enabled; + break; + } + iterExists = store.iter_next (ref iter); + } + + if (!App.is_live_system()){ + App.is_scheduled = switch_schedule.active; + } + } + + private void tv_remove_save_changes(){ + TreeIter iter; + TreeModel store = tv_remove.model; + int count = -1; + int index = -1; + + bool iterExists = store.get_iter_first (out iter); + + while (iterExists) { + + store.get (iter, 1, out count, -1); + + switch(++index){ + case 0: + App.count_monthly = count; + break; + case 1: + App.count_weekly = count; + break; + case 2: + App.count_daily = count; + break; + case 3: + App.count_hourly = count; + break; + case 4: + App.count_boot = count; + break; + case 5: + App.retain_snapshots_max_days = count; + break; + case 6: + App.minimum_free_disk_space_mb = count; + break; + } + iterExists = store.iter_next (ref iter); + } + } + + private void tv_exclude_save_changes(){ + App.exclude_list_user.clear(); + foreach(string path in temp_exclude_list){ + if (!App.exclude_list_user.contains(path) && !App.exclude_list_default.contains(path) && !App.exclude_list_home.contains(path)){ + App.exclude_list_user.add(path); + } + } + } + + private void btn_cancel_clicked(){ + this.destroy(); + } + +} diff --git a/src/TimeShift.desktop b/src/TimeShift.desktop new file mode 100644 index 0000000..9adc1d0 --- /dev/null +++ b/src/TimeShift.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Name=TimeShift +MimeType= +Exec=gksu timeshift +Type=Application +GenericName=System Restore Utility +Terminal=false +Icon=/usr/share/pixmaps/timeshift.png +Caption=System Restore Utility +X-KDE-StartupNotify=false +Categories=System; +InitialPreference=9 +Name[en_US]=TimeShift diff --git a/src/Utility.vala b/src/Utility.vala new file mode 100644 index 0000000..c7d74d3 --- /dev/null +++ b/src/Utility.vala @@ -0,0 +1,1618 @@ +/* + * Utility.vala + * + * Copyright 2012 Tony George + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * + */ + +/* +public const string AppName = ""; +public const string AppVersion = "1.0"; +public const bool LogTimestamp = true; +public const bool UseConsoleColors = true; +public bool DEBUG_MODE = true; +*/ + +using Gtk; +using Json; + +public DataOutputStream dos_log; +extern void exit(int exit_code); + +public void log_msg (string message, bool highlight = false) +{ + string msg = ""; + + if (highlight && UseConsoleColors){ + msg += "\033[1;38;5;34m"; + } + + if (LogTimestamp){ + msg += "[" + Utility.timestamp() + "] "; + } + + msg += message; + + if (highlight && UseConsoleColors){ + msg += "\033[0m"; + } + + msg += "\n"; + + stdout.printf (msg); + + try { + if (dos_log != null){ + dos_log.put_string ("[%s] %s\n".printf(Utility.timestamp(), message)); + } + } + catch (Error e) { + stdout.printf (e.message); + } +} + +public void log_error (string message, bool highlight = false, bool is_warning = false) +{ + string msg = ""; + + if (highlight && UseConsoleColors){ + msg += "\033[1;38;5;160m"; + } + + if (LogTimestamp){ + msg += "[" + Utility.timestamp() + "] "; + } + + string prefix = (is_warning) ? _("Warning") : _("Error"); + + msg += prefix + ": " + message; + + if (highlight && UseConsoleColors){ + msg += "\033[0m"; + } + + msg += "\n"; + + stdout.printf (msg); + + try { + if (dos_log != null){ + dos_log.put_string ("[%s] %s: %s\n".printf(Utility.timestamp(), prefix, message)); + } + } + catch (Error e) { + stdout.printf (e.message); + } +} + +public void debug (string message) +{ + if (DEBUG_MODE){ + log_msg (message); + } +} + +namespace Utility +{ + public void messagebox_show(string title, string message, bool is_error = false) + { + Gtk.MessageType type = Gtk.MessageType.INFO; + + if (is_error) + type = Gtk.MessageType.ERROR; + + var dialog = new Gtk.MessageDialog.with_markup(null,Gtk.DialogFlags.MODAL, type, Gtk.ButtonsType.OK, message); + dialog.set_title(title); + dialog.run(); + dialog.destroy(); + } + + public void file_delete(string filePath) + { + try { + var file = File.new_for_path (filePath); + if (file.query_exists ()) { + file.delete (); + } + } catch (Error e) { + log_error (e.message); + } + } + + public class DistInfo : GLib.Object{ + public string dist_id = ""; + public string description = ""; + public string release = ""; + public string codename = ""; + + public DistInfo(){ + dist_id = ""; + description = ""; + release = ""; + codename = ""; + } + + public string full_name(){ + if (dist_id == ""){ + return ""; + } + else{ + string val = ""; + val += dist_id; + val += (release.length > 0) ? " " + release : ""; + val += (codename.length > 0) ? " (" + codename + ")" : ""; + return val; + } + } + } + + public DistInfo get_dist_info(string root_path) + { + DistInfo info = new DistInfo(); + + string dist_file = root_path + "/etc/lsb-release"; + var f = File.new_for_path(dist_file); + if (f.query_exists()){ + + /* + DISTRIB_ID=Ubuntu + DISTRIB_RELEASE=13.04 + DISTRIB_CODENAME=raring + DISTRIB_DESCRIPTION="Ubuntu 13.04" + */ + + foreach(string line in read_file(dist_file).split("\n")){ + + if (line.split("=").length != 2){ continue; } + + string key = line.split("=")[0].strip(); + string val = line.split("=")[1].strip(); + + if (val.has_prefix("\"")){ + val = val[1:val.length]; + } + + if (val.has_suffix("\"")){ + val = val[0:val.length-1]; + } + + switch (key){ + case "DISTRIB_ID": + info.dist_id = val; + break; + case "DISTRIB_RELEASE": + info.release = val; + break; + case "DISTRIB_CODENAME": + info.codename = val; + break; + case "DISTRIB_DESCRIPTION": + info.description = val; + break; + } + } + } + else{ + + dist_file = root_path + "/etc/os-release"; + f = File.new_for_path(dist_file); + if (f.query_exists()){ + + /* + NAME="Ubuntu" + VERSION="13.04, Raring Ringtail" + ID=ubuntu + ID_LIKE=debian + PRETTY_NAME="Ubuntu 13.04" + VERSION_ID="13.04" + HOME_URL="http://www.ubuntu.com/" + SUPPORT_URL="http://help.ubuntu.com/" + BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" + */ + + foreach(string line in read_file(dist_file).split("\n")){ + + if (line.split("=").length != 2){ continue; } + + string key = line.split("=")[0].strip(); + string val = line.split("=")[1].strip(); + + switch (key){ + case "ID": + info.dist_id = val; + break; + case "VERSION_ID": + info.release = val; + break; + //case "DISTRIB_CODENAME": + //info.codename = val; + //break; + case "PRETTY_NAME": + info.description = val; + break; + } + } + } + } + + return info; + } + + /* DistInfo get_dist_info() + { + DistInfo info = new DistInfo(); + + string std_out; + string std_err; + execute_command_script_sync("lsb_release -a 2>/dev/null", out std_out, out std_err); + + string[] lines = std_out.split("\n"); + + if (lines.length == 5){ + if (lines[0].index_of(":") != -1) + info.dist_id = lines[0].split(":")[1].strip(); + + if (lines[1].index_of(":") != -1) + info.description = lines[1].split(":")[1].strip(); + + if (lines[2].index_of(":") != -1) + info.release = lines[2].split(":")[1].strip(); + + if (lines[3].index_of(":") != -1) + info.codename = lines[3].split(":")[1].strip(); + } + + return info; + } + + public DistInfo? get_dist_info_chroot(string path){ + string sh = ""; + string std_out; + string std_err; + int ret_val; + + sh = "for i in /dev /proc /run /sys; do mount --bind \"$i\" \"%s$i\"; done \n".printf(path); + sh += "chroot \"%s\" lsb_release -a\n".printf(path); + sh += "for i in /dev /proc /run /sys; do umount -f \"%s$i\"; done \n".printf(path); + + ret_val = execute_command_script_sync(sh, out std_out, out std_err); + if (ret_val != 0){ + log_error("Failed to chroot snapshot"); + return null; + } + + DistInfo info = new DistInfo(); + string[] lines = std_out.split("\n"); + if (lines.length == 5){ + if (lines[0].index_of(":") != -1) + info.dist_id = lines[0].split(":")[1].strip(); + + if (lines[1].index_of(":") != -1) + info.description = lines[1].split(":")[1].strip(); + + if (lines[2].index_of(":") != -1) + info.release = lines[2].split(":")[1].strip(); + + if (lines[3].index_of(":") != -1) + info.codename = lines[3].split(":")[1].strip(); + } + return info; + } + */ + + private void set_busy (bool busy, Gtk.Window win) + { + Gdk.Cursor? cursor = null; + + if (busy){ + cursor = new Gdk.Cursor(Gdk.CursorType.WATCH); + } + else{ + cursor = new Gdk.Cursor(Gdk.CursorType.ARROW); + } + + var window = win.get_window (); + + if (window != null) { + window.set_cursor (cursor); + } + + do_events (); + } + + private void do_events () + { + while(Gtk.events_pending ()) + Gtk.main_iteration (); + } + + public class PartitionInfo : GLib.Object{ + public string device = ""; + public string type = ""; + public long size_mb = 0; + public long used_mb = 0; + public string label = ""; + public string uuid = ""; + public string available = ""; + public string used_percent = ""; + public string mount_point = ""; + public string dist_info = ""; + + public string description(){ + string s = ""; + s += device; + s += (type.length > 0) ? " ~ " + type : ""; + s += (used.length > 0) ? " ~ " + used + " / " + size + " used (" + used_percent + ")" : ""; + return s; + } + + public string description_device(){ + string s = ""; + s += device; + s += (uuid.length == 0) ? "" : ", UUID=" + uuid; + return s; + } + + public string description_usage(){ + if (used.length > 0){ + return used + " / " + size + " used (" + used_percent + ")"; + } + else{ + return ""; + } + } + + public string size{ + owned get{ + return (size_mb == 0) ? "" : "%.1f GB".printf(size_mb/1024.0); + } + } + + public string used{ + owned get{ + return (used_mb == 0) ? "" : "%.1f GB".printf(used_mb/1024.0); + } + } + + public long free_mb{ + get{ + return (size_mb - used_mb); + } + } + + public bool is_mounted{ + get{ + return (mount_point.length > 0); + } + } + + public string free{ + owned get{ + return (free_mb == 0) ? "" : "%.1f GB".printf(free_mb/1024.0); + } + } + + public string device_name_sdaX{ + owned get{ + return device.split("/")[2]; + } + } + + public string device_name_sda{ + owned get{ + return device.split("/")[2][0:3]; + } + } + + public bool has_linux_filesystem(){ + switch(type){ + case "ext2": + case "ext3": + case "ext4": + case "reiserfs": + case "reiser4": + case "xfs": + case "jfs": + case "btrfs": + return true; + default: + return false; + } + } + } + + public class DeviceInfo : GLib.Object{ + public string device = ""; + public bool removable = false; + public string vendor = ""; + public string model = ""; + + public string name{ + owned get{ + return vendor + " " + model; + } + } + + public string description{ + owned get{ + return device + " ~ " + vendor + " " + model; + } + } + } + + + public PartitionInfo get_partition_info(string path) + { + PartitionInfo info = new PartitionInfo(); + + string std_out = ""; + string std_err = ""; + int exit_code = execute_command_script_sync("df -T -BM \"" + path + "\"| uniq -w 12", out std_out, out std_err); + if (exit_code != 0){ return info; } + + string[] lines = std_out.split("\n"); + + int k = 1; + if (lines.length == 3){ + foreach(string part in lines[1].split(" ")){ + + if (part.strip().length == 0){ continue; } + + switch(k++){ + case 1: + info.device = part.strip(); + break; + case 2: + info.type = part.strip(); + break; + case 3: + info.size_mb = long.parse(part.strip().replace("M","")); + break; + case 4: + info.used_mb = long.parse(part.strip().replace("M","")); + break; + case 5: + info.available = part.strip(); + break; + case 6: + info.used_percent = part.strip(); + break; + case 7: + info.mount_point = part.strip(); + break; + } + } + } + + foreach(PartitionInfo pi in get_all_partitions()){ + if (pi.device == info.device){ + info.label = pi.label; + info.uuid = pi.uuid; + break; + } + } + + return info; + } + + public Gee.ArrayList get_mounted_partitions(){ + var list = new Gee.ArrayList(); + + string std_out = ""; + string std_err = ""; + int exit_code = execute_command_script_sync("df -T -BM", out std_out, out std_err);// | uniq -w 12 + + if (exit_code != 0){ return list; } + + string[] lines = std_out.split("\n"); + + int line_num = 0; + foreach(string line in lines){ + + if (++line_num == 1) { continue; } + if (line.strip().length == 0) { continue; } + + PartitionInfo info = new PartitionInfo(); + + int k = 1; + foreach(string part in line.split(" ")){ + + if (part.strip().length == 0){ continue; } + + switch(k++){ + case 1: + info.device = part.strip(); + break; + case 2: + info.type = part.strip(); + break; + case 3: + info.size_mb = long.parse(part.strip().replace("M","")); + break; + case 4: + info.used_mb = long.parse(part.strip().replace("M","")); + break; + case 5: + info.available = part.strip(); + break; + case 6: + info.used_percent = part.strip(); + break; + case 7: + info.mount_point = part.strip(); + break; + } + } + + list.add(info); + } + + return list; + } + + public Gee.ArrayList get_all_partitions(){ + var list = new Gee.ArrayList(); + var list_mounted = get_mounted_partitions(); + + string cmd = ""; + string std_out; + string std_err; + int ret_val; + Regex rex; + MatchInfo match; + + try{ + + cmd = "/sbin/blkid"; + ret_val = execute_command_script_sync(cmd, out std_out, out std_err); + + if (ret_val != 0){ + log_error ("Failed to get list of partitions"); + log_error (std_err); + return list_mounted; //return list of mounted devices + } + + foreach(string line in std_out.split("\n")){ + if (line.strip().length == 0) { continue; } + + PartitionInfo pi = new PartitionInfo(); + + pi.device = line.split(":")[0].strip(); + + if (pi.device.length == 0) { + continue; + } + + if (pi.device.has_prefix("/dev/sd") || pi.device.has_prefix("/dev/hd")) { + //ok + } + else{ + continue; + } + + rex = new Regex("""LABEL=\"([^\"]*)\""""); + if (rex.match (line, 0, out match)){ + pi.label = match.fetch(1).strip(); + } + + rex = new Regex("""UUID=\"([^\"]*)\""""); + if (rex.match (line, 0, out match)){ + pi.uuid = match.fetch(1).strip(); + } + + rex = new Regex("""TYPE=\"([^\"]*)\""""); + if (rex.match (line, 0, out match)){ + pi.type = match.fetch(1).strip(); + } + + //get usage info + foreach(PartitionInfo pm in list_mounted){ + if (pm.device == pi.device){ + pi.size_mb = pm.size_mb; + pi.used_mb = pm.used_mb; + pi.used_percent = pm.used_percent; + pi.mount_point = pm.mount_point; + } + } + + list.add(pi); + } + } + catch(Error e){ + log_error (e.message); + } + + return list; + } + + public bool mount(string device, string mount_point){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + File file; + + try{ + //check if mount point exists + file = File.new_for_path(mount_point); + if (!file.query_exists()){ + file.make_directory_with_parents(); + } + + //check if mounted + bool mounted = false; + foreach(PartitionInfo info in get_mounted_partitions()){ + + if (info.mount_point == mount_point && info.device == device){ + mounted = true; + break; + } + else if (info.mount_point == mount_point && info.device != device){ + //unmount + cmd = "sudo umount \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error ("Failed to unmount device '%s' from mount point '%s'".printf(info.device, info.mount_point)); + log_error (std_err); + return false; + } + else{ + log_msg ("Unmounted device '%s' from mount point '%s'".printf(info.device, info.mount_point)); + } + } + } + + if (!mounted){ + //mount + cmd = "sudo mount \"" + device + "\" \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error ("Failed to mount device '%s' at mount point '%s'".printf(device, mount_point)); + log_error (std_err); + return false; + } + else{ + log_msg ("Mounted device '%s' at mount point '%s'".printf(device, mount_point)); + } + } + } + catch(Error e){ + log_error (e.message); + return false; + } + + return true; + } + + public bool unmount(string mount_point){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + try{ + foreach(PartitionInfo info in get_mounted_partitions()){ + if (info.mount_point == mount_point){ + //unmount + cmd = "sudo umount \"" + mount_point + "\""; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + if (ret_val != 0){ + log_error ("Failed to unmount device '%s' from mount point '%s'".printf(info.device, info.mount_point)); + log_error (std_err); + return false; + } + else{ + log_msg ("Unmounted device '%s' from mount point '%s'".printf(info.device, info.mount_point)); + } + } + } + } + catch(Error e){ + log_error (e.message); + return false; + } + + return true; + } + + public Gee.ArrayList get_block_devices(){ + var device_list = new Gee.ArrayList(); + + string letters = "abcdefghijklmnopqrstuvwxyz"; + string letter = ""; + string path = ""; + string device = ""; + string model = ""; + string vendor = ""; + string removable = ""; + File f; + + for(int i=0; i<26; i++){ + letter = letters[i:i+1]; + + path = "/sys/block/sd%s".printf(letter); + f = File.new_for_path(path); + if (f.query_exists()){ + + device = ""; + model = ""; + removable = "0"; + + f = File.new_for_path(path + "/device/vendor"); + if (f.query_exists()){ + vendor = read_file(path + "/device/vendor"); + } + + f = File.new_for_path(path + "/device/model"); + if (f.query_exists()){ + model = read_file(path + "/device/model"); + } + + f = File.new_for_path(path + "/removable"); + if (f.query_exists()){ + removable = read_file(path + "/removable"); + } + + if ((vendor.length > 0) || (model.length > 0)){ + var dev = new DeviceInfo(); + dev.device = "/dev/sd%s".printf(letter); + dev.vendor = vendor.strip(); + dev.model = model.strip(); + dev.removable = (removable == "0") ? false : true; + device_list.add(dev); + } + } + } + + return device_list; + } + + public string json_get_string(Json.Object jobj, string member, string def_value){ + if (jobj.has_member(member)){ + return jobj.get_string_member(member); + } + else{ + log_error ("Member not found in JSON object: " + member, false, true); + return def_value; + } + } + + public bool json_get_bool(Json.Object jobj, string member, bool def_value){ + if (jobj.has_member(member)){ + return bool.parse(jobj.get_string_member(member)); + } + else{ + log_error ("Member not found in JSON object: " + member, false, true); + return def_value; + } + } + + public int json_get_int(Json.Object jobj, string member, int def_value){ + if (jobj.has_member(member)){ + return int.parse(jobj.get_string_member(member)); + } + else{ + log_error ("Member not found in JSON object: " + member, false, true); + return def_value; + } + } + + public double get_system_uptime_seconds(){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + try{ + cmd = "cat /proc/uptime"; + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + string uptime = std_out.split(" ")[0]; + double secs = double.parse(uptime); + return secs; + } + catch(Error e){ + log_error (e.message); + return 0; + } + } + + public long get_file_count(string path){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + cmd = "find \"%s\" | wc -l".printf(path); + ret_val = execute_command_script_sync(cmd, out std_out, out std_err); + return long.parse(std_out); + } + + public static Gdk.RGBA hex_to_rgba (string hex_color){ + string hex = hex_color.strip().down(); + if (hex.has_prefix("#") == false){ + hex = "#" + hex; + } + + Gdk.RGBA color = Gdk.RGBA(); + if(color.parse(hex) == false){ + color.parse("#000000"); + } + color.alpha = 255; + + return color; + } + + public static string rgba_to_hex (Gdk.RGBA color, bool alpha = false, bool prefix_hash = true){ + string hex = ""; + + if (alpha){ + hex = "%02x%02x%02x%02x".printf((uint)(Math.round(color.red*255)), + (uint)(Math.round(color.green*255)), + (uint)(Math.round(color.blue*255)), + (uint)(Math.round(color.alpha*255))) + .up(); + } + else { + hex = "%02x%02x%02x".printf((uint)(Math.round(color.red*255)), + (uint)(Math.round(color.green*255)), + (uint)(Math.round(color.blue*255))) + .up(); + } + + if (prefix_hash){ + hex = "#" + hex; + } + + return hex; + } + public string get_desktop_name() + { + string s = execute_command_sync_get_output("ps -C xfdesktop"); + if (s.split("\n").length > 2) { + return "Xfce"; + } + + s = execute_command_sync_get_output("ps -C wingpanel"); + if (s.split("\n").length > 2) { + return "Elementary"; + } + + s = execute_command_sync_get_output("ps -C cinnamon"); + if (s.split("\n").length > 2) { + return "Cinnamon"; + } + + s = execute_command_sync_get_output("ps -C unity-panel-service"); + if (s.split("\n").length > 2) { + return "Unity"; + } + + return "Unknown"; + } + + public string timestamp2 () + { + return "%ld".printf((long) time_t ()); + } + + public string timestamp () + { + Time t = Time.local (time_t ()); + return t.format ("%H:%M:%S"); + } + + public string format_file_size (int64 size) + { + return "%0.1f MB".printf (size / (1024.0 * 1024)); + } + + public string format_duration (long millis) + { + double time = millis / 1000.0; // time in seconds + + double hr = Math.floor(time / (60.0 * 60)); + time = time - (hr * 60 * 60); + double min = Math.floor(time / 60.0); + time = time - (min * 60); + double sec = Math.floor(time); + + return "%02.0lf:%02.0lf:%02.0lf".printf (hr, min, sec); + } + + public double parse_time (string time) + { + string[] arr = time.split (":"); + double millis = 0; + if (arr.length >= 3){ + millis += double.parse(arr[0]) * 60 * 60; + millis += double.parse(arr[1]) * 60; + millis += double.parse(arr[2]); + } + return millis; + } + + public long get_file_duration(string filePath) + { + string output = "0"; + + try { + Process.spawn_command_line_sync("mediainfo \"--Inform=General;%Duration%\" " + double_quote (filePath), out output); + } + catch(Error e){ + log_error (e.message); + } + + return long.parse(output); + } + + public string get_file_crop_params (string filePath) + { + string output = ""; + string error = ""; + + try { + Process.spawn_command_line_sync("avconv -i " + double_quote (filePath) + " -vf cropdetect=30 -ss 5 -t 5 -f matroska -an -y /dev/null", out output, out error); + } + catch(Error e){ + log_error (e.message); + } + + int w=0,h=0,x=10000,y=10000; + int num=0; + string key,val; + string[] arr; + + foreach (string line in error.split ("\n")){ + if (line == null) { continue; } + if (line.index_of ("crop=") == -1) { continue; } + + foreach (string part in line.split (" ")){ + if (part == null || part.length == 0) { continue; } + + arr = part.split (":"); + if (arr.length != 2) { continue; } + + key = arr[0].strip (); + val = arr[1].strip (); + + switch (key){ + case "x": + num = int.parse (arr[1]); + if (num < x) { x = num; } + break; + case "y": + num = int.parse (arr[1]); + if (num < y) { y = num; } + break; + case "w": + num = int.parse (arr[1]); + if (num > w) { w = num; } + break; + case "h": + num = int.parse (arr[1]); + if (num > h) { h = num; } + break; + } + } + } + + if (x == 10000 || y == 10000) + return "%i:%i:%i:%i".printf(0,0,0,0); + else + return "%i:%i:%i:%i".printf(w,h,x,y); + } + + public string get_mediainfo (string filePath) + { + string output = ""; + + try { + Process.spawn_command_line_sync("mediainfo " + double_quote (filePath), out output); + } + catch(Error e){ + log_error (e.message); + } + + return output; + } + + public int[] get_process_children (Pid parentPid) + { + string output; + + try { + Process.spawn_command_line_sync("ps --ppid " + parentPid.to_string(), out output); + } + catch(Error e){ + log_error (e.message); + } + + int pid; + int[] procList = {}; + string[] arr; + + foreach (string line in output.split ("\n")){ + arr = line.strip().split (" "); + if (arr.length < 1) { continue; } + + pid = 0; + pid = int.parse (arr[0]); + + if (pid != 0){ + procList += pid; + } + } + return procList; + } + + public bool process_is_running(long pid){ + string cmd = ""; + string std_out; + string std_err; + int ret_val; + + try{ + cmd = "ps --pid %ld".printf(pid); + Process.spawn_command_line_sync(cmd, out std_out, out std_err, out ret_val); + } + catch (Error e) { + log_error (e.message); + return false; + } + + return (ret_val == 0); + } + + public void process_kill(Pid process_pid, bool killChildren = true) + { + int[] child_pids = get_process_children (process_pid); + Posix.kill (process_pid, 15); + + if (killChildren){ + Pid childPid; + foreach (long pid in child_pids){ + childPid = (Pid) pid; + Posix.kill (childPid, 15); + } + } + } + + public void process_set_priority (Pid procID, int prio) + { + if (Posix.getpriority (Posix.PRIO_PROCESS, procID) != prio) + Posix.setpriority (Posix.PRIO_PROCESS, procID, prio); + } + + public int process_get_priority (Pid procID) + { + return Posix.getpriority (Posix.PRIO_PROCESS, procID); + } + + public void process_set_priority_normal (Pid procID) + { + process_set_priority (procID, 0); + } + + public void process_set_priority_low (Pid procID) + { + process_set_priority (procID, 5); + } + + public bool file_exists (string filePath) + { + return ( FileUtils.test(filePath, GLib.FileTest.EXISTS) && FileUtils.test(filePath, GLib.FileTest.IS_REGULAR)); + } + + public bool dir_exists (string filePath) + { + return ( FileUtils.test(filePath, GLib.FileTest.EXISTS) && FileUtils.test(filePath, GLib.FileTest.IS_DIR)); + } + + public bool create_dir (string filePath) + { + try{ + var dir = File.parse_name (filePath); + if (dir.query_exists () == false) { + dir.make_directory (null); + } + return true; + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public bool move_file (string sourcePath, string destPath) + { + try{ + File fromFile = File.new_for_path (sourcePath); + File toFile = File.new_for_path (destPath); + fromFile.move (toFile, FileCopyFlags.NONE); + return true; + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public bool copy_file (string sourcePath, string destPath) + { + try{ + File fromFile = File.new_for_path (sourcePath); + File toFile = File.new_for_path (destPath); + fromFile.copy (toFile, FileCopyFlags.NONE); + return true; + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public string resolve_relative_path (string filePath) + { + string filePath2 = filePath; + if (filePath2.has_prefix ("~")){ + filePath2 = Environment.get_home_dir () + "/" + filePath2[2:filePath2.length]; + } + + try { + string output = ""; + Process.spawn_command_line_sync("realpath " + double_quote (filePath2), out output); + output = output.strip (); + if (FileUtils.test(output, GLib.FileTest.EXISTS)){ + return output; + } + } + catch(Error e){ + log_error (e.message); + } + + return filePath2; + } + + public bool user_is_admin () + { + try{ + // create a process + string[] argv = { "sleep", "10" }; + Pid procId; + Process.spawn_async(null, argv, null, SpawnFlags.SEARCH_PATH, null, out procId); + + // try changing the priority + Posix.setpriority (Posix.PRIO_PROCESS, procId, -5); + + // check if priority was changed successfully + if (Posix.getpriority (Posix.PRIO_PROCESS, procId) == -5) + return true; + else + return false; + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public int get_pid_by_name (string name) + { + try{ + string output = ""; + Process.spawn_command_line_sync("pidof " + double_quote (name), out output); + if (output != null){ + string[] arr = output.split ("\n"); + if (arr.length > 0){ + return int.parse (arr[0]); + } + } + } + catch (Error e) { + log_error (e.message); + } + + return -1; + } + + public bool shutdown () + { + try{ + string[] argv = { "shutdown", "-h", "now" }; + Pid procId; + Process.spawn_async(null, argv, null, SpawnFlags.SEARCH_PATH, null, out procId); + return true; + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public string double_quote (string txt) + { + return "\"" + txt.replace ("\"","\\\"") + "\""; + } + + public int execute_command_sync (string cmd) + { + try { + int exitCode; + Process.spawn_command_line_sync(cmd, null, null, out exitCode); + return exitCode; + } + catch (Error e){ + log_error (e.message); + return -1; + } + } + + public string execute_command_sync_get_output (string cmd) + { + try { + int exitCode; + string std_out; + Process.spawn_command_line_sync(cmd, out std_out, null, out exitCode); + return std_out; + } + catch (Error e){ + log_error (e.message); + return ""; + } + } + + public bool execute_command_async (string cmd) + { + try { + + string scriptfile = create_temp_bash_script ("#!/bin/bash\n" + cmd); + + string[] argv = new string[1]; + argv[0] = scriptfile; + + Pid child_pid; + Process.spawn_async_with_pipes( + null, //working dir + argv, //argv + null, //environment + SpawnFlags.SEARCH_PATH, + null, + out child_pid); + return true; + } + catch (Error e){ + log_error (e.message); + return false; + } + } + + public string? create_temp_bash_script (string script_text) + { + var sh = ""; + sh += "#!/bin/bash\n"; + sh += script_text; + + string script_path = get_temp_file_path() + ".sh"; + + if (write_file (script_path, sh)){ // create file + chmod (script_path, "u+x"); // set execute permission + return script_path; + } + else{ + return null; + } + } + + public string get_temp_file_path(){ + return Environment.get_tmp_dir () + "/" + timestamp2() + (new Rand()).next_int().to_string(); + + } + public string? read_file (string file_path) + { + string txt; + size_t size; + + try{ + GLib.FileUtils.get_contents (file_path, out txt, out size); + return txt; + } + catch (Error e){ + log_error (e.message); + } + + return null; + } + + public bool write_file (string file_path, string contents) + { + try{ + var file = File.new_for_path (file_path); + var file_stream = file.create (FileCreateFlags.REPLACE_DESTINATION); + var data_stream = new DataOutputStream (file_stream); + data_stream.put_string (contents); + data_stream.close(); + return true; + } + catch (Error e) { + log_error (e.message); + return false; + } + } + + public int execute_command_script_sync (string script, out string std_out, out string std_err) + { + string path = create_temp_bash_script(script); + + try { + + string[] argv = new string[1]; + argv[0] = path; + + int exit_code; + + Process.spawn_sync ( + Environment.get_tmp_dir (), //working dir + argv, //argv + null, //environment + SpawnFlags.SEARCH_PATH, + null, // child_setup + out std_out, + out std_err, + out exit_code + ); + + return exit_code; + } + catch (Error e){ + log_error (e.message); + return -1; + } + } + + public bool execute_command_script_in_terminal_sync (string script) + { + try { + + string[] argv = new string[3]; + argv[0] = "x-terminal-emulator"; + argv[1] = "-e"; + argv[2] = script; + + Process.spawn_sync ( + Environment.get_tmp_dir (), //working dir + argv, //argv + null, //environment + SpawnFlags.SEARCH_PATH, + null // child_setup + ); + + return true; + } + catch (Error e){ + log_error (e.message); + return false; + } + } + + public void setting_read (string section, string key) + { + //string config_file = get_app_dir () + "/config"; + //string txt = read_file (config_file); + + //string section + } + + public void setting_write (string section, string key) + { + + } + + public string get_app_path () + { + try{ + return GLib.FileUtils.read_link ("/proc/self/exe"); + } + catch (Error e){ + log_error (e.message); + return ""; + } + } + + public string get_app_dir () + { + try{ + return (File.new_for_path (GLib.FileUtils.read_link ("/proc/self/exe"))).get_parent ().get_path (); + } + catch (Error e){ + log_error (e.message); + return ""; + } + } + + public bool exo_open_folder (string txt) + { + string path; + + path = get_cmd_path ("exo-open"); + if ((path != null)&&(path != "")){ + return execute_command_async ("exo-open " + double_quote (txt)); + } + + path = get_cmd_path ("nemo"); + if ((path != null)&&(path != "")){ + return execute_command_async ("nemo " + double_quote (txt)); + } + + path = get_cmd_path ("nautilus"); + if ((path != null)&&(path != "")){ + return execute_command_async ("nautilus " + double_quote (txt)); + } + + path = get_cmd_path ("thunar"); + if ((path != null)&&(path != "")){ + return execute_command_async ("thunar " + double_quote (txt)); + } + + return false; + } + + public int exo_open_textfile (string txt) + { + string path; + + path = get_cmd_path ("exo-open"); + if ((path != null)&&(path != "")){ + return execute_command_sync ("exo-open " + double_quote (txt)); + } + + path = get_cmd_path ("gedit"); + if ((path != null)&&(path != "")){ + return execute_command_sync ("gedit --new-document " + double_quote (txt)); + } + + return -1; + } + + public int execute_bash_script_fullscreen_sync (string script_file){ + string path; + + path = get_cmd_path ("xfce4-terminal"); + if ((path != null)&&(path != "")){ + return execute_command_sync ("xfce4-terminal --fullscreen -e \"%s\"".printf(script_file)); + } + + path = get_cmd_path ("gnome-terminal"); + if ((path != null)&&(path != "")){ + return execute_command_sync ("gnome-terminal --full-screen -e \"%s\"".printf(script_file)); + } + + path = get_cmd_path ("xterm"); + if ((path != null)&&(path != "")){ + return execute_command_sync ("xterm --fullscreen -e \"%s\"".printf(script_file)); + } + + //default terminal - unknown, normal window + path = get_cmd_path ("x-terminal-emulator"); + if ((path != null)&&(path != "")){ + return execute_command_sync ("x-terminal-emulator -e \"%s\"".printf(script_file)); + } + + return -1; + } + + public int chmod (string file, string permission) + { + return execute_command_sync ("chmod " + permission + " " + double_quote (file)); + } + + public int process_pause (Pid procID) + { + return execute_command_sync ("kill -STOP " + procID.to_string()); + } + + public int process_resume (Pid procID) + { + return execute_command_sync ("kill -CONT " + procID.to_string()); + } + + public int notify_send (string title, string message, int durationMillis, string urgency) + { + string s = "notify-send -t %d -u %s -i %s \"%s\" \"%s\"".printf(durationMillis, urgency, Gtk.Stock.INFO, title, message); + return execute_command_sync (s); + } + + public int rsync (string sourceDirectory, string destDirectory, bool updateExisting, bool deleteExtra) + { + string cmd = "rsync --recursive --perms --chmod=a=rwx"; + cmd += updateExisting ? "" : " --ignore-existing"; + cmd += deleteExtra ? " --delete" : ""; + cmd += " " + double_quote(sourceDirectory + "//"); + cmd += " " + double_quote(destDirectory); + return execute_command_sync (cmd); + } + + + + public string get_cmd_path (string cmd) + { + try { + int exitCode; + string stdout, stderr; + Process.spawn_command_line_sync("which " + cmd, out stdout, out stderr, out exitCode); + return stdout; + } + catch (Error e){ + log_error (e.message); + return ""; + } + } + + public bool Combo_SelectValue (ComboBox combo, int index, string val) + { + TreeIter iter; + string comboVal; + TreeModel model = (TreeModel) combo.model; + + bool iterExists = model.get_iter_first (out iter); + while (iterExists){ + model.get(iter, 1, out comboVal); + if (comboVal == val){ + combo.set_active_iter(iter); + return true; + } + iterExists = model.iter_next (ref iter); + } + + return false; + } + + public string Combo_GetSelectedValue (ComboBox combo, int index, string default_value) + { + if (combo.model == null) { return default_value; } + if (combo.active < 0) { return default_value; } + + TreeIter iter; + string val = ""; + combo.get_active_iter (out iter); + TreeModel model = (TreeModel) combo.model; + model.get(iter, index, out val); + + return val; + } +} + +public class CellRendererProgress2 : Gtk.CellRendererProgress +{ + public override void render (Cairo.Context cr, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags) + { + if (text == "--") + return; + + int diff = (int) ((cell_area.height - height)/2); + + // Apply the new height into the bar, and center vertically: + Gdk.Rectangle new_area = Gdk.Rectangle() ; + new_area.x = cell_area.x; + new_area.y = cell_area.y + diff; + new_area.width = width - 5; + new_area.height = height; + + base.render(cr, widget, background_area, new_area, flags); + } +} diff --git a/src/makefile b/src/makefile new file mode 100644 index 0000000..71bde9f --- /dev/null +++ b/src/makefile @@ -0,0 +1,52 @@ +prefix = /usr +bindir = $(prefix)/bin +sharedir = $(prefix)/share +localedir = $(sharedir)/locale +launcherdir = $(sharedir)/applications +mandir = $(sharedir)/man +man1dir = $(mandir)/man1 +CFLAGS = --std=c99 + +all: + valac -X -D'GETTEXT_PACKAGE="timeshift"' --Xcc="-lm" --thread "Main.vala" "Utility.vala" "MainWindow.vala" "SettingsWindow.vala" "RestoreWindow.vala" -o timeshift --pkg glib-2.0 --pkg gio-unix-2.0 --pkg posix --pkg gtk+-3.0 --pkg gee-1.0 --pkg libsoup-2.4 --pkg json-glib-1.0 + +clean: + rm -rf *.o timeshift + +install: + mkdir -p "$(DESTDIR)" + mkdir -p "$(DESTDIR)$(bindir)" + mkdir -p "$(DESTDIR)$(sharedir)" + mkdir -p "$(DESTDIR)$(mandir)" + mkdir -p "$(DESTDIR)$(man1dir)" + mkdir -p "$(DESTDIR)$(launcherdir)" + mkdir -p "$(DESTDIR)$(sharedir)/timeshift" + mkdir -p "$(DESTDIR)$(sharedir)/pixmaps" + mkdir -p "/mnt/timeshift" + + #binary + install -m 0755 timeshift "$(DESTDIR)$(bindir)" + + #shared files + cp -dpr --no-preserve=ownership -t "$(DESTDIR)$(sharedir)/timeshift" ./share/timeshift/* + chmod --recursive 0755 $(DESTDIR)$(sharedir)/timeshift/* + + #launcher + install -m 0755 TimeShift.desktop "$(DESTDIR)$(launcherdir)" + + #app icon + install -m 0755 ./share/pixmaps/timeshift.png "$(DESTDIR)$(sharedir)/pixmaps/" + +uninstall: + + #binary + rm -f "$(DESTDIR)$(bindir)/timeshift" + + #shared files + rm -rf "$(DESTDIR)$(sharedir)/timeshift" + + #launcher + rm -f "$(DESTDIR)$(launcherdir)/TimeShift.desktop" + + #app icon + rm -f "$(DESTDIR)$(sharedir)/pixmaps/timeshift.png" diff --git a/src/share/pixmaps/timeshift.png b/src/share/pixmaps/timeshift.png new file mode 100644 index 0000000..9023664 Binary files /dev/null and b/src/share/pixmaps/timeshift.png differ diff --git a/src/share/timeshift/images/exclude.png b/src/share/timeshift/images/exclude.png new file mode 100644 index 0000000..cce63a1 Binary files /dev/null and b/src/share/timeshift/images/exclude.png differ diff --git a/src/share/timeshift/images/include.png b/src/share/timeshift/images/include.png new file mode 100644 index 0000000..cc82884 Binary files /dev/null and b/src/share/timeshift/images/include.png differ diff --git a/src/share/timeshift/images/item-blue.png b/src/share/timeshift/images/item-blue.png new file mode 100644 index 0000000..72e0e57 Binary files /dev/null and b/src/share/timeshift/images/item-blue.png differ diff --git a/src/share/timeshift/images/item-gray.png b/src/share/timeshift/images/item-gray.png new file mode 100644 index 0000000..6ec7a6d Binary files /dev/null and b/src/share/timeshift/images/item-gray.png differ diff --git a/src/share/timeshift/images/item-green.png b/src/share/timeshift/images/item-green.png new file mode 100644 index 0000000..7c77db5 Binary files /dev/null and b/src/share/timeshift/images/item-green.png differ diff --git a/src/share/timeshift/images/item-red.png b/src/share/timeshift/images/item-red.png new file mode 100644 index 0000000..d09e471 Binary files /dev/null and b/src/share/timeshift/images/item-red.png differ diff --git a/src/share/timeshift/images/item-yellow.png b/src/share/timeshift/images/item-yellow.png new file mode 100644 index 0000000..da12bb6 Binary files /dev/null and b/src/share/timeshift/images/item-yellow.png differ diff --git a/src/share/timeshift/images/progress.gif b/src/share/timeshift/images/progress.gif new file mode 100644 index 0000000..f31f7ed Binary files /dev/null and b/src/share/timeshift/images/progress.gif differ diff --git a/src/share/timeshift/images/spinner.gif b/src/share/timeshift/images/spinner.gif new file mode 100644 index 0000000..9785eb2 Binary files /dev/null and b/src/share/timeshift/images/spinner.gif differ diff --git a/src/timeshift b/src/timeshift new file mode 100755 index 0000000..90fc61e Binary files /dev/null and b/src/timeshift differ diff --git a/src/timeshift-backup.vala b/src/timeshift-backup.vala new file mode 100644 index 0000000..e69de29 diff --git a/src/timeshift-restore.vala b/src/timeshift-restore.vala new file mode 100644 index 0000000..80e38c1 --- /dev/null +++ b/src/timeshift-restore.vala @@ -0,0 +1,37 @@ +using GLib; +using Gtk; +using Gee; +using Soup; +using Json; +using Utility; + +public Main App; +public const string AppName = "TimeShift"; +public const string AppVersion = "1.0"; +public const string AppAuthor = "Tony George"; +public const string AppAuthorEmail = "teejee2008@gmail.com"; +public const bool LogTimestamp = true; +public bool UseConsoleColors = false; + +const string GETTEXT_PACKAGE = ""; +const string LOCALE_DIR = "/usr/share/locale"; + +public class Main : GLib.Object +{ + public Main(string arg0) + { + this.app_path = (File.new_for_path (arg0)).get_parent ().get_path (); + this.root_device = get_partition_info("/"); + this.home_device = get_partition_info("/home"); + + string local_path = app_path + "/share"; + if (dir_exists(local_path)){ + share_folder = local_path; + } + + this.rsnapshot_conf_path = this.share_folder + "/rsnapshot.conf"; + + load_app_config(); + } + +} diff --git a/timeshift.geany b/timeshift.geany new file mode 100644 index 0000000..f1e9642 --- /dev/null +++ b/timeshift.geany @@ -0,0 +1,59 @@ +[indentation] +indent_width=4 +indent_type=1 +indent_hard_tab_width=8 +detect_indent=false +detect_indent_width=false +indent_mode=2 + +[project] +name=timeshift +base_path=/home/teejee/projects/timeshift/src +description= +file_patterns= + +[long line marker] +long_line_behaviour=1 +long_line_column=80 + +[files] +current_page=1 +FILE_NAME_0=46254;Vala;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fsrc%2FMain.vala;0;4 +FILE_NAME_1=15114;Vala;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fsrc%2FMainWindow.vala;0;4 +FILE_NAME_2=7729;Vala;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fsrc%2FSettingsWindow.vala;0;4 +FILE_NAME_3=14998;Vala;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fsrc%2FRestoreWindow.vala;0;4 +FILE_NAME_4=802;Vala;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fsrc%2FUtility.vala;0;4 +FILE_NAME_5=0;Make;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fsrc%2Fmakefile;0;4 +FILE_NAME_6=516;Conf;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fdebian%2Fcontrol;0;4 +FILE_NAME_7=1145;None;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Ftimeshift%2Fbuild-installer;0;4 +FILE_NAME_8=2664;Sh;0;16;1;1;0;%2Fhome%2Fteejee%2Fprojects%2Fmake-sfx%2Flib%2Fmake-sfx%2Fheader.sh;0;4 + +[VTE] +last_dir=/home/teejee + +[build-menu] +ValaFT_00_LB=_Compile +ValaFT_00_CM= +ValaFT_00_WD= +filetypes=Vala; +NF_00_LB=_Make +NF_00_CM=make all +NF_00_WD= +NF_03_LB=Clean +NF_03_CM=make clean +NF_03_WD= +EX_00_LB=_Execute +EX_00_CM=gksu './timeshift --show-commands --debug' +EX_00_WD= +EX_01_LB=Execute (sudo) +EX_01_CM=gksu './timeshift --show-commands --debug' +EX_01_WD= +ValaFT_01_LB=_Build +ValaFT_01_CM=make all +ValaFT_01_WD= + +[file_prefs] +final_new_line=true +ensure_convert_new_lines=false +strip_trailing_spaces=false +replace_tabs=false diff --git a/timeshift.pot b/timeshift.pot new file mode 100644 index 0000000..060d031 --- /dev/null +++ b/timeshift.pot @@ -0,0 +1,1109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Tony George (teejee2008@gmail.com) +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: timeshift 1.0\n" +"Report-Msgid-Bugs-To: teejee2008@gmail.com\n" +"POT-Creation-Date: 2013-10-05 09:36+0530\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/MainWindow.vala:1058 +msgid "A System Restore Utility for Linux" +msgstr "" + +#: src/Main.vala:171 +msgid "A scheduled job is currently taking a system snapshot." +msgstr "" + +#: src/MainWindow.vala:192 +msgid "About" +msgstr "" + +#: src/MainWindow.vala:193 +msgid "About TimeShift" +msgstr "" + +#: src/Main.vala:135 +msgid "Admin Access Required" +msgstr "" + +#: src/RestoreWindow.vala:235 src/SettingsWindow.vala:236 +msgid "Advanced" +msgstr "" + +#: src/RestoreWindow.vala:626 src/SettingsWindow.vala:698 +msgid "All other files and folders are excluded." +msgstr "" + +#: src/SettingsWindow.vala:588 +msgid "All snapshots older than" +msgstr "" + +#: src/Main.vala:397 +msgid "Another instance of timeshift is currently running" +msgstr "" + +#: src/Main.vala:175 +msgid "Another instance of timeshift is currently running!" +msgstr "" + +#: src/RestoreWindow.vala:810 +msgid "Any exclude patterns in the current exclude list will also be excluded." +msgstr "" + +#: src/Main.vala:1691 +msgid "App config loaded" +msgstr "" + +#: src/Main.vala:1628 +msgid "App config saved" +msgstr "" + +#: src/Main.vala:1955 src/Main.vala:1958 +msgid "Application will exit!" +msgstr "" + +#: src/SettingsWindow.vala:185 +msgid "Auto-Remove" +msgstr "" + +#: src/MainWindow.vala:115 +msgid "Backup" +msgstr "" + +#: src/MainWindow.vala:208 +msgid "Backup Device" +msgstr "" + +#: src/MainWindow.vala:548 src/MainWindow.vala:568 +msgid "Backup Device Changed" +msgstr "" + +#: src/SettingsWindow.vala:167 +msgid "Backup Level" +msgstr "" + +#: src/Main.vala:2124 src/MainWindow.vala:768 src/MainWindow.vala:1198 +#: src/MainWindow.vala:1206 +msgid "Backup device does not have enough space!" +msgstr "" + +#: src/MainWindow.vala:1191 +msgid "Backup device is not mounted!" +msgstr "" + +#: src/Main.vala:2118 +msgid "Backup device not available!" +msgstr "" + +#: src/MainWindow.vala:954 +msgid "Before restoring" +msgstr "" + +#: src/SettingsWindow.vala:542 src/SettingsWindow.vala:583 +msgid "Boot" +msgstr "" + +#: src/Main.vala:564 +msgid "Boot snapshot failed!" +msgstr "" + +#: src/Main.vala:545 +msgid "Boot snapshots are enabled" +msgstr "" + +#: src/RestoreWindow.vala:192 +msgid "Bootloader" +msgstr "" + +#: src/MainWindow.vala:133 +msgid "Browse" +msgstr "" + +#: src/MainWindow.vala:134 +msgid "Browse Snapshot" +msgstr "" + +#: src/RestoreWindow.vala:809 +msgid "" +"By default, any item that was included/excluded at the time of taking the " +"snapshot will be included/excluded." +msgstr "" + +#: src/RestoreWindow.vala:421 src/RestoreWindow.vala:422 +msgid "Cancel" +msgstr "" + +#: src/Main.vala:753 src/Main.vala:1438 +msgid "Cleaning up..." +msgstr "" + +#: src/MainWindow.vala:545 +msgid "Click 'OK' to confirm" +msgstr "" + +#: src/MainWindow.vala:350 +msgid "Comments" +msgstr "" + +#: src/RestoreWindow.vala:950 +msgid "Continue with restore?" +msgstr "" + +#: src/Main.vala:1954 src/Main.vala:1958 +msgid "Critical Error" +msgstr "" + +#: src/Main.vala:2060 +msgid "Cron job added" +msgstr "" + +#: src/Main.vala:2085 +msgid "Cron job removed" +msgstr "" + +#: src/Main.vala:2021 +msgid "Crontab is empty" +msgstr "" + +#: src/RestoreWindow.vala:946 src/RestoreWindow.vala:953 +msgid "DISCLAIMER" +msgstr "" + +#: src/SettingsWindow.vala:532 src/SettingsWindow.vala:573 +msgid "Daily" +msgstr "" + +#: src/Main.vala:628 +msgid "Daily snapshot failed!" +msgstr "" + +#: src/Main.vala:609 +msgid "Daily snapshots are enabled" +msgstr "" + +#: src/RestoreWindow.vala:629 src/SettingsWindow.vala:701 +msgid "Default Entries" +msgstr "" + +#: src/MainWindow.vala:142 +msgid "Delete" +msgstr "" + +#: src/MainWindow.vala:143 +msgid "Delete Snapshot" +msgstr "" + +#: src/Main.vala:766 +msgid "Deleted incomplete snapshot" +msgstr "" + +#: src/MainWindow.vala:860 +msgid "Deleting snapshot" +msgstr "" + +#: src/SettingsWindow.vala:175 +msgid "Description" +msgstr "" + +#: src/RestoreWindow.vala:132 +msgid "Device" +msgstr "" + +#: src/Main.vala:1942 src/Main.vala:1965 +msgid "Device unmounted" +msgstr "" + +#: src/MainWindow.vala:479 src/MainWindow.vala:501 +msgid "Disable Scheduled Snapshots" +msgstr "" + +#: src/MainWindow.vala:1243 +msgid "Disabled" +msgstr "" + +#: src/MainWindow.vala:498 +msgid "Do you want to select another device now?" +msgstr "" + +#: src/MainWindow.vala:565 +msgid "Do you want to select another device?" +msgstr "" + +#: src/MainWindow.vala:520 +msgid "Do you want to take the first snapshot now?" +msgstr "" + +#: src/SettingsWindow.vala:854 +msgid "" +"Documents, music and other folders in your home directory are excluded by " +"default." +msgstr "" + +#: src/SettingsWindow.vala:157 +msgid "Enable" +msgstr "" + +#: src/MainWindow.vala:1239 +msgid "Enabled" +msgstr "" + +#: src/Main.vala:1395 src/Main.vala:1487 src/Utility.vala:82 +msgid "Error" +msgstr "" + +#: src/MainWindow.vala:865 +msgid "Error: Unable to delete snapshot" +msgstr "" + +#: src/MainWindow.vala:790 +msgid "Error: Unable to save snapshot" +msgstr "" + +#: src/MainWindow.vala:449 +msgid "Estimating system size..." +msgstr "" + +#: src/RestoreWindow.vala:257 src/RestoreWindow.vala:258 +#: src/SettingsWindow.vala:260 src/SettingsWindow.vala:261 +msgid "Exclude" +msgstr "" + +#: src/RestoreWindow.vala:322 src/SettingsWindow.vala:323 +msgid "Exclude Directory" +msgstr "" + +#: src/RestoreWindow.vala:330 src/SettingsWindow.vala:331 +msgid "Exclude Directory Contents" +msgstr "" + +#: src/RestoreWindow.vala:314 src/SettingsWindow.vala:315 +msgid "Exclude File(s)" +msgstr "" + +#: src/RestoreWindow.vala:616 src/SettingsWindow.vala:688 +msgid "Exclude List" +msgstr "" + +#: src/Main.vala:2056 +msgid "Failed to add cron job" +msgstr "" + +#: src/Main.vala:915 +msgid "Failed to create new snapshot" +msgstr "" + +#: src/Main.vala:1111 +msgid "Failed to create symlinks" +msgstr "" + +#: src/Main.vala:762 +msgid "Failed to delete incomplete snapshot" +msgstr "" + +#: src/Main.vala:1141 +msgid "Failed to delete symlinks" +msgstr "" + +#: src/Main.vala:2184 +msgid "Failed to estimate system size" +msgstr "" + +#: src/Main.vala:1481 +msgid "Failed to find a terminal emulator on this system!" +msgstr "" + +#: src/Main.vala:1757 +msgid "Failed to get partition list." +msgstr "" + +#: src/Main.vala:868 +msgid "Failed to hard-link last snapshot" +msgstr "" + +#: src/Main.vala:1926 +msgid "Failed to kill process" +msgstr "" + +#: src/Main.vala:1863 +msgid "Failed to mount device" +msgstr "" + +#: src/Main.vala:1833 +msgid "Failed to mount unknown partition" +msgstr "" + +#: src/Main.vala:2081 +msgid "Failed to remove cron job" +msgstr "" + +#: src/Main.vala:940 +msgid "Failed to save snapshot" +msgstr "" + +#: src/Main.vala:324 src/Main.vala:331 +msgid "Failed to take snapshot." +msgstr "" + +#: src/Main.vala:1909 src/Main.vala:1937 +msgid "Failed to unmount device" +msgstr "" + +#: src/Main.vala:1954 src/Main.vala:1958 +msgid "Failed to unmount partition!!" +msgstr "" + +#: src/Main.vala:895 +msgid "Failed to update modification date" +msgstr "" + +#: src/RestoreWindow.vala:377 src/SettingsWindow.vala:378 +msgid "File Pattern" +msgstr "" + +#: src/RestoreWindow.vala:617 src/SettingsWindow.vala:689 +msgid "Files matching the following patterns will be excluded" +msgstr "" + +#: src/RestoreWindow.vala:937 +msgid "Files will be overwritten on the target device!" +msgstr "" + +#: src/MainWindow.vala:523 +msgid "First Snapshot" +msgstr "" + +#: src/Main.vala:2130 +msgid "First snapshot needs" +msgstr "" + +#: src/Main.vala:367 +msgid "Following dependencies are missing:" +msgstr "" + +#: src/Main.vala:1057 +msgid "Free space is less than" +msgstr "" + +#: src/Main.vala:859 +msgid "Hard-linking files from previous snapshot..." +msgstr "" + +#: src/RestoreWindow.vala:625 src/SettingsWindow.vala:697 +msgid "" +"Hidden files and folders are included by default since \n" +"they contain user-specific configuration files." +msgstr "" + +#: src/RestoreWindow.vala:624 src/SettingsWindow.vala:696 +msgid "Home Directory" +msgstr "" + +#: src/SettingsWindow.vala:537 src/SettingsWindow.vala:578 +msgid "Hourly" +msgstr "" + +#: src/Main.vala:596 +msgid "Hourly snapshot failed!" +msgstr "" + +#: src/Main.vala:577 +msgid "Hourly snapshots are enabled" +msgstr "" + +#: src/RestoreWindow.vala:938 +msgid "" +"If the restore fails for any reason and you are unable to boot the system, \n" +"please boot from the Ubuntu Live CD and try again." +msgstr "" + +#: src/RestoreWindow.vala:948 +msgid "" +"If these terms are not acceptable to you, please do not proceed beyond this " +"point!" +msgstr "" + +#: src/SettingsWindow.vala:856 +msgid "" +"If you include any specific folders then these folders will get overwritten " +"with previous contents when you restore a snapshot." +msgstr "" + +#: src/RestoreWindow.vala:266 src/RestoreWindow.vala:267 +#: src/SettingsWindow.vala:269 src/SettingsWindow.vala:270 +msgid "Include" +msgstr "" + +#: src/RestoreWindow.vala:350 src/SettingsWindow.vala:351 +msgid "Include Directory" +msgstr "" + +#: src/RestoreWindow.vala:342 src/SettingsWindow.vala:343 +msgid "Include File(s)" +msgstr "" + +#: src/SettingsWindow.vala:533 +msgid "Keep one snapshot per day" +msgstr "" + +#: src/SettingsWindow.vala:538 +msgid "Keep one snapshot per hour" +msgstr "" + +#: src/SettingsWindow.vala:523 +msgid "Keep one snapshot per month" +msgstr "" + +#: src/SettingsWindow.vala:543 +msgid "Keep one snapshot per reboot" +msgstr "" + +#: src/SettingsWindow.vala:528 +msgid "Keep one snapshot per week" +msgstr "" + +#: src/Main.vala:1919 +msgid "Killing all processes using the mount-point..." +msgstr "" + +#: src/RestoreWindow.vala:175 +msgid "Label" +msgstr "" + +#: src/Main.vala:557 +#, c-format +msgid "Last boot snapshot is %d hours old" +msgstr "" + +#: src/Main.vala:552 +msgid "Last boot snapshot is older than system start time" +msgstr "" + +#: src/Main.vala:548 +msgid "Last boot snapshot not found" +msgstr "" + +#: src/Main.vala:621 +#, c-format +msgid "Last daily snapshot is %d hours old" +msgstr "" + +#: src/Main.vala:616 +msgid "Last daily snapshot is more than 1 day old" +msgstr "" + +#: src/Main.vala:612 +msgid "Last daily snapshot not found" +msgstr "" + +#: src/Main.vala:589 +#, c-format +msgid "Last hourly snapshot is %d minutes old" +msgstr "" + +#: src/Main.vala:584 +msgid "Last hourly snapshot is more than 1 hour old" +msgstr "" + +#: src/Main.vala:580 +msgid "Last hourly snapshot not found" +msgstr "" + +#: src/Main.vala:685 +#, c-format +msgid "Last monthly snapshot is %d days old" +msgstr "" + +#: src/Main.vala:680 +msgid "Last monthly snapshot is more than 1 month old" +msgstr "" + +#: src/Main.vala:676 +msgid "Last monthly snapshot not found" +msgstr "" + +#: src/MainWindow.vala:1265 src/MainWindow.vala:1269 src/MainWindow.vala:1273 +msgid "Last snapshot is" +msgstr "" + +#: src/Main.vala:653 +#, c-format +msgid "Last weekly snapshot is %d days old" +msgstr "" + +#: src/Main.vala:648 +msgid "Last weekly snapshot is more than 1 week old" +msgstr "" + +#: src/Main.vala:644 +msgid "Last weekly snapshot not found" +msgstr "" + +#: src/SettingsWindow.vala:214 +msgid "Limit" +msgstr "" + +#: src/MainWindow.vala:176 +msgid "Log" +msgstr "" + +#: src/MainWindow.vala:768 +msgid "Low Disk Space" +msgstr "" + +#: src/Main.vala:976 src/Main.vala:1013 +msgid "Maximum backups exceeded for backup level" +msgstr "" + +#: src/Main.vala:150 +msgid "Missing Dependencies" +msgstr "" + +#: src/SettingsWindow.vala:522 src/SettingsWindow.vala:563 +msgid "Monthly" +msgstr "" + +#: src/Main.vala:673 +msgid "Monthly snapshot are enabled" +msgstr "" + +#: src/Main.vala:692 +msgid "Monthly snapshot failed!" +msgstr "" + +#: src/Main.vala:1868 +msgid "Mounted device" +msgstr "" + +#: src/MainWindow.vala:899 +msgid "Multiple Snapshots Selected" +msgstr "" + +#: src/MainWindow.vala:813 src/MainWindow.vala:895 +msgid "No Snapshots Selected" +msgstr "" + +#: src/Main.vala:1395 +msgid "No changes were made to system" +msgstr "" + +#: src/Main.vala:1484 +msgid "No changes were made to system." +msgstr "" + +#: src/MainWindow.vala:1256 +msgid "No snapshots on device" +msgstr "" + +#: src/Main.vala:705 +msgid "Nothing to do!" +msgstr "" + +#: src/Main.vala:2238 +msgid "Older log files removed" +msgstr "" + +#: src/Main.vala:519 +msgid "On-demand snapshot failed!" +msgstr "" + +#: src/Main.vala:176 +msgid "Please check if you have multiple windows open." +msgstr "" + +#: src/SettingsWindow.vala:855 +msgid "" +"Please do NOT include these folders in your snapshot unless you have a very " +"good reason for doing so." +msgstr "" + +#: src/RestoreWindow.vala:808 +msgid "" +"Please do NOT modify this list unless you have a very good reason for doing " +"so." +msgstr "" + +#: src/Main.vala:1412 +msgid "Please do not interrupt the restore process!" +msgstr "" + +#: src/Main.vala:1482 +msgid "Please install one of the following terminal emulators and try again" +msgstr "" + +#: src/Main.vala:368 +msgid "" +"Please install the packages for the commands \n" +"listed above and try running TimeShift again." +msgstr "" + +#: src/Main.vala:131 +msgid "Please run the application as admin (using 'sudo')" +msgstr "" + +#: src/RestoreWindow.vala:941 +msgid "Please save your work and close all applications." +msgstr "" + +#: src/MainWindow.vala:737 +msgid "Please select a device for saving snapshots." +msgstr "" + +#: src/MainWindow.vala:899 +msgid "Please select a single snapshot" +msgstr "" + +#: src/MainWindow.vala:1021 +msgid "Please select a snapshot to view the log!" +msgstr "" + +#: src/MainWindow.vala:895 +msgid "Please select the snapshot to restore" +msgstr "" + +#: src/MainWindow.vala:813 +msgid "Please select the snapshots to delete" +msgstr "" + +#: src/RestoreWindow.vala:863 +msgid "Please select the target device from the list" +msgstr "" + +#: src/Main.vala:494 +msgid "Please take the first snapshot by running 'sudo timeshift --backup-now'" +msgstr "" + +#: src/Main.vala:172 +msgid "Please wait for a few minutes and try again." +msgstr "" + +#: src/RestoreWindow.vala:206 +msgid "Re-install GRUB2" +msgstr "" + +#: src/RestoreWindow.vala:203 +msgid "Re-install GRUB2 bootloader on the target device (recommended)" +msgstr "" + +#: src/Main.vala:1428 +msgid "Re-installing GRUB2 bootloader..." +msgstr "" + +#: src/Main.vala:1446 +msgid "Rebooting system..." +msgstr "" + +#: src/MainWindow.vala:165 src/MainWindow.vala:233 +msgid "Refresh" +msgstr "" + +#: src/MainWindow.vala:235 +msgid "Refresh Devices" +msgstr "" + +#: src/MainWindow.vala:166 +msgid "Refresh Snapshot List" +msgstr "" + +#: src/RestoreWindow.vala:275 src/SettingsWindow.vala:278 +msgid "Remove" +msgstr "" + +#: src/RestoreWindow.vala:276 src/SettingsWindow.vala:279 +msgid "Remove selected items" +msgstr "" + +#: src/Main.vala:1032 +msgid "Removing backups older than" +msgstr "" + +#: src/Main.vala:1058 +msgid "Removing older backups to free disk space" +msgstr "" + +#: src/MainWindow.vala:821 +msgid "Removing selected snapshots..." +msgstr "" + +#: src/Main.vala:1076 +msgid "Removing un-tagged snapshots..." +msgstr "" + +#: src/RestoreWindow.vala:301 src/SettingsWindow.vala:304 +msgid "Reset" +msgstr "" + +#: src/RestoreWindow.vala:302 src/SettingsWindow.vala:305 +msgid "Reset this list to default state" +msgstr "" + +#: src/MainWindow.vala:124 src/RestoreWindow.vala:79 +#: src/RestoreWindow.vala:411 src/RestoreWindow.vala:412 +msgid "Restore" +msgstr "" + +#: src/MainWindow.vala:966 +msgid "Restore Complete" +msgstr "" + +#: src/MainWindow.vala:969 src/MainWindow.vala:970 +msgid "Restore Failed!" +msgstr "" + +#: src/MainWindow.vala:125 +msgid "Restore Snapshot" +msgstr "" + +#: src/Main.vala:1508 +msgid "Restore completed without errors" +msgstr "" + +#: src/Main.vala:1503 +msgid "Restore failed with exit code" +msgstr "" + +#: src/MainWindow.vala:970 +msgid "Restore was not successful!" +msgstr "" + +#: src/MainWindow.vala:961 +msgid "Restoring snapshot" +msgstr "" + +#: src/SettingsWindow.vala:206 +msgid "Rule" +msgstr "" + +#: src/MainWindow.vala:1233 +msgid "Running from Live CD/USB" +msgstr "" + +#: src/Main.vala:929 +msgid "Saving new snapshot..." +msgstr "" + +#: src/SettingsWindow.vala:109 +msgid "Schedule" +msgstr "" + +#: src/SettingsWindow.vala:123 +msgid "Scheduled Snapshots" +msgstr "" + +#: src/MainWindow.vala:518 +msgid "Scheduled jobs will be enabled only after the first snapshot is taken." +msgstr "" + +#: src/MainWindow.vala:1239 src/MainWindow.vala:1243 +msgid "Scheduled snapshots" +msgstr "" + +#: src/Main.vala:704 +msgid "Scheduled snapshots are disabled" +msgstr "" + +#: src/MainWindow.vala:497 +msgid "Scheduled snapshots will be disabled till another device is selected." +msgstr "" + +#: src/MainWindow.vala:476 src/MainWindow.vala:564 +msgid "Scheduled snapshots will be disabled." +msgstr "" + +#: src/MainWindow.vala:544 +msgid "Scheduled snapshots will be saved to " +msgstr "" + +#: src/MainWindow.vala:1021 +msgid "Select Snapshot" +msgstr "" + +#: src/RestoreWindow.vala:863 +msgid "Select Target Device" +msgstr "" + +#: src/RestoreWindow.vala:772 src/SettingsWindow.vala:818 +msgid "Select directory" +msgstr "" + +#: src/RestoreWindow.vala:755 src/SettingsWindow.vala:801 +msgid "Select file(s)" +msgstr "" + +#: src/MainWindow.vala:496 +msgid "Selected device does not have enough space." +msgstr "" + +#: src/Main.vala:205 +msgid "Session log file" +msgstr "" + +#: src/MainWindow.vala:151 src/MainWindow.vala:152 src/SettingsWindow.vala:84 +msgid "Settings" +msgstr "" + +#: src/RestoreWindow.vala:157 +msgid "Size" +msgstr "" + +#: src/Main.vala:805 src/Main.vala:952 src/Main.vala:979 src/Main.vala:1017 +#: src/Main.vala:1036 src/MainWindow.vala:274 +msgid "Snapshot" +msgstr "" + +#: src/Main.vala:1568 +msgid "Snapshot deleted" +msgstr "" + +#: src/MainWindow.vala:965 src/MainWindow.vala:966 +msgid "Snapshot restored successfully" +msgstr "" + +#: src/Main.vala:948 src/MainWindow.vala:787 +msgid "Snapshot saved successfully" +msgstr "" + +#: src/Main.vala:1336 +msgid "Snapshot to restore not specified!" +msgstr "" + +#: src/MainWindow.vala:874 +msgid "Snapshots deleted successfully" +msgstr "" + +#: src/MainWindow.vala:215 +msgid "Snapshots will be saved in path /timeshift on selected device" +msgstr "" + +#: src/RestoreWindow.vala:397 src/SettingsWindow.vala:398 +msgid "Some locations are excluded by default" +msgstr "" + +#: src/Main.vala:1434 +msgid "Synching file systems..." +msgstr "" + +#: src/Main.vala:901 +msgid "Synching files..." +msgstr "" + +#: src/MainWindow.vala:303 src/RestoreWindow.vala:183 +msgid "System" +msgstr "" + +#: src/MainWindow.vala:1240 +msgid "System snapshots will be taken at regular intervals" +msgstr "" + +#: src/Main.vala:1414 +msgid "System will reboot after files are restored" +msgstr "" + +#: src/RestoreWindow.vala:942 +msgid "System will reboot to complete the restore process." +msgstr "" + +#: src/MainWindow.vala:327 +msgid "Tags" +msgstr "" + +#: src/MainWindow.vala:116 +msgid "Take a manual (ondemand) snapshot" +msgstr "" + +#: src/MainWindow.vala:776 src/MainWindow.vala:943 +msgid "Taking snapshot..." +msgstr "" + +#: src/RestoreWindow.vala:104 +msgid "Target" +msgstr "" + +#: src/RestoreWindow.vala:112 +msgid "Target Device" +msgstr "" + +#: src/MainWindow.vala:563 +msgid "The backup device is not set or unavailable." +msgstr "" + +#: src/RestoreWindow.vala:947 +msgid "" +"This software comes without absolutely NO warranty and the author takes no " +"responsibility for any damage arising from the use of this program." +msgstr "" + +#: src/MainWindow.vala:184 +msgid "TimeShift Logs" +msgstr "" + +#: src/MainWindow.vala:1234 +msgid "TimeShift is running in a live system" +msgstr "" + +#: src/Main.vala:130 +msgid "TimeShift needs admin access to backup and restore system files." +msgstr "" + +#: src/RestoreWindow.vala:811 +msgid "" +"To see which files are included in the snapshot use the 'Browse' button on " +"the main window." +msgstr "" + +#: src/RestoreWindow.vala:148 +msgid "Type" +msgstr "" + +#: src/Main.vala:1562 +msgid "Unable to delete" +msgstr "" + +#: src/Main.vala:1394 src/Main.vala:1395 +msgid "Unable to mount target partition!" +msgstr "" + +#: src/Main.vala:790 +msgid "Unknown snapshot type" +msgstr "" + +#: src/Main.vala:1901 +msgid "Unmounting device" +msgstr "" + +#: src/RestoreWindow.vala:166 +msgid "Used" +msgstr "" + +#: src/Main.vala:1247 +msgid "Using the default exclude-list" +msgstr "" + +#: src/Main.vala:1250 +msgid "Using user-specified exclude-list" +msgstr "" + +#: src/MainWindow.vala:185 +msgid "View TimeShift Logs" +msgstr "" + +#: src/MainWindow.vala:177 +msgid "View rsync log for selected snapshot" +msgstr "" + +#: src/RestoreWindow.vala:936 +msgid "WARNING" +msgstr "" + +#: src/MainWindow.vala:736 +msgid "WARNING:" +msgstr "" + +#: src/RestoreWindow.vala:285 src/RestoreWindow.vala:286 +#: src/SettingsWindow.vala:288 src/SettingsWindow.vala:289 src/Utility.vala:82 +msgid "Warning" +msgstr "" + +#: src/Main.vala:1653 +msgid "Warning: Backup device not set! Defaulting to system device" +msgstr "" + +#: src/Main.vala:401 +msgid "Warning: Deleted invalid lock" +msgstr "" + +#: src/SettingsWindow.vala:527 src/SettingsWindow.vala:568 +msgid "Weekly" +msgstr "" + +#: src/Main.vala:660 +msgid "Weekly snapshot failed!" +msgstr "" + +#: src/Main.vala:641 +msgid "Weekly snapshots are enabled" +msgstr "" + +#: src/SettingsWindow.vala:593 +msgid "When free space less than" +msgstr "" + +#: src/Main.vala:1863 src/Main.vala:1868 +msgid "at" +msgstr "" + +#: src/MainWindow.vala:1265 +msgid "days old" +msgstr "" + +#: src/Main.vala:1032 +msgid "days..." +msgstr "" + +#: src/Main.vala:2113 +msgid "free" +msgstr "" + +#: src/Main.vala:1901 src/Main.vala:1937 +msgid "from" +msgstr "" + +#: src/MainWindow.vala:1269 +msgid "hours old" +msgstr "" + +#: src/MainWindow.vala:1207 +msgid "is needed for first snapshot." +msgstr "" + +#: src/MainWindow.vala:1273 +msgid "mins old" +msgstr "" + +#: src/Main.vala:914 +msgid "rsync returned an error" +msgstr "" + +#: src/MainWindow.vala:542 +msgid "snapshot device changed" +msgstr "" + +#: src/SettingsWindow.vala:563 src/SettingsWindow.vala:568 +#: src/SettingsWindow.vala:573 src/SettingsWindow.vala:578 +#: src/SettingsWindow.vala:583 +msgid "snapshots older than" +msgstr "" + +#: src/Main.vala:1117 +msgid "symlinks updated" +msgstr "" + +#: src/RestoreWindow.vala:444 +msgid "sys" +msgstr "" + +#: src/Main.vala:805 src/Main.vala:952 +msgid "tagged" +msgstr "" + +#: src/Main.vala:979 src/Main.vala:1017 src/Main.vala:1036 +msgid "un-tagged" +msgstr "" + +#: src/Main.vala:1760 +msgid "updated partition list" +msgstr "" + +#: src/Main.vala:1733 +msgid "updated snapshot list" +msgstr "" diff --git a/timeshift.xcf b/timeshift.xcf new file mode 100644 index 0000000..f88a771 Binary files /dev/null and b/timeshift.xcf differ diff --git a/translate b/translate new file mode 100755 index 0000000..52e35ab --- /dev/null +++ b/translate @@ -0,0 +1,4 @@ +msginit -l or_IN -o oriya.po -i timeshift.pot + +echo "Finished" +read dummy diff --git a/upload b/upload new file mode 100755 index 0000000..0dea909 --- /dev/null +++ b/upload @@ -0,0 +1 @@ +dput ppa:teejee2008/ppa ../builds/timeshift*.changes