pax_global_header00006660000000000000000000000064133533356150014521gustar00rootroot0000000000000052 comment=3bdb8ee0fd5b9062cdcba1d38aad2e09d2757bdd zeal-0.6.1/000077500000000000000000000000001335333561500124605ustar00rootroot00000000000000zeal-0.6.1/.gitattributes000066400000000000000000000005011335333561500153470ustar00rootroot00000000000000# Autodetect text files * text=auto # Enforce text mode *.c text *.cmake text *.conf text *.cpp text *.css text *.desktop text *.h text *.html text *.in text *.md text *.pri text *.pro text *.qrc text *.ui text *.yml text CMakeLists.txt text COPYING # Binary files *.icns binary *.ico binary *.png binary *.woff binary zeal-0.6.1/.github/000077500000000000000000000000001335333561500140205ustar00rootroot00000000000000zeal-0.6.1/.github/lock.yml000066400000000000000000000004651335333561500155000ustar00rootroot00000000000000# Configuration for the Lock Threads app - https://probot.github.io/apps/lock/ daysUntilLock: 180 lockComment: > This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for a related request. setLockReason: false only: issues zeal-0.6.1/.gitignore000066400000000000000000000006001335333561500144440ustar00rootroot00000000000000# C++ objects and libs *.slo *.lo *.o *.a *.la *.lai *.so *.dll *.dylib # qmake /.qmake.cache /.qmake.stash *.pro.user *.pro.user.* *.moc moc_*.cpp qrc_*.cpp ui_*.h Makefile* *-build-* # Qt Creator *.autosave # Qt Ctreator QML *.qmlproject.user *.qmlproject.user.* # CMake CMakeLists.txt.user # VS Code /.vscode # Linux appdata /assets/freedesktop/org.zealdocs.Zeal.appdata.xml zeal-0.6.1/.shippable.yml000066400000000000000000000006531335333561500152340ustar00rootroot00000000000000language: c compiler: - gcc build: pre_ci_boot: image_name: drydock/u16cppall image_tag: tip ci: - shippable_retry sudo apt-get -y -qq update - shippable_retry sudo apt-get -y -qq install --no-install-recommends cmake extra-cmake-modules qt5-default libqt5webkit5-dev libqt5x11extras5-dev libarchive-dev libxcb-keysyms1-dev - mkdir build; cd build - cmake .. - cd .. - cmake --build build zeal-0.6.1/CHANGELOG.md000066400000000000000000000001571335333561500142740ustar00rootroot00000000000000# Changelog The version history is available on [GitHub Releases](https://github.com/zealdocs/zeal/releases). zeal-0.6.1/CMakeLists.txt000066400000000000000000000010301335333561500152120ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.5.1) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") project(Zeal VERSION 0.6.1) set(RELEASE_DATE 2018-09-28) # Project information. if(APPLE) set(PROJECT_OUTPUT_NAME "Zeal") else() set(PROJECT_OUTPUT_NAME "zeal") endif() set(PROJECT_COMPANY_NAME "ZealDocs") set(PROJECT_COPYRIGHT "© 2015-2018 Oleg Shparber") set(PROJECT_DESCRIPTION "A simple documentation browser.") set(PROJECT_URL "https://zealdocs.org") set(QT_MINIMUM_VERSION 5.5.1) add_subdirectory(assets) add_subdirectory(src) zeal-0.6.1/COPYING000066400000000000000000000772461335333561500135330ustar00rootroot00000000000000 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. zeal-0.6.1/README.md000066400000000000000000000065171335333561500137500ustar00rootroot00000000000000# Zeal [![Changelog](https://img.shields.io/github/release/zealdocs/zeal.svg?style=flat-square)](https://github.com/zealdocs/zeal/releases) [![Gitter](https://img.shields.io/gitter/room/zealdocs/zeal.svg?style=flat-square)](https://gitter.im/zealdocs/zeal) [![IRC](https://img.shields.io/badge/chat-on%20irc-blue.svg?style=flat-square)](https://kiwiirc.com/client/irc.freenode.net/#zealdocs) [![Telegram Channel](https://img.shields.io/badge/follow-on%20telegram-179cde.svg?style=flat-square)](https://telegram.me/zealdocs) [![Twitter](https://img.shields.io/badge/follow-on%20twitter-1da1f2.svg?style=flat-square)](https://twitter.com/zealdocs) Zeal is a simple offline documentation browser inspired by [Dash](https://kapeli.com/dash). ![Screenshot](https://i.imgur.com/qBkZduS.png) ## Build Status [![Coverity Scan](https://img.shields.io/coverity/scan/4271.svg?style=flat-square)](https://scan.coverity.com/projects/4271) | OS | Build Status | | -------- | ------------ | | Linux | [![Shippable](https://img.shields.io/shippable/54ac2ce4d46935d5fbc19b84/master.svg?style=flat-square)](https://app.shippable.com/projects/54ac2ce4d46935d5fbc19b84) | | Windows | [![AppVeyor](https://img.shields.io/appveyor/ci/trollixx/zeal/master.svg?style=flat-square)](https://ci.appveyor.com/project/trollixx/zeal) | ## Download Get binary builds for Windows and Linux from the [download page](https://zealdocs.org/download.html). ## How to use After installing Zeal, go to *Tools->Docsets*, select the ones you want, and click the *Download* button. ## How to compile ### Required dependencies * [CMake](https://cmake.org/). * [Qt](https://www.qt.io/) version 5.5.1 or above. Required module: Qt WebKit Widgets. * [libarchive](http://libarchive.org/). * [SQLite](https://sqlite.org/). * X11 platforms only: Qt X11 Extras and `xcb-util-keysyms`. ### Building instructions ```sh mkdir build && cd build cmake .. make ``` More detailed instructions are available in the [Wiki](https://github.com/zealdocs/zeal/wiki). ## Query & Filter docsets You can limit the search scope by using ':' to indicate the desired docsets: `java:BaseDAO` You can also search multiple docsets separating them with a comma: `python,django:string` ## Command line If you prefer, you can start Zeal with a query from the command line: `zeal python:pprint` ## Creating your own docsets Follow the [Dash Docset Generation Guide](https://kapeli.com/docsets). ## Contact and Support We want your feedback! Here's a list of different ways to contact developers and request help: * Report bugs and submit feature requests to [GitHub issues](https://github.com/zealdocs/zeal/issues). * Reach developers and other Zeal users on [Gitter](https://gitter.im/zealdocs/zeal), or IRC channel #zealdocs on [Freenode](https://freenode.net/). * Ask any questions in our [Google Group](https://groups.google.com/d/forum/zealdocs). You can simply send an email to zealdocs@googlegroups.com. * Finally, for private communications email us at zeal@zealdocs.org. * And do not forget to follow [@zealdocs](https://twitter.com/zealdocs) on Twitter! ## License This software is licensed under the terms of the GNU General Public License version 3 (GPLv3). Full text of the license is available in the [COPYING](https://github.com/zealdocs/zeal/blob/master/COPYING) file and [online](http://opensource.org/licenses/gpl-3.0.html). zeal-0.6.1/assets/000077500000000000000000000000001335333561500137625ustar00rootroot00000000000000zeal-0.6.1/assets/CMakeLists.txt000066400000000000000000000000361335333561500165210ustar00rootroot00000000000000add_subdirectory(freedesktop) zeal-0.6.1/assets/freedesktop/000077500000000000000000000000001335333561500162755ustar00rootroot00000000000000zeal-0.6.1/assets/freedesktop/128-apps-zeal.png000066400000000000000000000551501335333561500212150ustar00rootroot00000000000000PNG  IHDR>aZ/IDATxweU ~i} UՕi !  ,<=~01c<A&8`1&0I \9pUH}k]]pqqqqqqqqqq_|MN*Gy-ow^~(59'Ҥ01Q(֒R$ҦXr)BjPZc"Z@Nr 1kJˇɉyrf?mq؊v!@kvѣ 1̰MgP* ń,q{2 bF,e hr_Ob>2f]u7 CGN* {C?0Ήŷ΁g/~˯.͓2/]差<'O[s|S~#|wwŗ]?GswU|)?̣unco22GW,_}W_u ?znYq/7Ox[̃r9ǫnMx{?7ξڠF+*fu;_ٖ~_Ox窲59C&S9KL3h]]9 [AUccO3} ^F ?'1(Wa8 yv;Q֡%n^}!&w8Ɵ|m] Go;nf '>|YA9.t=E\8\?z&&Uغx[&]U7/}xӛ~4?&Y6,Zi2:B$2YG!bya,ޓIM視x1;!@N++17FrNʁRD(k)cFW׳#֠8[,FU[ܣLGSFU&n/|C BTe Lc- 2EH9 I.s/ HYE4I>`T¬N awyC{˗[.eoI5M?RU*8gH9c=1%B y흷&o D۵5AR&k֊$,%eJu q$9BA1%'>3(I(IZ"} :%9(9\b{jrl@r(9JV΃ jȠc*M$ő(&S[I`;?H?_x&5zw_)|_xBrk gX5PN4 RJ>=$o>|w޲u"nw, hdrjb>Mm'3>''eQ&O>` 9C# ,f:A)HGJGybxhVc ?QAe!;Rr /e**Q&$RʐC!C@䘆({0#!pa}!zg9?w yo:w]_~am}O~tDΙ埻ʴ9K@դ'N3-?w`%EO }-nu"k (NBΠ!uշ=!f0 ]T9DUUAA` Xn:$ǡG.ʠFöG7*DrE)MΑ`V&瀱NsT =iNENYm ˟$Almp% )sÞü偧xNP;% 7$y>!tnmRRʤ$7hB)¬'Djt]*#H0%bBD][RΘ9+BjLDŽEkR1$5`5 C{0lI\OG3%?$M1"Jr ne,7O|sɘ۱#?kO=c('. FK hYKk4$C$(!E[{n6"R"L\$NLY2$fT*-wwhe PZ?f-~sUW" E.;vPIzO*%RTUO;QhcH>RZoVOyL96$ݮ$yƠDh{1>A>ܻm)"ԣ=?'?  C9xTE]K^,2C7xR4́3/'gI>+3tm%8);,m`Eѵ1L&$uME e5*f|ۓX! ;'¨".:XܾD$amVsm2<*ghnQ1;/5$LmI>Ƒ|Ϫv!n`Y_`'Vr/޵ߚ*_yOB3XS SaĘhFW)uXYmbAЩ 7H$)2ZHa%De" Uq%9hI Rr%*rӖwRFI(C6D$_$m3rޭ62$3+;ta։ۏ-aq$ͯ0Qp' [dWk ۘƱ<'ԇolb!b/'L(p}`-HyE[ p<~43̀2K[$Z\ B\ (QVAuk@kHXtRY#'vd1N\,Cns!ĹG7{tnjRL1fd n*p8DV@.<2ئ"+P4佀dF!T .4  rAQ;.z9}ĭMZBJT ihqcr ;Q4(yO-.?>DUXkh5ʈ&J̐ijK c46?ɰoyivcF g%-v ux){)3O,=eK#9oI>IL4Z.?k]ϊ`t)f |I@ԅB+X9ژZ&0]a W$9-h!ggx(EĮ>FJ( y>ͳ(i*`J1$49gB4}FKCH&ƌ/5"EzR@`JU/ƬAUcƷR- g٢Umw)VG>S7i0ƀQʉwP&e¬[if[b KʎJ mǫ< $ d%DL kY=јfTQ|ҧcMdy|ss|Z+cN:iC@)]эcXl)PڢMK =L>/q૿ >pqf|@<5O?_O~$%Њz"ׯE;߿~g oAʑ3Y|/1*q[%l-@k|~m a[yfx$޶~Wr Ukþ{uAuKǙ6'Hs 'N¯筏ȉ##nR ĮRq$z\gW1#'uɥ~fʡDO?c"^p KITDn! =.RzM^o sRgqxʖNxCBh#b mq€VƢNͤZ#3B $EF):Wˋؓ;Ο׎Ynτ H8YxqFKu%7*#y|>ƂRW?'oϤUҞ@ąK1lԻW8q0rNYq=YF7>0|L!Q,6Zm6@eP1NVovNBc=v:HTNP[8Rt?9G0l,*JZiS[g=d<$TƏEMaE"lrLkcVOu9xBawYvESFZi|~`*WeGJbbEpao[%*N+PcK 8[&!L Vrl4Aǔ3\]Y$GZ>t-_*] eQP9iVwϻq1㩟y)V9%wSerPH"l4qH%އ2l jb b?@cO}x/8@+X 13OCX_[X0D>P׆n>fC)ucc䋧=r^m(J-q;`kG&TZNʼ,n -ʔ~cFi> )1o#xH1aWFp~2 :S 7!$ؒؑŸMTm0VSϗH N*P(R&pn[ #通0\3X.9O%\MC)3O3CH4I{^.L7_ϗV6.#SI#0DZ;b'J2%07n[=L{vS()g9Af:";b)vYLrLmr5Ac|Wyw_9NϣFk=}$lva`L7aōݒf3j% /l)AJ @#§l5zI}>u,kSZaNksR(:S5' ݚ/܌[KPL-$X )4a /,ʐB)c֤Y$[ QAxir X@}fn?B'ɟG<TR(9iLeȹT U`Gj, kiZ) 0IhP4&Hp*tGq>f ~ F]y;XiF1_,P$W'( TUR*0R]xэ!)P"($h!s"^Zd 4q1zBYg',b& TL6UB8H/AՆu9ri AX ‹HPr`Y 03 *BϘ f{vR9Bu:&QX%qDGh أ|-ד7NXW21Apb,nn,X Ppɘ~{H9 1?g4rB줦XV|UeaH] -/y~)1]l'#Oرܸ"U [8@JCB(%h{ 4:'7R2#ٌFWn)QUrZg[]g45 V kBP &TPb7HɅdҠKfj)҇T.l j hJMlxncYn) CQ Ɖשh+y2Z/? u}!9cƇFh~gJxLJ&[me ]nxmϝU:vvIg)C `NJʒi ,TFl%}(AhޅD3e*FYUngϫ?Y`#<3'. A(WXWB}ҙj@UNnؕ{Q$! `F>Ҋ)m+($~\O۶2'ɠj@!T)SC{o}D`me7J5R-B- hWFd!|+ QE a`j0"cj?_Вt21{_\PM(]W tXk UFƔQ^ 78$pQJe[f'~kA31hkWsYl.Y=qe:؇T2{y?%=}o(zĈYmU0kq#;]]B֝GV8VJ:ʌ\T$FSNAYU/ᆿ-mlJŸX5*ZJfYk03Z5[$k!羴9$|_}Oe&xULc22JPkI g5ua(զx+4T GFVIZS9C=ꈮ+ԦJhUoӄn'aUF6Pz15d:(E% }7Oߌ?? )wT"!6ܡ9K" UZKd8q24mV}B9VF[NC$ӄ.6=$^ya膫hΡB nz 6ʒ24Rs/M,=% _E2K}D9_xl 3 8d'Ͳq34wq7}?{>M_l.><>bGV}jsI!㯦 CWR0iP@WF# 1$*:O Cn{)^A3ŅtBFΐ| Bl]%B kE2Pc+zz(~8#>J2n2֯/}G<~Ӵ;o2z{ۑ-)co1N-O׆+g>yh%1*&T!,pk#r?X¬I+OX,G>uUaCu5U^ƽw4^FvZE;C;!QU & :y5\Gx wu/%:_NLeWk28!2 ML ^Bjn.,y'!]Ѝ4~%B5]+6FJ(Zy/ 8"=4%hNpF KVZT<$: q@lhK2ZgHK *r ~:+D ɤfFӌ*L!l~@2~lNym>H:}oQ|! #%}Uk3›_ w4zN>ɤ2 7O_5\'m'Iw7A0 Ƣ+Q7e\cD+ɉ؄ :v; J'Y$ZZa Gh5X|XJR L7#k y/6 Hu$r!@p !den@kVk"3 =mڍ ꧴%9DHNI>aW9ᵄ?Q0.n`r4f yU^ƭU%jѦNCee4Đ=u0f%=n\;6DLѵ(b [(ԉs(6Za ]ĭB0j9Sf>@nivI'/q5!]EB0ҧFdbLԍ %_J!DvC|OAHcRҽ¦4T#-^5zZBD/5xuĘŅ _,m3}dv[H>Qnn&l" )y R2QNHy\I@I*t"SŌJv '{ͅTO&l=# PXDkp5WY B%%ɟ[uҝ"qʙTeks!@QZ]QXf_Φ"S2a4 GZnɬ2n o$NWxJc*LP`j!2)3$&) ru-Զ!Qk슓"b0CtI1Di=L#. %ڂU/x_ k$%TZd3;I8poIޱA) .> 4ϖj`%ZK NIzb嫹G/*}W3!), %A'>@H.'Q6ZԺLr-R"A.w}!+vwcE2exJD38XL-"0\1#aRJ JkV_vnb_pr ("f>P WƹBLĘqEgvbO=rϝFbMV_%: >쟂R[~S,}6hm<~yG?ߒlkm1cʹ!}ig'$ =v4DP`% ' 3rR94;Z[:mG7>~+kwaTq:̊=ì[w@&ܓ`4WSfeX̱iʅ} WW^yqw}9q%'xXoYmHA$UX̩mlmeKFT" ;E'!IY$6F]!c#*aVI@GI"ݤ^At'>8?-}#~#鑤>;7g5qf3CYRqr(8f"4JY1)TN ĺqy&vᬦ/wIЊڄ~",D_x(+K6#>`_kO?S?rg+Z!,"-JbV\:iBe8T%0jUJ8D)mL, No4+5GrV 3iӊ8DXlmcԆEt d\x." %(2VG҈g5 ZK(0RH2U3"tN3HH,RJݻw3OhXfErp*%eWfe i{q90 =_MakER[tI]ؙcVOQ\DA(S)R7PXQ;1 󡨉I{X+7jGȡ j8j!ߺXʈ)SM\|jb$wQ; %"ʴTqDڴ?1Lcx`S.dPJ3jZŞ.Lj{6ӥhtҜ!!7~ŀ[#opǮHZ uiJ+ГUƷM=͡{j{sW~ gO0{AO>ą?y7 3'}{\\_xnދ!S7!gyͯc8߸/0`Jܬ&,r牬2˭)NP0ʅt!3PAL#w2.&79iy3ηĽϷ?%Ra!LV|H`OOq~8Ss? 2T+c峣@3 `ކW"M׉[H*Z XkEw.naD,qUeƜH^H| `f8Eh<`$dfvD d'+~@?,L )ԴO䤤'$O@- DXr݌DsV&zߡuw}JDj#/? MK4մ19`"9kMEb!ROkY/ X/?jM<{*'\ky n a3UeF)USڳ=$ q!qڶ2Ʒ^<ŠuWE\#dUSJYd"T#I6A(}GHcl7iz(ܣֆ;1YnŒW@yYMϷixb C.Bl\L9& 9 U-C][1z~wc=݅JOb6rB-:vaD2D< jK? e1*" R2Ӟ_P5' rAIwrh5hΥ;2f~!2,"n=H(YǸK+bb'- gGD/RR&ؑ+Tk51F]dЖ~ՀxuT!{H LsJ #EY%(niEΙ~&b V_wl_Zx, M^e|81l ATmy뢓c'KPTb"1ۆQ*@h4dR&PzCPݕ$̹:I%#>ʤ ide]_s2&RV"g q)_JzEe; aLdX"D-zj(4t,(EWT/a]]̘vW tt}d/7J9e\"dT}ۧ~*HP&,]/S+M m̱%j!`BjH*9YBDLWb ['b- Tq3մߒjd.v+m-Ŗfb}*K-D!qw5)ʙk ~RIu0E v[%6]RkQ%FDE/hR [%qM cbWџx m4+7nY-ĎrhXciƕpK(c❟<ϟoF6Z&F<Te5zi' nLc4}eR[ODxT5~{Jfst: 4ui^.Nhcm* ]٧dD﨎-v'6bFznfLiE{M-ZMhŨJ⷏{{|wW6N5M]4j9;3|bz|\_$wv2[Nr!D^!{ӚѸ yX1^Ü||>>gu99Jfqڔ7Q5!-K t˲3Af9R(˜(z{>]ZC>d:~^2A Ҁ$.G֔3)QE 9{~J08DpRF q$̽h£L!a' ]=̠Va1Uc!SBgYt 5 BL z APb'B4+E-Jqϼ,|h|ʅ"/bd"(+.QHjÌ$P~"# i+֒|F-l4ɩڲ ٰ ;7t[mvT'(f0E(ńdL];1dEE2DDqWx-QDp9.,e9SUOa }UW[əc6IO杭j TFA Zڍ^j l(+֪<wOD P1d*[ 70=i\]Dd*^\l6z(Ű$h2 e&բ HHB525{ ٬%áh4+6ʐVQ" XY@Naj"V.<;P5F>9ԍG]m0jp˙~]&,܊%,ĕ02VMddEԗ4n$z@ pQ-bV;'xJ8;E]y=QEkHhk*MRi% S5(p dQԖj;ZC+IgZ.+UՉ^T<`u52>H_-졹vM]1_,D ;V( )ƐJ.|$V2}s֑o\m>Ra^󝯺ۯgX h_ %nA:kpVA{ѡ,e܂O?F_Y6r::_(qyYFO&C;P5Ea{z-{ kR"OF2psV8NJFZw|ivDLm/1zCZjTSYo2$)*/1/[O2h+Ҏ<Yf1+e? V+ ]c}?"MqWf(qec"TW"XUGQSrb*VF8~a|Q~ ||g͎QPđh 0mQk7:I#Z|Vgn$E. -%KO}Z.6e~hE#1e\cٖAвJ[# -TjW#PwF1:PeܡV&*M;TaXFQZګ^EUz!;(:W6E4ɪRT1Il~>v`Z[TU"~:RJ g:c)D2iS!Z泎E SX,J,<{rJY1#i֤XB_BN-=nbD9 ;=bfaj*a In6VAWiEvC4miA/I XE?:{Nb!s;i. K9mCXb Oͷ{7C#F]I S|ѳڞ#Jx9:֕X36H 4XB Kv$+iT%KsaaC̲o"`=n$hF20,DU>6mcdAN Ȕ[)e'Ҋz0#MQ IH^md*ɍ, a% U99 M,)e\sP}Đ aX\>B\YJ*#SL.$BrN/jݙ,zYhVZUVaFf>eh÷fjmPe=bÖZ7'( K)=.8@ c峖?-mVX{㷾E|!r]e"rI"Ϧ^4X4] 2Z1 7uz6dX7yñT-Aw^WtѰ7N:W<Ú-o9o8jvfaξmΞ7N{x`vނtp0ߠ{:%eV ޸2ǃM$~C}sau]ۖ;J+hzx/06q%`B/+W{>jDyE^xW`yMEo=}o;(15>nV05Tc!DOkNwqa&ApitPD"ݱǨei=Ns~ةMΞo)\n&|{ѣ)wi5 ]㾓o"9%)Ⱥjvdejmo=ۦ]Rؚj7-DzQ-'sŬ8>YOA `aҷ֔=.Q/g<:RjB^vvv"e)[,oeD1l} nz] Iȥۋl.^jf-oww8qhÕ4ƪsVZͮ{Y۵'NdscD#//X'uBXSR9KeYK{*YVKŘ34AiOsS'O|7i /ï2el/+H!cxɯqVӶ7x##.x<[ػw/uSSU5a<S7 .@Kj.ϳ#P.R@ \;{ pE_biI/dz.4r@*w>)ˮ?c"X, COӌ軁hێ~nXz%LBHM[_}yEӌL&L5u^= SNX 2焈 {.rP"e+<ع/`;! 4wC& 8ZcA e7#(cǎ1 (~t++1NǸ9c.](Wzy%c<+gt/u)ΪXڹY1O伌-v~>/R߹sHtmO-hùJΧWL_q''eʼoo:d2eeedJ4"a)Bp<'>DP9Ky~n^ CiS\JI$FpIK){>Eʽ+2PH9'C &TvX]'Sٳ嬯30iF#r#.qF)W%42\aA/S/(/˄1+@v~𬿿郞g.sESbѶ8k\E۶4MmE]W]'e_R8&HxPy)v`?U{1}=Fcf* '"J.y^:l;/pe >` s e \ 21c 1Fs /.PK5]{ܹzСCr篬0*gsכr_k39@NHeSL0t=uSc IB^|1Kt/ 8r9dn W2Uq"x?ksBU@]עӬ4M0ϤeRݔfݬvŖr|ُҳ]1q}]dzwIZZe#XJEL =US~ǝ]rw]GF Ѳϸ*7OgOei5ɴbg馛v#C/7bU0,3< 92 $h? !X]^ |. WҶ;\2z<)qwivM*OG_8t0Ǐ[~?mw>}#rchJຨƺѲsӄ?=nVZ(Vsqsn8|8?~L_ =yɘkH FD1`dnbBOsO=Ι_1YwՌcA `ᄑo6779rs!3ĈI 9q;5ajFC<3,>|[{EGyロ7|2yO AVgO7"rUXޛ(x껞{penV6%ϧgD.%~ʏq ,z$Dvؓ#pJMQLfd֬}゚ xK6n~^U8x=++<#9} |RkSiDvV)VTJQK_3^guuh91zo~zD|wo/h3N9[[p:<`DFM#F+q1q9~vwͯ%zW( bSUӕV+TUp(\WlPM] @+:6.lqng6{~zkq/wƣM5p՞@򃭭<|ߥ=wlCW>W[Ak|ew};څqp\n9_g?' sqq)(IENDB`zeal-0.6.1/assets/freedesktop/16-apps-zeal.png000066400000000000000000000015501335333561500211240ustar00rootroot00000000000000PNG  IHDR(-S|PLTE&&&uSAiLjHjIjHjIlIxWrQ94+hFwfIrbFvspfa\?.ʬq//////--./2!1-&c=f9h:gd9b6a4b4)$";52UA_6ܐvǼஞఢ⸬㵥_7[1[/[/!2.&V2[2`9eCkMӈsؕb?\5X/X,W+png1,&2.'T1X0^9dEޮsWcC]9[5Y1T+R(zws4/'Q>W4sXޮhNcG`A]?{alNP*M#sqkA84O/jLĻ⽲ڣՒ҈u҈tՑ~⼱V4K%Hvrn"+'!I)M(O/R3W9eK҅pԎ|זbFM,G I!pnhG2@AC!E%I*M.N0I)B >Q*)% <93L1EE F H#I%I$H%G"N'O@kh`?:3=70MFQJUNWQZRYRSLQLID=HC<~FA;WSL454STUķrtRNSβ/v+>JIDATcd`3aedf0cO_ * OK T$%7;x_-gL;wF(DJ&D*3Eƕ=^Yh!X=%NmZ"H2Wa2~DQoF՞8=27ȍ"@[Y[}N<|F\ؿ+_yKޘ?E1W~P7Uu3bi64xի|eَ vУ{µ?oPV YZѸmU]eMPV;~OY﫛^12EV5S) 7U6Nl?m/e`'4BRfB& >WnC1yq\x?iR*U-SgԽۆwT5QQ;D\Ĉi'}|ލKSwe jX?rcO}5C~=h}R7jn6[v!|ǽO~U32,Gln_D]-M/k -}{X.i:뻷U~/+Q )jUu!f4(-Mn]@UR\BH(H5SAJgPZؚjS IA?A@EH& @i!":|H4֓wC_H~H?x?![ܹΎzlˇ>i:m[UJ!@Jz٬>j> -:w:e26txjNSQ)k`_ul6-t}x| 4Z럽p DهD ~uIIENDB`zeal-0.6.1/assets/freedesktop/32-apps-zeal.png000066400000000000000000000033371335333561500211270ustar00rootroot00000000000000PNG  IHDR szzIDATXÝM\Gofvgwvm L8 (>$DHȑS!8Y EB. !@B/l뵽ޝ7m9yZ}?5O 2UHBG@@C+=fא݃1`/9N`޽a/ӤHC;Qf<Z@u1biDwK³gwϮfܺɆU>P+U揝Ȕmvvb 3>Fp'Y{Y+y0ENROfwiDt`-KT`D#Tk畷&/Գז9{(Q$D63*?XS&"} s}O>/~/pWU`e+KVb$ )! c],4RdB瘚ՕUvNxej/Z"Zx,,EX(e}6j!^PMU 9m;%ejI^'q sk bƸ1Fiʠ?dߣv%B.̰ݻm2jl67$\s.""t@$42Ժu4(ggGĩj{=VkfD$Ɍ&.%1Y >Z$ EU !>j8 KSa0TLJ1Ḽ0MvP)cN2:Z!/=OڭU С79l"ZuLdJrew#?]v!p}W/xppvt ?=pYV'z x`/0^@#z?Z9t)0q=_?Qr2|e(g}1InIENDB`zeal-0.6.1/assets/freedesktop/64-apps-zeal.png000066400000000000000000000134431335333561500211330ustar00rootroot00000000000000PNG  IHDR@@iqIDATx{eWuks=33 Hh$"$$^i vpى1ʳrIJSNI9 eJ8ı)0{EzZo!1oLwϻ_q+}ν3D* N߹}Z{o}\?d5o{]z'ZΜ?̞m uh9nnrz'3Ӂ{k 53[8S4oʼn @#1@b^DA E`_I!spԜz Bc1B "ޡ (瓳i~qE6?,<9Id}0%1&FEE>m" nv/8DTCBD"(R`+8!Z$Y==J]rًYJbs""u3(hZK`Ƨϫ*x!ĀFE@ ;ĥtqr$lA@]:)M5/E@P=y [;XDJU\ׂM[v@ H-JrdFED 3{4(ͭG ,)Nϒ:aNJIqJPb煯8ge[zI٢bC@y/m%gh(F8Nulz/оZj&O͐9 ݣ #)A{/}5r˟"?}P(Āy$jI?k*×x[./uFkٱ28H0Jx_孆HԊBPZ_aهm rg)OX1/ d]@#ۻv\k ?Yza Xa2O!`zaB 8DG?uȲ5xv{/.yw-8nf+W bP4#h 1aS"|O}bq^#``拟H9-9B(Eė'0:iĢ5]B?-33+@3SfUd\hg RT#CN-őޘYIcUZ;/g>Bk߼'LJRzaIO*RMW)IRDА%oOe8['E`<1bN-Y97&Gƨ8.Vv@%../ٛl?Șj]e/+>4G;IP/P+꼔M>;wNw6׏\Uc:N"ZYI{GwE޿Vr0ZK(i %,/r~[P#$T|=qFIo@sE2BcvY\bt.7ӄ\)G%ְ_c{X|A6bg 4QҪ)aÓr6-/7'IR~!V퀲*+_b!'W@EԻpFw1}7=J#C*-!^8pbgB(#hNo[HX5P2n@,~&ƘgeyCχZbVzr5*-)MJ&=}{1(踥ˎ&h/U2u*AIr3?|Ĩl1F韽i`y3~/Lq.a2eWlzǻ9? *mb<U!눀s : tbw5 Q&N L66/r񩝭5Nr1V4Fsxb5WFHYo1zf?TOcZʕ=/޶&Vn>zukֱ5t;Y;Bˢc4Q#"ç͉]WGh^r^uyDOiDn@+ɉ%<2c 78»ɼC;/;4o}"zDܡ:vkF'x,mnngvJI,xq0JZ~6;`3 Л=FyC2"5wѫs~K J%^8!WNྕ13l0N{I{@gݽm4l,MԹMeg'֦3WkPߴ׼ўo (cW` wp/U漅p39{3WmP j=!y<(U04tZ1'طH*өAsT%[Qk&P6NOl1"VDNLZZCe+MT:I vewl G"%ciTP*GENZg{ϛۑȼljK@4沷/h131̴ # 䡢ض]F%oi.1KBmxO-Oq]>)1Qߟ zjmo%I'r$ef$ [r[KԚ( ʾ.e$QmYLU+^2Q#nju) L0r4pl Z,U|ϗ$Z]#W˰MLMcǠ6N |r5&QP9c\9 ǞS/f}$ Q2k.T᭭b IK-1#e řdvi|b|Ct,Av[y! .)u[]<үo3uk(9?g8xﵻilJw(MϞď#>;{mtgҘF,r<:ڲi\I;{Ʀ-NR_WoН9BcVshlފ9qylzќ\ox,Ι.HtBS| #1MBTyAף:8b"Pr>#eZ6;vd͚5l6jdYFexoK("r:UйHt#9" .RjBee,el5vfڵGFn\u|byst^\jR4Zٖ!XcgR'ᅲ[~={7,U'c9 H(R;< " 5rQ!}Ucot[|]h4젴O`f.Xi. UU]Plӈ:RGe5z@R"v>/-9r|w~?F {̛r P*}mXϯYQ33'ȋV|hRyxQj:##0K!|Qxxq11D}?ѹ#Lm^Oq_9:s_1?FVq!:eߺm!#dx׃^{W})iwx-XvX?Mvٗ,[[^2+~Tɫpq@r@~z+ /W߽ce_0q5+5a0ځ7F;IENDB`zeal-0.6.1/assets/freedesktop/CMakeLists.txt000066400000000000000000000015011335333561500210320ustar00rootroot00000000000000if(UNIX AND NOT APPLE) find_package(ECM 1.0.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(ECMInstallIcons) include(KDEInstallDirs) ecm_install_icons(ICONS "16-apps-zeal.png" "24-apps-zeal.png" "32-apps-zeal.png" "64-apps-zeal.png" "128-apps-zeal.png" DESTINATION ${KDE_INSTALL_ICONDIR} ) configure_file( org.zealdocs.Zeal.appdata.xml.in org.zealdocs.Zeal.appdata.xml ) install(FILES ${CMAKE_BINARY_DIR}/assets/freedesktop/org.zealdocs.Zeal.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR} ) install(FILES "org.zealdocs.Zeal.desktop" DESTINATION ${KDE_INSTALL_APPDIR} ) endif() zeal-0.6.1/assets/freedesktop/org.zealdocs.Zeal.appdata.xml.in000066400000000000000000000053771335333561500243350ustar00rootroot00000000000000 org.zealdocs.Zeal.desktop Zeal CC0-1.0 GPL-3.0-only Documentation browser

Zeal is a simple offline documentation browser inspired by Dash.

https://zealdocs.org/ https://github.com/zealdocs/zeal/issues https://zealdocs.org/usage.html https://i.imgur.com/qBkZduS.png zeal.desktop zeal@zealdocs.org none none none none none none none none none none none none none none none none none none none none none none none none none none none
zeal-0.6.1/assets/freedesktop/org.zealdocs.Zeal.desktop000066400000000000000000000003751335333561500231610ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=Zeal GenericName=Documentation Browser Comment=Simple API documentation browser Exec=zeal %u Icon=zeal Terminal=false Type=Application Categories=Development; MimeType=x-scheme-handler/dash;x-scheme-handler/dash-plugin; zeal-0.6.1/cmake/000077500000000000000000000000001335333561500135405ustar00rootroot00000000000000zeal-0.6.1/cmake/FindSQLite.cmake000066400000000000000000000030431335333561500165040ustar00rootroot00000000000000# FindSQLite # ---------- # # Finds SQLite headers and libraries. # # SQLite_FOUND - True if SQLite is found. # SQLite_INCLUDE_DIR - Path to SQLite header files. # SQLite_LIBRARY - SQLite library to link to. # SQLite_VERSION_STRING - The version of SQLite found. # A simple fallback to pkg-config. if(NOT WIN32) find_package(PkgConfig QUIET) pkg_search_module(PC_SQLITE QUIET sqlite3) endif() find_path(SQLite_INCLUDE_DIR NAMES sqlite3.h PATHS ${PC_SQLITE_INCLUDEDIR} ${PC_SQLITE_INCLUDE_DIRS} ) find_library(SQLite_LIBRARY NAMES sqlite3 PATHS ${PC_SQLITE_LIBDIR} ${PC_SQLITE_LIBRARY_DIRS} ) if(PC_SQLITE_VERSION) set(SQLite_VERSION_STRING ${PC_SQLITE_VERSION}) elseif(SQLite_INCLUDE_DIR AND EXISTS "${SQLite_INCLUDE_DIR}/sqlite3.h") # Parse sqlite3.h for the version macro: # #define SQLITE_VERSION "3.20.1" set(_SQLite_VERSION_REGEX "^#define[ \t]+SQLITE_VERSION[ \t]+\"([0-9]+)\\.([0-9]+)\\.([0-9]+)\".*$") file(STRINGS "${SQLite_INCLUDE_DIR}/sqlite3.h" _SQLite_VERSION_MACRO LIMIT_COUNT 1 REGEX "${_SQLite_VERSION_REGEX}") if(_SQLite_VERSION_MACRO) string(REGEX REPLACE "${_SQLite_VERSION_REGEX}" "\\1.\\2.\\3" SQLite_VERSION_STRING "${_SQLite_VERSION_MACRO}") endif() unset(_SQLite_VERSION_MACRO) unset(_SQLite_VERSION_REGEX) endif() include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(SQLite REQUIRED_VARS SQLite_LIBRARY SQLite_INCLUDE_DIR VERSION_VAR SQLite_VERSION_STRING ) mark_as_advanced(SQLite_INCLUDE_DIR SQLite_LIBRARY) zeal-0.6.1/cmake/MacOSXBundleInfo.plist.in000066400000000000000000000024611335333561500202650ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${MACOSX_BUNDLE_EXECUTABLE_NAME} CFBundleIconFile ${MACOSX_BUNDLE_ICON_FILE} CFBundleIdentifier ${MACOSX_BUNDLE_GUI_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleName ${MACOSX_BUNDLE_BUNDLE_NAME} CFBundlePackageType APPL CFBundleShortVersionString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleSignature ???? CFBundleVersion ${MACOSX_BUNDLE_BUNDLE_VERSION} CSResourcesFileMapped NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} NSPrincipalClass NSApplication NSHighResolutionCapable zeal-0.6.1/src/000077500000000000000000000000001335333561500132475ustar00rootroot00000000000000zeal-0.6.1/src/CMakeLists.txt000066400000000000000000000013351335333561500160110ustar00rootroot00000000000000# Only C++11 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Find includes in corresponding build directories. set(CMAKE_INCLUDE_CURRENT_DIR ON) ## Build options option(ZEAL_PORTABLE_BUILD "Build portable version") if(ZEAL_PORTABLE_BUILD) add_definitions(-DPORTABLE_BUILD) endif() ## Macro add_definitions(-DZEAL_VERSION="${Zeal_VERSION}") # QString options add_definitions(-DQT_USE_QSTRINGBUILDER) add_definitions(-DQT_RESTRICTED_CAST_FROM_ASCII) add_definitions(-DQT_NO_CAST_TO_ASCII) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) ## Handle moc, uic, and rcc files. set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) include_directories(libs) add_subdirectory(libs) add_subdirectory(app) zeal-0.6.1/src/app/000077500000000000000000000000001335333561500140275ustar00rootroot00000000000000zeal-0.6.1/src/app/CMakeLists.txt000066400000000000000000000031761335333561500165760ustar00rootroot00000000000000# TODO: Move zeal.qrc one level up to rely on CMAKE_AUTORCC. find_package(Qt5Core REQUIRED) qt5_add_resources(App_RESOURCES resources/zeal.qrc) # Silence CMP0071. set_property(SOURCE qrc_zeal.cpp PROPERTY SKIP_AUTOGEN ON) if(APPLE) list(APPEND App_RESOURCES resources/zeal.icns) elseif(WIN32) configure_file(versioninfo.rc.in ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc) list(APPEND App_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc) endif() add_executable(App WIN32 main.cpp ${App_RESOURCES} ) target_link_libraries(App Core Util) find_package(Qt5 COMPONENTS Widgets REQUIRED) if (Qt5Widgets_VERSION VERSION_LESS QT_MINIMUM_VERSION) message(FATAL_ERROR "Qt version >= ${QT_MINIMUM_VERSION} is required.") endif() target_link_libraries(App Qt5::Widgets) set_target_properties(App PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME} RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) if(APPLE) set_target_properties(App PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME} MACOSX_BUNDLE_GUI_IDENTIFIER "org.zealdocs.zeal" MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" MACOSX_BUNDLE_ICON_FILE "zeal.icns" MACOSX_BUNDLE_COPYRIGHT ${PROJECT_COPYRIGHT} RESOURCE "resources/zeal.icns" ) elseif(UNIX) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_KDE_MODULE_DIR}) include(KDEInstallDirs) install(TARGETS App DESTINATION ${KDE_INSTALL_BINDIR}) endif() zeal-0.6.1/src/app/main.cpp000066400000000000000000000210541335333561500154610ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include #include #endif #include using namespace Zeal; struct CommandLineParameters { bool force; bool preventActivation; Registry::SearchQuery query; #ifdef Q_OS_WIN32 bool registerProtocolHandlers; bool unregisterProtocolHandlers; #endif }; QString stripParameterUrl(const QString &url, const QString &scheme) { QStringRef ref = url.midRef(scheme.length() + 1); if (ref.startsWith(QLatin1String("//"))) ref = ref.mid(2); if (ref.endsWith(QLatin1Char('/'))) ref = ref.left(ref.length() - 1); return ref.toString(); } CommandLineParameters parseCommandLine(const QStringList &arguments) { QCommandLineParser parser; parser.setApplicationDescription(QObject::tr("Zeal - Offline documentation browser.")); parser.addHelpOption(); parser.addVersionOption(); parser.addOption({{QStringLiteral("f"), QStringLiteral("force")}, QObject::tr("Force the application run.")}); #ifdef Q_OS_WIN32 parser.addOption(QCommandLineOption({QStringLiteral("register")}, QObject::tr("Register protocol handlers"))); parser.addOption(QCommandLineOption({QStringLiteral("unregister")}, QObject::tr("Unregister protocol handlers"))); #endif parser.addPositionalArgument(QStringLiteral("url"), QObject::tr("dash[-plugin]:// URL")); parser.process(arguments); CommandLineParameters clParams; clParams.force = parser.isSet(QStringLiteral("force")); clParams.preventActivation = false; #ifdef Q_OS_WIN32 clParams.registerProtocolHandlers = parser.isSet(QStringLiteral("register")); clParams.unregisterProtocolHandlers = parser.isSet(QStringLiteral("unregister")); if (clParams.registerProtocolHandlers && clParams.unregisterProtocolHandlers) { QTextStream(stderr) << QObject::tr("Parameter conflict: --register and --unregister.\n"); ::exit(EXIT_FAILURE); } #endif // TODO: Support dash-feed:// protocol const QString arg = QUrl::fromPercentEncoding(parser.positionalArguments().value(0).toUtf8()); if (arg.startsWith(QLatin1String("dash:"))) { clParams.query.setQuery(stripParameterUrl(arg, QStringLiteral("dash"))); } else if (arg.startsWith(QLatin1String("dash-plugin:"))) { const QUrlQuery urlQuery(stripParameterUrl(arg, QStringLiteral("dash-plugin"))); const QString keys = urlQuery.queryItemValue(QStringLiteral("keys")); if (!keys.isEmpty()) clParams.query.setKeywords(keys.split(QLatin1Char(','))); clParams.query.setQuery(urlQuery.queryItemValue(QStringLiteral("query"))); const QString preventActivation = urlQuery.queryItemValue(QStringLiteral("prevent_activation")); clParams.preventActivation = preventActivation == QLatin1String("true"); } else { clParams.query.setQuery(arg); } return clParams; } #ifdef Q_OS_WIN32 void registerProtocolHandler(const QString &scheme, const QString &description) { const QString appPath = QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); const QString regPath = QStringLiteral("HKEY_CURRENT_USER\\Software\\Classes\\") + scheme; QScopedPointer reg(new QSettings(regPath, QSettings::NativeFormat)); reg->setValue(QStringLiteral("Default"), description); reg->setValue(QStringLiteral("URL Protocol"), QString()); reg->beginGroup(QStringLiteral("DefaultIcon")); reg->setValue(QStringLiteral("Default"), QString("%1,1").arg(appPath)); reg->endGroup(); reg->beginGroup(QStringLiteral("shell")); reg->beginGroup(QStringLiteral("open")); reg->beginGroup(QStringLiteral("command")); reg->setValue(QStringLiteral("Default"), QVariant(appPath + QLatin1String(" %1"))); } void registerProtocolHandlers(const QHash &protocols, bool force = false) { const QString regPath = QStringLiteral("HKEY_CURRENT_USER\\Software\\Classes"); QScopedPointer reg(new QSettings(regPath, QSettings::NativeFormat)); const QStringList groups = reg->childGroups(); for (auto it = protocols.cbegin(); it != protocols.cend(); ++it) { if (force || !groups.contains(it.key())) registerProtocolHandler(it.key(), it.value()); } } void unregisterProtocolHandlers(const QHash &protocols) { const QString regPath = QStringLiteral("HKEY_CURRENT_USER\\Software\\Classes"); QScopedPointer reg(new QSettings(regPath, QSettings::NativeFormat)); for (auto it = protocols.cbegin(); it != protocols.cend(); ++it) reg->remove(it.key()); } #endif int main(int argc, char *argv[]) { // Do not allow Qt version lower than the app was compiled with. QT_REQUIRE_VERSION(argc, argv, QT_VERSION_STR); QCoreApplication::setApplicationName(QStringLiteral("Zeal")); QCoreApplication::setApplicationVersion(ZEAL_VERSION); QCoreApplication::setOrganizationDomain(QStringLiteral("zealdocs.org")); QCoreApplication::setOrganizationName(QStringLiteral("Zeal")); #if QT_VERSION >= 0x050600 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QScopedPointer qapp(new QApplication(argc, argv)); const CommandLineParameters clParams = parseCommandLine(qapp->arguments()); #ifdef Q_OS_WIN32 const static QHash protocols = { {QStringLiteral("dash"), QStringLiteral("Dash Protocol")}, {QStringLiteral("dash-plugin"), QStringLiteral("Dash Plugin Protocol")} }; if (clParams.unregisterProtocolHandlers) { unregisterProtocolHandlers(protocols); return EXIT_SUCCESS; } else { registerProtocolHandlers(protocols, clParams.registerProtocolHandlers); if (clParams.registerProtocolHandlers) return EXIT_SUCCESS; } #endif QScopedPointer appSingleton(new Core::ApplicationSingleton()); if (appSingleton->isSecondary()) { #ifdef Q_OS_WIN32 ::AllowSetForegroundWindow(appSingleton->primaryPid()); #endif QByteArray ba; QDataStream out(&ba, QIODevice::WriteOnly); out << clParams.query << clParams.preventActivation; // TODO: Check for a possible error. appSingleton->sendMessage(ba); return EXIT_SUCCESS; } // Set application-wide window icon. All message boxes and other windows will use it by default. qapp->setWindowIcon(QIcon::fromTheme(QStringLiteral("zeal"), QIcon(QStringLiteral(":/zeal.ico")))); QDir::setSearchPaths(QStringLiteral("typeIcon"), {QStringLiteral(":/icons/type")}); QScopedPointer app(new Core::Application()); QObject::connect(appSingleton.data(), &Core::ApplicationSingleton::messageReceived, [&app](const QByteArray &data) { Registry::SearchQuery query; bool preventActivation; QDataStream in(data); in >> query >> preventActivation; app->executeQuery(query, preventActivation); }); if (!clParams.query.isEmpty()) { QTimer::singleShot(0, [&app, clParams] { app->executeQuery(clParams.query, clParams.preventActivation); }); } return qapp->exec(); } zeal-0.6.1/src/app/resources/000077500000000000000000000000001335333561500160415ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/browser/000077500000000000000000000000001335333561500175245ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/browser/assets/000077500000000000000000000000001335333561500210265ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/browser/assets/css/000077500000000000000000000000001335333561500216165ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/browser/assets/css/darkmode.css000066400000000000000000000005401335333561500241150ustar00rootroot00000000000000/* Dark mode (see #466). */ /* TODO: Check if we need -webkit-filter for old Qt WebKit. */ html { -webkit-filter: invert() hue-rotate(180deg) contrast(70%); filter: invert() hue-rotate(180deg) contrast(70%); } html img { -webkit-filter: invert() hue-rotate(180deg) contrast(120%); filter: invert() hue-rotate(180deg) contrast(120%); } zeal-0.6.1/src/app/resources/browser/assets/css/fa-brands.min.css000066400000000000000000000011451335333561500247500ustar00rootroot00000000000000/*! * Font Awesome Free 5.0.4 by @fontawesome - http://fontawesome.com * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands} zeal-0.6.1/src/app/resources/browser/assets/css/fa-solid.min.css000066400000000000000000000011571335333561500246140ustar00rootroot00000000000000/*! * Font Awesome Free 5.0.4 by @fontawesome - http://fontawesome.com * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900} zeal-0.6.1/src/app/resources/browser/assets/css/fontawesome.min.css000066400000000000000000000774171335333561500254610ustar00rootroot00000000000000/*! * Font Awesome Free 5.0.4 by @fontawesome - http://fontawesome.com * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dot-circle:before{content:"\f192"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-print:before{content:"\f02f"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-table:before{content:"\f0ce"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}zeal-0.6.1/src/app/resources/browser/assets/css/highlight.css000066400000000000000000000004111335333561500242730ustar00rootroot00000000000000/* Highlight on navigation to an anchor. */ @-webkit-keyframes targetNavigatedAnimation { from { background: #ffffff; } 50% { background: #ffff00; } to { background: #ffffff; } } *:target { -webkit-animation: targetNavigatedAnimation .5s linear; } zeal-0.6.1/src/app/resources/browser/assets/css/welcome.min.css000066400000000000000000003134351335333561500245560ustar00rootroot00000000000000/*! Style for Zeal's built-in welcome page. Based on Bulma. *//*! bulma.io v0.6.2 | MIT License | github.com/jgthms/bulma */@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}/*! minireset.css v0.0.2 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*{box-sizing:inherit}:after,:before{box-sizing:inherit}audio,embed,img,object,video{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0;text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1rem;font-weight:400;line-height:1.5}a{color:#469;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#ff3860;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#dbdbdb;border:none;display:block;height:1px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{text-align:left;vertical-align:top}table th{color:#363636}.is-clearfix:after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-clipped{overflow:hidden!important}.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:-1px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:0px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:-1px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:-1px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:0px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:0px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}.has-text-justified{text-align:justify!important}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:-1px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:-1px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:0px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:0px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}.has-text-left{text-align:left!important}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:-1px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:-1px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:0px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:0px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:-1px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:-1px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:0px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:0px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-text-primary{color:#469!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#344e76!important}.has-text-link{color:#469!important}a.has-text-link:focus,a.has-text-link:hover{color:#344e76!important}.has-text-info{color:#209cee!important}a.has-text-info:focus,a.has-text-info:hover{color:#0f81cc!important}.has-text-success{color:#23d160!important}a.has-text-success:focus,a.has-text-success:hover{color:#1ca64c!important}.has-text-warning{color:#ffdd57!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd324!important}.has-text-danger{color:#ff3860!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ff0537!important}.has-text-black-bis{color:#121212!important}.has-text-black-ter{color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:-1px){.is-block-touch{display:block!important}}@media screen and (min-width:0px){.is-block-desktop{display:block!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:-1px){.is-flex-touch{display:flex!important}}@media screen and (min-width:0px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:-1px){.is-inline-touch{display:inline!important}}@media screen and (min-width:0px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:-1px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:0px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:-1px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:0px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:-1px){.is-hidden-touch{display:none!important}}@media screen and (min-width:0px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:-1px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:-1px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:0px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:0px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.box{background-color:#fff;border-radius:5px;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;display:block;padding:1.25rem}.box:not(:last-child){margin-bottom:1.5rem}a.box:focus,a.box:hover{box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px #469}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #469}.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:3px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border-color:#dbdbdb;color:#363636;cursor:pointer;justify-content:center;padding-left:.75em;padding-right:.75em;text-align:center;white-space:nowrap}.button.is-active,.button.is-focused,.button:active,.button:focus{outline:0}.button[disabled]{cursor:not-allowed}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.375em - 1px);margin-right:.1875em}.button .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:calc(-.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.375em - 1px);margin-right:calc(-.375em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#469;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(68,102,153,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled]{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled]{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled]{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading:after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled]{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading:after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:#363636}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:#363636}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled]{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover{background-color:#292929}.button.is-light.is-inverted[disabled]{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading:after{border-color:transparent transparent #363636 #363636!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading:after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled]{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled]{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading:after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading:after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined[disabled]{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary{background-color:#469;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#406090;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(68,102,153,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#3c5a87;border-color:transparent;color:#fff}.button.is-primary[disabled]{background-color:#469;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#469}.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#469}.button.is-primary.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#469;color:#469}.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#469;border-color:#469;color:#fff}.button.is-primary.is-outlined.is-loading:after{border-color:transparent transparent #469 #469!important}.button.is-primary.is-outlined[disabled]{background-color:transparent;border-color:#469;box-shadow:none;color:#469}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#469}.button.is-primary.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#469;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#406090;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(68,102,153,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3c5a87;border-color:transparent;color:#fff}.button.is-link[disabled]{background-color:#469;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#469}.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#469}.button.is-link.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#469;color:#469}.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#469;border-color:#469;color:#fff}.button.is-link.is-outlined.is-loading:after{border-color:transparent transparent #469 #469!important}.button.is-link.is-outlined[disabled]{background-color:transparent;border-color:#469;box-shadow:none;color:#469}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#469}.button.is-link.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#1496ed;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#118fe4;border-color:transparent;color:#fff}.button.is-info[disabled]{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading:after{border-color:transparent transparent #209cee #209cee!important}.button.is-info.is-outlined[disabled]{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#23d160;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#22c65b;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#20bc56;border-color:transparent;color:#fff}.button.is-success[disabled]{background-color:#23d160;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#23d160}.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#23d160}.button.is-success.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#23d160;color:#23d160}.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#23d160;border-color:#23d160;color:#fff}.button.is-success.is-outlined.is-loading:after{border-color:transparent transparent #23d160 #23d160!important}.button.is-success.is-outlined[disabled]{background-color:transparent;border-color:#23d160;box-shadow:none;color:#23d160}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#23d160}.button.is-success.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled]{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled]{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading:after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading:after{border-color:transparent transparent #ffdd57 #ffdd57!important}.button.is-warning.is-outlined[disabled]{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-danger{background-color:#ff3860;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#ff2b56;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ff1f4b;border-color:transparent;color:#fff}.button.is-danger[disabled]{background-color:#ff3860;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#ff3860}.button.is-danger.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#ff3860;color:#ff3860}.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#ff3860;border-color:#ff3860;color:#fff}.button.is-danger.is-outlined.is-loading:after{border-color:transparent transparent #ff3860 #ff3860!important}.button.is-danger.is-outlined[disabled]{background-color:transparent;border-color:#ff3860;box-shadow:none;color:#ff3860}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small{border-radius:2px;font-size:.75rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled]{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading:after{animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em;position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.is-centered{justify-content:center}.buttons.is-right{justify-content:flex-end}.container{margin:0 auto;position:relative}@media screen and (min-width:0px){.container{max-width:-64px;width:-64px}.container.is-fluid{margin-left:32px;margin-right:32px;max-width:none;width:auto}}@media screen and (max-width:1215px){.container.is-widescreen{max-width:1152px;width:auto}}@media screen and (max-width:1407px){.container.is-fullhd{max-width:1344px;width:auto}}@media screen and (min-width:1216px){.container{max-width:1152px;width:1152px}}@media screen and (min-width:1408px){.container{max-width:1344px;width:1344px}}.content:not(:last-child){margin-bottom:1.5rem}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:400;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style:decimal outside;margin-left:2em;margin-top:1em}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636;text-align:left}.content table tr:hover{background-color:#f5f5f5}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content.is-small{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.subtitle,.title{word-break:break-word}.subtitle:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.5rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.5rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.navbar{background-color:#fff;min-height:3.25rem;position:relative}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}@media screen and (min-width:0px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:0px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:#363636}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}@media screen and (min-width:0px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:#363636}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#f5f5f5}@media screen and (min-width:0px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary{background-color:#469;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#3c5a87;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:0px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#3c5a87;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#3c5a87;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#469;color:#fff}}.navbar.is-link{background-color:#469;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3c5a87;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:0px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3c5a87;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3c5a87;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#469;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:0px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#23d160;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:0px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#23d160;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}@media screen and (min-width:0px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#ff3860;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:0px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#ff3860;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem 1rem;position:relative}a.navbar-item.is-active,a.navbar-item:hover,a.navbar-link.is-active,a.navbar-link:hover{background-color:#f5f5f5;color:#469}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#469}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#469;border-bottom-style:solid;border-bottom-width:3px;color:#469;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link{padding-right:2.5em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#dbdbdb;border:none;display:none;height:1px;margin:.5rem 0}@media screen and (max-width:-1px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:0px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-link.is-active,.navbar.is-transparent a.navbar-link:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#469}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid #dbdbdb;border-radius:5px 5px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-link::after{border:1px solid #469;border-right:0;border-top:0;content:" ";display:block;height:.5em;pointer-events:none;position:absolute;transform:rotate(-45deg);transform-origin:center;width:.5em;margin-top:-.375em;right:1.125em;top:50%}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#469}.navbar-dropdown.is-boxed{border-radius:5px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-1rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-1rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}a.navbar-item.is-active,a.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:hover),a.navbar-link.is-active:not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#f5f5f5}}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:-1px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:0px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:0px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}.columns.is-variable.is-1{--columnGap:0.25rem}.columns.is-variable.is-2{--columnGap:0.5rem}.columns.is-variable.is-3{--columnGap:0.75rem}.columns.is-variable.is-4{--columnGap:1rem}.columns.is-variable.is-5{--columnGap:1.25rem}.columns.is-variable.is-6{--columnGap:1.5rem}.columns.is-variable.is-7{--columnGap:1.75rem}.columns.is-variable.is-8{--columnGap:2rem}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:-1px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:-1px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width:-1px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#f5f5f5}.hero.is-dark .subtitle{color:rgba(245,245,245,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#f5f5f5}@media screen and (max-width:-1px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(245,245,245,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a{color:#f5f5f5;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#469;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:-1px){.hero.is-primary .navbar-menu{background-color:#469}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#3c5a87;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#469}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#2c5a7e 0,#469 71%,#465fb1 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2c5a7e 0,#469 71%,#465fb1 100%)}}.hero.is-link{background-color:#469;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:-1px){.hero.is-link .navbar-menu{background-color:#469}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3c5a87;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#469}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2c5a7e 0,#469 71%,#465fb1 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2c5a7e 0,#469 71%,#465fb1 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:-1px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#118fe4;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}}.hero.is-success{background-color:#23d160;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:-1px){.hero.is-success .navbar-menu{background-color:#23d160}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#20bc56;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#23d160}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:-1px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}}.hero.is-danger{background-color:#ff3860;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:-1px){.hero.is-danger .navbar-menu{background-color:#ff3860}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ff3860}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}}.hero.is-small .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-fullheight .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{bottom:0;left:0;position:absolute;right:0;top:0;overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width:0px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#f5f5f5;padding:3rem 1.5rem 6rem}#carboncontainer{align-items:center;display:flex;justify-content:center;margin-left:auto;margin-right:auto;max-width:340px;min-height:150px}#carbon{flex-grow:1;min-height:130px;padding:0;position:relative}#carbon:hover{box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px #469}@media screen and (min-width:769px),print{#carbon{width:340px}}#carbonads{font-size:14px;text-align:left}#carbonads a,#carbonads span{display:block}#carbonads .carbon-wrap{min-height:130px;position:relative}#carbonads .carbon-img{bottom:0;float:left;left:0;min-height:130px;padding:15px 0 15px 15px;position:absolute;top:0;width:145px}#carbonads .carbon-img img{display:block;height:100px;width:130px}#carbonads .carbon-img:hover{opacity:.9}#carbonads .carbon-img:active{opacity:.8}#carbonads a:hover{text-decoration:underline}#carbonads .carbon-text{display:block;color:#363636;line-height:20px;padding:15px 15px 35px 160px}#carbonads .carbon-poweredby{bottom:10px;color:#7a7a7a;display:inline;font-size:.75rem;position:absolute;right:10px}.command-block{background-color:#f5f5f5;border-radius:3px;cursor:pointer;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.command-block:not(:last-child){margin-bottom:1.5rem}.command-block a:not(.block){color:currentColor;text-decoration:underline}.command-block strong{color:currentColor}.command-block code,.command-block pre{background:#fff}.command-block pre code{background:0 0}.command-block>.delete{position:absolute;right:.5rem;top:.5rem}.command-block .content,.command-block .subtitle,.command-block .title{color:currentColor}.command-block.is-hovered,.command-block:hover{background-color:#eee}.command-block.is-white{background-color:#fff;color:#0a0a0a}.command-block.is-white.is-hovered,.command-block.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.command-block.is-black{background-color:#0a0a0a;color:#fff}.command-block.is-black.is-hovered,.command-block.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.command-block.is-light{background-color:#f5f5f5;color:#363636}.command-block.is-light.is-hovered,.command-block.is-light:hover{background-color:#eee;border-color:transparent;color:#363636}.command-block.is-dark{background-color:#363636;color:#f5f5f5}.command-block.is-dark.is-hovered,.command-block.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.command-block.is-primary{background-color:#469;color:#fff}.command-block.is-primary.is-hovered,.command-block.is-primary:hover{background-color:#406090;border-color:transparent;color:#fff}.command-block.is-link{background-color:#469;color:#fff}.command-block.is-link.is-hovered,.command-block.is-link:hover{background-color:#406090;border-color:transparent;color:#fff}.command-block.is-info{background-color:#209cee;color:#fff}.command-block.is-info.is-hovered,.command-block.is-info:hover{background-color:#1496ed;border-color:transparent;color:#fff}.command-block.is-success{background-color:#23d160;color:#fff}.command-block.is-success.is-hovered,.command-block.is-success:hover{background-color:#22c65b;border-color:transparent;color:#fff}.command-block.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.command-block.is-warning.is-hovered,.command-block.is-warning:hover{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.command-block.is-danger{background-color:#ff3860;color:#fff}.command-block.is-danger.is-hovered,.command-block.is-danger:hover{background-color:#ff2b56;border-color:transparent;color:#fff}zeal-0.6.1/src/app/resources/browser/assets/fonts/000077500000000000000000000000001335333561500221575ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/browser/assets/fonts/fa-brands-400.woff000066400000000000000000001730601335333561500252070ustar00rootroot00000000000000wOFF0 |DGSUB;T %zOS/2DCV@:Pcmap |;glyf eJWhead06hhea!$<whmtx<i:bloca" wfmaxp\ xname|e*_ post L5nxc`d``b0`c`rq aI,cb`a<21'3=ʱi f&;Hxc`d|8qc; ̀08|hbx= @aF Ox؉VUߺ <8 HSfef6) * N(%!"∳VڳPq>_\sZte-X"BF1j}G2ךغ5*L48 KitƧt]nHC鱴(HoiM;nw;yHy\'yF7ye~1\+gQeL\R,זir[ XRzzYWG|m=zE:c;5 ::ul')qzq 19_㑘ZKcyヶuuuiKκkP]_j;8{8;6燜ó<Ån~LkXkފ-cؘ?KƇ4x?G؅Ɓ,r ozt9/Llbh v nÙŕы/Ms1}؍͝T 9a̤+b؁3:?}d23b#8==GԙI+0tƶf5Az?HYz )Sw!-1ӦCZj\u :5i34-Mm[զ^Fj)yȦNG*Gj{ט L%ɝV9L=M=L}Ò{z-74_roS'&5t^yo }|Oz&rS&0uq~Nh#M=|ۓ7`JGT@)bJ k=є'ryQ>ب?dS 1 P~aV<ܨj1I(SB!6e챦BgJ2F= M|Qr)/1eD`CIdDl8PZ}Y{;Քȷ30gigYu)}60=DFהȳzoP[gWF=9F3%<z[wb)V2!ӳH^i/XwEz^6IqdIdʘVr) 1%P),Jju-Lr)R2+4Sznʱ3L2”m)gR.lSޥcJsMr) SFr1e)!S7eeSj\`ϔ$MД)52SΦL4%nM”)W8*S2\mINlkL 2Ŕ)ךR=e)S>zS`JMsfD@ŨVیzg0i&(3zƳL.F={z,iԳmN(791.zCF=M3F=Gz15NjhE=],9jQo7ݍz{{ӺleaI\x eG]/֪5Þdz:3sItҝ4tB&B 0NBAAQ89QEz3pOFy~OI}kVZUZR$7CkHҰ$NGvot~`*uԛ 8r/z P2(d|@*;p⻽6+4;fQBBg`OdvC.Z:ZLeZ70l|"Yl(Ce/k ƫHǎM]nN`sf͟Ϸ0p4(XQcL'zi:BdjUBmҸeU"31?3n  x>BT$IE)4)uԂnoo @Y:~n6w΢  v04,4 H)eOqH4S]{Y$]v;T&+C#sf3,?x=*(-V iM=̺F19=?ol}sNB5ۊ\%/=~ O )i ޫ=CA8!PR/8!@ghYR 7}]u֨dt4޵L[ZqOkHFjk㊢Du?3|1R2  (A E@0_B0Hȸq F5i KKR4[S= b) AK{{}{4>@[=S{N uFPZ-oQA#/ΠƖ`hذŢs]Ly Mp@BL" v ΢(6/P &eFHq([+iw|լP22D[ /$2"304a1J^0(%P<8VdU-0_Ú=mlLKrjh[o,]1Q]0uea+v#oSSe -QСorcӝkyX:F&t;;Xfl9ഁ/^Xn4 Ҡ ,V#Е\͵iP E( Q1f&C7de/BߊK #?*(5ȸZɄ~M.?jPx{a^ A4؇S( 4\VF xAD$䗀,Dt/l˙ aهoА*ECP]hLqYuuO:7+]{h2xr.f8ۥ|+ԙAdB)6ʠfU Th @@|rgsB;(g q,#A~1yZasAHʅЦ.RM(H0RePF DY`7PŭxLap^RTA߄-`vy"E@?!*3R J[Vx)Sa R PaźdrJv0:UHE % o$uD?IilpiEt.A y@&J 1Pa  uaRws̡L Db#ČROqȔ:pqSU7ZvPO ]Uhq/֦εPE4V׮>AIC3ygT$R,8Ns/cL-YդEʎfNÀP׭B"]@a S"hA.>IrHpI Cʈ #(0s+/MXu$ʼnWރGBcv Ęo/ ÊǪx)R[.LV|<'H1e/L/*f{i=ݥfȯ4c!5)])yLT ~:i)H: f3n$B ^}3,Rh/r K1ϫʘJ_ hpOZޚol-ͳ>WNj04~NE׼t蝟A9%ݠS~R 4n$pC>M"wNӀaAsC @ Y'Y(8H`/Ci3H. c0 )]atsql.̗܈VLSj175-Li5LAL)h[mhW02#!mɵ CQБ`fq5*^ 0esP 닊j14f bB* ̸)cc ߆irU`*m}/PJV ? 9my.ʡI\"%|`w"|}-x][5=~ȓ}z|xc7@!j26M<5L㙩1;ŭdYHGs),rN11{=޶_G?b@HngA2 fdSWY{=G~sPݻQK9uԑl4+aa8 ẰV^h&3+pIRޭ a`)M'<&vwb)('r8uPdcЅRx ,5*q?DѪ ϔs2 ]n1{ѻ$KEЎI6 Aq !4ų n94S\)Wb*'oyͭbhh51{ q.Ϧ\Cz4}//,*XE҄rU& tg;|q %uMH=. CA/DMPx$` /׹*$7M٘^րh#H-IRT6VHrz :S#U=F`0-81"VPۈ]W\GF)ajˇA P6F2MpQ-@ˆWlpVtzm0 e6JkU)gx`Qت0GNC7dJliD V'ʭd#1;GQک"v iJŲR#.ijUlꚌT:bBmrlQ <@=4V[l#90MQ;I '=` !>,M@k\pO"AQr>"nN-6?i XR2|kWk+H?Ԓ4^l͵1USid>ޅtqp-%MYh>CMM,E & K:vӽ<}݉}y7%\YN&X>^veX#w,u4$S纮߶/WHw+)@JW&]x,\ϕ6m" @iĄ0no= |h|]7Wb5?κ;6Zصgw^)'+VE֕qoB۞4K3†rf?z8`7&@)'ío~RYVرw>\]\td#LR0J R`1Uw+/%(ly/'z I6M,0Qzybz剭qMkmޭZ#e*F#qxG tҗ`0j J 89񘁍 > \'"fޘ(┛ \_OaɅ||?k硸 t*42[ I3ezgֽ/p~˟+|]׈%%S6A 9D6{٩Bh.`vjM(DN) -r0:L)D6!p ŀ{8៟xsSo7ivmޠ )4B!\-go`.& tʸL0H9a8m`?F#`1D d;LBL0S9gR~jjBwH`=%_e)xf謊Cd]&e~+ ?#ø;?(sqQIȺe!}[Qq $eײ[B@a tTC$"*3BZTUcRa&Td4!+Ns =dR4";  Siq`B6 nw]Y Kf܄9Dkj~ǏlRKUvMǐB26uv9@'p%Vu$hC4Qd v<2y%1&˄#<˖zE2 LT*̖ +91<"V"  dر\%Ċ? :O3{aF<ː( $.zlc\sS `'. m:z2L\5HdAUw(Mrz!mx٘`@A! 0~lǧ oݐ_ӆx)߳Δcie_[Qx<ڕa)x8(XTmjrsbN} ? t.xX*Kux5xAnM'C0ׂh{ʝ(KO|_O럿\s͵h]5۫7Iݯ?9\[#b1wx}\wZI'۫O~6 c\H?j=ŝsI=a}v<N [ j7Y70PћInR57DQ2rXoںXv\vM9Q:* Ft݁DAmn´T> gxOc[TH5byQȏ˼aė%qc±VG,pӇ+|l{pVo(1|`S^e-Fьێ3^^"eLVs Y9b>sjg3tL]B &3tFejy&bPE1k( J#\ Xn\|@ )A1'i:N`|ȼ xIÇp!s?(=<Ƶ9F\uwO0ܥY>edM3+@< ="#mWUۮ4]u9RuTl3m*C-ޱo87v l)OWP0YHeSW 7m.dR=~g=sӛ@虭/:ɓNˌ t?AoNIAA`Cnzquy{yvD{˶^w oFSۗ`ga׽ԳiB=eSBGO9f đkFn Ȉ@MH+;4)ΒDD>a,֝f%q1Az|c/Ⱥ;;^n^f4_&J=̃%mb[S=:aj@'ذbZ,PիgVaӅg XYQV#WWD"-2 Piw"ZË́cι|Mw,ؘͼ۽EGR)z| Tqʀnz9KI3dAŀ+iAĜ[ &ZΈY r{ cG]`G*? =0I/E`eP>0ZZ|Ik" ;A)zF2@z0I(a_='w]=)?txdk'?ζ+Y`*"6h&zt^ BW!6ԚI4z\8t|țϜ)oFɭua_87\}SGreVZZ\_1f #KfxN;ܴQfv`bw`+jYe gvT b6ɤjts7r B )cwϞJOWcɻ>¤"! ז ؄U) .U~o?{ctU/m>8~F}) &}IdyΞ?{ý94qw?&P{*\B.H-}kgvd3m |iX;H4/"#`eC )!rP\g9 2H{Yy#_:j/,)뻍qcJb`S5Ym2/S4y.G0lncG׎Vr' SB 3Rt#WG|;%4/Eo^]^L,vg&y/z[ttH^-N{~c D0S Ѓ5gV82*y c 5ؒk4#LC'YI@_gN61?o- Tl-vDsAäVtoUrPu#&Il ?_^u-'V-R]cN>y֎m>qb8s P͹ZX2kq(LV [Z㶱tJ-W֔x>{ܛ=sZNsAĪͤu;7a֦6kp3u}{ wCr/0'zjBQqE!zӋ%PnPT~u9+UzSwrOGރos_!RQwt[j #q r`k%KI:bNYƞiy}s7ςLԓ޽Qz$H>''I/ Y&6X4( "6k\!^ڝ!O0pv&MSЌTi :暼~:cz@N2lg!0@<覴`uzAÔvU&nu_.<) Ż_6 ; A4 DY:C_Xǂt^sTy0BN7I夵)ؖ\WYo6gC~K?Hv=\y/|.(#qsp𼐥#ʭ<p4.EVJ::8bA?ϛN'i I!pb [s (o3 SĦȸ``b!Xs@dM! 2Ծ ͵ \>EUg2zd/_ZyW =4M+5niR VKJzǟ^?v~MċrO Ҙ s(0EX[t8攐!{QBsZҙ t~X|/ՊvJ1UԈv盵SSO j @pl;:r%Ԕv< D.u-,뜀M[?0fJYl:&fg^=*vW:/WǽuxRFmf9yL9e~Y$-<h^f/>lXOc+}{sVTܘӬ7+@1P5@(TbFuԊn?WR]ȕ,J5gJM/[T8Ӵ7qXPG+DleJ5{<˗KSc"Ei "<tb2v-ˎ-wmV=%o|Y3Q6 r mo\'YDXP"@<<}M9LmA|x'pW0f~E=>}Cpe؋>(PC!j~Ȥ;ݸD!mzgK]O.Pl'n~"x# iَ<}¶L(\W[ZJX4?3k摽{'V+h3?|B[c^yOwlxҘ+VCEIWN:r^%Nz+#O)K~I4C* fh"2\Nm;n-"lAO}`>C|k@ W,f!<|Fq0&p0vJ#wܥZЀ' #+P, CC=h,"wg1?܏h5G9xd/}M2Z箹UKb*W=5VWLM^ryvXqxJԜEx"S& ! oVt|#FBgeL4tJ \ħF|iGW97X?{ Wu}bmm&'O\%+˯uk ` B5޸vJo͙`Y>Kٳ&78OGvNg/ ,KXf bn5k̛4{ţvˑw2Яﰼ (uS_ ރ?!+ (7az7lTYL)4JײO!F<j^Fz~#|HӁEHҘB x8S{3vgb/3ph#.)C2/ecx>?Neƛf1Rj7e0 ^"4,W4,v<Ɩ:^0/cDTн*\VYAlj@*'$=pDj_jy\:7&-*%F01ߩ D>D f'vOk5PU"k&kW-7v 乃n𢜡@j t(濉9IC| .83YP'zUc}`v~;S ,Gmx^UF\M/OLVgӻ]2\߽w}Lt3Rgf~ecfL+'Ƽ<g9gv0ʹ7:w ]k@хWzǏu~\>ضԉDϋE5]lCoųqo >C֯zP{=;1=}qqs)#'L)!ezk4_*/ xWl?N]O䪥R59lO M4n 'oA蕒4ٞXg+4eK%aDRUD1Bp}ʲ )2LsyLw.9qfM]ʭҤYnb9?(6'f+eG (-ED{0oѴ'=,t1隝b嗘/OChC)<-;L r ÚY oQl#Yk(kthffF.V061 Inil2DDhE!YlZd33%ն!&srF,>"TZE_UE ܏&kܛQS/z#*e0zQj*#`[?ʹg/,xak Њ>k-]LN^`%;^Kg>q臹$AP v$|nrw)9 0Ky # n:¥4YHG17@ŒAA5sGt-)7 ~ſ`]E]~d ^RcLezet=qE-yl6ۈǐqOj̩> ÒRYm3u+.gD˔ZfV 3h7^0m`mc7|ԚΜa'?dOi-߬v^;!"؛$"i9- E R2xF+˳9d,mb?j?XZE}=į&3oę?E0E{)M"}R e+(Px=KQG/:G70f*Mg>x/>zك/޴:Ы}.,?|W|>5;w-O,/)s2h/p,̊canf<4 Ėdh‰[t`o};V#t}T*Z\t2}یtaYTW@?Z^٦Jјwl&u2T r.Ƕqiܟt\n=ɊfQǁ -Ө0af/cXar34GtʈJBƓ._T2epl_}w޶zz9,v+Wta}o_ۺ`WM~Ir}"4rߕ'\w g~qY/}[~A yK-_؛_[y9Rj@~M"Gp|gDv5*3G/ wآȘ ȘۊQ,./LPXytuuu\U䱢nǫNwy Zn[G}H5*OZBKhQL?ݦ$jFu:" ;Cq:uP=>s hTǡTbOoXP7jy+(,hduket  Fq򌓽kӮקfӼomt&.SW.6–~)y4ŵV*=N̶( Nz371=ԊWuZ`%'B.qM:YIVT|W'4ۗ(3&S 3ŌM6U?niǙs/"D[C* Jf`"q42l1ۊrY6Vռ[k<4(%orl&U 7F?0L0U{AH5uh텦EI|9ugW@36U]Y}@e<Wip-^ڥϹ26|!3SƓtƗD skL +Me(Taו͕9 5W ]  -Pj0 @[UlPPC @tUКVt'%" u|Rȉs6DGʿvK%箦.<3¿-Jr=JI"7M3kZC{{igj:Wn+UZsآro~WkF+[Y38:3bMK.^xv$|ѧ,KCvƒ]W7zN{DQN併StX7-u` #.zaXq,0Gp {~,T~p`,QSh)hL@&P 60pu_e-nĔ <)\H\*XE?X.8b 8ljb\z~|ՀXdLx`\LuKE2$ nlWٺ̴ Vzu b'ۡL/*!2x{9YC%ZYn 7LT E3̱z08=  O9<d uL,s(GD 4$6#ayU'JI\A`HxcR@_{qTN*_ ecAe04gA&1#wP먪gw M6SK|QRGם-je _VFNd*Oo!X.T t8PUH`7R `8a`.|NBh1,RNɥu8 I `'x!aǽ)_dj|aA5I0u4EwB4$CvN=r^:`QU!//\quݟXDHŢ~zm7U|n kCp@g\U]ƨUvM󺾶(rU6ۃS zN޲ 6zy5YVbwYsε-m~ 2:s[?t]{6Gؼ5e2lmğ3|4=G.m"ؼ^1 fem*Ph-ߎM~"|?EK 2ٟ4G"#TE\@ъC~x'DU3~*m \)aAP9UoC0 ,{>9vr 9lQȸ0zWxf#FveSҊtx5/Y1ļHq #! xR щ0)囗o~51De{'>[F#TU +asߵ~=16/-y6P9W+}sFSH_wI_Q4FFjYJq([%˚ѡC6S^k^7\3xㆿ gu|yRae W 6>`Vڿgm{^cl׭92qowV^r9Ђ/5lfm#F ϔkW}iǢl#н5Ss).?g}ڞYmz}{<٩Ξ_vtoJ8F덏l3zi1# Y,f FN-ă䋂v:/d'<:pK2Hio -T76Ǘ g 9 ~o~oAXq ]gAݑcad@r(NTY /4鲬Y#իt+i[+sE4 H\X6QdF .g HMĚ 'X@zSOU,q|çrXΣm3E+2Í^faJ?p7 / &fR wGZ+ Xu&Sr3lTG+&GeX4A<r B@JD}%/F}#_JrDazi3ݟ4鮦S_>ƥu(tNH3lЄ_D\v)3=v~,Jr?)$oGAeƷk&܋MbwmoDbĆ'^ygM-:>g3ÝoTPs%TUy& II"`A6H0*"*A PQQF}}{νg>_mpnlR w0>/~Go҉qG9UqJGК^nnTzYkLӤp ??^2r鋿x_\:q#^fi?\}?^&q !9S:}}ӧuNOWCJз뢓dޟ~9o+ΰy]x4 #1e.6!;$D.'x}<`g+|&) mB/Hi2hsYG QG}Dύ Њ~ *o2{^Oa+Es 8_،\$l0py1Y^iV*vTbo{kgO&8TI4?sr"C1FGd=7%ШKAiw:#r#/z7=)VX P7*vR2?6SΞ 4A } taC [Q)~1k.GG2>`%D<5G(uu?4p iWکV.ic;ׯRj1SjF.y:iּ&>Mr&  ,kOo Z37;:nQ#o:fbG_B0]hzfjnEȯn)܋ӝXhF`@D&8|&侎sVӳELΨTA], lp]OnU[_"ӏ*JlG%]DcrF)5߬(ϗn-o(j*Zhѷ ;5yC:T6 =opX䮸nֻ_[[Kg)]omkP.oݵB"jKoIQGqٝDs$wFK5?׭ɡݿ/9f 4S<ؕ)k"ZޫoE"Sׁ/(4kLQVئ[IA i !*^Y;;#It=N ty鲚&eoC7E`O09ĉMd^6&؞z]Y ;y 戒Q:ZYKBGԬT-3|WS b2b `"TPii!8On AY1ZEyjX*,b`FIWGp7!֯EVv֢TW9n֚]uu}gLn UQ1yl#vښ)b8LNh>Xnh.ZW[!%M.Ye]+Uz+vX5֛+_s UL"#5Al^wN&*HjJ,=N< ?RK k:h%#C_lގ5n[! ?ԭUn<'tBLr{x\\m,exCk949S\*oOeBYAb _96P'M]x#l7YlQ/6 {c["c+f|5dUBH 9kvzկΊ։adqfů:^~L{HX~rIgu>TOӧp a}  *Ue֑‰ՅDh1A .gݼ"HD<% aeɢAe6鿱^i$!'UBͷWVWZ⨚7f %90} 4w:wtf.1迶G^[3Wn|IZ\g>8OGZ,{@",.<[U(jjY Nͦ; /*_x)Hf*ϣqiDaaӼe0fw9"G8.$M%Y zϙE0;*7Ph!4CC &F.L=4 p+0:Up-_|73"-MS`XW#i*{b)k|Xwf i05F}i9 kK-YT$0"J 5ȌtW{  (9y +MMф[  W#,ak)3e&a8%W6Bbj0#hi/oZëVl(tPWkP U E3`?C8z2hۧӠދ-t` s^/1Eaz1T>|ơSM4QQ Oi%6%!jR$Pn,]5k6Oڸ}¾G;vCQY?$aB~ྜӮ Y )aV!iA2gRz7u؞Go5y sƣ!{w@^+W y46֔U2.P~;aX_59x|8%s)t^73-8yuW.kcbr7A!H<,'Uĝ&?();qxAm-)J={iՓXW}%3%e&iJ6a@2= pS `X,Jn2~RFY3K6GE=W_Hw)f>xy#սK6[U<mǫŲ0iUl;0 k%ꚺVDmfp]9ޟFFwiBH^︵Zw!4)ӥ=Y<觥OREBX g3YG"PċClZctV+%тl l"VqZ!ŸmwR/<$j9_=E[x;?nQR߬M,8$UқƦ:5&, ?S}22lo'^G*M̦6קWQ!=nԎT1ǣ.ȑ//D~f->B[;~,-Po򎭜![XG#Y=s#2:^ײ+G SVmܿg<޳K;jupk=4]+Cb+珛- ?NMG~կ<\Zg:}b7j9G6/,ΠYn[Gݦ*ߐ1=V 'mam:ohiônE;KK;0=,8j˵a߃;e3“0fBF:70(sa2:^B) a m݉zݎ7֜zJl @ƌ1 :^mm]9qB^\{wt ą^yvJ,'Y|*>Gխ_vPsiReRc_S>t248/\y$:{ʞR1%&0<휷2 #-QXg?crlqplǚ $}ɫ.|GR4QT&8ׅ},64A!cSw/F*tGPFTWC8~QAbs]p*Dn@7vZ9h&V▓n5ubB!L`8#yF]Wf,!# γIƃy85V Lk2LghsHzH8b^#ʇH"8E-Z6]~kT|%R\7꽄\C<~L^VFw7 ⌄ѵH=ȝ(7,0P3T@!"%RxOCgY<3P `,,d9|.溍rg| \a$FWm4)Ks# 26Gt۫TK) .t[5`?HLPCW3YR@U +jaLЈͨb o)Ke_3!ocq͢wX:4UJ3P5)0iŲWS5ƽsH)\GaLgu',rh@= p˟$V vCw-OBL ˯R\W0~ &R`Rr+Ī߼q  a:юTXnQp_ss4Rt 5jiX4ypNZ˰PAj@Z)( !̱ L״ k6Q/M葦RMM)qP ҝ r-Jt=Qj "`; rP ԰ ahFU)4^bZ(ᰇ5L"ߪ*s ˢ  vƠVSxʥ؁% r*ZjkƳn`,`ZAteCjIn:&2$3șQW/5xUWNfϺ-\sqB++iCن>iT%J}Z ˄,/j*KV𘓄*n1ȭQZs`ہgJ( 4,|π|fL'1P N$D@s|V؂:P$I=^U9MN^Za$"Lz'h}IXdMZd} OawKѩ<艨=K볎 >w/z˖1uVy@ԨCa*HvV&LEm+\PBHn# - ]1)'U!`Txq_]~kϞëe{>lèwPD(]*@tdU #bkBH+caKTWo&J В*CJBF%h1@˸Jji@tae!0|xRx:Ug%Kdm?{=GQL$dsu Q&~u:v-.|7Fwc'NкSQKQW=SWwB :D(} ~_w \҃谓Z$đGYǨ?'Ud @Ră5;dl"/c}U=sLݞbW1MTArmb=wS/Q5^<-&#`4RC+zF~Ɔ&P髖*4ٓs~Ov/|]FAbql{+/yɼhU㑯QGUa9~7hXa] 2Fm4/ ~o5TP6jL=diBB'0]ëqyH`ڈJg?M~<%+w&c])'(Ki]љatr%!ɨV^TyyU;-w"WLjZiE{Oxj)i(Lֺ3vu 2"/Z:<{ꪫ=W]yv9c4`Yz.c!P};* oLOJxqv~8K>HDfyvDz"r!1!JIW3fׅӴ]j-f[پۭ*.h{/B;fg7U댤4^6gV/;=#YvR̅T7x- w ;@-!ֱn4÷Ac.}Z#WBGHyYd[ˠWYdzփ X}fVJ=-mՊRuUv9U{jPڧaU?9}z̆k:zJOSf j̟F3o}@O7}KcgC(btEAX !Lפ3Prch wph,.,.>D8zov#.utNf5n<לM:~jdVu%WAOw?nٽnO o|sWc izѠs+rm ٜB$ RBV5hD3 >ړ?9/qudxF`9k⚟{yvpTg=V2%ۗt6@ Ҍr*ƖsIrfgyMvDeJ/ύFsIE' V:5A a6Lp0%N#+h?ZǤ#m%$1iaL݇j<~!uh8q{F7sq3\*"|3o8#W1%V[wn8X/o1g̋=i6)2;hzX)<hR4KOt%-51]P/4.]x-xN:~zx`ppFXD f_PSD 44׾([7T=fN11QH3?'vfQ~ >VW 'q9th9IAr: *1|s9Qq;&(2dPDc!m9*I*0 t2' ˭_<3N˃~ݜl$XV+iK'h`TWZ@d 6"XKK4~H$oI,rCX.#: L0K@w,n@"̹B\a: <6 Gi@-4_KXZr=$DOFn/2DM3Q.,Cc5!)`~V=(B,d?Qyz;JXuBŰqտ˳%mpZoΤvo+hصK/p k#]'gWWʽJo-4*TfUeT k[q5{Vxhoa{@ڶ(sJg hz2cߐlV"ƴ٤淸`ލ\{\YY}[1Y)RI ,$En(Sx9b->H$ҫB~#3ۃ$O`3{\bQv;=f̉X͡vDb*mϭC}RT TkjAI7REHE-S[Qc.x))N"9V[;99~D轭|V])k3fMH1i@zi%ƭrFMo?}RX\&k{ZJjŀzUut+"k+Gz/+`gVkuG䝅6Rcx$FkFjŏQ3faՙuCpDܼ{99D_tVdCwa{~^}/7wcB-/O/ؗҙ8dhD[fk9,IYNrQ)1IZ35M!?F^#տfj?)ydRE~֝\:xSגe"]CԩG2>:^yWNu62&~4/E|*xz;P].n RHʼn5{\{b"zgH+36o{PK1d`r#?%|}el0BUK0B1hdވ)vq~oąC+ ~|:Pe]?`&Qs =wkOG΍N'5bЅ<[g=5Чeβ:P5U3S mKTforS,ܵDlQZM2灟 ݺW6|7jx bsNL;@2djUsEIQ|ACr Xq%>]|X:Oç0kAg,4,'$ \ ]Wxvm%tSܼTi5g ꍹHDWʁsY_7>/%U˫e)^'~ R3d0nª?KؚCxfI8NokJx| ed&g9̆|ܳ(s_i;ss;q&#Gꤽ2BɀH\/VոCh0>47WM~PgH1vݯBtIԋ E ¯ sdF+QvWLXLuIUNJVÑAɄ,G9:&zel_O*帯,+b6nLd!\)O5KlDZF>HCqkNqU}6Ͷhԋ'{ɣ Ah" g}AU[q{Z-Ye73~ voVhYۃcI)*YЩ:)٨ܲQ%{maXavTPİR?)M<hw+/^ FZk5dM&Y*t QHr:Ia[1J~VLQɊc}Tr;R:.D1²,vAR޵Lnz1.և㑘P5yȂ(ʸG*ư}!L r$%3m{Ra@#}Pz%UcBQnpnRʗQ{1q52Z#4ΑkIB!qFK 2uaX\Lp3B#l(̰sCCzC? Q  Fq\)ʊ 7p3Cۄ-PhTy6vۄXeJ,)9 O>c0ǢXuP12DgrPuA݋fj1;>1bLwIKH 3B[0Q0StTwmƑ*0GpRlUiU3U[Z3>l+iWk\`׽F#aC/ttCK 65JU-S;VRww7Pd3OLmJ]XFM4myD&/eI870x r0XN´Jh/emOg~VW.o-,n<AeKhyO[3NNd[ P!Nm{'N/~Pp.|4q#TUAƣ3}4c䩂10Þ{8=_v[nG?[y-tHa@wa<3:BX ea^kNֶnۼb붭%PY\/¸v&}ӠŌT '9IG$P8]ۄ' PC^NFgz3 $Re yBlذ6&JSm%1d8{gXB#9Z{( yxm$=uRa); (ث2:FlJp;M LzQ={Swuut4˘ݯIKѴ:Ggg!i!wym"h"鄖k1>|Usf:yfF`JPmj rP]fj逼{<#x]d9<(M~}NT`Xy\4oޠ͚SaE+)zANc2!&|D+rgg{BQjRG@otXY8Ti"%ΕYFJ Шzܬ2Q4K*F='VF9שQ8 HUArP8 "%TU70>%b[0}K >)'Ϧg[AR-2kqY]ߗҜ3]+$ƳfD֚UUem+ŌDӕ=}֙iptj65< S.U#E9s19D?Gڞǝ 2u 1rw$i2h߮K}g߇-FE$LJ˜Q1Na}XWηL3(j[Z#ZRDK E0u%^ƽQ-ǍA{{懻\f$uw_UQ7l|#RK뚕j *hǢ|e>߷P4mźHDk)RyKC{\oɌktxu~U/o5bhfds˘`巰˿#+~W4ᢵ󲯟gpeR/:i 3j;qy/=r3W[=S Ns@a*.#tTփ>غww\~ы.\:=$g&D~4. ۅ0 ,p/BtC [ژ'ԅb?(@o5FIO>F%gu|Rŏ7z7j\qE0X4jQT / RZ8{G @S28z ިg;З0vQI 9F[e{jwaF^q4<9lGW\|#D,5KbwQ\͖AYj(TL5ՖaԮ*dSp7:zy6Ak/k4lbkśdJ [`yHD< tϸ2#6Vux+/@7 )zX9n.ȉ6f&rףVT&' f^`o֣6RZg@i/f"&†PX O><[TnuN?\pZK  50'D{R~ keM37J Z[Z]$IxJ-LT8:,WԎ19hv(c B>[iPU0L٪mb0O cFcC=0n--= f>qmkND,맽l+dX!d6qF8ߛOtTJvUӆKo`:&2C!m704VđTbn-L&73C!N m a;##9Nj%EA9ϿsPZ LZz&TNhd!( 46T @U2DT ˄=C UngP.!ܟ|B32\{b%7 m"EB_n;fV,03B8 ӽwOBJM&fYŹ$"K*kFy!f4w|'No6aOSSӷziXzka*=Btp"e(z Xf!Nφ˵e--Xfb}!iΑ*xOʠk#>-5-1tķ[jZ l|qEV]Vg^zl 7%Üj>v"Uh  ,[JR$S'kT5 K#MB38h' W=)˫2cq͊yi ,' lK[W>8]“߂ZO &$7L%N#q4` q)!~ۗM9Tׯw/1ѰäEt,j{uۋʖcEL l_7Fqݭ5?rpv^{t"脵/qzOT ӆiS,6x-Vnl{X uL#妓vz0-%9K^$,R?/>UZs.M\$)sx"y6O'׺S  c},D">rx_Ph )2U+@u5kZ[Y샲zb+MOp{eʫ4UWUEѡ`aaʖix[ Im?a@AX=1;,^3/-Ii9}|6n}ݶ6xKZo M_϶nerv;t*-3)XS8W0>4e,+6w5N35Qr٠7-Z8ٻ- [WXZYڸ>?-463AHi?o5z?Cz}!^µ;pwKkz=_)z +ik %U[)Zfɯ*BStұ6Z=8<_*xpH{61`g񢐖s '7UVc$qWX ke,V:>swKDq[> xd`z3/\<'U?#T #00#=ht2LןC>#e?qe8; YN հL%#%?^ N X؞SVUi&i5&^o2ʝFW_ pַ$rDibp1TH UrAɆM&nex܏CZ9nV8),xM7{swn\"[nyŰ#S&1 R2>ظ.L壘V{ .JrpV,F4[TFp@TɉH~J"z\"!s,?X](y?(Hxd&f>'9B1db}8jqn0t jKg"83w+u/ZRVĩ.2Xi)x㮨-kR,Zs;CݫfjP3[w]vA.Eճ \v@kyN+AF?ɬ1 zsH+v Jr m~>N"&! X\$B${n'fR~NǙF{4GSNrZ :XU\]U&E PؖSr]wݼö'󝧫vU_'t$UEiRR= 祂IE: W 5Ɲւud5N~~aʓg%zۘ1)dxi<7MGn>͕ڍ!N~gR}qAyxL5 4?% H[i鼧x|l)tj1#pNais9"{|.}zqDӡDZ:6_RָC<i<{KLGV:gz+u/QGMȮJF9Pv^=.6Y ::< *WXqK7rJ`$K&oqUL>Fݖ11#qc]= 5P d4'Kx2"qH- I >.B,mC3Vul]WeŎ%Q 4+C09bmTB}{s?,E8`rMxi_L$'ը@`9u8f/uPWjfb՘,5z J9ǚۺ%V|5 QdXʊ:-p*E-XRDNU6/Q*ߝKk(]7-:=z }8)"*c|…a ɕ+ HU"]$YΆے5̃zWZ:Vڬ$fݱJ':^К@-Xĵ,@XrKBM BdTL-{F]Ycf;H1zuxBEL)s5&شDS9zl*B-)B)vNX bB_}nZУ"65Fo7}p Iج,VQ:ذ)T_&"Oɷ1N? y$Aޥ}CVZ-6YUw߮XJv.};tK" ne8Wm4k ᵎ+!WkYEZ_:PjVݤ//v˯Ze^\Uz;Tw#/8)ш@QHuZ&/x},pU^误4/(ۋ:H5:A3߂ I>BGQ3^(٥~ɥ 5xW{})ƴH8ʨW0P%%0Q ɔθpPPw<:$Em00z+vaƪg]}awpO`+͸'P P\Nsrȁ#iJdy`*Kq<ÁT{`# 9'*wH ׏VS5jk`[ /s5 Vx )(QYuNAl+o"xFm7';`U+`,N ^̚N \ 2eUE5^ɏ5S@-,E#, /0IY}e1w100/g^4旙_e.S|^6㊩z\Pꇘb^L<#8K~t|&':IGS2X"xO8Yku)9d0gs/i`Hʝؤ/DQ_$#Za7U  $a/_aˈ"^}PšWO85xΦbA%̃^X0-È qze=t:WPtrv~Ub6fMޙ ݙ{C?fj? 5DzNxnVUM?C6KuNn]Ӓ_ F 5MkBMx)0[)Yi Ւظy^I.Goi%w g&OGƀr4j`6X |\~|$ur '2%,`1š肘؎a2& (*UU$t5hi`YWtKKDA8eĩP8,HAew*V2$ cje .%ɦhR1)YjB,+Ru j:|ؑoNfbhT&~vv -GU̸==([en:,y mxCs(HDK[ХEh~}0h4'4r%C6eZ`+0UW +(Gr[;WJ8G:7 Nyl-=2kPS$p?ŵ-^U}̑YCrD>W5`;v2e &A{FMCa/!!WRBez=%-332+ [ i{|f#w,dyZxfۧ[D"'$iBXAZ3N) l0 T-$ɕ^ܫ(XәZx%O剴hEPu7n~Y5 0PcO~4eYo.5drhh d Mr:.*%РWz tRdOkaz${-*HRiX/I /IJ|B;yIЎͩnIDeVLsg4͑td%t6-%r Ml'8P(*aZsF2\(ߢ9D*nJ#Y&S8 pI'T t5|>loxRjXRKĪJ(=]41v/Agũ(Z.6I& iتF=(j[t~Ȕj0:4J ܍ ]3 & .P.cAtV; 9f!}N냲"Ym ^nr7_X~Il.bf/SNnyp"'D kEMݬv:(~ [v[(醪[~P.v~A]l&gg玶[]`Vfwg3ihmI$+Vꯀ׷,3#ߓ $v| e8Ӝ xY/ G%x+2'JJٽj%W x7:j``B%I&s4uWQ=OJnIZǐӉd$JH] _?ˠ*Rvq62W]C.`V F󞽲@{Yق_s֋;p6W|'7Ya6z*o o6yBX+ !#!oc!/|Hx!>7/O29o&Oк$g R4͗Vi@= "氝M6wLRȐ8O^bҋ'(g~vR$F=C +r̀ڂ^gQ2-]FBY$m 3*%#.R#prU5E{sC_Z(: qьCcl*9YAASnRn[,"4Yp ֲr| !.E%.jxG\NK`"q+J d颀80,?3G-", $>o,:0Y3K%3ɺ)kJY*;1SV FPބ ZP7 _dA$, 8JJ.ۘbbcbm%) :xbylȕ/ E]SpfS JG2 TdSOJZRjhj3*}ڞZJ.8Awk/x+ }9.3Aό5J0S&R'S[("Y&dF|BL6;'N_a|nrX.ȥeQEŹX(gt8ZV JR`=u҃NYhҒx@9b)}(KW&נ_^^w¹)jM RE]qgښ-@s<[UR|4Ө.r9NuyAbNtl=ұUzF;^ȚȱI,'}g1PEqR q#m!Y]c^]`; >8ArxsfV4BQB P$OsE$Qwͬ?:<YȌ[Fk3ml %.r^<54:ù+lb(:` J@?]x5Z8Hpg(8hhؔ*6KܲښمYɊ \m==<h`%,I! r2҈= 3 OHy{s5d NCN'Ϝi b@,g{W\eWMi .XDCd0{w< ]̾ ޙ>ۉ9Zn^?Jȉh&%VΩF!NZV_WdjY Mb,`Q֛eJwm{s|_J4\?Bj/d#Gkv'ߝ(46 a@6 rM\pJɞnl_Z7vlra !uvћmO1J\Xs-uk'90ZųI^/l23P̐Y߆ gs-f.2103/e.1B>\f>|u ^B5&M8O!50I kdngXf6lNp~oO8 "aht؂6q K{͗N1tlt,\1ŗ:ou C\"Ȼ*{PǔF3tWe4 woQamW攵Uo[aa8XY9ǑX%ȑG6qO/cGfM&:fQC/gTxVdY~ێ݆E Xj/== ϐp^dErEY߳L0*)\WM a:}GDz}*x.&HP`cBX1&㿁I̒dQl}q*"4l#-(knwW9B'<{B8d_>G#y «Wܝ\J qR.V9veS9aGGX6y :;HW/Cx )& ^@޺.?u(o=r䉸7xu<%{T IktjO ^^n#2zXj!p{E?(h&1R=;atXvTݬ6͋˲(DgYbfL :=d2~BBZyl k Cx Ⱦ [ApJpmMа8y0p<W5K%dAUdBoJ>ǒd#p5P2}E>Br^9s_v/MKS[c&93ϴSY䒱Ƕ`K9WE> Z[w&_yۗ9 ;! ˳r]Nf w# Jf-a8j;`6ߑ9rͲ ^8̥,v='6,}2tmf{a5>2qDMflbL($38sӁ(4gj[gYQ5"iYT5,ס\h&DMLӂ[,6a2M[5x?gP߿f(lT#!ab% ؉O\3}x+MeOlCCVҸEJ14] O~c⇹ZW h%2[n,EN@f(I[`Q̼Ā@0=);(,ca y񐸈)O;%Nc4O^0Os.X$6 l4jYtu-6*Yki1, aIIbʊ.=)/[IB /rCn7H%\2L6ߐ뷛r6 4 Ij֖ @"77k k6U!$j Ri.3IP8ga`2ζ'4Pʖ_`4;t2R;b?ߍ_fg܋4oU5ФW* _pjT)8#΋~u➖s˖R ?GNPi~8GOvV28D18#n0'UT`*E >ۑEzQ4;c\S7myD̾Ȉ.cP}`c%3^ ų Q:FW--UK#;s_%YLW6o+$<.tFsmsGNH0E'.Ξ\' 3o$ &SѮ\m.hue!hb~8i?/^d>7s(G[?i:֧j;ANKoH3pH~6rjsS:4XV°_7&$ a2Z3G6v~wݏl?z0L6Y0#%Id^$`Ò5 5N$kQR,7r@,K$K1pMsqGjI&벲)p[R&U*.F6(,OԆ5!YMRkJ[*VB80sHW KG@X^yk,ɲ4cFV2dHs{,"nJ/z kD!LLoL|0y) $47Ga5.. g_oz#l[N.H|ÜwOz`qo!܇}xw6# ER^nUz!\NoI;4}#RrD*e9M% 4!bEAqdHƒRzeK9]rb,NeΩY;n8j5HǮEΚ˫ِ: 8e>M"-V'; \22/&%~sɂGH31hj<$'i8 sؔS,'\^HyYsTo0YexʈK8OslOʊJd}IFwU҇F4XW g/Tp"e]e_[뢬MHMv)D?0t,s<\Z[gƉ?8{=nj]xyu oϏŋТ"|GSCsq?!O@;kP䪢i X-t9i,UjMl]'^""a~`G$!(<\GҒf`5X6Txڕ7MI\ώYquMk8Ҍvװ emym&e mk˲*ˈ蝹Lz7ߗ t" 2:ʳXbKPJ{4UdE^H 6yCbANJV`o"/E ]ώˎLPzBB+qbڥqdC s]Kqh󙮎)ǎrq1omK`Yղy*FZ0yޙK%Q(5]& yVu}|f~ &j4%$u+Bpt[^Ds|Pn ?PeH9'roןH:1r[rLvytM#Ei EIk{L[szr' p %udT5J8|;|7o~z#Y$q+&QIj*|^2"%/"Cx/р葠t̅3_:K`%M%HzA4FȂ*`P7v+`8KM&|%"͝Ce5pbV/2*E$΁9фl=QcTE ;w]E^UlCq0tRFK%tB o⊣7YG"u4.Ed\U(JHM⵮m{+%jr.Ig2[wT0\Xcuv\tkiMogЀ,Q]ݰ4dbH&/V]US$'rM<6 5"SraF`v*jaU}ӯ@]n* q.]ݒ{líSRLďܦtCԮ'9j&{ie$s;wVV1BŴȯ=,E b#Kb/zw3l'^ı{9 cټmnaaV<ŦecUi,)CP6%ww?;6l<( GejϱXɐ mX|(X>!t\A1b4ꥹNܜE!C75K̲v 6Q17>ç7FM=i,/B<tEGw]\{OE~O&й{9>x/A?[ k8*,bvQ68yXu¤qg,]mk(keQDTOt"R*kXn[)ƍ^w, Z<ֵ +2*Ջi!o8kc[Զ z`(nZAdb.V j-H|s`kuQg8P^ZEY3 #9&a~E<V1d8 uG Ju)Gv=q]/?eQgwe$UCZ^ȷF.;s ]} ;"az"c0f9\`.:h,Ih)d/-m ;&^U'#MN*g\sOjdڛE񂪌ǹ57j 0=5ҍ[>oySfXZ,ߣBGB5\VCwD㾋*i}*VVdiL6 |PL G%x  6<"y,QM>afe6TY I/MciMKr]m7vM4,? 1'ct =ʍi%E?|8?:N`g''Ov&72cC'+ (l̟F7{lf:-䳧[ۭDQu1,G˚McrY&hO.}U0N]NjtRĺEiP j.}~-9gKo5/ q[ iF L< +ɢD;Iͤ75sNq:n4Z5aA\nŦIktW ʃ~qh + !S}j7y5sjmxeӆ5g U!؃ڥfI)2#5 Iq hQ%+7OQ.ݴ<4gXRp zip6+]!'`gES7"F,FwOp3;_.a* M7T 5z,۶xWIGYfHL{(%$64Obg(@[$ڎwG|cqf5tc-?ϗ:BtyJcH\ד*)Ǵ!CnDB!zo\`U.c^n5~6|h%F W~=rA=sxE]gm q皾im\0 삁cv900_;twc*}c}~u% ဵc0ɠމ,Aa`NAJ[,@0ğ۳of->tm`MyQ OȂ %D`=+sb њ qRQy}?.|򢟕$)Ie,YAQ\A r7Uˤ|皚q4<f9;ʈ^Z92D@LI{-&d9u'OX\FE:ڼot'por3 U=ʩ^]SaA2dsDQ#e_tH_zp*]$5 K`!*[YF꟝.(,AWFW}o&W=}5Կ*u"4!;q:sݚCw~؅~,n468U/69nͳ{羙C/^Y;Q, Jrx0]}Khڵb<Al?[M6w7.Y̑KImUܼm=siar$:0L6oͭ.{CQ5_#q+ (*tEĈ=KP*-0Ck mÚyC+iw]mI^ +~uc161: q ҄B >homZSCIsʡ'Cfݙ]Qݠjgg`ؙv{SO$tpNOJːY{aaau軻/_{l>pJ"Mm?W,~8ٽmZ0e{hW>=淃C'At7mO+"{{vD_avk .2"iV]x [UAc24AS5P=dS4mR+@A*܏Ksjm] +ŐBᠹ8DqE#,O* J D@.iDDp:y,S ¼d pZDxyYWj@f;P3ʸ7paCZq ?8;kTijb:'o =&s{x~-z@wŲ6H C!3 j7 rn@w%© N\?}ȹ5[-1(45m=\s?T\O'v#/*MSj]h#88i ڏsQVP\y˜,%>Hb<'Bog}wح9ǮםmK>WK~{׈-+;a,ֵ?]g=l\賺FL1M˙cO47Ll82  P  Hh(&:Pt~n d(p(v !"8"b""$%%F%&6&X&&'r''((()0))**,&,z,.d/F///0\011J1123334l45.556b76788h9P99:":N:;z<<=>n>>?L?@@@AAHAAB BrBBDDzGTH|HHIJJJK KLLMMMNtQXQRzRS:STTU0UbUVlVW@X0XYYPZ \ \|\\]]^^__` ``aa0abtcddenfggfggh8jknklnmmDxb‹*>XF8ptܐ8pnƓ 8$n0ҖN̘2Z`b@^؞h蟚 (JF,d£z̥$jxc`d``tg̠L@ |+9zxKJ`ߗ؊_@N(Ig-ty郼 pq-޴bEE$9ܓ oPX{|Y՚sp.0Q@3e\^Cg>ڼEsGLHV;CLV[ ;wxmVtݫ$23v2|fFؖW33333333333'Ls{[mc?޶k<F]X:cNp 80#p$88p"N848g`Y؍\q.E7%r\+q\F1nf9n[V5nv=;N3n;1 "FQB01S̰Ľpop<ă`<p<ģh<x<Oēd<Ot<ijl<|/ċb/rījzoěfovĻn~|ća|q|ħi|y|_ėe|_u|ķm|}?ďc?sįk{ğgwĿoec+<泀YuYـ5ζl?`v(;Ύ`Gv,;N`'v*;tvdgleBv݀].eJv]îٵ8(U&^5+8rXc1C|U 7XލE^Sv%q<_Bڬ@y9](dX,)a\U>Q˕W|}0VEJӎܶƵ9EdARh¤pu$:e,UmU%* aFV]ZBkDn^qlk`V6Co sa9kҞ E`LLV.`^ҶHwb9떡AFؚMLՖ^3x)< ?)/ &C;dž\h1=`r891CmW܏O .cuĚGP,@7pNXV8-т NaW)؈Czj>|=qNG|М}凵ܟm.B>;[^쎿hn*Q\C6DLXݔjSbMZOTϔW7mʵu W*5_Lab㩊 My)c#fMYpNJM)a\ԸRHSGhf(}͍>[цN-M k( [')5L^97gr?7T^BSGp /1q!?L}妎aw@E \ijC>+^k{:C>ksp(c{ o4t1?yn11:1a!;Ls&{c58Cqũ^ A5L38ݘ c!3 cg,٦ a! Y3cO:3'M=Sn a!§M3^YC}c^EC 9.5L]"rCkav4*jC>kL'{5xzcKym>1!r.̐sC޳L|agKc>7_ژS!1?-ƜO3lU |F1d CΥ[ yo7ϴÐNc?~ِ/ wzzm;HSX2ueSX4 V6{&*qoӴX/jzuBǨkub-ӤA915MPg`lX4 60xirAlh~L bc\xiAlbvQ965?G&!fG2*9 A,mT-b+<4Y!14m!3]Mb,xi*Chb'c^Φ ![WzxQ>v3n{T;{f@ަii.DkfE84?"iWq1YF8Ș`ĉ84{"cP~CqQ5;7yQ5;0^xQ5;^`T/4M 1q1; Ƽ2wl1Š^7N5ˈ 6Ј0}54a#>k3M݈X`kИ"C/{4#.6.׍<Ԑ`!rӴiG|אq! qA5;2ϱڐZu\g{Sc TFß0JLM6jMS TfQrni{a!ƼNRkqCy՛Q-7L>R|ՐwLK iT H ʃiAy04>ʨZVUf1FOuF@i1c>7榍FiQB֨UƼfѨڗQ=OѨ m3H;:oEɠP:EUoQͰ[[0EGԠhgP)A`lÁC PzbAas,tq ְxRm C \5j6(6UMF|Ө\bTX6ꞷ2/vx $Gu WUYUYuuw]G]]]=WO=I #`[20XxL s --F-6=+/mن̺[33ՑqNj^B:y S‚p ]d2AR&\/(``U璞Z/:A^M~Byd, 33{gf9p>;x$OBI{: Xn;aFȺKH\3 OȪRО]/@zZt+ ֹ A撉%y^GnCccm鿫[1{ #vl*[8dZzr0cE,݉&e-Jɨ5t7aӅD𼁝4= =s*Iϖso4Dg>'߫=_p;OV̼*%CگZɞqF[ǶK:aH6gJ(@D/Z1FȜ/~&$y>g[ŋ'{ؽƠn073/¤獨x13ԣ++^t&)AOl=V9r /yPBjG33Tϳ{$9=m?} cB@j,/0;3g[fupX?) X#}T)atRĦ9A@C9MJ4`9kkv\k}{Ìm˘dRi$b'U!&e8)NuK& *ڸ>Rk{09[/ vN1zbgy)U?3ڞ_|ko+oQj'-DZ憨l;s*Gd3A sZ_?xxKMafϤmr: iB:nX:9 !_P,AU(-l$reS7Ox7a&ff;$*n]Xaĩ _=O{H"Y1m"=y[G}׋iǎ ƕ-C~ p!T`'FT@Dq)x# s8O$ qþ#tjLZ;>7wtX(DۚRxy.'d2r|U}|&j_,]gGz1_̿!Hm_/ә@( YةJBUi-agXLճ2l ,j{gtڏykH rC9Ӄ}wm8 |. vW~?^K^K1B-.lT<##Id7)9f+0LA"SCF -IYfK!gr>Q{K.',p$+0K )5Dok|'ϵH~yyy}91HtvO)-K^!k[S߲.\x~}xu\ d@(,$Jn iȘnnf+Xi_ؼLNa Ώ%Wkq\Q! 4ZXp-0d$iz_zs1rm"3:mԺ;QM=X![a<$J j eG<'TՑ4^"bŽp&NʅEQmH">ًd;67NVv0SQh5-sj$3n1lEU|w҂TOCm!E3ٍ::Wŭh,5z!?m 0 ]]@RJ"CC4ljK:P'[a޴Ӊ&Ǿ.jsŹ)uCy[r՗VB"m.*:SiKq\ X&J d0gMZJE<ơ! %UENe:bcv;J<`Gx}X~$*Odе)ͶkLޔQ#$MFafM:TO-u¸P*6 ,q+\+t2Rמ'R ;,d*v!XEWY p6:ͥ8,eӖѐf'AH1_ |\Wy3s' [W5#̦s禿P@klumEr_cyמ*ƿa7FFp!!eykR5fF֕C d_l_|]3`p Sl1MËMPL+V"u+{egȇv W 7/)crB{Bv/ w8U#CȀE6WM3Ġ+la 0d%FBPośMeN!3(r%jH˲Aetka"l|2qǦWY1B&cН<_tZk2s cs'3mPM*PX{` B{xwvu@KGr+,),~''1^rL̈́vЙr"UX\"V9Oa}g"eӐbU&hlI&rH8&XUxeC̦äB3F2eθd/6 HF #GL#{s|[  X٭63cv9Od'Qӛ0U9H# eKg5LϖҾ}KSsilY+džx΃I^OغlH֣Uش&ŝ!(7yEMqrO_(Pmu9p2|)(2`q/Hr8&, Zl8}뗂cg" (!+VEg?י\nN7|'xۧ]/>gyFCjRmsF׸kCp3gx 'n^ݻpPG49{b6-Eo$$Ti?ܿ(tW n &̹ޑs;ۺ_E˄{w%Pza.IIO>pJ"rñ7M{r@[A@v#v!+/|2By>?tT,t.'+u+_VWrI'%=;~vj>V~;`o)= ܸYKPe'ډUx/a4ڸQXsPdzymT벌3^3>~Y]=;ka@ ފ?e #lr3yk~`K^*-%Eqh:8+WU"v8@6 @^QﴯBET eBSNx&5+8*SNr pcOѢ{4 Di#8(rxP5$D!<>i蛢):tbI{\].>(7Dd<}܈܉4 .߸̲3͎6 ־@yeg +-[{CmT*j>9 '3x8nZh\RTUDh eARt9a)MS.~KcCR 1}@"$)!"!bTA BKE)b ](G"{o>ͿqOvX>3I/iQEl~X+/JNw#rk0A)gg{3x@ }8mH6{[Dw3dݿ~kZslYCgB;@)Cn)J2Pcr#M`m(j 6QtNE#BTGTxԞ:1{FSvޱ$hJȏj;s{dNa@~89קw+JR( 8IE9%=l˾SJ?ݸOU7-w"[X(BI0Ӧ9SiB;m9M꟤I:a6 d^ wA=մwP>J3.X́Tg tzق;9(;4Aeb\gCy}<=3=]߮i.zEz[O8P^Ak3-u^2]@w.dH ra 1wJ0ȯh2PWW Q|T M>(RE>O&fl!jlȮM)vΩ4<=slXiT(U!Af};wq=.8ܛur0Ə 7Mӧ١ysua(P& Ecd*JTT7W1U5#n6O쫟hZ1A݌CAZPx9k1;&U+x8l06LcϾ r~R ik8P[0l*9Sز2N߻VŐ0y n s{dNL=hӡo+3a@]qSȠ Z`dB3i<_h`l}UIr|ǶX0|<-Hᡉo$/ʈKTу~D)+ˉHONgR$-Ic/wU^'~/40tZQj.OH"5T[T'@+`c~VJ;lʨ6qdbrY\`4"٧=HNTŰU.٩uu jh]`9˕P* .xɆu6J@ 79 elXmRU> |=?OxIf&:5*J#L U9<w 2!dufL>Ch#+^LD) y.>Ia:ʼeǵTFL,_1]3`A˪gƵW^O̟]9oqTV|P Hn_Z3E<#jJ|/< ?aO]GW=v >w)x=1m6'Bi7$~Y,0ABZǐPb>"96-8Ptfdym"^mzҺSɓLJC(e3D@zS$wMyaq\K0i|jgP;[tQ>Rrq%~vammJ`]qv}XU)37&t^F/=d("֣7; Ezu]+i]3s$tzeF܂Gd$B^]cxY(Wyy8gՅ|G_do70%$}p ^z WY]f <& s)~^j\Ʉ6~< 챽tE5x` tR\hi;Qw!ROsF<9\bLĤdL&WJ,)-Ude{1Ðt$Z{QE#zA\9jsfHRI;ar]NjYG~S8sI9D[(灲OAmW,Dp6U[ lm0"Zɇ^6fn Q שҦ3)lzөg[Ah'-|Y1I u򰻇Y~ s21c.lC7[< ɘ'!NYp#ڌ7[-H6#r1)ǹM7#>qw'N9W1(9fjTw1yN5mNwj@\_N\S-WCЫ/74&ϙώvPUUKrn/r`4])L ?O:}OXHL 2蓁TE?22ZM;d=iC]ۗJ=~i?9{y*bY3}o=h:zsa+%pnb7O~.f|N, 4ʐy?.O2a(`;¤j`R*iyo9nG:hvc΍9΍޶H>{>I&+3xQLi'a*_LyFVU+Nk)rtg*5cPP$nET"!!.=͹WDw9IT&z 9cGN8zN䭈a8q{Imd>B;<Ġe#Nݫ]$ a ENZ0|+<}̰OF QэIGg6,ǂ2ʹ4|iaF&B+;BDB*fZNT+Ņe"% .ЧAeHwn4"}bʛIFZBr'd*A"ƍߑY>$;Ȳ4DC4UI}(4`s̽4 #ipۧh?fß]F:l^wuD tlPcO1prl7:H(s0߂|;<*Ϭge iY~S"w04 0uL9qrgtςb{EU'xGRE]$~4UKE{CBSv%Q-KuKvj(' "4b̿5)TcTj3=u_;?G:qzKΩ1ap4k%MJ"1|yT,UUKi }rYajgXݤHPe/M더zoEgiByN'7<3N$~CIHiE/-ԊclܢJ AN >s|A+]/ b{6g}S( m@ʥ*)&RJ][IF>@ZDW2}(>x,܄PW' XդH ]=2,+EE%LUsUyHKpeRщrl*v)%F4%wB̈́6{y8`+fAo”;e{g1lln3@R0-cqb:6po/t U?T[hx6[fwkNZd?qFT>-]1}䫂4( NtٟJkj&2^(9/8d1MJ iBGQ q^c|,ѽХqa;_]._4~Bcaw!ͬD@fF|$n(3Wr;EMbųOm7&-{y>N pda쟞8bq)r χ[K(QT"t ܆1MepC?Ğ\5O;N4:~:έb[Eg2$p;x̌_6Q>b=B)\HOV$f<WXf( iDPĕ~ؗoؒ .Iy []JǠE+9QLӻϳA pf BQ/+@o*䑀UvT\!Wsi캤N-'vhb@&Kx#J䐎evWW^ yeSxs}Vٚ04gⶉ#W~5)/@#u.g&v=}$y 8g&v.*L0ZD2@Vgt3hgZ\񑏠Ѹ2>~}ef@w1܅z Z3pYDF:RɽGz lv\nipsG nC&$DϨl'(?qeϥ {}esKz9{DIH?~t|o&{ULRhiU.F43VZDK.Z6Y_[DnŘ]Sc(G=CJ,ɫj£ ?Q~?Y`&kj=ښh8}ES//5܃צS~\e%_pKd}yqMr>nAǠ,jmN+7 ¬э'i%Ф,L L-:1P\g`6:+AodLH_aNʛe-J]/ڑ*npA;mB?Q ?c]~ROݶ,Of5ϧGxϗUGx6vړ|{糼*ߐ4MI:&M ƆY?86*ؔz_Ʉf3dw= bhh{57D z<3`Snfg!j5UeTVT$S3ގWsW\5;Wcw0{:Po}:fU"nMWͭS/̢Nzꦶ*34aRGZM$yd 7P= 'BvQ4"#xLWl! jWw3+͇rΝ@TV"q )U!g=&Jߚڶc7pPRX#XJJ](y#~cdhĠ˛*2*3zЕYҢIK!JtlqK>,EquAO=,gRY<ge>kqyzV*ͤJd1Y/1wIe2#aB &lM>:?(<A'Qٔdk4bVZ5KUGuuYO}]?_,5^qT3 h`c?A)ƽtkІiۦ!g's;Q7eXr9~1::Ϡ%Ry(9$ˡ8\gG)ao.i5 OB4_h,=ʾ+to&:@B9mS$Q{YkJ* q\@x &8_-^gl)ӺȽƺiZԹtڇ9 :᧯Vr9Q2} a>C}$^Чzo /=Jse*}͡/V+1DᧈSb}/m*ҢVJK qSL,gV[LrMɹVu7A)KWKՒ;SN'GT}_rqi!>2>>_oO/W #vYo\\0lc.5܌&\Є߹s]hO_aG{i3UDŽǹLrp(Y8r慄səNNV I :QpO7]#oxXFoJZU4TkKR;x@C a>` HFԣRFy~_+/J ZJ4!I-œhPBk~@"wHo(EQ h̓c@$z}ôBuo(:gn;8)ڹn>UT~CBĀqB+S=p'I/ֆSyM{|vp[p|Eu|k%0-V6Y~i7_vx&l:e\҈vTPm~rFCvԴoh9ܮcH>A=:F[p}KU, 5XMɍGK H 4`NҒ M@Dh %ޑD.7Q\vy zNi۶F1rr6і0P44B-lU+@f!! _l5DMө#uYvpSIZx,;2:w޸de;G~9 ޡxD< "Ou1svw\8kl~kkPyy<9Co߱~;ֹ (3Q?C;Y]ڟ5}Ð?-öuߛdXGof9 ˃if \aC7{P[]ItSZyU7҄NV*>YN7٘9ENkckaR~1kMx_x#wcrFxڋ)3zHDM3 дΟr9 nҪ#G gy)VUmˈm1X //О_ 7*z& Z[C{S?uO6cvpIDH0MkY v|G#>) mVkN `c[hddY97SEXҽ6+ǣnE+Rɤ?cԈy#†؟QvVЖ8vBg?FɲTab%9T wl~ip$B~ `OKߦQ{oi{R>Y-y\=M;~W:م$ЭEx#ޱ-OJCJxiB: ӎm!V'Pgi]U9%ΞѺA(8c2unE152tϾ1j~UeXe&o_z50GV4ejr)JURW6&Ёku'z Q?-QʐJQ#YOvD|gNF]B⺜q8LSePf/%0G}R1釩dZJ#7}|&Hlak5Mj[D#DY15jv}';As)#KIGb`~/ CddHg9009ӅOJ/}e^ Gb@&1xYGvrJZec ΏRVZ3l幮f&dg5:BZi#0U!Clx~ p=Q?:qto|QZ;@}s͕V}{k=^?T? `՟ ^c[{E_z_i溩i+-shl"}Pz(B4ɝoɯu%ݑh:MgWI*Bs^Wb2 zDtcS `֓o%ّ4Ɔ{ybp1ytvZps-YKc؟Opȹ@6~-{RR>14@ښgq|h2UbN{uxdV:x^P^[fNefE>\rc|M~팔jX6a3u(Dz^o O  ̺}.KEZ9@k߸IKzۏQuY?ۗ[/$ҟK;[ yvy7?e U7JA5M3Lp,P.sHpzCbquiHU_sX͊)) 6ؔA2"Jeٲ(j\7eʛ&$s ӚiPSXZz<}"i(i@*F".-Kiۦ$27J%2 ;] nyG?߹)kDJ`Acֲ#UoWQxils@-Ze&77Cۖ\{y(m?4[\u@j.H:p\e=EueDh<ķ$I3Gbk@et7P Q7)f$[44ДHFl3ckQ(݌)U"DTWd5ӱٿ]%z tJDjtKL&ԋ0A"Zk*4k-BAH WzĊbeDTSߺN$O'+{.Lh^fGnFGn sdƛȂ*_r8ȸϘƌ{ebwYr0p%X @(UT%E'^vg~Y,Z<;.{ "ҋSBS[$6K~7ivp܂VA;[.?R^qJxPxVWvnB GLxffTw6gSK8zO;mi#%KC%FseLx=Q j> 4//*Choxjl2-2[?Y.& y:V+NSeGŘB yGwB@%ľDBMѣ &'!\I@$ d$@4aPf;&0qBѴ5,wX$"') ,tbG854Q~Gֵc_#| wnv{ M;dEW.Z.U~Lש\ͻG ` w| BX9=ӷqL{섦Ŷ]8 xѡ 3x{?a~ߨw )~JLӢM|v`C w o#J#64<y@K3LUiiʚTirF|yD"ъY%UeHDs4T@4MWL !UگPYQ JDVU "R];jER%+hd~2o 34O[PGQTTI5R-*ÙˆJ&Rj !̄tb y_%46 #D|~ w;e'c錞$kJ4Q&)v;3,#Yeb3 A8>c$<Ρa>6vps庐fw锚/TlMXSgԿprnILJ;?\n#9vi䯧d!Z[6cxଓWgYj}㗏l>)Ws73M7jlo14=13?6'Ѓ兲 ߑߗ=+,ĵJRo%.btɖc3huaVHu609 ({p%$zxFumv-4#@GOE |\?^~U~h"=P+PʦR)[w,䇇 ;yKs q%ncW=+-/g\v.qVrx<ۚD&Fv."^lɌ9~ ;sh&*Gg\ #?;>by9[Iڵ);1k%L׉Uz֓%']aIQyEU͂~S%uo%Q WyUVVUVe]]wuWWW_]=G5iF@Hb-2w .?{X6  F񬟽 6bƥDfVVuhe~߼Ȩ̈Ȉ7{#LTrQ% 7}:} ལv 6VqneoW>͟=AOyR=nǧNj> G4p;oxxaj Hy` #Ȕ*SO, \KۺMmK!Aw$#6X )yȐR}k{.hHAAOgw(ErÞ{hŽzPFtW\s$ǧ<CТlA/WjPHESqg FJ SQw/ټ #|!K}Ym4P"Pxl@\؈1QMtHd }kN %W\ye۲W^R2 ?$ B ڴ%IN0z6MuV% nmΗ* X>J+Vcdef mAn:kׇm} $|=|DǷ1k3czw*??/?lPc>͒!(BFHX :5B.(oRB^ꤧ0;v^b3|϶m9ؒM_6]=y@[F]AB7KIW 0c/~:u'<{~k{u2iZnjnMv󽘻,G[4Z#oBmec3*C6ӧsgI^ܪΛhɫh)6=+Nf6y~3\"&^Jm?QkHtt`tөBdz+q5khE1q? UQS)48߿[Toߡr8 [GcQ(x,Z{8tǥ%;;&%p+}wՁ[[q/ 5oq6!)}I6c@=t0()@ Զ+J;}BrY+\ 2*)~XH\ԭXaPq4vP^ !4 ŃKB6!I06:8惢!N E"̝P.%EK DU%\0w.?H.jL2Z{RմGQhlLbSX};epƽ('C165ƭsIpV' kfD]CBakKEϒxe9Xi8j^fп/.BO;(ŠhathTs= VG"CGI"OF ῌ] 鶘)Wra pe'O#AEf1XFdk6nӆ)gYyS!labiϓ8k`K>POSKW9GHr~kF/˛H`)pYù_T+""+)khTcXo 4E,c0ՊJjMGGюF,$arXD4H&HlYsfhr܌!ܛTeŠf:M_er1Xd(lqrHX$jci ԦbYO".ڜxOhLh&NσiriYLAԳKݗP?0܏]c CG#k.7cn_/FX28ߌ$Ax=AxBeHN^/ zT'OެG872$e=o0@W RI4RW>>/=P 젍fd3KdǏv!w EPЃs$- UynSOzA,p9k dVC"sYN^]]TJxC8Y :ޒ$*9"& ?2Q;#rFAIxH\J UPɓͭT}|U'!EMߪiegDK؞uN82=j#y'mX> D C.,84]lf&C!P;$rMfE>K%b^8X'\-I8Z)Ev2i8u#E_Et.d$K8kRBփp9eY9{&$YP 0CCIC'ҴB4MN{"5aMc&& rAGHC4iDt:4no;[|] %x.v~k'm|_9vF_i{0+bGV+Jt!bLň)%]eHilDoN;ըɢ -*GdS3YĞ.d5Iؗlr: ˣrTd*ij p:1H'7[CBvqR@~RJL]ETIX0R)w?0j= {Ӧ8C+KDoq:ӗUu" ?A}Oa%mM72=xC/ WVʰV .:|m/(OLPt&;,Ǒμ[=7"+h#Bh$y'(xm gWvm71H裋p~}uH_R7ⓒߢI&'i]jaz:pu{LgǗ>O?Nf1(~|gS^e:was  J({-&dQ3\D7t[a¿< uӸ$ODVV"E2Mޢi(Nm{|V JM69y0c|U7Yņs0q1r1ۆ&!lȲ֘M~fTP&knjo_Z,M DmHa#a?;eVC#vPu649,cuKbxEc`Ǣx99I%RL6}}0*Q$:r`.^'WoN.Wksj<Lk [ U8kAc)WA{B>C]㦠AClTmbv=i|1c2: Pp QR/{5%ë5Qs< <>xxX[RG:+bI\{S02kA_ S&+Ĝ/z c<2cN+ەVڪn_UEj6/PEaqa7@ى#+ͧvʫa '_;5G6NBCۤ J"U:_s/AEq~H^/_}!ab`=eqVk޺ Ho>_k9B΋ɒ[P(*Ui6MZ!ܡ9Zw9 ޑcTY꟤ R4;.0A+o^i[lM0N`bR}([!md`''K.j_qn}܉O̍*9<3:wb~}VV$,v˯sE̴^f_WOl>f[^Ӛ혧%Gqwbq$e%gѳ 24`Rۅk j h`b+WqAz$Ǚh׾>96[k;f1̞5g=p&n8@q8n/BÆ1rc cL{<+SmA:M#Tiq,S'Xm:1ٺLj+,H#AH=pG_,Ff>1uת7wGcIK\,~;Q|F4E!EM@R8,(t]q:<|p4A!1M$=1Y+9D1ov`E[ǩL< 0,;dz^$>9.mCjw&''$ڍQV B{b:oE؉Dv &gss,׽& C!&Wt3G5zjx 7|tC,֪$vC!_( aHӑ fcOokvX~ExDUP$Ԭ >nࡢ0B!H1 ǫPTg )reǽMW%O0\(-nMP0ٽPneӟT.ӥ|0!E&P^|5Zw1a/ϑAS|:p$ͧA}r*.ېxJo0/6=;d>ȧ(~H̔i)BdvX%k$)BuprfjMf|JeV&yCQpCT, iH ?$T:Eer*DIӜ$뫙I-W#OxB yK8_ |gGў"|p}aG1У].}P^WYcx~S_KOY8-Xyvb`B;s &ϳphNwkVX"({;Aa0 y3ଇ@VszY±fsՀv`9i{[dƪ !ShnSʓd"AH%CLgȷ=| qb~9>MPGXA8 ['H?6=L7r*ƕ!}4+ʚr"B8ڎ-Q^F<j+o3zX 'L)l't=EZ*ձ& w+PO o7񷓫 eM7pݼ^D=DT?~8~_|u{jݯ"]NQŅ F}Ei׹do@n~岝s31Eu)Æq] CQSdleť]Ɲjip34Bawvnv#lםbpwV;: x8pKK4GTp [ Ȳæ͢Xg.NpJ{4"j>@P ";BoYpf-d\y2*P »^+U1u\WjTx ƢAk%?ۧe¨ D:HZDWDj$"ELCc 8gtHLPa2A1MDw)+Od( %(u3ɺQ1и,v 3&WouS){}oplߤg\3L CQIo2 Mc;< BFTk*L064c,%t!Wsi>bA{:.qɕBZb=V1LXH)M~J'UI%-]IwIwҕ툶djPӒ5"zŔv G[T rUYI{F|ءVVt3(;s&:g_CWJ~IM&t#$P^ ? !$LhD;g%k>s_u#N-*(~ɶ8$)n%aqwAR](Ŷ'aj*%hY%$g鉅(7vHp?%2۾[>D )2.\K%n~5gΙ_#|G6  12Ynj.+VCٙ~}&&'p;:St7Yz20 2ӕJ*42 )A.4$w\E"?6 oƮf!9[`^ձ _CE&f^IJHv+NF$ޖKcuD/7ϻWI›P0א,C m^3˜UMlNQGX,C<-"LM +-*46O~De#l"bE]Q m "[53 n*U3\%eDyQO͗GRΜYO6S4S|%,zXJD3R" ND)0]=I-Y&}@툏,)g*f-3!E/t)۶. '򡱆D:hF#lQ&2^_ o䐪9(62b3ҵP`]l,h=kI:Ie7:70^Fn:%`dXK5gH]W@7h:Oz ,^gF%> J摓q:f9Y$f[ ƒu]&ex^ElaϿz0;6R#+wыU"{\tf 6"\.SjÖ /Vk6tֺ-#I&Ot$r'EB^7#{ёea9wE:T*l;F8ܿםeGHIs9Vp۹cU{:t{eb'8yݹ< ;MAKk{{HC~'}eYma@s#]j~.<+a"%tH}iWUx0 vPa^@{.\ ;<:9!{@.WrCUl_$ ΢B A5)|a0^&XzY?x4Q$g @zЂv.*(0RX6FP;.2b.XPJtVIV,$b1E<ZO:k7L=?& ? GzŜyc#I^KK1h*K.lE^trL&>%9IMKWT^ 2GhȒFw͠!@~x$ C_$^}l=\52{sv} #zNiT.NFG(KG"C2Y9! ;e\eݏI.hIBP!yrbP{/D( 6twЙEjskɸo2y#TCM`~L<;ɕl2;̾28+WQ Ixe\!Q$ Ŷ aFF jF~G0Ƃ%pf%C |l$z(ɀ$XO/2:_V;[e5PAH'ËSĵDhp^IDe<;y/:wB2-e 4^'nZLkE!ȏH@nH<1l.Վ4 yXz /7j{FtN8jfb&{^M@=djqR9/ɓɣ:~ 8ā+_.@Xᄚ ?Q c)jЙfsTb >T!{%ץz3%Fg=ڻjLBĈ.R0شgTeߑ 3@H@7RJoHmA5$7{ZlHQd&+a>W38Du?NFb(c1l${_a^Yn|qd|"lijͶ\#uN7X6"zPk+ ҮnhA=b,7y;t8FQ[&3ԹLѠ*gS:Lb=]`4j<L<<=FeVL)dEj73nce,N؂m43]b3wJw2VT0`L1:qA[s6[ہ3sB(l2,Yi]sgo; p¨Kȷ%M>!!,tRƝllܫ C]_t@;@X8UZ $d[[~& Xr@z0ľ_m O4ZyqeIcLE/2^_JcLc2z.}iدԄh"6vr, p!IUC2T_g`'z=~aZ{߮OׇKS?!1V `CŃZtAB0H{c[B^Sj}K=2yԺʏF1A2V+>?U2P%ug|hXJ'vD.=۪RO 6 s'{,Z}a:w<D2y>hOPK¼3|fkI WKؘf{!7vY@IUyPt5#G-khIc#K107<4BNHJY#"6LC>uOei݇@H~O5~5ꋄi2>SF`1/,Ç;8 ~.oHBCwS3|$l$ ieOc]/P{g tB:/MvqWq߷ ix<*L# ˄ge t u&i-d$͙ t%CO}-˧y+}8hX9Q)1D/''"?Q}k zVj1@LCTw/3gh^0N'԰Hkj+\cJphnfbfIt ;aiQ+)i8f #ƱB$ٙ"{h$9I4C adC7TrΉHE*'jmKj2IhXqCE63Q1 k&ЍlS;v= aX"۪$[NqR"W{{ iKsdKI}j )Ah ,"?s{f}t ^9:z卐;K<Ir\1B vj@y#d_{=v n0mɫ*Py!]륑ZBHŲocV0>IYi+dжsG5qqU%B,/Y /ݿ%bBVBjT<וRxTĝK t/fDap9S_9:7 ™edhI m^J.1F[E?H P(M雘5MNĵ!!CB)-G@ oF7awcA!RR Ì~ |c_%s4^{ߩM;@?5d3u=BsBIVMвLa(V :*;'st`vw^("rJ3{ "qd'H-~apȦvx϶k, g ^)iq=d'ğ͛w)0_O%BFXl9#1IW*OWorBf Foj76'&)h'Q 4uj>HNo|_iyPX-f]yfZKir( B), ‡EC؄"q&VE$x>o_ـ;a *$#9k<;pYE}Kr(C 8P^?1_kr-}@pwhL.62AS;ir՘,gնa;ſO(:_.gfw g7n 8x8<:PɁr=xEf/ݫ%ށ|{R ڥZύ(Wx"\ޘ !ua m|9 #I0iBfؔWk"xzu|O^k5t+/oD*&駡,eG ?b !]?# ThsY.N:-s={r=8-ۏc7{^"[?jnf fvF Nr&\B:l 0 ( ~ X  N b <tnNJt f|V^> N.H`2phBz " H n !:!T!!""x"# #:#$$V$&B&l&&'@''(,(()))*D**+~+,",H,,-.-Z--.:../*/p//00r0101n12 2p223x344h45@566f67F78 8499:99::; ;>;\;;(>P>??Z??@@|@AFAABLBBCCD8DDEEbEF FGGfGGHPHI@I~IJJlJJKKPKLM>MMNfNNOOtOPVPQRRRRSS@SfSST$TU@UxUUVVbVW$WxWX"X^XY4YZvZ[<[j[[[\ \\]X]]]^p^_n_``F``a$afab bhbccdcd.djddde6e|efFffgBghh|hi ijijXjjk8kkl"llmHmmn6nzno*.hʅ,^f։HΊVЌZ"btΐ2ґʓ^.,ΖJz֗\ؘN.8b~bxc`d``A  7xJ@l]) B!-l .I)I&$CKF|\x\J |̹@/Pc+&ĵpN|0nw>rjB5xcwn\ p6mAzLbiչg&L뉉~?u&!ƱNt6zAڀTuJ3s묬M^ 371<$ F:O>!c֘!yׄ:\XN9};Y%eǔ ;,[^3E5wD̄<[3gJ1DW-p>xxmX6ݪf 'waN9fN.̑mu[ۦ 333_9P;=Fd JEY8f? PUAЄ8L$̆9,K, |> "+**&k:Іua=X6 a#6Ma3-a+l l; { @8CP8 #H8 cX` p@|0z@Đ< a 88N$8NS48΀3,8΁s<8. ".K2+*k:n&n[6/p p< <O< </ o 'E|_M|߅C~?K~GOYX"b &p q'q6pq\ĥpi\3Y\Wq%\WUq5\5q-\6nƸ nn[pkp{wĝpgwpwĽpop<Ax0ax8GQx4"C]cC0D)f8}\x'x xgxx^x ^x^Wx ^xވ7x ފx~Ļn~|ća|q|ħi|y|_ėe|_u|ķm|}?ďcdVyJ8-$.^ys36Y QQe-Aݲw҆RtB' XYȥpYVEu3mJ$OE-Ӌ~,'/m/G3%z3$f,y?ʡ]拪YRa_I,Hۮnz%>%5c8K&ldșQIQސvC o,i2Q2U&2<#hPU=P=d$<=\)TQanOr9ݶrY *2xԧwRkaCɂ`!Yyԗpp. VHSuGDKV'U2=6 +ӤԄNQ{U7!#^s)S֭:< P|UKcj<&~no"Tk!MLMw":4 kȸlI\$ -Xhlab 1kt3DYR,'AM$`!ZWب(DƈpOX䵧_JJm=ݱLI o{D/ >B0*6 RB/wxHC=Վ̠M l[m@m VH{၅"iHθqhLԾ3%<я5MX0Rn&eQK:xVQF&][b'JRK=YJҥH0et.]g\(K6]Z(uc]ɼ,?VT\ _\ 4uFGC\>n޾Q}|bOh(8L3:YC$}IBX*;JüBn, e݂y3%TLku8K+>%X~D,hq&>HIc̤iR3ؐWE$-*<=+3]2R6*ȉ)PA!N;OQ^p =>ҿnaV(I1XP xGc56VlihR DGKM)j_"JLsUW&@cYP1 t5Whn{2a lfXDHeU@pJ(D nڈEc!K7Ӵa"~-umLʎ{`SVԸr'B %y:A-).$1>-hjbG-!0vPSp--q[d~jqJaH%ϴkD5cGvWY2,2gF´{92S~|E`B IFND̈́^J֯{f=Mbs2%ILڠv0wɺ ]R0SUأ0'q=θflRs)! tyq5C^i~ Xdɍvcs.%ڜpM$POP2>HTR-xӺT-֥ l-[XTckFNCNq9AQ&|BAӢ iPQ0*_8E NS_1!ZuUY&Fjn054X&,(AT@/O)T/Y2aCF 2sf<,)grc$+ө*-JRj.U%d#YDTT2ץ2 D:(gN$1Te{iP*^< аբ) TQ5g9u6ٰnu%KDmPmo9!y;JOfJl$$+ łiN5c97^r_RnYT'zeal-0.6.1/src/app/resources/browser/welcome-noad.html000066400000000000000000000056521335333561500227740ustar00rootroot00000000000000 Welcome

Zeal

Docs for everyone

Customize

Docsets

Install and update docsets

Preferences

Adjust application settings

Get in touch

Gitter

Chat with developers and other users

GitHub

Contribute to the project

zeal-0.6.1/src/app/resources/browser/welcome.html000066400000000000000000000065241335333561500220540ustar00rootroot00000000000000 Welcome

Zeal

Docs for everyone

Customize

Docsets

Install and update docsets

Preferences

Adjust application settings

Get in touch

Gitter

Chat with developers and other users

GitHub

Contribute to the project

zeal-0.6.1/src/app/resources/icons/000077500000000000000000000000001335333561500171545ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/icons/logo/000077500000000000000000000000001335333561500201145ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/icons/logo/128x128.png000066400000000000000000000551501335333561500215650ustar00rootroot00000000000000PNG  IHDR>aZ/IDATxweU ~i} UՕi !  ,<=~01c<A&8`1&0I \9pUH}k]]pqqqqqqqqqq_|MN*Gy-ow^~(59'Ҥ01Q(֒R$ҦXr)BjPZc"Z@Nr 1kJˇɉyrf?mq؊v!@kvѣ 1̰MgP* ń,q{2 bF,e hr_Ob>2f]u7 CGN* {C?0Ήŷ΁g/~˯.͓2/]差<'O[s|S~#|wwŗ]?GswU|)?̣unco22GW,_}W_u ?znYq/7Ox[̃r9ǫnMx{?7ξڠF+*fu;_ٖ~_Ox窲59C&S9KL3h]]9 [AUccO3} ^F ?'1(Wa8 yv;Q֡%n^}!&w8Ɵ|m] Go;nf '>|YA9.t=E\8\?z&&Uغx[&]U7/}xӛ~4?&Y6,Zi2:B$2YG!bya,ޓIM視x1;!@N++17FrNʁRD(k)cFW׳#֠8[,FU[ܣLGSFU&n/|C BTe Lc- 2EH9 I.s/ HYE4I>`T¬N awyC{˗[.eoI5M?RU*8gH9c=1%B y흷&o D۵5AR&k֊$,%eJu q$9BA1%'>3(I(IZ"} :%9(9\b{jrl@r(9JV΃ jȠc*M$ő(&S[I`;?H?_x&5zw_)|_xBrk gX5PN4 RJ>=$o>|w޲u"nw, hdrjb>Mm'3>''eQ&O>` 9C# ,f:A)HGJGybxhVc ?QAe!;Rr /e**Q&$RʐC!C@䘆({0#!pa}!zg9?w yo:w]_~am}O~tDΙ埻ʴ9K@դ'N3-?w`%EO }-nu"k (NBΠ!uշ=!f0 ]T9DUUAA` Xn:$ǡG.ʠFöG7*DrE)MΑ`V&瀱NsT =iNENYm ˟$Almp% )sÞü偧xNP;% 7$y>!tnmRRʤ$7hB)¬'Djt]*#H0%bBD][RΘ9+BjLDŽEkR1$5`5 C{0lI\OG3%?$M1"Jr ne,7O|sɘ۱#?kO=c('. FK hYKk4$C$(!E[{n6"R"L\$NLY2$fT*-wwhe PZ?f-~sUW" E.;vPIzO*%RTUO;QhcH>RZoVOyL96$ݮ$yƠDh{1>A>ܻm)"ԣ=?'?  C9xTE]K^,2C7xR4́3/'gI>+3tm%8);,m`Eѵ1L&$uME e5*f|ۓX! ;'¨".:XܾD$amVsm2<*ghnQ1;/5$LmI>Ƒ|Ϫv!n`Y_`'Vr/޵ߚ*_yOB3XS SaĘhFW)uXYmbAЩ 7H$)2ZHa%De" Uq%9hI Rr%*rӖwRFI(C6D$_$m3rޭ62$3+;ta։ۏ-aq$ͯ0Qp' [dWk ۘƱ<'ԇolb!b/'L(p}`-HyE[ p<~43̀2K[$Z\ B\ (QVAuk@kHXtRY#'vd1N\,Cns!ĹG7{tnjRL1fd n*p8DV@.<2ئ"+P4佀dF!T .4  rAQ;.z9}ĭMZBJT ihqcr ;Q4(yO-.?>DUXkh5ʈ&J̐ijK c46?ɰoyivcF g%-v ux){)3O,=eK#9oI>IL4Z.?k]ϊ`t)f |I@ԅB+X9ژZ&0]a W$9-h!ggx(EĮ>FJ( y>ͳ(i*`J1$49gB4}FKCH&ƌ/5"EzR@`JU/ƬAUcƷR- g٢Umw)VG>S7i0ƀQʉwP&e¬[if[b KʎJ mǫ< $ d%DL kY=јfTQ|ҧcMdy|ss|Z+cN:iC@)]эcXl)PڢMK =L>/q૿ >pqf|@<5O?_O~$%Њz"ׯE;߿~g oAʑ3Y|/1*q[%l-@k|~m a[yfx$޶~Wr Ukþ{uAuKǙ6'Hs 'N¯筏ȉ##nR ĮRq$z\gW1#'uɥ~fʡDO?c"^p KITDn! =.RzM^o sRgqxʖNxCBh#b mq€VƢNͤZ#3B $EF):Wˋؓ;Ο׎Ynτ H8YxqFKu%7*#y|>ƂRW?'oϤUҞ@ąK1lԻW8q0rNYq=YF7>0|L!Q,6Zm6@eP1NVovNBc=v:HTNP[8Rt?9G0l,*JZiS[g=d<$TƏEMaE"lrLkcVOu9xBawYvESFZi|~`*WeGJbbEpao[%*N+PcK 8[&!L Vrl4Aǔ3\]Y$GZ>t-_*] eQP9iVwϻq1㩟y)V9%wSerPH"l4qH%އ2l jb b?@cO}x/8@+X 13OCX_[X0D>P׆n>fC)ucc䋧=r^m(J-q;`kG&TZNʼ,n -ʔ~cFi> )1o#xH1aWFp~2 :S 7!$ؒؑŸMTm0VSϗH N*P(R&pn[ #通0\3X.9O%\MC)3O3CH4I{^.L7_ϗV6.#SI#0DZ;b'J2%07n[=L{vS()g9Af:";b)vYLrLmr5Ac|Wyw_9NϣFk=}$lva`L7aōݒf3j% /l)AJ @#§l5zI}>u,kSZaNksR(:S5' ݚ/܌[KPL-$X )4a /,ʐB)c֤Y$[ QAxir X@}fn?B'ɟG<TR(9iLeȹT U`Gj, kiZ) 0IhP4&Hp*tGq>f ~ F]y;XiF1_,P$W'( TUR*0R]xэ!)P"($h!s"^Zd 4q1zBYg',b& TL6UB8H/AՆu9ri AX ‹HPr`Y 03 *BϘ f{vR9Bu:&QX%qDGh أ|-ד7NXW21Apb,nn,X Ppɘ~{H9 1?g4rB줦XV|UeaH] -/y~)1]l'#Oرܸ"U [8@JCB(%h{ 4:'7R2#ٌFWn)QUrZg[]g45 V kBP &TPb7HɅdҠKfj)҇T.l j hJMlxncYn) CQ Ɖשh+y2Z/? u}!9cƇFh~gJxLJ&[me ]nxmϝU:vvIg)C `NJʒi ,TFl%}(AhޅD3e*FYUngϫ?Y`#<3'. A(WXWB}ҙj@UNnؕ{Q$! `F>Ҋ)m+($~\O۶2'ɠj@!T)SC{o}D`me7J5R-B- hWFd!|+ QE a`j0"cj?_Вt21{_\PM(]W tXk UFƔQ^ 78$pQJe[f'~kA31hkWsYl.Y=qe:؇T2{y?%=}o(zĈYmU0kq#;]]B֝GV8VJ:ʌ\T$FSNAYU/ᆿ-mlJŸX5*ZJfYk03Z5[$k!羴9$|_}Oe&xULc22JPkI g5ua(զx+4T GFVIZS9C=ꈮ+ԦJhUoӄn'aUF6Pz15d:(E% }7Oߌ?? )wT"!6ܡ9K" UZKd8q24mV}B9VF[NC$ӄ.6=$^ya膫hΡB nz 6ʒ24Rs/M,=% _E2K}D9_xl 3 8d'Ͳq34wq7}?{>M_l.><>bGV}jsI!㯦 CWR0iP@WF# 1$*:O Cn{)^A3ŅtBFΐ| Bl]%B kE2Pc+zz(~8#>J2n2֯/}G<~Ӵ;o2z{ۑ-)co1N-O׆+g>yh%1*&T!,pk#r?X¬I+OX,G>uUaCu5U^ƽw4^FvZE;C;!QU & :y5\Gx wu/%:_NLeWk28!2 ML ^Bjn.,y'!]Ѝ4~%B5]+6FJ(Zy/ 8"=4%hNpF KVZT<$: q@lhK2ZgHK *r ~:+D ɤfFӌ*L!l~@2~lNym>H:}oQ|! #%}Uk3›_ w4zN>ɤ2 7O_5\'m'Iw7A0 Ƣ+Q7e\cD+ɉ؄ :v; J'Y$ZZa Gh5X|XJR L7#k y/6 Hu$r!@p !den@kVk"3 =mڍ ꧴%9DHNI>aW9ᵄ?Q0.n`r4f yU^ƭU%jѦNCee4Đ=u0f%=n\;6DLѵ(b [(ԉs(6Za ]ĭB0j9Sf>@nivI'/q5!]EB0ҧFdbLԍ %_J!DvC|OAHcRҽ¦4T#-^5zZBD/5xuĘŅ _,m3}dv[H>Qnn&l" )y R2QNHy\I@I*t"SŌJv '{ͅTO&l=# PXDkp5WY B%%ɟ[uҝ"qʙTeks!@QZ]QXf_Φ"S2a4 GZnɬ2n o$NWxJc*LP`j!2)3$&) ru-Զ!Qk슓"b0CtI1Di=L#. %ڂU/x_ k$%TZd3;I8poIޱA) .> 4ϖj`%ZK NIzb嫹G/*}W3!), %A'>@H.'Q6ZԺLr-R"A.w}!+vwcE2exJD38XL-"0\1#aRJ JkV_vnb_pr ("f>P WƹBLĘqEgvbO=rϝFbMV_%: >쟂R[~S,}6hm<~yG?ߒlkm1cʹ!}ig'$ =v4DP`% ' 3rR94;Z[:mG7>~+kwaTq:̊=ì[w@&ܓ`4WSfeX̱iʅ} WW^yqw}9q%'xXoYmHA$UX̩mlmeKFT" ;E'!IY$6F]!c#*aVI@GI"ݤ^At'>8?-}#~#鑤>;7g5qf3CYRqr(8f"4JY1)TN ĺqy&vᬦ/wIЊڄ~",D_x(+K6#>`_kO?S?rg+Z!,"-JbV\:iBe8T%0jUJ8D)mL, No4+5GrV 3iӊ8DXlmcԆEt d\x." %(2VG҈g5 ZK(0RH2U3"tN3HH,RJݻw3OhXfErp*%eWfe i{q90 =_MakER[tI]ؙcVOQ\DA(S)R7PXQ;1 󡨉I{X+7jGȡ j8j!ߺXʈ)SM\|jb$wQ; %"ʴTqDڴ?1Lcx`S.dPJ3jZŞ.Lj{6ӥhtҜ!!7~ŀ[#opǮHZ uiJ+ГUƷM=͡{j{sW~ gO0{AO>ą?y7 3'}{\\_xnދ!S7!gyͯc8߸/0`Jܬ&,r牬2˭)NP0ʅt!3PAL#w2.&79iy3ηĽϷ?%Ra!LV|H`OOq~8Ss? 2T+c峣@3 `ކW"M׉[H*Z XkEw.naD,qUeƜH^H| `f8Eh<`$dfvD d'+~@?,L )ԴO䤤'$O@- DXr݌DsV&zߡuw}JDj#/? MK4մ19`"9kMEb!ROkY/ X/?jM<{*'\ky n a3UeF)USڳ=$ q!qڶ2Ʒ^<ŠuWE\#dUSJYd"T#I6A(}GHcl7iz(ܣֆ;1YnŒW@yYMϷixb C.Bl\L9& 9 U-C][1z~wc=݅JOb6rB-:vaD2D< jK? e1*" R2Ӟ_P5' rAIwrh5hΥ;2f~!2,"n=H(YǸK+bb'- gGD/RR&ؑ+Tk51F]dЖ~ՀxuT!{H LsJ #EY%(niEΙ~&b V_wl_Zx, M^e|81l ATmy뢓c'KPTb"1ۆQ*@h4dR&PzCPݕ$̹:I%#>ʤ ide]_s2&RV"g q)_JzEe; aLdX"D-zj(4t,(EWT/a]]̘vW tt}d/7J9e\"dT}ۧ~*HP&,]/S+M m̱%j!`BjH*9YBDLWb ['b- Tq3մߒjd.v+m-Ŗfb}*K-D!qw5)ʙk ~RIu0E v[%6]RkQ%FDE/hR [%qM cbWџx m4+7nY-ĎrhXciƕpK(c❟<ϟoF6Z&F<Te5zi' nLc4}eR[ODxT5~{Jfst: 4ui^.Nhcm* ]٧dD﨎-v'6bFznfLiE{M-ZMhŨJ⷏{{|wW6N5M]4j9;3|bz|\_$wv2[Nr!D^!{ӚѸ yX1^Ü||>>gu99Jfqڔ7Q5!-K t˲3Af9R(˜(z{>]ZC>d:~^2A Ҁ$.G֔3)QE 9{~J08DpRF q$̽h£L!a' ]=̠Va1Uc!SBgYt 5 BL z APb'B4+E-Jqϼ,|h|ʅ"/bd"(+.QHjÌ$P~"# i+֒|F-l4ɩڲ ٰ ;7t[mvT'(f0E(ńdL];1dEE2DDqWx-QDp9.,e9SUOa }UW[əc6IO杭j TFA Zڍ^j l(+֪<wOD P1d*[ 70=i\]Dd*^\l6z(Ű$h2 e&բ HHB525{ ٬%áh4+6ʐVQ" XY@Naj"V.<;P5F>9ԍG]m0jp˙~]&,܊%,ĕ02VMddEԗ4n$z@ pQ-bV;'xJ8;E]y=QEkHhk*MRi% S5(p dQԖj;ZC+IgZ.+UՉ^T<`u52>H_-졹vM]1_,D ;V( )ƐJ.|$V2}s֑o\m>Ra^󝯺ۯgX h_ %nA:kpVA{ѡ,e܂O?F_Y6r::_(qyYFO&C;P5Ea{z-{ kR"OF2psV8NJFZw|ivDLm/1zCZjTSYo2$)*/1/[O2h+Ҏ<Yf1+e? V+ ]c}?"MqWf(qec"TW"XUGQSrb*VF8~a|Q~ ||g͎QPđh 0mQk7:I#Z|Vgn$E. -%KO}Z.6e~hE#1e\cٖAвJ[# -TjW#PwF1:PeܡV&*M;TaXFQZګ^EUz!;(:W6E4ɪRT1Il~>v`Z[TU"~:RJ g:c)D2iS!Z泎E SX,J,<{rJY1#i֤XB_BN-=nbD9 ;=bfaj*a In6VAWiEvC4miA/I XE?:{Nb!s;i. K9mCXb Oͷ{7C#F]I S|ѳڞ#Jx9:֕X36H 4XB Kv$+iT%KsaaC̲o"`=n$hF20,DU>6mcdAN Ȕ[)e'Ҋz0#MQ IH^md*ɍ, a% U99 M,)e\sP}Đ aX\>B\YJ*#SL.$BrN/jݙ,zYhVZUVaFf>eh÷fjmPe=bÖZ7'( K)=.8@ c峖?-mVX{㷾E|!r]e"rI"Ϧ^4X4] 2Z1 7uz6dX7yñT-Aw^WtѰ7N:W<Ú-o9o8jvfaξmΞ7N{x`vނtp0ߠ{:%eV ޸2ǃM$~C}sau]ۖ;J+hzx/06q%`B/+W{>jDyE^xW`yMEo=}o;(15>nV05Tc!DOkNwqa&ApitPD"ݱǨei=Ns~ةMΞo)\n&|{ѣ)wi5 ]㾓o"9%)Ⱥjvdejmo=ۦ]Rؚj7-DzQ-'sŬ8>YOA `aҷ֔=.Q/g<:RjB^vvv"e)[,oeD1l} nz] Iȥۋl.^jf-oww8qhÕ4ƪsVZͮ{Y۵'NdscD#//X'uBXSR9KeYK{*YVKŘ34AiOsS'O|7i /ï2el/+H!cxɯqVӶ7x##.x<[ػw/uSSU5a<S7 .@Kj.ϳ#P.R@ \;{ pE_biI/dz.4r@*w>)ˮ?c"X, COӌ軁hێ~nXz%LBHM[_}yEӌL&L5u^= SNX 2焈 {.rP"e+<ع/`;! 4wC& 8ZcA e7#(cǎ1 (~t++1NǸ9c.](Wzy%c<+gt/u)ΪXڹY1O伌-v~>/R߹sHtmO-hùJΧWL_q''eʼoo:d2eeedJ4"a)Bp<'>DP9Ky~n^ CiS\JI$FpIK){>Eʽ+2PH9'C &TvX]'Sٳ嬯30iF#r#.qF)W%42\aA/S/(/˄1+@v~𬿿郞g.sESbѶ8k\E۶4MmE]W]'e_R8&HxPy)v`?U{1}=Fcf* '"J.y^:l;/pe >` s e \ 21c 1Fs /.PK5]{ܹzСCr篬0*gsכr_k39@NHeSL0t=uSc IB^|1Kt/ 8r9dn W2Uq"x?ksBU@]עӬ4M0ϤeRݔfݬvŖr|ُҳ]1q}]dzwIZZe#XJEL =US~ǝ]rw]GF Ѳϸ*7OgOei5ɴbg馛v#C/7bU0,3< 92 $h? !X]^ |. WҶ;\2z<)qwivM*OG_8t0Ǐ[~?mw>}#rchJຨƺѲsӄ?=nVZ(Vsqsn8|8?~L_ =yɘkH FD1`dnbBOsO=Ι_1YwՌcA `ᄑo6779rs!3ĈI 9q;5ajFC<3,>|[{EGyロ7|2yO AVgO7"rUXޛ(x껞{penV6%ϧgD.%~ʏq ,z$Dvؓ#pJMQLfd֬}゚ xK6n~^U8x=++<#9} |RkSiDvV)VTJQK_3^guuh91zo~zD|wo/h3N9[[p:<`DFM#F+q1q9~vwͯ%zW( bSUӕV+TUp(\WlPM] @+:6.lqng6{~zkq/wƣM5p՞@򃭭<|ߥ=wlCW>W[Ak|ew};څqp\n9_g?' sqq)(IENDB`zeal-0.6.1/src/app/resources/icons/logo/64x64.png000066400000000000000000000135661335333561500214300ustar00rootroot00000000000000PNG  IHDR@@iq cHRMz&u0`:pQ< pHYs  ~bKGDIDATx{eWuks=33 Hh$"$$^i vpى1ʳrIJSNI9 eJ8ı)0{EzZo!1oLwϻ_q+}ν3D* N߹}Z{o}\?d5o{]z'ZΜ?̞m uh9nnrz'3Ӂ{k 53[8S4oʼn @#1@b^DA E`_I!spԜz Bc1B "ޡ (瓳i~qE6?,<9Id}0%1&FEE>m" nv/8DTCBD"(R`+8!Z$Y==J]rًYJbs""u3(hZK`Ƨϫ*x!ĀFE@ ;ĥtqr$lA@]:)M5/E@P=y [;XDJU\ׂM[v@ H-JrdFED 3{4(ͭG ,)Nϒ:aNJIqJPb煯8ge[zI٢bC@y/m%gh(F8Nulz/оZj&O͐9 ݣ #)A{/}5r˟"?}P(Āy$jI?k*×x[./uFkٱ28H0Jx_孆HԊBPZ_aهm rg)OX1/ d]@#ۻv\k ?Yza Xa2O!`zaB 8DG?uȲ5xv{/.yw-8nf+W bP4#h 1aS"|O}bq^#``拟H9-9B(Eė'0:iĢ5]B?-33+@3SfUd\hg RT#CN-őޘYIcUZ;/g>Bk߼'LJRzaIO*RMW)IRDА%oOe8['E`<1bN-Y97&Gƨ8.Vv@%../ٛl?Șj]e/+>4G;IP/P+꼔M>;wNw6׏\Uc:N"ZYI{GwE޿Vr0ZK(i %,/r~[P#$T|=qFIo@sE2BcvY\bt.7ӄ\)G%ְ_c{X|A6bg 4QҪ)aÓr6-/7'IR~!V퀲*+_b!'W@EԻpFw1}7=J#C*-!^8pbgB(#hNo[HX5P2n@,~&ƘgeyCχZbVzr5*-)MJ&=}{1(踥ˎ&h/U2u*AIr3?|Ĩl1F韽i`y3~/Lq.a2eWlzǻ9? *mb<U!눀s : tbw5 Q&N L66/r񩝭5Nr1V4Fsxb5WFHYo1zf?TOcZʕ=/޶&Vn>zukֱ5t;Y;Bˢc4Q#"ç͉]WGh^r^uyDOiDn@+ɉ%<2c 78»ɼC;/;4o}"zDܡ:vkF'x,mnngvJI,xq0JZ~6;`3 Л=FyC2"5wѫs~K J%^8!WNྕ13l0N{I{@gݽm4l,MԹMeg'֦3WkPߴ׼ўo (cW` wp/U漅p39{3WmP j=!y<(U04tZ1'طH*өAsT%[Qk&P6NOl1"VDNLZZCe+MT:I vewl G"%ciTP*GENZg{ϛۑȼljK@4沷/h131̴ # 䡢ض]F%oi.1KBmxO-Oq]>)1Qߟ zjmo%I'r$ef$ [r[KԚ( ʾ.e$QmYLU+^2Q#nju) L0r4pl Z,U|ϗ$Z]#W˰MLMcǠ6N |r5&QP9c\9 ǞS/f}$ Q2k.T᭭b IK-1#e řdvi|b|Ct,Av[y! .)u[]<үo3uk(9?g8xﵻilJw(MϞď#>;{mtgҘF,r<:ڲi\I;{Ʀ-NR_WoН9BcVshlފ9qylzќ\ox,Ι.HtBS| #1MBTyAף:8b"Pr>#eZ6;vd͚5l6jdYFexoK("r:UйHt#9" .RjBee,el5vfڵGFn\u|byst^\jR4Zٖ!XcgR'ᅲ[~={7,U'c9 H(R;< " 5rQ!}Ucot[|]h4젴O`f.Xi. UU]Plӈ:RGe5z@R"v>/-9r|w~?F {̛r P*}mXϯYQ33'ȋV|hRyxQj:##0K!|Qxxq11D}?ѹ#Lm^Oq_9:s_1?FVq!:eߺm!#dx׃^{W})iwx-XvX?Mvٗ,[[^2+~Tɫpq@r@~z+ /W߽ce_0q5+5a0ځ7F;IENDB`zeal-0.6.1/src/app/resources/icons/logo/icon.png000066400000000000000000000015451335333561500215570ustar00rootroot00000000000000PNG  IHDR(-SPLTE&&&uSAiLjHjIjHjIlIxWrQ94+hFwfIrbFvsp fa\?.ʬq//////--./2!̳1-&c=f9h:gd9b6a4b4)$";52UA_6ܐvǼஞఢ⸬㵥_7[1[/[/!2.&V2[2`9eCkMӈsؕb?\5X/X,W+png1,&2.'T1X0^9dEޮsWcC]9[5Y1T+R(zws4/'Q>W4sXޮhNcG`A]?{alNP*M#sqkA84O/jLĻ⽲ڣՒ҈u҈tՑ~⼱V4K%Hvrn"+'!I)M(O/R3W9eK҅pԎ|זbFM,G I!pnhG2@AC!E%I*M.N0I)B >Q*)% <93L1EE F H#I%I$H%G"N'O@kh`?:3=70MFQJUNWQZRYRSLQLID=HC<~FA;WSL454STUķttRNS@fIDATcd``3a-a#.T bdbDh|ƌ QеLV!72g xEH|g |fcdIHq UIENDB`zeal-0.6.1/src/app/resources/icons/logo/icon@2x.png000066400000000000000000000034311335333561500221250ustar00rootroot00000000000000PNG  IHDR szz pHYs  tIME (YbKGDIDATXÝM\Gofvgwvm L8 (>$DHȑS!8Y EB. !@B/l뵽ޝ7m9yZ}?5O 2UHBG@@C+=fא݃1`/9N`޽a/ӤHC;Qf<Z@u1biDwK³gwϮfܺɆU>P+U揝Ȕmvvb 3>Fp'Y{Y+y0ENROfwiDt`-KT`D#Tk畷&/Գז9{(Q$D63*?XS&"} s}O>/~/pWU`e+KVb$ )! c],4RdB瘚ՕUvNxej/Z"Zx,,EX(e}6j!^PMU 9m;%ejI^'q sk bƸ1Fiʠ?dߣv%B.̰ݻm2jl67$\s.""t@$42Ժu4(ggGĩj{=VkfD$Ɍ&.%1Y >Z$ EU !>j8 KSa0TLJ1Ḽ0MvP)cN2:Z!/=OڭU С79l"ZuLdJrew#?]v!p}W/xppvt ?=pYV'z x`/0^@#z?Z9t)0q=_?Qr2|e(g}1InIENDB`zeal-0.6.1/src/app/resources/icons/type/000077500000000000000000000000001335333561500201355ustar00rootroot00000000000000zeal-0.6.1/src/app/resources/icons/type/Abbreviation.png000066400000000000000000000004771335333561500232600ustar00rootroot00000000000000PNG  IHDR(rPLTE}_}_}_}_xŨҝxǎklz{͑o~`}ψmtpgcuȾԑmp}ϣ|tRNS䨤xIDATJAzXiJF:H̵:X-MQnd~|ʥcۋJg?*P IENDB`zeal-0.6.1/src/app/resources/icons/type/Abbreviation@2x.png000066400000000000000000000007551335333561500236310ustar00rootroot00000000000000PNG  IHDRE/PLTE}_}_}_}_}_}_}_}_}_h}ͨҞyȇf~ЃcasqxňmzjȾԊi~`ovázʏm|^pteh|m tRNS%'(~^!IDAT(}r0@h1"P*׾Bwo2&XG&㑊'ܙI4s*"hIbxP vp`eDK.ņ(D-;-T<<%pNH|zHpNjl}#eۖCWNOrLyOrKrhԣO걠%%A SdMƷ{rb/ԟ3ZM/TXB4-,;IENDB`zeal-0.6.1/src/app/resources/icons/type/Alias.png000066400000000000000000000004771335333561500217040ustar00rootroot00000000000000PNG  IHDR(rPLTEQ]Q]Q]Q]gvm|gw\i\joyix_mR`kzak}cr`mˣXdUbdqӹ]k`nk|jyKetRNS䨤xIDATJAzXiJF:H̵:X-MQnd~|ʥcۋJg?*P IENDB`zeal-0.6.1/src/app/resources/icons/type/Alias@2x.png000066400000000000000000000007551335333561500222550ustar00rootroot00000000000000PNG  IHDRE/PLTEm|Q]Q]Q]Q]Q]Q]Q]Q]Q]Yfkzm|hxWdl}UbS^bpϋangvakoy[hӹZgR`_merhw]kģP^`n}cpVcYejy q tRNS%'(~^!IDAT(}r0@h1"P*׾Bwo2&XG&㑊'ܙI4s*"hIbxP vp`eDK.ņ(D-;-T<<%pNH|zHpNjl}#eۖCWNOrLyOrKrhԣO걠%%A SdMƷ{rb/ԟ3ZM/TXB4-,;IENDB`zeal-0.6.1/src/app/resources/icons/type/Annotation.png000066400000000000000000000004771335333561500227650ustar00rootroot00000000000000PNG  IHDR(rPLTEQ]Q]Q]Q]gvm|gw\i\joyix_mR`kzak}cr`mˣXdUbdqӹ]k`nk|jyKetRNS䨤xIDATJAzXiJF:H̵:X-MQnd~|ʥcۋJg?*P IENDB`zeal-0.6.1/src/app/resources/icons/type/Annotation@2x.png000066400000000000000000000007551335333561500233360ustar00rootroot00000000000000PNG  IHDRE/PLTEm|Q]Q]Q]Q]Q]Q]Q]Q]Q]Yfkzm|hxWdl}UbS^bpϋangvakoy[hӹZgR`_merhw]kģP^`n}cpVcYejy q tRNS%'(~^!IDAT(}r0@h1"P*׾Bwo2&XG&㑊'ܙI4s*"hIbxP vp`eDK.ņ(D-;-T<<%pNH|zHpNjl}#eۖCWNOrLyOrKrhԣO걠%%A SdMƷ{rb/ԟ3ZM/TXB4-,;IENDB`zeal-0.6.1/src/app/resources/icons/type/Attribute.png000066400000000000000000000004771335333561500226160ustar00rootroot00000000000000PNG  IHDR(rPLTEQQQQgmg\\oiӮ_ڮRkaË}ȗc`ΣXUdٹ]`kjDtRNS䨤xIDATJAzXiJF:H̵:X-MQnd~|ʥcۋJg?*P IENDB`zeal-0.6.1/src/app/resources/icons/type/Attribute@2x.png000066400000000000000000000007551335333561500231670ustar00rootroot00000000000000PNG  IHDRE/PLTEmQQQQQQQQQYkmhWlUSbËȗagao[ӮٹʻZR_eh]ΣP`}cVYj] tRNS%'(~^!IDAT(}r0@h1"P*׾Bwo2&XG&㑊'ܙI4s*"hIbxP vp`eDK.ņ(D-;-T<<%pNH|zHpNjl}#eۖCWNOrLyOrKrhԣO걠%%A SdMƷ{rb/ԟ3ZM/TXB4-,;IENDB`zeal-0.6.1/src/app/resources/icons/type/Axiom.png000066400000000000000000000004771335333561500217300ustar00rootroot00000000000000PNG  IHDR(rPLTEQ]Q]Q]Q]gvm|gw\i\joyix_mR`kzak}cr`mˣXdUbdqӹ]k`nk|jyKetRNS䨤xIDATJAzXiJF:H̵:X-MQnd~|ʥcۋJg?*P IENDB`zeal-0.6.1/src/app/resources/icons/type/Axiom@2x.png000066400000000000000000000007551335333561500223010ustar00rootroot00000000000000PNG  IHDRE/PLTEm|Q]Q]Q]Q]Q]Q]Q]Q]Q]Yfkzm|hxWdl}UbS^bpϋangvakoy[hӹZgR`_merhw]kģP^`n}cpVcYejy q tRNS%'(~^!IDAT(}r0@h1"P*׾Bwo2&XG&㑊'ܙI4s*"hIbxP vp`eDK.ņ(D-;-T<<%pNH|zHpNjl}#eۖCWNOrLyOrKrhԣO걠%%A SdMƷ{rb/ԟ3ZM/TXB4-,;IENDB`zeal-0.6.1/src/app/resources/icons/type/Binding.png000066400000000000000000000005141335333561500222150ustar00rootroot00000000000000PNG  IHDR(PLTEzpyƲnpx{|ͽł՛ŴŲp­ɸ鉵rss܁r㌷vűvtRNS@fdIDAT1N@@y޿(q.j‰IY+5%T^C8^{>f0`ga|\G;|U?+pZ p])=oBP|IENDB`zeal-0.6.1/src/app/resources/icons/type/Binding@2x.png000066400000000000000000000007421335333561500225720ustar00rootroot00000000000000PNG  IHDRE/PLTEf|g{g{oh~kuxtw֑lzŏȱʶ«}Į䍸űнՃpроmrt'gtRNSPVVbKGDH pHYs  IDAT(} EQ:T)RZE}+.iHf0`ga|\G;|U?+pZ p])=oBP|IENDB`zeal-0.6.1/src/app/resources/icons/type/Builtin@2x.png000066400000000000000000000007421335333561500226260ustar00rootroot00000000000000PNG  IHDRE/PLTExfwgwgoyh|kuxtwϽ}lzûȮʴ§}ī߸üкγpʱлmrIstRNSPVVbKGDH pHYs  IDAT(} EQ:T)RZE}+.iHr>8،DZq9pM17٥+*n{Fymj|J2N ~43BIENDB`zeal-0.6.1/src/app/resources/icons/type/Callback@2x.png000066400000000000000000000007731335333561500227200ustar00rootroot00000000000000PNG  IHDRE/PLTEíѱӤ̖čœǎϓ·ҦЧ͞ǩϿ٨ΕëϢꡲ☬ŐŖím@ tRNS%'(~^!bKGD- pHYs  IDAT(ϕ0"-j1:tw:u,0l1Ab,3i+x!W|s6`J>=Kl0ƪ"dAIQvW 栽C5rKH(Lw~TeVڝcsʢ'PNQ8?(.F`(t[Ҳ5x5%E7×݄.9h/1Mhi,g"IENDB`zeal-0.6.1/src/app/resources/icons/type/Category.png000066400000000000000000000005701335333561500224220ustar00rootroot00000000000000PNG  IHDR(PLTEګؤ٫侠ƪŨക٦ע|ף~۩ݭบɲⷘް㼡⼟⻝෗ӿ㽢߱⺛ݮ⹚ް忡ᵖ忢伞ᶗ߳۬ũڨĬ೒ްӝxϔnӜxЖqДo٩>tRNS@fuIDATJavUI ҭuIh96]U+۾pi6oap~>^' y8zDŽe9v0T:`'Ͻ0-'~Jh=*rIENDB`zeal-0.6.1/src/app/resources/icons/type/Category@2x.png000066400000000000000000000011011335333561500227630ustar00rootroot00000000000000PNG  IHDRE/PLTEɖpʖnʕnΜu٭߹ثϝwʔmΛuҢ}޶۲͙rگ˖pΚtթР|߽ʴ߼˗pПzզٯë޺۶֨Ӥ޹ڳǮӣθԦ˖q‡aʖrРٳ͚vϞxȑkċeʔoРz䠗tRNSPVVbKGDH pHYs  IDAT(ύr0@D U 6bχ.Ba7I˦-B,z0PPk"#y#+ |rBNlT̮iCEuxi`4 7ނ[&9dZNq^ݩR.NDM8La[S\<& ٴ/7KuT+R,/o[|nLTeϯoğ BNsf ۍѡ>;c6*3IENDB`zeal-0.6.1/src/app/resources/icons/type/Class.png000066400000000000000000000006501335333561500217110ustar00rootroot00000000000000PNG  IHDR(PLTEʿѽϻ͹˺ͼ;аĥǺŹջͩȯĶݵǼΨé÷ڭ¶ɹ˶ݼݿѿẫˮ³ǥʳdzƮµƧ1%tRNS@fIDAT[=αAAE3f:j!ĕ(8dFu+٢kMCPGF}^H0U!AQݑgC0l ChntԏO˼ހN_!~OIu|y&+IIENDB`zeal-0.6.1/src/app/resources/icons/type/Class@2x.png000066400000000000000000000011041335333561500222560ustar00rootroot00000000000000PNG  IHDRE/PLTEvut|ɫƣ­ȩĪŮǼὰїݳʟ䚇ϧĸ־⪙ԬȦtRNSPVVbKGDH pHYs  )IDAT(ϭv0EQ"LP bE u.Sc !IgeOĤ5傚Ҟ!m\ʳnȿ B.7 {+ 40CP}Qk[ ٓsUɯdP^s d C!rMo Ѓ 5;p&< Q)TB53olK|Vcw§%p%Eb|qaX8n*uP߼(3zQIENDB`zeal-0.6.1/src/app/resources/icons/type/Collection.png000066400000000000000000000005701335333561500227400ustar00rootroot00000000000000PNG  IHDR(PLTENJLj֠ܪۨΕă|~ƆɋКܲјˑӡӟӝЗԢ̑қʍҚːסϖ֢ԞЗ͔Ȋ۩ŅجΒˏӽx϶nӼxзqеoƆ%ItRNS@fuIDATJavUI ҭuIh96]U+۾pi6oap~>^' y8zDŽe9v0T:`'Ͻ0-'~Jh=*rIENDB`zeal-0.6.1/src/app/resources/icons/type/Collection@2x.png000066400000000000000000000011011335333561500233010ustar00rootroot00000000000000PNG  IHDRE/PLTEɵpʶnʵnλuȊҘLJϻwʴmκuҿ}ϕ̐͸rʍ˵pιtԥćн|Ң۴ҟ˶pнzÂȐ֫ѝ͙ąЛ̓ڮ߸Á˵q©aʴrмʗ͸vϼxȱkĬeʴoоz3ktRNSPVVbKGDH pHYs  IDAT(ύr0@D U 6bχ.Ba7I˦-B,z0PPk"#y#+ |rBNlT̮iCEuxi`4 7ނ[&9dZNq^ݩR.NDM8La[S\<& ٴ/7KuT+R,/o[|nLTeϯoğ BNsf ۍѡ>;c6*3IENDB`zeal-0.6.1/src/app/resources/icons/type/Column.png000066400000000000000000000005701335333561500221020ustar00rootroot00000000000000PNG  IHDR(PLTEڊو䠽ك|~ۆ݋☹ޑ㡿⟼❻㢿ߑ⛺ݍ⚹ސ塾ᖸ墿䞽ᗸߔۊڅޏxnxqoن9IitRNS@fuIDATJavUI ҭuIh96]U+۾pi6oap~>^' y8zDŽe9v0T:`'Ͻ0-'~Jh=*rIENDB`zeal-0.6.1/src/app/resources/icons/type/Column@2x.png000066400000000000000000000011011335333561500224430ustar00rootroot00000000000000PNG  IHDRE/PLTEpnnuيߘ؇wmu}ޕېrڍptॽՇ|ߢߟpzՂِޝۙօӀޛړԁqarٗvxkeoz,tRNSPVVbKGDH pHYs  IDAT(ύr0@D U 6bχ.Ba7I˦-B,z0PPk"#y#+ |rBNlT̮iCEuxi`4 7ނ[&9dZNq^ݩR.NDM8La[S\<& ٴ/7KuT+R,/o[|nLTeϯoğ BNsf ۍѡ>;c6*3IENDB`zeal-0.6.1/src/app/resources/icons/type/Command.png000066400000000000000000000004461335333561500222250ustar00rootroot00000000000000PNG  IHDR(QPLTEαӯҟɐț敺Ϣʿٔ®ҠPD;tRNSIJeebKGD , pHYs  ]IDAT]Y C[.MLT(d@ وT>r>8،DZq9pM17٥+*n{Fymj|J2N ~43BIENDB`zeal-0.6.1/src/app/resources/icons/type/Command@2x.png000066400000000000000000000007731335333561500226020ustar00rootroot00000000000000PNG  IHDRE/PLTEíѱӤ̖čœǎϓ·ҦЧ͞ǩϿ٨ΕëϢ☽ŐŖíѡq tRNS%'(~^!bKGD- pHYs  IDAT(ϕ0"-j1:tw:u,0l1Ab,3i+x!W|s6`J>=Kl0ƪ"dAIQvW 栽C5rKH(Lw~TeVڝcsʢ'PNQ8?(.F`(t[Ҳ5x5%E7×݄.9h/1Mhi,g"IENDB`zeal-0.6.1/src/app/resources/icons/type/Component.png000066400000000000000000000005701335333561500226070ustar00rootroot00000000000000PNG  IHDR(PLTEڊو䠽ك|~ۆ݋☹ޑ㡿⟼❻㢿ߑ⛺ݍ⚹ސ塾ᖸ墿䞽ᗸߔۊڅޏxnxqoن9IitRNS@fuIDATJavUI ҭuIh96]U+۾pi6oap~>^' y8zDŽe9v0T:`'Ͻ0-'~Jh=*rIENDB`zeal-0.6.1/src/app/resources/icons/type/Component@2x.png000066400000000000000000000011011335333561500231500ustar00rootroot00000000000000PNG  IHDRE/PLTEpnnuيߘ؇wmu}ޕېrڍptॽՇ|ߢߟpzՂِޝۙօӀޛړԁqarٗvxkeoz,tRNSPVVbKGDH pHYs  IDAT(ύr0@D U 6bχ.Ba7I˦-B,z0PPk"#y#+ |rBNlT̮iCEuxi`4 7ނ[&9dZNq^ݩR.NDM8La[S\<& ٴ/7KuT+R,/o[|nLTeϯoğ BNsf ۍѡ>;c6*3IENDB`zeal-0.6.1/src/app/resources/icons/type/Constant.png000066400000000000000000000006561335333561500224430ustar00rootroot00000000000000PNG  IHDR(PLTEb}Tqa||Khc~jNkvVqf~Jh^yʹkʻο\xv˻ptNllzMke~ǢĴa|}ZvQngxTpӘmePm\v[wPnRo}tRNS@fIDAT5AJ@gnܵ @EOtՍK)bhq(W.Z ݼVg [u"aneٜnL%ŝ^<|Z;UTiqIt Ht<#]{!Ѝ(W."B~IENDB`zeal-0.6.1/src/app/resources/icons/type/Constant@2x.png000066400000000000000000000010551335333561500230070ustar00rootroot00000000000000PNG  IHDRE/PLTEPfPgOgXnoi~bylte|FdLiZt|{l}IgvxVqzPlSoʵмDž^vazooì^tRNSPVVbKGDH pHYs  0IDAT(}b0 JpP.2)0'9m,ñ-Oöqp7±p7fB0!LDn&I3 Ke=%2PJNP'4?R ѡh3"aO,RԴ Dg(qT.Juڱ C5хS3Ut C?(+dWjƫ6Njd_=pW\B@tGlXNY$ ++レ,QVUd =374~ Nˡ~; ÄIENDB`zeal-0.6.1/src/app/resources/icons/type/Constructor.png000066400000000000000000000006061335333561500231720ustar00rootroot00000000000000PNG  IHDR(PLTEk~|}zɥxy·Ⱦ·u૙y{\D,tRNSIDAT AٴHʅ+@ 8GZ UT@@hکrf}+5=n1Ԗ0 i8uxp[r>8،DZq9pM17٥+*n{Fymj|J2N ~43BIENDB`zeal-0.6.1/src/app/resources/icons/type/Conversion@2x.png000066400000000000000000000007731335333561500233510ustar00rootroot00000000000000PNG  IHDRE/PLTEӱÖѭӱ̤Ė”ǜϪ“ԷҰ˦ЮͧȞǝϩٿΨÕϫʢݧʡΠŘřÖѭ\ tRNS%'(~^!bKGD- pHYs  IDAT(ϕ0"-j1:tw:u,0l1Ab,3i+x!W|s6`J>=Kl0ƪ"dAIQvW 栽C5rKH(Lw~TeVڝcsʢ'PNQ8?(.F`(t[Ҳ5x5%E7×݄.9h/1Mhi,g"IENDB`zeal-0.6.1/src/app/resources/icons/type/Data Source.png000066400000000000000000000004161335333561500227360ustar00rootroot00000000000000PNG  IHDRH-IDAT(chjjlO a1&$w;( R JhfzM3Scw'_8}X H-V pdA09{b&㐎_U;go `Ĵnr @|ɃF#̩@SI eS`ҔKFb(>qIENDB`zeal-0.6.1/src/app/resources/icons/type/Data Source@2x.png000066400000000000000000000007621335333561500233140ustar00rootroot00000000000000PNG  IHDRr ߔIDATHc?CgdK@Gd} O#|d.eAv1|rz鹓Af̆f;-,CfBd] mӬ™r7֍i9g!: j)Qyq9^|ĵU49~,$g٧zRnygULc@DȖ̡B=Ίs &duc" +|#!˻pu D aAJlۿ|\rϑRB/ZY 6S 'KY2|Y?h`)upu M~Hba;3>'YTT-ږw.(ږ/;z sgQPvjmJrp☬T J$>&zBz6hL50toӻIZWIENDB`zeal-0.6.1/src/app/resources/icons/type/Database.png000066400000000000000000000004601335333561500223470ustar00rootroot00000000000000PNG  IHDR(TPLTEffffffthwƾɷûvºtƿm{StRNSIJeebKGDo0O pHYs  dIDATuK0ՖQA0%iJHĩSՖ#6w8?͊WC*qR-+/m Ϟ>KnTVIENDB`zeal-0.6.1/src/app/resources/icons/type/Database@2x.png000066400000000000000000000007761335333561500227330ustar00rootroot00000000000000PNG  IHDRE/PLTEfffffffffpļnhqǿkzyɷ˞tfuts栙mŽ}º|iĽxpûMz.A tRNS%'(~^!bKGD- pHYs  IDAT(ϝ0bA*b*>xd cn+s00F#l3)Ee0[Oj'؁Ϥ $T}]2*c)'ȿp^6Cs =/gXJ.b[ !\܄-$B7(05>]axq,<9ך{㸒ztK2:EuXwP.lQ 7IENDB`zeal-0.6.1/src/app/resources/icons/type/Decorator.png000066400000000000000000000004611335333561500225660ustar00rootroot00000000000000PNG  IHDR(ZPLTEZYcm`f:auJqclvKq㣁j?fĮZl@goCjV|nBifrFmjvmAh^r'tRNS^[FbKGDo0O pHYs  cIDATu9 C 7-;de0CQ\K>1x+5:F=s#%~k]mISDl{ߌo1:pB% IENDB`zeal-0.6.1/src/app/resources/icons/type/Decorator@2x.png000066400000000000000000000007361335333561500231450ustar00rootroot00000000000000PNG  IHDRE/PLTEYYY]gm`f:ai=erFmV|fl~SzvKqֱZoCjjj?fuJqxrGmjxLsl@g󿧼{OueqYnBic{!otRNSPVVbKGDH pHYs  IDAT(ϕ0 2X*}BKT˖lKKHBJ /=m 'м.Xu:˲( C~^G/ .tT4v{^c6d+;JN1p.4I݁iOc mL+۷UD@z9k9XhyIENDB`zeal-0.6.1/src/app/resources/icons/type/Define.png000066400000000000000000000004101335333561500220300ustar00rootroot00000000000000PNG  IHDR(?PLTEvw~ؘޣˁݠܟ͆ԔᲲⳳՔtRNS@fbKGDH pHYs  UIDATm 0 a%^k*Z*8́A=AEA|4> -M鶓$,U\/0s9΍FIENDB`zeal-0.6.1/src/app/resources/icons/type/Define@2x.png000066400000000000000000000004301335333561500224040ustar00rootroot00000000000000PNG  IHDRE/0PLTEiihjhjoqƄΒsvɈ̏ʊƄ֦ʻ #tRNSPVVIDAT(ϥI  7[6mDPׅXCd3,;/xǖN3ZJ2! Z6v 3TKW#e.Fv#Ϥ 4/QT9ɤO+'lr3`cwx+Nj>IENDB`zeal-0.6.1/src/app/resources/icons/type/Delegate.png000066400000000000000000000004611335333561500223560ustar00rootroot00000000000000PNG  IHDR(ZPLTEfZfYocymk`F:fUJuncxlWKv䋁J?jeZL@lOCoaVNBnsfRFrvjvMAmPtRNS^[FbKGDo0O pHYs  cIDATu9 C 7-;de0CQ\K>1x+5:F=s#%~k]mISDl{ߌo1:pB% IENDB`zeal-0.6.1/src/app/resources/icons/type/Delegate@2x.png000066400000000000000000000007361335333561500227350ustar00rootroot00000000000000PNG  IHDRE/PLTEfYgYfYi]sgymk`F:fH=iRFraVsfxl^S~WKvٝeZOCovjJ?jUJuxSGrujXLxL@l\O{pe{qeYNBnnc{QtRNSPVVbKGDH pHYs  IDAT(ϕ0 2X*}BKT˖lKKHBJ /=m 'м.Xu:˲( C~^G/ .tT4v{^c6d+;JN1p.4I݁iOc mL+۷UD@z9k9XhyIENDB`zeal-0.6.1/src/app/resources/icons/type/Diagram.png000066400000000000000000000004611335333561500222100ustar00rootroot00000000000000PNG  IHDR(ZPLTEZYcm`f:auJqclvKq㣁j?fĮZl@goCjV|nBifrFmjvmAh^r'tRNS^[FbKGDo0O pHYs  cIDATu9 C 7-;de0CQ\K>1x+5:F=s#%~k]mISDl{ߌo1:pB% IENDB`zeal-0.6.1/src/app/resources/icons/type/Diagram@2x.png000066400000000000000000000007361335333561500225670ustar00rootroot00000000000000PNG  IHDRE/PLTEYYY]gm`f:ai=erFmV|fl~SzvKqֱZoCjjj?fuJqxrGmjxLsl@g󿧼{OueqYnBic{!otRNSPVVbKGDH pHYs  IDAT(ϕ0 2X*}BKT˖lKKHBJ /=m 'м.Xu:˲( C~^G/ .tT4v{^c6d+;JN1p.4I݁iOc mL+۷UD@z9k9XhyIENDB`zeal-0.6.1/src/app/resources/icons/type/Directive.png000066400000000000000000000004601335333561500225610ustar00rootroot00000000000000PNG  IHDR(TPLTEffffffthwƾɷûvºtƿm{StRNSIJeebKGDo0O pHYs  dIDATuK0ՖQA0%iJHĩSՖ#6w8?͊WC*qR-+/m Ϟ>KnTVIENDB`zeal-0.6.1/src/app/resources/icons/type/Directive@2x.png000066400000000000000000000007761335333561500231450ustar00rootroot00000000000000PNG  IHDRE/PLTEfffffffffpļnhqǿkzyɷ˞tfuts栙mŽ}º|iĽxpûMz.A tRNS%'(~^!bKGD- pHYs  IDAT(ϝ0bA*b*>xd cn+s00F#l3)Ee0[Oj'؁Ϥ $T}]2*c)'ȿp^6Cs =/gXJ.b[ !\܄-$B7(05>]axq,<9ך{㸒ztK2:EuXwP.lQ 7IENDB`zeal-0.6.1/src/app/resources/icons/type/Element.png000066400000000000000000000003461335333561500222370ustar00rootroot00000000000000PNG  IHDR(3PLTEnփߘڍmwޖ{؈ޞtҰ_StRNS#CQIDAT @ 07V$|vSIHwd a= F\O;<^p @/D[IENDB`zeal-0.6.1/src/app/resources/icons/type/Element@2x.png000066400000000000000000000004651335333561500226130ustar00rootroot00000000000000PNG  IHDRE/?PLTEpnnuيߘڍmՂޕ|ޝtw؇ݒW2:tRNSPVVbKGDH pHYs  IDAT(ϕ @436Lj:ďc(lZ(@cc,iP"kh5O{П8Ģt&ᘛf>qb)93ЗWã_x V.8sk2 kIENDB`zeal-0.6.1/src/app/resources/icons/type/Entry.png000066400000000000000000000003461335333561500217470ustar00rootroot00000000000000PNG  IHDR(3PLTEqnˇ֝ߒpmzwϚ~{vt; y>tRNS#CQIDAT @ 07V$|vSIHwd a= F\O;<^p @/D[IENDB`zeal-0.6.1/src/app/resources/icons/type/Entry@2x.png000066400000000000000000000004651335333561500223230ustar00rootroot00000000000000PNG  IHDRE/?PLTEspqnpnyu΍ٝߐomʅ՘~|vtzwϊؖ)ŕtRNSPVVbKGDH pHYs  IDAT(ϕ @436Lj:ďc(lZ(@cc,iP"kh5O{П8Ģt&ᘛf>qb)93ЗWã_x V.8sk2 kIENDB`zeal-0.6.1/src/app/resources/icons/type/Enumeration.png000066400000000000000000000003321335333561500231270ustar00rootroot00000000000000PNG  IHDRH-IDAT(c?ּ`k3_3( R ߩ\|o9XݽU05^X r~u\#K0Aֈs:k y0 $OPOo[7uT@( "ƫ_$J5$Gn"Sp. IENDB`zeal-0.6.1/src/app/resources/icons/type/Enumeration@2x.png000066400000000000000000000004461335333561500235070ustar00rootroot00000000000000PNG  IHDRr ߔIDATHc?ɶSyO  d2ZYAv1|vy]ﯙAU 2d6̧ 0ia0{"+\M([10Q^Ppo!n᏷/b[H8D|o9V|cN&χ "Y0aXQB|0M,{50ͳ SBbв<,_#DP H0Ml(IENDB`zeal-0.6.1/src/app/resources/icons/type/Environment.png000066400000000000000000000003461335333561500231520ustar00rootroot00000000000000PNG  IHDR(3PLTEqnˇ֝ߒpmzwϚ~{vt; y>tRNS#CQIDAT @ 07V$|vSIHwd a= F\O;<^p @/D[IENDB`zeal-0.6.1/src/app/resources/icons/type/Environment@2x.png000066400000000000000000000004651335333561500235260ustar00rootroot00000000000000PNG  IHDRE/?PLTEspqnpnyu΍ٝߐomʅ՘~|vtzwϊؖ)ŕtRNSPVVbKGDH pHYs  IDAT(ϕ @436Lj:ďc(lZ(@cc,iP"kh5O{П8Ģt&ᘛf>qb)93ЗWã_x V.8sk2 kIENDB`zeal-0.6.1/src/app/resources/icons/type/Error.png000066400000000000000000000004211335333561500217310ustar00rootroot00000000000000PNG  IHDR(KPLTEE D [ b\ O K X һȠP H T a7|[ãT ^ `E E <)W)tRNS\IDAT[U P@BeQ һ;sa,[!hפ 3P[8/Fɜb%ַaHRc !ݑ/ر C8IENDB`zeal-0.6.1/src/app/resources/icons/type/Error@2x.png000066400000000000000000000006321335333561500223070ustar00rootroot00000000000000PNG  IHDRE/rPLTEv W W W W W W W W W ` s v u b [ ^ q nn ҫuGβƤg.ǹg _ r o g ` s 7 tRNS%'(~^!bKGD-IDAT(ϕ0D B+JT%a{;0{,P24 e)8 @2Mc@0¢GV,)Da3lZumnA)gsiAYUx~&<Te^[Ƶ7WL -OG h8e: *|Ղq$}1c!O((iIENDB`zeal-0.6.1/src/app/resources/icons/type/Event.png000066400000000000000000000003131335333561500217210ustar00rootroot00000000000000PNG  IHDRf0-PLTEkkkk‘πpzڈ]tRNS䨤IIDATc`t4dpKoq\i z/ץ= "# wZQ?ݖ6ć l (HqIENDB`zeal-0.6.1/src/app/resources/icons/type/Event@2x.png000066400000000000000000000005261335333561500223010ustar00rootroot00000000000000PNG  IHDRE/WPLTEkkkkkkkkkvʑϐyptkƂvJC tRNS%'(~^!bKGD-IDAT(ϕ@ EPoS*i_|!9P->9P=V3H6Lnx.@3F5I?M™И1D->FjAtRNSkIDAT[U DH RheJlۙ$bY3 gw~T4 1Ħ<ǘ })OM_SǞ:/\jK"ޑ v#!)IENDB`zeal-0.6.1/src/app/resources/icons/type/Exception@2x.png000066400000000000000000000007461335333561500231620ustar00rootroot00000000000000PNG  IHDRE/PLTE@O@O@O@O@O@O@O@O@O@OFVRfTiQeEUQeeoΪAQFWNaT`ԶI[Ǟ@OٲIZOcShCSGYK^K]ϼM`DTRgRf tRNS%'(~^!IDAT(ύn0D &,'q\O ?PDYGs=cvDFv80ɘcI3ס,Ś̹#0rc%#|";vy-<~{ z%9|VU˿}^YKaEZ9H:rsF#U9! C'gjҁ1ۂBH uAZs yε]Kyb_%LK=5&.4*uGIENDB`zeal-0.6.1/src/app/resources/icons/type/Extension.png000066400000000000000000000004541335333561500226220ustar00rootroot00000000000000PNG  IHDR(TPLTE.3-29@=D3:69?}6<-2-2$t(tRNSkIDAT[U DH RheJlۙ$bY3 gw~T4 1Ħ<ǘ })OM_SǞ:/\jK"ޑ v#!)IENDB`zeal-0.6.1/src/app/resources/icons/type/Extension@2x.png000066400000000000000000000007461335333561500232000ustar00rootroot00000000000000PNG  IHDRE/PLTE@C@C@C@C@C@C@C@C@C@CFIRVTYQVEHQVefAEFJNRTUIM@CILOTSXCGۑGKKOKOMRDHRWRW] tRNS%'(~^!IDAT(ύn0D &,'q\O ?PDYGs=cvDFv80ɘcI3ס,Ś̹#0rc%#|";vy-<~{ z%9|VU˿}^YKaEZ9H:rsF#U9! C'gjҁ1ۂBH uAZs yε]Kyb_%LK=5&.4*uGIENDB`zeal-0.6.1/src/app/resources/icons/type/Field.png000066400000000000000000000003211335333561500216620ustar00rootroot00000000000000PNG  IHDRf0*PLTELc~Wzn`jٕrM~tRNScHIDAT[c`!cPd6qqqqiiiΆ@:B{\ Ϝii9B;#.`l"9IK wIENDB`zeal-0.6.1/src/app/resources/icons/type/Field@2x.png000066400000000000000000000003661335333561500222450ustar00rootroot00000000000000PNG  IHDRE/3PLTEKLLUm}Wzmsbׂ0tRNSPVVoIDAT(S ̎MX++CHF:J1ĵy5\hahpl4Tk%tJZw>ahƀ݌f,i1*n'IENDB`zeal-0.6.1/src/app/resources/icons/type/File.png000066400000000000000000000003211335333561500215160ustar00rootroot00000000000000PNG  IHDRf0*PLTE˖n֨߹Ѡy޷جԦجĪٮMm.tRNScHIDAT[c`!cPd6qqqqiiiΆ@:B{\ Ϝii9B;#.`l"9IK wIENDB`zeal-0.6.1/src/app/resources/icons/type/File@2x.png000066400000000000000000000003661335333561500221010ustar00rootroot00000000000000PNG  IHDRE/3PLTEɖpʖnʕnΜu٭߹Пy޶ج۳Ԧ˷]tRNSPVVoIDAT(S ̎MX++CHF:J1ĵy5\hahpl4Tk%tJZw>ahƀ݌f,i1*n'IENDB`zeal-0.6.1/src/app/resources/icons/type/Filter.png000066400000000000000000000003211335333561500220640ustar00rootroot00000000000000PNG  IHDRf0*PLTELc~Wzn`jٕrM~tRNScHIDAT[c`!cPd6qqqqiiiΆ@:B{\ Ϝii9B;#.`l"9IK wIENDB`zeal-0.6.1/src/app/resources/icons/type/Filter@2x.png000066400000000000000000000003661335333561500224470ustar00rootroot00000000000000PNG  IHDRE/3PLTEKLLUm}Wzmsbׂ0tRNSPVVoIDAT(S ̎MX++CHF:J1ĵy5\hahpl4Tk%tJZw>ahƀ݌f,i1*n'IENDB`zeal-0.6.1/src/app/resources/icons/type/Flag.png000066400000000000000000000002761335333561500215210ustar00rootroot00000000000000PNG  IHDRH-IDAT(c? H =`MGP( R <>/9WF3bFƩǫ/N-ADk%̃YkǿSeiD DkDQ4KjDpMrTOr&rG|@BIENDB`zeal-0.6.1/src/app/resources/icons/type/Flag@2x.png000066400000000000000000000003711335333561500220670ustar00rootroot00000000000000PNG  IHDRr ߔIDATHc?v> ;@v,O ݡ]|zb a>eN ː-]adU LmW_ `)^Lu -^͇Ga͋C?-ņoL} { j!UԨg!ැ(5A'f"nW.yIENDB`zeal-0.6.1/src/app/resources/icons/type/Foreign Key.png000066400000000000000000000003211335333561500227410ustar00rootroot00000000000000PNG  IHDRf0*PLTELc~Wzn`jٕrM~tRNScHIDAT[c`!cPd6qqqqiiiΆ@:B{\ Ϝii9B;#.`l"9IK wIENDB`zeal-0.6.1/src/app/resources/icons/type/Foreign Key@2x.png000066400000000000000000000003661335333561500233240ustar00rootroot00000000000000PNG  IHDRE/3PLTEKLLUm}Wzmsbׂ0tRNSPVVoIDAT(S ̎MX++CHF:J1ĵy5\hahpl4Tk%tJZw>ahƀ݌f,i1*n'IENDB`zeal-0.6.1/src/app/resources/icons/type/Framework.png000066400000000000000000000003211335333561500225740ustar00rootroot00000000000000PNG  IHDRf0*PLTE˖n֨߹Ѡy޷جԦجĪٮMm.tRNScHIDAT[c`!cPd6qqqqiiiΆ@:B{\ Ϝii9B;#.`l"9IK wIENDB`zeal-0.6.1/src/app/resources/icons/type/Framework@2x.png000066400000000000000000000003661335333561500231570ustar00rootroot00000000000000PNG  IHDRE/3PLTEɖpʖnʕnΜu٭߹Пy޶ج۳Ԧ˷]tRNSPVVoIDAT(S ̎MX++CHF:J1ĵy5\hahpl4Tk%tJZw>ahƀ݌f,i1*n'IENDB`zeal-0.6.1/src/app/resources/icons/type/Function.png000066400000000000000000000006061335333561500224320ustar00rootroot00000000000000PNG  IHDR(PLTEzpyƲ۬®~˻ǵ|}İ~{ޞűɝ¯ڛ{ï瀰˻̉Ԡò~­omrtRNS@fzIDAT;JoB1 B1(.w7NUcપbշv9;/'>k r hhS{a4>|zZ w48W$EsIy$\5hP.OghǨr0l?Xғ%"<`k}z[ +_^j0Òg aܼa,˲T鴵дfUϯ&R;n!d+vIENDB`zeal-0.6.1/src/app/resources/icons/type/Global.png000066400000000000000000000004601335333561500220430ustar00rootroot00000000000000PNG  IHDR(ZPLTE`c_cȅϑɇrusvy|kowzˊ͎Ҥy{ׯǏvyor|~ΎȄȅ_c_ccKtRNS _ ngIDAT[MY CCqCqM) Λi JY W›eF5i;NFKf\7etcGB2D/6ygyY~/x /IENDB`zeal-0.6.1/src/app/resources/icons/type/Global@2x.png000066400000000000000000000007671335333561500224270ustar00rootroot00000000000000PNG  IHDRE/PLTEuvuvuvuvuvuvuvuvuvuvǂמ٣ѓɆ{|ƀ͍Әآˉyz՛|}߽֫Łҡ۴ΗВɌȃΏ՛xy֝ʇvwءן֞& tRNS%'(~^!bKGD-IDAT(uٖ0Dt" CDQPqCz)Ɔ܃C?BF>C yp23 `^bujĄ/M$€I](RiP_Ii#NRӴJB|P-Z +"ל7E]; k Kk^ޕ 7l:rzN؁\mށ[ 6W4)υyOݸ$ހ(`͗U4'0 M?0 ,IENDB`zeal-0.6.1/src/app/resources/icons/type/Guide.png000066400000000000000000000015341335333561500217030ustar00rootroot00000000000000PNG  IHDR(-SPLTEV h9uQW/tU2qW2sY3qZ3q]4o^4n_4mc4k_2~h_0}g^.|f]+`.}gU+b1d4c1c3e4d3d4e3c0vy[mĠ̛ȗzƓuőqÌlgdei߱mL}QvHxKtEʎiԛ{ؤױ~^ö{slkd^vHέ}]öyx|yrxKѾ˨|\òɤ{Z¯yLѹšyXws촭œvU}txJαwsSr뷠otFɧppNuųisCŝhiHltͽbp?`fDf߇bوdٌgڎjوdք`ՁYk:V`<`ك\ӂ[҂[рYX~X{Rg6vKM'lDh9m>l>pCqEuJuIe3e4/j1+tRNSG4@b~h*Pn[IDATW1 κz/MlF G;/%ȉ%`i PӼ}clš? |pu! B bIENDB`zeal-0.6.1/src/app/resources/icons/type/Guide@2x.png000066400000000000000000000034661335333561500222630ustar00rootroot00000000000000PNG  IHDR szzIDATXåoW?zm$Nb旒6% T@ e '1s4(<?˿X6fQ!"y,C$`1oM Z3CD~")4:nij*fKa1`@+-V,tqr㕊5ǚ4cIM%iu\>Gdcdg5]#i쓽֟F@HPhwvx!pN]lw(N5t]a,-6U+qƂ܎)P7fP -!odYF3$d E1S{TU,R`,!ը! BV-6]@b'7nꃍpA#Ep_Lp%z؏wc]B<% x!8"_o|;a?IENDB`zeal-0.6.1/src/app/resources/icons/type/Helper.png000066400000000000000000000003321335333561500220600ustar00rootroot00000000000000PNG  IHDR([CcPv%u+qIENDB`zeal-0.6.1/src/app/resources/icons/type/Indirection.png000066400000000000000000000002371335333561500231140ustar00rootroot00000000000000PNG  IHDRf0PLTEΨӱʢjtRNS䨤,IDAT[c`t4dpKK(KK3(!@ b`cD%S.PIENDB`zeal-0.6.1/src/app/resources/icons/type/Indirection@2x.png000066400000000000000000000004011335333561500234570ustar00rootroot00000000000000PNG  IHDRE/?PLTEӱÖѭӱˣ”ƚÖѭ/ѩ tRNS%'(~^!gIDAT(;0 PCZhʀRf!C bȺnd@j)E Y]TVX>[CcPv%u+qIENDB`zeal-0.6.1/src/app/resources/icons/type/Inductive.png000066400000000000000000000002371335333561500225770ustar00rootroot00000000000000PNG  IHDRf0PLTEΨӱʢjtRNS䨤,IDAT[c`t4dpKK(KK3(!@ b`cD%S.PIENDB`zeal-0.6.1/src/app/resources/icons/type/Inductive@2x.png000066400000000000000000000004011335333561500231420ustar00rootroot00000000000000PNG  IHDRE/?PLTEӱÖѭӱˣ”ƚÖѭ/ѩ tRNS%'(~^!gIDAT(;0 PCZhʀRf!C bȺnd@j)E Y]TVX>[CcPv%u+qIENDB`zeal-0.6.1/src/app/resources/icons/type/Instance.png000066400000000000000000000002601335333561500224050ustar00rootroot00000000000000PNG  IHDRf0$PLTEoYoYvģi}{fvpZoYZq tRNS./IDAT[c`Ta0dPqqU qqe`O, 1w؞ +mIENDB`zeal-0.6.1/src/app/resources/icons/type/Instance@2x.png000066400000000000000000000004201335333561500227550ustar00rootroot00000000000000PNG  IHDRE/EPLTEϱkkkkkkkkkvʭϱƩtƩkƻvɬz] tRNS%'(~^!pIDAT(9@ Dw|G%C ɦ2IvJ 8 V7.e'p-D-8~?G8L3˺.qnW<\7L})ZQk8&e*IENDB`zeal-0.6.1/src/app/resources/icons/type/Instruction.png000066400000000000000000000002371335333561500231660ustar00rootroot00000000000000PNG  IHDRf0PLTEΨӱʢ!rtRNS䨤,IDAT[c`t4dpKK(KK3(!@ b`cD%S.PIENDB`zeal-0.6.1/src/app/resources/icons/type/Instruction@2x.png000066400000000000000000000004011335333561500235310ustar00rootroot00000000000000PNG  IHDRE/?PLTEӱÖѭӱˣ”ƚÖѭ~+[ tRNS%'(~^!gIDAT(;0 PCZhʀRf!C bȺnd@j)E Y]TVX>[CcPv%u+qIENDB`zeal-0.6.1/src/app/resources/icons/type/Interface.png000066400000000000000000000002371335333561500225450ustar00rootroot00000000000000PNG  IHDRf0PLTEξӱʤKPEtRNS䨤,IDAT[c`t4dpKK(KK3(!@ b`cD%S.PIENDB`zeal-0.6.1/src/app/resources/icons/type/Interface@2x.png000066400000000000000000000004011335333561500231100ustar00rootroot00000000000000PNG  IHDRE/?PLTEûѾӲ˥ªú.e/ tRNS%'(~^!gIDAT(;0 PCZhʀRf!C bȺnd@j)E Y]TVX>[CcPv%u+qIENDB`zeal-0.6.1/src/app/resources/icons/type/Keyword.png000066400000000000000000000004411335333561500222660ustar00rootroot00000000000000PNG  IHDR(lPLTEbbvnuǣqtީzǶ񬔀zij쵟vڵ|rpsa3tRNS^[FcIDATU70C]&HÆM''"VbSL, xFq,(LYeݴXFcpiŘruD=o:qߑb_-"L~IENDB`zeal-0.6.1/src/app/resources/icons/type/Keyword@2x.png000066400000000000000000000007021335333561500226400ustar00rootroot00000000000000PNG  IHDRE/PLTEcbbi~n|sxuIJr񵟍qijpǶ~ڬީzͿ쵝ʽǯvƹzatRNSPVVIDAT(}r0 P@.aOSu_t =iǶ|\Yq\$XTJiQUť2-k{$6ΰFhv#0#U MZ (NJZxxIe; F?15-Dӧ^?k}[tIENDB`zeal-0.6.1/src/app/resources/icons/type/Lemma.png000066400000000000000000000003031335333561500216720ustar00rootroot00000000000000PNG  IHDRf0$PLTEXn҆xϮT`тЂֱW" tRNS{p !BIDAT[c`!gccEaӴ`cB C\tZёCCCC \jȄ}J{IENDB`zeal-0.6.1/src/app/resources/icons/type/Lemma@2x.png000066400000000000000000000004241335333561500222500ustar00rootroot00000000000000PNG  IHDRE/3PLTEYXX`v҅lɮTЂˇȁxgĺ}|tRNSPVVbKGDH pHYs  kIDAT( Eі2HVQ0 ѸHβT$"mѤ(KJc| } -M鶓$,U\/0s9΍FIENDB`zeal-0.6.1/src/app/resources/icons/type/Macro@2x.png000066400000000000000000000004301335333561500222530ustar00rootroot00000000000000PNG  IHDRE/0PLTEiihjhjoqƄΒsvɈ̏ʊƄ֦ʻ #tRNSPVVIDAT(ϥI  7[6mDPׅXCd3,;/xǖN3ZJ2! Z6v 3TKW#e.Fv#Ϥ 4/QT9ɤO+'lr3`cwx+Nj>IENDB`zeal-0.6.1/src/app/resources/icons/type/Member.png000066400000000000000000000005041335333561500220510ustar00rootroot00000000000000PNG  IHDRH- IDAT(SAKAuMHKP!EHҩ()dKƚfk,KČX<^> ЪsRhHzK)⭐5o"IZ[ 2w gBk2^4).f @PNXձn~wSOs={tyᢽ?jh֩,C'p0~󙇣6OY'(vo |>j"NVK99z+7פQa+jkhs^9\oUCIENDB`zeal-0.6.1/src/app/resources/icons/type/Member@2x.png000066400000000000000000000007401335333561500224250ustar00rootroot00000000000000PNG  IHDRr ߔIDATHc?E@| Av[F+Xemr'U1L02leȖ[\և,ڂbyxՃ)IےXs"A Aܓ`>Sjwg()7yOۄGcBؖ ,1zåjG= |5XwD NduY#a D{})u,{ נB܅)GgIuj6SQB +J4PB䠃+(.abK7RB`edSB`۽‘5Uy( R 2$.C%o9ۜ"Am'zp▬x [3-?\8^\1GnL"q9`Ԥ;Kkk;k>=%Wեiqq}]]Nƴ`ODbP+MF]p_lǚNr&r(/|ڶIENDB`zeal-0.6.1/src/app/resources/icons/type/Message@2x.png000066400000000000000000000007341335333561500226050ustar00rootroot00000000000000PNG  IHDRr ߔIDATHc? ?M0l "L`>?moʣT 3Af|![ n!LmQ^\tŰxՃԔ'¤m!4 LBt0rxڌ`թ?b o{Yn2-29`#380wEכn]ˢ=щy^,$H~Qk,0r4k92{a-IENDB`zeal-0.6.1/src/app/resources/icons/type/Mixin.png000066400000000000000000000005101335333561500217230ustar00rootroot00000000000000PNG  IHDR(PLTEXKYzljTU^sa`m\YЊi~ӫڡ՘sf|jq;=tRNS@ffIDATQ0=[r@_CD ыV{T foU7~G 0k|paBUgNh<IENDB`zeal-0.6.1/src/app/resources/icons/type/Mixin@2x.png000066400000000000000000000007341335333561500223050ustar00rootroot00000000000000PNG  IHDRE/PLTE@@@JfyFrXtbILhSKnf[ue茿qВή\eOWuRkxsntRNSPVVbKGDH pHYs  IDAT(}0.qQ\P.SDpKLJQRBFdD ֬jMh TiҷV6?v?ha:A1 `Π-{j}\Z >n2-29`#380wEכn]ˢ=щy^,$H~Qk,0r4k92{a-IENDB`zeal-0.6.1/src/app/resources/icons/type/Modifier.png000066400000000000000000000004721335333561500224040ustar00rootroot00000000000000PNG  IHDR(xPLTEitit|Ϗ]b|flƀҡmrˉfk޹otǃbfpuƈ~եڰڮ͘ˑ͖ko˒jov|΍tRNS^[FpIDATU0Лް-3Ӫv$W&YAnO!ƅxag3ͻ{еcwM i)"yH6(G~ րZ*+\IENDB`zeal-0.6.1/src/app/resources/icons/type/Modifier@2x.png000066400000000000000000000007451335333561500227610ustar00rootroot00000000000000PNG  IHDRE/PLTEitititpzɃϏjo]b|v|΍flpuܵˉ`e˒txyko͘ڰmr͖bfɆ~otզfkƈӞҡ׫3!tRNSPVVbKGD ֘ pHYs  IDAT(}0 Bw<޷әzBdef0UoR))lhUMZA*x*j`SF6us=e|㐙#i'2OSayJAJhb$ǩRpŎ .v7R([C8QE9O|>($:J'}/DWM7|r|ܝ_,X?xfR];+!XMIENDB`zeal-0.6.1/src/app/resources/icons/type/Module.png000066400000000000000000000005101335333561500220640ustar00rootroot00000000000000PNG  IHDR(oPLTEҠs٬߹Ѡyݴҡ{޸ūשڱٰ֨ͷ֩Īݶң}ݸԦجӣ}:tM%tRNS8قcIDAT1@0fOI= O@ #XR$eK24ZSt__}@xc 4l{. -P`{I{% @+fIENDB`zeal-0.6.1/src/app/resources/icons/type/Module@2x.png000066400000000000000000000007311335333561500224430ustar00rootroot00000000000000PNG  IHDRE/PLTEҟsџsҟsԤy۱߹Пy޵֨޸٭Ҡ|ӣ~ڰըң~ݴīݵ֫گʳ߻ѼͶٯݶԦج࿣Ԧ۳W:tRNSPVVbKGDH pHYs  IDAT(} `d,teobLx~1~Ña!<_=!<'| '}!%kR*MmЬU!HC1-aAKX)]SqMo[ٸt '/ 5^ 1-;ƢMh7Ne^S\~7ߏc-K?4+IC{Ƒ9/\Ű]NIENDB`zeal-0.6.1/src/app/resources/icons/type/Namespace@2x.png000066400000000000000000000006451335333561500231160ustar00rootroot00000000000000PNG  IHDRE/rPLTEҟsџsҟsԤy۱߹͗pΚr۳֨޸޶ӤНw߼Ҡ|ԤΛt͵جӢ}ح֩ٯӾզҟyڰѼtRNSPVVbKGDH pHYs  IDAT(} Pv#qIܳ'Ab.M1!&BH #b*JfT)D,u([!iA"4?ɋ n΋,N֗aٺ<67WEԕ#0zw-"`+HoWǼpWhcx g; Y̮R}/8miIENDB`zeal-0.6.1/src/app/resources/icons/type/NewSnippet.png000066400000000000000000000007561335333561500227470ustar00rootroot00000000000000PNG  IHDR(-SPLTE{{zz]]ee[[~~||zzwwuu}}qqyymmllltRNS+IDATM=@ ۻ^9L\tbe5H C@C=Q@@?MHMLĒUAWEy13+Ņ,ߌeѸ=NQT/#"!k}?^ oS7\?'#QUP>A&h;z=^}kRFwr]IENDB`zeal-0.6.1/src/app/resources/icons/type/NewSnippet@2x.png000066400000000000000000000016711335333561500233160ustar00rootroot00000000000000PNG  IHDR D,PLTE{{[[~~}}||{{zzyywwvvssrrqqoonnxxmmll tRNS ﯯrY`3IDAT8uKOSAs6b$T޵+ÆD* UJQP"&I|i>[PO=^pVh8Nh 0R XwY`(^j\='-@[;"X,|Z>̷X &444`m&3\60x c`p"_&o56F :6?CBpbJGVtL Rۣo(w)e ݆XS8lA,?<Ȅ\Ȇ|C` Q4O[,U˙94rHM9g_,^Ԩ5IENDB`zeal-0.6.1/src/app/resources/icons/type/Node@2x.png000066400000000000000000000006571335333561500221120ustar00rootroot00000000000000PNG  IHDRr ߔvIDATHǽAK@S RPTTZE,(xU/hhēr ☷!ht'd>0c5pjS +q諶 q-eZNƒQ&j/$JN n|+v}Bh-Q- ~#yk͉Wt*^C@ƌ8S8;ryF)q;tz +$ǣn5g#Bd1 E7~ι,@%{Zr. P9\6 t*0ql .sOȹ\ Eպֹ,@(*sKUnFo}goʖ(5˓jMvz{3TIENDB`zeal-0.6.1/src/app/resources/icons/type/Notation.png000066400000000000000000000004171335333561500224400ustar00rootroot00000000000000PNG  IHDR(HPLTE҈sٗߧ́pцwޥҊyަٝזԎ~ҋ{΃rȿ΅tφubUtRNS7^IDATU90 CA;8;aM)xtD4-(H6-dVQKgމ>S\~7ߏc-K?4+IC{Ƒ9/\Ű]NIENDB`zeal-0.6.1/src/app/resources/icons/type/Notation@2x.png000066400000000000000000000006451335333561500230150ustar00rootroot00000000000000PNG  IHDRE/rPLTE҇sчs҇sԍy۝ߧ̀p΃r۠֓ަޤӏЇw߬Ҋ|ԏ΅tؘⰤӌ}ؙٜ֕ȾՑ҉yڝZ@tRNSPVVbKGDH pHYs  IDAT(} Pv#qIܳ'Ab.M1!&BH #b*JfT)D,u([!iA"4?ɋ n΋,N֗aٺ<67WEԕ#0zw-"`+HoWǼpWhcx g; Y̮R}/8miIENDB`zeal-0.6.1/src/app/resources/icons/type/Object.png000066400000000000000000000005331335333561500220520ustar00rootroot00000000000000PNG  IHDR(iPLTEg|xejf˨nĞc_}fb~qгkm3[#tRNSͻX*~IDATEAQỏKA!P0DAk 6B$l^MyP0BAtdxAv?SUtPA6!z>[{f/ܝWEfUc"$ğ?. IENDB`zeal-0.6.1/src/app/resources/icons/type/Object@2x.png000066400000000000000000000011651335333561500224260ustar00rootroot00000000000000PNG  IHDRE/PLTEfggoyolf`~rg˪ֻɞd|вcʨÞmԹǡiίƠթuѵؿ̸{kؾwr6 tRNSPVVbKGDH pHYs  QIDAT(}k{0 * J*^nCӹcKA{9At C4= ]3Xmމvc'fqlD#XspyAne>D?eD}Q@ )? =vc)'SD1b)@/R&3 j`Qf|U\!I,R 8iN+: t\|ѭl`z-&䦙#՜[CkA4S4}(OU7uY!DI[ZC %Ls8:(=/4yL~gu/ͦ;q%*7X/͟y`V+WR?%J IENDB`zeal-0.6.1/src/app/resources/icons/type/Operator.png000066400000000000000000000005331335333561500224370ustar00rootroot00000000000000PNG  IHDR(iPLTEg|xejf¨妗nĺc_렐fޞb~qȳkm:#tRNSͻX*~IDATEAQỏKA!P0DAk 6B$l^MyP0BAtdxAv?SUtPA6!z>[{f/ܝWEfUc"$ğ?. IENDB`zeal-0.6.1/src/app/resources/icons/type/Operator@2x.png000066400000000000000000000011651335333561500230130ustar00rootroot00000000000000PNG  IHDRE/PLTEfggoyolf`rgªλd|Dzޞcùm̹iįƻʩuɵп{k;w맘rݫ(tRNSPVVbKGDH pHYs  QIDAT(}k{0 * J*^nCӹcKA{9At C4= ]3Xmމvc'fqlD#XspyAne>D?eD}Q@ )? =vc)'SD1b)@/R&3 j`Qf|U\!I,R 8iN+: t\|ѭl`z-&䦙#՜[CkA4S4}(OU7uY!DI[ZC %Ls8:(=/4yL~gu/ͦ;q%*7X/͟y`V+WR?%J IENDB`zeal-0.6.1/src/app/resources/icons/type/Option.png000066400000000000000000000005331335333561500221140ustar00rootroot00000000000000PNG  IHDR(iPLTEg|xejfnc_fb~qЌkm#tRNSͻX*~IDATEAQỏKA!P0DAk 6B$l^MyP0BAtdxAv?SUtPA6!z>[{f/ܝWEfUc"$ğ?. IENDB`zeal-0.6.1/src/app/resources/icons/type/Option@2x.png000066400000000000000000000011651335333561500224700ustar00rootroot00000000000000PNG  IHDRE/PLTEfggoyolf`rg˻d|cmiΠuѿ،{kᕼwrytRNSPVVbKGDH pHYs  QIDAT(}k{0 * J*^nCӹcKA{9At C4= ]3Xmމvc'fqlD#XspyAne>D?eD}Q@ )? =vc)'SD1b)@/R&3 j`Qf|U\!I,R 8iN+: t\|ѭl`z-&䦙#՜[CkA4S4}(OU7uY!DI[ZC %Ls8:(=/4yL~gu/ͦ;q%*7X/͟y`V+WR?%J IENDB`zeal-0.6.1/src/app/resources/icons/type/Package.png000066400000000000000000000004261335333561500222000ustar00rootroot00000000000000PNG  IHDR(QPLTEҠs٬߹Ѡyجң}Ԧ޶ū࿣߻ҡ{˳Ԧڰ֨۳޸۳StRNSp1_YIDATm 0EQtJ?л; <@DN Qm*z%8n;$:K m Qh0lIENDB`zeal-0.6.1/src/app/resources/icons/type/Package@2x.png000066400000000000000000000006361335333561500225550ustar00rootroot00000000000000PNG  IHDRE/PLTEҟsџsҟsԤy۱߹ПyӤج޸جԦҠ|ڰڲݴݵ֨ٯǮըӣ~ң~êͶԦէ٭޵۳~B=tRNSPVVIDAT(Sk aF{rqt}Pv$ģ zx8x\<+.9y!]ޭE^owqlyg, |o>CIENDB`zeal-0.6.1/src/app/resources/icons/type/Parameter.png000066400000000000000000000006021335333561500225610ustar00rootroot00000000000000PNG  IHDR(PLTEŨŦ£äĥѺĤ˳Ȯ֬¢齿9tRNS@f|IDATEKA@{^WWbd%X}2oq_Z̨zo袒E+=xͮM4P!t.T7yyZy\Iwr;`! dTqK&TG4Wd=7$oIIENDB`zeal-0.6.1/src/app/resources/icons/type/Parameter@2x.png000066400000000000000000000014131335333561500231340ustar00rootroot00000000000000PNG  IHDRE/qPLTEŨŧŦĥäĦĥ̿¤ťĨĤڸҾֵ¤֮ڲϦ¢ϸҴ޷æίtRNSPPzCBIDAT(MjSw^GKDA"t:p)\rLARK$H`םnkHt3 V $bf }4aV`@OCAcAAt͇q@IkΓCnYx\<+.9y!]ޭE^owqlyg, |o>CIENDB`zeal-0.6.1/src/app/resources/icons/type/Procedure.png000066400000000000000000000004261335333561500225750ustar00rootroot00000000000000PNG  IHDR(QPLTEk~uy|꾳˙wź}}UQ tRNSp1_YIDATm 0EQtJ?л; <@DN Qm*z%8n;$:K m Qh0lIENDB`zeal-0.6.1/src/app/resources/icons/type/Procedure@2x.png000066400000000000000000000006361335333561500231520ustar00rootroot00000000000000PNG  IHDRE/PLTElklsuz}wƼΨ¶ɡxy۾Ƚ|}K2 tRNSPVVIDAT(Sk aF{rqt}Pv$ģ zx8x\<+.9y!]ޭE^owqlyg, |o>CIENDB`zeal-0.6.1/src/app/resources/icons/type/Projection.png000066400000000000000000000004261335333561500227610ustar00rootroot00000000000000PNG  IHDR(QPLTEk~uy|꾳˙wź}}UQ tRNSp1_YIDATm 0EQtJ?л; <@DN Qm*z%8n;$:K m Qh0lIENDB`zeal-0.6.1/src/app/resources/icons/type/Projection@2x.png000066400000000000000000000006361335333561500233360ustar00rootroot00000000000000PNG  IHDRE/PLTElklsuz}wƼΨ¶ɡxy۾Ƚ|}K2 tRNSPVVIDAT(Sk aF{rqt}Pv$ģ zx8x\<+.9y!]ޭE^owqlyg, |o>CIENDB`zeal-0.6.1/src/app/resources/icons/type/Property.png000066400000000000000000000004651335333561500224740ustar00rootroot00000000000000PNG  IHDR(PLTEWKuzljTkUl[rl|jcxXoYpVmzµݱby蒣ZrUl_vk_vX~ tRNS@f_IDAT[U @g?mF L5Ma6XQܷ^YP=5DENjb#5kbϥ`N-3Yӟ|IENDB`zeal-0.6.1/src/app/resources/icons/type/Property@2x.png000066400000000000000000000006421335333561500230430ustar00rootroot00000000000000PNG  IHDRE/PLTE@`@`@`Jhf}yFVP__ouWgO^IYhybqnfuXi\k尹ScL\KZ٣炏ĪRcUfbsrtjqEtRNSPVVIDAT(Sk aFڅ{rqt}Pv$ģ zx8huy?IENDB`zeal-0.6.1/src/app/resources/icons/type/Protocol.png000066400000000000000000000005221335333561500224430ustar00rootroot00000000000000PNG  IHDR(PLTEʿњźԫ䣒ᙇĹ÷ҧޜ޶ȰįÙšȣ*#tRNS@fsIDATU1 PEI,,,[ !ߋ.@% 2/9B˔Lt$@R䀣 )㼗N<`v|SpK03pd+L3F׺BIENDB`zeal-0.6.1/src/app/resources/icons/type/Protocol@2x.png000066400000000000000000000007231335333561500230200ustar00rootroot00000000000000PNG  IHDRE/PLTEvut|Ɏx|Ȑzڗ÷ղƻזö๪Χ{s܄oØ[EtRNSPVVbKGDH pHYs  IDAT(ϥ0 BH1]q_LˠVj_OLd2A΄L B#B4V8.DQ)pΤĩUU29&.9|.W+kͫ綕BqquLNnFcm 71]jsxmFIENDB`zeal-0.6.1/src/app/resources/icons/type/Provider.png000066400000000000000000000006021335333561500224330ustar00rootroot00000000000000PNG  IHDR(PLTEŨŦ£äĥѺĤ˳Ȯ֬¢齿9tRNS@f|IDATEKA@{^WWbd%X}2oq_Z̨zo袒E+=xͮM4P!t.T7yyZy\Iwr;`! dTqK&TG4Wd=7$oIIENDB`zeal-0.6.1/src/app/resources/icons/type/Provider@2x.png000066400000000000000000000014131335333561500230060ustar00rootroot00000000000000PNG  IHDRE/qPLTEŨŧŦĥäĦĥ̿¤ťĨĤڸҾֵ¤֮ڲϦ¢ϸҴ޷æίtRNSPPzCBIDAT(MjSw^GKDA"t:p)\rLARK$H`םnkHt3 V $bf }4aV`@OCAcAAt͇q@IkΓCnYx\<+.9y!]ޭE^owqlyg, |o>CIENDB`zeal-0.6.1/src/app/resources/icons/type/Query.png000066400000000000000000000007361335333561500217560ustar00rootroot00000000000000PNG  IHDR(PLTErtvz|~xz|}}~ь{}yz}{|suwy{}rtvwy|uwzلwx{˃uwytvy᭮nprwy{hiktvxz{~norwxztuxqru{|~vwz~rsvmnqijmtRNSSIDATE? wK`@,6efM)uŕ< WP%9MAQwYp[%z|vn]RBAEZvn3ÀR~ļKfmcSIzB48ukIENDB`zeal-0.6.1/src/app/resources/icons/type/Query@2x.png000066400000000000000000000020371335333561500223240ustar00rootroot00000000000000PNG  IHDRE/PLTErswssvrrv|~xz|wy{y{}{}~Ν{}}z|vxz}~}~vwzⳲ򈊍|}uvy͘wx{tvxz|~y{~suwuwy|~rtvxz}rsvtuxwy|z{~qruprtuvx~Ւoqs␑}{}qsunpr룣Z[]degnor|}†pqtjlnstwmnqrsu{|rtwlnpopsfgjabe^htRNSPPzCIDAT(υMKTwfS&6`Y ibǢ6A-mUPVb_*# E((32vΝ*IL<=ɡX|3))TYNIbVrFb̴(Lݦ93QȦͫv|@t\Hh׆*q\ ĥ̕*q=>ǣ\ڹ+L`Ч90@Gzcm+P0GIENDB`zeal-0.6.1/src/app/resources/icons/type/Reference.png000066400000000000000000000004231335333561500225400ustar00rootroot00000000000000PNG  IHDRH-IDAT(c π?֓8|/Q.1Æ\wdph5)$]?:Q4=?}kLe\Gr50MǗW%4?>xD'xD,nqK7ܟo_* S#ri9 &҄n#9I9HAB"g<_IENDB`zeal-0.6.1/src/app/resources/icons/type/Reference@2x.png000066400000000000000000000007501335333561500231150ustar00rootroot00000000000000PNG  IHDRr ߔIDATHc8_0'SG Oej@{XAv3@m*b@S t-,iaP ?3L+`fN _E0n@js?TOX\-o_|y?\=.Kf! \ٻT'}rE~IXt ,ե( GPY`#d9,~6>a/`s] .ڦR`-]DRBOa+rƇ)G*I8|x\ۗ,ߔM AYd |EK [|RAطĚ=['k*qȮA-6L >rܜ-hh-{#j- 'fFk&jб!mC}}j[v^IENDB`zeal-0.6.1/src/app/resources/icons/type/Relationship.png000066400000000000000000000004561335333561500233110ustar00rootroot00000000000000PNG  IHDR(cPLTEW W W W W W o v d [ h t g.޲\] Y ǧԽe ƭa r uGj l f Ҫ_ ytRNSIJeebKGD ahIDATU  xXJd2d x `B\:%](F|¡I8DY5nY˺'Jx[i`# (BU{d.IENDB`zeal-0.6.1/src/app/resources/icons/type/Relationship@2x.png000066400000000000000000000007151335333561500236610ustar00rootroot00000000000000PNG  IHDRE/PLTEv W W W W W W W W W ` s v q ^ g q W m ǧԽnޤg.t uGn j \p Y β` Y d b ǹ^ k u b [ s 3! tRNS%'(~^!IDAT(}0rbEg63\ ѓ6ٲg DžA#$ d4E_A@#6T?'-P Q @3_hOd!VXspD;>rFb̴(Lݦ93QȦͫv|@t\Hh׆*q\ ĥ̕*q=>ǣ\ڹ+L`Ч90@Gzcm+P0GIENDB`zeal-0.6.1/src/app/resources/icons/type/Report.png000066400000000000000000000004561335333561500221230ustar00rootroot00000000000000PNG  IHDR(cPLTEW W W W W W o v d [ h t g.޲\] Y ǧԽe ƭa r uGj l f Ҫ_ ytRNSIJeebKGD ahIDATU  xXJd2d x `B\:%](F|¡I8DY5nY˺'Jx[i`# (BU{d.IENDB`zeal-0.6.1/src/app/resources/icons/type/Report@2x.png000066400000000000000000000007151335333561500224730ustar00rootroot00000000000000PNG  IHDRE/PLTEv W W W W W W W W W ` s v q ^ g q W m ǧԽnޤg.t uGn j \p Y β` Y d b ǹ^ k u b [ s 3! tRNS%'(~^!IDAT(}0rbEg63\ ѓ6ٲg DžA#$ d4E_A@#6T?'-P Q @3_hOd!VXspD;>rFb̴(Lݦ93QȦͫv|@t\Hh׆*q\ ĥ̕*q=>ǣ\ڹ+L`Ч90@Gzcm+P0GIENDB`zeal-0.6.1/src/app/resources/icons/type/Request.png000066400000000000000000000004561335333561500223000ustar00rootroot00000000000000PNG  IHDR(cPLTEW W W W W W o v d [ h t g.޲\] Y ǧԽe ƭa r uGj l f Ҫ_ ytRNSIJeebKGD ahIDATU  xXJd2d x `B\:%](F|¡I8DY5nY˺'Jx[i`# (BU{d.IENDB`zeal-0.6.1/src/app/resources/icons/type/Request@2x.png000066400000000000000000000007151335333561500226500ustar00rootroot00000000000000PNG  IHDRE/PLTEv W W W W W W W W W ` s v q ^ g q W m ǧԽnޤg.t uGn j \p Y β` Y d b ǹ^ k u b [ s 3! tRNS%'(~^!IDAT(}0rbEg63\ ѓ6ٲg DžA#$ d4E_A@#6T?'-P Q @3_hOd!VXspD;>rFb̴(Lݦ93QȦͫv|@t\Hh׆*q\ ĥ̕*q=>ǣ\ڹ+L`Ч90@Gzcm+P0GIENDB`zeal-0.6.1/src/app/resources/icons/type/Resource.png000066400000000000000000000004561335333561500224370ustar00rootroot00000000000000PNG  IHDR(cPLTEW W W W W W o v d [ h t g.޲\] Y ǧԽe ƭa r uGj l f Ҫ_ ytRNSIJeebKGD ahIDATU  xXJd2d x `B\:%](F|¡I8DY5nY˺'Jx[i`# (BU{d.IENDB`zeal-0.6.1/src/app/resources/icons/type/Resource@2x.png000066400000000000000000000007151335333561500230070ustar00rootroot00000000000000PNG  IHDRE/PLTEv W W W W W W W W W ` s v q ^ g q W m ǧԽnޤg.t uGn j \p Y β` Y d b ǹ^ k u b [ s 3! tRNS%'(~^!IDAT(}0rbEg63\ ѓ6ٲg DžA#$ d4E_A@#6T?'-P Q @3_hOd!VXspD;>rFb̴(Lݦ93QȦͫv|@t\Hh׆*q\ ĥ̕*q=>ǣ\ڹ+L`Ч90@Gzcm+P0GIENDB`zeal-0.6.1/src/app/resources/icons/type/Sample.png000066400000000000000000000013401335333561500220620ustar00rootroot00000000000000PNG  IHDR(-SPLTELPNK|GwCp@kh{nJrY`fxy]]ZWSMzKvd_^\XSjbaa^Zoihdb`tmmc_]WP|wrqmcrYb_Yzdd`^`\|ww~sgrutqijoz||{no{tvy~}}tq}~}|{zyQq$tRNS:SO (QY]bcĈ*OGIDATu1ADߛQhK"tNwP@"C_uWW@3_A&½gD dZ!IAz (@h5"#blBg>\~6(!"AVL yIENDB`zeal-0.6.1/src/app/resources/icons/type/Sample@2x.png000066400000000000000000000034651335333561500224460ustar00rootroot00000000000000PNG  IHDR szzIDATXõ]\U{oiiK C!PP jbB" ITׂFAAFc Hc!*RJ-sht̜SS9p%g=Y~7;篹s}!Y46D; #PzQ-oW{Kr>>VAʪU1AqʒjΠFУ?|wOѭ`C#eV\C˴.seߣU.0te[|1[嚻xСU^IBpVUI8UtJ7tO;t~~̀py.dzW 2jXP HTqR;[vрٝdiR RLq}OXF2ӳiE$aT&/Efٖ1 /8UCJJf\XI)Ef7L8));ɝr\ *t5s(A!RdJgCޜ-h^uqQEР RuZVES蕁PPQ ճ⬭4 odisd<\I +o+ap=?V=)Kٖoڇa%DqQ˜ɳͣ&",]>Ѵ;37"^UܲOrxo̸j{DThgpz'Wd[HBB16sƠsƱ زq`o`iW, J+SjB7a6IP{?&ײRb{Ӊ_*63Gn^2N䥷"gօm&XfdG@D0ZAieWnS%u%su ;ERpC9.6Inņ D{$퉔/cN3dh {fk#\J=XBgT h \O TeB6Qe B#z)yqG԰ XQaK6SLZRMb6 R_A~Mqn# umiL% C̙|Y W8 Fpˌ "Ɩ\`2 UU8)9 MMMa0Q%|F[Հ8*ϴ>oGҤ8 w er,("Ri Q͓PDf; % 2*qV 8: 43Ł؉^ׁ" ̷/JRZ,qw½7}X@3snxeꟌ" ʺ*z! \`)HZ=3gtXs~~PMz"S5H-'w ^Z{E$g;m @-e3Ͳ S*`4-ن .| =aivZ vmLDe!5`hPJ͠plTh N;D| ԎvLL,l}6- W7H=UѓX?ާO5$x0m4/{G~Φ fBIENDB`zeal-0.6.1/src/app/resources/icons/type/Schema.png000066400000000000000000000005661335333561500220520ustar00rootroot00000000000000PNG  IHDR(~PLTEyŝ™Ć{~뙥}㮶˜əd*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Schema@2x.png000066400000000000000000000010511335333561500224120ustar00rootroot00000000000000PNG  IHDRE/PLTE{zyŘĊ|~Ȏ꒝딠胏ԭ؅ŘWtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Script.png000066400000000000000000000005661335333561500221160ustar00rootroot00000000000000PNG  IHDR(~PLTE{RّlᧆߝݝzᣃՋcъaՏhυUؖsީؗp҈XזoߩӉYՎe⭏ۙ{чWݞ}ؘsⳗޜ~ٚyⱑݚzݜuٔn֏f֋aٕqՑ}*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Script@2x.png000066400000000000000000000010511335333561500224560ustar00rootroot00000000000000PNG  IHDRE/PLTEzUzS{RԂZݙuᧆޞyٗnܚwេՏhυWш\ݞ}φZӌcܤఒؖmޠؘsߧЇ[ᯎ˹בjӍfژuؙxҊ`㰕ŰԌb帟̺ީޜy0%!##^L4'nϙ>P#,92o=Pp"%@м bb| MM5hSEeŒ>ύ^юV3>Y"!:yb Z-3A4o5|&Er0ulVuĜDB&;V&K!`kZ ;r '`G4bYë*>i7IؓcXI[670LwS3BBf,5q=Px|x ?zz_*pIENDB`zeal-0.6.1/src/app/resources/icons/type/Sender.png000066400000000000000000000005331335333561500220640ustar00rootroot00000000000000PNG  IHDRH-"IDAT(ctm$#1a8Iƙ=(r =`0J ߊ6Y(`h ӷ?O`dvA&_td3 MP/dM]͋wn># 5p@l9@͌o܄FHNLּyaph#(P@c>f5΂ ԘzAݲ[k灣ٶd_ 0k~cHY^ҧV\`QIENDB`zeal-0.6.1/src/app/resources/icons/type/Sender@2x.png000066400000000000000000000011471335333561500224400ustar00rootroot00000000000000PNG  IHDRr ߔ.IDATHǽ+a?LrhsӢD"%洘 \l7i…˅\ӂxT%Qp9 P)bRL|yW\Trnh3ZC,qt=c zʼ}Œrk&0ڌB 7@% v!' xK*kbq/žKtIENDB`zeal-0.6.1/src/app/resources/icons/type/Service.png000066400000000000000000000005661335333561500222520ustar00rootroot00000000000000PNG  IHDR(~PLTEyŝ™Ć{~뙥}㮶˜əd*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Service@2x.png000066400000000000000000000010511335333561500226120ustar00rootroot00000000000000PNG  IHDRE/PLTE{zyŘĊ|~Ȏ꒝딠胏ԭ؅ŘWtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Setting.png000066400000000000000000000005661335333561500222670ustar00rootroot00000000000000PNG  IHDR(~PLTEѧRٷldž߿zăճcѱaյhϰUعsƋػpҳX׺oljӴYյeʏۻ{ѲW}ػs͗޾~ټy͑ݽzuٹnֶfִaٹqR*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Setting@2x.png000066400000000000000000000010511335333561500226270ustar00rootroot00000000000000PNG  IHDRE/PLTEϥUЦSѧRԭZݽudžyټnܽwյhϯWѱ\}ϯZӳcā˒ػmػsDŽа[̎ݹ׷jӳfڻuػxҲ`֪˕ٰԴbП޺Ƌ޿yn{mtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Shortcut.png000066400000000000000000000005201335333561500224530ustar00rootroot00000000000000PNG  IHDR(PLTEQE}QE}aUqel`g[i]nbRFuRGt]S}XMxG#AȿَO 8>{1r zFq%   rx<0qtz%?V5Vĕ P/M;ENh_S|t (H[ɫÑQP*^p,ڲv \pjZBnX=v=M+%>}Ták@9`mQ09ߚ yw?"% ^#IENDB`zeal-0.6.1/src/app/resources/icons/type/Signature.png000066400000000000000000000005661335333561500226130ustar00rootroot00000000000000PNG  IHDR(~PLTEyŝ™Ć{~뙥}㮶˜əd*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Signature@2x.png000066400000000000000000000010511335333561500231530ustar00rootroot00000000000000PNG  IHDRE/PLTE{zyŘĊ|~Ȏ꒝딠胏ԭ؅ŘWtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Special Form.png000066400000000000000000000003211335333561500231030ustar00rootroot00000000000000PNG  IHDRf0*PLTELc~Wzn`jٕrM~tRNScHIDAT[c`!cPd6qqqqiiiΆ@:B{\ Ϝii9B;#.`l"9IK wIENDB`zeal-0.6.1/src/app/resources/icons/type/Special Form@2x.png000066400000000000000000000003661335333561500234660ustar00rootroot00000000000000PNG  IHDRE/3PLTEKLLUm}Wzmsbׂ0tRNSPVVoIDAT(S ̎MX++CHF:J1ĵy5\hahpl4Tk%tJZw>ahƀ݌f,i1*n'IENDB`zeal-0.6.1/src/app/resources/icons/type/Statement.png000066400000000000000000000005661335333561500226160ustar00rootroot00000000000000PNG  IHDR(~PLTEyŝ™Ć{~뙥}㮶˜əd*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Statement@2x.png000066400000000000000000000010511335333561500231560ustar00rootroot00000000000000PNG  IHDRE/PLTE{zyŘĊ|~Ȏ꒝딠胏ԭ؅ŘWtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Structure.png000066400000000000000000000005371335333561500226500ustar00rootroot00000000000000PNG  IHDRH-&IDAT(ϝKAEԋIzHRZCk+3 ::`Do=|ݙwǶmOZxial5)j5TZ A_P.L!*5ZI#I krEwY]^ي;yxg2]c,WY.?S RqeJj}7~ ́1yg*gv$,QA]A6oN+'slDf7%MB brޙI8"xS>S#wom+Pn2L&IENDB`zeal-0.6.1/src/app/resources/icons/type/Structure@2x.png000066400000000000000000000011201335333561500232070ustar00rootroot00000000000000PNG  IHDRr ߔIDATHǽ/A'w`@e?u@!\bUf"KsdE^Y.׭ 3+l {2kWUze :c :du22\!\]Ov `2SJ! MФ0CH9Do@9dLAG/ Cּ IENDB`zeal-0.6.1/src/app/resources/icons/type/Style.png000066400000000000000000000005661335333561500217520ustar00rootroot00000000000000PNG  IHDR(~PLTEѧRٷldž߿zăճcѱaյhϰUعsƋػpҳX׺oljӴYյeʏۻ{ѲW}ػs͗޾~ټy͑ݽzuٹnֶfִaٹqR*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Style@2x.png000066400000000000000000000010511335333561500223120ustar00rootroot00000000000000PNG  IHDRE/PLTEϥUЦSѧRԭZݽudžyټnܽwյhϯWѱ\}ϯZӳcā˒ػmػsDŽа[̎ݹ׷jӳfڻuػxҲ`֪˕ٰԴbП޺Ƌ޿yn{mtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Subroutine.png000066400000000000000000000005661335333561500230110ustar00rootroot00000000000000PNG  IHDR(~PLTEѧRٷldž߿zăճcѱaյhϰUعsƋػpҳX׺oljӴYյeʏۻ{ѲW}ػs͗޾~ټy͑ݽzuٹnֶfִaٹqR*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Subroutine@2x.png000066400000000000000000000010511335333561500233510ustar00rootroot00000000000000PNG  IHDRE/PLTEϥUЦSѧRԭZݽudžyټnܽwյhϯWѱ\}ϯZӳcā˒ػmػsDŽа[̎ݹ׷jӳfڻuػxҲ`֪˕ٰԴbП޺Ƌ޿yn{mtRNSPVVbKGDH pHYs  IDAT(}v0QR+H[hp#BB?8d ce[Y_Y櫵یwos{xԗ; vEѓ<4@HLjCCN( zP`e^^uHWƒ4Xx[aLdJubAYCX;F+2ОUѝC'lKyN:QCj7UtJuЯ'J&(MP]tZ``15ԏ~?$$NIENDB`zeal-0.6.1/src/app/resources/icons/type/Syntax.png000066400000000000000000000005661335333561500221400ustar00rootroot00000000000000PNG  IHDR(~PLTE{RّlᧆߝݝzᣃՋcъaՏhυUؖsީؗp҈XזoߩӉYՎe⭏ۙ{чWݞ}ؘsⳗޜ~ٚyⱑݚzݜuٔn֏f֋aٕqՑ}*tRNSH_}IDATU P$Eж"Lihvp`]H I"caUhܸh[ZsS]vϾ~IDSf (>)8DiIENDB`zeal-0.6.1/src/app/resources/icons/type/Syntax@2x.png000066400000000000000000000010511335333561500225000ustar00rootroot00000000000000PNG  IHDRE/PLTEzUzS{RԂZݙuᧆޞyٗnܚwេՏhυWш\ݞ}φZӌcܤఒؖmޠؘsߧЇ[ᯎ˹בjӍfژuؙxҊ`㰕ŰԌb帟̺ީޜyfa06`&lĶ8ךPAW="_a@C< 0S .)\(@w%fQ-i:n0FyhUwa?+BPY8a{}y!9İGGXHRLS5;=YIENDB`zeal-0.6.1/src/app/resources/icons/type/Unknown.png000066400000000000000000000002661335333561500223060ustar00rootroot00000000000000PNG  IHDRAZ}IDATc??P#h fry%y1%!:?_SU /96I6jbsIKt @X; yIENDB`zeal-0.6.1/src/app/resources/icons/type/Unknown@2x.png000066400000000000000000000005241335333561500226550ustar00rootroot00000000000000PNG  IHDRIDAT8˵MJPềo(T rC  "wMt/$+H d]@Jj篃 ܂Q/ѫQsu0s;5bΚ`5s^lBN(BL9) FqCibOGGEH-0AttĽ5h< mJ-P# ^G+\ Q h=?v %k,qX(1)d_*={\^.8jt4OFNYr IENDB`zeal-0.6.1/src/app/resources/icons/type/Value.png000066400000000000000000000005671335333561500217270ustar00rootroot00000000000000PNG  IHDR(~PLTEbvn|q}v̾աp|ǵrijxzʺЭzĶvɾs즌u ۜ*tRNSH_~IDAT[M0 npQC/hN9?~ɒM_81&ROz5Tm!OuQY+\4Z}EM7a0o`VKҗޞHETIENDB`zeal-0.6.1/src/app/resources/icons/type/Value@2x.png000066400000000000000000000010251335333561500222670ustar00rootroot00000000000000PNG  IHDRE/PLTEcbbi~xnuvs̽zСp~Ǻzqƹvʺɽrij| }tRNSPVVbKGDH pHYs  IDAT(}v0` :^esږuWp3 zjpyrOM49J R4]sS\?ֈHdb,yD,R`1"U;Z =(gQK\ZHW9&Bw~?OD v49>MH'D7g[l:HTu$A+gIN.JSޛFuůu[WWw-ӴI!#f43C=;A?\GIENDB`zeal-0.6.1/src/app/resources/icons/type/Variable.png000066400000000000000000000006561335333561500223770ustar00rootroot00000000000000PNG  IHDR(PLTEb~Tta}|KkcjNnvVufJj^|ʫkʫΰ\zv˭ptNnlzMle~ԹĢa~}ZwύQpgxTtԽmePo\{[yPoRq}ptRNS@fIDAT5AJ@gnܵ @EOtՍK)bhq(W.Z ݼVg [u"aneٜnL%ŝ^<|Z;UTiqIt Ht<#]{!Ѝ(W."B~IENDB`zeal-0.6.1/src/app/resources/icons/type/Variable@2x.png000066400000000000000000000010551335333561500227430ustar00rootroot00000000000000PNG  IHDRE/PLTEPvPvOtX}oiblteFnLtZ|{l}IqvxV|zPw󺍨Syѳʨּ˴^aooÜJ'tRNSPVVbKGDH pHYs  0IDAT(}b0 JpP.2)0'9m,ñ-Oöqp7±p7fB0!LDn&I3 Ke=%2PJNP'4?R ѡh3"aO,RԴ Dg(qT.Juڱ C5хS3Ut C?(+dWjƫ6Njd_=pW\B@tGlXNY$ ++レ,QVUd =374~ Nˡ~; ÄIENDB`zeal-0.6.1/src/app/resources/icons/type/Variant.png000066400000000000000000000005671335333561500222570ustar00rootroot00000000000000PNG  IHDR(~PLTEbvn|q}v̾աp|ǵrijxzʺЭzĶvɾs즌u ۜ*tRNSH_~IDAT[M0 npQC/hN9?~ɒM_81&ROz5Tm!OuQY+\4Z}EM7a0o`VKҗޞHETIENDB`zeal-0.6.1/src/app/resources/icons/type/Variant@2x.png000066400000000000000000000010251335333561500226170ustar00rootroot00000000000000PNG  IHDRE/PLTEcbbi~xnuvs̽zСp~Ǻzqƹvʺɽrij| }tRNSPVVbKGDH pHYs  IDAT(}v0` :^esږuWp3 zjpyrOM49J R4]sS\?ֈHdb,yD,R`1"U;Z =(gQK\ZHW9&Bw~?OD v49>MH'D7g[l:HTu$A+gIN.JSޛFuůu[WWw-ӴI!#f43C=;A?\GIENDB`zeal-0.6.1/src/app/resources/icons/type/View.png000066400000000000000000000006561335333561500215640ustar00rootroot00000000000000PNG  IHDR(PLTEbqTfap|K]csjzN`vVgfwJ[^nk{ʰ\lvˇp~tN_l{zM^ev~Ԣaq}ZjQbgwxTfޘm}euPa\n[kPaRc}NtRNS@fIDAT5AJ@gnܵ @EOtՍK)bhq(W.Z ݼVg [u"aneٜnL%ŝ^<|Z;UTiqIt Ht<#]{!Ѝ(W."B~IENDB`zeal-0.6.1/src/app/resources/icons/type/View@2x.png000066400000000000000000000010551335333561500221300ustar00rootroot00000000000000PNG  IHDRE/PLTEPhPhOfXooibyltezF^LdZq|{l}IavxVmzPgSi޼օ꘧^uavooKM_tRNSPVVbKGDH pHYs  0IDAT(}b0 JpP.2)0'9m,ñ-Oöqp7±p7fB0!LDn&I3 Ke=%2PJNP'4?R ѡh3"aO,RԴ Dg(qT.Juڱ C5хS3Ut C?(+dWjƫ6Njd_=pW\B@tGlXNY$ ++レ,QVUd =374~ Nˡ~; ÄIENDB`zeal-0.6.1/src/app/resources/icons/type/Word.png000066400000000000000000000005601335333561500215570ustar00rootroot00000000000000PNG  IHDR(PLTEH|H{^{}Gye~ud~a{pb|Ct_yj{Dvh܏ᅙkrt䄞əoxfǀy|tRNS^[FIDATE]NAvU!!D`5Q3tsxJC$(Is\H7=Tq:Qn5߄p@\c-*^.,]W LrP@\~~YZ !l6qIENDB`zeal-0.6.1/src/app/resources/icons/type/Word@2x.png000066400000000000000000000011761335333561500221350ustar00rootroot00000000000000PNG  IHDRE/PLTEI|H{H{Sq„i{ƂGy_yrmx\wCtjuphfe~{a{ɷFxd~ktv}НЊǴoȽBQtRNSPVVbKGDn pHYs  `IDAT(}v@ EQDPXj/jz\>yIȆL&x盇{i4;l3GuH:]{}SO$l@)!e蓅#fӄ(G0G#s\R"9C0>Ωb.)/H_hn.ifˉVU-W]J{m@+8?2oDZQB V2PRYͤ|QlQ{F'(~Tr`H!E2h09sf i)9y˵adM)^N-kzr:|w %z tAa |q[n~VOWR?es-=7IENDB`zeal-0.6.1/src/app/resources/zeal.icns000066400000000000000000025047631335333561500176730ustar00rootroot00000000000000icns TOC `ic08C A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  @IDATxYnu߷c$EHHY)9$JXSESy0n$A ~p# )N")HElN=߾{MUs[iuUZjժUî n ID;ߛ)7%:JuAUzPuJ^VVWN ^@z"ݴl't/]Aܛ SW!S#\Y^.;Z-GMxU=)zrߞvrW_ rk|54a5>Z+pV4\-{5n=}ݴߟn͵n⾋ Lf1LG.I??VntGsrYixI)ϻ)y޼ȿ/|z=IF幛<#~>'~8zq20"4hR%ߌK,Q?Q.Ί<'?/86ZIX*gs&]C -˧!|VLՃ?C-wW9_p]ʙ4CW>xM!KE 5OAF:ɦf R Dz \GU N`?rǤ;=)c )VϕY>W47)`lֳ_¨,~o?::zpp0x?nݺ=coGx?y`VL t鸛>F4v;"}{o=DMA+@m(wA31zRs 7+Ms-xD 9W(u |KW X(8Kv0R.. jRn)rY:Avu+톳Ui njCOd%1t%ۡĂ\1,޷WU |R4'eirS巕Ȥ6Z-q6vuֻãWW_ٿأ;э6&囗/\~g>Hy`gg~l0zvf3Onx ^}:Afa}ڳ*>nizko^薗 -=V(â1@WUbz9t;`u Aq0g,UEkF5Q.8x* D,*| 0PqD(6Au84t )Nc%CCzGDwBw#`m@[.G]IrXPYwAISV$ ع(tg׌zWaMЈq>ֿ~ȧ/|j:79)#oA aAUZr% |3daG#3.v4Roؿ2Ϗo⟿gox# @{wvv~~}f)z.̺EdN1<3DH*FoLAw̺;4nwThm,nJpLC%uJeĺF 6eiYǝ(zN- e^CϹCйh8…{u"E5(p p5*4%e%iDRڮ;˖ 4: 4|A_'tWY!?n!y,t(ֈ^oVu&ݳԳ1/M"|1ti_rC~+(1p(E#ϭmz퍖F[/bFg~^^;338! 3 0 &w2Ο{ދO_ۤqjNsJk@\D  ;⏊@/&a}A;w/S;m.95/`F =m{N-u=?pe ﺏ>~nVVJw |D~w{ 1p7g-:_)hlHȕ(گ=|x W=>>xq}n82 )܇[ ^I9Д†peu@9݇_ G7g~-<|:BV曆|Sr~r[V8E˫G Ct]^C  p0UଷO*g9uP~WVG>zm7z:{x?Vl #gmU|"{61^q?z'],ܾ?`}r}/x=1;I:F&RV+ܿVKjU;`/u䙢!Te;`tci=z<6F!S~ F+}ڛCmxY&o;BK8*(Өx{|+xuS;E6V>t{iIn8{>p_ GYhH/ ><Xإ[Lxܫ!&4l-܇awĸ`K;<66 [<8ι;p#uRS;b1&wP+]|M_uPC/șb nzCNnli;B/٢C2tV=>س۽tzKg6/o<?h'x]~_W~?M <䦂 nߙ1%J5:&a qpoퟣ6Ahox] //:ߵkOxp}&; THzGn]Jv8Hw2T9+{( ƌiLNcnmb6ֺ yyx|OW[}ݥ $-NW_i,|z|}m}3[=8-6 :F/fKOgc|_AwuCTgc6倏*-E&6ЁqT8ˁoD/5@3'kvOjыG9V:Yg$>2ϖrh1)r)t!LuisHEt_\ܒtqSS;ėg{ZT|zaoBw(ψ Cuzc!%' t,vׁn]2D(:+[x CKLH 0aFoǷowp{G>_^Cf[KO/=Hg۷G~}m{{9L+!VId|0~:Ro:?c{Is{\}ZFovgݥA߼\wcx-Gr"ܹQsyq.􁛆hE0y+^S7;KOnc >Ɓ7M9vo쭬OoN][>w??,Eo`wqcvww6vzlXS@SpG qPLl-IqgNa%vR7.g,CTg7b1$3VA KXYȆ۳aD/Zjd^[XX 0wvk#F4I /Fs-MH0Ȅ 2.} ']3E)/y!U> JW#qfGFG('Cxpe {lGy]KFr[o3 k>+u&܁e;-GSq<˭W=V{nʃs7C^:pˆ)ҾCI`ڪs8`iWZVhN7_<;f1ag__3:PQpo]_goyogX|tV ?Y’& :(3L e =ι1W=!J>VE|t{TJ\ۅU!B#z=<0ã0kÐF}^Gh1E ==C WGM+)hXjA4&*g ]TNANL'2:4Da t<] \SVE1{#QB㧮_IFuo@Ӑe E{ȣ֝=х_S>gyu%1* {_qX~d.⭉&Crև ;(GDIJku)~Xej3p]v8?ҳ7'ٷcw?9V1fc?bԵsPl`?֭ٹ}awggsD$5v}ֶn"'L* ԕo*1i`unLCꁎw}}*A!v=ȐlN֋;o\{?zː+/%`<_Z 1ۿs#sU_pxtm4zؗD72 мmh iyJwim[+{=(lҋwoOeJ)@ H:3g0)<@3r;p KL/S( FBZw})( TSAP*6t0_m `Qw0c\|*84Xtac0)jOAc~0[/; %UZ뱉JhrAÑ7,Dąrr"q>4:o,tfxK1D1TQ/=yy{i i zgK zѿ`t|i࿃ڍTifL]_N]|)fc,{YaI%E^IGUdMxZp9eag_k\ ⃄Ћ@ڠ!qʅ'o:Lੌ-5k M !S?Άvi[56s&W ݆LipEO =x ZmWabp}ed!#-yBMh ZxL%*hMN j¢a/MrqjӶ7C*P hҭj~~9PH}vȲLڃkLȢ/LK;p6=ixgV~kKw]3kßWq X(R푏We"D93jeWtlBb3L^ٍ!2ƕu;ֺehnƦ.>rwݛg`/@a(L$X)7w2NV x]EY2E|4cFì=2FoSb(`6Z ==(_:ܕ+| 7\xxL % }T\UEJq60Vꃷ{$_c^zTNoU@;cԋjd&435<';$dYX {4Z')JVpu 22rKr9Ky{&K" J3J:/W0^Y(*5x)a/=nnfj,/>E<>|pv3^D5 ŋ[K*`E[r܄S'Te LcDok|o20u:[u93 >@bfp衅.vBah^w[W,yVGFX2D̦W- cYBQG"$Kr+ /%] T5D 2eL ^{:q#<«tΆx" Z"_ . To dGE Z/?SgZm W2$6AD# QAZy…^dшdʯt[c,>7)x"-ad/ &fa)^d2iKtlZ󗎆[ǸB6|^O;hd5t&B&Al=zx[V>wm!VX/1˪5C)xpdD =. s&cC͵D@(# yxыxP t(\͐jI]6LK$"œ`V3o%0;E)< O)o(@'s(w XVdexTC|!xG nY]!k#}>tmR!pP<8뿱ޯ|~jb(Qx3p8`܂Ӫ( t*@CD Ή`8qYe=.pi0(Y:r@|4LbkË@>e9M({"K^EŴO)(`hWg,VQqVIT4Ð--6ɹ#&DX+H@v$圚l&th <!!mkzAB r+@5 #`k? iI#YK3QY{MeX"V3,X RI-=7dVۿ $L#K._sn]w"w2 bް ޹#Ok ll .tŇo>w4~ 1iTƇM=('֣pWKzMfWz"BbaU)ncֻn_>ql7>c;7RXpޡvy`yKx0u?'[&$ ›@r XN߷O##Nv_{^gS&;9tDA7уҏQ\9f5%N^mG"/. .?op|Ύ7NXC< Q cֲ Mw9*?DgM9r~ ; IzΪ[nݏ"*|Rs_9ŃR&cqGz8dz#^6P=0 FQ0Y˜@HYd9~}`ĖIѢђ^¹u7otLjjd4ZW;xS_{Ud{9)`~”N ,+!^=G`Zhě=7,q@qM#7/z;c0+j|f>O*pZ'po#5%Las4RZmKw"A0hT~4$ߝE <+oo/PtFw<^2 {! PL*j|jowUܣn2s: ar6ԥc[rIjhEƞ Qzfk1(YlȪ C@ 46x F9Jǡ̕v"*_IW3D3 tҀWl)̏(Sܢ֗ 4ܨ{rɬaw \?qXLxW]\rF^\@ӎ~|uu#KW\q SsG0)J݂vRm-<oUՊz+@FOlۀYgvThRVUSE[%By =CP*EeE1M3fH2l0LAtA+|h"Qua"-&o9j "_-עr;[hmNqHW{b l}Q?]h=w-4ƱgM”6oS@\o(WЋP#r0 ,)塳LOCH>sn_yaΎ?1{Sܸqm0.ܺy[6R§TTnXPJM `T)CoL4IK>ω>d 8*cE`#\Xq>/4TDBY'+ȏC-ħŒP^ZV1cݷlh֣7vKJ/4Rj9Q q"GB1kETNW8@ehbj,s+W匫Wq7gXK{h9o@ZǷo^oൢL tkIvA-GüEdz#o8^3伷p"OSlx?渟1"d&\#bcoV[P!ݱrim7_%zb+uHϥn:٬9p%7;wHQ9VzW*UMHWfnMAoC Bh UZO{4p{0 QI㪵YgvID'=]1A_[-> pn2L)jWg#%吜cK-hEt4ISq9 +? Ag ˜'&]f7z\>L@by[|{gHw҉@sG6~d>ێ@O6,V)ZY g>Qz@N9;V}5vC0r'( w' #b-Z"Sp"paʜH*HBx <۸T5w7lX - ?H)%uΦ;c)S8swius_c27$ Tbs*u$<_+$_x/RhU|_=yP/…!nxKORQ }Z0a#\OH|p% 敶ɡ} :OCBExPpY2no]` `B13%% OZHě|oSe-zUk-f|(hu  U6}jfT.7ߑ+:ϳQ:*b0rQ7L*7=x'q`w C^B9ʎi e ʞpArVkA8ɰ_o| xȪkwzy}?8Md`N"(.~,>$r ^#6 Bp\_<(; /e)Vґ6xVl=L{|w$R]~ %!S v<7u}? Ps'K 'ȵ^IM ģX2'QYBL=mE'EDO=GAM|6pYQמvtlXIYr毋1_:uh|kQ`—wZ=I9MFR  1fʷYfOgfzۅV#F4LsnT4G—x~xVv/lu;[?tytv[?h7'2x=$.YBQ0#(nQhFZ)jn?8 @xʸ%f'ϗX*@W=pSݾH 6溇@ SR !\5$KrPZĵfH<@RbUefzЮy"55d)wUQޒt=?ʱ4xDZƿuؖF T-zR GippB^]Fp.֯k U?@M΁B7=7 W5 {bC;0U8J\y LƒfI;=mNj->XПG,_\B~Vh ^`"LrqR'Kɧ灑O PrW77(r@xD`0%=Ɔa/{u=m-֞+&߽9';Zh.€xC5䩖릫 _w 0- H!Χxk1D)H E|vYivA*5Hy';"2&3etPg6F2$)-Nhi[m7,DR_ KFx+rE˯|U@W롩T[FB%JJ.QYKyJRFbFrbF?/Jt+oF(l*1@ ѳ#9S^`G\mV ky4FqGzOo> 5#_?Ei{Lr#g_!\ D8דؔ1 ~_BaXJ+–$]0|Ib(|8DR?NH}/bpm~y۫M\W'HŎ4F3^'XJR Ƃw󀇤\‚yBOl3K=Ddȫ=yLOU#h|sW_FPf pT,sșwcPy1q\qZSHEv.B Y0QSv閝uيG=Ĉ(2{J.d m!z<_ xϑ"O}#=D"*p/kI:Xpk `B6DA8kMYQrqجH~~Jk@$C2% xK{wɵ”Q) W{6[GXCt惋ȏ[&! B?B'qWӉ.zxKτ 3kĊV88Y9?v/!Azz҅,EMs!ɟS)}W0\Xi{Oe SǨ cho#9i,O ` >1/=^)\`'jIBDߚen7}Gr8!zhA|[m*f' {6LJuLݹ2 -|W| wI/,={59>f!w'[ 綹V'B% 7>XxqR&FTbq*R17AtYW%N(Lˁ&&i_)_kH{hhi޴\d{Dd\Oȑ=l}$RT<+0qgT/kޚ1,mm-M[v`,* \% @746ʸ^~bȸuwRb3XSr%4n:UKQ 8jrCr)0C%iT1%Q S?xu=#|&_mwܷ1{UȒ-ZDSgǷzYn`W)tZ56 E0ХW AaB<4wѫObm@0:EHN-h_L(;!ȃ֥ZkɎKEhV*c| n[ѧķ?}E/ɉ8$L{ 䠆3kCr@IȜZ^ң_{v nRz|~3iDkۗcȉo@> {Ӊ^ 'xwgI2bh\g'Sѩv;t:$,BL>'(|smGlgR23c}[s6b <4>U HOۓ:_ qY(x;nrppJ9/c(n-ʊ5kWqW=.LTpmZ ) w&x6:Trɧ _|47=bюjԮ6|YmBWzFbZU9\V6!TVŅh4&}? K"xhItҋb̴dTDsa~}^P\-0?Zi)7=+)A@KψbF+˜^{,iO)⩍2o}۝b朥/, &52ֿZ)Vy/7ec4,k"X #YNng .<0*jpr. z3L[ñ,6ZEzv[1kA(eRdR4\{ޞ%'_=虯tw;I7ۡcɣNzV 1fT (7kq}=P=O[4ܹ->T9 s߹-4❰%fd e54h lگ*SPY(P+J}+]b gbrc/a<ʧM9{8`.Ti+[W\tKϨaHxpdO_jFZ+L ,CWRN($ڲs7z==F$@=03佃kq篠tAvW cė?3O-;3,'t޹x h䳼gp)~%0VtNJf?v?o^z8&|xF7چKX+/Tw(|I':ZgF0sn=Ԗ/+ZZ83ݠ/5ź2#j@]ơsg׺5i=I(}iA'⼗p2p c;o ېB +^Yv uRI2Wd%*$ Ot_n"~2فWK4U?qjPX"D7!='_YD"ty kmWbHȷO# '}sQ gb.uvS9pw< 29DO8 o gL?bv"fȗgZ'/q_x0XwK l!q7;*vU6,ڥ Ww f}w7?k [2ЯC7ǫRKvZ WuY$ȧ4*ü*jL"C\vM?b@o/vwX739I8ʥO23 ^=ki}m & tR{Rc۟iD# @[}ˏNF|^Cԭc0 VJCS1K3H+YA@46Zuu-H,QŐ]zvcM~S'\Q$8D+ XҐ_n{yJzhaH(pՃGB+m,Iܤ<;d-OMA`wآV2gLHy,w&tא@D k5>#㾋AFSuԗz|,L<6Ih#;a!z8:}\s1ۄ${l+D"bq{ުZkfE3,cGCaR-WĒr)$d$C\{{~7)P߽M|+ʥ]d_w5m.n&uld4e6{,RfшɰDDC/WLp/(g;vHl-6"{LgbEo|k>B 0|YVutj=% uY^ mU#y0_Խ`\'EFl#O0@@ɯWhl̶ iن^e[k:`rVAf6O(w_2mNoq/˃DgCzK/_g֯`ƌo}cF7qD{[RNr뢧좳9m~`"'])!2d*_:4z@#o|g⫝̸moG|7_g N@.t2'"9-$@}0̢l%l5O#w.Ir~N8c+A,τV>~-ZZ hR\iҰGԳ͡3&("i m, rBřrBs3F#i0V:NIp'J_>qJe 75f Jw۠^*%z;{zCCpM9+؉;^d=Ƌ+4ȉ|Z*K!P<)=DPhH !;6OotlfF=*oOd9dU92ʐOŢIZ R_MY'r \AJ1^$3/>#CD"Ò?84.3ڭRAz0<ˬ)̥Li߀I4N\~ ]xpQwk3p#@cޕ2;$q#N}{ՙ'; jF_޺,3Y4^XDcu4Ӂs}<嬅cS\m H,tQh^ޒM1GTb*ܶ&PzAKUDGq=eg6Bמ2=&Y܆? $*$zga%QEďH< ms-/Gȭ/X)ق|3,( 9i֑g:m.2 2[W4}(wOQul @s[mTR#y bڐZUˍju)j*֣F),@YWzJ$$ma=Eh^ol =dU͓618eմf0R>dz"[sF<Ƽoܕ,fOvnw>,u]w.b gG&]4j,ܵG'ڲτY>:&"#k @8cGg/04PcIP A7?҆YXddžg–\bq/7'6Qhk04:?0 -*sX#jTɦztl~<=.n$mPT8cMV o6#V(݈VB[a(,l>Jd\~V ^IOӬtSj_ßҀWQYb [CțtpM$>禼L'id.1Љ>.AF(HO $%b6dc7(\HVgZ쫻Wx[7<ӝh c?^Qm+٥ )lGul}a1pCIxȅk-n$VYkC ܕE[E=$0i;̹ qWyG7}ʧЂT͕U@xdkRn y]'p'O 0H*p,sVz FMWΟ}Q6FS˓L󯌁y6 ׫o}r6CgX;f"0BA XE|_ъ 1KB,t dV﹋gR*+2tqbYA *Xl\UoCfږEwv$Bw'@OQz@ik)o Fð~8e [7 8ӁX9Vjrω Q*A(G(?3Qo#L@vr\h=rLCJZ&ikhZ~iz0p\Lw|!^ۂ9edKU:oeV(qb2^O 0ۀG7˃l,:e6K[)V? =Ʋh=Mv/™fǍ,b) ?'pZ=qP 66pBfll| !o{54:bTKXᅡWS ShF nԽӍ <8в,ɳxzųeSH qO㒝MyS< k/q1' `\g͛`;5CmwU@yO^~oi Ho.tdGEr=n} 7 dΙ"!+k׵eٕ<֭5x)ugr%p )|5xgD`qo!=)ylrVxK]772,\SubOHɍ 0db@WJ՚cZH̞smZ>ne74!E,/Hњ}. K߷2оjP*5\x4𠒄Xy; Eoţ_q,;>W}F1γ "R x:ȏ Lj vS $)\kӓ\Ba'B& Ąb^8JߠΌ&ГXd'P[ *AMOcS"gWGIU>о9$g5u.xFϳ˼%wd/~'軽ս8ZK4#^da,nׂՈ;HaRY>~>2[o ޞrڳsɺQ+M" I$ѷ sZ|Gg|ڮ+*?q鴔 p7`Iȗn~ʊ B*7!N̾(ϥ',<g`xQSҍwq4`Dd.z/n# ?]3c,<}+溲{nj6cCIz_K |񾠒drAfNb3xk~,*(HS@|=G/ȊB5ZP 2 +L`zfC<3Y?%TFbg9mݸWg9}'g]:c}vťLKʷUFUt;R-l2(ԃtKӓ ӆ.u#`XEa1;#V]䣗6-`~ FJC+B[A+SPW`_+8Ǚ I P'':o}X҅0 6U7ķ@d-|޲Էڄ6t?u f0ғV k.7e9&ڼd̳ >US.Ql!X?M/Dw>,G٫~LrR 7/sGbzn t׺"RxC9ykMk±`J!bk}y v`άEBU؜ W)V!E4?cW:|KLG mTO EYbLA 5qe֩m-kR?>?4Y$|LߥaHRtS#COl1r'"mMlqРOx-dVsN91f]/4B,h \Dûq+"i=N]&4 ^c?<d"4|BU\iOgko>0īWpo)cipo:"=L}fgfYm뎾ʎ[Zi>Fl?mo֫kr{>swDIIQ%H Eb 0 @cC&7#)FlYDRIQdgs~Z9>SjժUUUU@,hrtvk#>%N]xN;kXOm U>4dlpm >--O) uP Cs1 )ۧ$&zۜx}vz+|4lHL#Dl# u:1][v*GT`?^쒒B5a$$󀂮ڃIa,nQɔdR>L x59{*vqiQPKXGhyCKJP 2HA{&wf!(H5 %\"cʹ;q*R'|{ &x(I*g!^]W^N/Y~5}w>j9ft҉X,ovҖjmlc#\GH I !aX<қǜl)ړ1ǡN-c>S#YN> V"5s뮾(P9FaEyZ FjeJM)ɴ'LH8܇0ds?Mac R { rt-cB^ށ 7o" >sK55Z_7Hm ]Cj,'ID; @ae. 71qP4M̰+Hevu}fէ|8>vy~gi ~+挝Mb\p|{ɫLg9y:;.&kYZWɇ&h8Y'<)[G '"B#?<|7~{M1wag E'?rib{V@ [ZL$C"*Ἵ{MK9F;’% F[x_,a~& G*sWq ABswWW8&c%˞}h6. Ƈ1K K:qt#'pMKGI‰/]ɅE ' 8'5Z[@{40 tV:H xke=n.ǘ2y+_pWCI=}F+C۴N>`R1w*F;aB@ȂNyb_5fтw{$Ok<|K9s?E ?4}.-Mk?8$!Kd ԏ&N !G] x;?C^fS!IaZK}ؗjB3EK!2~L) Qu/`uɛ;{Ya';")ג/&3|LIX)}o)]  ]%Bioix%xnjLQb 2{`JQ%>A:2$"`*DP`"vؓaOt) |4!u !H&C(+dBEI3ID|ϬLqђLgK /ޥUzo,Pr>3<ȋK75(~@2AV#k;;AfٲJއUb %'9Ab/-= a(2鉘nn$=:tg ^mG,)]|on"v0ɷi5LEKvXz_Ǔg>s 53$dCe2,y> 97ۮTѓ2T'B# ZE56< 4|qo9_) yvC 49aa%߲A";ofoHZe@1eBy#׹Մu5pbXB{. n$ $Ll~j{.Џ}zvr+pzv%!P@s4˥3 9{$3:+(ʺ2u\үG}G5ˋWka1G mM6as/}9gؾqO Q~/g?7QyKד;lҝ:dĝ *'z 2>sG( YrUhK2DpMH= ?"|"Ec4{&32ܻ&xEcJL~EsPxDhYSʙ ŝ ]F(z鈝BBIV8UXG8 mB%y!7^z. Quq;of=2} =zW.eN˜xDcUz Q*.x{&To"nI'VxbCCɸ(_xLHb pWw߈n][{ңPLC,bei'tDUՖJfq#R^s-ӑjUUeWZŘ衩-6ywS+X]XP~au ?O A:X^'6q+ ٽD 8˞Fb)!'q MJK,R ʁ͡BrW*t3vNQ8ǻZl1˴FR!˪*(h,;&AjHթ{tCşCU/XV[w8=^2c>W0ņ0rx0@02d5ؒ0rb׋mSdi @~ p!yU9 UʕoX?0UZCC-z#0 |2VWhܕƝUڊxz\|OkD\4Q];q& 1ėrT'QԦӸb垇YWPpeN>C?n s4V ITQm kAЮ=A &k +Aȟ" gkT L8*\6ǥ̡>16B H᭏P釱'm-n\zJK~”g :Ң/$~<>&EN_J~%L˭ ""]sUҙYxB[D;L2 ;ȳ=)-yP'4])AFg2j"BtCey dnO$[ʹyN`6##n 3\q?6Hjѕɼ7|7\PM's/  {91fNk-IW+C(ʣG."-^E2SغO;r.)..sO=0RgTdl*-/6OfؼJO84s 6m_U6!ӽ,:WD! OdT q44)ysꓳ_<%x jAMP|;&c$eRxR=D>{_ {;eg?[^z0 ӣWn4[6MGMM:XB姤Dbgg;QȞ_ "*mvs kÓ[g͒Ck0\/ \ErҖKy,w)'¤ֆ|֖+%W8$I8.r!@IDATWZĄ9AAG"1FN,? [ u=$ q, Il,BY}d}gIk슁]|2Dx+{ZX]7VlP=@hLn^]_fsbf 2ͦ ^ġd3ުFjRQ$4dC'B7U"Tmp;6$L풤574||.˘r/ z3hu^u=ϚQٶFgc&lK @=7L-2 ۝9라d’Y;X9Ai4,qU}7ɉ\_d*^ S/ ӧ6UQRsK&خ,4%)K_f,Y)G>l`e 7n})~OzHof?"{ﲄ8^!Ӗ$2G[NiNkQ0 _)!@RL4#'8 ȌG8Rt].rϸ4`j[!HJbW|K|vMtId#l4 R E×غk!r؏"N|j@43>V`߾C.9,p-A+n \z1\x8w1_,Qm]\E>;z +@ `&0i23#rnsQ&c3BI_ eRьP`NI=wYsakU0fۊv Sֹƭw%%c֥|#7+u5dYï$y@kKYzf9{ ɥ[ Sg d!G|ۛ)!>%|iiI2! ZjOxj`9_`A>)xE@iq{@\^++_pЭ]UWw vܗ o'4fF|4w 3YsKpE 9x,hھOWF#\ZZWն02pҜ i!Sdm";1qPAn]:%a@Udx# 4|T:H6 c}x>d埊@XY't]F6sǙ2iI1途67oL~:W2LWwi} {IL c|K*ޡG<^K.&վ ;/?ˇ~h|UCv,*v~Aџơu\VE~j>~mhDusn0I+&jB0X<5j>Qw'P <@ {hg;vxJ2?y5|T p${@Ad%4㙖>-ףcSs`6ΞK҂ͦ'=mY@@ȴ諾wW뤞?{.isʺ?z*eups_Cޗ-rx:ч_t9Ir~ ,>; 3iNawL(TW>ZL{8 X=vuo:/†Ӹ=HC,[chjxf9"K`37qbP҆o!ҧ#Ti>Y7b%-vVً8A6k&sKZ('Ϫ Mkw=xӸ7LϨ|>Oa(4r%FK1KZd8h[zLK#+v.-P3m8y6_kf  lN4 6G** 2b}&PU{?rj>#gQo se^s aj\4:!-Mu"/vѡ:q8z5U~B/,e~HN,3~c2(Z,oOE}]7m:E:婎Y_-|ct7=QSY>A0{jr1; 4 a<>}>tiMͩQIWcqdAɮAw@v?4:|5sRd05K y-M@|wvUz AӾ|K`1`a39ƛMnnՅ9 -}f̹@pӐD9޴|t9L:Ezlr )r qn04.ɋ<518YQ0JgGFVD`s0~#XWEY!Zk|tC݀.G:QA"X5̰XTGG .|?II27»0ZC<5oy1W9?. Q {m سoE+yTH]7VfJL]8%0g]b>h+(IQ?9U-)%BYTtfObXpwg_x];bkˉ=\='׿u"̠zk`4Vh2"|z$ TX-3|8zpy#EXZ-4f1M|cM XMb߉ ^@p}zzoY *?jD" 'Zx-7?D&vZys> fȅk޳I[4%xwZVn{w$NKʚ7yPM$L:4gv*vDQAn A$ETW]^H+`<ꂽ\u"jܳXz2 Liq8>_1vDs)n:fVS{Gf/#EZ #ꂙn"H|&Bsį 6987Qyk{)ub_w,Q bZd;?i1 #4h`p#_aeFEk4uPU!'[_K{[Cɗ4R;݀xH|v #zf8E0ħE"t*$<߉- NPl /}?6^QWp5ZADZ 8. (C}~]O V y,x3A]ϊ ^9M >O=0c=4S bA^l4:deLvh!0)&? WM47|xTW>F}aһ0`v =!՜[(9:ce~&BmG+ie)L{NWVHZR%F4/\;fw Pݻkwsޞ>Koηn)3i]תEp6Bw7l_;mD\1-p4,X__Y+ty)TK8PkF$2{3ή5uc2!s'D0y5'(w\ۍIIꆨe_=3(OÄٍ,HmR_w _WGQpissns-Ƨ`-w8)ȇjd@/\!knʻh{B|0-7L&Pioӽ0zP-)N}Ci(IvX5OQ'.:sx(]o6v HޠF2py9@֮nL? Cg &pvA<$H*$?s }ۭkz6.^gW,>d]{7^[=|Y~z'[1S?Jm̑f8t@\o‹[#6YkD(?PLc6Mugz5R^t֋F̬ y2\M?yj#qދfk. f3t@+%+i'`C1ِPZ9lBZF2`G%t1D3=?@:sBHp'v8A'KˎoےLWK<ᑡKA!Zuvk݀/p#LU4ړwĻt/7 x*΄}=!"c5 K|!(ڻ3ia_]gq,΂uQ}=t9Cv{E3IF'ׂZ4fd)xG#O D%ZueS6 DP;Tji"jmZ*rV>%(چDg79Ђ\]>1-ꀂB3=gRV[n>CYo{Ϛ>Fj0%0lr(;.˟ˇ-'_DoՀ?F GyBvq9N}Wd}KM'w"g23MD__:WjMƌftV%J*q Z:ڠnA37,C8Ookё\ hKt IvQ&$Wk53v_zDV MQLχye¯Ï /~=-M*F0a?x+θno3Ƶ~;xN>w+N&>+ěnJ(&('=U6rp( eY|Y'7.*atƧ3s{z&Uh r"\3ݾyooqlI6/_X]_pc_rzynCt`h7X zVt_* Jkgu==B+c(1Ҩʂ /.DϿ#w" TP"t-#wnŀNAȬa\[R8tC_s J-'ԓkE Puޖ#GCnNcOP% .=4 %xO ]+_FZ]g~XPPh{Vߣ_,?jz'cPLL Ӗ3g|MO4_IŪ\N+vcOvo;D9ގd~3?zѝwh܎+ ։9n?Մ؄9 3vY1lCpQgbx`<,| +i< ;9tˮ_f"=$:uI:TϨzקj7͉v3|SZ*\L|3|2p8C2^u!w^#F$yTՉm"" }/e4 Z r;ҳM1f 4nH}anZm7f\dߋLWvif2-}ew 8ۿ:d? GZ@5IK>d*\FG~GрBWCsZNr唇Y;G@pW\5~p1.bq.q)cV .?ӣݾf&棿T.D=CNd$wzm7#fܲ'eVs$dFK6XlcW%tN"a_x!7y; <8due.pGH9 1&+q~-TF%2a _9Lr=]:3 [ Xt. t1LBb 5Î9l\ٟn-{jcdogݺ;b>C>nWDʎrfH$J@ X U~=Z+'x3o@ 1b_,wH0hZ%ff#~7zy>wKصl[X">9_3Ynɨ\A9l "T.]z532-'jP)9C}ajTCs>G;Jp D !P@<ɬˢyfٟ1cCL4H\F]ׂo/ s:3b]7 xӂyo1|7l;1<<Ψ떔.aXJAˑf5G0^wծ”z)`}܃>.鷓g8$ز ȜE0wR[ʧ+FASBJO@f Ad@_v8d?͒߃՝Xr&"Tʀ4]ĕxV4j3 ՜CS/]qG OȫS 71<|]:p^9=&3tšTm*@=1{`);_ &:tpulB ,!5)@BwtU)'tU7q{&&`T۳ğ*[a[ ۣcW{1NC 㑒"fVKOYG x_2}kKˇ`e'=I:3O1n1cN+̑]"~vEisϽ۹TfL$)`Àts ~`6+a A֎1V#6Ph@ӜO0?B"Y'9Bj󩡇ܖ5tn\Nopd 掀إ4}K:LXVިU3݀8R5 T5@f\$m÷~:|ի u";ĄCQ@^T*;odބۀ& _G*XJע=n ?/aaEP~u̚CaiYP ;jB'hQqvcM) TT #% b-߂1Þ?xG0X 2*q3R1X¿w6/--ApԫS{ $3y9~T=::{.@ 0? 0^TܣCwYmzEDppoLWՁ+<$Й98 W!د̴S( (^gߺ geW9GF;AgEv6%M [UOhvߺӁ,{.7`?}v ۂ?s^ `SIu!<{}* (QQ;f!9 '/wqbj'3Iq9tlõvk JI=C 6OySj pn187x;uAwS w9du8@dk~2\IKw~g< m>by [f>a+RA:}o $ש?" M^!'k{9.;0ga3jF{cPLQ70 c{.;,}!qjA!"0[w`_quup1nfV{f]C?s7-BHp$ɬY<7<3À9YhؿGJf} QL{ I/oκTkh8.lӞXr?/E`x7>>R B H/c{:nKÊɌ5E/~Ba&jN),gs"@H9{NgEOŗ9 IRUmwo|%ˮ;?non玈7soėxslA^X<8qkxW/xuq= hx,,65>5/гSK{r.s>0Cy ?+{~|:c߳6):p2.2gqaLH!-Z]\a8jopuJKTZ~"Ħ.1ŦlEAؠi8E7&<ͺq.%i:;K/Mڅ Ѷg7 ># cs+i᳙VJlFuZ/cR[c'xC08Q׿lx f)]XiszZOkr.t9ODރ6<+/٠Nk&"GDT.%dl:;>~VUxTAJ8'h)tx?V=7R2|\kړ`񳂕aѻ1 |ޥb s8bf\rwc8\'A5كW_ QN!H\;vCb\NId}W|h}m!c;>Nv]vS\%G߾~_{%;3Mï;w?v֟6WG*!95̪1x O 94<#~1  n{ Rp0<9f}?>d)ZT# ?[j꛸#/`qKaN)MIOޏaf1[ Mɩm1鈕zaܨ&Ocjo'׊%.iW"XPvbЭc) V$s ;$nyE.mk'ئC WBf%=pQxl~=BT\#q$%n$Qsc3gH>--',]`okF(O)qc5.[#j1q-ɘŻ-KϨ9{lUXV]Epp/6ts.^b) z(t,Hk0y9 OA\v5`kuyfj 7+DvHEլuB]`>wވs1N& M{7\tc/:oܝ(B]pe%wzX }.$ТO1Tc }%:E>@mR R\ } };hOg 54*4u2Ղg<~tuTѸTKS{tgK쩠x&'$TsW:ęW[|^qhW|:nRf\&z3 r %,3%Vc[RƒOA=X8Uf$CI"<Ҷ[xLW+y쵖cr8@ 0 S0->\%nė.imp!*:]A kx ПSGz8~زZ0Hf\6Y1$cPo+J*s ء![b` JeIJ0k%'Ǻ 4c-3QdZN@yHY^EpB:]N5[.:Afĕ!{:x u !p?-ID#4ʆ[n5|nm-q$ \Fq%8ߗ Ωa5sdI@o4hTEL}L~mh\>s е[E)t97)wytu@ N:.+N7q"Ǚ;" X35[Dh6iі[ &#萸C̖x+$In!\5 E1S#q,X5eBx!TiҪlRIo+aMT,*rJQY6t%vr Er[@+`4KAĞ]r n 1xm4gcC$]AZ.d<N?X|o} Dav%.>}6Gh'z;$SʷtMpP-w(7q< &&3|i@лڱ9u\DY1y[?d'_mɈqw2FʼnWg&@ S=GGdmFi4uYljT7ngYT~S`3o~;xq{/gbJ;tC|.p`Rjw V-pXKs{,׃ֵվ9G*sC`W=͉b<#P]h~S r~.4 Ѯ1 te-?4^OΦ(,]KqC@26IA?pV?TFub#8bL:Ѓ*p`<&YSA/Keq!kgod1q*=CKG0\r5pn;fذr&߻JH3 +[pȇA=~\ȩ˞t,cX67[i 0 Rӡe@g{ oQz1a"6{|jfNs8<]o`93`6Cl  ?lzt. J #`lwiP1){4)â Ά%x<= Ɔ])L=.!&^ Z¯>f'YcP3 ěDW`CNtq8ti{̙ks[t* Upp2j 5"#= + ]"~ mY^Kry8@/W}`ϊ>Gù%!Q ^⶘а]u?8-]V+Xl;q c#G H7Ln>~4j;w}2+H58[§+cQ\.‚f"L6~A"605l!l挻cVz'NޫOpQoEGJIDAָh8Cku媂[m[ g/̬]GGU"ea8oZO su}UDp>*l9[=rjF]tf|3b ?xW?o~%'b>H R+Ӄ9 b:Zp&2M,)8aӡCzOȿ qԷ?}˒ X>!nW7k9 ɹK}YpeHƷfzTurM>WZ& 2ˁWޚ<Xk'-3w-%$^$n r>a K|ƬYl"N p3y`x3i|kӀWq= .}~ZŻ|15/*38|=t-Z~^c+TXq[{Ƒ؃aD]!A8~jc=MeDWWhw8i3m=4"0iB`<-(sIs9S&]gc-cC/lߓЭӘ Auy| s 3'4wcVlMi,3'yPB GbIE_S92.wFnY̴҅I >CEn65%{W(]U}&^AFLϘzRe?'toGtβouWawdB)wz0G"p &muw1Jm\N&鷢$fm,4( c˴]*>[鐞r F.1*MO;xIN"P3*+<>m0>mEɨrC~|Lj'-|HeY%|<} ?[ei:/b!NLpwޓ> :JWo0yog5bmX$+pYde܉Y T?xĉɄ1[zQB)z1넇ڼ-\5 u ]k~f\v'@RxTVd Ћ Q-:\UmQ|>t"NSAXB&Apq6:tgR\$0 80)>؟3tL7E&|5-RK߼b\Dp$5~>0I[rK I0:`<#ɖGMs1{& i/8Q߰J ,ͤi83gU/\e!ӂ- AILɬ8N4~/'z+D‘~ *Un Ye>]%0SB,Ȑ{|@KizAPKye%rVmc`U݃)[H K G[xb  Zfׄ*[wޒw/JkQvyOACaNa%xgarVb<`݋;e E!9%&$R+w7c݀&p,5iyev \ANС%pv"0!q^0hYG6n <G,]qv1g~(-8p] >,˽X[z Mg;MEk{Z%TN v[B'7ntz%PvcЬERƞ+ I.Ewj`K Q.;buLa}0wB9o!= ܡ<=p0}eH.g%1 )ŽrJo=(ᦧV`[ųzDL~!aO4-7s USDJw1]o1Kh国틗8&sg*/jN CC3oBӵlI8-HxL}`2sjbD,\իO=k4e|`qT3\ 4INX4Q`K$vF^5jkT=A tp{@]>e| %WYhNCa7m#v]S|ÒpolHZ@c&j=S`x-T1*j=p !!K77dS xv ةJ`tn3vC3{mwƲO ?1Jh*/)ToFY_Y;~6W}{z]I:^Ǜ7`ƜѠOv_/*UE^:c<~pKҋ%Р zOs;&pd`A , 3{6I5]J_n2pھp;P<”; Ax)lGS`M ^?PY>3P94M2Nˬ,o$=gIcoe73GA9E=et chbIiY ?=)Y@Cd>s9zg:hF+v1TqѻH2q =v0K(VM,K SXb-15組`:iִr\{Þ 3 )wۦ!|3:AUe({yG! [LtᩄJ 4VmƄ&uˌa BݑUWShEX}PFߖUw?s7i6Wh=ǰ 4Ephf[X]6(;-R?2dxeVd̋1L$mj:xfV:9rlJ0ZX]qK2AdUaiMrkzn١)>9<&C |>tR6F(Xu2®_j5\*m &艷>b zc(,):{ ryf[Y˸HgW0pLo<b-T6f9xHn _]Eõ{%1TuwZ!^<үBT#rW¹XtQgI):^Ova+ko1K a f>6Y_g^fğ$U`Dϊf©gRhMLַ溳X[}䚿[ nݮ=Ov79xq:{pApn1VD;H_ Im73w lKlSHRmy>֨>-uY'x`NES<:-Ƭם}{a)z`w$Ow!Z'iw6F/?= Pd iK ֳg";1IGtIρpisjNŴ _q^zVerW(ƶ52gnZ@/-Gd&m:-9cRPnMzet.-:9&1%gI$hQ:W3wCӒ9fn#-O Oˡn|+Br B=B,ӧhhwԺÞ'd'h@b0ql1I I'T sd06}Us&a@pӵOAHJe 0ڽZ*,q^ &6ީq釹/-B li WME>bP 0‰K9woͿH8t r|wτ )L~#05|ނ$p&RL!HO|ī`m:)=:N2e,b%~CɜC 4 ફ[ 2ϐly& ZrJ4twED4۰eZD=8-.L:&q t6䮿$>U /5x3d%Ok.-=EbyR=igoT ws: K;wqλ]{GrJ6 8cM6UMD{UrZx()3.EKvVQvs<PxhF q.19ʧXETg읮N" 9MTzuR$>_-r"8 ?-?9j]!39x28`i HHAQ;DyP&JHB$7t_4D";Z>N@7$ ,uTD @v|$* Xya^Zɐfy:@҃7MN'||@ E]᭰x{ټ0aGhq4t,\鸝5?-TSb DXKa6Y6cL"fp"T"nYL>gG4G}&~~ M-gXQٱ֣ !X6A،`8q*7S=:9p-CSLgZ1?IwaK 77gJn :7]$*Mի;-n54^+=j)|NK1/vIgN`s $g-m0M݁p>|)8םء>v_xç ŧ;7Bx" ݆쓮x;]V#8̜hKYx>{>S1q h#uKG 2l݃;>kmAw%z[,W>Z9NKu :>`pu#tjXL8OX&F14bI}?3`Ü*O/*o%|?A+spkn1N0N[9QtN ,6)?V[ ȫ֐@q@ G 7umEj;ڱ̐bղ(wZ82YZ)3,_faXuiь,宿a|L&}yf weؚ+Q G&xO81IA`NO\wH:pX^FT]{O젴d}9Kt\\A AI2Ϝ$؜7]$0sxHS`g_E ~ia:硙H[꒓ͧhhW/OĞRȓSK`5^O.C:R§`~ ,9w-7N I(3-cG?)P8DR_Q۞6{Y.;AtOQ{+b9+23>Ou 钳] Ā kӯudRa[pK*AR AiE 峒I7dH>[JP%M,ɣ f>ac偩M~} 3I@R S-K[q7T+J*!'^`LXˆ#.2/3h;#"z@En~hĀ9 :h:|-?ʜKII>{xDdL9TVVt@-zѴT%BB 6cŢ7 ) PݭRWVTVEÝ~_¯G'y1cv{21CHj r n*`U!l *jg%p[Cjj y t4?}5Bxg?]x:ymUF>X,Fb\$)ϼ5meDkuF`5:#'I'|E׌,ACx3!6<][Lck/嫿{8$OYt9;쵴~9`r`XtUz@X&fis0)TTqmS 0Jqs- (PPUs%5w;u9H|W@xRk4i e?cQᙿ7y#{>?avEfNeN%Č2RD 7E,CHO7FC7%n1EYFvvh#_m),At DcgR.d 5/x0%Hl ¥g͂x4-JAD WwZe(-OXo0Mr|se&GS#^lN?GjtkS 3^䃟/ۣo'PPޠJRD"T:85nA ׊6h$uQqL5H0Lo" Y|N S{LL3h \Rx}SP7 m Gu&}^F2D ʹ-~rX,LF|Ќ&4150,AU n袼!n [4Y1Y#9cQA%B1Tw*enP^>_OiN\2́۩@¾hQU) (k򫺎6t,׭E" j[xY #`qAtolC^C?MhOeN'@)&#?YdgsJ.rHjO 0fFvKmcd _ualn{%>#9.fr vFݬO͠Gv]yDķOfOg1~I&޵>x A C{C嗖iRfv򏹫ISA":*A'z>8RZ/[w(:ntmA6t&DFU!/L 0fIZpU&9IhwWѯ< 1ݦ >cnA3S}k4f[i9om뵶1;Ν?9w;϶sօ۰w-nQ+Ketl v*_(t $)!05xBk7aE*IK.22xz`Wc/g3 "(W Cf߸|DNOa X}>GcM-6.#doٺS@-$N[ԑRY㌝0#>6imf0g+:l:}#iyD&ih'quME?nP Mۂ&8D!|J 2T 2U9-OS7j($ V)+wp磣k ݇n4[:rd&n2OR F#}GN=T}N>DotX,IFކ"AIMցrB 4"]!‡}_zas{8ۄ8M#ۚX%Tܸ7&#јspG7_!/a e2@:cN'PBMT\?~JT'!Gbu=JUL_A꿑SXVkFR+ wI9L3:| xGBT='u~vvw-㵬Ub%/|"|Ox3~]t%jķ׎ eK?'0ES+7@J^>hE0'ܻ|}O]7_2`ȴ!j6k[jsYt넖Rxr`$}۫+%A-,s"k]` H|a=$u$s.jh=?@qg.<ջlO góD៦N"gCsKRȓ-A>$9CgS`PL}O^׺jyU =`y8"IG-kv$=[G2=9 2*Q?= ;4HuIr2Ɵ,^~Cx`Y"A%krzɅrԜoЉ=|b3vǿ>ֱm7\qbw#> \X@ |űi/>"k:sVp&/}`GϾmvxGl {d'hXKgkuv,M7!C%In**aE!VVV.SyZ0FmYCP?I`_VR#/rnRۀIv2E& d#,a %FQPq&ta_K4PZ:*1~RVUie,:e7M!&=8ѡN B0_z#B'PCa3~ݘS j6/Nހ@dJR%d|fP?m˛ۣ_u7/]X.Ϯ_بjщY"QW-ʞFG!T t!D~`$,?q-!C%*=8&UUd(oDz/{`.>e$u6"l\F],#uSfB}+sF2A+u 4K%?龶0Èl"`jooGcN(GJK?qW. oՈ鄽Zo >#x砈-xРֻIN7UAG<'=r>AYD^M hAڹ5zWԨ">ʝYcw2L$Qs|]!LD!_`o`;U֒B"(L[_畾~Fw #4vvxGwD Nn4#u /=j;#~97 Dq鵣+` 5t㯔B2tF/ /m"B|ܚ=jDW9}??ts69Mt 1&1.c2egohW8J0&}*/۽g1fAPX#E39AFg훾dCVʑ˔ܽv )6 8 5^ٛ=hg BpP4_ ߽!~UY/&_ zEHs'|9pa9>/_ Dlf'ʧMf ;t)ag}#tH4)".L9bO|Q_ m3(G|imQcIa7WH>g;U_8P] #՟c7!/!\w+Yq|M4n4_`8c?K JvϿz}yyv뛜ۜo2@̶'hi[;?,^gr.jw s{|ϷPo?]x|z28̽h p;U8`J> 20-P&>Pc*=TR8n/g2%pjN7GJC0:9~|F[!/Q$.xjlݬy { Zn0wOg]ZpU5VAB-`4aS cZ[`ud3Xhùr5+|&Q]^aQ z|tnW* Aí^㓦]Lͪ"w<ButYݒ=.u}]$'6ծ-W/pl:9P 'sKum^9vM⏯\`ڴ:ׯ.3}E, .mgC=~ܻ~]z a~M#xxPeڨOvacNgo1RG1QMy-D+ަ&^B8&JoQU/(8 G&|-o*_ [Q0|ok[G^f)2Xg{)EwK.]9֣Odνn>|.p*<$ag=ߛhv|WG}uRw޾:;^2ۢK+ٞcH{P>]Q_V~k[#Ot}y&OlJ-6pZٻ4`>,}qaՁUPvǯ7Q%s{B`$KxN8H`ʻ:a>T:c4AČhj'G00Ǖ;nH[C70O7 7HڕMpG'ݠι舶sLO6x∎݀!69|󨯛,gfJC_6QK7 *-Fn$PÀqgYg?rj˨ھ͗/C<wc}ץc|]@g$<*lρG/Xu  }@?U_2zwEaeti ĉG 2-1Era=vwgnPY(Ug3jxzpX%6nԆ°p*mBk&1,|NZpϨ  1Y!uPN Bi `+Nu_{;~r C3髯#5 ɗYU:;;W| d;wނ&#:_+rmA]:gWVwM!kߪ|W.^aT|ض|r]kiIe8Ud/*?e)qS4.ֵjzyਇma(iW/] 6FX_.l`}q^{3XRk;9F][=sd >z.~ʷd[=G -[Kο Rנ3uC?}8]5 ]]㴑pP Zȹi7҃]ҧ(V9@G@ӤGzľTL &ŻYccf{:2U.N*韧 EV"y|vJLwRaxNhAr6F 6 ۼw Ujo6`.|m"r2t n1jL~܌ E42FT0~ˎk;^)|V HRbV=XP DP|cPojw-_웯_H*o|Bk?{ضCkf C?zI.K^/0cI:}aJu}/-v Ô敗.miQ>§4(.mS>E]nhwp5e%{+̵o{i_NwTԲ{`עZ{.!>;~ۮC6#HAP'# />:RRUBR*%֐tFݾuwv-j~rEu%P/,^`CZ1ﳪֵ7_bHki2s{5Kmls:AuF~ d-|| 1kW^]FzDp {m IW?mrK{}ĻƜit0HiBяiӘ§8p(x" 'x^N7kgKS );s/upFfZ)sCpipjjm_9Y PrK0ѬuK9aEG?(#>Yzq/xP\c }%q^j_r%TSLv(8~6v3z/5ڮj.xm&nta OGgn;X] {y ? BZ0^kmĵ4Vn\_Ƃ}p..wخ6ɴK[(>9& YS~>buu; _<6V%Ƨq nDՇXACQG|Ed88iIDAT}i,Ir72xL"H"jɫ qD4sj0Y)ŃI(}[n.}̈/5GWG?ڌj@\ 0Nq lqpg ( qNc tx~U-RG|4#)`?յ]?M2J!wx8g47Saxfj`M(xu2ʾo}`0 S>z"rA{_PĿdsjЄ[Q*=Q0mev=c?us.`jT} 3ws~ p2.PŋHp2V:{r$A9$h:lhE|CS=09Vg3tʯJ9E8N')qA<MD@3l`W2mGL IK^b*ܔ\iVA=;y󳇤FkaZ ҷ~QۑipiLu"W-t]ۿPnr(%dw~D۴r ְMN9`kZ([[`^ CjHt_9EBjZJWscI_f02O@C ?uub~03`^̸ C\>qB톃`)$4=Ťlv(*wjUAPВd 4~f" 4ʣU6v#n@y.7F EmӞM^i`8dXZRy 9­hzjasU-iz>'ͿʜN9ۀV{ٽj'P &[oE(䂉%j _ |Ad,b /g tZ^4Vr*K3a#F0dSf\<܎j,UXA#kW*uyc-'Y˓Gi qgo =\w@X[жUNNeM $OiGF$*#^t`Wpm9*V?|ҥKaxU~_bv_8?z/d|VmC&;4,"80~0h 8i S6ʎ5 s+~@kh |O9UȄ*]s|YFieNo >۫5SE+_~\t|%gx0]%qGC#0X]0jq_@{#Sy@2N5־*2Y,i':/BkN'Ȼp߅ è[|C@nX)y0!poo<¿T.H; AUNQs7]]Z3hA=5쩀eQ8ñ|}23't淢p?t?q5lgy9S AEwb!st`p+WFwWsh @^5y &QUp6ͩdh>+/:D3lDE. S: \#_w{01"̽m*Wh O.a.&dho_G43>PYL9]A3w iz5F$*s{xdB-lVcy6Q;,,6. I<(l%] 2S "g9 %iB).1Up ,`A^jQ([0@\uWha4RqG6(0SSyNVsd=X8!BEW~a+tpw~8>b&Z0WPCrNhNֳ¶FдH<2;FRN|*픹>>bI|"_,IH!HSeia#%S U]X6r?I헑]w7p5U".v\PL癵7̛4RC>eK*b|0O4_ԥƔ5M|+tirc^8-_Dʭa'GRRuhbًbKTYfÔlr5LGcۇUs'!t!V{٫hעd!3~{){eh{TviޏDc ?~e >v}/!dp7߈p/|W !!qsPM#d7 W`ʇ)qA(~i|`Nn1PW; 17ĚYPҙ3D|=gt'>VY#wUD2]z2{De'0sq]_ uu. _RX]fFjGdĻƀf>2 D@h Dumāv|1"^:JKD2Xp]W8{bp@QBHh%!su ׏q8pH9ۚ0<*\╲+0K$0 n+oa0sx2&x ׁKawQ 8XxS pQ0}K{z'mLsҿX5e~xaхTrw5RM?F 6)}]w\_b0}4Hۈh?ZYEsdޤ4L/80LE@2%j k *}R(iYUnBpGٚ*GjfF"h!r#i!#- MgX/F+Uƣ"՚8]ᯊI}O,B_zxIPO-~'tOa,e>"kl dt +Qi$h S$2ܚVj̩U|qGU}{RrE>PzY !,,c& S!4y1_|ȓ`1'af҂Þ1b0~3or|s)\Jb$`o+ ͗r3`uPُ&QvsjJSn;ՂTs) LDNeN^IA` .#m?“NߴilWQ<$mVDn,R$ /:E wJIZ=Dq?;((3,s.4¬(xz *㙮CEsQp 4 N^ȁ|9H4e3#sI^s;@4Qi\75e9Sp | S܁̸.Nqw0eSWÑ"Lŧ d4M>HH|Uj I7J%>@85\3r?(R04jkq &Cv"Ԑd(H &T r*T̆Ce17!qdA\ߺYCEPӹC%[edט9F=a4j.H_Fz\04N-0"OeP(7N4pGLKpu[WG0]7IF#i*lDZ5ļ'/z_7IFaex9:RXk'qikADO( ISQ/𿦈=#0? PGi}X]W!6|gǦ25ТmRq.l_b2{醕YPgoe *n/ߘFΰ( ?@9(HJ?{w&TzU50dzh\o<4Ez`ߓUjkPAFND> j@cИί|skcE7Gyh I[>Itd;(]S,BuU8Ǯt#-zd d!)gd£ػ6Il_ź&^mj_n%PFuRdg~=(HfށmCkaȏ4QIMfv@݉(D|jikK6/]4>Ă<(wMyzyG4(jiODpxFWg^49/5˫s~ #+Nҳ- 2 Q v gЍ&/#n>0{fyiU˄#>hI_uqT'> ;I >?Ͼ{bH\A{N4>łiwl ̿n R]INS#\Į>'ҰX pXT8o.S`tm 2WsS >دq2w;a', r+̜Q׈ab˫ ù,$.1;Y dL??0#c_-@B2qplyA>FyVTWլA|9ٿsx|DmN%<4z~WV~s _?g49f sfmѵJȭqp66^?J3 7f+ ΁}}-Ȼ~"0oh;ĺ/8Oםg\2 Gq Ɯn?xxsDy+,Y9;Mbnxƴ2m\/SwQQG2{ވICc|X/8ܙLNPۀo /o޾u[f> {F}yײ8$EyWH)+bL_J#D1]9/t읞|lxI?i$/^g9gQD^>Z ! o-h_F3,\ x 7r_ m|vE̮_@VTj0y Xd:/cR*t1x6/CK/L̳nכtTZZv#Ͱ PѰ)<{P 1q/1XR2֢i~@fs-p*}XSGŪ.|Έȯ#/mɏJI͛VӬ|sxTC#5@±ް} Vdƛ80}-9=DXp$x_5=I2cqI(D- 54thsnQK<}$*Lɻ@F\y8[ | XDLh1c֋/]lm0W~\e_PP9Yq*Fd%D5| yZ>x!"_'smBq\4Fshòdb&&c_q#Z0]\xxEejĤSa {T]a$ DbA.tA<2^3>OzSET0KR>Wg?S8W7 -(_x>@f^#~ω]g L>͍޽x ŬV KxwR6?1X[ۭyBqA0 = \ NM^X.t^v"Ɲ=(nhe?z 04m< +s;Ճe'?bs?0SvyͣaIw3 1Rsxe *a 1%,7?K[*}.mG;o Jgl2WC,>u~KVN{/;0sq{mJ=-jn\Ui|6g3W'*!b Qv_pK4$ 5LyNBU‹-D<6d|xWb'UN;a'LjyUbfpóZ\Q)u_Wh)]dbF<`8WAQ}e?y?4LժF/if~1[ݚ]M:m\8~rkLJG+xN85Ec>/pcK.u`@i50鲝Qx67+a"TՓ0{%E|3Njnɷv~&'. RpUƜdФ*I3NyHP%_ϣMaB lI&S+M?'E0i7.6Rh$` Om#m`lNqFEWEPU:yg?B_c޿tcͳܟpeG֩r~Q]%~N~V}ߏJH=UKQ#b(ˋ>F鹼 @x%H<O 5H?PM/N ^ G)lD,kemHأf=R(X0-D.խ(#ȣ!3X.vU=}B|nʕ tz &0Eepqw y#]edX__N l^Sz+7cIzOOaN%;Q$ w=EJ}Ӆ  OW@GLlgQ%oS=jB7@d=D=q5}iJt^OO؉i{ AJ{f9Y߁(dg:GPஔ>N/J/8[xt[%(adk=%sC9{{q3G~">@ڏcL܇35:TrJuѹ#v'8xW:}a!%AJ?`}5%Fk/AT鑪x.0n6EwOV|%_ &z`8/^ARd^v`/1OzRd`PpM XŽK- yva͙B|-ꏣɸFyQe[Ք b0ZgNPY:#DV LIa|)8\ Nƕ`x{moзU4nF6pkzeI{U UEq~ L<2D*\klId:;9_y,ݨN"ez1@$ nPcXLk Spcޘ'W9JKUT3/!EyHR$oJ~|Oz&Ht aiTQ><|0ۇGn}>[fm]vǣj98:ຽ4`p6ꋭJ7gDŽaQwf꿟 W8{;3gu |>5k:Fp918O~>gtvM?o2WxO?49XC s v=p_~)7#~:sQ9i;ieM={ #ѻCq_ XmgX 4ՍU{U Lq3.#lcP 4UCxLJ{pg/BS j{Zp̂c Ⱦ ni>x!D-IAA}#t8+EGѯYeL (CﱵŞAs`?`ao͑WvXsZX[!*<ToL{  } qd3JAwy>٧~:/~6o~+ &{!< 8AǎFcM>=~'ayƏgv/9ۿyWWg9+;/_f_Rs3>䃟sv/Sk!i>` S?r+w@W]&' ޅ@ ?kiz}˗%!_%,ZRi"8H߻iEmU-@y< ǪN5Zf|ojm]hZ+C1r*Ӂ`W>ߔojrBCc6 pǰ(ބM<I܅p'xXL/Wwȷ>*/>1%`O?~lj5(wk n*ޔ'K+^XB9f{<\lmm}Fo`7N{ß$ se-^tb׮_쿂_~ CH+3 Ȧ*>{bu|D ޑ.0U7 ,MvJ%S^ӥwE&LVtCW W9q#]aŀ \N@ Uy=H>P焫v080g?% Aq;[|pxv]Č_&-W뻈GF -kyn/%R>^H??`D $)5Hk,]pPa"ªo h~op7|Ivp jUOA!j\a1v.Y"#,#%F^%h&2iI~~ W3 N2CSvgN&L_Cm]Cّ/qw9>xs|/=*>uiw&c~?#?>$]k< ƽb!慧ŭ@ knߋ7oGC E<~qbm*ҥsUK̙AN{=/n6bFyd7^5ceG<@O4HItzd;ǣO5<|Xq2rP1'zzo߭7F/U{d҈sZĂxv>s0]E|/&B \fLd XCw D@ϐ,)[,&>w1d߉.mً mT!bh.2QMAp9u*>̑spO7ΒM0%S ǣ8tD:3sR:w@i onpt҃Oڳ;D\^Wto w&O8pkC]?2޻wg_S `HXZYp*,5syL?O|_E=xJ5+*xR+y/}G<뱢 +K[-mr2PnMšoGówKܑe|{~|6/^H_[_C3> ~k?X>7I橌$'Ͼop)'%HI&UK^r Pp>`ooBj@{bյ񮷸^dEl / :_  s|b#:9"2ȿBOgb!އ"7ǟFԓ;[x'Ӂ[ ,Ĝ̝T\wލx@BOfÜR|e)f(UQ/iY|{:E?VYvl}s܏9ֲg[`n?,գr\?-~wDKKLv2݅o SsخwT] (_v.'D>fM#N-!OY/G!d_:0>~M{û=,voCn~پL6-@|?! KFi{o~O{LS#_bgMd񄢫 sZ(/Q!m (AV `u'= :K@y 8mu?0G_>mww+ `4VgK?ソ??Rs}@Q NWmc~; Dg>_Ł&(ָh{˙9WHbbd3JٲsWdC + onnUKH'HMǟ}/'̶Xm~0Уu_pih\0lk]_[9by&6gWKN1W{Cw~^yp3~::.>ug[Sxv~.xupmᾌKSkkGW8w>_t̜QWI^ԒCs~扌tψSRڞ-˟߽϶统~Vֻs7֗:ڽl `_[o |kN O痘!b3n/Ip}FK'2Y4>1;#QAe.gd{C쑿z&'f_nܸ~7̾J//7_(e"U@ ,oos#h0;k{k2p}; k3ڣ}7F ~_x3xk j/kfiO2O Y)}k8i7c'~#HXc,[ǟ!?㻷wXK|&h ;Rͯ7C.jv8<¶8JzAppicWΓ~޷0dW~&Q_tf~)@\dD&ͬ;=ffc**=r-fx G|$a acUyt ui)ڄR2.[`ej w , [@i{Q6嵘gx@3d3זm}ѯ<:y.݀\]4a㗐2,ڽضa2bfzv<3gxžE |+OhگȨ77v|7mõ-mtwٿJЕL{Y% u)'2g_FaYfQ;_M_Ǎ<1JX+Fb]iuK %̭ѭYt'$_BFbm:M3|ۦ<̧uk:}Ef#h;ffX=mnVOP;?/7'IӖQ5ShukN?-] GץtT35qJ0 [4'qg3 4N2Ziֿ/j`[ fa_dy5j׿;5boi|ݦ93gx13St\Bw|ۋpu>'5\2_`E0/K M7%0oZMyF'SyfExpݿru0!ehڢvQXt9PٴݷN-ًdسŸKJ5AO/i!ϓa3 |zom7+mؗIENDB`ic13C A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$@IDATxYnu߷c$EHHY)9$JXSESy0n$A ~p# )N")HElN=߾{MUs[iuUZjժUî n ID;ߛ)7%:JuAUzPuJ^VVWN ^@z"ݴl't/]Aܛ SW!S#\Y^.;Z-GMxU=)zrߞvrW_ rk|54a5>Z+pV4\-{5n=}ݴߟn͵n⾋ Lf1LG.I??VntGsrYixI)ϻ)y޼ȿ/|z=IF幛<#~>'~8zq20"4hR%ߌK,Q?Q.Ί<'?/86ZIX*gs&]C -˧!|VLՃ?C-wW9_p]ʙ4CW>xM!KE 5OAF:ɦf R Dz \GU N`?rǤ;=)c )VϕY>W47)`lֳ_¨,~o?::zpp0x?nݺ=coGx?y`VL t鸛>F4v;"}{o=DMA+@m(wA31zRs 7+Ms-xD 9W(u |KW X(8Kv0R.. jRn)rY:Avu+톳Ui njCOd%1t%ۡĂ\1,޷WU |R4'eirS巕Ȥ6Z-q6vuֻãWW_ٿأ;э6&囗/\~g>Hy`gg~l0zvf3Onx ^}:Afa}ڳ*>nizko^薗 -=V(â1@WUbz9t;`u Aq0g,UEkF5Q.8x* D,*| 0PqD(6Au84t )Nc%CCzGDwBw#`m@[.G]IrXPYwAISV$ ع(tg׌zWaMЈq>ֿ~ȧ/|j:79)#oA aAUZr% |3daG#3.v4Roؿ2Ϗo⟿gox# @{wvv~~}f)z.̺EdN1<3DH*FoLAw̺;4nwThm,nJpLC%uJeĺF 6eiYǝ(zN- e^CϹCйh8…{u"E5(p p5*4%e%iDRڮ;˖ 4: 4|A_'tWY!?n!y,t(ֈ^oVu&ݳԳ1/M"|1ti_rC~+(1p(E#ϭmz퍖F[/bFg~^^;338! 3 0 &w2Ο{ދO_ۤqjNsJk@\D  ;⏊@/&a}A;w/S;m.95/`F =m{N-u=?pe ﺏ>~nVVJw |D~w{ 1p7g-:_)hlHȕ(گ=|x W=>>xq}n82 )܇[ ^I9Д†peu@9݇_ G7g~-<|:BV曆|Sr~r[V8E˫G Ct]^C  p0UଷO*g9uP~WVG>zm7z:{x?Vl #gmU|"{61^q?z'],ܾ?`}r}/x=1;I:F&RV+ܿVKjU;`/u䙢!Te;`tci=z<6F!S~ F+}ڛCmxY&o;BK8*(Өx{|+xuS;E6V>t{iIn8{>p_ GYhH/ ><Xإ[Lxܫ!&4l-܇awĸ`K;<66 [<8ι;p#uRS;b1&wP+]|M_uPC/șb nzCNnli;B/٢C2tV=>س۽tzKg6/o<?h'x]~_W~?M <䦂 nߙ1%J5:&a qpoퟣ6Ahox] //:ߵkOxp}&; THzGn]Jv8Hw2T9+{( ƌiLNcnmb6ֺ yyx|OW[}ݥ $-NW_i,|z|}m}3[=8-6 :F/fKOgc|_AwuCTgc6倏*-E&6ЁqT8ˁoD/5@3'kvOjыG9V:Yg$>2ϖrh1)r)t!LuisHEt_\ܒtqSS;ėg{ZT|zaoBw(ψ Cuzc!%' t,vׁn]2D(:+[x CKLH 0aFoǷowp{G>_^Cf[KO/=Hg۷G~}m{{9L+!VId|0~:Ro:?c{Is{\}ZFovgݥA߼\wcx-Gr"ܹQsyq.􁛆hE0y+^S7;KOnc >Ɓ7M9vo쭬OoN][>w??,Eo`wqcvww6vzlXS@SpG qPLl-IqgNa%vR7.g,CTg7b1$3VA KXYȆ۳aD/Zjd^[XX 0wvk#F4I /Fs-MH0Ȅ 2.} ']3E)/y!U> JW#qfGFG('Cxpe {lGy]KFr[o3 k>+u&܁e;-GSq<˭W=V{nʃs7C^:pˆ)ҾCI`ڪs8`iWZVhN7_<;f1ag__3:PQpo]_goyogX|tV ?Y’& :(3L e =ι1W=!J>VE|t{TJ\ۅU!B#z=<0ã0kÐF}^Gh1E ==C WGM+)hXjA4&*g ]TNANL'2:4Da t<] \SVE1{#QB㧮_IFuo@Ӑe E{ȣ֝=х_S>gyu%1* {_qX~d.⭉&Crև ;(GDIJku)~Xej3p]v8?ҳ7'ٷcw?9V1fc?bԵsPl`?֭ٹ}awggsD$5v}ֶn"'L* ԕo*1i`unLCꁎw}}*A!v=ȐlN֋;o\{?zː+/%`<_Z 1ۿs#sU_pxtm4zؗD72 мmh iyJwim[+{=(lҋwoOeJ)@ H:3g0)<@3r;p KL/S( FBZw})( TSAP*6t0_m `Qw0c\|*84Xtac0)jOAc~0[/; %UZ뱉JhrAÑ7,Dąrr"q>4:o,tfxK1D1TQ/=yy{i i zgK zѿ`t|i࿃ڍTifL]_N]|)fc,{YaI%E^IGUdMxZp9eag_k\ ⃄Ћ@ڠ!qʅ'o:Lੌ-5k M !S?Άvi[56s&W ݆LipEO =x ZmWabp}ed!#-yBMh ZxL%*hMN j¢a/MrqjӶ7C*P hҭj~~9PH}vȲLڃkLȢ/LK;p6=ixgV~kKw]3kßWq X(R푏We"D93jeWtlBb3L^ٍ!2ƕu;ֺehnƦ.>rwݛg`/@a(L$X)7w2NV x]EY2E|4cFì=2FoSb(`6Z ==(_:ܕ+| 7\xxL % }T\UEJq60Vꃷ{$_c^zTNoU@;cԋjd&435<';$dYX {4Z')JVpu 22rKr9Ky{&K" J3J:/W0^Y(*5x)a/=nnfj,/>E<>|pv3^D5 ŋ[K*`E[r܄S'Te LcDok|o20u:[u93 >@bfp衅.vBah^w[W,yVGFX2D̦W- cYBQG"$Kr+ /%] T5D 2eL ^{:q#<«tΆx" Z"_ . To dGE Z/?SgZm W2$6AD# QAZy…^dшdʯt[c,>7)x"-ad/ &fa)^d2iKtlZ󗎆[ǸB6|^O;hd5t&B&Al=zx[V>wm!VX/1˪5C)xpdD =. s&cC͵D@(# yxыxP t(\͐jI]6LK$"œ`V3o%0;E)< O)o(@'s(w XVdexTC|!xG nY]!k#}>tmR!pP<8뿱ޯ|~jb(Qx3p8`܂Ӫ( t*@CD Ή`8qYe=.pi0(Y:r@|4LbkË@>e9M({"K^EŴO)(`hWg,VQqVIT4Ð--6ɹ#&DX+H@v$圚l&th <!!mkzAB r+@5 #`k? iI#YK3QY{MeX"V3,X RI-=7dVۿ $L#K._sn]w"w2 bް ޹#Ok ll .tŇo>w4~ 1iTƇM=('֣pWKzMfWz"BbaU)ncֻn_>ql7>c;7RXpޡvy`yKx0u?'[&$ ›@r XN߷O##Nv_{^gS&;9tDA7уҏQ\9f5%N^mG"/. .?op|Ύ7NXC< Q cֲ Mw9*?DgM9r~ ; IzΪ[nݏ"*|Rs_9ŃR&cqGz8dz#^6P=0 FQ0Y˜@HYd9~}`ĖIѢђ^¹u7otLjjd4ZW;xS_{Ud{9)`~”N ,+!^=G`Zhě=7,q@qM#7/z;c0+j|f>O*pZ'po#5%Las4RZmKw"A0hT~4$ߝE <+oo/PtFw<^2 {! PL*j|jowUܣn2s: ar6ԥc[rIjhEƞ Qzfk1(YlȪ C@ 46x F9Jǡ̕v"*_IW3D3 tҀWl)̏(Sܢ֗ 4ܨ{rɬaw \?qXLxW]\rF^\@ӎ~|uu#KW\q SsG0)J݂vRm-<oUՊz+@FOlۀYgvThRVUSE[%By =CP*EeE1M3fH2l0LAtA+|h"Qua"-&o9j "_-עr;[hmNqHW{b l}Q?]h=w-4ƱgM”6oS@\o(WЋP#r0 ,)塳LOCH>sn_yaΎ?1{Sܸqm0.ܺy[6R§TTnXPJM `T)CoL4IK>ω>d 8*cE`#\Xq>/4TDBY'+ȏC-ħŒP^ZV1cݷlh֣7vKJ/4Rj9Q q"GB1kETNW8@ehbj,s+W匫Wq7gXK{h9o@ZǷo^oൢL tkIvA-GüEdz#o8^3伷p"OSlx?渟1"d&\#bcoV[P!ݱrim7_%zb+uHϥn:٬9p%7;wHQ9VzW*UMHWfnMAoC Bh UZO{4p{0 QI㪵YgvID'=]1A_[-> pn2L)jWg#%吜cK-hEt4ISq9 +? Ag ˜'&]f7z\>L@by[|{gHw҉@sG6~d>ێ@O6,V)ZY g>Qz@N9;V}5vC0r'( w' #b-Z"Sp"paʜH*HBx <۸T5w7lX - ?H)%uΦ;c)S8swius_c27$ Tbs*u$<_+$_x/RhU|_=yP/…!nxKORQ }Z0a#\OH|p% 敶ɡ} :OCBExPpY2no]` `B13%% OZHě|oSe-zUk-f|(hu  U6}jfT.7ߑ+:ϳQ:*b0rQ7L*7=x'q`w C^B9ʎi e ʞpArVkA8ɰ_o| xȪkwzy}?8Md`N"(.~,>$r ^#6 Bp\_<(; /e)Vґ6xVl=L{|w$R]~ %!S v<7u}? Ps'K 'ȵ^IM ģX2'QYBL=mE'EDO=GAM|6pYQמvtlXIYr毋1_:uh|kQ`—wZ=I9MFR  1fʷYfOgfzۅV#F4LsnT4G—x~xVv/lu;[?tytv[?h7'2x=$.YBQ0#(nQhFZ)jn?8 @xʸ%f'ϗX*@W=pSݾH 6溇@ SR !\5$KrPZĵfH<@RbUefzЮy"55d)wUQޒt=?ʱ4xDZƿuؖF T-zR GippB^]Fp.֯k U?@M΁B7=7 W5 {bC;0U8J\y LƒfI;=mNj->XПG,_\B~Vh ^`"LrqR'Kɧ灑O PrW77(r@xD`0%=Ɔa/{u=m-֞+&߽9';Zh.€xC5䩖릫 _w 0- H!Χxk1D)H E|vYivA*5Hy';"2&3etPg6F2$)-Nhi[m7,DR_ KFx+rE˯|U@W롩T[FB%JJ.QYKyJRFbFrbF?/Jt+oF(l*1@ ѳ#9S^`G\mV ky4FqGzOo> 5#_?Ei{Lr#g_!\ D8דؔ1 ~_BaXJ+–$]0|Ib(|8DR?NH}/bpm~y۫M\W'HŎ4F3^'XJR Ƃw󀇤\‚yBOl3K=Ddȫ=yLOU#h|sW_FPf pT,sșwcPy1q\qZSHEv.B Y0QSv閝uيG=Ĉ(2{J.d m!z<_ xϑ"O}#=D"*p/kI:Xpk `B6DA8kMYQrqجH~~Jk@$C2% xK{wɵ”Q) W{6[GXCt惋ȏ[&! B?B'qWӉ.zxKτ 3kĊV88Y9?v/!Azz҅,EMs!ɟS)}W0\Xi{Oe SǨ cho#9i,O ` >1/=^)\`'jIBDߚen7}Gr8!zhA|[m*f' {6LJuLݹ2 -|W| wI/,={59>f!w'[ 綹V'B% 7>XxqR&FTbq*R17AtYW%N(Lˁ&&i_)_kH{hhi޴\d{Dd\Oȑ=l}$RT<+0qgT/kޚ1,mm-M[v`,* \% @746ʸ^~bȸuwRb3XSr%4n:UKQ 8jrCr)0C%iT1%Q S?xu=#|&_mwܷ1{UȒ-ZDSgǷzYn`W)tZ56 E0ХW AaB<4wѫObm@0:EHN-h_L(;!ȃ֥ZkɎKEhV*c| n[ѧķ?}E/ɉ8$L{ 䠆3kCr@IȜZ^ң_{v nRz|~3iDkۗcȉo@> {Ӊ^ 'xwgI2bh\g'Sѩv;t:$,BL>'(|smGlgR23c}[s6b <4>U HOۓ:_ qY(x;nrppJ9/c(n-ʊ5kWqW=.LTpmZ ) w&x6:Trɧ _|47=bюjԮ6|YmBWzFbZU9\V6!TVŅh4&}? K"xhItҋb̴dTDsa~}^P\-0?Zi)7=+)A@KψbF+˜^{,iO)⩍2o}۝b朥/, &52ֿZ)Vy/7ec4,k"X #YNng .<0*jpr. z3L[ñ,6ZEzv[1kA(eRdR4\{ޞ%'_=虯tw;I7ۡcɣNzV 1fT (7kq}=P=O[4ܹ->T9 s߹-4❰%fd e54h lگ*SPY(P+J}+]b gbrc/a<ʧM9{8`.Ti+[W\tKϨaHxpdO_jFZ+L ,CWRN($ڲs7z==F$@=03佃kq篠tAvW cė?3O-;3,'t޹x h䳼gp)~%0VtNJf?v?o^z8&|xF7چKX+/Tw(|I':ZgF0sn=Ԗ/+ZZ83ݠ/5ź2#j@]ơsg׺5i=I(}iA'⼗p2p c;o ېB +^Yv uRI2Wd%*$ Ot_n"~2فWK4U?qjPX"D7!='_YD"ty kmWbHȷO# '}sQ gb.uvS9pw< 29DO8 o gL?bv"fȗgZ'/q_x0XwK l!q7;*vU6,ڥ Ww f}w7?k [2ЯC7ǫRKvZ WuY$ȧ4*ü*jL"C\vM?b@o/vwX739I8ʥO23 ^=ki}m & tR{Rc۟iD# @[}ˏNF|^Cԭc0 VJCS1K3H+YA@46Zuu-H,QŐ]zvcM~S'\Q$8D+ XҐ_n{yJzhaH(pՃGB+m,Iܤ<;d-OMA`wآV2gLHy,w&tא@D k5>#㾋AFSuԗz|,L<6Ih#;a!z8:}\s1ۄ${l+D"bq{ުZkfE3,cGCaR-WĒr)$d$C\{{~7)P߽M|+ʥ]d_w5m.n&uld4e6{,RfшɰDDC/WLp/(g;vHl-6"{LgbEo|k>B 0|YVutj=% uY^ mU#y0_Խ`\'EFl#O0@@ɯWhl̶ iن^e[k:`rVAf6O(w_2mNoq/˃DgCzK/_g֯`ƌo}cF7qD{[RNr뢧좳9m~`"'])!2d*_:4z@#o|g⫝̸moG|7_g N@.t2'"9-$@}0̢l%l5O#w.Ir~N8c+A,τV>~-ZZ hR\iҰGԳ͡3&("i m, rBřrBs3F#i0V:NIp'J_>qJe 75f Jw۠^*%z;{zCCpM9+؉;^d=Ƌ+4ȉ|Z*K!P<)=DPhH !;6OotlfF=*oOd9dU92ʐOŢIZ R_MY'r \AJ1^$3/>#CD"Ò?84.3ڭRAz0<ˬ)̥Li߀I4N\~ ]xpQwk3p#@cޕ2;$q#N}{ՙ'; jF_޺,3Y4^XDcu4Ӂs}<嬅cS\m H,tQh^ޒM1GTb*ܶ&PzAKUDGq=eg6Bמ2=&Y܆? $*$zga%QEďH< ms-/Gȭ/X)ق|3,( 9i֑g:m.2 2[W4}(wOQul @s[mTR#y bڐZUˍju)j*֣F),@YWzJ$$ma=Eh^ol =dU͓618eմf0R>dz"[sF<Ƽoܕ,fOvnw>,u]w.b gG&]4j,ܵG'ڲτY>:&"#k @8cGg/04PcIP A7?҆YXddžg–\bq/7'6Qhk04:?0 -*sX#jTɦztl~<=.n$mPT8cMV o6#V(݈VB[a(,l>Jd\~V ^IOӬtSj_ßҀWQYb [CțtpM$>禼L'id.1Љ>.AF(HO $%b6dc7(\HVgZ쫻Wx[7<ӝh c?^Qm+٥ )lGul}a1pCIxȅk-n$VYkC ܕE[E=$0i;̹ qWyG7}ʧЂT͕U@xdkRn y]'p'O 0H*p,sVz FMWΟ}Q6FS˓L󯌁y6 ׫o}r6CgX;f"0BA XE|_ъ 1KB,t dV﹋gR*+2tqbYA *Xl\UoCfږEwv$Bw'@OQz@ik)o Fð~8e [7 8ӁX9Vjrω Q*A(G(?3Qo#L@vr\h=rLCJZ&ikhZ~iz0p\Lw|!^ۂ9edKU:oeV(qb2^O 0ۀG7˃l,:e6K[)V? =Ʋh=Mv/™fǍ,b) ?'pZ=qP 66pBfll| !o{54:bTKXᅡWS ShF nԽӍ <8в,ɳxzųeSH qO㒝MyS< k/q1' `\g͛`;5CmwU@yO^~oi Ho.tdGEr=n} 7 dΙ"!+k׵eٕ<֭5x)ugr%p )|5xgD`qo!=)ylrVxK]772,\SubOHɍ 0db@WJ՚cZH̞smZ>ne74!E,/Hњ}. K߷2оjP*5\x4𠒄Xy; Eoţ_q,;>W}F1γ "R x:ȏ Lj vS $)\kӓ\Ba'B& Ąb^8JߠΌ&ГXd'P[ *AMOcS"gWGIU>о9$g5u.xFϳ˼%wd/~'軽ս8ZK4#^da,nׂՈ;HaRY>~>2[o ޞrڳsɺQ+M" I$ѷ sZ|Gg|ڮ+*?q鴔 p7`Iȗn~ʊ B*7!N̾(ϥ',<g`xQSҍwq4`Dd.z/n# ?]3c,<}+溲{nj6cCIz_K |񾠒drAfNb3xk~,*(HS@|=G/ȊB5ZP 2 +L`zfC<3Y?%TFbg9mݸWg9}'g]:c}vťLKʷUFUt;R-l2(ԃtKӓ ӆ.u#`XEa1;#V]䣗6-`~ FJC+B[A+SPW`_+8Ǚ I P'':o}X҅0 6U7ķ@d-|޲Էڄ6t?u f0ғV k.7e9&ڼd̳ >US.Ql!X?M/Dw>,G٫~LrR 7/sGbzn t׺"RxC9ykMk±`J!bk}y v`άEBU؜ W)V!E4?cW:|KLG mTO EYbLA 5qe֩m-kR?>?4Y$|LߥaHRtS#COl1r'"mMlqРOx-dVsN91f]/4B,h \Dûq+"i=N]&4 ^c?<d"4|BU\iOgko>0īWpo)cipo:"=L}fgfYm뎾ʎ[Zi>Fl?mo֫kr{>swDIIQ%H Eb 0 @cC&7#)FlYDRIQdgs~Z9>SjժUUUU@,hrtvk#>%N]xN;kXOm U>4dlpm >--O) uP Cs1 )ۧ$&zۜx}vz+|4lHL#Dl# u:1][v*GT`?^쒒B5a$$󀂮ڃIa,nQɔdR>L x59{*vqiQPKXGhyCKJP 2HA{&wf!(H5 %\"cʹ;q*R'|{ &x(I*g!^]W^N/Y~5}w>j9ft҉X,ovҖjmlc#\GH I !aX<қǜl)ړ1ǡN-c>S#YN> V"5s뮾(P9FaEyZ FjeJM)ɴ'LH8܇0ds?Mac R { rt-cB^ށ 7o" >sK55Z_7Hm ]Cj,'ID; @ae. 71qP4M̰+Hevu}fէ|8>vy~gi ~+挝Mb\p|{ɫLg9y:;.&kYZWɇ&h8Y'<)[G '"B#?<|7~{M1wag E'?rib{V@ [ZL$C"*Ἵ{MK9F;’% F[x_,a~& G*sWq ABswWW8&c%˞}h6. Ƈ1K K:qt#'pMKGI‰/]ɅE ' 8'5Z[@{40 tV:H xke=n.ǘ2y+_pWCI=}F+C۴N>`R1w*F;aB@ȂNyb_5fтw{$Ok<|K9s?E ?4}.-Mk?8$!Kd ԏ&N !G] x;?C^fS!IaZK}ؗjB3EK!2~L) Qu/`uɛ;{Ya';")ג/&3|LIX)}o)]  ]%Bioix%xnjLQb 2{`JQ%>A:2$"`*DP`"vؓaOt) |4!u !H&C(+dBEI3ID|ϬLqђLgK /ޥUzo,Pr>3<ȋK75(~@2AV#k;;AfٲJއUb %'9Ab/-= a(2鉘nn$=:tg ^mG,)]|on"v0ɷi5LEKvXz_Ǔg>s 53$dCe2,y> 97ۮTѓ2T'B# ZE56< 4|qo9_) yvC 49aa%߲A";ofoHZe@1eBy#׹Մu5pbXB{. n$ $Ll~j{.Џ}zvr+pzv%!P@s4˥3 9{$3:+(ʺ2u\үG}G5ˋWka1G mM6as/}9gؾqO Q~/g?7QyKד;lҝ:dĝ *'z 2>sG( YrUhK2DpMH= ?"|"Ec4{&32ܻ&xEcJL~EsPxDhYSʙ ŝ ]F(z鈝BBIV8UXG8 mB%y!7^z. Quq;of=2} =zW.eN˜xDcUz Q*.x{&To"nI'VxbCCɸ(_xLHb pWw߈n][{ңPLC,bei'tDUՖJfq#R^s-ӑjUUeWZŘ衩-6ywS+X]XP~au ?O A:X^'6q+ ٽD 8˞Fb)!'q MJK,R ʁ͡BrW*t3vNQ8ǻZl1˴FR!˪*(h,;&AjHթ{tCşCU/XV[w8=^2c>W0ņ0rx0@02d5ؒ0rb׋mSdi @~ p!yU9 UʕoX?0UZCC-z#0 |2VWhܕƝUڊxz\|OkD\4Q];q& 1ėrT'QԦӸb垇YWPpeN>C?n s4V ITQm kAЮ=A &k +Aȟ" gkT L8*\6ǥ̡>16B H᭏P釱'm-n\zJK~”g :Ң/$~<>&EN_J~%L˭ ""]sUҙYxB[D;L2 ;ȳ=)-yP'4])AFg2j"BtCey dnO$[ʹyN`6##n 3\q?6Hjѕɼ7|7\PM's/  {91fNk-IW+C(ʣG."-^E2SغO;r.)..sO=0RgTdl*-/6OfؼJO84s 6m_U6!ӽ,:WD! OdT q44)ysꓳ_<%x jAMP|;&c$eRxR=D>{_ {;eg?[^z0 ӣWn4[6MGMM:XB姤Dbgg;QȞ_ "*mvs kÓ[g͒Ck0\/ \ErҖKy,w)'¤ֆ|֖+%W8$I8.r!@IDATWZĄ9AAG"1FN,? [ u=$ q, Il,BY}d}gIk슁]|2Dx+{ZX]7VlP=@hLn^]_fsbf 2ͦ ^ġd3ުFjRQ$4dC'B7U"Tmp;6$L풤574||.˘r/ z3hu^u=ϚQٶFgc&lK @=7L-2 ۝9라d’Y;X9Ai4,qU}7ɉ\_d*^ S/ ӧ6UQRsK&خ,4%)K_f,Y)G>l`e 7n})~OzHof?"{ﲄ8^!Ӗ$2G[NiNkQ0 _)!@RL4#'8 ȌG8Rt].rϸ4`j[!HJbW|K|vMtId#l4 R E×غk!r؏"N|j@43>V`߾C.9,p-A+n \z1\x8w1_,Qm]\E>;z +@ `&0i23#rnsQ&c3BI_ eRьP`NI=wYsakU0fۊv Sֹƭw%%c֥|#7+u5dYï$y@kKYzf9{ ɥ[ Sg d!G|ۛ)!>%|iiI2! ZjOxj`9_`A>)xE@iq{@\^++_pЭ]UWw vܗ o'4fF|4w 3YsKpE 9x,hھOWF#\ZZWն02pҜ i!Sdm";1qPAn]:%a@Udx# 4|T:H6 c}x>d埊@XY't]F6sǙ2iI1途67oL~:W2LWwi} {IL c|K*ޡG<^K.&վ ;/?ˇ~h|UCv,*v~Aџơu\VE~j>~mhDusn0I+&jB0X<5j>Qw'P <@ {hg;vxJ2?y5|T p${@Ad%4㙖>-ףcSs`6ΞK҂ͦ'=mY@@ȴ諾wW뤞?{.isʺ?z*eups_Cޗ-rx:ч_t9Ir~ ,>; 3iNawL(TW>ZL{8 X=vuo:/†Ӹ=HC,[chjxf9"K`37qbP҆o!ҧ#Ti>Y7b%-vVً8A6k&sKZ('Ϫ Mkw=xӸ7LϨ|>Oa(4r%FK1KZd8h[zLK#+v.-P3m8y6_kf  lN4 6G** 2b}&PU{?rj>#gQo se^s aj\4:!-Mu"/vѡ:q8z5U~B/,e~HN,3~c2(Z,oOE}]7m:E:婎Y_-|ct7=QSY>A0{jr1; 4 a<>}>tiMͩQIWcqdAɮAw@v?4:|5sRd05K y-M@|wvUz AӾ|K`1`a39ƛMnnՅ9 -}f̹@pӐD9޴|t9L:Ezlr )r qn04.ɋ<518YQ0JgGFVD`s0~#XWEY!Zk|tC݀.G:QA"X5̰XTGG .|?II27»0ZC<5oy1W9?. Q {m سoE+yTH]7VfJL]8%0g]b>h+(IQ?9U-)%BYTtfObXpwg_x];bkˉ=\='׿u"̠zk`4Vh2"|z$ TX-3|8zpy#EXZ-4f1M|cM XMb߉ ^@p}zzoY *?jD" 'Zx-7?D&vZys> fȅk޳I[4%xwZVn{w$NKʚ7yPM$L:4gv*vDQAn A$ETW]^H+`<ꂽ\u"jܳXz2 Liq8>_1vDs)n:fVS{Gf/#EZ #ꂙn"H|&Bsį 6987Qyk{)ub_w,Q bZd;?i1 #4h`p#_aeFEk4uPU!'[_K{[Cɗ4R;݀xH|v #zf8E0ħE"t*$<߉- NPl /}?6^QWp5ZADZ 8. (C}~]O V y,x3A]ϊ ^9M >O=0c=4S bA^l4:deLvh!0)&? WM47|xTW>F}aһ0`v =!՜[(9:ce~&BmG+ie)L{NWVHZR%F4/\;fw Pݻkwsޞ>Koηn)3i]תEp6Bw7l_;mD\1-p4,X__Y+ty)TK8PkF$2{3ή5uc2!s'D0y5'(w\ۍIIꆨe_=3(OÄٍ,HmR_w _WGQpissns-Ƨ`-w8)ȇjd@/\!knʻh{B|0-7L&Pioӽ0zP-)N}Ci(IvX5OQ'.:sx(]o6v HޠF2py9@֮nL? Cg &pvA<$H*$?s }ۭkz6.^gW,>d]{7^[=|Y~z'[1S?Jm̑f8t@\o‹[#6YkD(?PLc6Mugz5R^t֋F̬ y2\M?yj#qދfk. f3t@+%+i'`C1ِPZ9lBZF2`G%t1D3=?@:sBHp'v8A'KˎoےLWK<ᑡKA!Zuvk݀/p#LU4ړwĻt/7 x*΄}=!"c5 K|!(ڻ3ia_]gq,΂uQ}=t9Cv{E3IF'ׂZ4fd)xG#O D%ZueS6 DP;Tji"jmZ*rV>%(چDg79Ђ\]>1-ꀂB3=gRV[n>CYo{Ϛ>Fj0%0lr(;.˟ˇ-'_DoՀ?F GyBvq9N}Wd}KM'w"g23MD__:WjMƌftV%J*q Z:ڠnA37,C8Ookё\ hKt IvQ&$Wk53v_zDV MQLχye¯Ï /~=-M*F0a?x+θno3Ƶ~;xN>w+N&>+ěnJ(&('=U6rp( eY|Y'7.*atƧ3s{z&Uh r"\3ݾyooqlI6/_X]_pc_rzynCt`h7X zVt_* Jkgu==B+c(1Ҩʂ /.DϿ#w" TP"t-#wnŀNAȬa\[R8tC_s J-'ԓkE Puޖ#GCnNcOP% .=4 %xO ]+_FZ]g~XPPh{Vߣ_,?jz'cPLL Ӗ3g|MO4_IŪ\N+vcOvo;D9ގd~3?zѝwh܎+ ։9n?Մ؄9 3vY1lCpQgbx`<,| +i< ;9tˮ_f"=$:uI:TϨzקj7͉v3|SZ*\L|3|2p8C2^u!w^#F$yTՉm"" }/e4 Z r;ҳM1f 4nH}anZm7f\dߋLWvif2-}ew 8ۿ:d? GZ@5IK>d*\FG~GрBWCsZNr唇Y;G@pW\5~p1.bq.q)cV .?ӣݾf&棿T.D=CNd$wzm7#fܲ'eVs$dFK6XlcW%tN"a_x!7y; <8due.pGH9 1&+q~-TF%2a _9Lr=]:3 [ Xt. t1LBb 5Î9l\ٟn-{jcdogݺ;b>C>nWDʎrfH$J@ X U~=Z+'x3o@ 1b_,wH0hZ%ff#~7zy>wKصl[X">9_3Ynɨ\A9l "T.]z532-'jP)9C}ajTCs>G;Jp D !P@<ɬˢyfٟ1cCL4H\F]ׂo/ s:3b]7 xӂyo1|7l;1<<Ψ떔.aXJAˑf5G0^wծ”z)`}܃>.鷓g8$ز ȜE0wR[ʧ+FASBJO@f Ad@_v8d?͒߃՝Xr&"Tʀ4]ĕxV4j3 ՜CS/]qG OȫS 71<|]:p^9=&3tšTm*@=1{`);_ &:tpulB ,!5)@BwtU)'tU7q{&&`T۳ğ*[a[ ۣcW{1NC 㑒"fVKOYG x_2}kKˇ`e'=I:3O1n1cN+̑]"~vEisϽ۹TfL$)`Àts ~`6+a A֎1V#6Ph@ӜO0?B"Y'9Bj󩡇ܖ5tn\Nopd 掀إ4}K:LXVިU3݀8R5 T5@f\$m÷~:|ի u";ĄCQ@^T*;odބۀ& _G*XJע=n ?/aaEP~u̚CaiYP ;jB'hQqvcM) TT #% b-߂1Þ?xG0X 2*q3R1X¿w6/--ApԫS{ $3y9~T=::{.@ 0? 0^TܣCwYmzEDppoLWՁ+<$Й98 W!د̴S( (^gߺ geW9GF;AgEv6%M [UOhvߺӁ,{.7`?}v ۂ?s^ `SIu!<{}* (QQ;f!9 '/wqbj'3Iq9tlõvk JI=C 6OySj pn187x;uAwS w9du8@dk~2\IKw~g< m>by [f>a+RA:}o $ש?" M^!'k{9.;0ga3jF{cPLQ70 c{.;,}!qjA!"0[w`_quup1nfV{f]C?s7-BHp$ɬY<7<3À9YhؿGJf} QL{ I/oκTkh8.lӞXr?/E`x7>>R B H/c{:nKÊɌ5E/~Ba&jN),gs"@H9{NgEOŗ9 IRUmwo|%ˮ;?non玈7soėxslA^X<8qkxW/xuq= hx,,65>5/гSK{r.s>0Cy ?+{~|:c߳6):p2.2gqaLH!-Z]\a8jopuJKTZ~"Ħ.1ŦlEAؠi8E7&<ͺq.%i:;K/Mڅ Ѷg7 ># cs+i᳙VJlFuZ/cR[c'xC08Q׿lx f)]XiszZOkr.t9ODރ6<+/٠Nk&"GDT.%dl:;>~VUxTAJ8'h)tx?V=7R2|\kړ`񳂕aѻ1 |ޥb s8bf\rwc8\'A5كW_ QN!H\;vCb\NId}W|h}m!c;>Nv]vS\%G߾~_{%;3Mï;w?v֟6WG*!95̪1x O 94<#~1  n{ Rp0<9f}?>d)ZT# ?[j꛸#/`qKaN)MIOޏaf1[ Mɩm1鈕zaܨ&Ocjo'׊%.iW"XPvbЭc) V$s ;$nyE.mk'ئC WBf%=pQxl~=BT\#q$%n$Qsc3gH>--',]`okF(O)qc5.[#j1q-ɘŻ-KϨ9{lUXV]Epp/6ts.^b) z(t,Hk0y9 OA\v5`kuyfj 7+DvHEլuB]`>wވs1N& M{7\tc/:oܝ(B]pe%wzX }.$ТO1Tc }%:E>@mR R\ } };hOg 54*4u2Ղg<~tuTѸTKS{tgK쩠x&'$TsW:ęW[|^qhW|:nRf\&z3 r %,3%Vc[RƒOA=X8Uf$CI"<Ҷ[xLW+y쵖cr8@ 0 S0->\%nė.imp!*:]A kx ПSGz8~زZ0Hf\6Y1$cPo+J*s ء![b` JeIJ0k%'Ǻ 4c-3QdZN@yHY^EpB:]N5[.:Afĕ!{:x u !p?-ID#4ʆ[n5|nm-q$ \Fq%8ߗ Ωa5sdI@o4hTEL}L~mh\>s е[E)t97)wytu@ N:.+N7q"Ǚ;" X35[Dh6iі[ &#萸C̖x+$In!\5 E1S#q,X5eBx!TiҪlRIo+aMT,*rJQY6t%vr Er[@+`4KAĞ]r n 1xm4gcC$]AZ.d<N?X|o} Dav%.>}6Gh'z;$SʷtMpP-w(7q< &&3|i@лڱ9u\DY1y[?d'_mɈqw2FʼnWg&@ S=GGdmFi4uYljT7ngYT~S`3o~;xq{/gbJ;tC|.p`Rjw V-pXKs{,׃ֵվ9G*sC`W=͉b<#P]h~S r~.4 Ѯ1 te-?4^OΦ(,]KqC@26IA?pV?TFub#8bL:Ѓ*p`<&YSA/Keq!kgod1q*=CKG0\r5pn;fذr&߻JH3 +[pȇA=~\ȩ˞t,cX67[i 0 Rӡe@g{ oQz1a"6{|jfNs8<]o`93`6Cl  ?lzt. J #`lwiP1){4)â Ά%x<= Ɔ])L=.!&^ Z¯>f'YcP3 ěDW`CNtq8ti{̙ks[t* Upp2j 5"#= + ]"~ mY^Kry8@/W}`ϊ>Gù%!Q ^⶘а]u?8-]V+Xl;q c#G H7Ln>~4j;w}2+H58[§+cQ\.‚f"L6~A"605l!l挻cVz'NޫOpQoEGJIDAָh8Cku媂[m[ g/̬]GGU"ea8oZO su}UDp>*l9[=rjF]tf|3b ?xW?o~%'b>H R+Ӄ9 b:Zp&2M,)8aӡCzOȿ qԷ?}˒ X>!nW7k9 ɹK}YpeHƷfzTurM>WZ& 2ˁWޚ<Xk'-3w-%$^$n r>a K|ƬYl"N p3y`x3i|kӀWq= .}~ZŻ|15/*38|=t-Z~^c+TXq[{Ƒ؃aD]!A8~jc=MeDWWhw8i3m=4"0iB`<-(sIs9S&]gc-cC/lߓЭӘ Auy| s 3'4wcVlMi,3'yPB GbIE_S92.wFnY̴҅I >CEn65%{W(]U}&^AFLϘzRe?'toGtβouWawdB)wz0G"p &muw1Jm\N&鷢$fm,4( c˴]*>[鐞r F.1*MO;xIN"P3*+<>m0>mEɨrC~|Lj'-|HeY%|<} ?[ei:/b!NLpwޓ> :JWo0yog5bmX$+pYde܉Y T?xĉɄ1[zQB)z1넇ڼ-\5 u ]k~f\v'@RxTVd Ћ Q-:\UmQ|>t"NSAXB&Apq6:tgR\$0 80)>؟3tL7E&|5-RK߼b\Dp$5~>0I[rK I0:`<#ɖGMs1{& i/8Q߰J ,ͤi83gU/\e!ӂ- AILɬ8N4~/'z+D‘~ *Un Ye>]%0SB,Ȑ{|@KizAPKye%rVmc`U݃)[H K G[xb  Zfׄ*[wޒw/JkQvyOACaNa%xgarVb<`݋;e E!9%&$R+w7c݀&p,5iyev \ANС%pv"0!q^0hYG6n <G,]qv1g~(-8p] >,˽X[z Mg;MEk{Z%TN v[B'7ntz%PvcЬERƞ+ I.Ewj`K Q.;buLa}0wB9o!= ܡ<=p0}eH.g%1 )ŽrJo=(ᦧV`[ųzDL~!aO4-7s USDJw1]o1Kh国틗8&sg*/jN CC3oBӵlI8-HxL}`2sjbD,\իO=k4e|`qT3\ 4INX4Q`K$vF^5jkT=A tp{@]>e| %WYhNCa7m#v]S|ÒpolHZ@c&j=S`x-T1*j=p !!K77dS xv ةJ`tn3vC3{mwƲO ?1Jh*/)ToFY_Y;~6W}{z]I:^Ǜ7`ƜѠOv_/*UE^:c<~pKҋ%Р zOs;&pd`A , 3{6I5]J_n2pھp;P<”; Ax)lGS`M ^?PY>3P94M2Nˬ,o$=gIcoe73GA9E=et chbIiY ?=)Y@Cd>s9zg:hF+v1TqѻH2q =v0K(VM,K SXb-15組`:iִr\{Þ 3 )wۦ!|3:AUe({yG! [LtᩄJ 4VmƄ&uˌa BݑUWShEX}PFߖUw?s7i6Wh=ǰ 4Ephf[X]6(;-R?2dxeVd̋1L$mj:xfV:9rlJ0ZX]qK2AdUaiMrkzn١)>9<&C |>tR6F(Xu2®_j5\*m &艷>b zc(,):{ ryf[Y˸HgW0pLo<b-T6f9xHn _]Eõ{%1TuwZ!^<үBT#rW¹XtQgI):^Ova+ko1K a f>6Y_g^fğ$U`Dϊf©gRhMLַ溳X[}䚿[ nݮ=Ov79xq:{pApn1VD;H_ Im73w lKlSHRmy>֨>-uY'x`NES<:-Ƭם}{a)z`w$Ow!Z'iw6F/?= Pd iK ֳg";1IGtIρpisjNŴ _q^zVerW(ƶ52gnZ@/-Gd&m:-9cRPnMzet.-:9&1%gI$hQ:W3wCӒ9fn#-O Oˡn|+Br B=B,ӧhhwԺÞ'd'h@b0ql1I I'T sd06}Us&a@pӵOAHJe 0ڽZ*,q^ &6ީq釹/-B li WME>bP 0‰K9woͿH8t r|wτ )L~#05|ނ$p&RL!HO|ī`m:)=:N2e,b%~CɜC 4 ફ[ 2ϐly& ZrJ4twED4۰eZD=8-.L:&q t6䮿$>U /5x3d%Ok.-=EbyR=igoT ws: K;wqλ]{GrJ6 8cM6UMD{UrZx()3.EKvVQvs<PxhF q.19ʧXETg읮N" 9MTzuR$>_-r"8 ?-?9j]!39x28`i HHAQ;DyP&JHB$7t_4D";Z>N@7$ ,uTD @v|$* Xya^Zɐfy:@҃7MN'||@ E]᭰x{ټ0aGhq4t,\鸝5?-TSb DXKa6Y6cL"fp"T"nYL>gG4G}&~~ M-gXQٱ֣ !X6A،`8q*7S=:9p-CSLgZ1?IwaK 77gJn :7]$*Mի;-n54^+=j)|NK1/vIgN`s $g-m0M݁p>|)8םء>v_xç ŧ;7Bx" ݆쓮x;]V#8̜hKYx>{>S1q h#uKG 2l݃;>kmAw%z[,W>Z9NKu :>`pu#tjXL8OX&F14bI}?3`Ü*O/*o%|?A+spkn1N0N[9QtN ,6)?V[ ȫ֐@q@ G 7umEj;ڱ̐bղ(wZ82YZ)3,_faXuiь,宿a|L&}yf weؚ+Q G&xO81IA`NO\wH:pX^FT]{O젴d}9Kt\\A AI2Ϝ$؜7]$0sxHS`g_E ~ia:硙H[꒓ͧhhW/OĞRȓSK`5^O.C:R§`~ ,9w-7N I(3-cG?)P8DR_Q۞6{Y.;AtOQ{+b9+23>Ou 钳] Ā kӯudRa[pK*AR AiE 峒I7dH>[JP%M,ɣ f>ac偩M~} 3I@R S-K[q7T+J*!'^`LXˆ#.2/3h;#"z@En~hĀ9 :h:|-?ʜKII>{xDdL9TVVt@-zѴT%BB 6cŢ7 ) PݭRWVTVEÝ~_¯G'y1cv{21CHj r n*`U!l *jg%p[Cjj y t4?}5Bxg?]x:ymUF>X,Fb\$)ϼ5meDkuF`5:#'I'|E׌,ACx3!6<][Lck/嫿{8$OYt9;쵴~9`r`XtUz@X&fis0)TTqmS 0Jqs- (PPUs%5w;u9H|W@xRk4i e?cQᙿ7y#{>?avEfNeN%Č2RD 7E,CHO7FC7%n1EYFvvh#_m),At DcgR.d 5/x0%Hl ¥g͂x4-JAD WwZe(-OXo0Mr|se&GS#^lN?GjtkS 3^䃟/ۣo'PPޠJRD"T:85nA ׊6h$uQqL5H0Lo" Y|N S{LL3h \Rx}SP7 m Gu&}^F2D ʹ-~rX,LF|Ќ&4150,AU n袼!n [4Y1Y#9cQA%B1Tw*enP^>_OiN\2́۩@¾hQU) (k򫺎6t,׭E" j[xY #`qAtolC^C?MhOeN'@)&#?YdgsJ.rHjO 0fFvKmcd _ualn{%>#9.fr vFݬO͠Gv]yDķOfOg1~I&޵>x A C{C嗖iRfv򏹫ISA":*A'z>8RZ/[w(:ntmA6t&DFU!/L 0fIZpU&9IhwWѯ< 1ݦ >cnA3S}k4f[i9om뵶1;Ν?9w;϶sօ۰w-nQ+Ketl v*_(t $)!05xBk7aE*IK.22xz`Wc/g3 "(W Cf߸|DNOa X}>GcM-6.#doٺS@-$N[ԑRY㌝0#>6imf0g+:l:}#iyD&ih'quME?nP Mۂ&8D!|J 2T 2U9-OS7j($ V)+wp磣k ݇n4[:rd&n2OR F#}GN=T}N>DotX,IFކ"AIMցrB 4"]!‡}_zas{8ۄ8M#ۚX%Tܸ7&#јspG7_!/a e2@:cN'PBMT\?~JT'!Gbu=JUL_A꿑SXVkFR+ wI9L3:| xGBT='u~vvw-㵬Ub%/|"|Ox3~]t%jķ׎ eK?'0ES+7@J^>hE0'ܻ|}O]7_2`ȴ!j6k[jsYt넖Rxr`$}۫+%A-,s"k]` H|a=$u$s.jh=?@qg.<ջlO góD៦N"gCsKRȓ-A>$9CgS`PL}O^׺jyU =`y8"IG-kv$=[G2=9 2*Q?= ;4HuIr2Ɵ,^~Cx`Y"A%krzɅrԜoЉ=|b3vǿ>ֱm7\qbw#> \X@ |űi/>"k:sVp&/}`GϾmvxGl {d'hXKgkuv,M7!C%In**aE!VVV.SyZ0FmYCP?I`_VR#/rnRۀIv2E& d#,a %FQPq&ta_K4PZ:*1~RVUie,:e7M!&=8ѡN B0_z#B'PCa3~ݘS j6/Nހ@dJR%d|fP?m˛ۣ_u7/]X.Ϯ_بjщY"QW-ʞFG!T t!D~`$,?q-!C%*=8&UUd(oDz/{`.>e$u6"l\F],#uSfB}+sF2A+u 4K%?龶0Èl"`jooGcN(GJK?qW. oՈ鄽Zo >#x砈-xРֻIN7UAG<'=r>AYD^M hAڹ5zWԨ">ʝYcw2L$Qs|]!LD!_`o`;U֒B"(L[_畾~Fw #4vvxGwD Nn4#u /=j;#~97 Dq鵣+` 5t㯔B2tF/ /m"B|ܚ=jDW9}??ts69Mt 1&1.c2egohW8J0&}*/۽g1fAPX#E39AFg훾dCVʑ˔ܽv )6 8 5^ٛ=hg BpP4_ ߽!~UY/&_ zEHs'|9pa9>/_ Dlf'ʧMf ;t)ag}#tH4)".L9bO|Q_ m3(G|imQcIa7WH>g;U_8P] #՟c7!/!\w+Yq|M4n4_`8c?K JvϿz}yyv뛜ۜo2@̶'hi[;?,^gr.jw s{|ϷPo?]x|z28̽h p;U8`J> 20-P&>Pc*=TR8n/g2%pjN7GJC0:9~|F[!/Q$.xjlݬy { Zn0wOg]ZpU5VAB-`4aS cZ[`ud3Xhùr5+|&Q]^aQ z|tnW* Aí^㓦]Lͪ"w<ButYݒ=.u}]$'6ծ-W/pl:9P 'sKum^9vM⏯\`ڴ:ׯ.3}E, .mgC=~ܻ~]z a~M#xxPeڨOvacNgo1RG1QMy-D+ަ&^B8&JoQU/(8 G&|-o*_ [Q0|ok[G^f)2Xg{)EwK.]9֣Odνn>|.p*<$ag=ߛhv|WG}uRw޾:;^2ۢK+ٞcH{P>]Q_V~k[#Ot}y&OlJ-6pZٻ4`>,}qaՁUPvǯ7Q%s{B`$KxN8H`ʻ:a>T:c4AČhj'G00Ǖ;nH[C70O7 7HڕMpG'ݠι舶sLO6x∎݀!69|󨯛,gfJC_6QK7 *-Fn$PÀqgYg?rj˨ھ͗/C<wc}ץc|]@g$<*lρG/Xu  }@?U_2zwEaeti ĉG 2-1Era=vwgnPY(Ug3jxzpX%6nԆ°p*mBk&1,|NZpϨ  1Y!uPN Bi `+Nu_{;~r C3髯#5 ɗYU:;;W| d;wނ&#:_+rmA]:gWVwM!kߪ|W.^aT|ض|r]kiIe8Ud/*?e)qS4.ֵjzyਇma(iW/] 6FX_.l`}q^{3XRk;9F][=sd >z.~ʷd[=G -[Kο Rנ3uC?}8]5 ]]㴑pP Zȹi7҃]ҧ(V9@G@ӤGzľTL &ŻYccf{:2U.N*韧 EV"y|vJLwRaxNhAr6F 6 ۼw Ujo6`.|m"r2t n1jL~܌ E42FT0~ˎk;^)|V HRbV=XP DP|cPojw-_웯_H*o|Bk?{ضCkf C?zI.K^/0cI:}aJu}/-v Ô敗.miQ>§4(.mS>E]nhwp5e%{+̵o{i_NwTԲ{`עZ{.!>;~ۮC6#HAP'# />:RRUBR*%֐tFݾuwv-j~rEu%P/,^`CZ1ﳪֵ7_bHki2s{5Kmls:AuF~ d-|| 1kW^]FzDp {m IW?mrK{}ĻƜit0HiBяiӘ§8p(x" 'x^N7kgKS );s/upFfZ)sCpipjjm_9Y PrK0ѬuK9aEG?(#>Yzq/xP\c }%q^j_r%TSLv(8~6v3z/5ڮj.xm&nta OGgn;X] {y ? BZ0^kmĵ4Vn\_Ƃ}p..wخ6ɴK[(>9& YS~>buu; _<6V%Ƨq nDՇXACQG|Ed88iIDAT}i,Ir72xL"H"jɫ qD4sj0Y)ŃI(}[n.}̈/5GWG?ڌj@\ 0Nq lqpg ( qNc tx~U-RG|4#)`?յ]?M2J!wx8g47Saxfj`M(xu2ʾo}`0 S>z"rA{_PĿdsjЄ[Q*=Q0mev=c?us.`jT} 3ws~ p2.PŋHp2V:{r$A9$h:lhE|CS=09Vg3tʯJ9E8N')qA<MD@3l`W2mGL IK^b*ܔ\iVA=;y󳇤FkaZ ҷ~QۑipiLu"W-t]ۿPnr(%dw~D۴r ְMN9`kZ([[`^ CjHt_9EBjZJWscI_f02O@C ?uub~03`^̸ C\>qB톃`)$4=Ťlv(*wjUAPВd 4~f" 4ʣU6v#n@y.7F EmӞM^i`8dXZRy 9­hzjasU-iz>'ͿʜN9ۀV{ٽj'P &[oE(䂉%j _ |Ad,b /g tZ^4Vr*K3a#F0dSf\<܎j,UXA#kW*uyc-'Y˓Gi qgo =\w@X[жUNNeM $OiGF$*#^t`Wpm9*V?|ҥKaxU~_bv_8?z/d|VmC&;4,"80~0h 8i S6ʎ5 s+~@kh |O9UȄ*]s|YFieNo >۫5SE+_~\t|%gx0]%qGC#0X]0jq_@{#Sy@2N5־*2Y,i':/BkN'Ȼp߅ è[|C@nX)y0!poo<¿T.H; AUNQs7]]Z3hA=5쩀eQ8ñ|}23't淢p?t?q5lgy9S AEwb!st`p+WFwWsh @^5y &QUp6ͩdh>+/:D3lDE. S: \#_w{01"̽m*Wh O.a.&dho_G43>PYL9]A3w iz5F$*s{xdB-lVcy6Q;,,6. I<(l%] 2S "g9 %iB).1Up ,`A^jQ([0@\uWha4RqG6(0SSyNVsd=X8!BEW~a+tpw~8>b&Z0WPCrNhNֳ¶FдH<2;FRN|*픹>>bI|"_,IH!HSeia#%S U]X6r?I헑]w7p5U".v\PL癵7̛4RC>eK*b|0O4_ԥƔ5M|+tirc^8-_Dʭa'GRRuhbًbKTYfÔlr5LGcۇUs'!t!V{٫hעd!3~{){eh{TviޏDc ?~e >v}/!dp7߈p/|W !!qsPM#d7 W`ʇ)qA(~i|`Nn1PW; 17ĚYPҙ3D|=gt'>VY#wUD2]z2{De'0sq]_ uu. _RX]fFjGdĻƀf>2 D@h Dumāv|1"^:JKD2Xp]W8{bp@QBHh%!su ׏q8pH9ۚ0<*\╲+0K$0 n+oa0sx2&x ׁKawQ 8XxS pQ0}K{z'mLsҿX5e~xaхTrw5RM?F 6)}]w\_b0}4Hۈh?ZYEsdޤ4L/80LE@2%j k *}R(iYUnBpGٚ*GjfF"h!r#i!#- MgX/F+Uƣ"՚8]ᯊI}O,B_zxIPO-~'tOa,e>"kl dt +Qi$h S$2ܚVj̩U|qGU}{RrE>PzY !,,c& S!4y1_|ȓ`1'af҂Þ1b0~3or|s)\Jb$`o+ ͗r3`uPُ&QvsjJSn;ՂTs) LDNeN^IA` .#m?“NߴilWQ<$mVDn,R$ /:E wJIZ=Dq?;((3,s.4¬(xz *㙮CEsQp 4 N^ȁ|9H4e3#sI^s;@4Qi\75e9Sp | S܁̸.Nqw0eSWÑ"Lŧ d4M>HH|Uj I7J%>@85\3r?(R04jkq &Cv"Ԑd(H &T r*T̆Ce17!qdA\ߺYCEPӹC%[edט9F=a4j.H_Fz\04N-0"OeP(7N4pGLKpu[WG0]7IF#i*lDZ5ļ'/z_7IFaex9:RXk'qikADO( ISQ/𿦈=#0? PGi}X]W!6|gǦ25ТmRq.l_b2{醕YPgoe *n/ߘFΰ( ?@9(HJ?{w&TzU50dzh\o<4Ez`ߓUjkPAFND> j@cИί|skcE7Gyh I[>Itd;(]S,BuU8Ǯt#-zd d!)gd£ػ6Il_ź&^mj_n%PFuRdg~=(HfށmCkaȏ4QIMfv@݉(D|jikK6/]4>Ă<(wMyzyG4(jiODpxFWg^49/5˫s~ #+Nҳ- 2 Q v gЍ&/#n>0{fyiU˄#>hI_uqT'> ;I >?Ͼ{bH\A{N4>łiwl ̿n R]INS#\Į>'ҰX pXT8o.S`tm 2WsS >دq2w;a', r+̜Q׈ab˫ ù,$.1;Y dL??0#c_-@B2qplyA>FyVTWլA|9ٿsx|DmN%<4z~WV~s _?g49f sfmѵJȭqp66^?J3 7f+ ΁}}-Ȼ~"0oh;ĺ/8Oםg\2 Gq Ɯn?xxsDy+,Y9;Mbnxƴ2m\/SwQQG2{ވICc|X/8ܙLNPۀo /o޾u[f> {F}yײ8$EyWH)+bL_J#D1]9/t읞|lxI?i$/^g9gQD^>Z ! o-h_F3,\ x 7r_ m|vE̮_@VTj0y Xd:/cR*t1x6/CK/L̳nכtTZZv#Ͱ PѰ)<{P 1q/1XR2֢i~@fs-p*}XSGŪ.|Έȯ#/mɏJI͛VӬ|sxTC#5@±ް} Vdƛ80}-9=DXp$x_5=I2cqI(D- 54thsnQK<}$*Lɻ@F\y8[ | XDLh1c֋/]lm0W~\e_PP9Yq*Fd%D5| yZ>x!"_'smBq\4Fshòdb&&c_q#Z0]\xxEejĤSa {T]a$ DbA.tA<2^3>OzSET0KR>Wg?S8W7 -(_x>@f^#~ω]g L>͍޽x ŬV KxwR6?1X[ۭyBqA0 = \ NM^X.t^v"Ɲ=(nhe?z 04m< +s;Ճe'?bs?0SvyͣaIw3 1Rsxe *a 1%,7?K[*}.mG;o Jgl2WC,>u~KVN{/;0sq{mJ=-jn\Ui|6g3W'*!b Qv_pK4$ 5LyNBU‹-D<6d|xWb'UN;a'LjyUbfpóZ\Q)u_Wh)]dbF<`8WAQ}e?y?4LժF/if~1[ݚ]M:m\8~rkLJG+xN85Ec>/pcK.u`@i50鲝Qx67+a"TՓ0{%E|3Njnɷv~&'. RpUƜdФ*I3NyHP%_ϣMaB lI&S+M?'E0i7.6Rh$` Om#m`lNqFEWEPU:yg?B_c޿tcͳܟpeG֩r~Q]%~N~V}ߏJH=UKQ#b(ˋ>F鹼 @x%H<O 5H?PM/N ^ G)lD,kemHأf=R(X0-D.խ(#ȣ!3X.vU=}B|nʕ tz &0Eepqw y#]edX__N l^Sz+7cIzOOaN%;Q$ w=EJ}Ӆ  OW@GLlgQ%oS=jB7@d=D=q5}iJt^OO؉i{ AJ{f9Y߁(dg:GPஔ>N/J/8[xt[%(adk=%sC9{{q3G~">@ڏcL܇35:TrJuѹ#v'8xW:}a!%AJ?`}5%Fk/AT鑪x.0n6EwOV|%_ &z`8/^ARd^v`/1OzRd`PpM XŽK- yva͙B|-ꏣɸFyQe[Ք b0ZgNPY:#DV LIa|)8\ Nƕ`x{moзU4nF6pkzeI{U UEq~ L<2D*\klId:;9_y,ݨN"ez1@$ nPcXLk Spcޘ'W9JKUT3/!EyHR$oJ~|Oz&Ht aiTQ><|0ۇGn}>[fm]vǣj98:ຽ4`p6ꋭJ7gDŽaQwf꿟 W8{;3gu |>5k:Fp918O~>gtvM?o2WxO?49XC s v=p_~)7#~:sQ9i;ieM={ #ѻCq_ XmgX 4ՍU{U Lq3.#lcP 4UCxLJ{pg/BS j{Zp̂c Ⱦ ni>x!D-IAA}#t8+EGѯYeL (CﱵŞAs`?`ao͑WvXsZX[!*<ToL{  } qd3JAwy>٧~:/~6o~+ &{!< 8AǎFcM>=~'ayƏgv/9ۿyWWg9+;/_f_Rs3>䃟sv/Sk!i>` S?r+w@W]&' ޅ@ ?kiz}˗%!_%,ZRi"8H߻iEmU-@y< ǪN5Zf|ojm]hZ+C1r*Ӂ`W>ߔojrBCc6 pǰ(ބM<I܅p'xXL/Wwȷ>*/>1%`O?~lj5(wk n*ޔ'K+^XB9f{<\lmm}Fo`7N{ß$ se-^tb׮_쿂_~ CH+3 Ȧ*>{bu|D ޑ.0U7 ,MvJ%S^ӥwE&LVtCW W9q#]aŀ \N@ Uy=H>P焫v080g?% Aq;[|pxv]Č_&-W뻈GF -kyn/%R>^H??`D $)5Hk,]pPa"ªo h~op7|Ivp jUOA!j\a1v.Y"#,#%F^%h&2iI~~ W3 N2CSvgN&L_Cm]Cّ/qw9>xs|/=*>uiw&c~?#?>$]k< ƽb!慧ŭ@ knߋ7oGC E<~qbm*ҥsUK̙AN{=/n6bFyd7^5ceG<@O4HItzd;ǣO5<|Xq2rP1'zzo߭7F/U{d҈sZĂxv>s0]E|/&B \fLd XCw D@ϐ,)[,&>w1d߉.mً mT!bh.2QMAp9u*>̑spO7ΒM0%S ǣ8tD:3sR:w@i onpt҃Oڳ;D\^Wto w&O8pkC]?2޻wg_S `HXZYp*,5syL?O|_E=xJ5+*xR+y/}G<뱢 +K[-mr2PnMšoGówKܑe|{~|6/^H_[_C3> ~k?X>7I橌$'Ͼop)'%HI&UK^r Pp>`ooBj@{bյ񮷸^dEl / :_  s|b#:9"2ȿBOgb!އ"7ǟFԓ;[x'Ӂ[ ,Ĝ̝T\wލx@BOfÜR|e)f(UQ/iY|{:E?VYvl}s܏9ֲg[`n?,գr\?-~wDKKLv2݅o SsخwT] (_v.'D>fM#N-!OY/G!d_:0>~M{û=,voCn~پL6-@|?! KFi{o~O{LS#_bgMd񄢫 sZ(/Q!m (AV `u'= :K@y 8mu?0G_>mww+ `4VgK?ソ??Rs}@Q NWmc~; Dg>_Ł&(ָh{˙9WHbbd3JٲsWdC + onnUKH'HMǟ}/'̶Xm~0Уu_pih\0lk]_[9by&6gWKN1W{Cw~^yp3~::.>ug[Sxv~.xupmᾌKSkkGW8w>_t̜QWI^ԒCs~扌tψSRڞ-˟߽϶统~Vֻs7֗:ڽl `_[o |kN O痘!b3n/Ip}FK'2Y4>1;#QAe.gd{C쑿z&'f_nܸ~7̾J//7_(e"U@ ,oos#h0;k{k2p}; k3ڣ}7F ~_x3xk j/kfiO2O Y)}k8i7c'~#HXc,[ǟ!?㻷wXK|&h ;Rͯ7C.jv8<¶8JzAppicWΓ~޷0dW~&Q_tf~)@\dD&ͬ;=ffc**=r-fx G|$a acUyt ui)ڄR2.[`ej w , [@i{Q6嵘gx@3d3זm}ѯ<:y.݀\]4a㗐2,ڽضa2bfzv<3gxžE |+OhگȨ77v|7mõ-mtwٿJЕL{Y% u)'2g_FaYfQ;_M_Ǎ<1JX+Fb]iuK %̭ѭYt'$_BFbm:M3|ۦ<̧uk:}Ef#h;ffX=mnVOP;?/7'IӖQ5ShukN?-] GץtT35qJ0 [4'qg3 4N2Ziֿ/j`[ fa_dy5j׿;5boi|ݦ93gx13St\Bw|ۋpu>'5\2_`E0/K M7%0oZMyF'SyfExpݿru0!ehڢvQXt9PٴݷN-ًdسŸKJ5AO/i!ϓa3 |zom7+mؗIENDB`ic09PNG  IHDRx AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  @IDATxIdIuSܸ9DUu ʞ-P JAPՠ@R?w\tj!Zq#J$ L6X]sN1yq̬!;3#2=ng}g1sp3; |%0lW>R >RC%I`'vI`'R Ym;wI`'vpM>vwI`'vx!%|!m!nn]|[z'vI`'OJ '%]; $N; |M>AI`'vI~'.ߝ~Q t/n'_Lnj)<6v+xw; $N; <MzqN; $G*#|'vI`'S^v\v:1.?m`m~6^g%!Bv+Bx; $N; M^ԚN; $n!KN; $*;?=f]>oxٔ?>#n#|'vI`'S Y/;vI`'vH%wI`'>pEFhusxQ ,[]ޏ;y?>G!s'ϓ`HkGNFNF_II}7|-إ}n$|U:ONv$Nz &lWf&_Vp KI'[/?; ${y߭0YKt3E 0qM5 [&ڟYӱ5Gw2 QUZ|Ȫ%IKR䟞 H}+n~FIlisi_h//@'ן;u3+\|Pnutky^\qO6_o ٦8 ?l?l؀{sw+[O~6vۈ?_MOo#n;m}D<>xokdzh!w_Do2`}zrg.?z,?wW?:@O wV{{|D`ښk g~]泙cfp1:?LoGt7t K9]c"{?<6>;<|`18h_ ~)`X=^2͇cfKr8aZ Vc6跜|^׋[o;NXX`5}\H r W jjZ1ڤ%x[81~F|ɷR`7 v٬I=d?"QҪW3f5@!++# e6ΙВ 5~̒OR V`82}-Wj"9P>jW˰)yDӠ:{ַzjl'+&.#R9Tz,#Fd5Eu5=d8.:Es0DWU&ڦT:.hgJ꥔%[me)CRiKښr0wk,&6+ e1p-TwOqQQ=[[(qQK!~)S[z!@T$`(jܮ~\\G=o|7CFzY~v>2`|yyyyMݑ:hVâxBLǃXq`-=`jC^;u/´".L[f GL$ 0|5B?M j,i'ѺS+RIp!?M-?''Aɣ^IAj3n*?- f/oF IjF.h<.u"< Y[&i;yiu{>\l옰dVwNuJlY4DXnɠ8uK Y%#FKq=[w ff|'ѕE[cpx#U~)K:"NV *_2Ll98z?ܿUYAwI3=pYr6ƽy۾Gtݿxt-l>h/ۛNuExgwI:h]0Xҁ, ,@ g,Qxy7 Ks=vֵ BV_ږѹ eiv49d0)qHn)#%lJ"ӆL( tIR~Bgzp1g"L' $Y[[t}/LpޤZ&ߖ:t!'6񹣕T;~~cLv{a'=ak:uCGDYoݡ;8=}}05?3_K/Ym[T+Gʫ~Zym > .4+=+%]G-ۚ[?Q+fm+;|٧WHK{iICjS"&K'p~tu{~:<;]^];O?{oQ[œ/f~7KỜ?w...~; 㛛%q o%_sbw&؂2w3㋳n`g>`ؙ<=mګ%5 W 1^pf=͘%g&t̳ `?gBgkvmwMѼ}ufV;6ͯ @*Bt-"ۀ 0X\5ZQ$֎I_0K8m0[ԒzrTB:_{ijfz:!߂%eْ:B*7V BK[l4mMn,[v&WTml$WbQVE $n |!UI^-CƻWiiׁk$>*ح /"'DYq)YPxo6>'/Y"μW~ zPRVds?iq aMY 雖wوP+6L7:6f4W~\t6;fkx;`;l^p /գ6p:$3;8;;;L&"܅jks_ԴBن'Wi(z7Owoh4e5MÁ_pz k5au;=[c^G[o.m(<9|7+:>_7=&Hu@);;$dqe7bD>Y5h-;D9l{Ϝf0ˊA+Mu[¯F>db@7CWȲv">G+5a,op {.li'KcB@7-"Qז?{&*I ȷwOG~v⦉+:RnDk3:UU_X!E uW[p+ℿx7+ɧ7IaG,S(qۅvjWt4˾o9а Ф)KX+@F.YOhIO6 JRf~$Xoedd݌98bqa 2I _dRJ}@WXbD&i\q0=T45)s$$C/b<aU5CW EnlTzOɣ֎.vux\t9ce2챧Xd6p}|8|'cpY|f''''#N|_DSOk:2(l5=}Rqmih(s:m $Ys }K uœhpp΁՘ÅL8L"yj8{1Nx:6+֧v wl?~<w>|W_YW,8 4nzخ_MAHuL-2ECiP{4,nnS&+rG=? n-C}Ȁ , 3y+d<Ӆ>Ndry8illށ BIk_nGˡW" ~I`p)6)lLy+沆/@YDRxluv3a6p{yЅ-aL ]ac> e'NyeFC6-ה2_ ` Q72&⶯r)dBUϙzSm:FLC5aȿRϻLX-yY`>\\̏ǽrvꃧlph58k oTO7ވwp;>|𵇓tjέOc/8|-\ *-*iR8`p q =xk\;"OyDͽ 7Gyky@]PN~vb}cKLaGui|YFz?L뷢/k>8<?7\n'! m`pU]5}.sYa 1R{?K?| Lnߺhψ m# 7t7eՉi!LnW}-v=}ël/lsiNCa/Q =~ƙ!-n>y}*f4Ζ3C0:t\FJ%G:%-ЀR7>vLgή%ˉۇ8 ON^:\.@qИ޾\~\;[cKmИĞG-flw{wOwkfozųaB- KwsNo"nvgjᕧXw2gLP/xoϺ xȂGyu~rwxO[ Y##b/5_Sfp0I[MYa1o1zUG P Q&`8KSY8A~ouCS搹+3֙-'nQh)JyŹ ݝPLXF?zr3x;B;x)+? 1=OR=eݦ\_s/ r(oǷkvӕW&m]w`~!^g]|*W/^nxfSU<;)xԗnUyPQߦ>>?1>N{xx1F\Q>7CJx_Zl" r9;0=3?%`6wSv\0}g;G?Z\yVF>E6fpC*KDL03޲ըDc(S w&*&VMC:7qj 5lL|˙S^s0qAerGL{anN$r?c2pn9h6DŽiȼ2d )μ ix\;T*ſ ;8 Ep +nbBwc ,h)s\`WيG:m"<3'gX{B*"WCb &&l0#x&IKóܘx8"&e92Z}^o-2Qi͠E7*++A{=n'ˊQςe'BM!ws)D.o>?Fr 4=կY^1?UNsdsrj³Q[93bzT*]-zJ!Ky#0 Oo"?]mNxZnaάߪ3Uަ8M~cB;!M~3wF>~>GO^QUn8S&7U+u='g/Ce@~t 舓;@gnhK>RZuU;e^EyJ @8@|V&^`01egXW^x`4hz8op} ;~ߘ޽~?';?Ώ~s_{r.yf[E5wыHZumx}T)_5ЖSrSf<{QPEddA=i?i#F ];9`yL7Ѡ\:zw1hȘ[ʆKU q{܁1ҸEns+xR1=Q.9A7e(0%qG(Gq6TVQ '?NRš=lHBŝ|Z$M)o/Q#Nfay0Ϛ.:ZЏq6Y^]5P}I撿=WʊLc L,hkS_?Q^# }I_=F>:(o.r7Nn%((okSۜ8Wn7n9܌*YG#O1sXEѺo3v\N7o1?ǜ0Z&mĕ}nᑾRgq󴺽(iH#nWكb~\>O/v΋o5~ʒ慝8s2Eރ2ӧG޽|ݓX\掗9W޸GEIգgk&Eю-˝3P?Uvr0;@d;={Π2s=Cg[WG}peS eea^0(iǃ15pPn;cOSO374I48=}tk[t{PtSm&ξYͲ),5X^w([ ,n)ʌdxhzxѬO}<:C+2YyO0C^?W?o|nv- =^De0=FnGGXwr(xL8y$1uX,C%cO'7vUk(!HRgB:&Ds(Н؎`Cw( OSW:E_ϏL0AveaRLX 8}<{0{ef|v31V& |kctD{.ik{YY[jy#[Feƴ]ЕؒߚMt>aMwH{.je۵/ѹSyL]ßmwB}OMO275s&3V<X ),b熂 ) [^,y7+vëheϔ\x~]޹k.GJm,QjVk~>r`<]o~s2b˼g/ٯ/{<^)zj;Êa1g@xQRɇmvWtwφuIqZw#-Ⱥgyw,}\r=`|} ŸpLƔ@ZJ s0/2#3ijY6pN!& oqZt78UO1ݩx!Z^wFy[uՇeBNON= B*Njz8:ZGLtӞd0}&JxW69W8~#㻃RQ#8vã;<1xc'RV4ᯯj Δ|` U &ب0VoPs=wc'+&ى\#vi(Km &? >= bG GI+ڨ[&0vrj;)0|=:Xq4tzgyU˿*ze `&f 7zJ֝;/6{Ľh2QSV21yrG\W2nymK#EKx|h[QbDž\\$MkR c G8" pR<3_mS8~q3;̃1(_vNYvY^ht( r[OX3݆|d .;yhIsR) K~0xvr4lY0*SM.i_ţ(3 |MKܢ 7J.exQ^'-}ofC==:'?JUjuKѭk1UZ)ʕ.kODW2*'܄Z&S\mev՝<1STųnfU6nF~|?'Ka+t8m;~K̔"3O\/|?b!8 ϶&m/&7mū>hLڔq<8H"jVj$rJy9:A+rɤ ܭr/ˋep ySDKy <^UA v߯j$X^N9Ǚr}Q'3ѦsC" $v2 0ۤ>,gryg G&ӗ]솕=e_nB x ޏO00 yd|v>Ow2~_MΞgQ.n*Z}YE pw-gk".w%,l8e׭"ٸ[~1/YE/kguƴeɌI|2 pP?xh,i`s:4vyM÷e c: OribK~%^gEa[҅*y҉^X*x<@tS<3MW voR[ $byQT\Y>c b[GbFȈg!71\)/x)s yCvny@u>z=S6ˡ$|NroYX&GO:RO(?#A)߁S/?1V2#tLa\S> J 2ۗ51 Fc;xwH3Q|ɷőӯ|o,[`臷:|bcL|!7Aۏ^~~%ۃˋ'O^0퍬LcMXkS5(Fź`tp_-3h 0ѷx5USҙb׸˝s3haH `Z1'n>U5n4]5RM%_=/qmylNOЬކm ۡ%xĄ-:3gَuVt~Ӄ' 9+o-Okygn|f^آp|(bb8R (vx)^~DZ:nIKzCl,L@eޅÓ7NT3;Ŕ!bO/> ]eYx^e˜lN7CRvL o<4'U-7Qn),7;Is;S^tD{NXI:!O]w^HWGv1c>ˋYWF,G~җE~вN'a~Qu(Bdi>՗>%GymSʯ/wV};ިR߿G#-*woca_=sxLo&ʌ\H2Mh#OzwcW܆L;YR[+˹OݦlE窓xuٿ?=Y<ѭul뗘ν5}?9K~קʾ1tgtN|k|߅2ao !0{@8õG7Їq+f;%-h44;%*z윒 (lW]sH]:OR7wC%XGDjɒW*_\Aބ;O9Nr#x#,/i=[9X+;L˝z+AHlyZyjPL(NDΖ:ALF99:&-NX thkߕҗRMOӖ.DŽD{`},|_W^1,SJ(SO:@j+HNVΓfwiԃ8/'f (3}SDҏQK'(9砥%L<=[yˠQ&l AlY7\AdBABOϬ\?rϛVז,VG|%_\v[o)+tUS^]P&ؤa8_ܑ \rV+e@a}ߌxC 2g]0S0|B˃u+!e8NPs>roƄ_\tPSb|~&{Ah1uz\'QQLjs[B;mYЋꈭ$O߈ۚs8QT ke+yZ.Gz:qQe:L yGItf@1*: 0pҸ ;razglG`ٜpǒ-;mEAVAIj;Y^gNY1 +/Q#୸ˎ-/L,QOfh/ʕ DBUR޹i)'Wn4gAi8RȺLHhZ>Rl`9]n5Y78U~\Ynr壁T?4˟&PP,K]ι@Vm k@XYCgyjy &ZyDEߪ 2wGc+;t6<)>)>,V5M4úw(r_#}[?~-܉YU2US!RVj ˯ G ХeI@_ S*|V3 (>b{%{鷼e\`sv:gj/:e#cb{9W/۠Y2K^(;?Ʊxil੘@|,`Xr- eCڸ8{IJ/j[b#In4A'; _v&& -.*^Z<cS@9M%76Ur5^GJ:V(7tFWR/agG1X:vB@ 8xhD҉ܻC3 ;?ⱄ3J% ߾\!|F"Z5}p0O\:)І OpQl۷,/1 e,h_K^#|%) U2vQǃv/ yv'5&R.o =:vzTʛA Ⅱj[^䥴r6;ësh\+dY"Iq q_YcK`nlbWp<7vHPig=^d*Xcϩ Sߨ-6[IJcP<6K8m8prbMx5V/}᯲)>VUG?,SgiWWYBp){=IAe^샎2i[,~hQ85Y- ' X#eV KXÓƽz^~:H^) ?^yht:ut|}>W 鋜s8`KNLI[\%0hO ,-85:IIJ\mڡ>3Ti7?+s6Vfk& siS: hT6cC2ƣX l9P/lOJIMJ;Dl+mɿf~J~$E Eo̫5ބrA:W m*?1ϟV|%W&L*F0@,98xعKmp[Mc|Xn +f-} .@IDAT(pWz+eԎm-܋g~{7h)!yF]Z8k2I'&kp6[8+ s`AHm%  1ɯ<_sgM`2r4{?He0U`O}~V%/e,љ>m#yRYnQE?g${~&x{ܰphV{9۠ 8'u*?cpϡ%[0Ls1=s|Df?۴{tz忊^\'Tq9N{ݸETzx~vE(M)E-HE -MaImKZMH i!t tI_\j.cZ@[NW]$zI#XK\>3 v%LLKI%(8c\Virq^zj 9Qd!.?9:HT[Ddh>*[hYtLJb \ݎ%b:łW~H nPӛgFV:lw;bL:'Nr`x>eOKIyT- ƕxf5F8W ]Bvd?'8!ǒePp^rj3,•I~aYq̅p𱉃xMhYe:FṖA6çjGP\be~_` o#&2y.D=cuk9}N+oru+~)ZA,,MO˫Kzf?'+܁է.3eƞ6Y5䷅'$?a-nEf6AVUkNdE_>ϬG"= Og0Wi%vm pS_14|pg0c> 0|bosU5vU֛WFWӃC&̯@I[xK̜AW-vM-~teY[y H5qJ_o<&Ní$]ކLfe^[\k}jtb:2hg1 G]@ghzi0M6rIFtU$ӖJ ]p ؆"Lɮ8ōbRK*w[ʵ_=|}7>xd-x s>@7ڲղ|5ܛYe؟LN??a[h}W?Q2hUgYQw [2y77mPtQ<mkV:e[pq 23s> eKM~~:i*|1u˯6Xn"! j{ d5h˧N B+~@;ښ t=rJ[>X }yp1/mx>;oxVvîU8.M+/)QQ~Zmj%<;U;K<̞ocp0oK<SɊy7i{s$Q) IugmQiZ񯧯-]= -]xKé=4hv閤#͖߾Zx7b#~ct\rZIZoEBQG,9%]H~pˣVpsY"xe5(!NW٘<;j́v V;^>7_\+<7ֹ'c> ~?>wѽ;~ygǼ}iJWtʥ 84(,8*I jH1BA:H].WƁi;ӌ=sV7s, ymB79DTȫYE3# #D ~@Z7BǗ+[K2L􂺼7hG?vov  mDm⹉v<[WS ,{U@6Id?9ӠW#n4嫬g=M\L-rҜ bˉD 1JpWW~-z Le҂ڞ@Ue&-<5n,85*r⯔iZ~YHPRq~'Lt{ zO~{ w*?5K$ѐ$ , iO_!;6CDmkحK.qewK 3}da;g Q<Ҏpc'-o=1mǣ˼ϯ> @>}Z䍋~7̜)-_ҵ^|O}zvqϧƧ71Ϯy[_\=/Ot1<]GONog9\>mTjM'Rvd7=I^| }AG-x=_SܝL(<\6z3~׾чw[h׫[:PpX| ߽|AJ|$bOKʈvhƘ#x^VSn@0zX'VU8]V_PD"!4~<;}>Z#bti bAwvHkS;O󛯲juUӚq9&wj &0Z4& M*gX'P'Oca&7)t6V^3iQ5vt,ӾtU@VEz'qXT3+IBe Z!w%-3e Dm푶/&!hFȺ||Ǫ'f@A풟?:z I}|dYWWuPǨ~i/uS;8Zd׶!UW=-=3yTIӴf/`b=@CXS }MV6X^.eCYVk=\8k3fO&G*':MO{l>g{77­8HbTH嶦6:j F "u*t䝳lH34QH]:zWIM_G{ У}5٩ds<H#Ֆ`9^ӇCJKe4G/QՋ,A2ˣs̕w ӆf[9D 5mKK?pid#d'r|I3Z8f~W6Va&_׆)HOeQVrTRM!^DTQ~TREѤo/H]*u*CE)*bQ4)sMӷz}[Qh0聓[?nx.瑮6#& (l^^[09[6;^mpiiF9Ikz1Әrp^r`SÜo V +ݻNf&ꙫ[X&۝+?tg=-ܽفӭ} {vyb4}֓oIb׏?>7bpoΩ:5O٦*ն̹:hl3{/:ղ52Q{0A c@,3`HIW[! >L|3uq38{ʻN6W׼'B/ 7;ent Ru v@eϱ+ kuL(H|hav1蒼:_M~"kB݇@:(#]f4&@G?mBdɿ]F]Max "0X D˻qmzX Sʧc G&-ȣ1%GߒxIz+$P,iVmeXMQ+ozU 4gR߭X^l{Z0GY`?x߄7m;V 0Uց! -OR"`+)wW])zDd-?0JZM+ ߼Eݘ)SN[yͿoдlZ[&c`N|L}2'4[*ͅoqxkzOÓ{xKu_ſWbI$`[1Oؼ~T귐h4P'9In {Eq}s,7j']54[*P;Q(ߧ/8N6O .izE{Z4(+w[5qSeMp5KƱꐙW#; T~ Ħ{`uOڶ%ɷYx1_R& qr\O3c-QjDt'*p͢,Dy+ +y&^jbލ¼09W%>7Ǐ&TݲND!7zGrRl⛏寥+>D~ݤDa˷5:TLז ]>-2ʕ,·p15ѣ_$|=N -Ғ|H[´A`#k7$oX|~d i)FD&PV o=: _g"%H4:l04 B{5݆5}iVb;߼B_ 0Lst-1k4?؀KgARv&oh@k3.|rt$PZe[^5&OE@7iU`!|Fӓ $hIZ"ud2#Gw1Z!d.BP3 Фl҇.4t-; {:Jdj^Lx>-姱vN6;*"u-fjiǖ}!;{GxL0 oSK ( hLS7.v3~nr+?0IfK:J!wԽH/EOGfɯ`bj}{mѕ%h5AG;Zdڂۈ⵽aW]5zӾiIQ$%6:jiF j&A:HNq~ESeQǩ9^~N]2IIƅc\GM),Mѝjvw`v=n;o.<}\cCַ _On?y{Q!=E *1mV9r f&5jęJ36Θ kCn;rWRӞP<|w46[Cd,)T 1hOw//OMf*{<8w8^1!zy6/u;FX֟ZVȒ]cp(˺n yjU#f[+<($,ƴ5Џ#h%O=)]i&_I]".~3T0 tU$hz[2sbmЕ̃DQ MumbJt,je1lK`R6,#BR#C ld~<4ڏ%Ff=vr5؀كH$Xw"K.c \de24 G~ւ Ӵf6Cɷ KDt[o Qs] ~]~L$f%ZHWn&?(@7Uw'A+fK#*6`c=&|{T hOs#XEcZ.-)d+ﱗubf؂-xEĜ\]`n#20B xϟ}LV@Zn`9 <r˃^>yƲwj/~so DSM|5*Q1ޛ3|yqɇ7䪢8yZ1U (Ԛv4> cGIYk5jl\I[\—/Rp-Ȕ0 e`sMCgA)n}}t|l|N[ר/RC2$^5))ʕzD]Z']vtK3sCmR,ʤD zЭ 0 ݃/"b4ck`l= pn5M]Uw~+ڙUErg)2E|8NJuZ 8D}r7@WLdBi~CA-ߊd?QG8/f3gyս&amJ IqGv隙2wUF go©B%<;v*g˶Ku(Siү`c8Hِ_{&ԳBt3ytHBáVa7A6sY70AmS'0X/&ك F'U CH3όˡz;#S Z3+E5E< m۱^_=yY"FWʇ#6v7/N袗~;RwĪX(C=j+]>/ҞQ9{7ݥsH =V4qҟ &eI\ ZV7h'KdOua:}=)bEX! @Aŧ,$ \zCB!/Шr)/+O`!kdԭ~^)֏z&ӇۛCD<_wz=#}/`PQ'J\:}>%Vp<7쉳y2P[Jqhv8r->TQZb ;xC?M~M$;Rv^(S3CafPˌByfmǶiBcEU!}籮0 C&Uu nԬvpF f1^? 9?qu_DFm@ۢ f1(| c=[&Cv^U)姨qbΈipI/^tJxY t(b >َ Fw1 yM2Bć:X 5*Ź}XM^^/gQ&(V:NH6M{`m,y*0g@Rz`~ Q.y|]5׾ҙ]ioaW%Hlh^%#8 xc `R^ģxx3`cDNig˾P{X| u {JnZv|nT~s}ċn2}/d(Fq彰NQ֥xTO,͗J4$o R"P3D"|ce[dC(ŝq J>xH2DH}t Χ۶ݝQ10^U4V)M">ǂ5nt~,>=./Ѷ_ī+}DH4ҿDo::нߟ?\}{N.tC+P@p;k@PPTT``&P jNCС==eJA1}X70PFHi$E#a$#  f\P ^恥鳻\߁Y ksW59ҭN&;łѸmU[^ t$.&V"[{mBxVꞘCO"Q|Ê_ؚyDb~vbeKe岋3w2Z Jtf.sa پ?GfavOu(8xA_{lOz|~~bw?ʼn%Ζn`;8B*BT6Bs|H7SxOxB^(;~39<Ј=\q4N.eV!qRu/7VQ^0[ ~6he0RZD?fOrU Vzu}'/?|]z}|SuLMje5Nj?*1,zõ;9Vzy.PRgo0I} iI/x͑^|z.?@}\[oƷ\Qmr I_kzLMHaV M8-iԈEYyXW(;8 %0PSضQv/p^UH\ʋ[6:8Qlx?"TYG/0 y23ƿ&G"x h輻yBucwI-VbRy k=Lu[!{]W#%Z4R[@!ddRL䲴B-Q  b>u=t}rƘJ1y1Ķl );^U:i a8%P(H?HඖvG3m`H.6*ex.iajXx焐i b:l/ [ԍǗ*N*TPeu(0XYm-mZuB >:*298Q") 0:Ac`x9|qBDD4C?~oh| = ~N쎌oЧ07p fՅLxL*"zKQJTIkpTPSyQ>vf\V(Y@&D8֏=t[PÌlv},6y1b|E! d 9(|*Q.H4t} g'Udݝ^"s4 ~n9jf~p/W!483_$J^»B.|9PO]Su4fP־Qzz%"]gX0zWy>B ѫ`$V .km6/| 5͗0 ^P¯X 3\G/)QGmˊZf.ˢ Ɔ:"r< #[L's FUڵCya4sh!G_Pbh+=B7_-e1!f{FJuB܎Їn`d@_R1h!ǺR_>t/Ti7@Z/!x!ミB/n|uqup%Wowzwlpqqt_}3awJ/9S}YEt+YrӑD"UrWh÷}M Й5;u zC 84JQu"XbS(`/҅/!l9tGZL5g$:9?| M6CBIlfGLW>]&ݖV!ozTh|lOh>Ɵ)mG}n X&݁#/3)Olٟ?$nˋW<;yu }H -U;hO/W UZVtѧ:.Pi = 9oA Y3(w'z'VG7WC~k_dw`wKKY^>!XKY܍xf@ -ht=֏qY+7.rZU,&F`iqDm5NYvadx"h YHwV"K[[m,GDME;%07$QWeO:Dh ׺@IDAT,:=b䝷 P(7CՄX\sjQ>4I1OzK(/˹tꒌQ0ׇ7FJ\0,BFyܟ !X0NEHMh;{uR4D(o.r%jSV`0GV j} &">ڿE_ȩ[|% gڔ"1ˎl*7AܟU C_qy WSv׸%\^r{1Yc; P];r-b=\ ?Ӌ,~|tw{]v)O/??>>Ҫ2J/yo蝦\*Åb0 ])*Nz~ˊWiָbh-.B6@#KGɤݒH^VUJ<%Axntrwp֗FN^sBOoɄ| @uW>8 %l# W՟cFjks#y'¤6L6JO4E"P:2ۄФuG:P8R0:|yB}zz@~7]+Hg &\24:5:UPC@xTCp ]"OOTPvl0`lLۏKxd1.6-yTB ?md= $_eti/EqC۲hNzn/-TV AB=Е ʼ, aJ8p/|yz4OmƞIg Q,(C=>c[|FCB0< {?ZHx]t@\|fq=FEN$cNxQ0)Mv\"ȷ1 Eg|wp0#X@+~*if:UL +u۹ݵ^Į.Djpw J+sid |z|E{?҇?-)\~Ja)XnaՍ +83>BZ:n\/]Z،5 .p?hUND7K[Jg,ə?!K xtI &V*YXk07tm3m8T3i *KC*m+mB̔ר ! $ADJTv{.(FLY Ol,Ḡ@ 6M} ǐ ,r3gu2o_5jK&sUHcqɩV\.'}?U.XCeQG#vӞ @dJQu~2NtVE|Cu mle5|GÊj5R/΁:p≼`{/TEiOܓ=uˆ fT 7KXP N]ŵ5jKd{6^7^^|?etD}Uqݺ x\o`!}0|E[3sEa`2#1`XS#UV-_/Ou\ϒ~x~à eɻsl*cH?^F[iA0w >{ǂ^ieW> (RV<Lo$OjEXJf1(1:4|ɉe]ʗbK`E6oLYZG?WR ?Q̖=1o$ 婃 p28kG^#J0R\a$ _vՖi*"g@$T^C?q&"c{ںZynt.Tn{5`XA2:Ǝ b;Ѝ?Z@y.2 &SlW:=p]~Z_>mC d[TnC(DgtwJ?K{(~D/U:N{5C(hV^:D_I# L+Ԡ7)u2A.}:fda _Ew؈APIqi vE QG>Vyc|cgnȈff/#liKV_7e9f>[@/urSsWj9N5i⿼|1D;:㓓D)HkYy1 =M`ٍ+*;.̅y܅f$R* V"bI ~J@7 FX =q Ӗ NjCLIxaırK3ϰK\T,5Dqm!*{Rh5ؐ @8\Vt hJT(:2luRmbǨ`_@G&5p%= #X,>"Iu("N.%:Rq$І>s-Iu&`B7t`/Z8b#հP5@ 5v[Dp*_sZaO|gnጱvȪVYcuU3`;b0:[ `DZ}fAQGnpPi*Ic_Jʬ[SkpF0pan]/#}9i+9X=y1~`tO]_689J_R'q в.svuC4GGWwחW>֙%=I_uq6B&: x(UCpQAϫY + Q߱[l+J?xZ ፖ9K ~_xj`_0y<]d-?ۿADQ?a/HZ{B6d%0Gn](B'W[EBƊoC~5~V&)H:x3tG3c T~Mm틉8 ~Zy}([ -PWFG00Ǎ=SEŇ"V -LW!E{$Î~5{4;9+ VJ) SP 5*N! Cb. g!AxL/da{vyur]ʕ!@/)O[I)bShW۸+.Pqі{ fL?ܒG!Z#K1C'\*)0c&@gӅI3+]6ea* ˾#}Lrci鄄~#S]=Wq%^[O{gL64x\_zv<8:;9=t'''7Oxd СYx9{ mt6,VlTZejW3ɿ>>Y2q])VʙV1B+M//ѠM4D^ ,AA3fhxWCG$^-@91cCAA `ozʊl=~G|ҁ=1/bOЁz&L]۔/q"ez35UbYe "58rƙ@;bnA CvE_w0Vk%VC4)M_e\)i"H7E1ՏtD0WZaR?vV8ixj/XmmwC$gERXkf߼:D*ÛJIH&~S[r8VR֯I3xRw]l_@7=p={v{B x1rZ.1|`IX h]59qOkbi@ Mc<&eFp[(ޫeݩhx/F1S}(zaIG Ċ_ymȴ9s3`u ; + U=EM}u`4g&[.cDGrk8V^;c3o߾G)Op|OvJnu?pzⷐA?]"*'fTj˵~ .O'h{@;mߏbJм:lIx׸Cl.@gF; Pٟ/}[2D|B 0vE#c Dډ!?~TaQ2[ʷO,"qd [VX]>{aBrOB֌no0i+o1+Ȥ(.o L:):(s%ޫźFRTx5s>4T_/W=1|mJx/`S3Xvssp_ o,<]5]㦫)K] ~ȹ?Eue\{dYxUbKh1FFc@*OQ~8 `o}4eȧ%u>=:ӸOG۫'_;,~51N IG [9O(0J!߁tVl=:d"%\J-;=< ;*Ƃ~+Z٨QFz0R1y_< \ ;Hh{ r,ނ6kۮ$DjXf@1;->(qseo" Dfq@=;* e5U6{z=2X{AY1k1K2W #Die#Fha݅S??4eǪ8ư!EFYP}Fl,nOJG}؇x;Є|֡kEjC{ WPyG ``s0]tBs-_)R=yև us}_Chn}gS| GY2Dև}ߔBZy/PlUl/ƗTr:\fy^~x>M< Cp\.<;9U `! k]C@/??O_xA.d6D\ 3qmtT,m8~׬s 1a!ncoB ltבuaZ+hQzkyI|0La59< CgE(bHz]$`OXT).,?)Ƣ ȉ +x'q)$)_ NZB-3jYPf/ 1 1Uz6xZД0 eu `K<WQ un[b)ːхjp#+\6Gպ&P1HߙvlNS)QicѪ}BgӰk]_;>;OO3:|^:d!(MӈTq麊h2]xPZ: 㾠YW1t\ðIjqrcд= >c9xz8k~Şx{t݈@^-}ƦITV,@z۴w?%Hqe\5d! K7NS-%)دrׁ2 q=U`Ap-=n "K͎Z]cS:*^?ٵ:-ָ0kaFErKD5E t,Shy v+Hlq )]"G8gg%{0|[Wl ˤ* TP'2v L! z}6ŮTd qMj`o7uga(%MaU{)͋6P-rI,˄i)SO S.!SLۆB+VT̈J'}O ZdldYQ_p| eCg>Uڊx#YAc0"x%ʼqӰp^᪯ .M+ۛCc]:}83>gPA}27^w*O8{xuNr*3Xn8 p6^=i7-3Y&e`RtT{kgbHl7=,:Y#_~1N:!|j c4Sz>+hpfw~\>|v{ˁu-/;&oJ[>؃>@>{9ytZJ<.Nӎuͪ:P33.طR\[*^nKó1GUL,aÕ35_L|6J$ɪoOpJj?ΘԠqT~ʄuCr;&T^[!L_Zb_kbdR,u(Mb_eS%ƲRvSWUn&[P 1.~(t( B{Cg^RuB߭*Z'5`jeκa$¤K 7MroZawD8zB' ~J IfhkL"O| oAkͪߔyy&̺Np`}d]j' m{./|+C?aGi `ͤC):֩uMﶊP'}03g:ex<:dG<ۀ+d<'҆;D Ž@q.b-46;QlCP%NXTjRpgޯ59rEɺN|$gtZ3̮5]⓯fC}/py9:;])d%2_{VA:i"Ui>=UF(_{oAJ(UgJ| oRſj%&omp&B5ҎTLK/}ã$FDpQma1m=|\s9`?_?kAքNY mYb)0E^|rQΙcVrpQ7u0vS-IwP8_qh7ᛃj E. P!m"-qe5 B͔秒(/g=q8c`zYhNM*vׄ!nx}2gmֵf¬C^ !I)|'ef|HoU@PniΌ5bt'}vm(???//>rkO2F=cݠiTGzME?fg>EΔmǔeiVYIfVx,k 169C1x¾9AV{,٘{Ē3 %,+ڑ>~pn$~HrnnчmPNR.52G4ؒC'P+J%^6 NPx,ŸP{5ƾۜ9FDZ:)&f:΢S.ҢAOpeA &M :WD6)_3JzP!عs6v%QTGBO:E#0Go*)Ie5#()LƎ dWo6g'om~'?WX½İ`T3T>eh1I+_%aA;N4 ^5>ol8'Ƙ\c6zٻ)uӬ~R.^Hw|dcMY*^j5v#f|փZy^ܳVD˸Sc'n~pp҉Fp3 No'!B=!;Hok]PQlW |TmUή )cQe ~v0]TIӒw4:Vae[~n;fcx@L+':TX2iz͛AEH#}x`g1p~J +OW%Eڃ p$ " 5KΊ8>ɨ\K':)Y:@p64өX!%;5]qYt~\ 8 ]?uֶX#ψb؞> Ze)? a+2_jw*Q\Ƿaʾ)Rdć7DZ`10ͦ"k!FP.jZAbGO㸷pŸq:zyl??J`CҎjVS.=+ˁ s{2+  e>1Y𘎅9vCTl<7T0l[lIcӇ .|W>}bwDޞP^˷O?\Բg7ɿ {^4$hǒ#*Հj.5pEyUV‹ Fp?lO |͖|ĢbZ%ǴdALo#;D,wUնޔT]1agO5(T@].h1-9)Ƽ@5KT K>R'+O?F[v5[.2cRn)P٭cavmʷa'yܹtX]=JOYw+EfΠ)&pǾ YNaaӅt lDK[M:X^rt9`Kڨ涃N>y"zu?>ѻ5<6E_ӳ!BIbȊٿ4t+nݴ,<1q὘h:|&Nɒ"ʍ7ښ"<awTBON#2;,4}}dMi6O[ pܙh`Z?B)yؽ#AB9< 4Q0bY0)nd78MЗ;i%!ݾor!Qh-^EC}xMo{мVU:.%LKb|@X!7LY0W??`[K LVKd'b@ E 7~81o%WcXs{#it[eLȔ;D;VUf%zBَw>Z΂|O{sZ Dg94ŦAp.m{s}:Yz}52&nV_ 5k}gi[C/kuvn!p3󯿕c^с^d~fj7p*?{o\ M, \,bDኽHl e":68$>èa[P0[r6wqԺVRd{)[GW|mGݳ=_ȗ RL[8G0\[7|B<2qlcDY8HlN2slA`A<3-:n7WIΖu#!hxeNvjnʴ> iSu`!%i1;B¹> Z7#}rq(Va41ʏ*׏_yGXza)0\%}tqOx)jS& ְۙiNucE5 >!hs xR]$_Sl-<كk"^_%ch$pTk}}v0R۴GwǺM@zXMs]||JkXfҦPl(Uɛm&1[C=vج-2v͒GtQ|2U:!k51сAE鵿d\Xߢ3>ylv_t|P՞x:uѦ鄡MB?ASs}{PPz|Oο~RY?T% Gؠ?:pw{ȷx+է.犯ono/.ή|v{t}gjm7Q*TɱK[4"1$S+N ģUeA%,J654E +N.9N?N^ Bv4hKkR@IDAT>Rg}ƗOE?nyFSA *"JG#VO0mcv|} YѰnLq{>s=-r*6.#k7Gۛ{$G77:;|i4c@6%Zz E`MX5~=$.܈G c`Cdx]N9S ;FI @ph8|D8 H<くcg.F^o̖_kRYc+?p[m:I298߱&G^Әǝ[a3Ci[q@'{o ,:36C#L=1Tr#:LaqǧpIc^eWD[Trb o}Kaxz-ZG&%-Nk1QiAil[W.Fg+=yxx`瓁𠳻7.o)No#OD -:R(. *QMCK#ZψqE/ts l++ι8D44տ-z:#d,<0IZl}zXި\g/ow\ˀݕWGB.]6~J_r;ӌ#1 Bk'8;9I}UR.wob xBNE|Έ[9h;8vuOH\'.寋&)?1} Y2zQ)@-[f4)lepv8,¯ ~?U$Is7"_PB%W +wS1PcB܌`3ZЌ0=܁8 8CK&ɚx3KkY#E%0Dh3}G&0r =nOZ'Ͽ=ȑPn&|7q=EL n'1! l9{5PjBvqл"{*ѱloȐtmk BW[g<'&~7gcjqoWkCƜ{ORZlOX&`*]RQ !!Iɋŀ f;Xs{s:8aXa+#/"‹7,M*<-3PsPLb8'1T OT^YX%) ىg6ɺGETDa'uy`_"C6ƣŀ4ׅR %ZN7[8cL$⚥xQG,j'& x)j_gtXZz)yU&Sgmn"BRWz9:N`θ_BKy5Rڅ9nh' IS6,~8dm&*C47@LF6Z'#~6g|G /$]kMA1G2 n̳bYGJ*K/fh%_;N̯8+U?+4ʋ|}i1\˴WX||AɟEnܗFw ezTnshyĭY""g~^ Vt+ y\ѷu)%A`:!e0|!gz,CtYtF괳q댱(AtFf"˫2K&AG MpCnNJdUډհ&K%fgc[o&Z8o`]S_g#Ukm.OQBٞ2UWcLbFH0֑cFfԈC+_BM&1:a-[W*b&,fbtQOun>!3W|nծN\xh#)-K1-y I-fR1[ s;T|+S. $mU2E默r=?5XM%=3~ y|> iRgo/vo^#ӻO s]SyZY٢@sbAgi9  ̏Zр3BȓQe I(ΓΝ><=AP! ,KߔUy[?f U;id?F܊2sZ/{'fȤ5e/Ȥ +F@zVG-tqEwڪڊnC_BjZ7;ԥ&7_2oUА$ KGӪ %%Íj_}j{XUv6I>dMuA{{XE^%xo 0ԭU/UZ7p_Tw_Xt OtgBY<.CrMIAnϑ eŒ:b夒1#uͻs|Kz`ҁVӴ?\?лS*f=Nnc%~-jh:ӿF 5Fhuݩ2zܭ_*~p{zRRBu*V4˽c?c;i-T}W%R$T 5fr`z@F^3UU2L19w 6uG&Z3Wx^; 27lNu3MR& ʔA>0ŀ$0L,I6{S9y+vS5["#ÚbŸcǎ -:]\2tI#X.J[Y+ZӖpD]ZB.qdjmWّ,U.ڨ͓3`I-ҵIv}=-7¤kLjSv6ĔsIO5KE+vOvO>ߝOvgQ"kc[a%x<xK&P e9bx+"('WO th - GLA02jàz5Ԝ/DqndvaZv ]_txM&Z}ߩ,)G+&mi(h)w?fw_.Kʁrwbm0v2_s寢\9n>)Fi1ldM{΀}qPlψ>0jQlz|I?<@ksA%l\^4Ib;9D˧vVNa("7GɾՒM+,]**adJS.YFx #: BJLxq&_먳=9q `&S!}0xwwEyB }ē;i1Tzz ߌIgh1!liDazE`}.L؍~i6<$rK,/OmGG"B^.DdKw}Ơ`@QUK;Yxvf@7eBK0n=, @j@Myyz96%'ճŃx"_x@.SЄ ȄܥaaSs)^rH۟4I ǟ VP}v!uq@u|wcG>I齶mܓVaF^ŗA[.ݸ}aR]BfOSրohkV,<Ia |V;z`-ȡaW:ωƖ~Eg@wNekgV}÷n$KLXpAv^l!:&.6~_[[ƙ @H:ZMogYoQm 辻hV{wW΃iy`5Sv̠3!pI-TʉfƻkK} A_lĮ(/~T%?m+ Es&Cmq#Ѻ ((|ղ`p>e rґ'`\r QoUP~0wn5,_ls]~-{w|׿3~:(XVsz"WMLfc U&~ᓘ0ti&MxGh SJ``&"=aۇwsJtjPP9z?s`dY>p᣹L,Wũf0V' jaxiWTM Ncu@//Z,'>T wd TU"Ib r[>{S6"q-' )_ˠQAYyyCsT{߼}ݥ~! 9\IW$۱sqWZoģ׃\B3pC>Rp3L<(K~k-K,q90t>)UYyB3F_;̹HP' U>';?z?2^~8/[8'vN DKU)l-l{e)෿Ґ#(dlSTw;6E2.%-mElզ-19UЩbx+(??ο!2) :Ab;|]0_3z;007H0c-E<21hBl#PVq󧶗6 oZF-;VzNJɐ?*%uy7ooP0MtkV0ecB'baq<;dz1 Sl#6x?>};v q]ae][C3OF=ڽ ֮rFrpX}9;P \_giӸKH~q@ `nr ,|:fa;XX{s諂͟7a3d2TԜt5z\*N|gOوu@7KC|Jhbv~McDD݅wgĚXid%mSǯkڻSB0fq &LZPmNZdFy,ϐܜ%ys^oXvB_% NzfIݤO&+!t==S (k[LWg`ņN,Mk0]A?eT%6=?;2ӖtҖ.UT;G𓔟9ܰٓ{6ch0~w SehkU@Xu=r)#ǟl̍"؈v芑ONk%ZH򲭴 M[xIljt.P:8<2Ss9?ʮSz.HHݘH`msώiW>ɼ p\mZ%M:x'YUVOXB,?˳|0kŠ`8 g3$EFU8]KB 9lw%<ݻ7u*%qDDU]8nSƭ<@Z^ڻ0hi:\ܘ6ZK <wgnygB3l;M}b%}R7>_r٤Bt;=EX-l5u/ΦVhL۬kC䐭Zxܗ{Iܒ"ްVTߛ?NOѳL2bxhTA+eweO񳑻v@("Sk* KG4~sJg/>A,Y-(&֒U6dܒ+n޻9cÄlٕ\1_+b>\ -pVO F6ED Sxc^0p2 IЍɟi=/4oLG^\~V*3c?>N Blt?mpci[fg#+1MbߗoP:vc]6"SX YZ;Sx Z^[E36, u{o<7fHTtJ*G`%Og/SS9iEORj0~zy N }-Bj)C (%{W>7>ڻ~J~x/~&6t< }~xC7ulKڊbk}O-^6\9󡦁(8܅s @/!S{9M%GQY?w`d.F:;ӽc\is Ƞ"WMno$&7ɋ1K߿d2,_g5N_+[Y`Ve{:ɣe#R]ADao\,0#;VUҍqXгc I{mӈZ^3q,  @WFNqi|sUMg}<8'Ֆ3}$f>/b!W}I ؤn %u'`/ʶcpY.+k I)QrL%)*@lqi*kOޙe"٪u _gqmɗ_|v %Kn{>>LWBK۾ikڪ?0#mwΈ (Qqg }!T(ub3$q`|5 rpO[x#b u7݈qR1dYx&HbZcZUH=өQ u?rz]Y!'el&W->(TTîq>ThP'YYpw~L tß0;us {SCs<c3aos.QT{M׌/'H nBw:a+w?{:Ɲ!=i%{M>;@ط<} (>䪣mާwWV*]#V)4~^|K=dR&¯:KYMy#2/MIyOK'4,O5G;}݃OjoJ׫רꚧgk*x%2pӸ} LC3ghZ2lȩA:#qjxJ0WMĩ1Z vP&0s?:!?|֡S&M馷a~D|"a) v䵬!Y.2Bd0TN:/^z5g@K[b0yj5eco0\uw?:{;M Ҹs}7[A;|wʽ%[:`"Qr"JbXS.qxŇaa"*m:IE8,čEbgJ},3k-ȿTJ& 9\.z:XVDN9C<,p*+}d]'KyLg#UFvm +v3,gRh¯i ږݦ5GZ(XGR@IDW_۳SRĨp}5T7m85]^[n'qLH;:5 t~b*uϽOq^OvhCsii/5~.t2:t0yBt NX%t,gp7ݺL!.ajCl7ZΒx02+iϬڳ1)y;5aϼ;Ho|I |/3qv٩paטԨ1(P2! 3hhUq`tG\6-SlB .sØ؍:Bǟ#˟|ot:5 =92e ~{y_[xOqDv&_jKeXivwϠf:l R [~(@ARZ2X46%*f%_k *zugys-Ӷ4ر$nDxblv3A"d-s^ɥ1*o0)s ̣W6) xOGK'yu;3)ySal5_J NbRF{-SU"hT*U,وǯQb޶⎺k *ݍTXqi;N'f +8njT޴xfhFqShdELN,LMԥh׬&K0ʴp WF`NJ EGaT[ݙ8ZOBHծʰ8 l {O]CIevJwx*E].g&ҫwHțB%H7=cr+|%KYi?Dm}$`YЏЩxC^pB[>; eպOӵ s=HP_uSEI(_uhڰ46>H4~*4i SL7AI[/5?ۮNbBS ?(Gɹ̠l̤f}a[V9Y.oWN֍h~>x~^ߍEg<*0TJ 0VFsL= *9W/̀_+9ՀM6 ys)䴢ƼK xthvMT*n~Ӏh5<8ώx6~uYA:to;6yRkw+auz$gD{>\x-K+>"CC.VOW_|8Uj|I2IXװj;6\M'l5 >(\ figسgus'Y906'c~ - ˯!ʌ%Ew{ƃorp㡎G~ ӡ 7@y[lxhyhcL詛v^&M֍I'5:Xͽ.\k ci, D)/<7F|qvv%qv܍e=i9K77~ 7Y+gB9 YM^A~H˲ސwnx.t.W, շX22_ b\ONXu00=~)0Ķʉ0$QtJ8{sC+B Š,fAKq@@;iy4@OI_Iwt.ag+kKպFR:O ꣀQhL?0?|Jg +$xx}2;hj[^|ZA=jK.Sa)]Z B^;həT a% m9Dyb(DХY ,!0{y:?{]`6~;ݤط"L蚿h8y&9"w_|L}i^]Mz⽤k9BALCli|O\\L C ^ҍ%.iIvB޼ڞn]^>ٖ2"hjG F $GE年i(yg?9 w&@7i!" *\ʼn8Ú.9@q_|l$G&ׯxo}ʜU["#iM= 2y1%ѕ:RIݒ9&bx$zBZ+%SKAHH˨?۳El `ɬ^2Pcs#a?TD'8P函#7K> AJ?H?kx#NN",-IM])C?࠹7BU `4ny^S*0 ޭ=x};>eA A>Pd쇌{ @rD Na╛ kD/-TW'E,#>E 2 <}u}NkTf<:+hq{ NL_p/$5 Z,/vx_`6(5۞L;n(/Z: Ecӗ 0 4W4n,\) axq!fUo` ="# nz/2QI" j7߆" -X_. PQZxƭ?h&.B9+ipI;{m *'oU4E5{ 'O%qs#9Ua#aK B iNpx*P1=9b~#&kUhq˧T-2RZg؈wDz;M47H3ytI6E¥8pwe{s@[PIUx/p8 -}KMװaaxM6S xK{yNq[9v/_iV[Ż!^LL ;2nאNltzlU0Do7MWwtҮ9nj078}_}Sނ]l[BZ8Ցo ^=KV f$]~BІwɧI:~T }-`GYJreaoM_+b ɚ.Ӵ( =fy4ZÑ<ӕG\\ X_ ‘>O]Сv 0q%'Ůk]_#UrdOK|`VdLOa3b` ڏ5)_e>/?yO ~e@U"ݾq;5hoߺ=@j:I8y~'&ɫo)>o|(cd~ 8 ;ٿ̈́N/0h&%Ly@O n}ǝ|E$07> l%iHj%:&pZLַC t$e%.AM9eb#LT߉gwN,%G +u ȇuS%L'mi(~}E:NRWϒfkujhd0R)؇'J:=+ mygN}Rw?ׁyviw{ק~/Y=&GY:_W@=~]N28X@X%,y3g۫ MV'7 g` @ m;>r"&nTv-QO"r^ZT5` @6nkF2lY'>ΫGtlh"kf5f#(u.Ħ# j$T箟ߏ>:}¤%+ o"F05Cmg$eJf;̄C{w54QO~3}`s0Բo>-Nr`$Lu2>\2E(#z9̲L,du:ABZP@w 7)f G 6"5RNi :&^3(qEU=z?aw~aODVLN%6Y0z5 ky@IDAT-8u sC{2軯7Ҁ6+ U }YbL#S6e=~.v,T.M.LL^b>1{ݭ,/2J@&h& )Y,^w%SVWkT^\dK.V'+CI)׻t>)T+&^oIxT!&tQpa={KM+MW5q4P1lC~9Ut\ pُO0^)_Wdͦ/vp7+8\˗\m;aw8ҭwm|s[7O+bXӭ"N֝PQwIS%s@cwxD,fؑ;D@fbftfoˢ&2$gBzww~M~1-Κ@;9`ri~5gySCO 4wYo]P|4T*얡d'fwՄx;?bfx!_>=`"kwAF؀=N0&g9'C,%Γ!13#Z;*y1rHe),6m zoAҰ-Bfk6kK[m ^jܔlV:ydOJ bMtA4Af%~W?oJLP ې2p?Rȟ0j9`?q :pvi_sLuW*zw)-Yt} (E}v/)TGE`\ [N@N~rfeUՉBt*@G|l($\ *2|I4P&3TOlL/v׬xq*: \ˌ @xrR-*AuDyy͢GSF . §QY?w)v!۳y+JL.P DN&\nWx4EY0Qki$h4;$4AgƵsdJ:Wك>h[Mx95d=SB eX6蝐3&V~eCI )<#rY-'8@h! `}HO_mtJ#e)W@7ej"M ɤ.ŅO-t 4ۉ]xa[[mύh?{ @Y{ɑ։nid`SvԔKUg9yzW kGV;TՈ3;F_&s+  (nTRu}jm4H^7[?4F-_`j/? uPgRv2l ߛ hc}y+CKܕW^6wZe w3|cliE{Ν a&`*'o+@'8>\H O}ݳ3_F-e^-.C5C˥;iʼnP&kAK[]0ocTl9;z?#S:G+tizMsǘ? 4E7#S(e`"F_Q`)H` m `{#< d R^0qW-A [p#/äHRuIj͆NbI<H!hy:6\O|hS}7L<:JV)IHS>sO b/s.vn+On<'7?t7r̨u;|>[{c`y8ɊVTG C[ (x_g\}C$$W eԱ^$} @vұ|NNx v~q{ƌK} ~r2AP RwC#|5m2k\;%fDʅmB`c`m f5))N^`P玠)VqQ_\ E1 j-B;D,@*<y/qB2Q.GVBI0H.'.LkIFF :AԁMd^툉g?я~ N?}lN)ʆ+ޫgv/~nYϲg;_4wL~4OK> uи20ވe o@Q~+Tb% 77Q{w^)u#8'}ڃiZ6sK8w;7?GcH`E :N'X ncz%yuxƍ׻ WIވW4س_}@p5F1sOaU!c`#Chlht?­(Z,+]^+I4SFUR]uJdX\W=1 WP?N壗rͅ ?u0-N(Z5n7~Fk@2L SQktߴx\ W҇ |H14?yM\C ˫t\o#':綡w@<?cg?sퟍotO9~s}s3I]m]lvmW_B7s8vb:2X;fp 6" 䣧v}_~Ϸ.Lڥx&IMcv[hj?i[%/"zIM-=ED<. s'BtUGDʍnЄ=7䤢728NnW>ˠ2?]'O2839m)0s|!C|^]h__s906L$B$F .Pr aq+캫kf,K<l-ٳudgը @@7aMe]78P_Rߖ)!}A/{ȯ:^MO`ˆUouC_{vwrC^?n&-\1P@WS̜M,K}󝵗|f1V@i7iAmDM5:Nx :ZaWۡ1';z:dSC]Ȥs :+:EHybv_~lw$.w&'T y<P޺%/# v^]d/cБb-A3ᙚ ;X<-t 'u -zV<UʿՅ2n(_; /7zkHRǩ|G"Z`U|?s |ƯY`FbO= \7F5ZbN4˧y-dP2J4oo1LlAeS<661ӿwYqovc<^Q__>c_'YZ13`>BFGf(]6AsC@=³숒W250c>;ݠ]XyKiϾ9 9.և⚘} *7} ּ Ahzb$*`wt|&>)}alm/6mcǧǟ 6q7/"k+\Lؽ[kJsc` &t@>h塐lT!L ⚲Pq ҟI\ 74]slUZ=z :^s Y!xaNtS&TFnX**B4дGq.i!3I?BIW,\WT-l9uz9Q)>U 3H23ܓ80䠙ރ d&!hS:1I6 J -xli wBC#W74$!'0 9ß|;~Wο#6}#p= m ?_𣃽bb~;k7ڈJ%y~q>Dyj#ۮ e0l"a{'+H rwT!P*y?}݀r0* k:8^cU9m!yrPD!p!a˃84Ήvfa'7 t7$s@oS62mo^wүk ښ6z_qx{Yk ߗ邯5}I={A9{{OC)Mw 𶘆ݙF.PAKiVW-yph +M!xWJG.MX^H:nҰm:{I09J~A!u{~ʷe] qt,{G4n>ӓ0]B(}߿f0Bw&!w]Z7݁zizC5rj$:¤Ǘ%)cCqBv8']2?3~Ec[ʟDTǩJVVt\{ˀ7xXY}d7IH)_V%ޚ@}ӕX XvOTCQ~O~ 8<|x+#{%c6w_؃oO>})|%pǁ%w)A%M=h}⬑ZًL9FdSQ2,6JbdaQ YG Ӏ!v{i\G̔ή7 `9MBOU?X7 !u~207 31^#_=&o{-zU6 7,=j{أ 0?Tώ81'=]?`6ڎ&(~I%I4Z7{?#>c7Sպ?_|ݗ.}wk2$%{SRtSWUl.מc$w )H"`Υ7 = Ϭ[O? l/"чoG=/U!hﳜߝ sAic!_IԾ#/2S`w|@QwDž) |#ص~k*[-3HJdT?"҆I9d_|v>J$^#0prf@BZP6iQ1V30]RDF!U_5`Xh[ڈz'&4qgMSa{c:W1? F<J=oQq2's/FEx_;t1I2]yI)nVQ,/{d6 -tq0 e#}B:0Z3؈Sb_g4_C"|1Yu20pI2p-A߼ne9tH@h=F_.mqյ։I0Hx|&({O#?H 9ЛPڊ]W~%/lLdԺ1̀ aٌMh6OQ/BӖP&T"-?ht\q0.Gz؀}%mTd(biYׇb;KPUwӢmcL:tq\]ǣߟ~{m9˦dCTtMd,>sP2άq㤔[$>'eKܕTa;;Mtǵ* +[+q+`%8;z;q;T8.:_?kYZ V8:?o%H/ !Êݮk߆uo74~>oܛ܊^|nwWJՔ N511>TM;sj'n?c#v{&W 0FgJyʳy*wͤCM;;8i5R]6ꏈ`'_CٯwZޅ~15mvy#NluM4Չ/lj:<#E~Տy";'?`o3u€mw;i&lD`$jlz{@nOӴ2-B:J딫F6̜ \r JQ^4=)C|Dsنf  . qNZ G =.KAT7S~kUt#=Yԛ;+i{]5p{) IY㇩ a.Q'tQ5:a$MrQ\Q t#樂K&; y9$bye7+M QQ_5y9w]+ g}璿y߁WK\2u%.˙_iV|wJyMGJ4tU{6 m:il ˰7I껤oɢN@}DC]'Bܓ1p\w`+ˆkVyk mvH}&Qd_ i[־ |pcJX'joBN76w{9$$01H hY?gw?^{']@o~?{jɏL#]P/5]v_:A'%fuL>(!?^ Iѡ+žU)# OzX&N~qj2Weܫ2-Cqҙ뗰,bl;Gv@|#of~{aϦ % 0N$=e ?E/Î0Mb'.{5y)|h8-|8J:ʳ{ɿM?G]˂{#z_^sh2˕0vYjOHR!:ohEG^rRl K '͇#{L2#5$$YW iӃF׌-De׈3лBEg\33^:.ҧ}oYmiz žNHǹ?BmyӖ0nDwfM$]cXќ> tyT 3HSVVꜫ&ۼ&x=#&Fn!Of%; s {`Xu/kFo}4}aYi}%5w]qӐwM #^q̋qkQN`WC>J-<- |{IwP*Py@zm܁CN)~gqu~?ߎFvX ~] +qw7N`eg[puRCSܻ!CbӁnM_qwDVq+?{_PuVROÁ#[LiFs30uډF$"=f"p>ؔLS ٓcSsewF}u!2% dbcTJօ(gĈ3M^dDj{]ȑ[6Oy%yг ^_,IfXjʷd>QKK~[?QfJ.]9UGIUqE_SC!bu$`N}xB0!ua|KWm+4%?8z1]!\WYM.;9N<&Xf).[]~#bG膯; leNxQ- #+>.;Y3g)N|32輸àƾ|P7bѾ,s]6׎͓μGOόv f['=%2XϺO oU. o/Dej~z9#3#`,yLe})t%ۀG8hS Bc4<7%nЉXq㙸A rثځ4ΰM+f7;;w,r)89+sg?cf#5nG<_Wg=Mb7ܹARy,6ןNnUZ]^\Nߑ?^ʢkY=h aVg%'TIp]8y9B9tq20gK.#6<ٓGezfO1 u=%mUx 4m,!j5w\a,i ػW%$bͬ諐*.\wǚK%ņQ|Ǖiْ0ΖD8og* ؎77Fݍ[.aE1%nH*}OHHp h$.YLߛ4V~]OwO~goa?l;+Ή.Ez׿ tW_W`ǹלw ̣c3.B%~*#LxIG@b}A'wD czTa7F],O't;u-gY.=>cEL3ࡣ"WE5UתP lۤ+5yNT'~lw#J02Ƒ;2| #$o7hѧDZ?".ٟvpck'o^a []]՛7/yULxݐb;%P=gP;S̬J|&8itr8 DbԾa Y H2Xܜ,^TQ({,xdͽN{ ?ٻ?t?VgG B>˦s|e>{N^5&[?N(GpP#HuOI@KpӚ6a 2,C/s B!}ވHA`{ m)pަ%t:j#Mt$\<{ ҈FV!i&4zq+ [8dyku#'lYv| 7-H}p(03A,Ym}81m`go6RLn(waGĪ^KW f*p}}gؑU<p/= oS_}xW}o_ֿj(PV"S'?{||:WҵE: NQ p[(6]0Ό.25dM|DyƜq~̹g/v'l|l'ׯv?|Q} ' bW::. @dzϰKoXU,ĽrT%e$ 0juS:gtI7TΧr93l<L ':ld?CB:-3ԕ]w>3 ?{;oM~Ͼ 7}{@ꗿ7n3c 'qti"x5](zw͟4@ {n&!^&:(oXdQ'SH8όMFoEOSeJyǫlw' ogY:=g?sտC~Bo_}z!7/ #Tmy[H+h\X)F\~K[h4t1=l͜q:N )A}M,R{UCI 4ŪNQg>aG g7O9wo(W4N8K?F/3uN~3oYfX'uf(#Qq5j669(KV~|G`Hu4a҈!p6 J4F5LZts`ܞ*Ϋ|16?b _Kz.A_ɥbM[,R~ؓyĨwlGwqەF'dԋ_|w-}j״ᒟ\пq(e@ɞQ]6mԤ\x2D0qOϾ\Vح>:D,+MIWZ`v`/M.Xb]1RJ?1}&jN͟ >^%@ĿewMu]]E6<]݁AOt탓߉k? T*f3/Ǘ,-?:>~bܤa6{/|K7+NXv;^elDXH3aziCL&dBL)I8EPn A3U=dvaIp`$"o4j5wRqWGKJcf/8)}L[@97%q>FBt#K;a9ѧ=Ǔ<]= (2%¿, 0.[m">UCNfDwܑax>9Ytˏ&Q{[+,La2n"$Wn-u!bDU.83ۅKGw-vΟHYe&.e ID玿׏W|/>Gc|y xWTgע&8Kz\.,g7R7u*\o4;ttOgPNoX]Ke`1-MaO1kx$CGO#Q[X#R2h+FD8d_GXɩfv: h&v$0@IDATm6F c(;.0@. BZVhQNƷpQSj&B yݢsr/wA[d@j$ sU#[VQZLsE`ś~$ Hohе@ )UY ؽLL&u9,qZ^ q, %9s%G!YBFk\I[@N/z/gG^6mi`UorOJP]Ă .ѻOK3>_g|n_g:+k~/$O>[|_9^:E}d À%?x'4ă 0ivA$u ;Q>W e oÒj1"JA0R eK2y͍ e;3 ~9Hh''@ 'rJ"9ӈ+OߥZ3=;J%}oj*7/6R~%e}E&#t Kr߃˰@;$;t_MV5>geNjX^ lRi(Z_wyg?Gn_#ľ1'Zk.3ȟ,gQ_,/}\z̙\yVv*N.Ù(!״ ~V.be %@rvޱTΧdCaezOZtIh\RWۅo^Zɋ Zղ/2Wkw}¶ɇMࠍ@k.%A/zun oH*+6A5_7q 9aF+,O@Ģѐmj{4/ d{:Jc}aF};t7ʪ؇uCGVbC &)dԔd8L:u݅/@,a*a" tLJJ?*C>j8>#m1aia*4.rDuQT @6F3?pxYO#O܇AY2nX> /6މA]ҡ 4ݬt o??X U ,(LGS6W~W6ٜI]*0Y1 |/k~Z?ֲp<_M&qe&䕾z_w?zp @Ahm;k@Io6H]'u!D2OڇY Q^EuZeЌǗQp_f8+)SքG#! DZa>.roE\EL⨚.Wb+{`i~kPW̮飲i8$"cOU,0= #aZrTڻ;e}~$6GɈAF`DlFB9kBj`VL?ᨃ+F>]*ǥf}gZV})9wΓAT!O&LG~2Mg`QF0C|g7 C5=`7oH{eFط҃Dc=[/!2b(EQx,"v7l ]ǫΈA+%Nv_ 4e&KT|dtqxH=D>|~GS~<iŚbDy_^S h_kwVVVX똻{t'sx $4.KpOLHWR/Qy‡Q!?#@ +N?Exf |ꏊ3CQ 7Ǟ1ƒ =~VL+c;qoH3g"u5.#?Sv?@HΉxU909󱞗}_g?'{{ˉaw:эW^8޺WUi~kIW/(WE@g ߝ*4l`ڤV!+^j e`I/aeBaZө!e=yI3〻=;զ!DAdm D Uqv7SJI E} ?3bUsmyqdٓ.ѡ*L3x͡L^_-G?zGoT\R@&ctQ9zn,'l$Gj@c'J bͯϦfᖳɵ6)M#Ah1bql!k{&dWM n0.aJWˊCUoUA\1uQ<:(HL)?e.g@8}&Х¥r׳w~D?v,>O+.sۀ&otӯ5B0}s6{~*JJS!,%I+AۺT4qmϢ/<(]+mQ  W FB E/b:"a]&~ʄ[{P5$؏XYw|?O@2d|C;=aIo[ad<27@?j[/-J;~WؒS/Oɢ0б:Ѣ>y:\u.H?, ]$#$-U39rʚA?x-AIr"XfZL֐b e&~jg'zMXgO;$fs<_zQF|Bܰ.y` TxAAb9/"7D"-sV2դ(cɰi2dS[\`_: D k'M8'3AFU2(N@R÷,j4EP:LEh=)P +S)6`7JD_(;bx Js(ϴx|AFzf{fjի nJVVҸ"д?؆}Q|BJD^p?QlmfDɸumb ܐ5MAf<|fY d?Q؜;O{jN_~9Wpgfقq__?Ѐg|~*o'ӈ3Ҏκ0[" s}6Y4 Gjٕ/+b'>\&6X=;=2+ʆH%EPY3ZǠ-h(?h.6(> LpmLFaD tL)C* jك`RWP\y<ూ1+xM|9w>7 o\H@ :W鐟?s|>,.b(5eD??3~v+>חzk%n{I 6w3Q M^ )SKD rP TڳAb]c.Թ8sCVEi'&mI(^ XvaJIP? i[3&2|[E̦M&aIS8N?Ty[3ي  lOBgB:aJCF&>4l& U[OdΊP*?9g\qeݢ8'|d1#yQ (ɉO&G&[.Ҟ-/vpW=ә3GuJ͛G9'G>+{A{u"Z4iajӝUFO4d:_+U#LA74W3n Z lKރ|rɯe[oyȺٸ?wKW( eB1 ]R7:N?|CM><=wQAJ+T׺hߋ/Ojr{} U*휦1ǖMy-ecŇLqO/L*`aƵ<%5 IyO2$vi+l } >v'uEj˙PzCKkh叉7SQo'=H(9Ud\+h`K> +iu&#|D$,`W8Qq %, iWFKف^ 9T;y9 V+˚tFC$7 a%l? %sG~|o[i/|8d NȷEo/h_ue} t ) z.hkʘ# O~ew}:" j_>wWwZEb%GV Q~TP[ʶi+.zWGIH 9pX( 1y_ o5}1p-YU%@%[/d1zQ#]NFC6H)jd}6"W>Is`=P|WۇP(&%YA_{GN?G9?}=n?\Ҧ$.}?sՋ:'8_=y W&$|c$aŽ(E_2@Nn4L88W%Zխ 酀=Q!9 "$c ?g6 ! df%0FD* }awY4 brL0 -s$CdA·~DR|2y]\+rT\Q~Q.:7puwC}j3Bp"#Q 0jypl܃\tCհM*$2gp,Sp~&g~&M(jJ3㕅qR}U/PɂPPީ>3<| cC*jz, -%I+ǒ{,}U:UKFǗ/wܜj"J? b'H*wx^zC#BqFh=A_ A3 %)Ke (l.ykR\pQ:0hFAG@~|#DЋBO|DtDٖi'CJkiwy}B~*3{vIxEdJ],t8}"-GFt)%!|!!RBhx%o! y -{9-d n}H9RHP~auMhs)`9 +jL`ᇭ+IP&@nOR 2vZD8ҔpcX|nPt{7F>@d ߢKvRZ82`rY]] yg^*8j*:= %Ar(N6ikK4E:\#=ul9P&%u+ q@(8\[[6=Ia3U a}.⣊pTСpy''YwPl 8zp@aGE,ؤ5Y~TPMu,sc胏_ߛTgMInk(`@=?^ }Ggk#ڑx O0aُ?\%lBU?y|J|fh<;@8up)7|LAuO> I!@USMu~36QR(xk?⣋{tAD"qA8,A*?4T K+vjRgLV2#03GpQ?h̐=(N -- hZ? Zk15؆nQל&9 ¤Oޘ8TtM0^;`PǖQ[5x[~_?I>\0+jPRr_g{׫}Y]?Hmz[ig.}W_KDAdy}E@C?%AeI엀d,#&xCFf{ 2`+c/6ڸy$!3Vv̋lFeo##ԊR<ҭ1v1Ӡ5.[g^} Zu7+:C8F={ ̞4Oim|M V& CvGٗ\~MgR):ӷ`Dt TU;E\p y @詋~| Xn[-)ǐ`YK?L#^=YӇIgQtSS)n+]SOGX[?v-vB>ŗDU{G)~DȰ.})";e; Z|!F`t4 ExBpp!N{ww?3~ٿgH|𧛺3`R˲Aw%XQZ_ǯoowOsЏg6M$`L0h/aS~uO_I,֩ ۍ񆧺wdM8G`ŷ|. _rruLSݰ7e2E8dÄjDv( Zn$ZYʥ|cU DeʎGˠ͸l6Q :41v S2aJWJzS2&!m/tK:?޽wbw1,MJR!w(z@ &KC7ynM wU,_kɧxM745o *R4$ XRA 4l1REʦv~@vJfC#l3XZʂ*6XxjtqcmloO!B*dc#> GF8nyWoʠ")fnO@'`C?gߒ'pa@Ӏ)x& &6WV@j[H@` eG΄W/Ae@ם hń:m&9w;=g?A?yO罧ՉU_Z@z.j_;u zZbbn g]6:LL *[r+؆.UKt湝ߊE/a&y@]MPB :Xe(LFMt5 S!W]eoܟ@. [㨇L@@7BˀN9 r P2F秈C<7:4Amʣ0 Z !A`s%=0a_xTi8:Ϳc;a$?IJ$WWbL{N4W!wuoCzDF9^7ZA!'6Y]>Կa$'r/EتH}j.G/Ę-T1z@.1п#sv <=+E>I+Rp0UL)&?Ҙ[z9(=mK7ЅЇ-JY;yD4op'{V4 V~Gt zpe1 @v&}؅ء)<8S~,Z/U=c"5lp4cU^^ %mX]Xf浨,f9ڇ=zҴ3ʮ8|o!xĝ#xi7`.eM8/Dp;X`"RL~ձo5!`{zRVC)<LFtiF豈W?z?Aj`dD;)~g3l־: !o.,%+A1&".c~ ؊)F!ןTfc4<>H5Z3,ѷXc+s8AbkņD׾[!3V< o9# :rs WXSpa#2H J+ dtsr r/'OAk0]G2~`kЗqo%6qp؛OyQ׀ehP~B_`>VLg-aOƷS|S$whʿT ctAw|Z  32A!ÏeltBK< ' (ԾЅIǤ aX ~7gZ‘5Bk!E_4[UQFAl*x邏&:C5~" _.K%"gIe UYkCˌp[ :u>KrQ~q(5 L`)%X(nD3UJ!``1E,?y+ħ!~զ/.5~ZV&g_]>}5k0lcy;ܥݓ0~6+[m @(/8輼M>nkmEg:WlX۞L{[i7>Xc_Ij0+2nǝ&!J/AVV=!l&e@l}D) V*+}?s?Yz?jĻSA}M~_g5IМظNiHVB6; 0)=,eZX}gTw~XV'݉׊Ça_Ivo Ge%u@JE`wGԙ<|"{֮bĀ{Ig =ˎN{D1li"I G+/MKP&N݇a&?v3H7 +Kasm];ti ~$`C9iR UD 3tKghPmTIE8ͥa0S`%‼IeዽBZ:G]Vp/w\E+/$ VhBS9Lny/H|#?C#6h”y'[87@]O񄀉qz~qE}٩:$|>O }gk= -;|c:Ѝ4p x*:gm`"<NAXof5Ǯהٶ鉬/Ey?1RN ěN[{Q!j´)Mc";7iOaeM#M4XY7ރZiu"# XAmk~? RN; ޞڬ32S c.ԞCk/~L;a$ߗh`Upd7FГ>Iq%yJbz @'GiA@@˷TCC>w21u%6AK`_6LwG-dfgpS#PEp5l.Qٲ)0F|Daзvdu~wWS~r`O?w{>[.&3NǂHWkz|OǪL8Vɛ%|[WaG|`c9PV'3 D;d]FM *ّũ.i Um 2?4?ON"a؍[bIK,{_ˎ|{7}/uq+eפ U,qf>r0SEcCjxs jn/͞h$cۯeͫ;z50&9!6LRȹ fzZ^'`8+vYWݎ6,5XW}cvw},x.ʑ>cI D'^yZ5Fq)PXQשLT u vFy^#X/)Qq)ݤHsjU }:"+} (ǀجuS&xGP4i*ny]q^d+!)j)}kOPi晷ti&×んAƗ䛕r t7 Ep`%g|BŭW ԍDt)Vu,+XC 6Q3Pφ'~~}>>H_?,E>toyA9?gCg\,3f sjNo]R4Iu0G.UlZꦈ8 wG\= ->=O{:5zIIh7oat_Bx(,VL}yq@Mk{b|Ҽ&keMy𷽎=<4F*O"g=n9"Od=+(?%I-UޢQ]&}RzvY-<&V¾ӴoWGw|n>pNYͽ)'rdl#W$bq5d0ɣOI]a0%=307FW'U[ҢZtDοtr+[.x`=VCf'd'N,b}|ß͒P|K=,pGzϪ&9-y*M4Cӻ>9 _of O9+j qɼw"DN|lq' r1|UUX,BZLe.˙yv)* rO.:}ߎ;Cu7t0ob7:x.i1;}9 ۬lCL`Bڔ!R" #\$;4"QGVUzO#]i%S&ݿH=PlW`W2KSI֒ x)eDЊ,.D0!DD`DsM)"Pfti +~&B5KC\1@ D'ErOMgⷸ VMK6--ۡm~ aEs|+U?lɊ"7,rcVǻ#w?a7!eSxsݓ S=:$gZW<6.m6̪r7)w;xL)K^%@l*-^duFM-{w lrgLgBh<;W/v|o]|V I*"Zz&{H*r,r4aiAg,"0Gf^>X[{-L0= e6:}^"-?.~_{xΟO?4w_.E,IJ!?=k%~6)Ϋ<S63`J0c idBbz- gl0s__ Y0flЃrK2ȗMe,R W0 LJ h{&9{-t 4lP=#ޫo#T6Я@gaВ |d{eg N}$].vf vh|F$@IDATQ;/a5!=W,' w$_'N5>#C@dGP! g 㠞] K(,.4>T tq&UIZC>Z:?Ҕ 8|t]ᩄ!⬙g2쐳k&]<.RiL/_By}Q]gW9C7r_*uHȠ՛OEcy @$d8t RQkRd}W)% ّSrӀ %"ui:Ÿ-)aAG Z@@bq _"de}wpdwv`;&ҽwW6j~~O9_/7.-_~iRsoo#H⼷§H*p8ۭi<&6C'ZeͫKpr ߾*na AK~ Z!V<;/J9,RK"OǥI>ϬSlb{.4|'S'7t}c?Rh̢ zpm^`|;lx$yE`MoC=coȞ+%c>#LɸߗվO[}$ yd(y@?~{X)찒7rvb~{+]p.sim-3'*U8O 1Ԅą"dBb~럼 [Ȣ㐉.M) TʜNTN55]P+It@sS[2R*wx2QJ`. `]Zo ]1 #eP&"_r6+H!Ek'&^*J?rf%exJ~-лN]!:|wX?{r<~[;nU6]鍒K6rKZx}acd\%$0$a|\)>ndTA.b&27c|0# VK|@ VngRUď\ed"iR; ?~Gf`"B! Bf*)ܜ _eIM2Oð8SV(0G[m;uuҭe aO㻎 1!!(&L;%8Ni},v7oyAKF2p mJpN[.8;i xB2;'ʏ]CM/*1 9;JGDZd_ițԑ_1%8f6G)x: o5`!YgobOZ&Qn(eaqW\ CG[LDos@a!ʻ}}(w :t?իA=B uβoAd?,_~7]=/_yU˜)I9- b0wIMKk-`|C*2a 酴a BurAN}i[e -cӀ/yAZo96%/ȸ o7'Ƒ3Q ` tW> guD{6^@Vxh+,9dgTB$=TwDL p@ZHD8KWq;ix~J\mYрV,c|mBrezY'K Yf?W>=sϟ|}'r[Ցݹ᳒&?Ї+B4:? >t['aRy÷HI'iE6HهOnzb4%MÄ'N|~+ƈts,3X+,_#ȗ:l[>Xy,|Z6ߟQl;S)ìKu לכ8¯}or_<2 $ 5[vrHTMo%joݱ->|>b!2TY"fN<8|dh2v+ӟzl>&1e$Q^nxlS>զ;Or6 ss,Ȕ^Eվ͠o;X؜鴐_X&xKޑ6hitbw|\25#CpcC= oAc.>~AFw7Dm}~:|H0 :7AEiU1l\_<;|#i!LO,<5㥁sֱzjvǎ!A3 b|gww]n]CuٳуVa!rBXvE'NxO'!+k%M;pghf?g\Q(4 >i~;9:!NJ'D^i5}qz9W[$H5aʺ̴@@?̬'2beY0! ႬI{ar|+ѧY34+^EWm:p3oBC]F<'?B9v*2DAQxk2"nC%b0)-OY6?Nl&::B_+KT}r%}07aeNHB1DS}c~x[| G0țjh!V{hKH3DG\Ct~zG:=Ywan;g{G [>p)w`/9FAuqK1V\z_E j>28R`wF2 @Ė /b5[v0JMQ7Z=V_Ф81q@E?{ }BQ+Nfv0C>#6<2jWRn-y-LP̀>zӥPHiFI\TYRPKR =ArWJ^$ r/ibūӧ-џrdzʏ-$Õ̓$~L(V@x71EBr+hAhJb0ɬ`Yz (}]]oMnxU>SQ1PEj:2Keg_qɯiC=GK ?y_5!o;Hs8goҾkٗIO=QOq/&Gb3n0̺(⚡Z8dՁBar͸h!dr k~A` 6 MlPZk"EYL/9D@pQ& V~5)@)A0)?,u|wy/{%'<άl-lJ!/U~Zx_9DSʡ }c~Fx!+' MUN~Җ森Y,E r;.[Gn *o4GzC`2τ]v@4BLzPTfR6wt-¹/yZ:yM\.՗u@3z -K%!wC ?jW \LVOyry #s=+VTƱgg׮|ِf(I8aVCShlB4^gГj\,z3ㆦi͠)"clC;3werr,$]ҹWC<-Xя^v1aOj"gzj{u篝Dc_?g}?ҵO *28 f2N;ۃxsǡx]kO^8.Wlb|Ap3 Lhb6px->$~W 0 8.13O, Z1vP׭f)`T 8ʟl_yodJ/ voPSª6^Xa M=Kl̍ qncD;i6;;?1q#Saqe(Y+O5Db4ꯚZ+w48ցI`s8 Xg gC\wy.+ut#m;Hjk 6bwqe2*Шx8VeN -a[JmCt ]|Ly4>HDKQHlpB?`-C' /m§g|;yί#}Y]/+%CwU?{xZ\K$e%@j"%''Ag&겍,ħچ'x t)f.֦ǠO Fv!Ӂۂ+5QF?m\I+z2UBtmo$li(#iR.xQO$siN zũ7=Ah[`&[ئIZ&OaOeALWvs癰XoL3P6/,{+9{?~n?|?&L fΫ](սo|>Pa7 f(4 nA4VphI 2q  `M0]m Zظ4DDᙞ|KoG h qdD}m#(6 /<ce W1@tPѕMof]Nhf 6Չȱ/͊Hb܈Ĭ+U~:y#Fd Ie:䇰C@87)(!*SubbcdG|,+|}:?deƤ3pع:4J2.G&@[>!w -JU[L|~MJV4 i# RPx噿3h0Q91Bm,DA#@В'.5Rr G?G'hIJʋ~poDI-i"/zۥl'x[e>?4 :ڡf ڈLg=1x:$놉> ]ڲԒ }v<{s2E`yOϒiIh>#>'?|I@e"Pu$`_Yg_玟y}!Jɫ }2.E^$92Do,o2p+=IJaS/~ xh|nK%<8F] /lu=YΫm$69q4 P ;0@54=0S/18H:I#ɯ9!Vt$N` l~4-OWTUʰ,IB 'VtOիEj"/Wx?H"&"؆X&葇 WKZ4>ФCZA+4ws֏0eh?H\v_FClz&Ojy%sJ@&.`ijR`p{˕j 7C6_Vܸo%Bb~v5(Rw, b8z#=3!@'': HBWNK>ө&z' )䤫QOʇm>y0I-ȱzfςI,h0.4z#ʎ</v8BW`"pFaxY(xh1Dc|B1"Qe#-^;^>3{l믇}*i|?9/}6A{Σxʟ,'Jc0t^^1 ӆ%:k^8u^S|0m˛h% 8tI>Z-S{X-tLp:MR&$hsgޔ[$mZxyrP_F:?䩍)hd˷W'N;*,Ru|0#e2AY-O>D`=+ŪR DO;)gUZM'{ IJvuur#u1M/F3ML?A9oRWNuIa&=<n`/׎<%aVqN`d[ 8A/S^>P >}גɛ;̉}Dú *:C\~'$&^ H|wOGy Dp4VfR~a70h`mZW"D~<)Gާ #Iq5ísPBG})1 Ra̙&듉,%8|oM&ǷFSVGF!]bߑVԠ49쬟t~_ג:ou|ӑ*7wp)?D3D kf#ۙMUcǶ4e=@a<:p'Ok^HVNW{JZuOCLJF۴#':CF~WEg9iCJݝ&y @/T¦jPti/BHC&3xX.;(QkX4wkvyڳ^J4* # %NRKs]y(GppvXGb2*v1 JHu`  E}6p+ĉ^)P'xCy/nP؄C_ՀR Rn[uwƤkO;9O}篺t<3$:c'{:tdDL?l}x7ϩa]I3a/2Nqcte%yUVT3v{ES Ef˯$p^#*6 7-o|~q B#>‰6opgAOPцVnK<6LSvmW(dS*&Jy[meNsidc؃1qM͏ ӂ#IJM;vIy|'H;)m5IlآtC9֗"*|St~<]&/?2M8Z<P;|J OBuHԜxW@? p)_] K8A~n%Zx&liCքm]!yE_Hܮ8S<Q#;xDԃiuqg1A,܌c0@f KyT.1#{ -3&fwt^{ >hg/8W+G5SR;tD &G$aWhOfIwݗq~ Nu4'kڞA54mH$jgGD&o"K@7 t\zYEN!ׇcJ +,Rfp/s҆$O:y&_{7P۠K@tnwrk5Ik7@kN4wd{|CD;1h- ?rwPˍ Bz4dzg|*p (\s,B~@<:`*3Y>tTGmrW.ԉrbZIxho#m/;{g+rN67cFo;s|d}&Lxwׇ+_id௳{'[>z7QAˤa`; 8EJH\ܥO痕uֈ`u7270w}fIL"Ƅނ0?J]Cʲ݁< YZ]|/ :^qCȲ mȖiCoax? YK__*AnM V%̡ΘFi3w%f8ׯ ɐ1-Sx+fnKўz8۝@pyswtV#{DG? b#7bFG3DwϴRAQvZɻE.ng y]K|Y(q N'p92FLR@V8ǍA]}=-DoW [&_ B=] 5BWH@ NIvGӦBGn,+/ QD2Hv"KHcZ-bPA<_S,#?GL8k?E:cg{4}觼ܽߢ_FHkSwsk_{>ɒN5?ՖS q 2/mJ$eK(٫7iR~t^\Igei/:/Q7ʍf6$ܒ9a6׹.UрQ:=S5E\̒EZ%0gHq(s*dkU^{XPrʯhQZۗbs/IԛHJ]T1AR !pd˳[ C (ۆ&)G4^Gia\c:d#gY_|Ӳ㟸,*t\fy7=w|]gϘD)oBl(tW"eK3>nd+<8%(e bTܦ%C$&SȦ\gEF)N(:R(F1Z2VxGa=W/ٲӗgKDGpH`xf{;Fa ijm .4a9r5z&#b Ce=$@V{-pJ7a EkNK@6X*q?{bm7k`@ }c<=w>x__pn)ͭu2[EZg.F?iM]X޻,6& t9e2g0/8fiɖư쉯w'<{c!e _"/0.qFǥ;PGyӠESH%rHĂ[ YV %e;)ӥ-H`n1< IJ>σݤ y#-bZ޼Fxyqj`_黻-3=ǤʨŞTy2:j[` 1|}Frw*߮ײCm\D2>G=z'_קu/e~!>9cU: (d>~[x)L[:Sgs$~32ȌoY1}ZL* +2! EDgytÙ.$nsp3nro aDj@xHs2c?г $S{`&by',*H>]w[;ζ| [Xk̤lq~Onu!a *62 ߷O%!4%ćv7П]ޱiV FZ#|4jdbyhvq3c+"vw5-_7n|B&"j3崥=6_7ۭ83Kf:J|A8T{}q/F/ׯi~7ݣX@¤] 6ـOF:런U>ؕO@ݪDJ?a0w ќIx(a6q%4;֖Pծ;rtq´o7! }^ZN~ 7X:D%( 4x5FaI$s5}=eQKxMwOD% A5E9=hH{x$T =V.nVzWxqٿI<{w/ws=i6h8 UΫ0gz,Dd?o4n!/l)ʁ b KȵlIW&s /%}L@$>3eS>f(@qC,S)/5p87Syȍ5 AK9e,_g>as- ZU5R&lp?pf0^1:A^GS-VR%Ю JBI||WE4XB3BBsj_blS : ?br\(vu{Ǐb~Hdi6RmK]e3vXSF6y/3A{Q {fTZrhmtRT9.y6B^0I C%!*i~ToXvqFC˘K`HS\7#TJn9 #^g0eX@`T:ȱf5 #2 =2mqOR@_;K}OO+|kz_~ye^~__~VzRμi [7 F~o->K15 a>姜nElH;ʊ6l4KFyk!X`>dT]-{ٳ*N8 ZvSGP^~EP~v()[K`z1w3TԑbW > ~?sxU_l^_pkpջI0k? SJa~ޖAD'jUAQ`őK܍HhikӨX\~_yƒaaIlOTM;y4R"g~z+8>޼s|9ErG dArKԏxu-4?`IfBU҉'ayhtәSçHHȐZU`6KF`FY#;~fū?Ef e v,Ӳr86G 8GGM~&?g?>llq %`/oޫw_&rd⻤qJ|A7U5Y̯ x?u9q%(pkd6| !(hU^gejwȋ |h{Yk^?\=_T b:Q:*ްi6'4A?Ox !  tГ1j҆ûA qA60h避% }/ޟaٳ>n|߸:5+}a&G; .B_ˬaϭވIԇ՛Rgp>?SȦ}8wZ/i_ӵqаBV-<-?x^qxܩGylQO USjx,C0%SZ^ÕqMwK ve2۾#(aX XzG=C`z*ùިTGiVlwX[`Ӏ ʊP "zê:%vA ֬EӰu٥Si O?ﲻ0Qi• &12סY5>7 mBm~NJ%6&y3tWkh/N!p*SkxQy2No?w",2F% pO]~NsxNN&?~Yf}X&s{apqZ[FSSdA"WLkC7$H'@GOZ ؄f6ވh%aEΥ.Sǐ؁A>EF>a c` MD4bw$&N2i!#?&{яݓſ tʞȥ_$}G:jU`^wͶNb@CTA8#=c&/ [Ғ'g~[ ^=:/_\se5W|o"M%Ĥ0P5si!IדF%X8j N#oVYقLVd0%|7nH_ c0n(KJL1z{)) %pK%D[ +1Nf'8J,;?5M`j=áWlS`P4V87}y_y_;\;a3 O05Ȉ0ҡVhyvV7z~e'E3+JCTm-CY mfΪRkf $y_gĢN[+Vio ve eyL[!1x:~ m"C:H8M¤Qg 9$|9P,od, _:ȯ*#I 1д>#A Nx#,vWZqm_;RWuuBI9}.9#jxF%. @sddX )kTNJM;qL({6|WLۋ 7nީS'r7\ŴlaW2f:aoD#J?ypߒ*gZ`iBT~XVHH0R@J@jN#Y?#0 Ϝ⳽s\,#.tPt[:Kyϖ / [ !]:xOZӥӦe+e!83$ 3`mg3ٓ)Ԅi'&1a@/uU9=a^fYm-zn$.b-M{X\ˊ%98qHE27&$)y/k n BЃ)䀻VHF G" d//}sV`LVgכK/~fB W ]9Gt#1?8{c'g::/ :kGuQggrf?\XGaExʗu2E7\{QDTW&Ԍnt h(O C=t 8˗~NJ˄DˌT5ÂxT2B2 E" ycI.VG~8g{Ǽ~>{`>|}UAm,ԧgO|ek M͝վ)輸>9Ns&Ͽofk.:#Ah 8pOkmd_4~ jWjo7gm ir Y]'[L )mz>M,a.4_U Rxkk-ndƐikoi|}6yL6, Di&pwy :t6Ppuk7fGr["lhC8M b6?ߏ%.x o\WLJ~߲G)w, OXUQ{L(v#dcό-H8cR$L]꣆tR>yS^_Q@^., 3"%iQ̬ ,?hcG*3 R™:|\ZښU1˖\quYw^c,ҧ3x!{'O<{@OG] 3~_]#_/a|#+rKw;߿ }߱93z/T 4ҤB6ْMwᶜYkt猆8ʱ Gx)1ka8 *rٙXxx(o8D`,<;&Uҽ%J:,#o ZOA輓h'2͏im;:GL{g$28vIOjzc+~R6$!aKNsıaQ>X?cKǏekڳ-lkys2Ul oJHrhqapäI4ÌT[|]$M̲ 8W/F˯%OvKgݴ3Eo=̊令+mۆ5?LcxT|GHNՍ`HO+b=t9\JmƧ2ËB:by+if4-%D8Pʨx;ڳ*.WD.Ƶ@T MJo kp00Ѿ5qZt\gq3g`?ْ|; y5xk{ Heen>*wF"3@H$ h*fn1 1yZ@s32'l6_Ӷ}yAKz̕J g|$g 'UJ9\'WS(Q*\W[agcOȧ Gk?{wϞ nf(]x cυT Z;\|~Z:WϩAKVp6\o]Qisݼ732Q%^ [͓qH`=o*5< k^?(́w!۳\M\QX㥬>Dw05uۺ >lI#B=(;_W?,+4?7b԰ٿɚZB)#|o,Ky7pg]&4nUW_2I|d R^pYMyr<{/_1 3foV?i`n,xZ}C~ȽZwǛ'~ʷHfFGxh7~ɑ2-kfd\MHR0 /Z2Pj/:t:( ƪE(wv[oͦ| 6u$Ú.22dѝ|Aww^ԇ6I]k5RD_[}R\4L> i(ZՏJ\+VY$ Pt0bH0bב3b/M8ִK,qM oZѻhV-I ͒*p#l;Kk+j1looUe4d}['D0E+ ~* wԠ;3t)Sg%)Sp~/4¢ɷV'F|5XxC{ ^ .jҤoUmG[e~_7 cq>xw;9W h{DQ|ce_2uJ gUrAAhC>$AoWwPW=?34ܥq*nIC/r{/[/i Ϥ}HzȳH]6a|ZDw L/zT3cÂ}9I([;%M[͚F/1q٠ŒG(1%<ܜj] p GPucVtiCy  ::^Tqi/C#/Ԡq{ Kt8aG7J-z+GĠ`ڌDXL1W2B lgŘ7\ w%4U?g{=G_{oEVd=.x;g/k} tC~t,>tnmuL}TgIӿ y_|{ eqvsY~0f3YR{' )ki^A:R(QUTe{=ZJ:1K΃$fi46hWT:CJ~L<3o~_r W8dO[nY;|y߳deBIx,' #q)R'z\qUC:Y g߃rGP.ݫgaZ}r%Vq+8&Ӕ5h:SFu]4 A]a]ʨOIkqCA&S/ɲRb{g3o4_?rzx]1\Xӕro.=FH)ǻ],ɉ{? }** I# ivP?jk_Jk6u9awP13=U/4moo6?ASk בmhǞS&4?~'W0igXvm [s1w|58p5>C7#ăh G9i 8%4mgrp w~rrWt8*L3?66)J]VU'[Wo;Lx8+O|}9/$]s״ A Ä>Weޅ^)eH>TQ#+$dȉcŠ[*F!;Og?kz3v~q/({BiMMw$z_5W}ɸz94, 8h$unCsDE a3qƋ2e_4cɰwC ?D:],ֿ+ŢC aY]L tuP!H<( ۗKt@):ѽGP/ߘp : UAW0ДOy' "WQzg8񦅍liެZod]< u$)hF9D/d’L(z7 (X +^K Ƈ2"3{@Uf9tt+^Y2 x!V&闷&9yl}Ŝ 82N-~TGDV j`GQ2v{1Q^ɵ\x+̩BV5dl'; zOEVFF h:)Vc3%Ӡf yuxQ(u UFX4Y6ϡmV{ Ҹ 8c%"3ɦ?Џ| %St$52')̛S[9yp:3zH:r5S+ 0};l [{dyV__w7`+.{0~'5ծ֭ho]įC| =ٸ )n{~{gCmuʫ=l>Wl]4¼ξ5׻W^SQɷ+][+}G!t/CCiY)?EQNȸ=cH;mǎP49tmIf\iѵoo.N냘2+Rgɞ$QlK nvX+A A᪟: *(yf摎c֫r({ gZѡ=}*A}eo1 0uutiXC3 cR)]D j8el`Cn |LOA.ɲ D4:2>}\I|`9PpľR?r0wM80ʮXaoe?3*5lOuUO~"̼51=)x3=y|i3\o]YHt㖖1.3=Z w[qF^R~zƯgx%et:; Zdd:82-_E(ʝ?Wڊ>iW (HFބRjL=R-[ ^<ˈAeʎz +!vOR>U%-E^~p;DE57MwN$aJ.ހg{3lV 0F ''H߁?#ex2C,*n2W,y 36]#,bq͙UA{2'vX/*c6]6 X?Ai0yXa C2vCAg,Abf@|϶e4(.3?cyɿ] p|Yn4\sgjF;s>=g+'00p;`` ˠ.~b+d.IȡwU];e3&&6"0@5 Ʀ>haa۽Hf@8ϪYM]^vk;!oNAS^C)31-->!EN-~|.+ҏ}lV>`+ U4wٲFFtȏʗ`LqoAs^&H[|~.ިsHNAgwFKZOu0iK+N%RI]N l I"΃`9ЇWpEJ"@ itҽY$18}WI{_&*N~0bpڃ^2lAqғO]( GvzVNܳ >[®5d'yaW{} 쬕D;;PCbJ؃3)v7OKN4626K]t ˤ' gh &玢w– PJ*.al8֋[~Q0Ci.*+dmBa[<[ě6ܦyꞿWrhyn: %_?Z0~ ݊9òTg-ЦI5ڛjÒokcM09z%NA2,, ?7/ -7 h/n~!.;nY5A>02mb_W&87OKƊe2=J@:TKGd[F#gVZ0mӴm9OhbqZt):;ƭ/XG;ii;@ݚ}Wj/b_Ӱ\iU]WQK75W쇙XVq&j:bEFӍNUA#VFNׯ<_F88B>˩+^R+ '@\qOG쪒^i `khۈ2IҬ[ w Jm<~u[Uބݷ|kx0p1mYbZp3iG\'#> }RO;@7rDNs8~A.aH _U * ,m:Bm& ,L曂h#}~ [V7W//MY{HCI:-6ȪTQwCjksn!`,H\Q+}D" d)j_۱r^Soatꀊ1(8K^OU!\w}ȏݐ &@`Wt4,udh2t`7cj?S=%;~eT|˃у- Af5)[ngz<>MTpÙ,)+bߞ~`4~a43{ۺj}+pFU~[Νv`ρF`SgdqR,D-LC0@!k ^OrL0j0Z7[~i:/޲!Iyddj"mb?>FԻHk4tMFzgͯ\-_AkbmnH MqB!z99{M!Iϩl"g-Nq;_{ɹ]~d3M37=VeT;="^jzt<3{>:pYv9a[ |-W)J.v㛽̈́b7ZKoiܖQb|5Bx=<[Wo;ȷ `^`ڗyL#θ?3`) B$\Ieؙ=!#V#>^Tώ1=iptsOr@P8L<6NIqY%ӷ3%F@ypF8c d2'37@={0)#4\qXJ˄\rnpgvsz[ 5fBWl=M ]X" f<*&z%v'_3̱AC;\m Th,ZLcXs&᷵U!߱Ixi֑t{s9Tw-P쨴&u6 aqt:{[L L^.%"vw֍uOM0[G3}!zoy;hֿ_GcϾq ;.^_] ޯ8r?W;+ ʶecڞ:Vg{gHCVp뭬T>=& =6GAy4I#}t~GNOA:D";4]u)@K9WyoH/?nl/>:9C`ɲ\!Hj !Ӵwy:45վЄ8캇 a'8}msZSO2:iQ*AA]Zr-Gq6g#!DxҾR9u|jc/(hi[,Bj4 <(*^C .&nDfZOLҥc@ ƉCOO?.y5tCVɏƶ&pqI ڡc@\~=8O3o Ojs~N餳MDye;|yNˁ ~yP}P'YƊ+iן6~ˁ`9h!K&'j#2M 3OtYTbWƑ^{'a6e;/ʠeq/CNIVlVIg9)ziR4J,0,oI_Rq*m)Wq:OV8:!k2hu}aL[̀`EO1TaIդf3Gbsk2puC@n8rՍW^[.]~8`"ꯇzt>)[a e:yP9/n ,䐨1[kJK7&W$^$'twh}bŒTbEz?yJ< ߈0G#NـVx1 ނeΕFܭjuE͓ %88_x.y_ }]ʙFr;[/Kg6r:CuK7Ү[ Ftΰ"o}JcUt=WL/,J?;Zު?iHûB~D>FKp)k|۬vSf Ҡet$hֶ;;;>쬮ui7 1tl}%F7aQ ?:X d.:xHt~`$ Igr6Q+T4Jҷ5 ? $Zq/]Dt',Qvt3;3ęԫ'YÁZ{se&t&Mⶱn ~)hgtg4EOdZQu*aFC靶~j+2/Sx["D4>kh? Qufj_Q$Yh{)G<~gDM?ll=QKj{hp8F|LjRbţ *񍛂S{gr<#Ic2og,K:} ='WTa-O݌RG KLep8LؚfC3;9򜽟FTD\[g%Utna#:5?:X  HQ*c.NJ(OeTaFˡ"`7["'TX-JazucSu|h;fLcCwۻ:(#ṇs:ba!@7^V F [p>zO{n>$d;?hNh,yY@K;x <z[IP_b"?l+O3.1rPACLP/)k+;Cc?"8rii'Eʘr\&Fd%$o# C:qGw a%p~ (a GWxZԃΏ5=IYV AvK9#f*1FW*ʫX^U7ߧOåj7hg?n^r5ʌLQ:0InWwO C:zePfq,Q/v g~}V)`<`:VwV'L&7&kh/D[ lG^yh0꥝? %~pAM 1Lx/Yv?$ˮA9 \0 @ '#4*la,xo! DW`{Oڹ~&`JZ}Hdp{ ^Fd-Jh+y^M/q~B1 5Pl=W" 6ˏ+, wKKxGFΔ6 B53 jUgx^t!o"ڞOhAI/ -J+Qkk^ 55y1I%B0-H[~!ړ9%Iuٰl{Fd[ FeD01I|@l]]8|.ZB\apND\0Xk41QHd=tBqH"1^͵t|U -?xmd#Èro<떛ّgZVHӪm+ɒhX P9 dFN$ltz*<.\<;U@o;[۔z?BSg3H٪/m栟ࠟwUdϟKA&$Bma`{Ǘ^+|LcKT3-\CIpȟZയ?i;[C-QY3vR{ ~!]Jߑ64xXA/{!i~ 333a°V 2\ꍇ]F?MxggSxo[wq ΆA ekIr0*<ôCEer^3[ۏ/txwedFx8_z;0+Yx!J)71"暃_4ƎܸHAmOW QJ00PZFU_;|=ݲ[$2*˒/̟25unJK&liL.4 e A/^/n{\iWt H|㯇Πx$lcݲ[J;S>xdʏo;}@:MtN7 vgK^8j,LJ쇡pճQ:(.9,3bšw)Q4V^#/rxLT K޳ \qΆ ~C % - ËgJ P,;+QZ(_+d o eEwZ0ISM^$"jg8 .<=y ei% NIZ0JL{~G>Cg\4kr`@ 2s@@_+៽0[Mtt >/]~jAo#Sǀ3ZC{M|^ x{Uȣ~3x HQL#<^iLDfbcovF{W&gGNf ~޳Si‘e3&—/{{*rr-goDg[db`?]m_[2(`Fa'=+|A;ySR߇3&!Q9HZឯNrFǶ .w&Qf:\<,QP{A4+ë ?O}Zm+af|-%q?Β$ :z񌷎.?Wk? V,Is%HX$HT1ο+"Xڭ42tqih^r(>z[ب/a|F:(L* &bWc,Ówj@F:m4RIS R_c"i†<)o~Hi;凵XF'6pƷuO.xRT |]̈́22<Ȫi:Hx֤}!COm3s@p7ʐm]Ұ$L8xܢڡD_h ҂]2zLspwsA[orSV,l9Ĕd­IN9`p)g4 PsQz3ZGhS@ӟ؄sP"EA9(gt  C25[lR^8@&Պ.On7a*׺` )9q!^s:(>jD(v,e@FxϥXpgJ&fQ}?`e;A>5-@L1)E#:f j$̺jL"5YCLCxI'J^ *:|:Tn((Z?qm|3+y[hq7(!̓ ҝ6 }&~<:SȮ%ٵK82a"c]1V̐k:(Ta+w4*)*ůhvziKs!f!j*!rVt`m}t"xىx:vr9ЬwhoMBXipbqjlOs~Ji r'/ 8yLϷv<?6fʍmb9_`gt|N'M Тqc$ |W6N8pu{5: ,#g O=ɶ̕f`Z]RщvY1\:q(G-iM~5[<o!wg yAb;4-9ɧ4 P$wOvGǟ|z?rߟsC"?P(d)g 5жNكg] P*(9&!m? r+>c7,E@uIHanF5?k$V˨Y56qCPJr#E7B44=÷ŸҬ _ʁjccvƒoF׫M' &cA}${MKCaa /4^s-p q#t{̼ TUFAOTjwjF2d ߠ+l=ObDڛq 3ڵOđ`abەrwyB,Ps9[5Iz*+p|HJH]eb/A\:|%kV!ϵp^?koPV-B઀HPUrH,KMv S`,7cсԙ18(zkvO}ge߂vJ|-Rayӈ^otf-ӿغ49` ~~eAQz6 ^~W~< G.׃O~֘wQ?^ t[ǥSV䇍yX3MtD=qS"z%9}Ga<yLꐄ)V?֙9SġcEւȾP5l%2\B$ՎU\x+,!.vBsI[پ?38 h& b[,v$&L ;Jr:%14fml(XvWd2aا4BRaH$kAlmps֕SL*853te+˘ 6 :K/ԸsfC |>[6yJgS=QFiXzi;l2u5= fAbVIj(,5'x9CO.pҹ":O0Uid1# y'h '1J̻e&]!Sɋ8g6()[#2篒AgAv}Mtd%R8mb%xt*P΅A+vU)v1zjc.}3:3nA2:.œgl!x1f{ Lv@$Xf&?yp >u6)s2ES7w5Gn[9U\u0\:>4AD% J(jě|+WPf M<倌w3 3p2'*,ۨ't?o7uc]qo:/KC폫Whqo_-Pl$J1Em)ܻAD:g@6tzރd^VMѧ!6U -.dBp㨬z|@|!z߻,g]Q)lJ1)nrʳYaRO̓ Kw+?**2fN#MIy$7 ݪ!=5MWқti9ëÎ 7}w xy M~öN˟z3/ ^zkx.H[h=xM78ekTz5 aUWiړ.6O?:itW;n.SkmMDP*[X0W -3x? ڼ R Ct>4$M7.`ΓvdLf71q’;)ȢEf :1 h8c0`I0xZ{/C WTCMw"Y;Bwx#-Us4gKWd޾p]2[xltۗ4s[嚓^u*˯ ?<`غ8&]P#ƸV-;Sp$XڰojLqFڽu*ĜX13dy`/i=W~E pB' GaT`'K^ЈyI'|0`Q(6Y꟏Ry`@ܦqҌ43~{rkS+ݢ[ҝπ\I}kHo+K-dyXh4٨ՑM~J +L B3~Xqf`Iث1O%FnPw]=lx;ኛBf 򢕐|v6J󝟷Z Fgp3ވ AEzD%I21rj`bt]hDO`O8Ҳn_ҡC&x"?[tV2F":?{n1&+SCaɊ o$зM6H4_xd|5 f??"o荄g6CM2qHpH4MA+Y:&a'`G*E-g# 49UHcv}N1t؆ ,8/(8:y9fiө}]983ܚ=R &Vҭn/:@`hid=H퍱5z-zn?~i2m)_*oOց8)?k.q=] FvFYS}'4ĭGE~Y0 %Oî%Q9(d.iJ|иu,ܦ({V}/: xgn%<7?FK:#^;//?woҦ9dzSvfM*sF ITj22cHwCՂG60AF4MTt^:wŻP*TBϦ]EHSTƞ&2)K3_su@\/5kOk CC1 VY;9 &lR\hW~w6X ͭ^^g+'@ދM֤bVsW#Y c eH OĻfR Da>Iy:t ;=7ս~w:yl=kq}:͜52aא%WYc6. 57&mbt;%"1VׂX[S8/# ^c{ }u6ħ@1Pr[+2+J:%S^2 Q"~|p>CyԘ'Pİίr~;|>𒦛wzW3OǼ܉F=W][KP\YXC-][`(8,b-dw+[|viXZ[2ۘJ[#$PMKLBLi乡?sKF?NY":I!+c6#< ŨFQ.#bm@i~ :*/',cHN`^nc}_€c,1W! ?#<)#/2bkGLē>O4쪖Gb듛 x'da&@*cxG^dӒ~6z?>[eer=VIL}ΓɘhFg.>USU[ʟ"{tkM}HyWkb­s?o .y#n?~dq~+D pvpC7 ȜcM39iyDCY,\j\=S&ܚ\\O6~@qpx ֦ q,r*j/1+>~i$_D$j9j2}i/ U tԈvB: u`=M)U܏ŮsVKgM_ "I)dU%p5PQYML8J]3j! #YBľ#]p079̥WU`=ګEUu(̟ i ,^A6̓&cwOӵLQ-jPvG~zd͕%龦ۗ7^ݙN@j,-[-cx,18=Yx9OSW\yL)~nV 2 ۱;/\yRб$}]3.T<L̉DW _b>2@ ol^5",*#oP6ZϒQhmKOL6y)pGL[~A7p$n`%%G: wedzrEH,6iw6'~Vfy;]&o|+W$_`~ް-= [}T$YM]~'Knb<;q|+,}Ir I Џ -:j rՖE̕ +nQL0gkd"ʩ>W~_̬iNZ>N~ ^sx_<:ǒ8WX.7vفph Ԟ*l8m_ϩXNĜurF=oZԘIq +zZ&?krkPPؠMgtw%WHquR!yFs8) cs$YҦCd ufTPz"$x[}K@/G#AlvT4n^QĊޫwd W W~ywFcKUrV+%MͺD}|)O`O*8('RznIkG:-{ӟ`NS՗ vb74A#cgF\*fQ *f |`ąʥ_WM<\jWDk6h 9#\bըvsyXb @>'+Ү42R,x't8 C[\b~:%$!4[Q= +* PW)z'n#0(P]@h;ƅ^t9("Qe_@ݣ<1 TX1ya)%,ڰNP|gp QV?O(V[ֆËx7?ޓi ݂[d o;h8c'h*Cy \|o Wrcu}_ '= 5q K_Yi3 :di=zh=ۓD*EV)'O[ie1J~{TyrXJpMq=<1Q'ANL"qS x:2Xru瘍R n<'/}2&6? Ǟ  ?Q!ĖCX `~CfLqԗ*3XJBK*R7( '*XJАMv@لY*v~J'q08'?g:',H OᏼGOmz*CaO8 f%'-~2 ŵW}AWww/as 'u(]Yo*D/n{Ml y(͉*<z̰ NfWĬqů{޵ MG*_+P&"yA:[yT-$9@oF$|}RZ ]C$ e>W >h A|u -9܃W'A@-TbsIA*NiՇ 2I%/@l,[ae_1WBI,+ͫѠ |jG?|ůG}H+n C+5l*p\%12pn}ծk|3VFU,rqe.h%\4MɤG a  4(V̫U Ŷvd4?&Y_#XS.R}T;FO0V_: 7p8ѶppgrGv5 c7WbNq^q%XxVW ljnq")ڠ A~|U* ~~0HǕ^KfG¸I!1m,\'(C=e#|EJd}eQ޳K&[7vr,nVe -ͭ:+a^׺R]%4l705В(z_ l  Qlzt+5~Zݫd~I:F$ˆ t~I*`m@oUd+dqd}rĂ~K;uS=WيBGFӈ|WH)V3Yd9#'lb7?9a2D_;/x: w2[I zoN?y`*_ǀtJ(H| e溅A6rD>&F)H$' 2#wxABOH.44axyI6Q6 K5(aMeFdnh\I/JtȢl>WϦnHzYA;bBM:vFT^ܺ%;Ɵ[oXF@:hj?;Ae}O~-wVt~%~!$ %|ЮGyx4N6wO𠴠 X2EUwxjdY'{%rC Gk7!68D2q8;d$.13Də)ڝD-O Y:PY$IDnxLAޙ|f #YQi#HQb+tᝓ>8CyZO]Q6NT5Oh]Jkզv @Tb2YcSg=V$.8 bu!T>iXҝ]89٩bB?LX՞A&/^脈}%0o@D' :X~2;dӚ!Ah)cNSlzMΙPAA\FbEe=)U~cb+\6a'?,TTb62-*." =cЙ:xb8Bc | ms"G?_O*)*'?&ib cr9_eX@rGzE Rlʡ@1 vIS#? ~ڟp fEdz<̐vr"VkDp_Y5,:x1Aс{Μ&ElVsmU,9! QftXzʚhaSSe obhIO'&~ŸJd󤢓 }5}K+V:OyB3N" @S&26 8VwYQ[6 '@)JJ)ʊvtX@@"KJ49K\;'1)sMnPn 3]Tu[S.[-{Ϻ'r/ʹts19N<3yx++8uԂ? jXi:4`v~N܎9t 5HԛU%^pohy<6 1hGO;,T XJ㧘ڏ.󆅶2ʩ({_W˴e\7]j3S`>Ⱥ y7]vb|X4ej] *l *h`SNJ;Zޢm;*cvYMD3QE& W$! M7p,E@e@,c2]q{XڒaG(>WՊw>@sꟍ;җP+>8PiG>_JL* O>@ѧyXHW▘KͰ}zN^s2Cޜ Tk°#</뾗=XN U^Ӓ/RAhDlG;orxZ3~EoܝW'}nRżQi8j'|B?tӨ =^EBpi{#.Y"dWxNZ@lHJ>z".[&g@[,<|Hx8 |i%tD;7y&+H3 MRfo24Mm rԴ%X\U0&!rvMt8\~5-=XSo]NRKRֺu[ @o^SP`[:v h$t^'xdv^GZ\">ëxMx^l3nށ<<dOlSD"Ű?̛h({4:䖫9gm 7<O'}uNiH~gә н((Է⌄ M+`6]6 Sɛd@@[|6FRO} *bU ;^nW(pïҠDfdW6ާd[~ $f$cX6,F 8B#=po;S' LHI[ o6T+*no н9/{F[?5 񦎆 XR@_B>M#GG S:'c\I$~ e\89op6|ɷn|Ȣ+pXf݄}2cLzҟ{LV`G=7c&?LV~93r<3lXY~w_ѺdzI`WV~KdHFpz$O:|+~?_)!v/֌Lfx^4"m# x; zļݕ?S"gVYS7BaO>aVvBGY[FH NRY{EPKm-ܤSW/(̎lW7m'"fM+$fRj@NF JYaiާ}*0&`!Ik 1xe8p]}mp9§ ۸nP!iQ[ Q*z \2>/6Q3ѷvml 1pp7[|,RSغakTŃ_mRv}G `s,\McHgs!*%NՈ P iKucuٺg S:ߍ?tY/z@^_`:LJq'Ayඓ?:.:"[HOoUar$k86a ,\V[0e`^k@e?6૵ofp I5\IOg>-cJ0fTt)?z{W|:{בr3݃e@V ) 7?ܡA{j bW8]M$eK<6m;-'7'o-9`bs5[rbvY n \ӻ}¡3NB%˅fhy0bB 8q`DUahO9s%r1 G]\u#R^ 9}F퍬zuSWqۃ,_EўXo>zp% |[vD*,}y[Dx'F8Q cHBXfD)g]u0.>ȷS|MadP§pV=@#YH{®-7B(~*!Y|0ҎT#nGh@?F'!Eg~2Z'yJfl!M| B$y8e zHWRL!6eG׬m"ڱq{{G몾招'?*>~ﺰq &9NRP$ŏ 'OیTAn|THF!$\YɈa˩ At\J/}ɃzR2#E^M]P_9UϴN0^WI @ҟcXit4GI i~x4P  lQ9\JRDzBlG0F{:0y>WvYk b[`-G,š\֡:d!K9`;2AAJ[ pg ( f uNH(~Y(ql."wDl-5"e F:/;BԴ lkyLP ᶯVYexqF&nJݱMrbq= m2W8nH-fP\GL9,N՞oq|-xx!5o+ ``kt9HЇ;zCc\0Yri 'CVS@4h1d;IƬDZE}`SNƦ~#SL _9n_%p;TjP>R(ZbB%@kN2 t[(AہdjTq-)F8ZhۆƘc1> vy!*_c~x3IǤidT>pUn߿k_BPﯵ3d#_$xm[58]\!uC?|6 ̐Ch* ' n,nK@Q#(T@api@JKn`EQ4Q4F넮 E!DXJ=1R+9WYʿ+^*, E)1lf5Tջ]bfqCAOBN1}9ON:$!Ru}U,RݾJ>'>IfcZZ+} 58x:akVӈ'4.i]{eqBNj&/4a6WE“~o~v@ \F!"d6ne1@nS0/`_ ^*K`ORB\-z}>8|#/Aؤ3c14Z.%Y!DJ幑OcVntك㲲PX'P]eoy| =vg(9F`7T# wzdx4 ?Ĉ"+D>P f)v٢L(S/=i*_W2C]螿_SĔ#c>{ 6'b0Oon"0v2BӞ;qLf8d'>M8o eݔvcw|2څց'6]x5;s3آN {r8A:'|)o=?Ӎ^SZg~%4Pɵ^6f+75V[z[Ƨ j<%"n[z,VP~s뾉z%EA.z֡+32f'*4:ѡȷ+Ё~G16 -KyଈPJn70Gx=LQ!O|*O>z"uwߞ;LnH/kmըֻr|FԘHVvIL.D62)kג6e[q7z'0PEQ'q g9z۫c>A c;#aclu=8N,VLR¸eI/![{*%~ F0׍(L1,F%Nmo 6 =<)bXHC>'+GtIʙs2{0Љ>TcVH[ Zx/, |] X¹[&г!:{"- 'W]Fdd`.ݗ9p^ 7  )L)I][^N[p܅R &|[tLJש߶|XCʈRq=G).ީ/w?U{Q߿@'g'/)c{sw*HoLHoh!,֌> X)#`a*{'T j5(Pry: wP3x0|$ |!P\XNnJw\`q?J#WoN޽JN={'8},C6"Jjy4x8A(ojVs?v n  lC@>,2z2t,> Rr \{3o#핯U!f"~`0hB"kb&?4\Dc״ ]{Nޱ YmL1 ȶEZt!@ 6JK㴟Zt`WWJ9KҞ\@*Xc>J+ %ss2=+-R~ k2m=bfcaAc{.K<-u5?CkڹNxXyzs _tXpn~WIbC~H#ϕsM LNNϕgg:{슮?4ay xi-· Ѻ"¿_e\ n6ĄaÙVNĎqE_ `!4(3W<=>sgl$g/鉄 ={}Dqw[~2B@'>%B=y +| 3RNKͧ,_O s[9pcp[,%wc4F]y"Uٛ-0y{R.Sg ܛZP ґ~ JFrL Dʨ{ =l[iG(H&@:>s~#e,fw}\'׊_^ޮ?+R;zXNeՇ߿x7W7W~h4\ksׁ9#2xMѬjt0@CmRA?0C al&ƲO1% ЉQF]1ⶣ#TM"1r?j#F,5wb I7rA@@磻[@?{QX#sL7S-QE\#~H"P)2Ph u_[8ꕶ{ LXn%[d ڲtt%YK&ɩ%6uÙJ^BY?b` eA[{K{F)3JVYv[Xf8nnu Ho4p}7nxx3U'hAŽyԅe,AhK =hM>jCv,UN2fQeTUO*wjsN<蹂%^ad;z=N[[ +FKRމ|==!- ^g1m"@LHB+!|ޣ*qP3,vɈ4ـ\8d'q IV^ ѓ|2DZV/MBfaק[R(OlxL..+uwJ20^tXF!5| Jb?7e`,4NL`,ACZ 2+YZtrц%?={VFsV,:72ɕtщpE~N@ܓͰ> #1!q:/`;:o/[_lq|peG2Z#:+ҨAk*!_I7G"PmYC)pT?L4 P0C %'>iA }-,?US iȭC-c\Ԩ/A~ț]] \[+t}%X)Dʸż0֞`9Y0PY-GQ9,YF!~1V1qo` 1#h]:86ņ#Xp1F@$P*5nۢ#6u봥 h؇*j|SACD^}Ǵ:6vlaw[GrzI%KÐGY F h^?yE'U*ޗ.7#v'لpLtm"`QX^,q@OEJLx!XGUrndU ~*Nx9JiZGk4UnjC"S|0._(oI2su-Ԧ/%wӅ8·,VRjN/t k eئcB o !ΛqG>#L7z(OĈl Koip!+DD?oV.taG p0=Bs_z|Ub&d'Oqvt{+63Kt؁yɺ!ݦ @o!cc`Zzr>='4eƟMA<#@Ќ>O;_ SA`!&䌸yYa[ԕ~.?]MɵR?'RIe;=O UbOVP2[W @WD_  W&faB%< ?mÇ, B&L?Tm[^;2+'vy\c@L\L!:Ǯ3j?xvWGQ~M"b/(X)_,6hL}>eʣpX2{OۣixE{տ~3 zhOqL1ެ{]48f=̳1"ʓaoLtʒ,ʒ F2wf㖯[Tu Du ΝKkTTZ.|ik$C 籇agnٶŢͷKnR+Ȫj2nߤ$ƏoYqI=6EK}&co%g(RZpwQl2D.EZ'f'lt1+)h{lCʢ윫XWG"MÕQ?"4a#m0U.'oҾS7o._jp~'jQV -W{BZ Ӕ/;Ph?/JV7`* MMFk*<א"pL#/^;^-1M?+5Qp;AVi: AsZ Xcq jh̢Vtɿy %M,< )rBfq8VҜj̣%3̃},AFFnwbRGSJ9eA;6ea_tQt4ߣoʇd6 ƼӃrrQB3V'Bk4~q{SwW1=<hj IJd~PhۃATk\-yTf >K#nl,/u;揚xW^?1OSeZoQZ2z V~Je')Ka@q#zvɰ ɅwF0iC b5@'X7'qҍw6MN#2!q+Ѓ}eSr )ٔ& ʷRQ:Bb"W68u`D1:-`CRZ2F_cb' d6A3qt3B:oG,],f=!)!bg!Z.&bHPkx,F&ا"C!(|!B%#RҔ-ΪJ_%g}z@.Hvi {DlMC~g*t;kf}|IR7mOmLȵ"613%e,\_')_k̈́vHi۫rp]Q ~2N,OCۭPO~. Ʉ <(FD2&b s#RZ'K~xARbu @\|JYóOUlރ .ċW= ]GA{Cp,z8 tl |hXxHdȳ&ϻJEH$3cWO_ϛG޸SHb;Lb{MTo,*o: 1G~S0n4a!xebdQ|2/1e|I!G U;msa76U\Y"6"lÒZ􎀅4l@72$XF ;.'f$Rd'#[O{X[OhOd0P ThX#G5ު>%*@h?u$ H7?Q׼A gt 1-%k !_ ƷvwQ 7qH̤uh&QU< W֥?-a%\<4[emQo8R QrGƪxV_ Jpd`|(? "~j/I+Vٴɽ^ )Ab%gsd&۷x~j88GJ O7DK}+H%q+Ć/ To QC{F5S+ߍ+-/IV㾽x}r'*WZVoZN%jm˧DD} 5)D&]3VˆA6e#K^pƏ!Q Y0f?=@ROtUbsO`Z臇@Y`N .XT?oA 0߈:*x,6iry"BgWtJNŲGQulQH+t* jc|4;a#?wtO~o6P]Ahf dC"#Hbϴ;$l% mby.v#}ĸzU0l=$/*ζ_l[Wi #RKmxx8oh,gTH{>&7) e)oH%xQI&$<Ł\q٫'@ Ě^y$-Ǡ͂- LI8i)_{x2 o \M>.LJ@Tz4 f~*S/ǃJO$9 hqʫWmo ?3bB[zo -F :xt{QL$0> \{ s]0%h` njEeX+[p z+2˩RHfp5b&Ol$yY)V%VtoIFV=BtCɛK.16H =Rƒ#U d="^I A 8M'^\+!PZGY:|d“ r sp2. h.9+GQ$?C ]EObޢc ҶXQinLBmD̲̠֗4m$+JxgaItVEEKŘv1tࢗC΅FLkū`} 9InCQԱN2e*mf-y~o`NA=pF^mhOB HeNN1a7=d^p ?Qy-}2Йy%[-Yb~1xnt˘ ܳjO  6yKK(K|j/ {Uar^KyPK@6=D{HO6Bo?5Vۃ#=k1”S [搦 7]Fs+1Wj*'ط251Pzouh5)ԌY`juI×=ULFy +⊪hI\B0?WlIhJS)&m7jesP  Us\Ӑ6l]6χz˟%C@'dMx߼ԽjZKIN$4-͊QztJGR#pid* wBayH&PTbd?[P::)`Fbp=Ǽtke^`W[!>%)6}б1ܣm~Xt㵙kMW,[|^yw~ۢ} 4B{8qHlB*8G9_4F^4C)87b[oVdoڣ0n ΰ14"n5XgT1U^볓Ճ\}T>\||"~&'wqV&'Q  MPic*MLp2QMKC-<97-'yc:<!Zē&?Q_m%L\-T|sk֥[6H]|ck(+v:\d3B?,Z3V,z;ԛG: ^ vGkn-v1US(Mvաvڮɖ"V~+?-U_2H(RC:̏O̡!K,x&f7h?ѽAzd/ye&1Jw#0/(i~\nOXaos2"Zn6?".PʴI[I1݄nCelbS\X&m!FyEbpsoM$}k; ?DQƣ=n fB\}ԏ4+ ^Vt- 9 o= §OxA+A{s,? |Oqs6 2Um#ˏ%* 4R^]~'o^+5=K 5Kwnt\΍0kR i# x{c`TĎʶ4ʿ[}"` H},P!P6- ;,5.&z !3iH1p'A2ӶO!@׮:8ڷ]fx8+hpF[A<"X8.B5h/a6'Bɐ6pOm1Ati({>=A\,GC'f7 4ĨyR#=;xjx&8Tp Æ+ E%F^Q{P&ׁp؄CEՓ7WhڂlWlaPv bߣS6 qXnmQHYדu'tcߟ9w%QCZݞn' zDkhE(/ m0lW |Hc#El g8P9 4t b L -7 S6W.;J@Y!E_>CBq-l%J焯4RD^@lznr +Õ z\AFdtG ]Yn "Cm!6Zn5_!|lNE< Mb}'"*1p ;OPn]!\4!eՊgA\S{S Jf7AepGPO}(vP[sݸs "eN,O Ec.MP'cAѩZ8H!T_ P@u2!O,,zeLC= Ɉ ;t"TXzMzwkR.dy; h 㴏TR41@1jv&X۷6Sd;7MS;! }7oߜ'_?_᫓W%n h5W n4h7N_OhhP95\fV0lL>q:HS4 E;:` ? im|B*K|G08Ƒ0@h3Kz UC|X?L_[=&ވB`G>p OPz6!kdlb= fl Hla_I|541vCv`\ 3`rYf~]ji*XHV͌=huTTn`Mʻ1y̡6%#B@n:A>|@ ^agʣa) δ+µnRLw1 b\`Ppw v`s=#@IDATD أC0Yx:z-O̲,^lZ.D#k”tڟ.xTNl`!xI ě]fm[j^Q|Y 0$tfD2 9KPc` 7Cܧe;JE'U/ZM]=~”J0NTϴD\xHǛTe#$nĩ+z^ўEz~~gNu OQʟGJ~7J׊#Zfoz{0˃=bUwUa@ TTH+?Py A _34%o# fU):}Eb5#5o}}Bfh1Qa/O7;y^ч~2|ys @ރ7jeZŲ~ǑD1eI),>ߙz6J+n?{ޤWni֝"de[lll4na[JK$޷ݒՒm=Kf"H\pNWY"I ʀa>2|rdMFNTiMş׺:ZuTo7#R-$\㬯1yr:$0Nۢ6YFD] 4RэE ܦ< 3g6Gyf]t]olOʐҰ$\V"z/q7Q􊟼I1r1*іZ9>Z^YUbhlyY^<~I7*P:BF&>w.&?ħdM6v7օ[Sd2wkRb-cOY]J> Q͜-y ';oV?At'?=͛^\@ةĿG&n Z38Wa[>PC= ΃yY:wU 5Q` [*HT5q| $d5؟:1h!P t űϤ$=17W1 ~˃onxxϡFƊ<&+b+L>kk &"Nd9|k嫼Q pG;*B]eUgi596='&+PϐѹC\TژBSep𘴣vDit+/?n'7GOLf ]PG&q!OT)=Jn>jт着,UT%:k y$r. $Qfy-LT2 g;9}m5Ar>:Io:2=ޯ7R~XpI|j\T~'AiqBLj;i ~hӇפ ͖ e6D03 /D=p s{wcW|<{úb0~|vp5ߝGc4gA䑧?]=cw$4(:D [Z|@|N8V4^^\'~Ur a̐)&S~x)b DLg]7kںdcOlpĐ@FoT I@( D x0;$e!JVpp0xztgr3' 7؄h{ "T;ɸm$mzg 4fv!5ꃀ?S|~VV Bq5&%Yr9Ty1ywF`2iGEpiUb ߨbQξŒ 쿕E5P&{n޿Ӟ` W|>0gnƯ?||V/&3 ]];(M3N_^qL!(ըۇ"ww%Wb`.TS|je* 5Vwҿw|5ϲ>L+Gy$Fy$& ڝ2},ylv<MVy]$hbW[%Jna jtfV L3v˹!S" kyL }Ѓ S?77%ͨ;R*苺:E(`M ̈Bakx>E['Gs<+{4g5.e*Sk~2;bw<#l (v_ 4wX#NK-R7"K.I(F}eOy A4rD(7A!Q БFB`~G]0~x df=d˘xL]&fi KDӶg8EN;Н;4Skzx&R4Jmh'cwţUĦ+Hg&y&ـl#.5tKw6 [^}ۀη;Z=j~*"S~0Il7)OLFyMK T TH KԝYrD$M7v#%y-ԗGTH})%j NnA7]3Q-'M.q7rz'ef☤}Oqڷ؀yRwoqtO.^XBK: p@^Vz<^ҩMgw ÈP(‘eLB~iMwkKV7RZ+8Quް=_Oޒlrr!wgL]\|7bpvwL>yupy<9uSya?.9@&Gn- Ȫ ۥSA!:`k+$JPNè uYq86Y3>plA,A^|xߞq"iWo~uw|3:<r*x{,2[p {s =YVLIc)\/vp)WLYAPC7[#;{ȡG_7ufqP;oV-Mr@+( K&nQ?P~~?=SeXB|/^tS?]LxyzAS=?Ĉ+KlQ;%vS̄w-V8r eA<,ܣ~B&!WH69/,Lewn< "B!gt{N ?$48Ƅo&jZ%kCP ABzB6jSfQSrPnek3E"m F;蓿Tp3b&>\ q1s^@?r|c&/y)rqwܰ#חLvC@ܡx.X~V|35`,b Ss% >ҁӀ+x( HDC>VS%y3a= ['U䞞K:k~ ;fC^|H`[4ogW8փ;NRI;K&&;yUZt3oyɥlN#E=٘W>T&7vaV8v$"KkيM`=H\q.dh| G؉}ק]+N*l׍~]ƷcyzwSWnX82_![F3n$[dIx_ȬˡO&dS%dT[ n uc!_4ˮm81^XRKDM2b"nFlFKaeip;BVܫD-IChi$UQTi=ɀLƣ0 qσ}8h}9?W*mJeAlF(߾5wh@ c ~;Q⢏gIiK܊b+kgo_vK25J1xա~x )_&,#Y @z 6{ LE+݋qO6p'0]ֈ4a QN`F^ZQI-*^xM]n֚ᗅMӧL;ztC@ 1<#k'K۸UKC8?u,94_Bz]0cCKecKfC3ӸnU*IGSo}& L^sIk8&HD6/i+3q7&\BZ/ qI[/6l& \cK xhELnJT;|[z 34|rLW[HZ8zK)aK _=oZI\UNzo[Y4@.y&s*Ȼ? :^c$eɗO]`Y\QxNe2mdF'"MaJ|ֶ ڃugGE&tdKL y9.ȷ}K-.W.]Cg8E!ow~ ֮ `,;1۶I =^AvRַO22O?gdԢe$)[Bd<屐&~g1\ZPgLzp*=(^Zx"H-{yg55(..顄] X1{⑺ȓ7-|$ip{ivoN1,==1Ѹ7߿?x?e*+sS Nyw n2? *|MWGAw\7I|M64EynMj!܍ZC? [lYE jU:ԕ@lh>:}J=d$paR]!Q"ǂ[ӱ%bH'%jbDKMI&P}.|:͌BJ.LbgF .ArY~Ꞙom~%QNk}w]|Mf3 lRMG4|@эeLh3Or]ށSd$+=&]?ߏr!q /<|uo\!B ~"|槇_^P(V /ygi˒0Bc Ҳv r۞>v҅WwL=$j@o&ɷxoJnj'k2#6[Ǭ3qG|8P;Qk>Ě7xTʎJ]}N~`࢐ `UbFl#nWE˷c:ڃn-Cjm a~i>;ܵNkd?HST-bu+ˆ8f2,!xO2M<2⦈CAZ/u.Kxw_1W:Y@e@CSNB+D%t\Ʉgm*n=&{oI̸ϕM |m>Jjo !1iiC,ށQ x} $GO1 iI8xҞrdS$K WIɬ#wgH:ePcۿ+c-~^3iɲw} (|k~z B KsKw )3W<]>,Vns:'ԎnnC7WPceҪp/]Dt Y&~I>v҅όe%vz;QP-$ۨu,Vא#I\x1!!)44oKTmO3?{U Pv8E],W+4<C}e4~[p (s%N 0 N]:qDװZح^EB6]D$8CJ?: `A+D-FL_ngi%7ᱛfeU"nV}] BeE(Ja!oKBMŃ.}5 kn[ MX7;aX /i<.@[_wǁge @xa2%_[߾>xrz Kɺ|2rKO,ϥΏ7eaUyޥuy ڀ,`,ƗbD{<y&MeP&W=7,@#m#cYP桿GPGY7x˃oLՇoIw|>|9k&))_}uP=V9jI ڙ|Hߊ"9ݳO>).ԑ?5hN7LwP CE0pS8)"K ;x74I^vhz:.H>H^ S8i-JOz3z^KzxI[u8PF,t|1fvn v:IEbȫ~ya/-r&,Btvәr%A˛E5Bĥ֐fv`{0V`봆M:dM8"&%aIʀ'e)W2 5yպj5/ D~28OWqsODo'RYvUd[{ˌpoA @QW>U\Cƿ4jLtH\疀0xÃدX3N;~ࡿ|f=@V|e~kTaClĴ@br5p/ºx3VIH$;tJN];c_4াf6yeG?wPenyK,<_ڻ#f| '#%nu;cGJh]< &i'<󚩣~+fW֑Q :LlON?0moCɢ2- 厢"yzc #1IMe0A}$#4XlmR~2:bAn?7S++vQ;7$qFȝZ43:\룕_,+I.bzfCťG$)ů>Z*%q 쿷)|9r6,N6Fgw˹D3FrJׅk+(/gE!JK9e;Oo([u((+KJ$_y)G䧜r2$vȤދq.S~3\K7K0od`,Llm\r|ČJS)<#vX"o>sbL{ݘO:1U>i̵3, @o/DNUN&v̨\d,FyG(HhQ %>%Jshl#%J/bSHRxsC[yސgtI>*Ys ;²RZr7e#,#]d7v? 4#?u{ab[_AB8GKZeٱ'st v6SD-0arEuCm: >C3M^9OU^u/+ߘp~d4|}Yc_ p^Nx%~:}[/ow(#y&4յGOXn"Dcp\LVE=%;9mz̠K@XСn~̉]E9Yuږw6֮<5݃J2a;kA:,ǀ!}o eޱmOǸ2:1 lP5tu{ꭓG=>H+@A.Tރ_"e>1ZZq'uW;[=YT9Q&TmDt;V2$u,it$Fq1 knb+j: ebT!<0rɄ/JoVC0%CFed_ `V~Xu&=EFXD'ڌ(N|Fe2lf2 DqɖHרoe_[vy7~9k#a]Cu+:4j%|*=u,iH?A' t>#ԯم9E:Y>yd:һ?(~{\:$V gG`?s e5.Gnc#ɖw iG//dw~xjrϰAL#*7l;>852X?)>{ #8?.0Cz. Q#~N h鰥|:$S ü"vм:l7RwmyIԟ@3C"RW^1-;w/km ]#Աv0Fy)-&_ (cB3xD(.Y3XDEDۙa2++"AY~$"ݐwRz::b1kw8 "o$ 컳HBvVSWmz pTTFҭ?7dZsbT=6Y` lnG,=k ?LyCP,y_vH 4Op֐Abt(ah)AȊ~iW~pqL=Fg4_gQh;oδ'ez~ L靿lcNx}vWNΝ{.g}^\9xpr>5_rm0zo2*<5\鿐{ (\OuB޲?ESuگ!uIO$WH1{G9i ?-2gԅ)IbIl]>&Hv&.?>q(;׊h%PIJƃǔi  (7bm2e ĵkY~iX~ 1:8NtYugh" hV;WuLyn)4OeB"O %~`=5j.{Ⱟ%2l>++_XLEE7NLeN`9Õ\P)<2x հ㮟f sC"I[Jr+BDžE\%復liBCu|YIJx_<\ w2L<7< ;dVEn+KJl~.LpXau7vee10ɦPT?iY v· H'~ȃ8|ӾXɉQw-9(VQxX`i%s /Ƿnߜf/yMUQ>F@ +OhV.]7ez;9A~,Ԧؗtz?'[uOP+U _wxuG~7@{,HrmdxL0?čr5*Ge dg0FSտfgQ6;:*áĩvɟ@G#Kִ{0P{G{&U|(>|O҃#?~[P2h蓋PzDŽKW>l7g7Tf8Q&q;`^ vⳇ4ݲ,is)=ī6>;{fe v׃u^ATqEXgr[}qf]*,! J3rڷ>}I? {ʓ J%{B V'.ٓ3%ڟd*'}>Y,ަۿ)GlWG =߿p&fmӸF(9e-s;| uK]_S냇`ڗ|׃@<%l; *[N@~p9y0MHnITexIs[h-ՏNohͭg\G4 Q!SY *S E ezGƫxg%I|"_1z3A_1+S1 z-_T2ogЌ\^"Ž2&¯BstIQJEDBea%T>ָTّ;cebsy^dӾŕ ]߰KrcfjzH~&~$6XaAtq$FBBk"<'Ǡej2f~~NkB _=k~u['>uK&DLbꊥytJl3u?']w*O?%hSS6 nazK pikhK}s@0_ԁW*px}ue")ѻ)Ҕ]q<)A(IÓ u' l/N7_(򊌳/WznTlMٓvblhٙB4;\:6:<+= "8[<ώ%8v*εK#$(RbgyAfk=oE:GquG\Q7x˪B%HN9_%BrDӘw@MщPqRm/k}(te^ [$qq7`ɅK}ƆчP[W"H7r)Bq";1.TScUyE|8T*x6#lGPe2\Rw]GV6$7v }c n֘vo#VC~?%k^~dYN +=Z0~p_|>|/%VRwh]P:϶ =VdTvڤٱoKTNQњzP񫛴<3"YS*)%xTGs%e&ʃW}_]% |vҏH2\Xbt1-cbI lڈ.hE7BCWj1®nMvD|>ҠO}S@2/tՓ _/)W3&^>/a}s}\˂ /a|WW{ 0d' Lj -~d9OƑ/7Qnډ}vZ^T |T,,o[Ga-<џp ĩUv{ߩr\wQ}<_p'n(O.WDNyrYp7H0iF.oA]`+˛@YBC9he@Oif1o$n YҶG/wex>nD݁ LJsˋCy˷5 ې=Gy?@r2=)N'Wb ";Y'$%YT77=S} ggX˩}s!_ 7W ?v{>}aak^f"[٢J []fG~hå-WV H= :&\lxOJFuyȣ=xJlw6eVQBi~K\půWc먈HXZ' (V1?ŵiIO̕ >/e~Y'rJ9\Ө3p^TB2j_x% ||G?aV-{ !pC#LZ^v?0 z >>6ωg |[*0^tg[y Q>`W.h浽 KzC}/^7+Er_r>O@;n?a+2t9ԅ-p}5575FY\'s} (>E2=ڹա]#U| iqGRO.Ȧ~ j2}IZCKU33\bO1(rݐ@H>n8 ,S}{7cئ aH#eAٜDZ0eɏ lsmQʯUEwms 3vM(G[XxO~U_񿇧r+o8|*y"m#nkG겚Eoup;;8w:qKٟ14?l_NR^)/;Ƭ (Ž[~p̔Y+u2dy Zu fO;n]>eݯliA䧽 y']϶qߛZ1v7 .ξ|Gq|3ݮR&mW~J.| sKnU<߶ Px5溊Je_?N?dp/;oxW=}==+wW苉uϊBT \_GyW~ yՅ[,ȠЖ/pMX)O]FëiqMp@IDAT%;t|q>|d.p ;~ӿQGEz7jG!_\R+N\4摹p4WTX{`A8V82`\|)- GD~4 M [|Θpo/a`'->RW#@S G9a~8{G8}:Hy IO}]&RRFlk9 Yޫ;L=gchit^uc`׃Cujy7~|G8%r ׍NxgPϥ'9.z~P:k舻g+nU~o+|N)vđO;UwLO;#qf}TC|:i/Ǵ@rfBB4gxhqOZNRSeE%PuE3E ?)>SW~xkys%`&DB~+Wq6 Mk/=m7X޽Ս^e>:t뺀4^Ο\p6ϣdI~05E3ŰW_Ʃgu'&QlE9@ uBy*ZcxyC>F舴3PaXQ6ΚΜ|'9r@䭸\IMd{Oj^N/YAlmx(P5g駌o+Sf./ {}S0g/hT̷ff@M*ߗy?| ksdqa¹{XUqe+W}NN7> Rӡʾ gz ˯g]ˇR^7.ʴ:^ے7{ Tׄxx51] /GyW~N4SN~"Tʏ-啨ó; :/;~(E<NvՏ{j /3G6{y(7;Z 3<_Mڗ>,]^=x+R^^嫞|l>^qʒt_R^A+kÇ7s_~-r(U-} ? &j{O ;&t~\P\)QBW@|ݍCbbQ3hʏx 7on8}cw+hO^ jԟ?w %]Yg3p}}ծ(@coKG9 TCቿYm.yݣK@!ńB[5cnqJΣaQ<3^`]M2/8ړ?~?$C@VM.>RtrH8:|ըNi`\Ҡ.y<آanu Џ*y Ud{B[:7(>}v<e Kl+?e)|"|wo9dûMP4+?w__}?M<>5;t C&.?.ɫ_`{!)GL?w/y~x}ɏzP_?PGS.acj[| :x@tw+t8AŪCwۍiևƇ;gc>s^<~[Q/՞/>P^C^}X^-o>`'A{{ gX۵<|S Qʋ>LК[B}\hB8!d Uڳ. F}Uڛ_ͻǿ,~=ϨC]}Uk;LӃ_.{ԯ%0$|7L/δ峗bӑ~}3=+oM`{~yM/?"3niSn=aLcBryvc&}{pH~?9U\ W\{tF;g7hqСځ]ΎF?4֚'fDoӅb蝸P~ⲔWnI`[tZg{,ix,k y&uSgV ~g 'g4&v4S-pw ~Oe 1y:5;euU┆s%70| ;;πH^#wB?ig4S`H Kqȇ-,/s„4g.G;LtG8c;tJgmyOX3{]6p8,c[N(1rZǔwW߻9Gl#)F{V4 xZ߫|e{YWY'~ T06`'ʇQsc+ooQB#5Qޒ$Z|j]]8\ ^Xe:SS_S(qS>r^,h7ȥ^۞ߴgpxlR恟Ln@a`ۋ؇Pɯ9R.?p1ArRGys`K%9gZ=qRRΙ$ɾ'a3!t¡W_g?KpMA-3Yq e)nG ѩ7L\?6he`}J*\iㆦ~fOqAө; :T# ~-QM҈BG8%⎱ppi B-Ro$ha +`?桟Jg#%"CpO3֫,Vl5Y{d0"ke oggt2"aqrG t/OeT3t4[euҟ f?fPrRpg-yOgp'?L4L2et"dv2PvIg7?:!(q :q%D"+2/ )d@;2ƹCJ) NУ2.c_qV'Q{oS^ ]p:н?Jg}K>W򝡿OSծFդb}?dR}>qE1Uu w3$>E} ^|Iwα94O.x|Sޥ>S=Q*6M39?LԆ/m?p^U-a'MyI 1 d!ʯ' ʰI Ʊp@oNrm&}<'mESrr7s0e(kET ` [3%-6gJ8aʓBC}Ry7T@[ +ܘp$&2T`G:;cߘN;_fYM|{dQ6yyE {v΂O߼0r*w*S2'-oޜ\J*_!y[ t(uF#~?d?o|qpuQ_-wS*@+sl;#3Py85lG*-< ~Nɯأ|}z^U> |]r*#Coɛ;f=k^ "o^N@;#Ly5?Rv?9L~>Tt ?Rl~o~Ǿeʕ!wl+|"y-/ޝ#|E`˷/J۰?ll~1 ~Csnj|y+oL1502-=5FRV[X¿|3 ;PsꗺK>x [=?n}`k}D./v6E ӟ~6#|.2 N{FBeڵÿ;+{ٝ7gxޘ| ?hs7h'LmJ߫cǁi LR~L6ZR)6&d_L\sT[4ӛ7~%+'|?!а{9螿?÷zaKՈo^~MwwC9םX[Qh`,(/Zx'q9qP2R^E>&B|J&Mȋ;n'I[`I^Xڰx>=R$k_tknC=wl?W'gkh-7G#M'?%F>kB(bԯa6=@.^ihNiz@xCy`X6`eN(w`N@]xcr $%^<3U/hiX8 @PȃV,xg$yiubC?#􉳛λ]KM%ם~!#8As&YzZ"Ht #Ȼz/ ccW@h5bw^+cQ""P7Šwr2:87[ \ :8Usej 2܏/##\ -C]A^V-a"tFC\\*8) Jʋl9_j,ڇ:aF 8 ?9ʩyZvq1{=zM w O NyXw(f55FqI1Î;-Ȍw R-(pB׮l$4uD8s99ӖU6aH&}9Wr:" >Ϲo!5H__}:|Be;L9yCxw}#B,y (_]_u<_A!ܡ 6PLPJ@D[xِA}ŔWqL}[E(`M| :ן؆˒'yDɏ| pNwS^evyUVʏ_Շ(9P.ͱW{la' ?v'/oQejy#yOMPJ#K8XsSG}Xiq(J>t5ι^,/?.{h"`37~ n󣬶G>|`qx"Ԡ<^xX9gQ;/'oWPOb-Kgb$ֆyPesoɆ08aYNefpzt&dIK:$QtO8 o5t]m*=Շ:ȜPNA>.{*?ݔK/Lo* /ԯϑE(',R^%JƄ1A)~w8$2a\ TB_(-jĄ7+ 3_ |UC;Nr=` =)[|Y& ^XJW,՛zo۟!K &_s,>mIfrZ! #4gcS~0l(;?-+JUfGnmܥ{^ٛXADDy.)Q lF9>>.()Z^] S\nwL)~ϾؓO7H&Nol5bg _ϮP7B85b[ -Gi#y:/U*d~|jP wѼ+lSy d66ecO+F{40iTwr|;`;aC~Ncg=<0> ],7*0fm;/~=6.Ost㘶up6pu-w`m N[\SNВQYA;|5B*X1Ѡ/xbͼ Ʒp'ÒO\ٟ c#A#?;}ɎG}3~vQemrTvl-eE?Ԉ{WI[Qlv2|T}'Yuw?3xkm[ꍃ{\6^K/g5shπʦT)d<`|}`'xX-`e"HPxj}]wI'pȀ.|U~ ՑBYSOߩm-6kH`jsNZnhXb%:sO;LIӸXtڻCU2MrGZ NI{p~*E  8PŘn6Zܗ`ITS0+9DlApٳ[+Q!X,\&4 M{\%wQDQxpL0Ҕpٟ(E,?»3 FA1*["ψ=|)xV&,\_-7q(H6G KMy ʃk&l3T%MiFM}3jηasا)8iCL蓢> >Jz D_'Ay-v ae>!jЩqxuwPeG(Y}G55!(FW.bzXmuw~ [f:~^OMi_,Y.O)6݄|;qPPTs'LzRS (Xq9l8`13v]wI=ACSҼ{@fZX{ <"S+Y ,zpdX\?\TުBځ8;jCS\‚|i]&/ Fs@O ]-}`v#rvG72F&G|/\GsN9e;b]b(ۖ\yo$;ˊ?n? I}/MSQU( I/wpB;VcWqZ˂H6sl?]eY6{J~ϛDAo_0Ee{_CR {,ܳ_ -iƊHtR< :ω,=gH{Oskw,x~8^R;W} ӑWtùЀs}f%$]wp$"๺yGh+=|쁂z;}ͷDGOnt#i>I?.l&)V!"5}g?~ӥj~Nm;lfIhq#Asd6]&x|,lf4W,jODxSyhj1f󛨅}xS5}p+uvf|7S6]3 G)0~>UeϋМO9 syyc^{5ݽ`o2GXxy<)г Xclf)0%=HD28/A3ߚ>"b?(y?}~}k<ӟK2ݟ*$g_} d>O"~"{OQƄ Pg$Xwrg`c>~g6r?z]7qlg]!f|L $~Y\?`|Nɚ`/1Q\?5"ƌ-R> }{*Jsw#s]=q;pɿ'F?)˕N >֏ԸϕDO=s |N%,i;>?7w3.7_7 7t[{B#Rs, q7I@i?Zt[3:2"L ~_{,;{h f>}g |g qgs?e~kz͏~Yyy'ۭ%B^o |q9&uw gNcI`TX%o-L&AQ7GMk|.Ϝ2Rs//yL33w;+6~?j>?S|W {¼]gɟGeJ̠vq 5Ġ >ZQ&K̓rgX,lO{lXWJa8JT[@vna*ӵ|^|7t UU ୃxl# ឺIX~9>kk`wߥ+./|!?Y `f$g_k@w`׷]ǀٟfƯj'yҷf2Qa>zf'Ȼ ַ=SٮY5Y5 jGt>Ϙ!?7| w'N؃z[ K #1Qg^Z1§b翠Xy tA-\V]',S1xM}Xy_&}OY=_"sx)/^R#?nV#=}++{VH~~'gY3>ki]Ex뎾y'|"0>Eǥ,z|x兀OdVqGnɓU3H0Y]ylI/| TFп 'k*3²"sFV?ܧU7(V5kF~Ye 1c=-ߟFeJWR ؏vj۾A>;z^ɻW@1yϏ @^U,鏘Htظy*8цYvX4Ty@TGU$X:4XR-@Х?ezJ k';?0w3?G櫡o?Vk\2s21`s}j>~WO' ?Ǧ } @RǹğۓgSnG|/.Ǿ\طzFg>;SJ0yIµ ybφ!}9/q$A@p ?`MIdɲIӳ=ʬnBir+ )ܰw$E,*+#2 w*8^3<<+/3p{rϢ)~Dc0 Wk < )şx{MWtz >t .,+~F,T0HrghÕ~>B}xR?w_g}4R|xmLHd7_$CBt>ZR_ųt7o\JQ  ,UZ={ձC !$T &}0hn:k' Eh7ʂ7PK 1̛Ge.(B',Og%>>A W]qyƭ4yw: 0pFjX5\'߰%X6Ǟp׎\u??^GؑNt{CN';;IgH 7iP[}e%}b3;QIm\VF}Q& K5V āĆ~P%|J!yG < xDŽ'Q~_yG ^B-em֙iT-aG4~K ?~][>$Bd'PPI?!0N4p5 &,u(R"&p~CW9`J#IyzmڹB#Ő&t9] $ڊzl @ڀÄ/)8Rg- >O6YV w+Z6}Ve9J{8rIہh<Ф`lЖStdzBF7f/iV:BF_B:ێзw!E#;{v%R)a&(! MvWS=Ca]{=fӭt'jR !i =,`/]dpBSL?X61#a53 V^64U+|aRM$ֻQ5~oY_ o ]Z!@^'M i#ӋO.tUQSizC(_[/O[|O=[H!7*۩8޿﫯CI;S?  WSw}.}@] Ox#@B"iGtxJiЕ!LC\@_bV}J8:E^U:1eoꭟf$~GN*رWø(Jء|X9iq 2-15PuKLTy.4t9B+e*7LtlcFjbM5 -]4\68#r.Ӣb`vMX[fRsѣ Othkـeveshd2%|dĈ?A8 +]e/>ť*WI\KQIT" E qR{~_;n q_9^wzl)GgkOfeW>hD/T e64}Iq9Q,h %6Cj%MW|TH@@#VRC롿ru)nZW}T; VL_#Wr vs )<,MUG83?/84:`ߋJCu2Oi{%jͰ9 ^٨!l"=)PI*p-g Ԏ`ufEKlNX9L;7߃]#{i^ps-wA-AS CX-Νzἅ-1)gI &SE>뚭1ίDNŘ{D+1뭀1}%?.k sBYLPN'֗QW2 U:6R+.VxT%UVո Q8]5+-{uouL'ᕐcoc=S9U m9pX_|M> 㸗_"I ;q ڏs :9x&Ө6愥6ٳy`W&CZlP%z(i)MfevܢPDt̎t]ws]=HF1. [eUg)ck<D{ DtխCߥ됥C5"\"=E4w wuD9 q~"OtD2ltjqX2]@2k Xc=LaE_3c)?3zm'>נOlZGy6 bY!L/@d6_px Sef5qI@Iqꨕ?)AG҇}J!LbE_QɗL_'Oqfnl16j#MvO`ۑhQ0ttӤO%O6Nf5ބNAW-P18`hI,ʄCo4 j,<#(LB-ؠ($rN+m@u+UWC >cj ='Sơ'GOѭw6@%+F2 A N"NEDC=SkҳOۂЈQ܏u.dcWFV Ę v!rߚ R.5YS].龜Oz]Pnm Ԑ>BǶp~oqd14q:p}Ayb&= ' ɉ(GlǤ|̙CCs?<L ӌ :?SgH|;'cYX:<SBЬ,a/ H[ؒPQ Y(=fYTb` sȠL|T h_;j#!n$ׇ4 }0 6C! JpO]p{̑G5v8Ѽ84z㕓&o~CmaϴewmҌD'_*;Z} x sPBI%l 씙h}OWb?!ƙk|ymV!;gpτDL=_J~.':.7&>Y& `t),D.깤(V<3FW@VtJۈAII"ʮށ5Ce[lyUp". 00l8ح/ Ҷî9exOq!PĆe\e)6$]'ஊStCrax|K,yCXE[H8JD:~%̱d_CT @ Kkqm/7t_ Vd?~^̞@IDATG~Rc_޼U5z<}6"t8W]N~C_*=&<P\ X<nojmuXְh֡"Az5]Lv'=" ^ -mDI0`("4}1U<dϿ=` \-蔦( L-b7o*bL(x~ /1~ڬ75To+9(.0$ ,@%EZ{ti#l%2 25UptW:"}yM\:VÄ5aO mz%鸯όҟ!V B8 `>xn[[&0rx20JA 1rF6ωѐm ^!{@sk1kdrr齤8nC*"sy="+|ѓ"XFnTl)K'{*nSи 8ʇs{+vkrPg)翍QIԗbd NJp}JV\8fkÁԊ~ɏ9?;8a 8xϿ]iנ&Hqx q8}].-SL!× @d= a:lKfEa_H>)/9PEon \l ''پX|A#Siܠ;;6c'qXrg8c؎&1ػ-Gm"]66hgq{-H:8|FN7 rs3KqفX ,W;قur,H]uWzvk\*t{B J yT!/rߨ ]Q!*>+M~]^ynYMagO^yo (~?jĤhsO-޹/q8\v聑C'cI0s&AQyժ 2"&; >w<"WJBސ0g4iбr-,d /[hI%MrYEx0~e=)pPA ValdOE!6V\ nIS\-}}gVV%[:/ 7%"16bd;=kK?6@ Mq#ĕu{ʴF 6 R֘\A:4%nuħ4TO׵_Ư } @*@f?OT a\'~+?ǁsiSWZ_<?ov i*[WJy @x);K .Bњ(HНtCKP ?`Rk4nRu*E¤2IhIjelQ=!1Y<řbqS:io'tۋ'& I!o7Q lƳ< @7s41yvoKG\4[*Dm9˜ mw"SPZ%e0 Jxb->kBкt$+C( Lcթ]\qmlU1\/%tMVUU7k,QbqO!B@/>0 VG{?(ÁoW^_8wc+Y=\1uRDt[%c1huٮZgoN܄=!̽~WL9f l{?WjkFVDJi|ItYXi5^(ОOR EJс:CQ}2zBT]0ج412 uT"c^'NGP#Ŷ9E8dsǙĽ ~VڇoIk;v8{/݋ {;púl-2ta̮I:>)0sߐŌ|()֮pCcGP7&Q=t򀎳m5d`I)BRpNUCYʰ|YL,衚;n' +I-g QeДzLO 3`Z6;X\5[ pS될kh =nw[쀕 )_h6)5 ^܋OsS9psSo ȏPm?w?٦g"]& ׃z4o#>C\@4Z}l|jY!#+]v-ҏju@'[y_?Ǚ+zͯv_N|)ڶbr!*mʘNt'vBEp"VDص' hE6a}JՒۋ=0t@-ѱ`elk@vpTCV'lsRAV]Ql_՜jvB-BA;cVgw_\E{/M=uuJ 8'C8 ̂2h)㍝qIn_5;{*-3t)h%utOT*^gTqA>KN'$4[k4{mʟ_'46!#n ϳCo2NqL<Nx!.\[U҇}e2ds\βjʾ"= %Cτ]A:-[ՖcX[?oe4i*1׎F=_CϮCk{p:O/l")ܸݰPM}<弑y'_1 `J0~:h`_rƧ|$p⡏ & E!=&!6}2â:Ƞ?LڻEn`)!#vN;^Rq.{Ė̴;"&, Rk*~2>el!LZu`x/ wa9!)*_qp[o' ɖc&ΏS=&cqU+_'GX,+ӏfzr+ynE[n[4C^gnPdUW;eAIb ^ cӡ`k?)Ńԝ[~bgSEb^|c{I$v(g0~o혙ݽs#qߟW+}c|x0'ujL$NE|y5wB>:-13Ft8,F"&O8C~6RDƔdUe]SGFSL!"JK_r0?BQZjPM3#eH5) qO=MDK6Sad'㯔YhJvS+~b>>Ty:K}7&ț_|=&x# U)>Ag*%eģhN) ¹8ńa`Yt3&()OS_irO4q߱0ga6*!+RG\u pmz |\UFH0 @FWL1J$!me[Jv3җ_'AT~ G+u˧癷Ux"j$:!p d+p 3kגa_TIkO#ƍ4/!2-8=h)93;[UݢYa0i4*SCf([M\(Q}1lA6੏'8bAZtWl *ЕW3uCμVeq VvF! A&O KPOg! 4( dSz 22:"?&4}[}W.}w%B 1*l_2{(*/g4 #l!r~ '˔Hs,=fvc *>訑eyn" gidJU-2K;} jvV8bZs;&طq9uqs8J{2lq6݋t-d2!Dz9LoahB3uNs }ȑy{x]evt3bMel,zPtʶZ*D;&I!^X5{=A4x]-F 2a̲=>Đ pkٺ% (g{Ӧ8  ͯl:~Xٱj~J/q8~Jƣq Iufu]m{"| B,+pARdԄuV e&-֌K3UGro~Əezr1 CJ B`#qh*2UK8ԉyz'#*\MӪkxU~WN[WJ]nA; o4teF]~t.6h G'I8CADzQ$WtL䖾GFC?K6Їc9/\Ekl ΋(sU߃˲xSUƇ=˄CWV,]gfEV 9cAEpa : M\|&i ,A3bPfhB UG&U1n v0V٭pJRvJ^S=lmjw PgKBR_J#•(r)@j*J`\@<]u5{Q@#]H i1Xu%QLOM}-?cTy4 v>}BqC'qn Wo2g].a5?Vɣ6  B}~{5Vޞ* aT>=?@ p9C;|jGTɨj^>{VGɯѡO郮O¿@?mf',}>/ W?*-'/_O$+F^_]&\t1!j(Wxx)+d{zy {fv9Ʒ(2tD.DSg*ڞxOZ&(ML^rY g97f yoЫ[j7: ~=<6ӪWVRCWAThz3}:!?ewOѧU-oE]sGQ>8K^REݰpG:mȒ:DsE픲(Lמ)dHՔWǜizN;Q4ϑ4/8н;S>&{u+y׿u BzOOr?n =1jetŤ#x6uIhymNCMdp;yN /8*(:g;!.C@rÞ%<r&@aDDټ"6ep-d*= N-gx(Xt Ywi Ͱ#n(ZM}3e^veL5˒j[99j`[_ {rpn?Umoh^7Lm.iShPm٫(H@9.$d|BC]L5& -}ՁY=i|E8Ch+ ?21uM]={=+ c<-S*Tɓv Jb-<=&5‹Mɩ5!TM:*mSp*V}ǪpћbFFICq> %WER SAxG\%bExpr2iW!Hm&Ԏma)"HiX f*iNyo/ HI8)SFOQK]om/2쳾<DUM`2x{Zn;Y=ato0px^2%RyYjg2TQC9he= Gwءk,ಹX~h=YY wa-2bDhHP : ԥbd=Bg~h̀$|ⱙ6KGG6O0/W!Y(- ̮܂m:4ZߑDJ\֦Mc-XUVa,Om׺v[Qu2ӓ׽-  H>6x͂3u!49 FD-!1CewIh65]nwi31:_ι׶&Kj1?N@s6l:4Y//yŏ/* ! NzܱBӤbhًeK(/[;y21^C,mS9 sr2$EP' O$@֧ 1-&  ZO2hځ;ڕ{Y+XHN8<Ά(hI2NkK/m8Y$)f%قQ6-O:PbOS JS`>(HV05 gH}9=ƲD{T*L;rHW5o1`x ^ ,':lnӅC9K/`jźm^zBg+ -#j{ "dL܇?{C"BI]w%hZ[d1{@8.pϟ.d[}nKTL -M 9D& |L,H'Qƕم@LZv(i {"awھɈ&zXƾⴉgl$鈙 M8Sm:Pٍ<)_!ʶwR|b dJa<l)F}[cepSd*5^L-/4۪!ӓ5{|EG3m/P-?w~*9M,%m@SV>*M[񐊀^v 翼PH+\ПW@p҇wlVvd$!"? :x[ LDFвf{EȊ-gZa׬;̑$^8wMvB"a آ]xOhLAqQVS}.S5N Ɛfb>i~u=!drxzwNv3=`Ti!X{礲lӪGTثra,;>;;^yuB紣A¥ow_a.ѝHg~Y9S<5ppl(0  ?O"gIVcW #;?$gfp{ŷPU~%&޷]^ݹSNOޝ_EӧʼV3F*w~_]wk{qߟwy+??KLP[ Gc kX`7^|@K $cr_:?Xny_|VnWi%3P\ʵÁ>>$!|Ȁ]|_I7=ZDžl=g9>iξ_\\Hk?zY_^D\?;:Hӊҽ-:5ox)NM+vAzxx-BY;]`яhI(yzk @ԁt9 Omd?U>Z85Q5аz.\M2AkOw8v^l&&=ִtYJ{pqu=e?ub[FJ~ع_!]#H{c kX;ˋ <,V0X5dƫ[Q4B!1CKU H`h PL0C; *ߝ^;ס7O|'}V巼sͮo=Rׯ_OJL <(T T^}&4,SeQ`4 N^2ic85pO\\`Svpqq>N;krL np7iFOHِ{ꉈ3Aٯ"6`oK^DÄM8߼ݍ˷|׾/˵t=^i| \d繵ӓˋ= ppqqo!NoN\U6$v @+ ͱ3C1qc kX/Yr8VN^/csSˁ1gà/Q=R!)cNċGOPqդEhpŀA;=v _ʿրʡ Wg8=%ӓ7azYvVifxNQh vx? T8#|ٺshЬ83Wc85p\ҕ?6B8X{PH^#&0sۛy [2 0ˎ˩ɺqErʨ֏F=;b:,XI'no+7Bܿ>CH#2+ i`~ |kX8`;SSwtӜ8L~\pCӑ4GSm3f-t!iLkßvAxPN5 V| xkW&.wpy5pc k%j 4->랹HA1ĦJz^`͐ پ,\gw':N/{kNooݜO_ Y/zoN~WWD쏶bGkX8P|Ϧ|b?rw,b,g; qn7BLqkyCW:lWNoޜޜ{58y<8Ml@*>bp~Oo~ x/ 4g*>&5pc kWּx+MLXp&S)3y q"}Dܷ\8?|?` WNiMx&YSps}onnʘ7Wf~M6Zo`J6 Sz_%zm`CTK(OR<,R#:O?H|hrD%8؂DS6$D~&Іs>N/>Ya\Ce$2qe eQ7p%@AJF_$A3%{dwhioS]܇^CHitg d;:;{w$ Wk<zxM!ix$_ͼ!k4$I)c9-Me׹-AKVz<=$U,y(TO;nm/v@#KR7zZOVxi׮yEs|ByTr;TQ4gbj\N-oy)]0 y>1kWox& 3k2`'UeYarҢħdZoCa^(4P"VӘP>,uOڒT+d-c5VE#@`NRBrԟr{e>U}巺x! :DO!K }i>p t8R*VgBN _~wl ~yB9M1xD'aI4W]=QeNxUY~AL| \3C{CG/AOO_NN3RI`Q @A=J;4,sג#@\N@8khrZLT=cș*h?s.vRc e~l)ħ|v><)s/q2@@ u^4p%?Xd Q)ml/D*Xg0  MC^o%-%f_AISϤRY 2'5WS? pWMtX ~,c#prb(YS;q:ؙ* }zFa@l! r}b@Tq^͋>K ![[wOnvvu\hq./0`xǁuԄ=Q3[}\}٦cVV8騯T?KX)V-CdrOlHDwcDlPH4ih"ڙ ioY3kN!9zʂsr26G~R[!N Ct-}j sKtKUHZ}of^k% uH0dkA?B.~MT-_\}#*`pZ2+O}S`Ͻ\X]SzRiw3md#㘹ASPdn { 9vߕHQJ0)Q)_[h<}02Oq,}NYV *sd]Mrd,øg TˎuҠd:\C08+ɟ#'su% j$`9k~Hz[#:>oXau )`[qbd9tqz9BJW*qn(o FL90Yy/b's*|/.q͜q 7AA~ț4'$xS;Lyj4ˋT`ǚ[x%I+O>~M,WD˗SRT!QVw{Uϳٓۂ#(,^i/| }\ H4xv@!|H/tvZ&y7( \"Po0qoŽ5llDoafK\녨|p  t8xAH&$[M6X -pδHO-I.|ЊPbl9\ǖJMWLKtccKH+^[gtrI?uɥOӧj4z[{;|ڋ.xJ(x y0I+/2gwy\\+A 4݃^IX"*k$:;QC^rOu}L 9U"C<폟G׬::GeSzwQqca/(&FRiY"yľyD)=92"6NM@_mi!zt^>zlg#:$FozR;u}wNߝ_<\|wr??^IOTjUgNSq>1NFFG0e2A41^{4}%,G#_yic8Ɠ[\I0OXA"~78,Y Ti do& &=>x,27gLʣp2gӒgѩ d}_'|ПGP4- \LJCmEͻ뵿og{_i_?Ma?|qu=>e2qÇ0QS Nvx@IDATp~{q~߮UP p± @MFhZ䬻.kL&X DP8y%kd=DgL J3L4z9t&YL0DuCG2){=c‚1 <2Bt5M)Ed3S_;V4}ntH)YJUW04{νp[aDbl&p]Ơ;&5mVG$أHѴ$|5uZ"S'G&I+ 4$-R""_d,kH\΄cGP%(Bd%_z qKyNM.`OmDP-k/ʖ\I,Mw B}_e3H"xW4l,{ig|Pɵ3jZdžGb8gC'TZU{XdKgxطL/[^I F?{/Z>lDq2brV\"-!44b9J; jLĸ rJixY8n{<薇NW'r3ŋ<`9X"OccI1I}?Jˇ/|@C$`7zW Ɏxn$[149é9Sˣ,rd&~Ηe, ] !3k1ul tC^cc0 1y b"QÀԹCIZ80o&bY@_Ckrq-O)nS 5aIs5YMVY NZ'5%*͠QG{Lu/U q%>޻XXOx͢ BƛВBJB7bͪ A2ّ)%SquGxA/1'#D,e<EPG*uS;%;֙V v^fCIGr(x%>^!zw1`̯|r-; U+M|J%F,M|M{FwxDOys2+:5K0cgf5|*^=6},(HPl?w9'5}myvSBȋ@}"q ˣOI0U>*eX)kfe,فN:ڟ̽Rl.eCM R'.Wjr83$1zv d> Q-,xW."L7)o/t"4]7{@|^LE t@@^G݊[ue6bcd<okVJW^i9_]Pv>E+~_NNzfSU>Hc-O@/' nPN]6@xėoQ/b'ȩqaUհtrЪs9T嫽U}6RȳR2Wׄx&#dY88'QWM#>OƁƧ?S{cO،ɳC_eg& ^Y)g">Mk}$dO Kۀ3 JQRCuXr).AQKZ?4y̐R(IԌlo3!ڐwPw5胗 LT1p +A^Rݱ.a'D gpitX/Ӊ7W:"cR둡pr-,OW޼@Z‘aA`/SlG~{Nɥ$G'!rZ1[(-4u &4Ntϛz@l~Y೅/z@-T싩E%5J:Rg%Ayd̐1y4mҦdC} 3;*`!x:eNtk.t= OͻϞH['f !⋆7Bɥ^!Hb2Vy]oiSZei5RN6M1B5Pn[|ծ=\ixܲ\_I|Ģ|reE>-PqYw$T ̀@΀EK㊙Ur(U=.>GN5!8}S`:b(dtBFL - yry0_tpqqr̬H?'@F#4[fds~.rūwHT廢9#6h΁AɓExf }!3Uq(Y$O:rfE1&>4ݓ"AKzB&Űt)InJ0煞LPȕYNbKV# d(Rh?yF" 2JÐU XيP>t.&9HGY̬֟'`"޽(wj3ڵcvweiŽʵL}0jbO5dcEZV:N^`)]C| Wz^5AU)S'=E=âv E98d4oh^jK^i UiyLG5ٙ,Yj^~ċM~߫;ik>J~$3A7'ӿj'W&t1YRA|{pJ_>NɃƳ0|&RZ?UU,5}(e=:С LeA>eO1Y5/A* TEr[B'6 $q25\0!)Qx`+!k/&p\F[N/'^A@ާ^iL 0y:bN3 @҄V*Տzp_Y^bApU*!>&Oύr4 -[2~իW'oN5+K(V m!4L.Q:A" ^Зv}Akapfe S6ẙ? ) !Ηfٜ3A*8HMcѳK~ KL!+LBY$vZ|gt(k4)Ν[$L΂$M挚lU7E]Fo 2۰+5-SA~7?iI]xSy ^'ߦ o-dׄz]n!Ԙ3)W{B@9Tb0HD\5\04jـk{&Y%Wv!B'`WB,#'|[[[7_IĹJTiiFZp˫|߅3iB{77zKGx9ޜ&a ǁZ8G&T`B2 _yJ~S,^3U4 MdB_4A{+V@`{U\} ΐ.\FR[W gdHSV{MuDi .r`eTF[;qZ0z֧G^F^(<*Tm mODKMCcڈ(K8Ubđ,Kl@[@QZhx׀褐L l ]c#(4bpqwаR?^t&aCwҡ/=2T }bvXgxgNU?Tӡ:^wL",흶i4914" ]tWl-,YώlmE.@AoSe\j m,1gveIs3y%,=4&|PVbh FHRsk;uE%PT=gl MtLmؓuqOq%zH?H~Q6o Oۯ}+7BkC rYm_ :}0hR$ UJ 0g$"\@p+87}Lc` qJ9dpo~O7O?{z;/|?/dH8f" ٴ^[t}{d_+֓ ;t|wz{w͸~MR;{gV0iI_~N? rgq ΢Q|2k@pKs_!#S8S9EڃC')T0ZSd,S3U".q/ "Jyf^&OX aŤ'Gv~z7k &hDLlO.a#fWL }  @ #usJd2!ϰVE\˱ jҕxMƮ։뀨 H Fv4lj굿+}=W/r;DZܝy3_~zۓ7îono>de͢lꋞ^t '!c@)ȍ*繡v#ߍ&7)h$v4@Q vv8R`(3G:䃿ܠVF!>ģFBC7>| cƛ= Ai[+F3aQbMs>ʡOhAC,a}K~km+{[]{Q!/k?fY8QHhE[qee:짢ʠh۔lO+]X[R.J/!x~UkjTIqECVs)7,쟇Z='o_,|GPbB;<|Up[Upe=^}UlZAӣ-xjl W6E Wg|[ڟ c'O^*X3BRJ0 Pf`ĢOpj? _1-SVML_0@Y鵞ꋉMtx!¹׮+SqfXg.\[wClw95pO"4:ҊuB| h,iywe{쨆_ c+pS9}KrXj$؈L@t~{vzOB>Kx ^ѻ׻<'_hB$&-PEQy+~&@Lb1kX8{W5T_G?бX 4tý{j.|a/Է|ݏ곾ovN7'_G}+9sO^ů/ǯ^鞿և/?h:_Z~ $R}wvOug_Q>)& >>7z([9cv;2ChD38o|uPׯo5x:5pRZK[ z܎> vp [bƒT xO?~xN1?}h5_C{ Ȟp9  +}.oAbo!& wzO+~N%7־=_(g /6iPN_ށFdLS b*w`sI[/콭;2kX8keI3t?7ĠBGKעؙr|׫~wa{0`Y~Oa~Ͽ .Eqnh'Sv?ջhG% wS^l?>62:C 9]S`QL#ćxb vF!x7q#q{2|D$;5pc kj);x6yǏňy|XZxŌ <Vpq_ >lЂpb{k㷼߯?Oh\ zU=N[X+|i@ ;c8ZdGM-8T@x~Z_-7zX}}qvWUËMd^s^?A/}Pc5otk UDIL iDZ5pc kjV"(Ex83N׈4\ƈblqn (ql/~G|\iW[cvI]}1LL%> j^woT;M\~pO?K?P*&xz?^?َdɑ#"תb7!Z r ]"y&OHCa"lꥪ*3#?Y[nU'܏O7_;G(e|i'6¦F "9\#mx-kxE o`nɟ/D~u@\XtٞC?`*MwZ :O"x<Zס{6e0zǞ4oWF[:SqW _0 }\ne++l:kaH뾆7~we ߙ@rѱMr @}Ѿ>ý2 Ft||9S& iߟK>^njjjj#`nRL,gmBJx |}r?;8 o5g=?l1hS7Wqoː؋^ 5,lj?NÃ8Q?ߨ QMh:KbW@ϧv;sd`gZgԏp"%8\n']23w VGoD zE@xq>}Qýο裀8g8)hw`\rjjji=!vk5'Ϟ8dTq߆> ,fD{_h`79>_9=jYe`˝:W8v]6oTR| ~Ygp<gfѱ>sYg W%Th#p8j=+#O&2Lp`'F[cNx(,/|'m9*8 ⯡jjjj`T˘?ǐq%Oσ⼕|UXd,.־7pi&yw?&I3?j=ߤ|WO'}'4xi`OrL~ή:D`}ioW u_JnLkx_.kr4aHkd{xM GA7F-y ?y8j Nb\xgo~ѯ~})2{r8 VA +߶11᭭{/MOl QËsI>6okgg|? 3:{H>L g1kV`sOxA Stj.^H4ACOīް姮XV1m9(BrQu"Ԣ=MX-AA k[?m`GF(D/&h:=nG?mޅh#"#"o1bI?+XI$ߐW<+ukQ~V(W yL`ײ-&1(CB#i3&L榴%r.S&YClv@xp1gTƔo bgg`] $ĺNށzr;tw4d36gG>3C_<΁GV`X6ؔwaW uh@O?1[ÞS :8@5ۗ'aә|3{!Jޙ0as@_LJ 5y+0a`qj7q`c /t ;vS9zń3mD.Fe%ՍFh p d@܍tsÚ&^\ncq\ 4DvYs,z$T&M S B $15Q,s v W"DE220cCl \xz%va<23q_!5g1khiI#+u,rΉYTMG V#*3Jy$Qt0A@V'8#izvOxKqjv 8>LP1[,5}[㲱gKh%.W>76JV dCp`:i?2@,}HID1F}f?S@Ƙ/=r Y9v6EOn `)^/+pxϟË PC@pnлt d0M3Ӏ di888@4 Yh4&]l$t#Q,Y&M> U rϓB4KZ?9 '#6#Z^Co@B'g0W5L!Dt&*PcK  `| Qg^#!ի(e9hGSUu>h[2 +n~]RBn_SW(6%X-@]m&=4SC#/ADq`ؒhI=bl8F mpFc`[kJ@ =@d4˙2:Ct0ny) a+Էrqb|(!D!ey&CW+fklK vJS6Tmfb,I3)/S[LǶ4ɃǗ6zE@_:2~U:3{ð#G@yegC5 f9.?~{ߛp>1TJlǺ+p^yå|ӔF"-_`+U?F`~?K&PјѰHԠ'ga J wH¼&"9梬 aMn2$II#0/\(He-s yIT(k5. \U%Z%^9RHX@?Z ΐ.Ys80d҅j0fԟ;SA[&)yK 0j0Ζ'5{V18P+#=1O:_Mg)#jϦ?pWg]4YΉ~W",eqF*_Lbe<=NNY]:(j Ge)^S{ g`ܨ,x` īb@#;̀hr tfl48v;'ڤ-8P3?A8C\9\G x\zG uŕr]UoVk;’l%b}ϱ/TCH9[e8BDWl,I z&8hvIѦ_"moO4HB|ȅO!OyK>3= Ө_L*k6RS&5+k?"7!dHf@9v7GEtݿhWXmd#͎(LYBW W> E@uɸO|.L+XLAg6`4_PRrz?n0镞|$]S)hwC!Qu\~Gr>Qx})'#p.n@SQF9y4QHSHn<2&g_zgAk>'#Mg l=|jj`r/duihSXmN4+a>)Bo7[7+z5SK}hkJ, 0߀ o~+ q=D`M$ó9w_y OШ_xL63xYTo<ǝesu:xAO>x- _M-2/ϐLoi{ ?-NKli6y}!x.m|/{fL h7 r^h@B(cy"NIW 2_t 6H@p`vկ>mnfi➁Ɵ0āMhV7B-kw$3ey}aiƅtǏYo Hi+^=X{ XT3,€|͏x1_υ@JP8ALAy-h@Q8'z7g|25]÷(<փHkd$=/8JjӚϨYV~ !?ڒ #{/ Fc?Ԛi  /RLeɇ#A֮j^D%)6Q! bi@=gFZ}VLgFz ll4{(9c]> }6FT{90FS X%|Y'"~*UơLn{;HhS裏>Qy,R/UUfh&F-mJ p*c 414 Qp,M:=KDljh?vفjP5P5P5pk5@?<}M@ \M~@, :a#ahk|)3Rd4%Ls0v땾:( l:i^S*B10~KxMӍt/v{'O~΂8n`1t3{P6a )%j!7 N)a{Ljw*yyuc#*ѧMu^667//3iS jjjh.N9G"X%8[D=٤L_d;W}ꋣ'+@^S`}M~tPe3OֵA]:tUNa= g/:/_N7fz:.^Jd#&?*͌gAya9H|$$uTbxa$8X!-vbv5 oP5P5P5p[5\0`sxf 9g #xC8dkUBk>7DhB|x_hLC(#hETqPgМvw6R%nyW7n:YgIin]D|Þ=?2G. -̟яti).c/ 8 +N92TPK2:y%XmV T  Ч%S{qnM_R>H?tR SV ].5'y=߲'@F# jv> Gvc+jF |\x8h rAO Ucio J܃Yg.A5T T T  ea.%[rb*@}lĕLOiˁ02褁w1\A 3O濽T6^w[cW˿6O .nr9* 5îwpOL'F3`XJ,|\ zSM.(ذ$[5P5P5p4d5JqGM{c!{/_g"%_f9/L2/ٛ> 䯪:ф?=OsHjjvIvdMS]cPmƇӊdpq4fd}#oFe;$f@3jqLH. >*jjZ4橈ǐy_3t8Y]q&=v3~X4ƾ1zvrY>l3)~7}U}ur&hB- k TFDF{8.S0$v$BnN6IDAT`ǁ $$|;<\+B땓ѰgoQS5P5P54Ұyt>"4d;X&L+l+r Eg?AJ+f? RmG9GO<:MiXޞ5oʎ'iC=9?pw4~$m?ǺpܡG0GCrgsKp:zd9:9n js`&Fn` O2M?zÞBț3Р,/)S~GYDġD=oO[ޢ5dh&ŋ6NNOO74~]5c9gۺ_ȑ"M% 8q䯘LuŔ>P.oڗ^x5lgZzzFPfԿfvο\G4_3#BT/f?ikěI@PFqNvǺ? d|0dek{, l(VfTƚP (Ŀe-<ߪ[wm!ZJBo;X?]՛:oF+xSD8}ٙa3(Sns;w8'"?93#؟(G7~nd^2utB hr@ UUUwYN-ɏ%Ul 2V .J#|KY?uM}-ܞw'Nu񓣳ߥڹJEM_:ד7q=ZnC}g?٣`%ÿYdVq6. 3_Sz-%m'/B-jjZ4o+%Úڛ} ȳ/+v8 7'?goݮhώgdxvOS"ߓQÿ'GMWч ,+G,x1PZ m4RثW`'PgP5+Mw58їǣx;8uGOw/VX6~36d{{{{yvvv~G 1;kFy(mU٫ޱ`ծپX1p_hTF:N}'sMkJx"8QZ T Vz.9XӧO91f>Hh?硲wWu~O[BE' d UUUUoZiͺ:zřvkD?O騯/4](P9;ߢطNK,{4C|ķ0@84X>ASG2394~cplpn魂=9 C4(ǀ}jOS l ϛd6@H@8MBt*LBMZsUA3Ƒ'Hb$&K"⒬jjk@ 䕃:z"'i= OBZ)8_kPHsC͚j?h7ߋiwϪ͆:Ex`iM_sHk:nM' 5D<1odo^\8Țq{7e!869`<|qg/ȯZPb`ll'A5[eq o~lq M?DHͿԥ/:w[ I Sft BNˣGitzg8uѨw)\yKP4אajF4}2r~$"`^-љv h6d鋳17ռ3lj_ߔt (_{&A\Dp饐 KTB@Հ[\EJgaD[#[\Si]ZOu TYigx:jm_Sݑ;4?SyFQCN+N'[ƭa`Eip\8A@;cB(~So 07I"NؙtFӞ?5A)m*?7x'b!cȣeVUUKܵ _6:h: fG#= <[\tfΏiD:CMA;0/:4vk4״3mj D3ի|ÓɉFl1WFKlw9 q ᢴd 0ߏ!7v!x6|>)<h20_8;xOp) dC]]-ʲĒdfiqԃ`;^r|W T T Ӏ2d0=h@7-f4;dcn5вr:2;՚ 8 5yy)/!7ΗJs+]prEx~@FphyyZ\iBt0՟X֏G9|I'm:i04;J /2@tp1=-yrXx(zكy٤i0@.ҹ@`n8'N0OJ%znP8]OPnNWX5P5P5pY o8Isgz Kn~dp<`ΟӉi%[(;2)5]s}txBN'E"?h4h( yJi8ş8o^E]w;iE 841ͼ7N><~}YVe)q@e`?UUUoPyJܗXEfcl ti_t N]q9/4wXP 2ӠCdRt|.t~Op)5A~grjjj i}Ky7gqyi@yx~nb >˳ rs)7C/O#&/:s:q7a: u 4yBh<FVsߖ i偳Rč7W`C O~8҄REy )u~?dLF4#ix1n:?u~p\MWE<9=Óh^UUUՀYi}w}q\f࡙\.WN#"u[4Z_uO|!e{״Jyx[6_UUUW@nɻ.m[- *;e˱|W)e:k|Wr/ǍkVb=`S <oCx0;nxQF8wk}0.i ys\,Fb~pr|V T T T ӆ44'7ZfKڪ4Uy9 Xǔ7xhl4ܸfhbjjjVh 7T4o[PIPW{,yxr:uӎBxg=5]5P5P5p5#uEˮU T T T T T \?R2yiIENDB`ic12&PNG  IHDR@@iq AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$=IDATx dWuOKW=잱=v ccCP5 !@"B$ H@%(`H ', b{03{W?^wwXʝyu߻ܳs=1{K'Aq4oI~? S TOS5OZNC=z{wGh O[X=0b y.%,َ-NXXx-`,MVImq!8;SiXMmja; i[ֱb2fe)˧6[nNAl2nՖF|j%,8J'mx c? lhޯ_|iR-W?yԅZep~nXlcۏl!xfwUm/gѶ[V6\ؑy[O-UMv2+ّ喍`QwO-X#[5V2{,Y%R?O/[#ghl.ewbsKSvIOxxn1p˗_{ ?Z = @KgAɄűfee;϶5'`: BqiLځ&ȎnGWIX=w4?tsb0FGa(KT~ 1wU6] xᵻZ=.H>v?ϤS#< ش!R-ÙR d)NU%@T$%pO?l4M.)Q!NjCP6 p5. Ja剱vU+wf*`/[lvKaD3%FxNgݑ50!pcڸд`d9=jvxt=R,IԳxBec K Vk6^n>/ {p{v3/rEeA%4# 8xg ;nB+ 'EH`jopLk|Gmzv xR0xH+%6ۉ336IO.Ǖ(.))DN7mC-+H".bTÀW_yײ}FqmmsL#~#UK8#kV>V"%RWp~٫   ~@pL#(Wm<8B3V%1OXRdED?'%aV 40xJ0촓L>4Q\Jt!DXRTJ֊gwuڪ䖘1m@KV2gXΕŶQ4 %L&bE@ɳ%',s\}X`ʬ0bň/n% Dh_b(z⨕~u2M(Z &ExaV^c,[>XD11+X^[Ei[nR`u8\"G׬]l0pf&:u VU.[j=u5 +aůo=6~Ǐky5G L 7BM(@HT2ɬ2ں͞RdFVU! KK8bFPgL|fN{p[֥Gk_m^+~V:zONdgݍ¾|R'p+UkȻң V#ӓ6t:c}YY-Y!dhf[. U_ ƃ nUcА49zT ~&ٯ|Z{}dre݊yӪ%d%âşlr.G< y~iFGғd'1vp~z0< e̗%8!5^9CN֛mW*l3P#_&FxͺtO1$Bۜ0DY} fWjlxrLQWALL*:Sx\[5 Ȱ\%Ek+٢gW_!Ĥ`d%so}e_Y#> $ichҔ6PUc5wk a{GZR(QݬWHq|0 KH53B j5Jl#0]o\mϛޅٿnɏv ܀t ~x }ݢ>); \ƃm-= Ќ;!tZ2:R~&u{I `N-@[ 6D_h rMȰyw &{]۾ok~Vm}ϭhbR]HL݋3HωS5xj. Rz 拨kΰ[ٷ*ۑX!)-Pp=he^v\QRױZflO[>leKf" !0H&HxoDm 0C 1"ң1%".F^Ȉ1W6(]tc2}O?تW,=n`]`p1ܡ#K-yL8Vz3i*>og-( )Hc)^O -,p\WOC;mf-N{C7[Ա0!R_!$ &ܹQ,խDjCI0fN43]3NF,6K\DJb^d5ʷY3nOuL/}/+%[y;lkނgm_?e_XH!=i@).On!]vwC8O59Whq4/TҸoԤA͋'va%fhf^3^ŠAa_m6pUV lρ_XT%zYvWKh:[~B6t.6t{]6زo-=iFiSD4*RbdFuF튡rq&;d2:c#_+7Zj`ȖN~}CRPFYI<8Ixe4 f2PG$4%i<؟k,I,Atzٕ;Pvq[cծ[aO$bb:(^r~:/}N}V[#͸pv]`u͕M\(ȫV]MGhG `ˍUYh#Qz 4z%d.W`}7^d$e ,=>n/5דE4`!߹9ǵ)H`hA[X@h'J[2k./@gOōҸpb*:׈X 8u JXAq k;A1 RzD2 7 uV޶&a*/7=b-Zcq-pAb:!^Lð~7θ$פ(@mVw6'O" ɗt&}1-[zb ``V$x~qʕ*U lY25~}cBr}#}P o4٠4W,U^^!ź$ Ɠo2cmEΐ9M{HYy$Z hv:͟^ >)9ۚe K )19܇9~j׭>;m롖A 98.5QjF% lwlhA&hQ_Tuܠ}=_kQGx:"@jEcBH!]CmPk\CC܆HvNM֭" RܖD]OtOu \=8rn  yT-U~B)gP"Kt`GFURE">Rn)uՖ8ٲ#6)[l=GWlj!>-UJxBfklh-n)>Y=m]vwD+c#[{}Oxfń2ңɮwrKM7m]fk̛:}"},c%FhևEߴxh^CYf}TUѬolt ۤy!Lw9=XuI^ػ?*X*޽6VswkğZ|е*D6o 8n#ϱ%^9({vs>T{;7UD7KR`a.r$Vi1iud<w$*`I\*:z,@rfe>J.v!DCĪojB$n*Odp= HesEhwmyRH?N6gPۅ*#Z=~))ʦjf^E{DKJGՃG1fѨخl'mRI XZ쫓-f]V~T3Q,yФˌǃ"B[J)kv}e6t<8apd+90ȩ1{ spC ^GBU#cx&VxBT\T}Ӫ.s6-|‘,yͥ"!JbwcWՏUBk/HȽ4\ -bhn!jkW,j꣏)K[\F\eaa 2k`_w(g#kާHxy\`%&ؐn :+@@^Y~dԖ $VWWmzfT &Nsˤt/DάRtAa$ хu' '$R4[/$E _0> r['=2zG'_h~]s56:6J`liD. Lܵ%\e~]ؐZ^\?U= @or|jjʾ/СKldd#KX%CWYlo v=tEnh[Yz@O]H 9t['╿C6;GmhlgW(#Q}饗@ WI azⱱ4 @g]d 9>LYW3Ss$=S_{4oQ.QV .i,[e+Q@Xr x,Z95g.V?_؝9>E7όWf ٲy>ڒ;"rdc]'A3^dX\H  \^'=BS28'lVȴu)4It_Q?̞`tIgnU%X%3aLiP~IENDB`ic07r܉PNG  IHDR>a AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  @IDATxmYU;Os9 u+Jte)Bhm;LVz{t<1uS@ѧ]^fh`gK1Kv >S~x!ӹ|}VFIORvkw6_or^ZR[׵^{sm;K6-??xСq%/O_o/~/.F8~f6wߗ*ј{ژg(? y3)w}U{C>;b|x.Ʈ|Rnٲ%>hIggO$ן;X|-Wg5Sx/xX,Wt&)nG\vi9Z FV)6LPj5Zu~W7wyu(U|-UHlDok D1J[5np:}R^.9--rusT}{?_}c{˱fōyLۭWTWiF-&k}k?؆ki\7.Ү𴏧oGP G_xXY^`_/_e_Wr*HXiDux 9=12E6 ,7t0 ?Kgf]\D7Q-/-'Q.F46@Y}5B4WV/kj\geՕz4w&Q)nV,4uX7+ԓd}6Z2ԆFj,,8*[g`L2lQoF 3ѱ q샿{ˉ?{g&=Xz#,W~_ՁW>H@jAruH|޸ݸ|4jB<Ј |i0]91_wׯ_c:=or ^e s+uܻ{$~+b!u{H31O2վZ1;M{E{쭷Oqqx3པ]i+Gm_9 go;Fs`G/ǯ}>(Sq78=3Z3P-uX{e&׌]b~2X188}/XZikz+zKW[+APTrА=3 0_}hAװc1cWL 6b\,#1 u5;:^Q)r/HߝQuv Hã_Bq{胡FZpJUGhѬw=}h~F5mƽTt%f[ L!+D {w|X #~)բ߉#1s{ Ũ`rɉصcc0^8@A'cb疸/ǁ'y[.f1W97nZ+ƶgC[~ha~w~gM<ۿ1$وj iQ()kƙx;ߙDطo=ϊVe VOFy-Nu[?s4bAj|`+D. JgNDkH*CLFMspVG]?8M.+90~3;1.J(gO\jG1k0CQY!Ň Wm* ~O,]\xr)^W^~=Uer+"|*y o⦫/>{]m~ZP Xh_BjI`GNmA7ҫL>+z ҨA9H~ˤI@D,Y&ą%D(I߼Feƙ`ې~fl pdR/sYsDZ:x*}^X5 &jI>"뱈?|*nrS̕8 Ѹ[k['HtbG^}{Jj뫎x?M`n$&s04c/W/?R5.T$pkKۥ-݂F %8ϭ& _-S,h&\2TKtп:TUex(GFX@zs05qSj!hMU !J˶T TFEW~`\M&SWhvdO.5}2i[uƽcubWK=l{7^,74B~U! KA${A~c(rǎ[ۦ0 D.+uEu|p}R6Wf4*i#N"i6HAYIx:AT[)aMÙǾUۚP4[ֿ@ӴhM3LMs̋Oo)0D ԜQjз_$F \ 2qe[mӳo..Iajdg;jwǽeVsC<M< u8 ⌵3 "nzT=hڝmbn9qA' @WqR%"ih?OՍ" XW:ʚ .7恛k0`Uk LE {lgyjFÏ R&т4u *WF_Du BM3J0ڬN_eʕj0$:YB'udf!cgvD&0ܚںhS(L0Ho٦O|hKOOYcdHNJ#Uhp.QVtWئ#ޣdϟD!wk_ )7ajS~G)Pm^A& }L딕H $FzٷN~~qDJiK6PT[w2^Խoj&ضēP2N0Q a0eƇ-_N LjJ,A%˫HصkcLjQ]k^B-+| k\DұL]ƹrˆxYe*kPSHt$#">5lN `$ӕ8;XQ:tʲj25GFS@k(o+$ dfP<cUYap̤y731VRG`/=/:?F΅D۶;SUJ`\8z]!1:\U(^eJArF#Y$Gzp]N*-?|tJD!&ۦвLJV*ɠ(%[GJlO@Ar2 ` 3eo QvMmȂ`lQqAj¹pV`Z%xƸ[Ii v ]%91jVɞ8OU?-2= CdTKcH m@JUT/iz|"Z!I%?hp0\q05!9=nKx*S5om|p\7R@T1r%\a9: Cu H6o~ -gdA:DjGQfa ,*60` 0L'B gCdx]J6,c[_Tj:P˴ DlQP j:# S(R8$t쯹H2 tFK )4cNCuEFu&r8 Ă;ö"aI%8#Bh= -LWG/kɜ W/}ZRN`DCz&D9 t:d(&8/4q>eciT!1j M⦾Xa)Jd f10HZ, 9i4a 4мCZ!LoGi]j(~j1}777mWktlzuk)ڳ0{]boܖ]dH)`y#pl8SGc鑻1ZΡ jJI1H AE1m+a͏&Eh31)Ն% VCs$+'ͫWck:TÑtqDWƦt59lpMDIԲD~)cU&\do+;q>J^$(cu\`C8f aꠔw̿o-g=TC;]?^^ 0|⽌Mvg؇wb!f;vN)HM L Qh&G]'4M N > onXAP ޮR,-37Zgt z|rh: XYɪN !ZsPLf uo{-u WMf 7\qML}}q2Mb,Qf5!28 mW8e ӭ 'ˤ)j{`fΜALgVcGcL8g!EC605X<͵R$|\ ^`|:HIX&72N@*"Y~ l:Ec %f?cqd1L!-}UM "cna>1;33LCJ{ 2 S6M{Y!So\5;Π8:t 3FUM3L}'_MLz1KA[ʫ#h*3u"ol W4vu1~ e ķ-~;'?q/E \5 t$U”*IPQ!L C7D^LI&wI58-&ZVjL4y8hѓL2$9N%lV)eb1ZñYbƬ?d6鳲ˏ!144q<,:ytLU2Y3#9$8hS> LJo)n=~WA M*rxUt(Œt9;s0Cr~JB COŖҁ V:aMZC)d3׭o]?0S1sg{p{Z3&0 c wCRCoɾapO%Z@ؐ3(gD09um~clr2j; cLJuQvs2k=OO u%!#̇#Ew 8U*i$)tUqb4@ģ'N;Z@5 QrR''j; >%j =w03=T \U FIjP۲]`lĆR%f=*|Ϗd.5 8?xUB\D±ќ1;`3cW<)&Lm:'֤Hm81cEK|Nc %xpă/ ~xud}s[~-kĐPk.%Ӿv098=_=?^{3O2*L&ue$8w=@L1!dJɐ~FpI۹U@S2%x- >vO5<ؤ#wÿ,|(pfJb Wnɸr ~L>[d[LIa !}hL8BM>!S(# [kNf8z2@nJ+(W(p+S  G=6ߋ"93SsMe$aaxٶtg)S݁CI:%Tݐˬw_h3NNuL)D7^;nU>LE'@05Φp~LܘلUs1Eg40RP)BuWPzjYuh$F=7vU* ݙ|&?fe(+EΘ0 Vy 'ZLb/(Rq!`-cn3:v`L{F1\ m:A*K?e <B?#*8.`PMoCMaWl&8v՘Zq|sc'kKkvӻ\p"+(Z&AV@p$ "Xť" 0#C.K߶VbhXWc5v]4qc^g24+GfjIgͼrUS90fP dK:B4b4b[.VM>(1$H'p}wHSځ!E>hn[n!jٵ ĞW>hL .sO1(00$$!>jk*v{zj &5r H+hJȖُS1ݺfߵ464h黿ߌFm)BJl|F!SR15=KŌ8(w ?N@(K0^;v7\h_R$-)+&aHǩcEA=5*9h MpH?\iAEr4 ܎ĩ)V3>LUL9c3TcIXRsz<3@DT`پiXc H cn=?߄&@;?0$*IN =k|MC:AUf |)0>Tig sKCƐc)ԁTC(:-W heZd8.$ \;+||OUSHtTE#3!gk.ף+'ĆZuDj9JLМ+i۵HD\ <9཯c=O]ӑD8hp*mxkI9q?]v28фOMŷeA|2v,0Lƒ7BU8mS.8W<#p֥%0oQA@Sq.I~)Mjvx~ Xٴ?8$J,$0C4-v somYMc1=q/XmYmb֐A9<̌.蠆򷒟aR[٦;YF %xY#VQkE8-؟\54IYԡ]gk`W+f虎o?qgEhA=tn %rr+TMC8];& ATMS2xm9%Xp@"4Fs<=DDMGdcM_ 3xs[+qebYwc00*s9|8bP ~A//߂jbTyrB;_YHu!]-ߐuie\bcT) IJKA p-CbBb{8[1s\f &6s1E&,'z$BՕ iWRR$D6/l4)C1o-|XH6xݿJfU v\J7F I%lx@;"Sv$?g8 \Q0 mk2U^:4:2Ld&Ӂ/,O!9,ik-k!0:z2@Q@ڔ|J5%#[$gR œ"~NJaY8O ({ [GF`H1(HZj( JxR*LZsCr׾{<' r^7~=q/ID&/\{եI 1AA"`f3c) ΅1WqXʮv)Di]mz7cRN$%<]ޕ@%|.yIŧ5gd2gO/KeDA^GoP E;SڵpPaJhhb]98i$I˲%D XX8id;|*JƑa{ a,Y|؜"*)<'~T _I~8>C(F$A\ف3޺ϻ)Nh'= QA&@; 2 \6i@'TdD୲b$K:HJ{MWl%[eER/9'c#$rXGnr GJv6t0u:]g+WYXPsC)p> [Q !7Gu<t(=N6JGj0k)24"N*lmNpaIwC5`R2UՕTp.rPZ8 F xd2(g N;ƾn8=$eJ,7?n~Xz2!e"[ǩXb9/mز uKCq X =ݚMDPɩTpW:VƎc3(Uwb8 xPk}r}]hERjaLVQKge/s&fuL !`2ʃx >~񾌯O϶ @g"JJT9l37FLV d9Gl9kKذef@^F(Ŋ{GN7D5t@N@ _xߌScXld3rq'WR}2~MǎedDZ:f̐"KFcz93)@,Vɜ> .lVfYtB S6z.۪5iOWIfdLT٫ )IN@j2&qx]{s|0oنӧG.]2F)Rk0s'mc Go~2KŨ>~&r~$" + ӣ1J+!dX oNI48~E]i$a؆[9)Id }l50>hUϾylu?SSԵA/3qdG: [wpb 4 Wu p<4C's=ULA/}MmSn㤁[KZsxX)>'J"iG#1%, M9 -eߎ_ӥ$'RWh^rNyc`si6b6펵/|ilA/D_bӈ>G[ I̗(4jLӮG3 7u 8t"0O8zjcs9U;TxI{ff&NYK:!5a:Ր iłɥ,e>-AOþC4ѧ9"7/Dz:4`bBWQG9SmzM;nWEڍ$> R)]R ޺Xfǥ diE )qHe հL@ܹ\ED9RVjrضC1Z5@P3SF',8Ƽ =B|x% zl=2[3NΛEUiݚ|VyUW!&'ؚ{^a`R޲]ɀ`\uY#msl &upF2Sf_-"d"iNPR}5(:SS$N>oSŇؼ=x+4̒1_2J mRf`df^<)8q/`'%| ښ38xg>/ZN] ȸM: 9ʘ $Ѓ !N$i{=Pkt䎝!,)ffʮE(;fX:h25eD 0f&)ipddWiߴ跋e12O/>ʇٹobY$SSEWс1r )2>fOi%j%n 7<\H x q^$D}tI\Đ:,H;y\sAS y6[ :$!HX3 "C<`0W\*mo~aV[ij* D[ 9-Өvsp& [K݉I2^|i2)z9&Ƭ9&!;h7܊Bx")r,Μ:z.&€TO\9>1݊ǖuE ѓĸ_`B[9q[!e`J}ADĝ>OGsݖG7ӗR-9QC%#򞮖P=R- N-n])3JҔ0.ϧiBdùGsơ^&,}Hn?)89˄y=2,5m2[wT24 b}O(-IDAT8nqglJ.4EԎ8Ptɣ'lrl}Åih*)ƪk'~6[÷=*-Խ\LC# dtsDr)9r:c>g>W&yĂ9ǩLM̉腧j6F$ګr+} 㷍rܔ 7WȨe\ '7L&ΠFJN\y3|=sB1ޅ09bj6x^R2q}mxYV QqBA`f6>, 2+t%N8g;04%G;> MvwA 3C;&xtjE(h fFvN p^l9DOyW_gxDN+{zX&ou\:ի.]|'P}?ZLԱ;e;:=@c owrQMJWGiڑ(#ԕ|I Kҕ& oYidx8L$Q=L aa)4)A/\ZrGgU.&P*Ӛ SeoQ,"mh iLFS:\P6Fݰ8?YJ0ږc/:tX+[Ʀ~˗le _`Tfb V=QSru W_ھ…ѪDP>%d ?fgEDx,Ar4Fj}4T2`1VGRg8 P!4\\cSʹM&iS" k.$zfu:'NT1Vdd=YnQ4}`d<}hx<ӎy-/c~셿= rbs8&@"@ն+C. I㚒6JD̻0tm>/r7}a߹y0: <)1N1wg]QGŪ[fT&l+T23Pu2%OF0Nn}dцh:X"Z^082 huw/˩/':)0{oGZ2i K3D?J\:E' MwoeN2u̺'DRxpۥ_=3U|+K| vAjZ 0t0pr[vd*C_gE҉Q*:n%t&D6WmZs5n%i} PFpѤ)n>砉~svh:K$l o=〩RS$am^ &x F%ޛI2 _~ KS5xFj_XR^1o4;s"r3ߍe@YgF ",_& H[OA=Sf֌'0|!!:DIFS's9kl/%ULG=of> ,ie @A?:ɸ['TC]gT/6(DQd0"i2lh.<@WD*_aR/l5_&8rQ.8z2*-`-Wr.QmfQwsߘ al iۙxW>D5&+B %z% =&Z|0UeԗYx5O&D0F:-[RMJ$1濴,Ŷ!HLVH+m抢`sQ)ܛc6 7p3hVL; ,5k-J)JS"Sǘ !*a&Y>M{ESwA$cy|%kϦ۶1yYl![(Qukl B`5R0D`u,[@s*?7B UBd,VQs!BSl FaIK2E:gT.,\^#E}2_j32tAl?=M@ڧBUre2@s@58Ew6˲,"BlUJW1~5 Ukga+a,&C' DJB*5SOP#H iEK\q8? :`FNͱjLƔk <5ZG<^@V2ɕ@E!ݿu?ky&*L<y qa^$pt*5:=Պ;M5RY}8wJ`EYsUpe5Ub6lopc &e@dIppB[Twl1F"[ǓKNfztבp*1OIӥBizXe򇄧Z@`{NB'[fэiF *Ff4= s=j̣FN0%|BXN2%S`c/3[6ĖWw 7[ő3P)W 6C#3ZAkLњRũ{3YGwq@B'p@2 K]:fL5/8\i"ՙm \}~m¢ JPܣp u:-01 nr;"ϰJ9I ktWY42*pI"1Ր͆cπ(\5btK[*qMXs&ė,qn2<'dh"b/5 sV;BTe~\ Rl[?WgTpf' _4 JwƗqU-&1n_;qPUʔŸ2'  ,]Z:7זRL{c i;wWUo%iAQz{q/͋Fw Ľ+h[XB1'-%_qerj+}J]+K\VE9ȮI'ڃ1ChA\exKmNw \Ҝ$+vOaxI3q;AzݧzҾĿ-P9+]yy5YANnSdr =aZ c~c- sa7d/m+]ӫ1\Q+af.L4h|ސ(µׯ?"̗327}sڼ ",'E  ,m='\TE:w=uh Hmz_:G_sb(fǪ̂cҥf2u 푝B6IOĘR~ \-BLܒ.C;2s`|x.oNuwEzj=9JHAD$F4{-6oȅ]˥p>3>rOEEŷe6"vh6 rW락-,ZT+gt7-+a△Mm2쑱z"]x:%~{u&9C[_f3e~RgMby>>S/tx厞 D@AXKښ⩠yp Nyu_vuos5/u~_XSsʓm2.IbII|E?~k[Cި/z>&K@EÅ&Qضc/$ )f?UU2Q ,t.t|^_瘱W(兌&SW $|U1ˣfu`wu7~GOPȉ&t7mmlv豘^Hl  &75"1f$U"u9fXf Aws7~E9t鴟N%'IL>uaYg7 йϚ䑤?*E9D_ M5',dS\I.~uew~]Yp?4>mgO~dU,}ܺcw>|8G;۶meswPogXz^'egy^%#PLS9 CafRGʼn/DV-/te O_?G*8_$.p!.+by橸'1Ξ J:T:{C?Feqx D2K @ ='SQ1As!H‹ 9w%Mb["^BK'2Z5w[ޑz_-5=g[dMO.ӄ|=lޓ$3S7oi4co!;w;ؤ0Jei 3FJ@Ub(ˬa$t\z<"V:5O/]#۷V |wo:|Pn`Æ k@ʇT c+6V<cIJ/.)bG䵤_yJ5Isj~œgv!d3rАg5? 2?~>$oK k+sFY Y ͗QqC_-⟧x\6m'O_s(_w}d Fq3Csj 0 B 4JtSBڕj)[|&7rCkUxrKTU((/OYn%Y ǀw9qL2%*Z752d"ܨ5[h(<RP'LOvd46k6& y.F2J7D&5j YDڟc%|Ey1$OuܲGǵnLb}gE~)Ė]']StKXچ틹l;AJ Ҍz> ',ԩ_UH=3Z&$!ү4;@_<|} }(gϥOIc<댼S$#q=lϻfRAt b/_B%xel8շp*oJөOtXqD <LcY^'}}WC9eI$)Dޟ~:v?z) 3Qq@"(X9^z%t 4voyjB =!4")No[ BK qljyf(GO}A㤀ױMj_!qAԳ?Kb4 Ǐ֯naрgy9󮢎;X{_;<=?_bPu(YWqѪ y)BAě}(`A&V^´fk qq)].>U>?1/AI肐n,a~VFK]N.ԉXZ ynrɣ'sl߾=I t~_Vع<@+‰$8W>pw(2,Ӟ&|ͻvJ{{-]ϲ{ηwZVm}m/{eEaߢͧuen݁lcNG]\uMG~vo]Q(7>[:` {RGOGH^\(ʊtVu}=m#-?-_|s82cY}[Թ }щiW [~< 4 ja(3XfG\g`81=ŨD ʣy ^x pس{oh[r%}YbtUIt*e5>8C\K5~R 3~zP0xkyxwy}j)34N̉=+PEau%>ݲ.sqhm(s˒y%>Kbw -K -}-_Ua/j~U:.7** D 鸂e\|O@Et!'ȅv=:1Ab*oɆQ&&̈́'` } f6o%:['΂gO1w %9HK>:'~ [!w?eۓ4 8:#1~AV)?{\6mn9ӟT|wܒ/|s^}i8KlIͿ򬠿q3H«БBk VI/~\@@@Id%pU^]7 Ѧ E(~@|$0CJ?|qPOOpoxs˻R޵NW)LZ u˻Bk%r sO`Թ^18= p0Gjpu,WL9Y؍Xa &`mqħP]'0&7voW9,~8;γGS/sat/Pa~bśoU 6z޽XT3 'gSvO CU+ry͛A \Ϥ!_cK?t@H9P|`Wane?~<_DT/3cH!pܽ͟-YymS,kǩ7ႎ2ۻwEm]&~ zT]!"0<~5Wdo3̋gg7g:?Vqw?λ0rt D@8w2"A611.²f߲Mq3gs2U[lbuh&7ldǏeJ)%lo4|mxʒ/4)5 >]|ܜ㼹e|#oL;rh<Б%tgL;)׮];}z>!jP}d\+*9:}:6M1Px<% t!1N {n3!?/_ -)xj]rŕ/0Z\9_VPJ5&: r13gfcfj&Cf-'d{wdz={bǰ[ XG Ee87 g,p\%OW~g] +%F%J+ej^#tHx2y$(T(B"\xo/^{1b4>s9awggKejL کM^*-/;mPYj:P+ OA~&jMCkQrU7v=- [n Yj_=[4`#>΋Zg?O=\ܷԢ jՋNgEA[o(l D|(_,?m?\?-1%c&OU[JŐNB˻";Ë0li#:<'"֕B[',wtbT_ h { #:.OWzQsЖBAEFHIJKLMNKQZ!)4,9FHGE>Hn9@BCDEGGFHIJHOS! )4+8CFA>jмM8>??ABBC@^IFnFENP!.<)8AANSDA;99:;;8Yx@CDBKH +3 4A@DLMTagnsvvttyH@ABAI@!$2+8=@><:978;AM^rqAG>*4*7<=<;::9:975446;<==>>?@BI<&;.81.3767632K6)%05Ztx|ys|x7)!*?Ղɼz7)++w΂»z9;5ςøm7I1-ԂȾF:$[):k H?/&(+-CKLKE==- $%(&#$$ ƅ _E;=<<=<<=>>?Ia+",$6432212123344:J5#+$731210..-,+-121233Bv"+%610 /.4DEBEEBDVJ-/00AU.<#6/.,-,*mrZNJ@US),-,>F"* 4,+**)!!"IǛ."()*++*$,%2%""! Xɂ !" #65#,%1# $S !45#+$0 Mɲ+p A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$@IDATX Wm\g~܏f)MACUTjD1`R!(UJG5Z ??PAiTZ6iv;3;39wL-_<.y^;w{_ah$wrRBs sZy=et ٳyڃ[)LT=d9'b)<ˀJk8 bw#_o|5۠K? ajEibWFT+&)l+@VB(so[^xO Zv|(5u`;8D  呌Hlzr8gVsB+ػM_w=sŝn|i/qρGiFi"Mr$i8I "0b #>և}8ܛ!5ߕ 6\yqiPէV^8Bs&eSYp&^)mtKj1!uޤ oDbVpG&qIlm[* T Dۑ> d&H]TgcS_Ena"-B#22'uwۆҞ08)|Qenb l7̾*R>O{=}ho..0~Pyԥ\60^$\Gsqĸ)-$(p lF `OSOGe !_Nɋ9!܁qD %sVlԑTN!FBN8›я> DxژY&>b$Sܒ(tYh+'o*P4(3~;qßA_cEvI΂&R(jk}z( p_Qm9 ' 0u-XWoVk|Ef 3EoJ+K(ӦhhKpa( Kc4oO|~ uAsZ铄K&޹t:#ŒtMi@VGgEDYN;΢UGzȣkCLf Kܱ1V rLN"$硤9`߷="j< U|WdIB.AGmԬ?&"Q`lz^~&)+7B+84Y`JaA䤍ꥬ`x ԋotfnf 2rUdpasc_d}F)q#izk'gq.2$GF3 xiڜyTr=lv`3XG+1Km^E#Yx]'tk-UH,5tWD5D".3)G[ OSSxX\\Xj̨ZvxLK)!Pyj_N16Z[[l6'EԩS80?OwH%{*wDJ r01uڹ(1pٹ&.nŽֶ&0núνӴ'1lȳϴ(1i˺˰%/jƼʯ'1hľ '1h 0m |Mπ ̾7rŀ µ kR87>FS]L<@D"05:98775469==#18@ >E:.n PNԀ ÜI7s g3 !)+*)$J7>JIwKK^(*3775232.56:A,10-9M?Hs8-09*.*(-(=[')*6)+$!Ux2##%0*).}d%- -&]i-49>O(()'%5@+')& &--)* (5.,o HNր Ş<7t Z #s8mk ͛ic14PNG  IHDRx AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs%%IR$@IDATxIdIuSܸ9DUu ʞ-P JAPՠ@R?w\tj!Zq#J$ L6X]sN1yq̬!;3#2=ng}g1sp3; |%0lW>R >RC%I`'vI`'R Ym;wI`'vpM>vwI`'vx!%|!m!nn]|[z'vI`'OJ '%]; $N; |M>AI`'vI~'.ߝ~Q t/n'_Lnj)<6v+xw; $N; <MzqN; $G*#|'vI`'S^v\v:1.?m`m~6^g%!Bv+Bx; $N; M^ԚN; $n!KN; $*;?=f]>oxٔ?>#n#|'vI`'S Y/;vI`'vH%wI`'>pEFhusxQ ,[]ޏ;y?>G!s'ϓ`HkGNFNF_II}7|-إ}n$|U:ONv$Nz &lWf&_Vp KI'[/?; ${y߭0YKt3E 0qM5 [&ڟYӱ5Gw2 QUZ|Ȫ%IKR䟞 H}+n~FIlisi_h//@'ן;u3+\|Pnutky^\qO6_o ٦8 ?l?l؀{sw+[O~6vۈ?_MOo#n;m}D<>xokdzh!w_Do2`}zrg.?z,?wW?:@O wV{{|D`ښk g~]泙cfp1:?LoGt7t K9]c"{?<6>;<|`18h_ ~)`X=^2͇cfKr8aZ Vc6跜|^׋[o;NXX`5}\H r W jjZ1ڤ%x[81~F|ɷR`7 v٬I=d?"QҪW3f5@!++# e6ΙВ 5~̒OR V`82}-Wj"9P>jW˰)yDӠ:{ַzjl'+&.#R9Tz,#Fd5Eu5=d8.:Es0DWU&ڦT:.hgJ꥔%[me)CRiKښr0wk,&6+ e1p-TwOqQQ=[[(qQK!~)S[z!@T$`(jܮ~\\G=o|7CFzY~v>2`|yyyyMݑ:hVâxBLǃXq`-=`jC^;u/´".L[f GL$ 0|5B?M j,i'ѺS+RIp!?M-?''Aɣ^IAj3n*?- f/oF IjF.h<.u"< Y[&i;yiu{>\l옰dVwNuJlY4DXnɠ8uK Y%#FKq=[w ff|'ѕE[cpx#U~)K:"NV *_2Ll98z?ܿUYAwI3=pYr6ƽy۾Gtݿxt-l>h/ۛNuExgwI:h]0Xҁ, ,@ g,Qxy7 Ks=vֵ BV_ږѹ eiv49d0)qHn)#%lJ"ӆL( tIR~Bgzp1g"L' $Y[[t}/LpޤZ&ߖ:t!'6񹣕T;~~cLv{a'=ak:uCGDYoݡ;8=}}05?3_K/Ym[T+Gʫ~Zym > .4+=+%]G-ۚ[?Q+fm+;|٧WHK{iICjS"&K'p~tu{~:<;]^];O?{oQ[œ/f~7KỜ?w...~; 㛛%q o%_sbw&؂2w3㋳n`g>`ؙ<=mګ%5 W 1^pf=͘%g&t̳ `?gBgkvmwMѼ}ufV;6ͯ @*Bt-"ۀ 0X\5ZQ$֎I_0K8m0[ԒzrTB:_{ijfz:!߂%eْ:B*7V BK[l4mMn,[v&WTml$WbQVE $n |!UI^-CƻWiiׁk$>*ح /"'DYq)YPxo6>'/Y"μW~ zPRVds?iq aMY 雖wوP+6L7:6f4W~\t6;fkx;`;l^p /գ6p:$3;8;;;L&"܅jks_ԴBن'Wi(z7Owoh4e5MÁ_pz k5au;=[c^G[o.m(<9|7+:>_7=&Hu@);;$dqe7bD>Y5h-;D9l{Ϝf0ˊA+Mu[¯F>db@7CWȲv">G+5a,op {.li'KcB@7-"Qז?{&*I ȷwOG~v⦉+:RnDk3:UU_X!E uW[p+ℿx7+ɧ7IaG,S(qۅvjWt4˾o9а Ф)KX+@F.YOhIO6 JRf~$Xoedd݌98bqa 2I _dRJ}@WXbD&i\q0=T45)s$$C/b<aU5CW EnlTzOɣ֎.vux\t9ce2챧Xd6p}|8|'cpY|f''''#N|_DSOk:2(l5=}Rqmih(s:m $Ys }K uœhpp΁՘ÅL8L"yj8{1Nx:6+֧v wl?~<w>|W_YW,8 4nzخ_MAHuL-2ECiP{4,nnS&+rG=? n-C}Ȁ , 3y+d<Ӆ>Ndry8illށ BIk_nGˡW" ~I`p)6)lLy+沆/@YDRxluv3a6p{yЅ-aL ]ac> e'NyeFC6-ה2_ ` Q72&⶯r)dBUϙzSm:FLC5aȿRϻLX-yY`>\\̏ǽrvꃧlph58k oTO7ވwp;>|𵇓tjέOc/8|-\ *-*iR8`p q =xk\;"OyDͽ 7Gyky@]PN~vb}cKLaGui|YFz?L뷢/k>8<?7\n'! m`pU]5}.sYa 1R{?K?| Lnߺhψ m# 7t7eՉi!LnW}-v=}ël/lsiNCa/Q =~ƙ!-n>y}*f4Ζ3C0:t\FJ%G:%-ЀR7>vLgή%ˉۇ8 ON^:\.@qИ޾\~\;[cKmИĞG-flw{wOwkfozųaB- KwsNo"nvgjᕧXw2gLP/xoϺ xȂGyu~rwxO[ Y##b/5_Sfp0I[MYa1o1zUG P Q&`8KSY8A~ouCS搹+3֙-'nQh)JyŹ ݝPLXF?zr3x;B;x)+? 1=OR=eݦ\_s/ r(oǷkvӕW&m]w`~!^g]|*W/^nxfSU<;)xԗnUyPQߦ>>?1>N{xx1F\Q>7CJx_Zl" r9;0=3?%`6wSv\0}g;G?Z\yVF>E6fpC*KDL03޲ըDc(S w&*&VMC:7qj 5lL|˙S^s0qAerGL{anN$r?c2pn9h6DŽiȼ2d )μ ix\;T*ſ ;8 Ep +nbBwc ,h)s\`WيG:m"<3'gX{B*"WCb &&l0#x&IKóܘx8"&e92Z}^o-2Qi͠E7*++A{=n'ˊQςe'BM!ws)D.o>?Fr 4=կY^1?UNsdsrj³Q[93bzT*]-zJ!Ky#0 Oo"?]mNxZnaάߪ3Uަ8M~cB;!M~3wF>~>GO^QUn8S&7U+u='g/Ce@~t 舓;@gnhK>RZuU;e^EyJ @8@|V&^`01egXW^x`4hz8op} ;~ߘ޽~?';?Ώ~s_{r.yf[E5wыHZumx}T)_5ЖSrSf<{QPEddA=i?i#F ];9`yL7Ѡ\:zw1hȘ[ʆKU q{܁1ҸEns+xR1=Q.9A7e(0%qG(Gq6TVQ '?NRš=lHBŝ|Z$M)o/Q#Nfay0Ϛ.:ZЏq6Y^]5P}I撿=WʊLc L,hkS_?Q^# }I_=F>:(o.r7Nn%((okSۜ8Wn7n9܌*YG#O1sXEѺo3v\N7o1?ǜ0Z&mĕ}nᑾRgq󴺽(iH#nWكb~\>O/v΋o5~ʒ慝8s2Eރ2ӧG޽|ݓX\掗9W޸GEIգgk&Eю-˝3P?Uvr0;@d;={Π2s=Cg[WG}peS eea^0(iǃ15pPn;cOSO374I48=}tk[t{PtSm&ξYͲ),5X^w([ ,n)ʌdxhzxѬO}<:C+2YyO0C^?W?o|nv- =^De0=FnGGXwr(xL8y$1uX,C%cO'7vUk(!HRgB:&Ds(Н؎`Cw( OSW:E_ϏL0AveaRLX 8}<{0{ef|v31V& |kctD{.ik{YY[jy#[Feƴ]ЕؒߚMt>aMwH{.je۵/ѹSyL]ßmwB}OMO275s&3V<X ),b熂 ) [^,y7+vëheϔ\x~]޹k.GJm,QjVk~>r`<]o~s2b˼g/ٯ/{<^)zj;Êa1g@xQRɇmvWtwφuIqZw#-Ⱥgyw,}\r=`|} ŸpLƔ@ZJ s0/2#3ijY6pN!& oqZt78UO1ݩx!Z^wFy[uՇeBNON= B*Njz8:ZGLtӞd0}&JxW69W8~#㻃RQ#8vã;<1xc'RV4ᯯj Δ|` U &ب0VoPs=wc'+&ى\#vi(Km &? >= bG GI+ڨ[&0vrj;)0|=:Xq4tzgyU˿*ze `&f 7zJ֝;/6{Ľh2QSV21yrG\W2nymK#EKx|h[QbDž\\$MkR c G8" pR<3_mS8~q3;̃1(_vNYvY^ht( r[OX3݆|d .;yhIsR) K~0xvr4lY0*SM.i_ţ(3 |MKܢ 7J.exQ^'-}ofC==:'?JUjuKѭk1UZ)ʕ.kODW2*'܄Z&S\mev՝<1STųnfU6nF~|?'Ka+t8m;~K̔"3O\/|?b!8 ϶&m/&7mū>hLڔq<8H"jVj$rJy9:A+rɤ ܭr/ˋep ySDKy <^UA v߯j$X^N9Ǚr}Q'3ѦsC" $v2 0ۤ>,gryg G&ӗ]솕=e_nB x ޏO00 yd|v>Ow2~_MΞgQ.n*Z}YE pw-gk".w%,l8e׭"ٸ[~1/YE/kguƴeɌI|2 pP?xh,i`s:4vyM÷e c: OribK~%^gEa[҅*y҉^X*x<@tS<3MW voR[ $byQT\Y>c b[GbFȈg!71\)/x)s yCvny@u>z=S6ˡ$|NroYX&GO:RO(?#A)߁S/?1V2#tLa\S> J 2ۗ51 Fc;xwH3Q|ɷőӯ|o,[`臷:|bcL|!7Aۏ^~~%ۃˋ'O^0퍬LcMXkS5(Fź`tp_-3h 0ѷx5USҙb׸˝s3haH `Z1'n>U5n4]5RM%_=/qmylNOЬކm ۡ%xĄ-:3gَuVt~Ӄ' 9+o-Okygn|f^آp|(bb8R (vx)^~DZ:nIKzCl,L@eޅÓ7NT3;Ŕ!bO/> ]eYx^e˜lN7CRvL o<4'U-7Qn),7;Is;S^tD{NXI:!O]w^HWGv1c>ˋYWF,G~җE~вN'a~Qu(Bdi>՗>%GymSʯ/wV};ިR߿G#-*woca_=sxLo&ʌ\H2Mh#OzwcW܆L;YR[+˹OݦlE窓xuٿ?=Y<ѭul뗘ν5}?9K~קʾ1tgtN|k|߅2ao !0{@8õG7Їq+f;%-h44;%*z윒 (lW]sH]:OR7wC%XGDjɒW*_\Aބ;O9Nr#x#,/i=[9X+;L˝z+AHlyZyjPL(NDΖ:ALF99:&-NX thkߕҗRMOӖ.DŽD{`},|_W^1,SJ(SO:@j+HNVΓfwiԃ8/'f (3}SDҏQK'(9砥%L<=[yˠQ&l AlY7\AdBABOϬ\?rϛVז,VG|%_\v[o)+tUS^]P&ؤa8_ܑ \rV+e@a}ߌxC 2g]0S0|B˃u+!e8NPs>roƄ_\tPSb|~&{Ah1uz\'QQLjs[B;mYЋꈭ$O߈ۚs8QT ke+yZ.Gz:qQe:L yGItf@1*: 0pҸ ;razglG`ٜpǒ-;mEAVAIj;Y^gNY1 +/Q#୸ˎ-/L,QOfh/ʕ DBUR޹i)'Wn4gAi8RȺLHhZ>Rl`9]n5Y78U~\Ynr壁T?4˟&PP,K]ι@Vm k@XYCgyjy &ZyDEߪ 2wGc+;t6<)>)>,V5M4úw(r_#}[?~-܉YU2US!RVj ˯ G ХeI@_ S*|V3 (>b{%{鷼e\`sv:gj/:e#cb{9W/۠Y2K^(;?Ʊxil੘@|,`Xr- eCڸ8{IJ/j[b#In4A'; _v&& -.*^Z<cS@9M%76Ur5^GJ:V(7tFWR/agG1X:vB@ 8xhD҉ܻC3 ;?ⱄ3J% ߾\!|F"Z5}p0O\:)І OpQl۷,/1 e,h_K^#|%) U2vQǃv/ yv'5&R.o =:vzTʛA Ⅱj[^䥴r6;ësh\+dY"Iq q_YcK`nlbWp<7vHPig=^d*Xcϩ Sߨ-6[IJcP<6K8m8prbMx5V/}᯲)>VUG?,SgiWWYBp){=IAe^샎2i[,~hQ85Y- ' X#eV KXÓƽz^~:H^) ?^yht:ut|}>W 鋜s8`KNLI[\%0hO ,-85:IIJ\mڡ>3Ti7?+s6Vfk& siS: hT6cC2ƣX l9P/lOJIMJ;Dl+mɿf~J~$E Eo̫5ބrA:W m*?1ϟV|%W&L*F0@,98xعKmp[Mc|Xn +f-} .@IDAT(pWz+eԎm-܋g~{7h)!yF]Z8k2I'&kp6[8+ s`AHm%  1ɯ<_sgM`2r4{?He0U`O}~V%/e,љ>m#yRYnQE?g${~&x{ܰphV{9۠ 8'u*?cpϡ%[0Ls1=s|Df?۴{tz忊^\'Tq9N{ݸETzx~vE(M)E-HE -MaImKZMH i!t tI_\j.cZ@[NW]$zI#XK\>3 v%LLKI%(8c\Virq^zj 9Qd!.?9:HT[Ddh>*[hYtLJb \ݎ%b:łW~H nPӛgFV:lw;bL:'Nr`x>eOKIyT- ƕxf5F8W ]Bvd?'8!ǒePp^rj3,•I~aYq̅p𱉃xMhYe:FṖA6çjGP\be~_` o#&2y.D=cuk9}N+oru+~)ZA,,MO˫Kzf?'+܁է.3eƞ6Y5䷅'$?a-nEf6AVUkNdE_>ϬG"= Og0Wi%vm pS_14|pg0c> 0|bosU5vU֛WFWӃC&̯@I[xK̜AW-vM-~teY[y H5qJ_o<&Ní$]ކLfe^[\k}jtb:2hg1 G]@ghzi0M6rIFtU$ӖJ ]p ؆"Lɮ8ōbRK*w[ʵ_=|}7>xd-x s>@7ڲղ|5ܛYe؟LN??a[h}W?Q2hUgYQw [2y77mPtQ<mkV:e[pq 23s> eKM~~:i*|1u˯6Xn"! j{ d5h˧N B+~@;ښ t=rJ[>X }yp1/mx>;oxVvîU8.M+/)QQ~Zmj%<;U;K<̞ocp0oK<SɊy7i{s$Q) IugmQiZ񯧯-]= -]xKé=4hv閤#͖߾Zx7b#~ct\rZIZoEBQG,9%]H~pˣVpsY"xe5(!NW٘<;j́v V;^>7_\+<7ֹ'c> ~?>wѽ;~ygǼ}iJWtʥ 84(,8*I jH1BA:H].WƁi;ӌ=sV7s, ymB79DTȫYE3# #D ~@Z7BǗ+[K2L􂺼7hG?vov  mDm⹉v<[WS ,{U@6Id?9ӠW#n4嫬g=M\L-rҜ bˉD 1JpWW~-z Le҂ڞ@Ue&-<5n,85*r⯔iZ~YHPRq~'Lt{ zO~{ w*?5K$ѐ$ , iO_!;6CDmkحK.qewK 3}da;g Q<Ҏpc'-o=1mǣ˼ϯ> @>}Z䍋~7̜)-_ҵ^|O}zvqϧƧ71Ϯy[_\=/Ot1<]GONog9\>mTjM'Rvd7=I^| }AG-x=_SܝL(<\6z3~׾чw[h׫[:PpX| ߽|AJ|$bOKʈvhƘ#x^VSn@0zX'VU8]V_PD"!4~<;}>Z#bti bAwvHkS;O󛯲juUӚq9&wj &0Z4& M*gX'P'Oca&7)t6V^3iQ5vt,ӾtU@VEz'qXT3+IBe Z!w%-3e Dm푶/&!hFȺ||Ǫ'f@A풟?:z I}|dYWWuPǨ~i/uS;8Zd׶!UW=-=3yTIӴf/`b=@CXS }MV6X^.eCYVk=\8k3fO&G*':MO{l>g{77­8HbTH嶦6:j F "u*t䝳lH34QH]:zWIM_G{ У}5٩ds<H#Ֆ`9^ӇCJKe4G/QՋ,A2ˣs̕w ӆf[9D 5mKK?pid#d'r|I3Z8f~W6Va&_׆)HOeQVrTRM!^DTQ~TREѤo/H]*u*CE)*bQ4)sMӷz}[Qh0聓[?nx.瑮6#& (l^^[09[6;^mpiiF9Ikz1Әrp^r`SÜo V +ݻNf&ꙫ[X&۝+?tg=-ܽفӭ} {vyb4}֓oIb׏?>7bpoΩ:5O٦*ն̹:hl3{/:ղ52Q{0A c@,3`HIW[! >L|3uq38{ʻN6W׼'B/ 7;ent Ru v@eϱ+ kuL(H|hav1蒼:_M~"kB݇@:(#]f4&@G?mBdɿ]F]Max "0X D˻qmzX Sʧc G&-ȣ1%GߒxIz+$P,iVmeXMQ+ozU 4gR߭X^l{Z0GY`?x߄7m;V 0Uց! -OR"`+)wW])zDd-?0JZM+ ߼Eݘ)SN[yͿoдlZ[&c`N|L}2'4[*ͅoqxkzOÓ{xKu_ſWbI$`[1Oؼ~T귐h4P'9In {Eq}s,7j']54[*P;Q(ߧ/8N6O .izE{Z4(+w[5qSeMp5KƱꐙW#; T~ Ħ{`uOڶ%ɷYx1_R& qr\O3c-QjDt'*p͢,Dy+ +y&^jbލ¼09W%>7Ǐ&TݲND!7zGrRl⛏寥+>D~ݤDa˷5:TLז ]>-2ʕ,·p15ѣ_$|=N -Ғ|H[´A`#k7$oX|~d i)FD&PV o=: _g"%H4:l04 B{5݆5}iVb;߼B_ 0Lst-1k4?؀KgARv&oh@k3.|rt$PZe[^5&OE@7iU`!|Fӓ $hIZ"ud2#Gw1Z!d.BP3 Фl҇.4t-; {:Jdj^Lx>-姱vN6;*"u-fjiǖ}!;{GxL0 oSK ( hLS7.v3~nr+?0IfK:J!wԽH/EOGfɯ`bj}{mѕ%h5AG;Zdڂۈ⵽aW]5zӾiIQ$%6:jiF j&A:HNq~ESeQǩ9^~N]2IIƅc\GM),Mѝjvw`v=n;o.<}\cCַ _On?y{Q!=E *1mV9r f&5jęJ36Θ kCn;rWRӞP<|w46[Cd,)T 1hOw//OMf*{<8w8^1!zy6/u;FX֟ZVȒ]cp(˺n yjU#f[+<($,ƴ5Џ#h%O=)]i&_I]".~3T0 tU$hz[2sbmЕ̃DQ MumbJt,je1lK`R6,#BR#C ld~<4ڏ%Ff=vr5؀كH$Xw"K.c \de24 G~ւ Ӵf6Cɷ KDt[o Qs] ~]~L$f%ZHWn&?(@7Uw'A+fK#*6`c=&|{T hOs#XEcZ.-)d+ﱗubf؂-xEĜ\]`n#20B xϟ}LV@Zn`9 <r˃^>yƲwj/~so DSM|5*Q1ޛ3|yqɇ7䪢8yZ1U (Ԛv4> cGIYk5jl\I[\—/Rp-Ȕ0 e`sMCgA)n}}t|l|N[ר/RC2$^5))ʕzD]Z']vtK3sCmR,ʤD zЭ 0 ݃/"b4ck`l= pn5M]Uw~+ڙUErg)2E|8NJuZ 8D}r7@WLdBi~CA-ߊd?QG8/f3gyս&amJ IqGv隙2wUF go©B%<;v*g˶Ku(Siү`c8Hِ_{&ԳBt3ytHBáVa7A6sY70AmS'0X/&ك F'U CH3όˡz;#S Z3+E5E< m۱^_=yY"FWʇ#6v7/N袗~;RwĪX(C=j+]>/ҞQ9{7ݥsH =V4qҟ &eI\ ZV7h'KdOua:}=)bEX! @Aŧ,$ \zCB!/Шr)/+O`!kdԭ~^)֏z&ӇۛCD<_wz=#}/`PQ'J\:}>%Vp<7쉳y2P[Jqhv8r->TQZb ;xC?M~M$;Rv^(S3CafPˌByfmǶiBcEU!}籮0 C&Uu nԬvpF f1^? 9?qu_DFm@ۢ f1(| c=[&Cv^U)姨qbΈipI/^tJxY t(b >َ Fw1 yM2Bć:X 5*Ź}XM^^/gQ&(V:NH6M{`m,y*0g@Rz`~ Q.y|]5׾ҙ]ioaW%Hlh^%#8 xc `R^ģxx3`cDNig˾P{X| u {JnZv|nT~s}ċn2}/d(Fq彰NQ֥xTO,͗J4$o R"P3D"|ce[dC(ŝq J>xH2DH}t Χ۶ݝQ10^U4V)M">ǂ5nt~,>=./Ѷ_ī+}DH4ҿDo::нߟ?\}{N.tC+P@p;k@PPTT``&P jNCС==eJA1}X70PFHi$E#a$#  f\P ^恥鳻\߁Y ksW59ҭN&;łѸmU[^ t$.&V"[{mBxVꞘCO"Q|Ê_ؚyDb~vbeKe岋3w2Z Jtf.sa پ?GfavOu(8xA_{lOz|~~bw?ʼn%Ζn`;8B*BT6Bs|H7SxOxB^(;~39<Ј=\q4N.eV!qRu/7VQ^0[ ~6he0RZD?fOrU Vzu}'/?|]z}|SuLMje5Nj?*1,zõ;9Vzy.PRgo0I} iI/x͑^|z.?@}\[oƷ\Qmr I_kzLMHaV M8-iԈEYyXW(;8 %0PSضQv/p^UH\ʋ[6:8Qlx?"TYG/0 y23ƿ&G"x h輻yBucwI-VbRy k=Lu[!{]W#%Z4R[@!ddRL䲴B-Q  b>u=t}rƘJ1y1Ķl );^U:i a8%P(H?HඖvG3m`H.6*ex.iajXx焐i b:l/ [ԍǗ*N*TPeu(0XYm-mZuB >:*298Q") 0:Ac`x9|qBDD4C?~oh| = ~N쎌oЧ07p fՅLxL*"zKQJTIkpTPSyQ>vf\V(Y@&D8֏=t[PÌlv},6y1b|E! d 9(|*Q.H4t} g'Udݝ^"s4 ~n9jf~p/W!483_$J^»B.|9PO]Su4fP־Qzz%"]gX0zWy>B ѫ`$V .km6/| 5͗0 ^P¯X 3\G/)QGmˊZf.ˢ Ɔ:"r< #[L's FUڵCya4sh!G_Pbh+=B7_-e1!f{FJuB܎Їn`d@_R1h!ǺR_>t/Ti7@Z/!x!ミB/n|uqup%Wowzwlpqqt_}3awJ/9S}YEt+YrӑD"UrWh÷}M Й5;u zC 84JQu"XbS(`/҅/!l9tGZL5g$:9?| M6CBIlfGLW>]&ݖV!ozTh|lOh>Ɵ)mG}n X&݁#/3)Olٟ?$nˋW<;yu }H -U;hO/W UZVtѧ:.Pi = 9oA Y3(w'z'VG7WC~k_dw`wKKY^>!XKY܍xf@ -ht=֏qY+7.rZU,&F`iqDm5NYvadx"h YHwV"K[[m,GDME;%07$QWeO:Dh ׺@IDAT,:=b䝷 P(7CՄX\sjQ>4I1OzK(/˹tꒌQ0ׇ7FJ\0,BFyܟ !X0NEHMh;{uR4D(o.r%jSV`0GV j} &">ڿE_ȩ[|% gڔ"1ˎl*7AܟU C_qy WSv׸%\^r{1Yc; P];r-b=\ ?Ӌ,~|tw{]v)O/??>>Ҫ2J/yo蝦\*Åb0 ])*Nz~ˊWiָbh-.B6@#KGɤݒH^VUJ<%Axntrwp֗FN^sBOoɄ| @uW>8 %l# W՟cFjks#y'¤6L6JO4E"P:2ۄФuG:P8R0:|yB}zz@~7]+Hg &\24:5:UPC@xTCp ]"OOTPvl0`lLۏKxd1.6-yTB ?md= $_eti/EqC۲hNzn/-TV AB=Е ʼ, aJ8p/|yz4OmƞIg Q,(C=>c[|FCB0< {?ZHx]t@\|fq=FEN$cNxQ0)Mv\"ȷ1 Eg|wp0#X@+~*if:UL +u۹ݵ^Į.Djpw J+sid |z|E{?҇?-)\~Ja)XnaՍ +83>BZ:n\/]Z،5 .p?hUND7K[Jg,ə?!K xtI &V*YXk07tm3m8T3i *KC*m+mB̔ר ! $ADJTv{.(FLY Ol,Ḡ@ 6M} ǐ ,r3gu2o_5jK&sUHcqɩV\.'}?U.XCeQG#vӞ @dJQu~2NtVE|Cu mle5|GÊj5R/΁:p≼`{/TEiOܓ=uˆ fT 7KXP N]ŵ5jKd{6^7^^|?etD}Uqݺ x\o`!}0|E[3sEa`2#1`XS#UV-_/Ou\ϒ~x~à eɻsl*cH?^F[iA0w >{ǂ^ieW> (RV<Lo$OjEXJf1(1:4|ɉe]ʗbK`E6oLYZG?WR ?Q̖=1o$ 婃 p28kG^#J0R\a$ _vՖi*"g@$T^C?q&"c{ںZynt.Tn{5`XA2:Ǝ b;Ѝ?Z@y.2 &SlW:=p]~Z_>mC d[TnC(DgtwJ?K{(~D/U:N{5C(hV^:D_I# L+Ԡ7)u2A.}:fda _Ew؈APIqi vE QG>Vyc|cgnȈff/#liKV_7e9f>[@/urSsWj9N5i⿼|1D;:㓓D)HkYy1 =M`ٍ+*;.̅y܅f$R* V"bI ~J@7 FX =q Ӗ NjCLIxaırK3ϰK\T,5Dqm!*{Rh5ؐ @8\Vt hJT(:2luRmbǨ`_@G&5p%= #X,>"Iu("N.%:Rq$І>s-Iu&`B7t`/Z8b#հP5@ 5v[Dp*_sZaO|gnጱvȪVYcuU3`;b0:[ `DZ}fAQGnpPi*Ic_Jʬ[SkpF0pan]/#}9i+9X=y1~`tO]_689J_R'q в.svuC4GGWwחW>֙%=I_uq6B&: x(UCpQAϫY + Q߱[l+J?xZ ፖ9K ~_xj`_0y<]d-?ۿADQ?a/HZ{B6d%0Gn](B'W[EBƊoC~5~V&)H:x3tG3c T~Mm틉8 ~Zy}([ -PWFG00Ǎ=SEŇ"V -LW!E{$Î~5{4;9+ VJ) SP 5*N! Cb. g!AxL/da{vyur]ʕ!@/)O[I)bShW۸+.Pqі{ fL?ܒG!Z#K1C'\*)0c&@gӅI3+]6ea* ˾#}Lrci鄄~#S]=Wq%^[O{gL64x\_zv<8:;9=t'''7Oxd СYx9{ mt6,VlTZejW3ɿ>>Y2q])VʙV1B+M//ѠM4D^ ,AA3fhxWCG$^-@91cCAA `ozʊl=~G|ҁ=1/bOЁz&L]۔/q"ez35UbYe "58rƙ@;bnA CvE_w0Vk%VC4)M_e\)i"H7E1ՏtD0WZaR?vV8ixj/XmmwC$gERXkf߼:D*ÛJIH&~S[r8VR֯I3xRw]l_@7=p={v{B x1rZ.1|`IX h]59qOkbi@ Mc<&eFp[(ޫeݩhx/F1S}(zaIG Ċ_ymȴ9s3`u ; + U=EM}u`4g&[.cDGrk8V^;c3o߾G)Op|OvJnu?pzⷐA?]"*'fTj˵~ .O'h{@;mߏbJм:lIx׸Cl.@gF; Pٟ/}[2D|B 0vE#c Dډ!?~TaQ2[ʷO,"qd [VX]>{aBrOB֌no0i+o1+Ȥ(.o L:):(s%ޫźFRTx5s>4T_/W=1|mJx/`S3Xvssp_ o,<]5]㦫)K] ~ȹ?Eue\{dYxUbKh1FFc@*OQ~8 `o}4eȧ%u>=:ӸOG۫'_;,~51N IG [9O(0J!߁tVl=:d"%\J-;=< ;*Ƃ~+Z٨QFz0R1y_< \ ;Hh{ r,ނ6kۮ$DjXf@1;->(qseo" Dfq@=;* e5U6{z=2X{AY1k1K2W #Die#Fha݅S??4eǪ8ư!EFYP}Fl,nOJG}؇x;Є|֡kEjC{ WPyG ``s0]tBs-_)R=yև us}_Chn}gS| GY2Dև}ߔBZy/PlUl/ƗTr:\fy^~x>M< Cp\.<;9U `! k]C@/??O_xA.d6D\ 3qmtT,m8~׬s 1a!ncoB ltבuaZ+hQzkyI|0La59< CgE(bHz]$`OXT).,?)Ƣ ȉ +x'q)$)_ NZB-3jYPf/ 1 1Uz6xZД0 eu `K<WQ un[b)ːхjp#+\6Gպ&P1HߙvlNS)QicѪ}BgӰk]_;>;OO3:|^:d!(MӈTq麊h2]xPZ: 㾠YW1t\ðIjqrcд= >c9xz8k~Şx{t݈@^-}ƦITV,@z۴w?%Hqe\5d! K7NS-%)دrׁ2 q=U`Ap-=n "K͎Z]cS:*^?ٵ:-ָ0kaFErKD5E t,Shy v+Hlq )]"G8gg%{0|[Wl ˤ* TP'2v L! z}6ŮTd qMj`o7uga(%MaU{)͋6P-rI,˄i)SO S.!SLۆB+VT̈J'}O ZdldYQ_p| eCg>Uڊx#YAc0"x%ʼqӰp^᪯ .M+ۛCc]:}83>gPA}27^w*O8{xuNr*3Xn8 p6^=i7-3Y&e`RtT{kgbHl7=,:Y#_~1N:!|j c4Sz>+hpfw~\>|v{ˁu-/;&oJ[>؃>@>{9ytZJ<.Nӎuͪ:P33.طR\[*^nKó1GUL,aÕ35_L|6J$ɪoOpJj?ΘԠqT~ʄuCr;&T^[!L_Zb_kbdR,u(Mb_eS%ƲRvSWUn&[P 1.~(t( B{Cg^RuB߭*Z'5`jeκa$¤K 7MroZawD8zB' ~J IfhkL"O| oAkͪߔyy&̺Np`}d]j' m{./|+C?aGi `ͤC):֩uMﶊP'}03g:ex<:dG<ۀ+d<'҆;D Ž@q.b-46;QlCP%NXTjRpgޯ59rEɺN|$gtZ3̮5]⓯fC}/py9:;])d%2_{VA:i"Ui>=UF(_{oAJ(UgJ| oRſj%&omp&B5ҎTLK/}ã$FDpQma1m=|\s9`?_?kAքNY mYb)0E^|rQΙcVrpQ7u0vS-IwP8_qh7ᛃj E. P!m"-qe5 B͔秒(/g=q8c`zYhNM*vׄ!nx}2gmֵf¬C^ !I)|'ef|HoU@PniΌ5bt'}vm(???//>rkO2F=cݠiTGzME?fg>EΔmǔeiVYIfVx,k 169C1x¾9AV{,٘{Ē3 %,+ڑ>~pn$~HrnnчmPNR.52G4ؒC'P+J%^6 NPx,ŸP{5ƾۜ9FDZ:)&f:΢S.ҢAOpeA &M :WD6)_3JzP!عs6v%QTGBO:E#0Go*)Ie5#()LƎ dWo6g'om~'?WX½İ`T3T>eh1I+_%aA;N4 ^5>ol8'Ƙ\c6zٻ)uӬ~R.^Hw|dcMY*^j5v#f|փZy^ܳVD˸Sc'n~pp҉Fp3 No'!B=!;Hok]PQlW |TmUή )cQe ~v0]TIӒw4:Vae[~n;fcx@L+':TX2iz͛AEH#}x`g1p~J +OW%Eڃ p$ " 5KΊ8>ɨ\K':)Y:@p64өX!%;5]qYt~\ 8 ]?uֶX#ψb؞> Ze)? a+2_jw*Q\Ƿaʾ)Rdć7DZ`10ͦ"k!FP.jZAbGO㸷pŸq:zyl??J`CҎjVS.=+ˁ s{2+  e>1Y𘎅9vCTl<7T0l[lIcӇ .|W>}bwDޞP^˷O?\Բg7ɿ {^4$hǒ#*Հj.5pEyUV‹ Fp?lO |͖|ĢbZ%ǴdALo#;D,wUնޔT]1agO5(T@].h1-9)Ƽ@5KT K>R'+O?F[v5[.2cRn)P٭cavmʷa'yܹtX]=JOYw+EfΠ)&pǾ YNaaӅt lDK[M:X^rt9`Kڨ涃N>y"zu?>ѻ5<6E_ӳ!BIbȊٿ4t+nݴ,<1q὘h:|&Nɒ"ʍ7ښ"<awTBON#2;,4}}dMi6O[ pܙh`Z?B)yؽ#AB9< 4Q0bY0)nd78MЗ;i%!ݾor!Qh-^EC}xMo{мVU:.%LKb|@X!7LY0W??`[K LVKd'b@ E 7~81o%WcXs{#it[eLȔ;D;VUf%zBَw>Z΂|O{sZ Dg94ŦAp.m{s}:Yz}52&nV_ 5k}gi[C/kuvn!p3󯿕c^с^d~fj7p*?{o\ M, \,bDኽHl e":68$>èa[P0[r6wqԺVRd{)[GW|mGݳ=_ȗ RL[8G0\[7|B<2qlcDY8HlN2slA`A<3-:n7WIΖu#!hxeNvjnʴ> iSu`!%i1;B¹> Z7#}rq(Va41ʏ*׏_yGXza)0\%}tqOx)jS& ְۙiNucE5 >!hs xR]$_Sl-<كk"^_%ch$pTk}}v0R۴GwǺM@zXMs]||JkXfҦPl(Uɛm&1[C=vج-2v͒GtQ|2U:!k51сAE鵿d\Xߢ3>ylv_t|P՞x:uѦ鄡MB?ASs}{PPz|Oο~RY?T% Gؠ?:pw{ȷx+է.犯ono/.ή|v{t}gjm7Q*TɱK[4"1$S+N ģUeA%,J654E +N.9N?N^ Bv4hKkR@IDAT>Rg}ƗOE?nyFSA *"JG#VO0mcv|} YѰnLq{>s=-r*6.#k7Gۛ{$G77:;|i4c@6%Zz E`MX5~=$.܈G c`Cdx]N9S ;FI @ph8|D8 H<くcg.F^o̖_kRYc+?p[m:I298߱&G^Әǝ[a3Ci[q@'{o ,:36C#L=1Tr#:LaqǧpIc^eWD[Trb o}Kaxz-ZG&%-Nk1QiAil[W.Fg+=yxx`瓁𠳻7.o)No#OD -:R(. *QMCK#ZψqE/ts l++ι8D44տ-z:#d,<0IZl}zXި\g/ow\ˀݕWGB.]6~J_r;ӌ#1 Bk'8;9I}UR.wob xBNE|Έ[9h;8vuOH\'.寋&)?1} Y2zQ)@-[f4)lepv8,¯ ~?U$Is7"_PB%W +wS1PcB܌`3ZЌ0=܁8 8CK&ɚx3KkY#E%0Dh3}G&0r =nOZ'Ͽ=ȑPn&|7q=EL n'1! l9{5PjBvqл"{*ѱloȐtmk BW[g<'&~7gcjqoWkCƜ{ORZlOX&`*]RQ !!Iɋŀ f;Xs{s:8aXa+#/"‹7,M*<-3PsPLb8'1T OT^YX%) ىg6ɺGETDa'uy`_"C6ƣŀ4ׅR %ZN7[8cL$⚥xQG,j'& x)j_gtXZz)yU&Sgmn"BRWz9:N`θ_BKy5Rڅ9nh' IS6,~8dm&*C47@LF6Z'#~6g|G /$]kMA1G2 n̳bYGJ*K/fh%_;N̯8+U?+4ʋ|}i1\˴WX||AɟEnܗFw ezTnshyĭY""g~^ Vt+ y\ѷu)%A`:!e0|!gz,CtYtF괳q댱(AtFf"˫2K&AG MpCnNJdUډհ&K%fgc[o&Z8o`]S_g#Ukm.OQBٞ2UWcLbFH0֑cFfԈC+_BM&1:a-[W*b&,fbtQOun>!3W|nծN\xh#)-K1-y I-fR1[ s;T|+S. $mU2E默r=?5XM%=3~ y|> iRgo/vo^#ӻO s]SyZY٢@sbAgi9  ̏Zр3BȓQe I(ΓΝ><=AP! ,KߔUy[?f U;id?F܊2sZ/{'fȤ5e/Ȥ +F@zVG-tqEwڪڊnC_BjZ7;ԥ&7_2oUА$ KGӪ %%Íj_}j{XUv6I>dMuA{{XE^%xo 0ԭU/UZ7p_Tw_Xt OtgBY<.CrMIAnϑ eŒ:b夒1#uͻs|Kz`ҁVӴ?\?лS*f=Nnc%~-jh:ӿF 5Fhuݩ2zܭ_*~p{zRRBu*V4˽c?c;i-T}W%R$T 5fr`z@F^3UU2L19w 6uG&Z3Wx^; 27lNu3MR& ʔA>0ŀ$0L,I6{S9y+vS5["#ÚbŸcǎ -:]\2tI#X.J[Y+ZӖpD]ZB.qdjmWّ,U.ڨ͓3`I-ҵIv}=-7¤kLjSv6ĔsIO5KE+vOvO>ߝOvgQ"kc[a%x<xK&P e9bx+"('WO th - GLA02jàz5Ԝ/DqndvaZv ]_txM&Z}ߩ,)G+&mi(h)w?fw_.Kʁrwbm0v2_s寢\9n>)Fi1ldM{΀}qPlψ>0jQlz|I?<@ksA%l\^4Ib;9D˧vVNa("7GɾՒM+,]**adJS.YFx #: BJLxq&_먳=9q `&S!}0xwwEyB }ē;i1Tzz ߌIgh1!liDazE`}.L؍~i6<$rK,/OmGG"B^.DdKw}Ơ`@QUK;Yxvf@7eBK0n=, @j@Myyz96%'ճŃx"_x@.SЄ ȄܥaaSs)^rH۟4I ǟ VP}v!uq@u|wcG>I齶mܓVaF^ŗA[.ݸ}aR]BfOSրohkV,<Ia |V;z`-ȡaW:ωƖ~Eg@wNekgV}÷n$KLXpAv^l!:&.6~_[[ƙ @H:ZMogYoQm 辻hV{wW΃iy`5Sv̠3!pI-TʉfƻkK} A_lĮ(/~T%?m+ Es&Cmq#Ѻ ((|ղ`p>e rґ'`\r QoUP~0wn5,_ls]~-{w|׿3~:(XVsz"WMLfc U&~ᓘ0ti&MxGh SJ``&"=aۇwsJtjPP9z?s`dY>p᣹L,Wũf0V' jaxiWTM Ncu@//Z,'>T wd TU"Ib r[>{S6"q-' )_ˠQAYyyCsT{߼}ݥ~! 9\IW$۱sqWZoģ׃\B3pC>Rp3L<(K~k-K,q90t>)UYyB3F_;̹HP' U>';?z?2^~8/[8'vN DKU)l-l{e)෿Ґ#(dlSTw;6E2.%-mElզ-19UЩbx+(??ο!2) :Ab;|]0_3z;007H0c-E<21hBl#PVq󧶗6 oZF-;VzNJɐ?*%uy7ooP0MtkV0ecB'baq<;dz1 Sl#6x?>};v q]ae][C3OF=ڽ ֮rFrpX}9;P \_giӸKH~q@ `nr ,|:fa;XX{s諂͟7a3d2TԜt5z\*N|gOوu@7KC|Jhbv~McDD݅wgĚXid%mSǯkڻSB0fq &LZPmNZdFy,ϐܜ%ys^oXvB_% NzfIݤO&+!t==S (k[LWg`ņN,Mk0]A?eT%6=?;2ӖtҖ.UT;G𓔟9ܰٓ{6ch0~w SehkU@Xu=r)#ǟl̍"؈v芑ONk%ZH򲭴 M[xIljt.P:8<2Ss9?ʮSz.HHݘH`msώiW>ɼ p\mZ%M:x'YUVOXB,?˳|0kŠ`8 g3$EFU8]KB 9lw%<ݻ7u*%qDDU]8nSƭ<@Z^ڻ0hi:\ܘ6ZK <wgnygB3l;M}b%}R7>_r٤Bt;=EX-l5u/ΦVhL۬kC䐭Zxܗ{Iܒ"ްVTߛ?NOѳL2bxhTA+eweO񳑻v@("Sk* KG4~sJg/>A,Y-(&֒U6dܒ+n޻9cÄlٕ\1_+b>\ -pVO F6ED Sxc^0p2 IЍɟi=/4oLG^\~V*3c?>N Blt?mpci[fg#+1MbߗoP:vc]6"SX YZ;Sx Z^[E36, u{o<7fHTtJ*G`%Og/SS9iEORj0~zy N }-Bj)C (%{W>7>ڻ~J~x/~&6t< }~xC7ulKڊbk}O-^6\9󡦁(8܅s @/!S{9M%GQY?w`d.F:;ӽc\is Ƞ"WMno$&7ɋ1K߿d2,_g5N_+[Y`Ve{:ɣe#R]ADao\,0#;VUҍqXгc I{mӈZ^3q,  @WFNqi|sUMg}<8'Ֆ3}$f>/b!W}I ؤn %u'`/ʶcpY.+k I)QrL%)*@lqi*kOޙe"٪u _gqmɗ_|v %Kn{>>LWBK۾ikڪ?0#mwΈ (Qqg }!T(ub3$q`|5 rpO[x#b u7݈qR1dYx&HbZcZUH=өQ u?rz]Y!'el&W->(TTîq>ThP'YYpw~L tß0;us {SCs<c3aos.QT{M׌/'H nBw:a+w?{:Ɲ!=i%{M>;@ط<} (>䪣mާwWV*]#V)4~^|K=dR&¯:KYMy#2/MIyOK'4,O5G;}݃OjoJ׫רꚧgk*x%2pӸ} LC3ghZ2lȩA:#qjxJ0WMĩ1Z vP&0s?:!?|֡S&M馷a~D|"a) v䵬!Y.2Bd0TN:/^z5g@K[b0yj5eco0\uw?:{;M Ҹs}7[A;|wʽ%[:`"Qr"JbXS.qxŇaa"*m:IE8,čEbgJ},3k-ȿTJ& 9\.z:XVDN9C<,p*+}d]'KyLg#UFvm +v3,gRh¯i ږݦ5GZ(XGR@IDW_۳SRĨp}5T7m85]^[n'qLH;:5 t~b*uϽOq^OvhCsii/5~.t2:t0yBt NX%t,gp7ݺL!.ajCl7ZΒx02+iϬڳ1)y;5aϼ;Ho|I |/3qv٩paטԨ1(P2! 3hhUq`tG\6-SlB .sØ؍:Bǟ#˟|ot:5 =92e ~{y_[xOqDv&_jKeXivwϠf:l R [~(@ARZ2X46%*f%_k *zugys-Ӷ4ر$nDxblv3A"d-s^ɥ1*o0)s ̣W6) xOGK'yu;3)ySal5_J NbRF{-SU"hT*U,وǯQb޶⎺k *ݍTXqi;N'f +8njT޴xfhFqShdELN,LMԥh׬&K0ʴp WF`NJ EGaT[ݙ8ZOBHծʰ8 l {O]CIevJwx*E].g&ҫwHțB%H7=cr+|%KYi?Dm}$`YЏЩxC^pB[>; eպOӵ s=HP_uSEI(_uhڰ46>H4~*4i SL7AI[/5?ۮNbBS ?(Gɹ̠l̤f}a[V9Y.oWN֍h~>x~^ߍEg<*0TJ 0VFsL= *9W/̀_+9ՀM6 ys)䴢ƼK xthvMT*n~Ӏh5<8ώx6~uYA:to;6yRkw+auz$gD{>\x-K+>"CC.VOW_|8Uj|I2IXװj;6\M'l5 >(\ figسgus'Y906'c~ - ˯!ʌ%Ew{ƃorp㡎G~ ӡ 7@y[lxhyhcL詛v^&M֍I'5:Xͽ.\k ci, D)/<7F|qvv%qv܍e=i9K77~ 7Y+gB9 YM^A~H˲ސwnx.t.W, շX22_ b\ONXu00=~)0Ķʉ0$QtJ8{sC+B Š,fAKq@@;iy4@OI_Iwt.ag+kKպFR:O ꣀQhL?0?|Jg +$xx}2;hj[^|ZA=jK.Sa)]Z B^;həT a% m9Dyb(DХY ,!0{y:?{]`6~;ݤط"L蚿h8y&9"w_|L}i^]Mz⽤k9BALCli|O\\L C ^ҍ%.iIvB޼ڞn]^>ٖ2"hjG F $GE年i(yg?9 w&@7i!" *\ʼn8Ú.9@q_|l$G&ׯxo}ʜU["#iM= 2y1%ѕ:RIݒ9&bx$zBZ+%SKAHH˨?۳El `ɬ^2Pcs#a?TD'8P函#7K> AJ?H?kx#NN",-IM])C?࠹7BU `4ny^S*0 ޭ=x};>eA A>Pd쇌{ @rD Na╛ kD/-TW'E,#>E 2 <}u}NkTf<:+hq{ NL_p/$5 Z,/vx_`6(5۞L;n(/Z: Ecӗ 0 4W4n,\) axq!fUo` ="# nz/2QI" j7߆" -X_. PQZxƭ?h&.B9+ipI;{m *'oU4E5{ 'O%qs#9Ua#aK B iNpx*P1=9b~#&kUhq˧T-2RZg؈wDz;M47H3ytI6E¥8pwe{s@[PIUx/p8 -}KMװaaxM6S xK{yNq[9v/_iV[Ż!^LL ;2nאNltzlU0Do7MWwtҮ9nj078}_}Sނ]l[BZ8Ցo ^=KV f$]~BІwɧI:~T }-`GYJreaoM_+b ɚ.Ӵ( =fy4ZÑ<ӕG\\ X_ ‘>O]Сv 0q%'Ůk]_#UrdOK|`VdLOa3b` ڏ5)_e>/?yO ~e@U"ݾq;5hoߺ=@j:I8y~'&ɫo)>o|(cd~ 8 ;ٿ̈́N/0h&%Ly@O n}ǝ|E$07> l%iHj%:&pZLַC t$e%.AM9eb#LT߉gwN,%G +u ȇuS%L'mi(~}E:NRWϒfkujhd0R)؇'J:=+ mygN}Rw?ׁyviw{ק~/Y=&GY:_W@=~]N28X@X%,y3g۫ MV'7 g` @ m;>r"&nTv-QO"r^ZT5` @6nkF2lY'>ΫGtlh"kf5f#(u.Ħ# j$T箟ߏ>:}¤%+ o"F05Cmg$eJf;̄C{w54QO~3}`s0Բo>-Nr`$Lu2>\2E(#z9̲L,du:ABZP@w 7)f G 6"5RNi :&^3(qEU=z?aw~aODVLN%6Y0z5 ky@IDAT-8u sC{2軯7Ҁ6+ U }YbL#S6e=~.v,T.M.LL^b>1{ݭ,/2J@&h& )Y,^w%SVWkT^\dK.V'+CI)׻t>)T+&^oIxT!&tQpa={KM+MW5q4P1lC~9Ut\ pُO0^)_Wdͦ/vp7+8\˗\m;aw8ҭwm|s[7O+bXӭ"N֝PQwIS%s@cwxD,fؑ;D@fbftfoˢ&2$gBzww~M~1-Κ@;9`ri~5gySCO 4wYo]P|4T*얡d'fwՄx;?bfx!_>=`"kwAF؀=N0&g9'C,%Γ!13#Z;*y1rHe),6m zoAҰ-Bfk6kK[m ^jܔlV:ydOJ bMtA4Af%~W?oJLP ې2p?Rȟ0j9`?q :pvi_sLuW*zw)-Yt} (E}v/)TGE`\ [N@N~rfeUՉBt*@G|l($\ *2|I4P&3TOlL/v׬xq*: \ˌ @xrR-*AuDyy͢GSF . §QY?w)v!۳y+JL.P DN&\nWx4EY0Qki$h4;$4AgƵsdJ:Wك>h[Mx95d=SB eX6蝐3&V~eCI )<#rY-'8@h! `}HO_mtJ#e)W@7ej"M ɤ.ŅO-t 4ۉ]xa[[mύh?{ @Y{ɑ։nid`SvԔKUg9yzW kGV;TՈ3;F_&s+  (nTRu}jm4H^7[?4F-_`j/? uPgRv2l ߛ hc}y+CKܕW^6wZe w3|cliE{Ν a&`*'o+@'8>\H O}ݳ3_F-e^-.C5C˥;iʼnP&kAK[]0ocTl9;z?#S:G+tizMsǘ? 4E7#S(e`"F_Q`)H` m `{#< d R^0qW-A [p#/äHRuIj͆NbI<H!hy:6\O|hS}7L<:JV)IHS>sO b/s.vn+On<'7?t7r̨u;|>[{c`y8ɊVTG C[ (x_g\}C$$W eԱ^$} @vұ|NNx v~q{ƌK} ~r2AP RwC#|5m2k\;%fDʅmB`c`m f5))N^`P玠)VqQ_\ E1 j-B;D,@*<y/qB2Q.GVBI0H.'.LkIFF :AԁMd^툉g?я~ N?}lN)ʆ+ޫgv/~nYϲg;_4wL~4OK> uи20ވe o@Q~+Tb% 77Q{w^)u#8'}ڃiZ6sK8w;7?GcH`E :N'X ncz%yuxƍ׻ WIވW4س_}@p5F1sOaU!c`#Chlht?­(Z,+]^+I4SFUR]uJdX\W=1 WP?N壗rͅ ?u0-N(Z5n7~Fk@2L SQktߴx\ W҇ |H14?yM\C ˫t\o#':綡w@<?cg?sퟍotO9~s}s3I]m]lvmW_B7s8vb:2X;fp 6" 䣧v}_~Ϸ.Lڥx&IMcv[hj?i[%/"zIM-=ED<. s'BtUGDʍnЄ=7䤢728NnW>ˠ2?]'O2839m)0s|!C|^]h__s906L$B$F .Pr aq+캫kf,K<l-ٳudgը @@7aMe]78P_Rߖ)!}A/{ȯ:^MO`ˆUouC_{vwrC^?n&-\1P@WS̜M,K}󝵗|f1V@i7iAmDM5:Nx :ZaWۡ1';z:dSC]Ȥs :+:EHybv_~lw$.w&'T y<P޺%/# v^]d/cБb-A3ᙚ ;X<-t 'u -zV<UʿՅ2n(_; /7zkHRǩ|G"Z`U|?s |ƯY`FbO= \7F5ZbN4˧y-dP2J4oo1LlAeS<661ӿwYqovc<^Q__>c_'YZ13`>BFGf(]6AsC@=³숒W250c>;ݠ]XyKiϾ9 9.և⚘} *7} ּ Ahzb$*`wt|&>)}alm/6mcǧǟ 6q7/"k+\Lؽ[kJsc` &t@>h塐lT!L ⚲Pq ҟI\ 74]slUZ=z :^s Y!xaNtS&TFnX**B4дGq.i!3I?BIW,\WT-l9uz9Q)>U 3H23ܓ80䠙ރ d&!hS:1I6 J -xli wBC#W74$!'0 9ß|;~Wο#6}#p= m ?_𣃽bb~;k7ڈJ%y~q>Dyj#ۮ e0l"a{'+H rwT!P*y?}݀r0* k:8^cU9m!yrPD!p!a˃84Ήvfa'7 t7$s@oS62mo^wүk ښ6z_qx{Yk ߗ邯5}I={A9{{OC)Mw 𶘆ݙF.PAKiVW-yph +M!xWJG.MX^H:nҰm:{I09J~A!u{~ʷe] qt,{G4n>ӓ0]B(}߿f0Bw&!w]Z7݁zizC5rj$:¤Ǘ%)cCqBv8']2?3~Ec[ʟDTǩJVVt\{ˀ7xXY}d7IH)_V%ޚ@}ӕX XvOTCQ~O~ 8<|x+#{%c6w_؃oO>})|%pǁ%w)A%M=h}⬑ZًL9FdSQ2,6JbdaQ YG Ӏ!v{i\G̔ή7 `9MBOU?X7 !u~207 31^#_=&o{-zU6 7,=j{أ 0?Tώ81'=]?`6ڎ&(~I%I4Z7{?#>c7Sպ?_|ݗ.}wk2$%{SRtSWUl.מc$w )H"`Υ7 = Ϭ[O? l/"чoG=/U!hﳜߝ sAic!_IԾ#/2S`w|@QwDž) |#ص~k*[-3HJdT?"҆I9d_|v>J$^#0prf@BZP6iQ1V30]RDF!U_5`Xh[ڈz'&4qgMSa{c:W1? F<J=oQq2's/FEx_;t1I2]yI)nVQ,/{d6 -tq0 e#}B:0Z3؈Sb_g4_C"|1Yu20pI2p-A߼ne9tH@h=F_.mqյ։I0Hx|&({O#?H 9ЛPڊ]W~%/lLdԺ1̀ aٌMh6OQ/BӖP&T"-?ht\q0.Gz؀}%mTd(biYׇb;KPUwӢmcL:tq\]ǣߟ~{m9˦dCTtMd,>sP2άq㤔[$>'eKܕTa;;Mtǵ* +[+q+`%8;z;q;T8.:_?kYZ V8:?o%H/ !Êݮk߆uo74~>oܛ܊^|nwWJՔ N511>TM;sj'n?c#v{&W 0FgJyʳy*wͤCM;;8i5R]6ꏈ`'_CٯwZޅ~15mvy#NluM4Չ/lj:<#E~Տy";'?`o3u€mw;i&lD`$jlz{@nOӴ2-B:J딫F6̜ \r JQ^4=)C|Dsنf  . qNZ G =.KAT7S~kUt#=Yԛ;+i{]5p{) IY㇩ a.Q'tQ5:a$MrQ\Q t#樂K&; y9$bye7+M QQ_5y9w]+ g}璿y߁WK\2u%.˙_iV|wJyMGJ4tU{6 m:il ˰7I껤oɢN@}DC]'Bܓ1p\w`+ˆkVyk mvH}&Qd_ i[־ |pcJX'joBN76w{9$$01H hY?gw?^{']@o~?{jɏL#]P/5]v_:A'%fuL>(!?^ Iѡ+žU)# OzX&N~qj2Weܫ2-Cqҙ뗰,bl;Gv@|#of~{aϦ % 0N$=e ?E/Î0Mb'.{5y)|h8-|8J:ʳ{ɿM?G]˂{#z_^sh2˕0vYjOHR!:ohEG^rRl K '͇#{L2#5$$YW iӃF׌-De׈3лBEg\33^:.ҧ}oYmiz žNHǹ?BmyӖ0nDwfM$]cXќ> tyT 3HSVVꜫ&ۼ&x=#&Fn!Of%; s {`Xu/kFo}4}aYi}%5w]qӐwM #^q̋qkQN`WC>J-<- |{IwP*Py@zm܁CN)~gqu~?ߎFvX ~] +qw7N`eg[puRCSܻ!CbӁnM_qwDVq+?{_PuVROÁ#[LiFs30uډF$"=f"p>ؔLS ٓcSsewF}u!2% dbcTJօ(gĈ3M^dDj{]ȑ[6Oy%yг ^_,IfXjʷd>QKK~[?QfJ.]9UGIUqE_SC!bu$`N}xB0!ua|KWm+4%?8z1]!\WYM.;9N<&Xf).[]~#bG膯; leNxQ- #+>.;Y3g)N|32輸àƾ|P7bѾ,s]6׎͓μGOόv f['=%2XϺO oU. o/Dej~z9#3#`,yLe})t%ۀG8hS Bc4<7%nЉXq㙸A rثځ4ΰM+f7;;w,r)89+sg?cf#5nG<_Wg=Mb7ܹARy,6ןNnUZ]^\Nߑ?^ʢkY=h aVg%'TIp]8y9B9tq20gK.#6<ٓGezfO1 u=%mUx 4m,!j5w\a,i ػW%$bͬ諐*.\wǚK%ņQ|Ǖiْ0ΖD8og* ؎77Fݍ[.aE1%nH*}OHHp h$.YLߛ4V~]OwO~goa?l;+Ή.Ez׿ tW_W`ǹלw ̣c3.B%~*#LxIG@b}A'wD czTa7F],O't;u-gY.=>cEL3ࡣ"WE5UתP lۤ+5yNT'~lw#J02Ƒ;2| #$o7hѧDZ?".ٟvpck'o^a []]՛7/yULxݐb;%P=gP;S̬J|&8itr8 DbԾa Y H2Xܜ,^TQ({,xdͽN{ ?ٻ?t?VgG B>˦s|e>{N^5&[?N(GpP#HuOI@KpӚ6a 2,C/s B!}ވHA`{ m)pަ%t:j#Mt$\<{ ҈FV!i&4zq+ [8dyku#'lYv| 7-H}p(03A,Ym}81m`go6RLn(waGĪ^KW f*p}}gؑU<p/= oS_}xW}o_ֿj(PV"S'?{||:WҵE: NQ p[(6]0Ό.25dM|DyƜq~̹g/v'l|l'ׯv?|Q} ' bW::. @dzϰKoXU,ĽrT%e$ 0juS:gtI7TΧr93l<L ':ld?CB:-3ԕ]w>3 ?{;oM~Ͼ 7}{@ꗿ7n3c 'qti"x5](zw͟4@ {n&!^&:(oXdQ'SH8όMFoEOSeJyǫlw' ogY:=g?sտC~Bo_}z!7/ #Tmy[H+h\X)F\~K[h4t1=l͜q:N )A}M,R{UCI 4ŪNQg>aG g7O9wo(W4N8K?F/3uN~3oYfX'uf(#Qq5j669(KV~|G`Hu4a҈!p6 J4F5LZts`ܞ*Ϋ|16?b _Kz.A_ɥbM[,R~ؓyĨwlGwqەF'dԋ_|w-}j״ᒟ\пq(e@ɞQ]6mԤ\x2D0qOϾ\Vح>:D,+MIWZ`v`/M.Xb]1RJ?1}&jN͟ >^%@ĿewMu]]E6<]݁AOt탓߉k? T*f3/Ǘ,-?:>~bܤa6{/|K7+NXv;^elDXH3aziCL&dBL)I8EPn A3U=dvaIp`$"o4j5wRqWGKJcf/8)}L[@97%q>FBt#K;a9ѧ=Ǔ<]= (2%¿, 0.[m">UCNfDwܑax>9Ytˏ&Q{[+,La2n"$Wn-u!bDU.83ۅKGw-vΟHYe&.e ID玿׏W|/>Gc|y xWTgע&8Kz\.,g7R7u*\o4;ttOgPNoX]Ke`1-MaO1kx$CGO#Q[X#R2h+FD8d_GXɩfv: h&v$0@IDATm6F c(;.0@. BZVhQNƷpQSj&B yݢsr/wA[d@j$ sU#[VQZLsE`ś~$ Hohе@ )UY ؽLL&u9,qZ^ q, %9s%G!YBFk\I[@N/z/gG^6mi`UorOJP]Ă .ѻOK3>_g|n_g:+k~/$O>[|_9^:E}d À%?x'4ă 0ivA$u ;Q>W e oÒj1"JA0R eK2y͍ e;3 ~9Hh''@ 'rJ"9ӈ+OߥZ3=;J%}oj*7/6R~%e}E&#t Kr߃˰@;$;t_MV5>geNjX^ lRi(Z_wyg?Gn_#ľ1'Zk.3ȟ,gQ_,/}\z̙\yVv*N.Ù(!״ ~V.be %@rvޱTΧdCaezOZtIh\RWۅo^Zɋ Zղ/2Wkw}¶ɇMࠍ@k.%A/zun oH*+6A5_7q 9aF+,O@Ģѐmj{4/ d{:Jc}aF};t7ʪ؇uCGVbC &)dԔd8L:u݅/@,a*a" tLJJ?*C>j8>#m1aia*4.rDuQT @6F3?pxYO#O܇AY2nX> /6މA]ҡ 4ݬt o??X U ,(LGS6W~W6ٜI]*0Y1 |/k~Z?ֲp<_M&qe&䕾z_w?zp @Ahm;k@Io6H]'u!D2OڇY Q^EuZeЌǗQp_f8+)SքG#! DZa>.roE\EL⨚.Wb+{`i~kPW̮飲i8$"cOU,0= #aZrTڻ;e}~$6GɈAF`DlFB9kBj`VL?ᨃ+F>]*ǥf}gZV})9wΓAT!O&LG~2Mg`QF0C|g7 C5=`7oH{eFط҃Dc=[/!2b(EQx,"v7l ]ǫΈA+%Nv_ 4e&KT|dtqxH=D>|~GS~<iŚbDy_^S h_kwVVVX똻{t'sx $4.KpOLHWR/Qy‡Q!?#@ +N?Exf |ꏊ3CQ 7Ǟ1ƒ =~VL+c;qoH3g"u5.#?Sv?@HΉxU909󱞗}_g?'{{ˉaw:эW^8޺WUi~kIW/(WE@g ߝ*4l`ڤV!+^j e`I/aeBaZө!e=yI3〻=;զ!DAdm D Uqv7SJI E} ?3bUsmyqdٓ.ѡ*L3x͡L^_-G?zGoT\R@&ctQ9zn,'l$Gj@c'J bͯϦfᖳɵ6)M#Ah1bql!k{&dWM n0.aJWˊCUoUA\1uQ<:(HL)?e.g@8}&Х¥r׳w~D?v,>O+.sۀ&otӯ5B0}s6{~*JJS!,%I+AۺT4qmϢ/<(]+mQ  W FB E/b:"a]&~ʄ[{P5$؏XYw|?O@2d|C;=aIo[ad<27@?j[/-J;~WؒS/Oɢ0б:Ѣ>y:\u.H?, ]$#$-U39rʚA?x-AIr"XfZL֐b e&~jg'zMXgO;$fs<_zQF|Bܰ.y` TxAAb9/"7D"-sV2դ(cɰi2dS[\`_: D k'M8'3AFU2(N@R÷,j4EP:LEh=)P +S)6`7JD_(;bx Js(ϴx|AFzf{fjի nJVVҸ"д?؆}Q|BJD^p?QlmfDɸumb ܐ5MAf<|fY d?Q؜;O{jN_~9Wpgfقq__?Ѐg|~*o'ӈ3Ҏκ0[" s}6Y4 Gjٕ/+b'>\&6X=;=2+ʆH%EPY3ZǠ-h(?h.6(> LpmLFaD tL)C* jك`RWP\y<ూ1+xM|9w>7 o\H@ :W鐟?s|>,.b(5eD??3~v+>חzk%n{I 6w3Q M^ )SKD rP TڳAb]c.Թ8sCVEi'&mI(^ XvaJIP? i[3&2|[E̦M&aIS8N?Ty[3ي  lOBgB:aJCF&>4l& U[OdΊP*?9g\qeݢ8'|d1#yQ (ɉO&G&[.Ҟ-/vpW=ә3GuJ͛G9'G>+{A{u"Z4iajӝUFO4d:_+U#LA74W3n Z lKރ|rɯe[oyȺٸ?wKW( eB1 ]R7:N?|CM><=wQAJ+T׺hߋ/Ojr{} U*휦1ǖMy-ecŇLqO/L*`aƵ<%5 IyO2$vi+l } >v'uEj˙PzCKkh叉7SQo'=H(9Ud\+h`K> +iu&#|D$,`W8Qq %, iWFKف^ 9T;y9 V+˚tFC$7 a%l? %sG~|o[i/|8d NȷEo/h_ue} t ) z.hkʘ# O~ew}:" j_>wWwZEb%GV Q~TP[ʶi+.zWGIH 9pX( 1y_ o5}1p-YU%@%[/d1zQ#]NFC6H)jd}6"W>Is`=P|WۇP(&%YA_{GN?G9?}=n?\Ҧ$.}?sՋ:'8_=y W&$|c$aŽ(E_2@Nn4L88W%Zխ 酀=Q!9 "$c ?g6 ! df%0FD* }awY4 brL0 -s$CdA·~DR|2y]\+rT\Q~Q.:7puwC}j3Bp"#Q 0jypl܃\tCհM*$2gp,Sp~&g~&M(jJ3㕅qR}U/PɂPPީ>3<| cC*jz, -%I+ǒ{,}U:UKFǗ/wܜj"J? b'H*wx^zC#BqFh=A_ A3 %)Ke (l.ykR\pQ:0hFAG@~|#DЋBO|DtDٖi'CJkiwy}B~*3{vIxEdJ],t8}"-GFt)%!|!!RBhx%o! y -{9-d n}H9RHP~auMhs)`9 +jL`ᇭ+IP&@nOR 2vZD8ҔpcX|nPt{7F>@d ߢKvRZ82`rY]] yg^*8j*:= %Ar(N6ikK4E:\#=ul9P&%u+ q@(8\[[6=Ia3U a}.⣊pTСpy''YwPl 8zp@aGE,ؤ5Y~TPMu,sc胏_ߛTgMInk(`@=?^ }Ggk#ڑx O0aُ?\%lBU?y|J|fh<;@8up)7|LAuO> I!@USMu~36QR(xk?⣋{tAD"qA8,A*?4T K+vjRgLV2#03GpQ?h̐=(N -- hZ? Zk15؆nQל&9 ¤Oޘ8TtM0^;`PǖQ[5x[~_?I>\0+jPRr_g{׫}Y]?Hmz[ig.}W_KDAdy}E@C?%AeI엀d,#&xCFf{ 2`+c/6ڸy$!3Vv̋lFeo##ԊR<ҭ1v1Ӡ5.[g^} Zu7+:C8F={ ̞4Oim|M V& CvGٗ\~MgR):ӷ`Dt TU;E\p y @詋~| Xn[-)ǐ`YK?L#^=YӇIgQtSS)n+]SOGX[?v-vB>ŗDU{G)~DȰ.})";e; Z|!F`t4 ExBpp!N{ww?3~ٿgH|𧛺3`R˲Aw%XQZ_ǯoowOsЏg6M$`L0h/aS~uO_I,֩ ۍ񆧺wdM8G`ŷ|. _rruLSݰ7e2E8dÄjDv( Zn$ZYʥ|cU DeʎGˠ͸l6Q :41v S2aJWJzS2&!m/tK:?޽wbw1,MJR!w(z@ &KC7ynM wU,_kɧxM745o *R4$ XRA 4l1REʦv~@vJfC#l3XZʂ*6XxjtqcmloO!B*dc#> GF8nyWoʠ")fnO@'`C?gߒ'pa@Ӏ)x& &6WV@j[H@` eG΄W/Ae@ם hń:m&9w;=g?A?yO罧ՉU_Z@z.j_;u zZbbn g]6:LL *[r+؆.UKt湝ߊE/a&y@]MPB :Xe(LFMt5 S!W]eoܟ@. [㨇L@@7BˀN9 r P2F秈C<7:4Amʣ0 Z !A`s%=0a_xTi8:Ϳc;a$?IJ$WWbL{N4W!wuoCzDF9^7ZA!'6Y]>Կa$'r/EتH}j.G/Ę-T1z@.1п#sv <=+E>I+Rp0UL)&?Ҙ[z9(=mK7ЅЇ-JY;yD4op'{V4 V~Gt zpe1 @v&}؅ء)<8S~,Z/U=c"5lp4cU^^ %mX]Xf浨,f9ڇ=zҴ3ʮ8|o!xĝ#xi7`.eM8/Dp;X`"RL~ձo5!`{zRVC)<LFtiF豈W?z?Aj`dD;)~g3l־: !o.,%+A1&".c~ ؊)F!ןTfc4<>H5Z3,ѷXc+s8AbkņD׾[!3V< o9# :rs WXSpa#2H J+ dtsr r/'OAk0]G2~`kЗqo%6qp؛OyQ׀ehP~B_`>VLg-aOƷS|S$whʿT ctAw|Z  32A!ÏeltBK< ' (ԾЅIǤ aX ~7gZ‘5Bk!E_4[UQFAl*x邏&:C5~" _.K%"gIe UYkCˌp[ :u>KrQ~q(5 L`)%X(nD3UJ!``1E,?y+ħ!~զ/.5~ZV&g_]>}5k0lcy;ܥݓ0~6+[m @(/8輼M>nkmEg:WlX۞L{[i7>Xc_Ij0+2nǝ&!J/AVV=!l&e@l}D) V*+}?s?Yz?jĻSA}M~_g5IМظNiHVB6; 0)=,eZX}gTw~XV'݉׊Ça_Ivo Ge%u@JE`wGԙ<|"{֮bĀ{Ig =ˎN{D1li"I G+/MKP&N݇a&?v3H7 +Kasm];ti ~$`C9iR UD 3tKghPmTIE8ͥa0S`%‼IeዽBZ:G]Vp/w\E+/$ VhBS9Lny/H|#?C#6h”y'[87@]O񄀉qz~qE}٩:$|>O }gk= -;|c:Ѝ4p x*:gm`"<NAXof5Ǯהٶ鉬/Ey?1RN ěN[{Q!j´)Mc";7iOaeM#M4XY7ރZiu"# XAmk~? RN; ޞڬ32S c.ԞCk/~L;a$ߗh`Upd7FГ>Iq%yJbz @'GiA@@˷TCC>w21u%6AK`_6LwG-dfgpS#PEp5l.Qٲ)0F|Daзvdu~wWS~r`O?w{>[.&3NǂHWkz|OǪL8Vɛ%|[WaG|`c9PV'3 D;d]FM *ّũ.i Um 2?4?ON"a؍[bIK,{_ˎ|{7}/uq+eפ U,qf>r0SEcCjxs jn/͞h$cۯeͫ;z50&9!6LRȹ fzZ^'`8+vYWݎ6,5XW}cvw},x.ʑ>cI D'^yZ5Fq)PXQשLT u vFy^#X/)Qq)ݤHsjU }:"+} (ǀجuS&xGP4i*ny]q^d+!)j)}kOPi晷ti&×んAƗ䛕r t7 Ep`%g|BŭW ԍDt)Vu,+XC 6Q3Pφ'~~}>>H_?,E>toyA9?gCg\,3f sjNo]R4Iu0G.UlZꦈ8 wG\= ->=O{:5zIIh7oat_Bx(,VL}yq@Mk{b|Ҽ&keMy𷽎=<4F*O"g=n9"Od=+(?%I-UޢQ]&}RzvY-<&V¾ӴoWGw|n>pNYͽ)'rdl#W$bq5d0ɣOI]a0%=307FW'U[ҢZtDοtr+[.x`=VCf'd'N,b}|ß͒P|K=,pGzϪ&9-y*M4Cӻ>9 _of O9+j qɼw"DN|lq' r1|UUX,BZLe.˙yv)* rO.:}ߎ;Cu7t0ob7:x.i1;}9 ۬lCL`Bڔ!R" #\$;4"QGVUzO#]i%S&ݿH=PlW`W2KSI֒ x)eDЊ,.D0!DD`DsM)"Pfti +~&B5KC\1@ D'ErOMgⷸ VMK6--ۡm~ aEs|+U?lɊ"7,rcVǻ#w?a7!eSxsݓ S=:$gZW<6.m6̪r7)w;xL)K^%@l*-^duFM-{w lrgLgBh<;W/v|o]|V I*"Zz&{H*r,r4aiAg,"0Gf^>X[{-L0= e6:}^"-?.~_{xΟO?4w_.E,IJ!?=k%~6)Ϋ<S63`J0c idBbz- gl0s__ Y0flЃrK2ȗMe,R W0 LJ h{&9{-t 4lP=#ޫo#T6Я@gaВ |d{eg N}$].vf vh|F$@IDATQ;/a5!=W,' w$_'N5>#C@dGP! g 㠞] K(,.4>T tq&UIZC>Z:?Ҕ 8|t]ᩄ!⬙g2쐳k&]<.RiL/_By}Q]gW9C7r_*uHȠ՛OEcy @$d8t RQkRd}W)% ّSrӀ %"ui:Ÿ-)aAG Z@@bq _"de}wpdwv`;&ҽwW6j~~O9_/7.-_~iRsoo#H⼷§H*p8ۭi<&6C'ZeͫKpr ߾*na AK~ Z!V<;/J9,RK"OǥI>ϬSlb{.4|'S'7t}c?Rh̢ zpm^`|;lx$yE`MoC=coȞ+%c>#LɸߗվO[}$ yd(y@?~{X)찒7rvb~{+]p.sim-3'*U8O 1Ԅą"dBb~럼 [Ȣ㐉.M) TʜNTN55]P+It@sS[2R*wx2QJ`. `]Zo ]1 #eP&"_r6+H!Ek'&^*J?rf%exJ~-лN]!:|wX?{r<~[;nU6]鍒K6rKZx}acd\%$0$a|\)>ndTA.b&27c|0# VK|@ VngRUď\ed"iR; ?~Gf`"B! Bf*)ܜ _eIM2Oð8SV(0G[m;uuҭe aO㻎 1!!(&L;%8Ni},v7oyAKF2p mJpN[.8;i xB2;'ʏ]CM/*1 9;JGDZd_ițԑ_1%8f6G)x: o5`!YgobOZ&Qn(eaqW\ CG[LDos@a!ʻ}}(w :t?իA=B uβoAd?,_~7]=/_yU˜)I9- b0wIMKk-`|C*2a 酴a BurAN}i[e -cӀ/yAZo96%/ȸ o7'Ƒ3Q ` tW> guD{6^@Vxh+,9dgTB$=TwDL p@ZHD8KWq;ix~J\mYрV,c|mBrezY'K Yf?W>=sϟ|}'r[Ցݹ᳒&?Ї+B4:? >t['aRy÷HI'iE6HهOnzb4%MÄ'N|~+ƈts,3X+,_#ȗ:l[>Xy,|Z6ߟQl;S)ìKu לכ8¯}or_<2 $ 5[vrHTMo%joݱ->|>b!2TY"fN<8|dh2v+ӟzl>&1e$Q^nxlS>զ;Or6 ss,Ȕ^Eվ͠o;X؜鴐_X&xKޑ6hitbw|\25#CpcC= oAc.>~AFw7Dm}~:|H0 :7AEiU1l\_<;|#i!LO,<5㥁sֱzjvǎ!A3 b|gww]n]CuٳуVa!rBXvE'NxO'!+k%M;pghf?g\Q(4 >i~;9:!NJ'D^i5}qz9W[$H5aʺ̴@@?̬'2beY0! ႬI{ar|+ѧY34+^EWm:p3oBC]F<'?B9v*2DAQxk2"nC%b0)-OY6?Nl&::B_+KT}r%}07aeNHB1DS}c~x[| G0țjh!V{hKH3DG\Ct~zG:=Ywan;g{G [>p)w`/9FAuqK1V\z_E j>28R`wF2 @Ė /b5[v0JMQ7Z=V_Ф81q@E?{ }BQ+Nfv0C>#6<2jWRn-y-LP̀>zӥPHiFI\TYRPKR =ArWJ^$ r/ibūӧ-џrdzʏ-$Õ̓$~L(V@x71EBr+hAhJb0ɬ`Yz (}]]oMnxU>SQ1PEj:2Keg_qɯiC=GK ?y_5!o;Hs8goҾkٗIO=QOq/&Gb3n0̺(⚡Z8dՁBar͸h!dr k~A` 6 MlPZk"EYL/9D@pQ& V~5)@)A0)?,u|wy/{%'<άl-lJ!/U~Zx_9DSʡ }c~Fx!+' MUN~Җ森Y,E r;.[Gn *o4GzC`2τ]v@4BLzPTfR6wt-¹/yZ:yM\.՗u@3z -K%!wC ?jW \LVOyry #s=+VTƱgg׮|ِf(I8aVCShlB4^gГj\,z3ㆦi͠)"clC;3werr,$]ҹWC<-Xя^v1aOj"gzj{u篝Dc_?g}?ҵO *28 f2N;ۃxsǡx]kO^8.Wlb|Ap3 Lhb6px->$~W 0 8.13O, Z1vP׭f)`T 8ʟl_yodJ/ voPSª6^Xa M=Kl̍ qncD;i6;;?1q#Saqe(Y+O5Db4ꯚZ+w48ցI`s8 Xg gC\wy.+ut#m;Hjk 6bwqe2*Шx8VeN -a[JmCt ]|Ly4>HDKQHlpB?`-C' /m§g|;yί#}Y]/+%CwU?{xZ\K$e%@j"%''Ag&겍,ħچ'x t)f.֦ǠO Fv!Ӂۂ+5QF?m\I+z2UBtmo$li(#iR.xQO$siN zũ7=Ah[`&[ئIZ&OaOeALWvs癰XoL3P6/,{+9{?~n?|?&L fΫ](սo|>Pa7 f(4 nA4VphI 2q  `M0]m Zظ4DDᙞ|KoG h qdD}m#(6 /<ce W1@tPѕMof]Nhf 6Չȱ/͊Hb܈Ĭ+U~:y#Fd Ie:䇰C@87)(!*SubbcdG|,+|}:?deƤ3pع:4J2.G&@[>!w -JU[L|~MJV4 i# RPx噿3h0Q91Bm,DA#@В'.5Rr G?G'hIJʋ~poDI-i"/zۥl'x[e>?4 :ڡf ڈLg=1x:$놉> ]ڲԒ }v<{s2E`yOϒiIh>#>'?|I@e"Pu$`_Yg_玟y}!Jɫ }2.E^$92Do,o2p+=IJaS/~ xh|nK%<8F] /lu=YΫm$69q4 P ;0@54=0S/18H:I#ɯ9!Vt$N` l~4-OWTUʰ,IB 'VtOիEj"/Wx?H"&"؆X&葇 WKZ4>ФCZA+4ws֏0eh?H\v_FClz&Ojy%sJ@&.`ijR`p{˕j 7C6_Vܸo%Bb~v5(Rw, b8z#=3!@'': HBWNK>ө&z' )䤫QOʇm>y0I-ȱzfςI,h0.4z#ʎ</v8BW`"pFaxY(xh1Dc|B1"Qe#-^;^>3{l믇}*i|?9/}6A{Σxʟ,'Jc0t^^1 ӆ%:k^8u^S|0m˛h% 8tI>Z-S{X-tLp:MR&$hsgޔ[$mZxyrP_F:?䩍)hd˷W'N;*,Ru|0#e2AY-O>D`=+ŪR DO;)gUZM'{ IJvuur#u1M/F3ML?A9oRWNuIa&=<n`/׎<%aVqN`d[ 8A/S^>P >}גɛ;̉}Dú *:C\~'$&^ H|wOGy Dp4VfR~a70h`mZW"D~<)Gާ #Iq5ísPBG})1 Ra̙&듉,%8|oM&ǷFSVGF!]bߑVԠ49쬟t~_ג:ou|ӑ*7wp)?D3D kf#ۙMUcǶ4e=@a<:p'Ok^HVNW{JZuOCLJF۴#':CF~WEg9iCJݝ&y @/T¦jPti/BHC&3xX.;(QkX4wkvyڳ^J4* # %NRKs]y(GppvXGb2*v1 JHu`  E}6p+ĉ^)P'xCy/nP؄C_ՀR Rn[uwƤkO;9O}篺t<3$:c'{:tdDL?l}x7ϩa]I3a/2Nqcte%yUVT3v{ES Ef˯$p^#*6 7-o|~q B#>‰6opgAOPцVnK<6LSvmW(dS*&Jy[meNsidc؃1qM͏ ӂ#IJM;vIy|'H;)m5IlآtC9֗"*|St~<]&/?2M8Z<P;|J OBuHԜxW@? p)_] K8A~n%Zx&liCքm]!yE_Hܮ8S<Q#;xDԃiuqg1A,܌c0@f KyT.1#{ -3&fwt^{ >hg/8W+G5SR;tD &G$aWhOfIwݗq~ Nu4'kڞA54mH$jgGD&o"K@7 t\zYEN!ׇcJ +,Rfp/s҆$O:y&_{7P۠K@tnwrk5Ik7@kN4wd{|CD;1h- ?rwPˍ Bz4dzg|*p (\s,B~@<:`*3Y>tTGmrW.ԉrbZIxho#m/;{g+rN67cFo;s|d}&Lxwׇ+_id௳{'[>z7QAˤa`; 8EJH\ܥO痕uֈ`u7270w}fIL"Ƅނ0?J]Cʲ݁< YZ]|/ :^qCȲ mȖiCoax? YK__*AnM V%̡ΘFi3w%f8ׯ ɐ1-Sx+fnKўz8۝@pyswtV#{DG? b#7bFG3DwϴRAQvZɻE.ng y]K|Y(q N'p92FLR@V8ǍA]}=-DoW [&_ B=] 5BWH@ NIvGӦBGn,+/ QD2Hv"KHcZ-bPA<_S,#?GL8k?E:cg{4}觼ܽߢ_FHkSwsk_{>ɒN5?ՖS q 2/mJ$eK(٫7iR~t^\Igei/:/Q7ʍf6$ܒ9a6׹.UрQ:=S5E\̒EZ%0gHq(s*dkU^{XPrʯhQZۗbs/IԛHJ]T1AR !pd˳[ C (ۆ&)G4^Gia\c:d#gY_|Ӳ㟸,*t\fy7=w|]gϘD)oBl(tW"eK3>nd+<8%(e bTܦ%C$&SȦ\gEF)N(:R(F1Z2VxGa=W/ٲӗgKDGpH`xf{;Fa ijm .4a9r5z&#b Ce=$@V{-pJ7a EkNK@6X*q?{bm7k`@ }c<=w>x__pn)ͭu2[EZg.F?iM]X޻,6& t9e2g0/8fiɖư쉯w'<{c!e _"/0.qFǥ;PGyӠESH%rHĂ[ YV %e;)ӥ-H`n1< IJ>σݤ y#-bZ޼Fxyqj`_黻-3=ǤʨŞTy2:j[` 1|}Frw*߮ײCm\D2>G=z'_קu/e~!>9cU: (d>~[x)L[:Sgs$~32ȌoY1}ZL* +2! EDgytÙ.$nsp3nro aDj@xHs2c?г $S{`&by',*H>]w[;ζ| [Xk̤lq~Onu!a *62 ߷O%!4%ćv7П]ޱiV FZ#|4jdbyhvq3c+"vw5-_7n|B&"j3崥=6_7ۭ83Kf:J|A8T{}q/F/ׯi~7ݣX@¤] 6ـOF:런U>ؕO@ݪDJ?a0w ќIx(a6q%4;֖Pծ;rtq´o7! }^ZN~ 7X:D%( 4x5FaI$s5}=eQKxMwOD% A5E9=hH{x$T =V.nVzWxqٿI<{w/ws=i6h8 UΫ0gz,Dd?o4n!/l)ʁ b KȵlIW&s /%}L@$>3eS>f(@qC,S)/5p87Syȍ5 AK9e,_g>as- ZU5R&lp?pf0^1:A^GS-VR%Ю JBI||WE4XB3BBsj_blS : ?br\(vu{Ǐb~Hdi6RmK]e3vXSF6y/3A{Q {fTZrhmtRT9.y6B^0I C%!*i~ToXvqFC˘K`HS\7#TJn9 #^g0eX@`T:ȱf5 #2 =2mqOR@_;K}OO+|kz_~ye^~__~VzRμi [7 F~o->K15 a>姜nElH;ʊ6l4KFyk!X`>dT]-{ٳ*N8 ZvSGP^~EP~v()[K`z1w3TԑbW > ~?sxU_l^_pkpջI0k? SJa~ޖAD'jUAQ`őK܍HhikӨX\~_yƒaaIlOTM;y4R"g~z+8>޼s|9ErG dArKԏxu-4?`IfBU҉'ayhtәSçHHȐZU`6KF`FY#;~fū?Ef e v,Ӳr86G 8GGM~&?g?>llq %`/oޫw_&rd⻤qJ|A7U5Y̯ x?u9q%(pkd6| !(hU^gejwȋ |h{Yk^?\=_T b:Q:*ްi6'4A?Ox !  tГ1j҆ûA qA60h避% }/ޟaٳ>n|߸:5+}a&G; .B_ˬaϭވIԇ՛Rgp>?SȦ}8wZ/i_ӵqаBV-<-?x^qxܩGylQO USjx,C0%SZ^ÕqMwK ve2۾#(aX XzG=C`z*ùިTGiVlwX[`Ӏ ʊP "zê:%vA ֬EӰu٥Si O?ﲻ0Qi• &12סY5>7 mBm~NJ%6&y3tWkh/N!p*SkxQy2No?w",2F% pO]~NsxNN&?~Yf}X&s{apqZ[FSSdA"WLkC7$H'@GOZ ؄f6ވh%aEΥ.Sǐ؁A>EF>a c` MD4bw$&N2i!#?&{яݓſ tʞȥ_$}G:jU`^wͶNb@CTA8#=c&/ [Ғ'g~[ ^=:/_\se5W|o"M%Ĥ0P5si!IדF%X8j N#oVYقLVd0%|7nH_ c0n(KJL1z{)) %pK%D[ +1Nf'8J,;?5M`j=áWlS`P4V87}y_y_;\;a3 O05Ȉ0ҡVhyvV7z~e'E3+JCTm-CY mfΪRkf $y_gĢN[+Vio ve eyL[!1x:~ m"C:H8M¤Qg 9$|9P,od, _:ȯ*#I 1д>#A Nx#,vWZqm_;RWuuBI9}.9#jxF%. @sddX )kTNJM;qL({6|WLۋ 7nީS'r7\ŴlaW2f:aoD#J?ypߒ*gZ`iBT~XVHH0R@J@jN#Y?#0 Ϝ⳽s\,#.tPt[:Kyϖ / [ !]:xOZӥӦe+e!83$ 3`mg3ٓ)Ԅi'&1a@/uU9=a^fYm-zn$.b-M{X\ˊ%98qHE27&$)y/k n BЃ)䀻VHF G" d//}sV`LVgכK/~fB W ]9Gt#1?8{c'g::/ :kGuQggrf?\XGaExʗu2E7\{QDTW&Ԍnt h(O C=t 8˗~NJ˄DˌT5ÂxT2B2 E" ycI.VG~8g{Ǽ~>{`>|}UAm,ԧgO|ek M͝վ)輸>9Ns&Ͽofk.:#Ah 8pOkmd_4~ jWjo7gm ir Y]'[L )mz>M,a.4_U Rxkk-ndƐikoi|}6yL6, Di&pwy :t6Ppuk7fGr["lhC8M b6?ߏ%.x o\WLJ~߲G)w, OXUQ{L(v#dcό-H8cR$L]꣆tR>yS^_Q@^., 3"%iQ̬ ,?hcG*3 R™:|\ZښU1˖\quYw^c,ҧ3x!{'O<{@OG] 3~_]#_/a|#+rKw;߿ }߱93z/T 4ҤB6ْMwᶜYkt猆8ʱ Gx)1ka8 *rٙXxx(o8D`,<;&Uҽ%J:,#o ZOA輓h'2͏im;:GL{g$28vIOjzc+~R6$!aKNsıaQ>X?cKǏekڳ-lkys2Ul oJHrhqapäI4ÌT[|]$M̲ 8W/F˯%OvKgݴ3Eo=̊令+mۆ5?LcxT|GHNՍ`HO+b=t9\JmƧ2ËB:by+if4-%D8Pʨx;ڳ*.WD.Ƶ@T MJo kp00Ѿ5qZt\gq3g`?ْ|; y5xk{ Heen>*wF"3@H$ h*fn1 1yZ@s32'l6_Ӷ}yAKz̕J g|$g 'UJ9\'WS(Q*\W[agcOȧ Gk?{wϞ nf(]x cυT Z;\|~Z:WϩAKVp6\o]Qisݼ732Q%^ [͓qH`=o*5< k^?(́w!۳\M\QX㥬>Dw05uۺ >lI#B=(;_W?,+4?7b԰ٿɚZB)#|o,Ky7pg]&4nUW_2I|d R^pYMyr<{/_1 3foV?i`n,xZ}C~ȽZwǛ'~ʷHfFGxh7~ɑ2-kfd\MHR0 /Z2Pj/:t:( ƪE(wv[oͦ| 6u$Ú.22dѝ|Aww^ԇ6I]k5RD_[}R\4L> i(ZՏJ\+VY$ Pt0bH0bב3b/M8ִK,qM oZѻhV-I ͒*p#l;Kk+j1looUe4d}['D0E+ ~* wԠ;3t)Sg%)Sp~/4¢ɷV'F|5XxC{ ^ .jҤoUmG[e~_7 cq>xw;9W h{DQ|ce_2uJ gUrAAhC>$AoWwPW=?34ܥq*nIC/r{/[/i Ϥ}HzȳH]6a|ZDw L/zT3cÂ}9I([;%M[͚F/1q٠ŒG(1%<ܜj] p GPucVtiCy  ::^Tqi/C#/Ԡq{ Kt8aG7J-z+GĠ`ڌDXL1W2B lgŘ7\ w%4U?g{=G_{oEVd=.x;g/k} tC~t,>tnmuL}TgIӿ y_|{ eqvsY~0f3YR{' )ki^A:R(QUTe{=ZJ:1K΃$fi46hWT:CJ~L<3o~_r W8dO[nY;|y߳deBIx,' #q)R'z\qUC:Y g߃rGP.ݫgaZ}r%Vq+8&Ӕ5h:SFu]4 A]a]ʨOIkqCA&S/ɲRb{g3o4_?rzx]1\Xӕro.=FH)ǻ],ɉ{? }** I# ivP?jk_Jk6u9awP13=U/4moo6?ASk בmhǞS&4?~'W0igXvm [s1w|58p5>C7#ăh G9i 8%4mgrp w~rrWt8*L3?66)J]VU'[Wo;Lx8+O|}9/$]s״ A Ä>Weޅ^)eH>TQ#+$dȉcŠ[*F!;Og?kz3v~q/({BiMMw$z_5W}ɸz94, 8h$unCsDE a3qƋ2e_4cɰwC ?D:],ֿ+ŢC aY]L tuP!H<( ۗKt@):ѽGP/ߘp : UAW0ДOy' "WQzg8񦅍liެZod]< u$)hF9D/d’L(z7 (X +^K Ƈ2"3{@Uf9tt+^Y2 x!V&闷&9yl}Ŝ 82N-~TGDV j`GQ2v{1Q^ɵ\x+̩BV5dl'; zOEVFF h:)Vc3%Ӡf yuxQ(u UFX4Y6ϡmV{ Ҹ 8c%"3ɦ?Џ| %St$52')̛S[9yp:3zH:r5S+ 0};l [{dyV__w7`+.{0~'5ծ֭ho]įC| =ٸ )n{~{gCmuʫ=l>Wl]4¼ξ5׻W^SQɷ+][+}G!t/CCiY)?EQNȸ=cH;mǎP49tmIf\iѵoo.N냘2+Rgɞ$QlK nvX+A A᪟: *(yf摎c֫r({ gZѡ=}*A}eo1 0uutiXC3 cR)]D j8el`Cn |LOA.ɲ D4:2>}\I|`9PpľR?r0wM80ʮXaoe?3*5lOuUO~"̼51=)x3=y|i3\o]YHt㖖1.3=Z w[qF^R~zƯgx%et:; Zdd:82-_E(ʝ?Wڊ>iW (HFބRjL=R-[ ^<ˈAeʎz +!vOR>U%-E^~p;DE57MwN$aJ.ހg{3lV 0F ''H߁?#ex2C,*n2W,y 36]#,bq͙UA{2'vX/*c6]6 X?Ai0yXa C2vCAg,Abf@|϶e4(.3?cyɿ] p|Yn4\sgjF;s>=g+'00p;`` ˠ.~b+d.IȡwU];e3&&6"0@5 Ʀ>haa۽Hf@8ϪYM]^vk;!oNAS^C)31-->!EN-~|.+ҏ}lV>`+ U4wٲFFtȏʗ`LqoAs^&H[|~.ިsHNAgwFKZOu0iK+N%RI]N l I"΃`9ЇWpEJ"@ itҽY$18}WI{_&*N~0bpڃ^2lAqғO]( GvzVNܳ >[®5d'yaW{} 쬕D;;PCbJ؃3)v7OKN4626K]t ˤ' gh &玢w– PJ*.al8֋[~Q0Ci.*+dmBa[<[ě6ܦyꞿWrhyn: %_?Z0~ ݊9òTg-ЦI5ڛjÒokcM09z%NA2,, ?7/ -7 h/n~!.;nY5A>02mb_W&87OKƊe2=J@:TKGd[F#gVZ0mӴm9OhbqZt):;ƭ/XG;ii;@ݚ}Wj/b_Ӱ\iU]WQK75W쇙XVq&j:bEFӍNUA#VFNׯ<_F88B>˩+^R+ '@\qOG쪒^i `khۈ2IҬ[ w Jm<~u[Uބݷ|kx0p1mYbZp3iG\'#> }RO;@7rDNs8~A.aH _U * ,m:Bm& ,L曂h#}~ [V7W//MY{HCI:-6ȪTQwCjksn!`,H\Q+}D" d)j_۱r^Soatꀊ1(8K^OU!\w}ȏݐ &@`Wt4,udh2t`7cj?S=%;~eT|˃у- Af5)[ngz<>MTpÙ,)+bߞ~`4~a43{ۺj}+pFU~[Νv`ρF`SgdqR,D-LC0@!k ^OrL0j0Z7[~i:/޲!Iyddj"mb?>FԻHk4tMFzgͯ\-_AkbmnH MqB!z99{M!Iϩl"g-Nq;_{ɹ]~d3M37=VeT;="^jzt<3{>:pYv9a[ |-W)J.v㛽̈́b7ZKoiܖQb|5Bx=<[Wo;ȷ `^`ڗyL#θ?3`) B$\Ieؙ=!#V#>^Tώ1=iptsOr@P8L<6NIqY%ӷ3%F@ypF8c d2'37@={0)#4\qXJ˄\rnpgvsz[ 5fBWl=M ]X" f<*&z%v'_3̱AC;\m Th,ZLcXs&᷵U!߱Ixi֑t{s9Tw-P쨴&u6 aqt:{[L L^.%"vw֍uOM0[G3}!zoy;hֿ_GcϾq ;.^_] ޯ8r?W;+ ʶecڞ:Vg{gHCVp뭬T>=& =6GAy4I#}t~GNOA:D";4]u)@K9WyoH/?nl/>:9C`ɲ\!Hj !Ӵwy:45վЄ8캇 a'8}msZSO2:iQ*AA]Zr-Gq6g#!DxҾR9u|jc/(hi[,Bj4 <(*^C .&nDfZOLҥc@ ƉCOO?.y5tCVɏƶ&pqI ڡc@\~=8O3o Ojs~N餳MDye;|yNˁ ~yP}P'YƊ+iן6~ˁ`9h!K&'j#2M 3OtYTbWƑ^{'a6e;/ʠeq/CNIVlVIg9)ziR4J,0,oI_Rq*m)Wq:OV8:!k2hu}aL[̀`EO1TaIդf3Gbsk2puC@n8rՍW^[.]~8`"ꯇzt>)[a e:yP9/n ,䐨1[kJK7&W$^$'twh}bŒTbEz?yJ< ߈0G#NـVx1 ނeΕFܭjuE͓ %88_x.y_ }]ʙFr;[/Kg6r:CuK7Ү[ Ftΰ"o}JcUt=WL/,J?;Zު?iHûB~D>FKp)k|۬vSf Ҡet$hֶ;;;>쬮ui7 1tl}%F7aQ ?:X d.:xHt~`$ Igr6Q+T4Jҷ5 ? $Zq/]Dt',Qvt3;3ęԫ'YÁZ{se&t&Mⶱn ~)hgtg4EOdZQu*aFC靶~j+2/Sx["D4>kh? Qufj_Q$Yh{)G<~gDM?ll=QKj{hp8F|LjRbţ *񍛂S{gr<#Ic2og,K:} ='WTa-O݌RG KLep8LؚfC3;9򜽟FTD\[g%Utna#:5?:X  HQ*c.NJ(OeTaFˡ"`7["'TX-JazucSu|h;fLcCwۻ:(#ṇs:ba!@7^V F [p>zO{n>$d;?hNh,yY@K;x <z[IP_b"?l+O3.1rPACLP/)k+;Cc?"8rii'Eʘr\&Fd%$o# C:qGw a%p~ (a GWxZԃΏ5=IYV AvK9#f*1FW*ʫX^U7ߧOåj7hg?n^r5ʌLQ:0InWwO C:zePfq,Q/v g~}V)`<`:VwV'L&7&kh/D[ lG^yh0꥝? %~pAM 1Lx/Yv?$ˮA9 \0 @ '#4*la,xo! DW`{Oڹ~&`JZ}Hdp{ ^Fd-Jh+y^M/q~B1 5Pl=W" 6ˏ+, wKKxGFΔ6 B53 jUgx^t!o"ڞOhAI/ -J+Qkk^ 55y1I%B0-H[~!ړ9%Iuٰl{Fd[ FeD01I|@l]]8|.ZB\apND\0Xk41QHd=tBqH"1^͵t|U -?xmd#Èro<떛ّgZVHӪm+ɒhX P9 dFN$ltz*<.\<;U@o;[۔z?BSg3H٪/m栟ࠟwUdϟKA&$Bma`{Ǘ^+|LcKT3-\CIpȟZയ?i;[C-QY3vR{ ~!]Jߑ64xXA/{!i~ 333a°V 2\ꍇ]F?MxggSxo[wq ΆA ekIr0*<ôCEer^3[ۏ/txwedFx8_z;0+Yx!J)71"暃_4ƎܸHAmOW QJ00PZFU_;|=ݲ[$2*˒/̟25unJK&liL.4 e A/^/n{\iWt H|㯇Πx$lcݲ[J;S>xdʏo;}@:MtN7 vgK^8j,LJ쇡pճQ:(.9,3bšw)Q4V^#/rxLT K޳ \qΆ ~C % - ËgJ P,;+QZ(_+d o eEwZ0ISM^$"jg8 .<=y ei% NIZ0JL{~G>Cg\4kr`@ 2s@@_+៽0[Mtt >/]~jAo#Sǀ3ZC{M|^ x{Uȣ~3x HQL#<^iLDfbcovF{W&gGNf ~޳Si‘e3&—/{{*rr-goDg[db`?]m_[2(`Fa'=+|A;ySR߇3&!Q9HZឯNrFǶ .w&Qf:\<,QP{A4+ë ?O}Zm+af|-%q?Β$ :z񌷎.?Wk? V,Is%HX$HT1ο+"Xڭ42tqih^r(>z[ب/a|F:(L* &bWc,Ówj@F:m4RIS R_c"i†<)o~Hi;凵XF'6pƷuO.xRT |]̈́22<Ȫi:Hx֤}!COm3s@p7ʐm]Ұ$L8xܢڡD_h ҂]2zLspwsA[orSV,l9Ĕd­IN9`p)g4 PsQz3ZGhS@ӟ؄sP"EA9(gt  C25[lR^8@&Պ.On7a*׺` )9q!^s:(>jD(v,e@FxϥXpgJ&fQ}?`e;A>5-@L1)E#:f j$̺jL"5YCLCxI'J^ *:|:Tn((Z?qm|3+y[hq7(!̓ ҝ6 }&~<:SȮ%ٵK82a"c]1V̐k:(Ta+w4*)*ůhvziKs!f!j*!rVt`m}t"xىx:vr9ЬwhoMBXipbqjlOs~Ji r'/ 8yLϷv<?6fʍmb9_`gt|N'M Тqc$ |W6N8pu{5: ,#g O=ɶ̕f`Z]RщvY1\:q(G-iM~5[<o!wg yAb;4-9ɧ4 P$wOvGǟ|z?rߟsC"?P(d)g 5жNكg] P*(9&!m? r+>c7,E@uIHanF5?k$V˨Y56qCPJr#E7B44=÷ŸҬ _ʁjccvƒoF׫M' &cA}${MKCaa /4^s-p q#t{̼ TUFAOTjwjF2d ߠ+l=ObDڛq 3ڵOđ`abەrwyB,Ps9[5Iz*+p|HJH]eb/A\:|%kV!ϵp^?koPV-B઀HPUrH,KMv S`,7cсԙ18(zkvO}ge߂vJ|-Rayӈ^otf-ӿغ49` ~~eAQz6 ^~W~< G.׃O~֘wQ?^ t[ǥSV䇍yX3MtD=qS"z%9}Ga<yLꐄ)V?֙9SġcEւȾP5l%2\B$ՎU\x+,!.vBsI[پ?38 h& b[,v$&L ;Jr:%14fml(XvWd2aا4BRaH$kAlmps֕SL*853te+˘ 6 :K/ԸsfC |>[6yJgS=QFiXzi;l2u5= fAbVIj(,5'x9CO.pҹ":O0Uid1# y'h '1J̻e&]!Sɋ8g6()[#2篒AgAv}Mtd%R8mb%xt*P΅A+vU)v1zjc.}3:3nA2:.œgl!x1f{ Lv@$Xf&?yp >u6)s2ES7w5Gn[9U\u0\:>4AD% J(jě|+WPf M<倌w3 3p2'*,ۨ't?o7uc]qo:/KC폫Whqo_-Pl$J1Em)ܻAD:g@6tzރd^VMѧ!6U -.dBp㨬z|@|!z߻,g]Q)lJ1)nrʳYaRO̓ Kw+?**2fN#MIy$7 ݪ!=5MWқti9ëÎ 7}w xy M~öN˟z3/ ^zkx.H[h=xM78ekTz5 aUWiړ.6O?:itW;n.SkmMDP*[X0W -3x? ڼ R Ct>4$M7.`ΓvdLf71q’;)ȢEf :1 h8c0`I0xZ{/C WTCMw"Y;Bwx#-Us4gKWd޾p]2[xltۗ4s[嚓^u*˯ ?<`غ8&]P#ƸV-;Sp$XڰojLqFڽu*ĜX13dy`/i=W~E pB' GaT`'K^ЈyI'|0`Q(6Y꟏Ry`@ܦqҌ43~{rkS+ݢ[ҝπ\I}kHo+K-dyXh4٨ՑM~J +L B3~Xqf`Iث1O%FnPw]=lx;ኛBf 򢕐|v6J󝟷Z Fgp3ވ AEzD%I21rj`bt]hDO`O8Ҳn_ҡC&x"?[tV2F":?{n1&+SCaɊ o$зM6H4_xd|5 f??"o荄g6CM2qHpH4MA+Y:&a'`G*E-g# 49UHcv}N1t؆ ,8/(8:y9fiө}]983ܚ=R &Vҭn/:@`hid=H퍱5z-zn?~i2m)_*oOց8)?k.q=] FvFYS}'4ĭGE~Y0 %Oî%Q9(d.iJ|иu,ܦ({V}/: xgn%<7?FK:#^;//?woҦ9dzSvfM*sF ITj22cHwCՂG60AF4MTt^:wŻP*TBϦ]EHSTƞ&2)K3_su@\/5kOk CC1 VY;9 &lR\hW~w6X ͭ^^g+'@ދM֤bVsW#Y c eH OĻfR Da>Iy:t ;=7ս~w:yl=kq}:͜52aא%WYc6. 57&mbt;%"1VׂX[S8/# ^c{ }u6ħ@1Pr[+2+J:%S^2 Q"~|p>CyԘ'Pİίr~;|>𒦛wzW3OǼ܉F=W][KP\YXC-][`(8,b-dw+[|viXZ[2ۘJ[#$PMKLBLi乡?sKF?NY":I!+c6#< ŨFQ.#bm@i~ :*/',cHN`^nc}_€c,1W! ?#<)#/2bkGLē>O4쪖Gb듛 x'da&@*cxG^dӒ~6z?>[eer=VIL}ΓɘhFg.>USU[ʟ"{tkM}HyWkb­s?o .y#n?~dq~+D pvpC7 ȜcM39iyDCY,\j\=S&ܚ\\O6~@qpx ֦ q,r*j/1+>~i$_D$j9j2}i/ U tԈvB: u`=M)U܏ŮsVKgM_ "I)dU%p5PQYML8J]3j! #YBľ#]p079̥WU`=ګEUu(̟ i ,^A6̓&cwOӵLQ-jPvG~zd͕%龦ۗ7^ݙN@j,-[-cx,18=Yx9OSW\yL)~nV 2 ۱;/\yRб$}]3.T<L̉DW _b>2@ ol^5",*#oP6ZϒQhmKOL6y)pGL[~A7p$n`%%G: wedzrEH,6iw6'~Vfy;]&o|+W$_`~ް-= [}T$YM]~'Knb<;q|+,}Ir I Џ -:j rՖE̕ +nQL0gkd"ʩ>W~_̬iNZ>N~ ^sx_<:ǒ8WX.7vفph Ԟ*l8m_ϩXNĜurF=oZԘIq +zZ&?krkPPؠMgtw%WHquR!yFs8) cs$YҦCd ufTPz"$x[}K@/G#AlvT4n^QĊޫwd W W~ywFcKUrV+%MͺD}|)O`O*8('RznIkG:-{ӟ`NS՗ vb74A#cgF\*fQ *f |`ąʥ_WM<\jWDk6h 9#\bըvsyXb @>'+Ү42R,x't8 C[\b~:%$!4[Q= +* PW)z'n#0(P]@h;ƅ^t9("Qe_@ݣ<1 TX1ya)%,ڰNP|gp QV?O(V[ֆËx7?ޓi ݂[d o;h8c'h*Cy \|o Wrcu}_ '= 5q K_Yi3 :di=zh=ۓD*EV)'O[ie1J~{TyrXJpMq=<1Q'ANL"qS x:2Xru瘍R n<'/}2&6? Ǟ  ?Q!ĖCX `~CfLqԗ*3XJBK*R7( '*XJАMv@لY*v~J'q08'?g:',H OᏼGOmz*CaO8 f%'-~2 ŵW}AWww/as 'u(]Yo*D/n{Ml y(͉*<z̰ NfWĬqů{޵ MG*_+P&"yA:[yT-$9@oF$|}RZ ]C$ e>W >h A|u -9܃W'A@-TbsIA*NiՇ 2I%/@l,[ae_1WBI,+ͫѠ |jG?|ůG}H+n C+5l*p\%12pn}ծk|3VFU,rqe.h%\4MɤG a  4(V̫U Ŷvd4?&Y_#XS.R}T;FO0V_: 7p8ѶppgrGv5 c7WbNq^q%XxVW ljnq")ڠ A~|U* ~~0HǕ^KfG¸I!1m,\'(C=e#|EJd}eQ޳K&[7vr,nVe -ͭ:+a^׺R]%4l705В(z_ l  Qlzt+5~Zݫd~I:F$ˆ t~I*`m@oUd+dqd}rĂ~K;uS=WيBGFӈ|WH)V3Yd9#'lb7?9a2D_;/x: w2[I zoN?y`*_ǀtJ(H| e溅A6rD>&F)H$' 2#wxABOH.44axyI6Q6 K5(aMeFdnh\I/JtȢl>WϦnHzYA;bBM:vFT^ܺ%;Ɵ[oXF@:hj?;Ae}O~-wVt~%~!$ %|ЮGyx4N6wO𠴠 X2EUwxjdY'{%rC Gk7!68D2q8;d$.13Də)ڝD-O Y:PY$IDnxLAޙ|f #YQi#HQb+tᝓ>8CyZO]Q6NT5Oh]Jkզv @Tb2YcSg=V$.8 bu!T>iXҝ]89٩bB?LX՞A&/^脈}%0o@D' :X~2;dӚ!Ah)cNSlzMΙPAA\FbEe=)U~cb+\6a'?,TTb62-*." =cЙ:xb8Bc | ms"G?_O*)*'?&ib cr9_eX@rGzE Rlʡ@1 vIS#? ~ڟp fEdz<̐vr"VkDp_Y5,:x1Aс{Μ&ElVsmU,9! QftXzʚhaSSe obhIO'&~ŸJd󤢓 }5}K+V:OyB3N" @S&26 8VwYQ[6 '@)JJ)ʊvtX@@"KJ49K\;'1)sMnPn 3]Tu[S.[-{Ϻ'r/ʹts19N<3yx++8uԂ? jXi:4`v~N܎9t 5HԛU%^pohy<6 1hGO;,T XJ㧘ڏ.󆅶2ʩ({_W˴e\7]j3S`>Ⱥ y7]vb|X4ej] *l *h`SNJ;Zޢm;*cvYMD3QE& W$! M7p,E@e@,c2]q{XڒaG(>WՊw>@sꟍ;җP+>8PiG>_JL* O>@ѧyXHW▘KͰ}zN^s2Cޜ Tk°#</뾗=XN U^Ӓ/RAhDlG;orxZ3~EoܝW'}nRżQi8j'|B?tӨ =^EBpi{#.Y"dWxNZ@lHJ>z".[&g@[,<|Hx8 |i%tD;7y&+H3 MRfo24Mm rԴ%X\U0&!rvMt8\~5-=XSo]NRKRֺu[ @o^SP`[:v h$t^'xdv^GZ\">ëxMx^l3nށ<<dOlSD"Ű?̛h({4:䖫9gm 7<O'}uNiH~gә н((Է⌄ M+`6]6 Sɛd@@[|6FRO} *bU ;^nW(pïҠDfdW6ާd[~ $f$cX6,F 8B#=po;S' LHI[ o6T+*no н9/{F[?5 񦎆 XR@_B>M#GG S:'c\I$~ e\89op6|ɷn|Ȣ+pXf݄}2cLzҟ{LV`G=7c&?LV~93r<3lXY~w_ѺdzI`WV~KdHFpz$O:|+~?_)!v/֌Lfx^4"m# x; zļݕ?S"gVYS7BaO>aVvBGY[FH NRY{EPKm-ܤSW/(̎lW7m'"fM+$fRj@NF JYaiާ}*0&`!Ik 1xe8p]}mp9§ ۸nP!iQ[ Q*z \2>/6Q3ѷvml 1pp7[|,RSغakTŃ_mRv}G `s,\McHgs!*%NՈ P iKucuٺg S:ߍ?tY/z@^_`:LJq'Ayඓ?:.:"[HOoUar$k86a ,\V[0e`^k@e?6૵ofp I5\IOg>-cJ0fTt)?z{W|:{בr3݃e@V ) 7?ܡA{j bW8]M$eK<6m;-'7'o-9`bs5[rbvY n \ӻ}¡3NB%˅fhy0bB 8q`DUahO9s%r1 G]\u#R^ 9}F퍬zuSWqۃ,_EўXo>zp% |[vD*,}y[Dx'F8Q cHBXfD)g]u0.>ȷS|MadP§pV=@#YH{®-7B(~*!Y|0ҎT#nGh@?F'!Eg~2Z'yJfl!M| B$y8e zHWRL!6eG׬m"ڱq{{G몾招'?*>~ﺰq &9NRP$ŏ 'OیTAn|THF!$\YɈa˩ At\J/}ɃzR2#E^M]P_9UϴN0^WI @ҟcXit4GI i~x4P  lQ9\JRDzBlG0F{:0y>WvYk b[`-G,š\֡:d!K9`;2AAJ[ pg ( f uNH(~Y(ql."wDl-5"e F:/;BԴ lkyLP ᶯVYexqF&nJݱMrbq= m2W8nH-fP\GL9,N՞oq|-xx!5o+ ``kt9HЇ;zCc\0Yri 'CVS@4h1d;IƬDZE}`SNƦ~#SL _9n_%p;TjP>R(ZbB%@kN2 t[(AہdjTq-)F8ZhۆƘc1> vy!*_c~x3IǤidT>pUn߿k_BPﯵ3d#_$xm[58]\!uC?|6 ̐Ch* ' n,nK@Q#(T@api@JKn`EQ4Q4F넮 E!DXJ=1R+9WYʿ+^*, E)1lf5Tջ]bfqCAOBN1}9ON:$!Ru}U,RݾJ>'>IfcZZ+} 58x:akVӈ'4.i]{eqBNj&/4a6WE“~o~v@ \F!"d6ne1@nS0/`_ ^*K`ORB\-z}>8|#/Aؤ3c14Z.%Y!DJ幑OcVntك㲲PX'P]eoy| =vg(9F`7T# wzdx4 ?Ĉ"+D>P f)v٢L(S/=i*_W2C]螿_SĔ#c>{ 6'b0Oon"0v2BӞ;qLf8d'>M8o eݔvcw|2څց'6]x5;s3آN {r8A:'|)o=?Ӎ^SZg~%4Pɵ^6f+75V[z[Ƨ j<%"n[z,VP~s뾉z%EA.z֡+32f'*4:ѡȷ+Ё~G16 -KyଈPJn70Gx=LQ!O|*O>z"uwߞ;LnH/kmըֻr|FԘHVvIL.D62)kג6e[q7z'0PEQ'q g9z۫c>A c;#aclu=8N,VLR¸eI/![{*%~ F0׍(L1,F%Nmo 6 =<)bXHC>'+GtIʙs2{0Љ>TcVH[ Zx/, |] X¹[&г!:{"- 'W]Fdd`.ݗ9p^ 7  )L)I][^N[p܅R &|[tLJש߶|XCʈRq=G).ީ/w?U{Q߿@'g'/)c{sw*HoLHoh!,֌> X)#`a*{'T j5(Pry: wP3x0|$ |!P\XNnJw\`q?J#WoN޽JN={'8},C6"Jjy4x8A(ojVs?v n  lC@>,2z2t,> Rr \{3o#핯U!f"~`0hB"kb&?4\Dc״ ]{Nޱ YmL1 ȶEZt!@ 6JK㴟Zt`WWJ9KҞ\@*Xc>J+ %ss2=+-R~ k2m=bfcaAc{.K<-u5?CkڹNxXyzs _tXpn~WIbC~H#ϕsM LNNϕgg:{슮?4ay xi-· Ѻ"¿_e\ n6ĄaÙVNĎqE_ `!4(3W<=>sgl$g/鉄 ={}Dqw[~2B@'>%B=y +| 3RNKͧ,_O s[9pcp[,%wc4F]y"Uٛ-0y{R.Sg ܛZP ґ~ JFrL Dʨ{ =l[iG(H&@:>s~#e,fw}\'׊_^ޮ?+R;zXNeՇ߿x7W7W~h4\ksׁ9#2xMѬjt0@CmRA?0C al&ƲO1% ЉQF]1ⶣ#TM"1r?j#F,5wb I7rA@@磻[@?{QX#sL7S-QE\#~H"P)2Ph u_[8ꕶ{ LXn%[d ڲtt%YK&ɩ%6uÙJ^BY?b` eA[{K{F)3JVYv[Xf8nnu Ho4p}7nxx3U'hAŽyԅe,AhK =hM>jCv,UN2fQeTUO*wjsN<蹂%^ad;z=N[[ +FKRމ|==!- ^g1m"@LHB+!|ޣ*qP3,vɈ4ـ\8d'q IV^ ѓ|2DZV/MBfaק[R(OlxL..+uwJ20^tXF!5| Jb?7e`,4NL`,ACZ 2+YZtrц%?={VFsV,:72ɕtщpE~N@ܓͰ> #1!q:/`;:o/[_lq|peG2Z#:+ҨAk*!_I7G"PmYC)pT?L4 P0C %'>iA }-,?US iȭC-c\Ԩ/A~ț]] \[+t}%X)Dʸż0֞`9Y0PY-GQ9,YF!~1V1qo` 1#h]:86ņ#Xp1F@$P*5nۢ#6u봥 h؇*j|SACD^}Ǵ:6vlaw[GrzI%KÐGY F h^?yE'U*ޗ.7#v'لpLtm"`QX^,q@OEJLx!XGUrndU ~*Nx9JiZGk4UnjC"S|0._(oI2su-Ԧ/%wӅ8·,VRjN/t k eئcB o !ΛqG>#L7z(OĈl Koip!+DD?oV.taG p0=Bs_z|Ub&d'Oqvt{+63Kt؁yɺ!ݦ @o!cc`Zzr>='4eƟMA<#@Ќ>O;_ SA`!&䌸yYa[ԕ~.?]MɵR?'RIe;=O UbOVP2[W @WD_  W&faB%< ?mÇ, B&L?Tm[^;2+'vy\c@L\L!:Ǯ3j?xvWGQ~M"b/(X)_,6hL}>eʣpX2{OۣixE{տ~3 zhOqL1ެ{]48f=̳1"ʓaoLtʒ,ʒ F2wf㖯[Tu Du ΝKkTTZ.|ik$C 籇agnٶŢͷKnR+Ȫj2nߤ$ƏoYqI=6EK}&co%g(RZpwQl2D.EZ'f'lt1+)h{lCʢ윫XWG"MÕQ?"4a#m0U.'oҾS7o._jp~'jQV -W{BZ Ӕ/;Ph?/JV7`* MMFk*<א"pL#/^;^-1M?+5Qp;AVi: AsZ Xcq jh̢Vtɿy %M,< )rBfq8VҜj̣%3̃},AFFnwbRGSJ9eA;6ea_tQt4ߣoʇd6 ƼӃrrQB3V'Bk4~q{SwW1=<hj IJd~PhۃATk\-yTf >K#nl,/u;揚xW^?1OSeZoQZ2z V~Je')Ka@q#zvɰ ɅwF0iC b5@'X7'qҍw6MN#2!q+Ѓ}eSr )ٔ& ʷRQ:Bb"W68u`D1:-`CRZ2F_cb' d6A3qt3B:oG,],f=!)!bg!Z.&bHPkx,F&ا"C!(|!B%#RҔ-ΪJ_%g}z@.Hvi {DlMC~g*t;kf}|IR7mOmLȵ"613%e,\_')_k̈́vHi۫rp]Q ~2N,OCۭPO~. Ʉ <(FD2&b s#RZ'K~xARbu @\|JYóOUlރ .ċW= ]GA{Cp,z8 tl |hXxHdȳ&ϻJEH$3cWO_ϛG޸SHb;Lb{MTo,*o: 1G~S0n4a!xebdQ|2/1e|I!G U;msa76U\Y"6"lÒZ􎀅4l@72$XF ;.'f$Rd'#[O{X[OhOd0P ThX#G5ު>%*@h?u$ H7?Q׼A gt 1-%k !_ ƷvwQ 7qH̤uh&QU< W֥?-a%\<4[emQo8R QrGƪxV_ Jpd`|(? "~j/I+Vٴɽ^ )Ab%gsd&۷x~j88GJ O7DK}+H%q+Ć/ To QC{F5S+ߍ+-/IV㾽x}r'*WZVoZN%jm˧DD} 5)D&]3VˆA6e#K^pƏ!Q Y0f?=@ROtUbsO`Z臇@Y`N .XT?oA 0߈:*x,6iry"BgWtJNŲGQulQH+t* jc|4;a#?wtO~o6P]Ahf dC"#Hbϴ;$l% mby.v#}ĸzU0l=$/*ζ_l[Wi #RKmxx8oh,gTH{>&7) e)oH%xQI&$<Ł\q٫'@ Ě^y$-Ǡ͂- LI8i)_{x2 o \M>.LJ@Tz4 f~*S/ǃJO$9 hqʫWmo ?3bB[zo -F :xt{QL$0> \{ s]0%h` njEeX+[p z+2˩RHfp5b&Ol$yY)V%VtoIFV=BtCɛK.16H =Rƒ#U d="^I A 8M'^\+!PZGY:|d“ r sp2. h.9+GQ$?C ]EObޢc ҶXQinLBmD̲̠֗4m$+JxgaItVEEKŘv1tࢗC΅FLkū`} 9InCQԱN2e*mf-y~o`NA=pF^mhOB HeNN1a7=d^p ?Qy-}2Йy%[-Yb~1xnt˘ ܳjO  6yKK(K|j/ {Uar^KyPK@6=D{HO6Bo?5Vۃ#=k1”S [搦 7]Fs+1Wj*'ط251Pzouh5)ԌY`juI×=ULFy +⊪hI\B0?WlIhJS)&m7jesP  Us\Ӑ6l]6χz˟%C@'dMx߼ԽjZKIN$4-͊QztJGR#pid* wBayH&PTbd?[P::)`Fbp=Ǽtke^`W[!>%)6}б1ܣm~Xt㵙kMW,[|^yw~ۢ} 4B{8qHlB*8G9_4F^4C)87b[oVdoڣ0n ΰ14"n5XgT1U^볓Ճ\}T>\||"~&'wqV&'Q  MPic*MLp2QMKC-<97-'yc:<!Zē&?Q_m%L\-T|sk֥[6H]|ck(+v:\d3B?,Z3V,z;ԛG: ^ vGkn-v1US(Mvաvڮɖ"V~+?-U_2H(RC:̏O̡!K,x&f7h?ѽAzd/ye&1Jw#0/(i~\nOXaos2"Zn6?".PʴI[I1݄nCelbS\X&m!FyEbpsoM$}k; ?DQƣ=n fB\}ԏ4+ ^Vt- 9 o= §OxA+A{s,? |Oqs6 2Um#ˏ%* 4R^]~'o^+5=K 5Kwnt\΍0kR i# x{c`TĎʶ4ʿ[}"` H},P!P6- ;,5.&z !3iH1p'A2ӶO!@׮:8ڷ]fx8+hpF[A<"X8.B5h/a6'Bɐ6pOm1Ati({>=A\,GC'f7 4ĨyR#=;xjx&8Tp Æ+ E%F^Q{P&ׁp؄CEՓ7WhڂlWlaPv bߣS6 qXnmQHYדu'tcߟ9w%QCZݞn' zDkhE(/ m0lW |Hc#El g8P9 4t b L -7 S6W.;J@Y!E_>CBq-l%J焯4RD^@lznr +Õ z\AFdtG ]Yn "Cm!6Zn5_!|lNE< Mb}'"*1p ;OPn]!\4!eՊgA\S{S Jf7AepGPO}(vP[sݸs "eN,O Ec.MP'cAѩZ8H!T_ P@u2!O,,zeLC= Ɉ ;t"TXzMzwkR.dy; h 㴏TR41@1jv&X۷6Sd;7MS;! }7oߜ'_?_᫓W%n h5W n4h7N_OhhP95\fV0lL>q:HS4 E;:` ? im|B*K|G08Ƒ0@h3Kz UC|X?L_[=&ވB`G>p OPz6!kdlb= fl Hla_I|541vCv`\ 3`rYf~]ji*XHV͌=huTTn`Mʻ1y̡6%#B@n:A>|@ ^agʣa) δ+µnRLw1 b\`Ppw v`s=#@IDATD أC0Yx:z-O̲,^lZ.D#k”tڟ.xTNl`!xI ě]fm[j^Q|Y 0$tfD2 9KPc` 7Cܧe;JE'U/ZM]=~”J0NTϴD\xHǛTe#$nĩ+z^ўEz~~gNu OQʟGJ~7J׊#Zfoz{0˃=bUwUa@ TTH+?Py A _34%o# fU):}Eb5#5o}}Bfh1Qa/O7;y^ч~2|ys @ރ7jeZŲ~ǑD1eI),>ߙz6J+n?{ޤWni֝"de[lll4na[JK$޷ݒՒm=Kf"H\pNWY"I ʀa>2|rdMFNTiMş׺:ZuTo7#R-$\㬯1yr:$0Nۢ6YFD] 4RэE ܦ< 3g6Gyf]t]olOʐҰ$\V"z/q7Q􊟼I1r1*іZ9>Z^YUbhlyY^<~I7*P:BF&>w.&?ħdM6v7օ[Sd2wkRb-cOY]J> Q͜-y ';oV?At'?=͛^\@ةĿG&n Z38Wa[>PC= ΃yY:wU 5Q` [*HT5q| $d5؟:1h!P t űϤ$=17W1 ~˃onxxϡFƊ<&+b+L>kk &"Nd9|k嫼Q pG;*B]eUgi596='&+PϐѹC\TژBSep𘴣vDit+/?n'7GOLf ]PG&q!OT)=Jn>jт着,UT%:k y$r. $Qfy-LT2 g;9}m5Ar>:Io:2=ޯ7R~XpI|j\T~'AiqBLj;i ~hӇפ ͖ e6D03 /D=p s{wcW|<{úb0~|vp5ߝGc4gA䑧?]=cw$4(:D [Z|@|N8V4^^\'~Ur a̐)&S~x)b DLg]7kںdcOlpĐ@FoT I@( D x0;$e!JVpp0xztgr3' 7؄h{ "T;ɸm$mzg 4fv!5ꃀ?S|~VV Bq5&%Yr9Ty1ywF`2iGEpiUb ߨbQξŒ 쿕E5P&{n޿Ӟ` W|>0gnƯ?||V/&3 ]];(M3N_^qL!(ըۇ"ww%Wb`.TS|je* 5Vwҿw|5ϲ>L+Gy$Fy$& ڝ2},ylv<MVy]$hbW[%Jna jtfV L3v˹!S" kyL }Ѓ S?77%ͨ;R*苺:E(`M ̈Bakx>E['Gs<+{4g5.e*Sk~2;bw<#l (v_ 4wX#NK-R7"K.I(F}eOy A4rD(7A!Q БFB`~G]0~x df=d˘xL]&fi KDӶg8EN;Н;4Skzx&R4Jmh'cwţUĦ+Hg&y&ـl#.5tKw6 [^}ۀη;Z=j~*"S~0Il7)OLFyMK T TH KԝYrD$M7v#%y-ԗGTH})%j NnA7]3Q-'M.q7rz'ef☤}Oqڷ؀yRwoqtO.^XBK: p@^Vz<^ҩMgw ÈP(‘eLB~iMwkKV7RZ+8Quް=_Oޒlrr!wgL]\|7bpvwL>yupy<9uSya?.9@&Gn- Ȫ ۥSA!:`k+$JPNè uYq86Y3>plA,A^|xߞq"iWo~uw|3:<r*x{,2[p {s =YVLIc)\/vp)WLYAPC7[#;{ȡG_7ufqP;oV-Mr@+( K&nQ?P~~?=SeXB|/^tS?]LxyzAS=?Ĉ+KlQ;%vS̄w-V8r eA<,ܣ~B&!WH69/,Lewn< "B!gt{N ?$48Ƅo&jZ%kCP ABzB6jSfQSrPnek3E"m F;蓿Tp3b&>\ q1s^@?r|c&/y)rqwܰ#חLvC@ܡx.X~V|35`,b Ss% >ҁӀ+x( HDC>VS%y3a= ['U䞞K:k~ ;fC^|H`[4ogW8փ;NRI;K&&;yUZt3oyɥlN#E=٘W>T&7vaV8v$"KkيM`=H\q.dh| G؉}ק]+N*l׍~]ƷcyzwSWnX82_![F3n$[dIx_ȬˡO&dS%dT[ n uc!_4ˮm81^XRKDM2b"nFlFKaeip;BVܫD-IChi$UQTi=ɀLƣ0 qσ}8h}9?W*mJeAlF(߾5wh@ c ~;Q⢏gIiK܊b+kgo_vK25J1xա~x )_&,#Y @z 6{ LE+݋qO6p'0]ֈ4a QN`F^ZQI-*^xM]n֚ᗅMӧL;ztC@ 1<#k'K۸UKC8?u,94_Bz]0cCKecKfC3ӸnU*IGSo}& L^sIk8&HD6/i+3q7&\BZ/ qI[/6l& \cK xhELnJT;|[z 34|rLW[HZ8zK)aK _=oZI\UNzo[Y4@.y&s*Ȼ? :^c$eɗO]`Y\QxNe2mdF'"MaJ|ֶ ڃugGE&tdKL y9.ȷ}K-.W.]Cg8E!ow~ ֮ `,;1۶I =^AvRַO22O?gdԢe$)[Bd<屐&~g1\ZPgLzp*=(^Zx"H-{yg55(..顄] X1{⑺ȓ7-|$ip{ivoN1,==1Ѹ7߿?x?e*+sS Nyw n2? *|MWGAw\7I|M64EynMj!܍ZC? [lYE jU:ԕ@lh>:}J=d$paR]!Q"ǂ[ӱ%bH'%jbDKMI&P}.|:͌BJ.LbgF .ArY~Ꞙom~%QNk}w]|Mf3 lRMG4|@эeLh3Or]ށSd$+=&]?ߏr!q /<|uo\!B ~"|槇_^P(V /ygi˒0Bc Ҳv r۞>v҅WwL=$j@o&ɷxoJnj'k2#6[Ǭ3qG|8P;Qk>Ě7xTʎJ]}N~`࢐ `UbFl#nWE˷c:ڃn-Cjm a~i>;ܵNkd?HST-bu+ˆ8f2,!xO2M<2⦈CAZ/u.Kxw_1W:Y@e@CSNB+D%t\Ʉgm*n=&{oI̸ϕM |m>Jjo !1iiC,ށQ x} $GO1 iI8xҞrdS$K WIɬ#wgH:ePcۿ+c-~^3iɲw} (|k~z B KsKw )3W<]>,Vns:'ԎnnC7WPceҪp/]Dt Y&~I>v҅όe%vz;QP-$ۨu,Vא#I\x1!!)44oKTmO3?{U Pv8E],W+4<C}e4~[p (s%N 0 N]:qDװZح^EB6]D$8CJ?: `A+D-FL_ngi%7ᱛfeU"nV}] BeE(Ja!oKBMŃ.}5 kn[ MX7;aX /i<.@[_wǁge @xa2%_[߾>xrz Kɺ|2rKO,ϥΏ7eaUyޥuy ڀ,`,ƗbD{<y&MeP&W=7,@#m#cYP桿GPGY7x˃oLՇoIw|>|9k&))_}uP=V9jI ڙ|Hߊ"9ݳO>).ԑ?5hN7LwP CE0pS8)"K ;x74I^vhz:.H>H^ S8i-JOz3z^KzxI[u8PF,t|1fvn v:IEbȫ~ya/-r&,Btvәr%A˛E5Bĥ֐fv`{0V`봆M:dM8"&%aIʀ'e)W2 5yպj5/ D~28OWqsODo'RYvUd[{ˌpoA @QW>U\Cƿ4jLtH\疀0xÃدX3N;~ࡿ|f=@V|e~kTaClĴ@br5p/ºx3VIH$;tJN];c_4াf6yeG?wPenyK,<_ڻ#f| '#%nu;cGJh]< &i'<󚩣~+fW֑Q :LlON?0moCɢ2- 厢"yzc #1IMe0A}$#4XlmR~2:bAn?7S++vQ;7$qFȝZ43:\룕_,+I.bzfCťG$)ů>Z*%q 쿷)|9r6,N6Fgw˹D3FrJׅk+(/gE!JK9e;Oo([u((+KJ$_y)G䧜r2$vȤދq.S~3\K7K0od`,Llm\r|ČJS)<#vX"o>sbL{ݘO:1U>i̵3, @o/DNUN&v̨\d,FyG(HhQ %>%Jshl#%J/bSHRxsC[yސgtI>*Ys ;²RZr7e#,#]d7v? 4#?u{ab[_AB8GKZeٱ'st v6SD-0arEuCm: >C3M^9OU^u/+ߘp~d4|}Yc_ p^Nx%~:}[/ow(#y&4յGOXn"Dcp\LVE=%;9mz̠K@XСn~̉]E9Yuږw6֮<5݃J2a;kA:,ǀ!}o eޱmOǸ2:1 lP5tu{ꭓG=>H+@A.Tރ_"e>1ZZq'uW;[=YT9Q&TmDt;V2$u,it$Fq1 knb+j: ebT!<0rɄ/JoVC0%CFed_ `V~Xu&=EFXD'ڌ(N|Fe2lf2 DqɖHרoe_[vy7~9k#a]Cu+:4j%|*=u,iH?A' t>#ԯم9E:Y>yd:һ?(~{\:$V gG`?s e5.Gnc#ɖw iG//dw~xjrϰAL#*7l;>852X?)>{ #8?.0Cz. Q#~N h鰥|:$S ü"vм:l7RwmyIԟ@3C"RW^1-;w/km ]#Աv0Fy)-&_ (cB3xD(.Y3XDEDۙa2++"AY~$"ݐwRz::b1kw8 "o$ 컳HBvVSWmz pTTFҭ?7dZsbT=6Y` lnG,=k ?LyCP,y_vH 4Op֐Abt(ah)AȊ~iW~pqL=Fg4_gQh;oδ'ez~ L靿lcNx}vWNΝ{.g}^\9xpr>5_rm0zo2*<5\鿐{ (\OuB޲?ESuگ!uIO$WH1{G9i ?-2gԅ)IbIl]>&Hv&.?>q(;׊h%PIJƃǔi  (7bm2e ĵkY~iX~ 1:8NtYugh" hV;WuLyn)4OeB"O %~`=5j.{Ⱟ%2l>++_XLEE7NLeN`9Õ\P)<2x հ㮟f sC"I[Jr+BDžE\%復liBCu|YIJx_<\ w2L<7< ;dVEn+KJl~.LpXau7vee10ɦPT?iY v· H'~ȃ8|ӾXɉQw-9(VQxX`i%s /Ƿnߜf/yMUQ>F@ +OhV.]7ez;9A~,Ԧؗtz?'[uOP+U _wxuG~7@{,HrmdxL0?čr5*Ge dg0FSտfgQ6;:*áĩvɟ@G#Kִ{0P{G{&U|(>|O҃#?~[P2h蓋PzDŽKW>l7g7Tf8Q&q;`^ vⳇ4ݲ,is)=ī6>;{fe v׃u^ATqEXgr[}qf]*,! J3rڷ>}I? {ʓ J%{B V'.ٓ3%ڟd*'}>Y,ަۿ)GlWG =߿p&fmӸF(9e-s;| uK]_S냇`ڗ|׃@<%l; *[N@~p9y0MHnITexIs[h-ՏNohͭg\G4 Q!SY *S E ezGƫxg%I|"_1z3A_1+S1 z-_T2ogЌ\^"Ž2&¯BstIQJEDBea%T>ָTّ;cebsy^dӾŕ ]߰KrcfjzH~&~$6XaAtq$FBBk"<'Ǡej2f~~NkB _=k~u['>uK&DLbꊥytJl3u?']w*O?%hSS6 nazK pikhK}s@0_ԁW*px}ue")ѻ)Ҕ]q<)A(IÓ u' l/N7_(򊌳/WznTlMٓvblhٙB4;\:6:<+= "8[<ώ%8v*εK#$(RbgyAfk=oE:GquG\Q7x˪B%HN9_%BrDӘw@MщPqRm/k}(te^ [$qq7`ɅK}ƆчP[W"H7r)Bq";1.TScUyE|8T*x6#lGPe2\Rw]GV6$7v }c n֘vo#VC~?%k^~dYN +=Z0~p_|>|/%VRwh]P:϶ =VdTvڤٱoKTNQњzP񫛴<3"YS*)%xTGs%e&ʃW}_]% |vҏH2\Xbt1-cbI lڈ.hE7BCWj1®nMvD|>ҠO}S@2/tՓ _/)W3&^>/a}s}\˂ /a|WW{ 0d' Lj -~d9OƑ/7Qnډ}vZ^T |T,,o[Ga-<џp ĩUv{ߩr\wQ}<_p'n(O.WDNyrYp7H0iF.oA]`+˛@YBC9he@Oif1o$n YҶG/wex>nD݁ LJsˋCy˷5 ې=Gy?@r2=)N'Wb ";Y'$%YT77=S} ggX˩}s!_ 7W ?v{>}aak^f"[٢J []fG~hå-WV H= :&\lxOJFuyȣ=xJlw6eVQBi~K\půWc먈HXZ' (V1?ŵiIO̕ >/e~Y'rJ9\Ө3p^TB2j_x% ||G?aV-{ !pC#LZ^v?0 z >>6ωg |[*0^tg[y Q>`W.h浽 KzC}/^7+Er_r>O@;n?a+2t9ԅ-p}5575FY\'s} (>E2=ڹա]#U| iqGRO.Ȧ~ j2}IZCKU33\bO1(rݐ@H>n8 ,S}{7cئ aH#eAٜDZ0eɏ lsmQʯUEwms 3vM(G[XxO~U_񿇧r+o8|*y"m#nkG겚Eoup;;8w:qKٟ14?l_NR^)/;Ƭ (Ž[~p̔Y+u2dy Zu fO;n]>eݯliA䧽 y']϶qߛZ1v7 .ξ|Gq|3ݮR&mW~J.| sKnU<߶ Px5溊Je_?N?dp/;oxW=}==+wW苉uϊBT \_GyW~ yՅ[,ȠЖ/pMX)O]FëiqMp@IDAT%;t|q>|d.p ;~ӿQGEz7jG!_\R+N\4摹p4WTX{`A8V82`\|)- GD~4 M [|Θpo/a`'->RW#@S G9a~8{G8}:Hy IO}]&RRFlk9 Yޫ;L=gchit^uc`׃Cujy7~|G8%r ׍NxgPϥ'9.z~P:k舻g+nU~o+|N)vđO;UwLO;#qf}TC|:i/Ǵ@rfBB4gxhqOZNRSeE%PuE3E ?)>SW~xkys%`&DB~+Wq6 Mk/=m7X޽Ս^e>:t뺀4^Ο\p6ϣdI~05E3ŰW_Ʃgu'&QlE9@ uBy*ZcxyC>F舴3PaXQ6ΚΜ|'9r@䭸\IMd{Oj^N/YAlmx(P5g駌o+Sf./ {}S0g/hT̷ff@M*ߗy?| ksdqa¹{XUqe+W}NN7> Rӡʾ gz ˯g]ˇR^7.ʴ:^ے7{ Tׄxx51] /GyW~N4SN~"Tʏ-啨ó; :/;~(E<NvՏ{j /3G6{y(7;Z 3<_Mڗ>,]^=x+R^^嫞|l>^qʒt_R^A+kÇ7s_~-r(U-} ? &j{O ;&t~\P\)QBW@|ݍCbbQ3hʏx 7on8}cw+hO^ jԟ?w %]Yg3p}}ծ(@coKG9 TCቿYm.yݣK@!ńB[5cnqJΣaQ<3^`]M2/8ړ?~?$C@VM.>RtrH8:|ըNi`\Ҡ.y<آanu Џ*y Ud{B[:7(>}v<e Kl+?e)|"|wo9dûMP4+?w__}?M<>5;t C&.?.ɫ_`{!)GL?w/y~x}ɏzP_?PGS.acj[| :x@tw+t8AŪCwۍiևƇ;gc>s^<~[Q/՞/>P^C^}X^-o>`'A{{ gX۵<|S Qʋ>LК[B}\hB8!d Uڳ. F}Uڛ_ͻǿ,~=ϨC]}Uk;LӃ_.{ԯ%0$|7L/δ峗bӑ~}3=+oM`{~yM/?"3niSn=aLcBryvc&}{pH~?9U\ W\{tF;g7hqСځ]ΎF?4֚'fDoӅb蝸P~ⲔWnI`[tZg{,ix,k y&uSgV ~g 'g4&v4S-pw ~Oe 1y:5;euU┆s%70| ;;πH^#wB?ig4S`H Kqȇ-,/s„4g.G;LtG8c;tJgmyOX3{]6p8,c[N(1rZǔwW߻9Gl#)F{V4 xZ߫|e{YWY'~ T06`'ʇQsc+ooQB#5Qޒ$Z|j]]8\ ^Xe:SS_S(qS>r^,h7ȥ^۞ߴgpxlR恟Ln@a`ۋ؇Pɯ9R.?p1ArRGys`K%9gZ=qRRΙ$ɾ'a3!t¡W_g?KpMA-3Yq e)nG ѩ7L\?6he`}J*\iㆦ~fOqAө; :T# ~-QM҈BG8%⎱ppi B-Ro$ha +`?桟Jg#%"CpO3֫,Vl5Y{d0"ke oggt2"aqrG t/OeT3t4[euҟ f?fPrRpg-yOgp'?L4L2et"dv2PvIg7?:!(q :q%D"+2/ )d@;2ƹCJ) NУ2.c_qV'Q{oS^ ]p:н?Jg}K>W򝡿OSծFդb}?dR}>qE1Uu w3$>E} ^|Iwα94O.x|Sޥ>S=Q*6M39?LԆ/m?p^U-a'MyI 1 d!ʯ' ʰI Ʊp@oNrm&}<'mESrr7s0e(kET ` [3%-6gJ8aʓBC}Ry7T@[ +ܘp$&2T`G:;cߘN;_fYM|{dQ6yyE {v΂O߼0r*w*S2'-oޜ\J*_!y[ t(uF#~?d?o|qpuQ_-wS*@+sl;#3Py85lG*-< ~Nɯأ|}z^U> |]r*#Coɛ;f=k^ "o^N@;#Ly5?Rv?9L~>Tt ?Rl~o~Ǿeʕ!wl+|"y-/ޝ#|E`˷/J۰?ll~1 ~Csnj|y+oL1502-=5FRV[X¿|3 ;PsꗺK>x [=?n}`k}D./v6E ӟ~6#|.2 N{FBeڵÿ;+{ٝ7gxޘ| ?hs7h'LmJ߫cǁi LR~L6ZR)6&d_L\sT[4ӛ7~%+'|?!а{9螿?÷zaKՈo^~MwwC9םX[Qh`,(/Zx'q9qP2R^E>&B|J&Mȋ;n'I[`I^Xڰx>=R$k_tknC=wl?W'gkh-7G#M'?%F>kB(bԯa6=@.^ihNiz@xCy`X6`eN(w`N@]xcr $%^<3U/hiX8 @PȃV,xg$yiubC?#􉳛λ]KM%ם~!#8As&YzZ"Ht #Ȼz/ ccW@h5bw^+cQ""P7Šwr2:87[ \ :8Usej 2܏/##\ -C]A^V-a"tFC\\*8) Jʋl9_j,ڇ:aF 8 ?9ʩyZvq1{=zM w O NyXw(f55FqI1Î;-Ȍw R-(pB׮l$4uD8s99ӖU6aH&}9Wr:" >Ϲo!5H__}:|Be;L9yCxw}#B,y (_]_u<_A!ܡ 6PLPJ@D[xِA}ŔWqL}[E(`M| :ן؆˒'yDɏ| pNwS^evyUVʏ_Շ(9P.ͱW{la' ?v'/oQejy#yOMPJ#K8XsSG}Xiq(J>t5ι^,/?.{h"`37~ n󣬶G>|`qx"Ԡ<^xX9gQ;/'oWPOb-Kgb$ֆyPesoɆ08aYNefpzt&dIK:$QtO8 o5t]m*=Շ:ȜPNA>.{*?ݔK/Lo* /ԯϑE(',R^%JƄ1A)~w8$2a\ TB_(-jĄ7+ 3_ |UC;Nr=` =)[|Y& ^XJW,՛zo۟!K &_s,>mIfrZ! #4gcS~0l(;?-+JUfGnmܥ{^ٛXADDy.)Q lF9>>.()Z^] S\nwL)~ϾؓO7H&Nol5bg _ϮP7B85b[ -Gi#y:/U*d~|jP wѼ+lSy d66ecO+F{40iTwr|;`;aC~Ncg=<0> ],7*0fm;/~=6.Ost㘶up6pu-w`m N[\SNВQYA;|5B*X1Ѡ/xbͼ Ʒp'ÒO\ٟ c#A#?;}ɎG}3~vQemrTvl-eE?Ԉ{WI[Qlv2|T}'Yuw?3xkm[ꍃ{\6^K/g5shπʦT)d<`|}`'xX-`e"HPxj}]wI'pȀ.|U~ ՑBYSOߩm-6kH`jsNZnhXb%:sO;LIӸXtڻCU2MrGZ NI{p~*E  8PŘn6Zܗ`ITS0+9DlApٳ[+Q!X,\&4 M{\%wQDQxpL0Ҕpٟ(E,?»3 FA1*["ψ=|)xV&,\_-7q(H6G KMy ʃk&l3T%MiFM}3jηasا)8iCL蓢> >Jz D_'Ay-v ae>!jЩqxuwPeG(Y}G55!(FW.bzXmuw~ [f:~^OMi_,Y.O)6݄|;qPPTs'LzRS (Xq9l8`13v]wI=ACSҼ{@fZX{ <"S+Y ,zpdX\?\TުBځ8;jCS\‚|i]&/ Fs@O ]-}`v#rvG72F&G|/\GsN9e;b]b(ۖ\yo$;ˊ?n? I}/MSQU( I/wpB;VcWqZ˂H6sl?]eY6{J~ϛDAo_0Ee{_CR {,ܳ_ -iƊHtR< :ω,=gH{Oskw,x~8^R;W} ӑWtùЀs}f%$]wp$"๺yGh+=|쁂z;}ͷDGOnt#i>I?.l&)V!"5}g?~ӥj~Nm;lfIhq#Asd6]&x|,lf4W,jODxSyhj1f󛨅}xS5}p+uvf|7S6]3 G)0~>UeϋМO9 syyc^{5ݽ`o2GXxy<)г Xclf)0%=HD28/A3ߚ>"b?(y?}~}k<ӟK2ݟ*$g_} d>O"~"{OQƄ Pg$Xwrg`c>~g6r?z]7qlg]!f|L $~Y\?`|Nɚ`/1Q\?5"ƌ-R> }{*Jsw#s]=q;pɿ'F?)˕N >֏ԸϕDO=s |N%,i;>?7w3.7_7 7t[{B#Rs, q7I@i?Zt[3:2"L ~_{,;{h f>}g |g qgs?e~kz͏~Yyy'ۭ%B^o |q9&uw gNcI`TX%o-L&AQ7GMk|.Ϝ2Rs//yL33w;+6~?j>?S|W {¼]gɟGeJ̠vq 5Ġ >ZQ&K̓rgX,lO{lXWJa8JT[@vna*ӵ|^|7t UU ୃxl# ឺIX~9>kk`wߥ+./|!?Y `f$g_k@w`׷]ǀٟfƯj'yҷf2Qa>zf'Ȼ ַ=SٮY5Y5 jGt>Ϙ!?7| w'N؃z[ K #1Qg^Z1§b翠Xy tA-\V]',S1xM}Xy_&}OY=_"sx)/^R#?nV#=}++{VH~~'gY3>ki]Ex뎾y'|"0>Eǥ,z|x兀OdVqGnɓU3H0Y]ylI/| TFп 'k*3²"sFV?ܧU7(V5kF~Ye 1c=-ߟFeJWR ؏vj۾A>;z^ɻW@1yϏ @^U,鏘Htظy*8цYvX4Ty@TGU$X:4XR-@Х?ezJ k';?0w3?G櫡o?Vk\2s21`s}j>~WO' ?Ǧ } @RǹğۓgSnG|/.Ǿ\طzFg>;SJ0yIµ ybφ!}9/q$A@p ?`MIdɲIӳ=ʬnBir+ )ܰw$E,*+#2 w*8^3<<+/3p{rϢ)~Dc0 Wk < )şx{MWtz >t .,+~F,T0HrghÕ~>B}xR?w_g}4R|xmLHd7_$CBt>ZR_ųt7o\JQ  ,UZ={ձC !$T &}0hn:k' Eh7ʂ7PK 1̛Ge.(B',Og%>>A W]qyƭ4yw: 0pFjX5\'߰%X6Ǟp׎\u??^GؑNt{CN';;IgH 7iP[}e%}b3;QIm\VF}Q& K5V āĆ~P%|J!yG < xDŽ'Q~_yG ^B-em֙iT-aG4~K ?~][>$Bd'PPI?!0N4p5 &,u(R"&p~CW9`J#IyzmڹB#Ő&t9] $ڊzl @ڀÄ/)8Rg- >O6YV w+Z6}Ve9J{8rIہh<Ф`lЖStdzBF7f/iV:BF_B:ێзw!E#;{v%R)a&(! MvWS=Ca]{=fӭt'jR !i =,`/]dpBSL?X61#a53 V^64U+|aRM$ֻQ5~oY_ o ]Z!@^'M i#ӋO.tUQSizC(_[/O[|O=[H!7*۩8޿﫯CI;S?  WSw}.}@] Ox#@B"iGtxJiЕ!LC\@_bV}J8:E^U:1eoꭟf$~GN*رWø(Jء|X9iq 2-15PuKLTy.4t9B+e*7LtlcFjbM5 -]4\68#r.Ӣb`vMX[fRsѣ Othkـeveshd2%|dĈ?A8 +]e/>ť*WI\KQIT" E qR{~_;n q_9^wzl)GgkOfeW>hD/T e64}Iq9Q,h %6Cj%MW|TH@@#VRC롿ru)nZW}T; VL_#Wr vs )<,MUG83?/84:`ߋJCu2Oi{%jͰ9 ^٨!l"=)PI*p-g Ԏ`ufEKlNX9L;7߃]#{i^ps-wA-AS CX-Νzἅ-1)gI &SE>뚭1ίDNŘ{D+1뭀1}%?.k sBYLPN'֗QW2 U:6R+.VxT%UVո Q8]5+-{uouL'ᕐcoc=S9U m9pX_|M> 㸗_"I ;q ڏs :9x&Ө6愥6ٳy`W&CZlP%z(i)MfevܢPDt̎t]ws]=HF1. [eUg)ck<D{ DtխCߥ됥C5"\"=E4w wuD9 q~"OtD2ltjqX2]@2k Xc=LaE_3c)?3zm'>נOlZGy6 bY!L/@d6_px Sef5qI@Iqꨕ?)AG҇}J!LbE_QɗL_'Oqfnl16j#MvO`ۑhQ0ttӤO%O6Nf5ބNAW-P18`hI,ʄCo4 j,<#(LB-ؠ($rN+m@u+UWC >cj ='Sơ'GOѭw6@%+F2 A N"NEDC=SkҳOۂЈQ܏u.dcWFV Ę v!rߚ R.5YS].龜Oz]Pnm Ԑ>BǶp~oqd14q:p}Ayb&= ' ɉ(GlǤ|̙CCs?<L ӌ :?SgH|;'cYX:<SBЬ,a/ H[ؒPQ Y(=fYTb` sȠL|T h_;j#!n$ׇ4 }0 6C! JpO]p{̑G5v8Ѽ84z㕓&o~CmaϴewmҌD'_*;Z} x sPBI%l 씙h}OWb?!ƙk|ymV!;gpτDL=_J~.':.7&>Y& `t),D.깤(V<3FW@VtJۈAII"ʮށ5Ce[lyUp". 00l8ح/ Ҷî9exOq!PĆe\e)6$]'ஊStCrax|K,yCXE[H8JD:~%̱d_CT @ Kkqm/7t_ Vd?~^̞@IDATG~Rc_޼U5z<}6"t8W]N~C_*=&<P\ X<nojmuXְh֡"Az5]Lv'=" ^ -mDI0`("4}1U<dϿ=` \-蔦( L-b7o*bL(x~ /1~ڬ75To+9(.0$ ,@%EZ{ti#l%2 25UptW:"}yM\:VÄ5aO mz%鸯όҟ!V B8 `>xn[[&0rx20JA 1rF6ωѐm ^!{@sk1kdrr齤8nC*"sy="+|ѓ"XFnTl)K'{*nSи 8ʇs{+vkrPg)翍QIԗbd NJp}JV\8fkÁԊ~ɏ9?;8a 8xϿ]iנ&Hqx q8}].-SL!× @d= a:lKfEa_H>)/9PEon \l ''پX|A#Siܠ;;6c'qXrg8c؎&1ػ-Gm"]66hgq{-H:8|FN7 rs3KqفX ,W;قur,H]uWzvk\*t{B J yT!/rߨ ]Q!*>+M~]^ynYMagO^yo (~?jĤhsO-޹/q8\v聑C'cI0s&AQyժ 2"&; >w<"WJBސ0g4iбr-,d /[hI%MrYEx0~e=)pPA ValdOE!6V\ nIS\-}}gVV%[:/ 7%"16bd;=kK?6@ Mq#ĕu{ʴF 6 R֘\A:4%nuħ4TO׵_Ư } @*@f?OT a\'~+?ǁsiSWZ_<?ov i*[WJy @x);K .Bњ(HНtCKP ?`Rk4nRu*E¤2IhIjelQ=!1Y<řbqS:io'tۋ'& I!o7Q lƳ< @7s41yvoKG\4[*Dm9˜ mw"SPZ%e0 Jxb->kBкt$+C( Lcթ]\qmlU1\/%tMVUU7k,QbqO!B@/>0 VG{?(ÁoW^_8wc+Y=\1uRDt[%c1huٮZgoN܄=!̽~WL9f l{?WjkFVDJi|ItYXi5^(ОOR EJс:CQ}2zBT]0ج412 uT"c^'NGP#Ŷ9E8dsǙĽ ~VڇoIk;v8{/݋ {;púl-2ta̮I:>)0sߐŌ|()֮pCcGP7&Q=t򀎳m5d`I)BRpNUCYʰ|YL,衚;n' +I-g QeДzLO 3`Z6;X\5[ pS될kh =nw[쀕 )_h6)5 ^܋OsS9psSo ȏPm?w?٦g"]& ׃z4o#>C\@4Z}l|jY!#+]v-ҏju@'[y_?Ǚ+zͯv_N|)ڶbr!*mʘNt'vBEp"VDص' hE6a}JՒۋ=0t@-ѱ`elk@vpTCV'lsRAV]Ql_՜jvB-BA;cVgw_\E{/M=uuJ 8'C8 ̂2h)㍝qIn_5;{*-3t)h%utOT*^gTqA>KN'$4[k4{mʟ_'46!#n ϳCo2NqL<Nx!.\[U҇}e2ds\βjʾ"= %Cτ]A:-[ՖcX[?oe4i*1׎F=_CϮCk{p:O/l")ܸݰPM}<弑y'_1 `J0~:h`_rƧ|$p⡏ & E!=&!6}2â:Ƞ?LڻEn`)!#vN;^Rq.{Ė̴;"&, Rk*~2>el!LZu`x/ wa9!)*_qp[o' ɖc&ΏS=&cqU+_'GX,+ӏfzr+ynE[n[4C^gnPdUW;eAIb ^ cӡ`k?)Ńԝ[~bgSEb^|c{I$v(g0~o혙ݽs#qߟW+}c|x0'ujL$NE|y5wB>:-13Ft8,F"&O8C~6RDƔdUe]SGFSL!"JK_r0?BQZjPM3#eH5) qO=MDK6Sad'㯔YhJvS+~b>>Ty:K}7&ț_|=&x# U)>Ag*%eģhN) ¹8ńa`Yt3&()OS_irO4q߱0ga6*!+RG\u pmz |\UFH0 @FWL1J$!me[Jv3җ_'AT~ G+u˧癷Ux"j$:!p d+p 3kגa_TIkO#ƍ4/!2-8=h)93;[UݢYa0i4*SCf([M\(Q}1lA6੏'8bAZtWl *ЕW3uCμVeq VvF! A&O KPOg! 4( dSz 22:"?&4}[}W.}w%B 1*l_2{(*/g4 #l!r~ '˔Hs,=fvc *>訑eyn" gidJU-2K;} jvV8bZs;&طq9uqs8J{2lq6݋t-d2!Dz9LoahB3uNs }ȑy{x]evt3bMel,zPtʶZ*D;&I!^X5{=A4x]-F 2a̲=>Đ pkٺ% (g{Ӧ8  ͯl:~Xٱj~J/q8~Jƣq Iufu]m{"| B,+pARdԄuV e&-֌K3UGro~Əezr1 CJ B`#qh*2UK8ԉyz'#*\MӪkxU~WN[WJ]nA; o4teF]~t.6h G'I8CADzQ$WtL䖾GFC?K6Їc9/\Ekl ΋(sU߃˲xSUƇ=˄CWV,]gfEV 9cAEpa : M\|&i ,A3bPfhB UG&U1n v0V٭pJRvJ^S=lmjw PgKBR_J#•(r)@j*J`\@<]u5{Q@#]H i1Xu%QLOM}-?cTy4 v>}BqC'qn Wo2g].a5?Vɣ6  B}~{5Vޞ* aT>=?@ p9C;|jGTɨj^>{VGɯѡO郮O¿@?mf',}>/ W?*-'/_O$+F^_]&\t1!j(Wxx)+d{zy {fv9Ʒ(2tD.DSg*ڞxOZ&(ML^rY g97f yoЫ[j7: ~=<6ӪWVRCWAThz3}:!?ewOѧU-oE]sGQ>8K^REݰpG:mȒ:DsE픲(Lמ)dHՔWǜizN;Q4ϑ4/8н;S>&{u+y׿u BzOOr?n =1jetŤ#x6uIhymNCMdp;yN /8*(:g;!.C@rÞ%<r&@aDDټ"6ep-d*= N-gx(Xt Ywi Ͱ#n(ZM}3e^veL5˒j[99j`[_ {rpn?Umoh^7Lm.iShPm٫(H@9.$d|BC]L5& -}ՁY=i|E8Ch+ ?21uM]={=+ c<-S*Tɓv Jb-<=&5‹Mɩ5!TM:*mSp*V}ǪpћbFFICq> %WER SAxG\%bExpr2iW!Hm&Ԏma)"HiX f*iNyo/ HI8)SFOQK]om/2쳾<DUM`2x{Zn;Y=ato0px^2%RyYjg2TQC9he= Gwءk,ಹX~h=YY wa-2bDhHP : ԥbd=Bg~h̀$|ⱙ6KGG6O0/W!Y(- ̮܂m:4ZߑDJ\֦Mc-XUVa,Om׺v[Qu2ӓ׽-  H>6x͂3u!49 FD-!1CewIh65]nwi31:_ι׶&Kj1?N@s6l:4Y//yŏ/* ! NzܱBӤbhًeK(/[;y21^C,mS9 sr2$EP' O$@֧ 1-&  ZO2hځ;ڕ{Y+XHN8<Ά(hI2NkK/m8Y$)f%قQ6-O:PbOS JS`>(HV05 gH}9=ƲD{T*L;rHW5o1`x ^ ,':lnӅC9K/`jźm^zBg+ -#j{ "dL܇?{C"BI]w%hZ[d1{@8.pϟ.d[}nKTL -M 9D& |L,H'Qƕم@LZv(i {"awھɈ&zXƾⴉgl$鈙 M8Sm:Pٍ<)_!ʶwR|b dJa<l)F}[cepSd*5^L-/4۪!ӓ5{|EG3m/P-?w~*9M,%m@SV>*M[񐊀^v 翼PH+\ПW@p҇wlVvd$!"? :x[ LDFвf{EȊ-gZa׬;̑$^8wMvB"a آ]xOhLAqQVS}.S5N Ɛfb>i~u=!drxzwNv3=`Ti!X{礲lӪGTثra,;>;;^yuB紣A¥ow_a.ѝHg~Y9S<5ppl(0  ?O"gIVcW #;?$gfp{ŷPU~%&޷]^ݹSNOޝ_EӧʼV3F*w~_]wk{qߟwy+??KLP[ Gc kX`7^|@K $cr_:?Xny_|VnWi%3P\ʵÁ>>$!|Ȁ]|_I7=ZDžl=g9>iξ_\\Hk?zY_^D\?;:Hӊҽ-:5ox)NM+vAzxx-BY;]`яhI(yzk @ԁt9 Omd?U>Z85Q5аz.\M2AkOw8v^l&&=ִtYJ{pqu=e?ub[FJ~ع_!]#H{c kX;ˋ <,V0X5dƫ[Q4B!1CKU H`h PL0C; *ߝ^;ס7O|'}V巼sͮo=Rׯ_OJL <(T T^}&4,SeQ`4 N^2ic85pO\\`Svpqq>N;krL np7iFOHِ{ꉈ3Aٯ"6`oK^DÄM8߼ݍ˷|׾/˵t=^i| \d繵ӓˋ= ppqqo!NoN\U6$v @+ ͱ3C1qc kX/Yr8VN^/csSˁ1gà/Q=R!)cNċGOPqդEhpŀA;=v _ʿրʡ Wg8=%ӓ7azYvVifxNQh vx? T8#|ٺshЬ83Wc85p\ҕ?6B8X{PH^#&0sۛy [2 0ˎ˩ɺqErʨ֏F=;b:,XI'no+7Bܿ>CH#2+ i`~ |kX8`;SSwtӜ8L~\pCӑ4GSm3f-t!iLkßvAxPN5 V| xkW&.wpy5pc k%j 4->랹HA1ĦJz^`͐ پ,\gw':N/{kNooݜO_ Y/zoN~WWD쏶bGkX8P|Ϧ|b?rw,b,g; qn7BLqkyCW:lWNoޜޜ{58y<8Ml@*>bp~Oo~ x/ 4g*>&5pc kWּx+MLXp&S)3y q"}Dܷ\8?|?` WNiMx&YSps}onnʘ7Wf~M6Zo`J6 Sz_%zm`CTK(OR<,R#:O?H|hrD%8؂DS6$D~&Іs>N/>Ya\Ce$2qe eQ7p%@AJF_$A3%{dwhioS]܇^CHitg d;:;{w$ Wk<zxM!ix$_ͼ!k4$I)c9-Me׹-AKVz<=$U,y(TO;nm/v@#KR7zZOVxi׮yEs|ByTr;TQ4gbj\N-oy)]0 y>1kWox& 3k2`'UeYarҢħdZoCa^(4P"VӘP>,uOڒT+d-c5VE#@`NRBrԟr{e>U}巺x! :DO!K }i>p t8R*VgBN _~wl ~yB9M1xD'aI4W]=QeNxUY~AL| \3C{CG/AOO_NN3RI`Q @A=J;4,sג#@\N@8khrZLT=cș*h?s.vRc e~l)ħ|v><)s/q2@@ u^4p%?Xd Q)ml/D*Xg0  MC^o%-%f_AISϤRY 2'5WS? pWMtX ~,c#prb(YS;q:ؙ* }zFa@l! r}b@Tq^͋>K ![[wOnvvu\hq./0`xǁuԄ=Q3[}\}٦cVV8騯T?KX)V-CdrOlHDwcDlPH4ih"ڙ ioY3kN!9zʂsr26G~R[!N Ct-}j sKtKUHZ}of^k% uH0dkA?B.~MT-_\}#*`pZ2+O}S`Ͻ\X]SzRiw3md#㘹ASPdn { 9vߕHQJ0)Q)_[h<}02Oq,}NYV *sd]Mrd,øg TˎuҠd:\C08+ɟ#'su% j$`9k~Hz[#:>oXau )`[qbd9tqz9BJW*qn(o FL90Yy/b's*|/.q͜q 7AA~ț4'$xS;Lyj4ˋT`ǚ[x%I+O>~M,WD˗SRT!QVw{Uϳٓۂ#(,^i/| }\ H4xv@!|H/tvZ&y7( \"Po0qoŽ5llDoafK\녨|p  t8xAH&$[M6X -pδHO-I.|ЊPbl9\ǖJMWLKtccKH+^[gtrI?uɥOӧj4z[{;|ڋ.xJ(x y0I+/2gwy\\+A 4݃^IX"*k$:;QC^rOu}L 9U"C<폟G׬::GeSzwQqca/(&FRiY"yľyD)=92"6NM@_mi!zt^>zlg#:$FozR;u}wNߝ_<\|wr??^IOTjUgNSq>1NFFG0e2A41^{4}%,G#_yic8Ɠ[\I0OXA"~78,Y Ti do& &=>x,27gLʣp2gӒgѩ d}_'|ПGP4- \LJCmEͻ뵿og{_i_?Ma?|qu=>e2qÇ0QS Nvx@IDATp~{q~߮UP p± @MFhZ䬻.kL&X DP8y%kd=DgL J3L4z9t&YL0DuCG2){=c‚1 <2Bt5M)Ed3S_;V4}ntH)YJUW04{νp[aDbl&p]Ơ;&5mVG$أHѴ$|5uZ"S'G&I+ 4$-R""_d,kH\΄cGP%(Bd%_z qKyNM.`OmDP-k/ʖ\I,Mw B}_e3H"xW4l,{ig|Pɵ3jZdžGb8gC'TZU{XdKgxطL/[^I F?{/Z>lDq2brV\"-!44b9J; jLĸ rJixY8n{<薇NW'r3ŋ<`9X"OccI1I}?Jˇ/|@C$`7zW Ɏxn$[149é9Sˣ,rd&~Ηe, ] !3k1ul tC^cc0 1y b"QÀԹCIZ80o&bY@_Ckrq-O)nS 5aIs5YMVY NZ'5%*͠QG{Lu/U q%>޻XXOx͢ BƛВBJB7bͪ A2ّ)%SquGxA/1'#D,e<EPG*uS;%;֙V v^fCIGr(x%>^!zw1`̯|r-; U+M|J%F,M|M{FwxDOys2+:5K0cgf5|*^=6},(HPl?w9'5}myvSBȋ@}"q ˣOI0U>*eX)kfe,فN:ڟ̽Rl.eCM R'.Wjr83$1zv d> Q-,xW."L7)o/t"4]7{@|^LE t@@^G݊[ue6bcd<okVJW^i9_]Pv>E+~_NNzfSU>Hc-O@/' nPN]6@xėoQ/b'ȩqaUհtrЪs9T嫽U}6RȳR2Wׄx&#dY88'QWM#>OƁƧ?S{cO،ɳC_eg& ^Y)g">Mk}$dO Kۀ3 JQRCuXr).AQKZ?4y̐R(IԌlo3!ڐwPw5胗 LT1p +A^Rݱ.a'D gpitX/Ӊ7W:"cR둡pr-,OW޼@Z‘aA`/SlG~{Nɥ$G'!rZ1[(-4u &4Ntϛz@l~Y೅/z@-T싩E%5J:Rg%Ayd̐1y4mҦdC} 3;*`!x:eNtk.t= OͻϞH['f !⋆7Bɥ^!Hb2Vy]oiSZei5RN6M1B5Pn[|ծ=\ixܲ\_I|Ģ|reE>-PqYw$T ̀@΀EK㊙Ur(U=.>GN5!8}S`:b(dtBFL - yry0_tpqqr̬H?'@F#4[fds~.rūwHT廢9#6h΁AɓExf }!3Uq(Y$O:rfE1&>4ݓ"AKzB&Űt)InJ0煞LPȕYNbKV# d(Rh?yF" 2JÐU XيP>t.&9HGY̬֟'`"޽(wj3ڵcvweiŽʵL}0jbO5dcEZV:N^`)]C| Wz^5AU)S'=E=âv E98d4oh^jK^i UiyLG5ٙ,Yj^~ċM~߫;ik>J~$3A7'ӿj'W&t1YRA|{pJ_>NɃƳ0|&RZ?UU,5}(e=:С LeA>eO1Y5/A* TEr[B'6 $q25\0!)Qx`+!k/&p\F[N/'^A@ާ^iL 0y:bN3 @҄V*Տzp_Y^bApU*!>&Oύr4 -[2~իW'oN5+K(V m!4L.Q:A" ^Зv}Akapfe S6ẙ? ) !Ηfٜ3A*8HMcѳK~ KL!+LBY$vZ|gt(k4)Ν[$L΂$M挚lU7E]Fo 2۰+5-SA~7?iI]xSy ^'ߦ o-dׄz]n!Ԙ3)W{B@9Tb0HD\5\04jـk{&Y%Wv!B'`WB,#'|[[[7_IĹJTiiFZp˫|߅3iB{77zKGx9ޜ&a ǁZ8G&T`B2 _yJ~S,^3U4 MdB_4A{+V@`{U\} ΐ.\FR[W gdHSV{MuDi .r`eTF[;qZ0z֧G^F^(<*Tm mODKMCcڈ(K8Ubđ,Kl@[@QZhx׀褐L l ]c#(4bpqwаR?^t&aCwҡ/=2T }bvXgxgNU?Tӡ:^wL",흶i4914" ]tWl-,YώlmE.@AoSe\j m,1gveIs3y%,=4&|PVbh FHRsk;uE%PT=gl MtLmؓuqOq%zH?H~Q6o Oۯ}+7BkC rYm_ :}0hR$ UJ 0g$"\@p+87}Lc` qJ9dpo~O7O?{z;/|?/dH8f" ٴ^[t}{d_+֓ ;t|wz{w͸~MR;{gV0iI_~N? rgq ΢Q|2k@pKs_!#S8S9EڃC')T0ZSd,S3U".q/ "Jyf^&OX aŤ'Gv~z7k &hDLlO.a#fWL }  @ #usJd2!ϰVE\˱ jҕxMƮ։뀨 H Fv4lj굿+}=W/r;DZܝy3_~zۓ7îono>de͢lꋞ^t '!c@)ȍ*繡v#ߍ&7)h$v4@Q vv8R`(3G:䃿ܠVF!>ģFBC7>| cƛ= Ai[+F3aQbMs>ʡOhAC,a}K~km+{[]{Q!/k?fY8QHhE[qee:짢ʠh۔lO+]X[R.J/!x~UkjTIqECVs)7,쟇Z='o_,|GPbB;<|Up[Upe=^}UlZAӣ-xjl W6E Wg|[ڟ c'O^*X3BRJ0 Pf`ĢOpj? _1-SVML_0@Y鵞ꋉMtx!¹׮+SqfXg.\[wClw95pO"4:ҊuB| h,iywe{쨆_ c+pS9}KrXj$؈L@t~{vzOB>Kx ^ѻ׻<'_hB$&-PEQy+~&@Lb1kX8{W5T_G?бX 4tý{j.|a/Է|ݏ곾ovN7'_G}+9sO^ů/ǯ^鞿և/?h:_Z~ $R}wvOug_Q>)& >>7z([9cv;2ChD38o|uPׯo5x:5pRZK[ z܎> vp [bƒT xO?~xN1?}h5_C{ Ȟp9  +}.oAbo!& wzO+~N%7־=_(g /6iPN_ށFdLS b*w`sI[/콭;2kX8keI3t?7ĠBGKעؙr|׫~wa{0`Y~Oa~Ͽ .Eqnh'Sv?ջhG% wS^l?>62:C 9]S`QL#ćxb vF!x7q#q{2|D$;5pc kj);x6yǏňy|XZxŌ <Vpq_ >lЂpb{k㷼߯?Oh\ zU=N[X+|i@ ;c8ZdGM-8T@x~Z_-7zX}}qvWUËMd^s^?A/}Pc5otk UDIL iDZ5pc kjV"(Ex83N׈4\ƈblqn (ql/~G|\iW[cvI]}1LL%> j^woT;M\~pO?K?P*&xz?^?َdɑ#"תb7!Z r ]"y&OHCa"lꥪ*3#?Y[nU'܏O7_;G(e|i'6¦F "9\#mx-kxE o`nɟ/D~u@\XtٞC?`*MwZ :O"x<Zס{6e0zǞ4oWF[:SqW _0 }\ne++l:kaH뾆7~we ߙ@rѱMr @}Ѿ>ý2 Ft||9S& iߟK>^njjjj#`nRL,gmBJx |}r?;8 o5g=?l1hS7Wqoː؋^ 5,lj?NÃ8Q?ߨ QMh:KbW@ϧv;sd`gZgԏp"%8\n']23w VGoD zE@xq>}Qýο裀8g8)hw`\rjjji=!vk5'Ϟ8dTq߆> ,fD{_h`79>_9=jYe`˝:W8v]6oTR| ~Ygp<gfѱ>sYg W%Th#p8j=+#O&2Lp`'F[cNx(,/|'m9*8 ⯡jjjj`T˘?ǐq%Oσ⼕|UXd,.־7pi&yw?&I3?j=ߤ|WO'}'4xi`OrL~ή:D`}ioW u_JnLkx_.kr4aHkd{xM GA7F-y ?y8j Nb\xgo~ѯ~})2{r8 VA +߶11᭭{/MOl QËsI>6okgg|? 3:{H>L g1kV`sOxA Stj.^H4ACOīް姮XV1m9(BrQu"Ԣ=MX-AA k[?m`GF(D/&h:=nG?mޅh#"#"o1bI?+XI$ߐW<+ukQ~V(W yL`ײ-&1(CB#i3&L榴%r.S&YClv@xp1gTƔo bgg`] $ĺNށzr;tw4d36gG>3C_<΁GV`X6ؔwaW uh@O?1[ÞS :8@5ۗ'aә|3{!Jޙ0as@_LJ 5y+0a`qj7q`c /t ;vS9zń3mD.Fe%ՍFh p d@܍tsÚ&^\ncq\ 4DvYs,z$T&M S B $15Q,s v W"DE220cCl \xz%va<23q_!5g1khiI#+u,rΉYTMG V#*3Jy$Qt0A@V'8#izvOxKqjv 8>LP1[,5}[㲱gKh%.W>76JV dCp`:i?2@,}HID1F}f?S@Ƙ/=r Y9v6EOn `)^/+pxϟË PC@pnлt d0M3Ӏ di888@4 Yh4&]l$t#Q,Y&M> U rϓB4KZ?9 '#6#Z^Co@B'g0W5L!Dt&*PcK  `| Qg^#!ի(e9hGSUu>h[2 +n~]RBn_SW(6%X-@]m&=4SC#/ADq`ؒhI=bl8F mpFc`[kJ@ =@d4˙2:Ct0ny) a+Էrqb|(!D!ey&CW+fklK vJS6Tmfb,I3)/S[LǶ4ɃǗ6zE@_:2~U:3{ð#G@yegC5 f9.?~{ߛp>1TJlǺ+p^yå|ӔF"-_`+U?F`~?K&PјѰHԠ'ga J wH¼&"9梬 aMn2$II#0/\(He-s yIT(k5. \U%Z%^9RHX@?Z ΐ.Ys80d҅j0fԟ;SA[&)yK 0j0Ζ'5{V18P+#=1O:_Mg)#jϦ?pWg]4YΉ~W",eqF*_Lbe<=NNY]:(j Ge)^S{ g`ܨ,x` īb@#;̀hr tfl48v;'ڤ-8P3?A8C\9\G x\zG uŕr]UoVk;’l%b}ϱ/TCH9[e8BDWl,I z&8hvIѦ_"moO4HB|ȅO!OyK>3= Ө_L*k6RS&5+k?"7!dHf@9v7GEtݿhWXmd#͎(LYBW W> E@uɸO|.L+XLAg6`4_PRrz?n0镞|$]S)hwC!Qu\~Gr>Qx})'#p.n@SQF9y4QHSHn<2&g_zgAk>'#Mg l=|jj`r/duihSXmN4+a>)Bo7[7+z5SK}hkJ, 0߀ o~+ q=D`M$ó9w_y OШ_xL63xYTo<ǝesu:xAO>x- _M-2/ϐLoi{ ?-NKli6y}!x.m|/{fL h7 r^h@B(cy"NIW 2_t 6H@p`vկ>mnfi➁Ɵ0āMhV7B-kw$3ey}aiƅtǏYo Hi+^=X{ XT3,€|͏x1_υ@JP8ALAy-h@Q8'z7g|25]÷(<փHkd$=/8JjӚϨYV~ !?ڒ #{/ Fc?Ԛi  /RLeɇ#A֮j^D%)6Q! bi@=gFZ}VLgFz ll4{(9c]> }6FT{90FS X%|Y'"~*UơLn{;HhS裏>Qy,R/UUfh&F-mJ p*c 414 Qp,M:=KDljh?vفjP5P5P5pk5@?<}M@ \M~@, :a#ahk|)3Rd4%Ls0v땾:( l:i^S*B10~KxMӍt/v{'O~΂8n`1t3{P6a )%j!7 N)a{Ljw*yyuc#*ѧMu^667//3iS jjjh.N9G"X%8[D=٤L_d;W}ꋣ'+@^S`}M~tPe3OֵA]:tUNa= g/:/_N7fz:.^Jd#&?*͌gAya9H|$$uTbxa$8X!-vbv5 oP5P5P5p[5\0`sxf 9g #xC8dkUBk>7DhB|x_hLC(#hETqPgМvw6R%nyW7n:YgIin]D|Þ=?2G. -̟яti).c/ 8 +N92TPK2:y%XmV T  Ч%S{qnM_R>H?tR SV ].5'y=߲'@F# jv> Gvc+jF |\x8h rAO Ucio J܃Yg.A5T T T  ea.%[rb*@}lĕLOiˁ02褁w1\A 3O濽T6^w[cW˿6O .nr9* 5îwpOL'F3`XJ,|\ zSM.(ذ$[5P5P5p4d5JqGM{c!{/_g"%_f9/L2/ٛ> 䯪:ф?=OsHjjvIvdMS]cPmƇӊdpq4fd}#oFe;$f@3jqLH. >*jjZ4橈ǐy_3t8Y]q&=v3~X4ƾ1zvrY>l3)~7}U}ur&hB- k TFDF{8.S0$v$BnN6IDAT`ǁ $$|;<\+B땓ѰgoQS5P5P54Ұyt>"4d;X&L+l+r Eg?AJ+f? RmG9GO<:MiXޞ5oʎ'iC=9?pw4~$m?ǺpܡG0GCrgsKp:zd9:9n js`&Fn` O2M?zÞBț3Р,/)S~GYDġD=oO[ޢ5dh&ŋ6NNOO74~]5c9gۺ_ȑ"M% 8q䯘LuŔ>P.oڗ^x5lgZzzFPfԿfvο\G4_3#BT/f?ikěI@PFqNvǺ? d|0dek{, l(VfTƚP (Ŀe-<ߪ[wm!ZJBo;X?]՛:oF+xSD8}ٙa3(Sns;w8'"?93#؟(G7~nd^2utB hr@ UUUwYN-ɏ%Ul 2V .J#|KY?uM}-ܞw'Nu񓣳ߥڹJEM_:ד7q=ZnC}g?٣`%ÿYdVq6. 3_Sz-%m'/B-jjZ4o+%Úڛ} ȳ/+v8 7'?goݮhώgdxvOS"ߓQÿ'GMWч ,+G,x1PZ m4RثW`'PgP5+Mw58їǣx;8uGOw/VX6~36d{{{{yvvv~G 1;kFy(mU٫ޱ`ծپX1p_hTF:N}'sMkJx"8QZ T Vz.9XӧO91f>Hh?硲wWu~O[BE' d UUUUoZiͺ:zřvkD?O騯/4](P9;ߢطNK,{4C|ķ0@84X>ASG2394~cplpn魂=9 C4(ǀ}jOS l ϛd6@H@8MBt*LBMZsUA3Ƒ'Hb$&K"⒬jjk@ 䕃:z"'i= OBZ)8_kPHsC͚j?h7ߋiwϪ͆:Ex`iM_sHk:nM' 5D<1odo^\8Țq{7e!869`<|qg/ȯZPb`ll'A5[eq o~lq M?DHͿԥ/:w[ I Sft BNˣGitzg8uѨw)\yKP4אajF4}2r~$"`^-љv h6d鋳17ռ3lj_ߔt (_{&A\Dp饐 KTB@Հ[\EJgaD[#[\Si]ZOu TYigx:jm_Sݑ;4?SyFQCN+N'[ƭa`Eip\8A@;cB(~So 07I"NؙtFӞ?5A)m*?7x'b!cȣeVUUKܵ _6:h: fG#= <[\tfΏiD:CMA;0/:4vk4״3mj D3ի|ÓɉFl1WFKlw9 q ᢴd 0ߏ!7v!x6|>)<h20_8;xOp) dC]]-ʲĒdfiqԃ`;^r|W T T Ӏ2d0=h@7-f4;dcn5вr:2;՚ 8 5yy)/!7ΗJs+]prEx~@FphyyZ\iBt0՟X֏G9|I'm:i04;J /2@tp1=-yrXx(zكy٤i0@.ҹ@`n8'N0OJ%znP8]OPnNWX5P5P5pY o8Isgz Kn~dp<`ΟӉi%[(;2)5]s}txBN'E"?h4h( yJi8ş8o^E]w;iE 841ͼ7N><~}YVe)q@e`?UUUoPyJܗXEfcl ti_t N]q9/4wXP 2ӠCdRt|.t~Op)5A~grjjj i}Ky7gqyi@yx~nb >˳ rs)7C/O#&/:s:q7a: u 4yBh<FVsߖ i偳Rč7W`C O~8҄REy )u~?dLF4#ix1n:?u~p\MWE<9=Óh^UUUՀYi}w}q\f࡙\.WN#"u[4Z_uO|!e{״Jyx[6_UUUW@nɻ.m[- *;e˱|W)e:k|Wr/ǍkVb=`S <oCx0;nxQF8wk}0.i ys\,Fb~pr|V T T T ӆ44'7ZfKڪ4Uy9 Xǔ7xhl4ܸfhbjjjVh 7T4o[PIPW{,yxr:uӎBxg=5]5P5P5p5#uEˮU T T T T T \?R2yiIENDB`zeal-0.6.1/src/app/resources/zeal.ico000066400000000000000000001361541335333561500175020ustar00rootroot00000000000000 V[V@@ (B[  ԝ | hPNG  IHDR>a IDATxwU{NBwUuWPRK X pFC/D Œ!&HdP{tV箜n8|M~m[%{5L:{]3g^ϼy=z3ߟN>> !+軁vGșe|+}8D<ʒ55mZ АzeiUCkP֐B2m]Ҡ؏"1$t0MEFm-Е##Hfڒ} F!@E;CZ F)CFfئڿNX(bBkrB1ZjCY2yIy޾i7} Px 3M>Aqe9*^qce9:)7e[>2&r)ose;^uAљG-A6U7y,B G:2'f䚏;^Um3t7KM~lg6GVqur|CN'>}{?_ːU]1]qӚq>ϟGNm;m&ԇʢ':| Z̹֘c+R 3_R]whaf\{͸vq[Pfq㸫oϛQc܂򨼯a&?vlc7ߌ=tc9];Ds6v =Y?D{Yc&sCGn%gГ9zsǞ́kq[8PT;L0kWqocĹ,l?tSoOwO L,1eRf\S^:~*oCUY9rf6%@tIHvzףLMU7l]ȍS*˿ܑW|W[oVY6,Zi2:B$2EG1bۿ`iM u9FLe;mH1J΍ra5m,rѕ 15&.VQՖ(0Eo3qgI}@i'D;O<>'2TSWP&O!`& 9C" ,f6E)HG mE/|U/; i~$t*ML2k1дm4eO3j=}?_~u@Th'DN}ĕ<(m%@S&n ~{rR/ƢjCln&-fZ%l@~Tڢo.AkB"8bL[IKV5zڐT P"G֐+6ą'np qd!mơ]"]$!x@;v9Ga"vV 9q"?w_GV-w;3l\<[Ę1Fc&ƄʊYFCU9!HJ&Sc\8_0`H ^ص iZS",9FCʘʂҤ1œ Џ3qq ADL HUZ|B[-La &bRX ,;l[G/Om%!n}ZRʤ48H |a1R"u#P<#a1L!c"刮-)gLS`5LCOU8\0ZJ@ ZX!A#!F)r|=BeӉ1zDe^,aً`5%|}i+lDCj ,Y!rmӮ_sϝ(BN0 SL 1JѴ5#1f{jV$\C] wkB7/-еvdSpXd`n)k+H3kmMuME e5*f|7X!K ;'-Ftk6o4H=ʀq VMs[T-9Fbܝ6^CԖmgWՁ (giaZ^Aw _NO?vM>G@)8zbL4UFJIE8k UcY-{E~_][Ly'.FEqE6Z7;O~ܭR$YT `4vFkLRƐw`bҖ=) QZ"W7IH҂wk iLdf%z'2X(.4,z 1#E1;)[r@PŭR2J6ql4)57a6뮻<B!_Or(p}`-{U_@+x=ݏ#hj(.T MGQJwuk@k,X$z)լYe('Ka!DңKhqn v#)+EN8H}"e -!Fr hgQ3l/I>HC&-UJP_,3."]@+ R6} ^9e$ƴ.{_E!,;9h!gx(E\~#%(͸ RDn}& r G!^jL*B'OTq(Wb][@^TCb?^{3nm]tJ嗵 *wz );TNđzmҖ< $v/)S)bu]=v;wc@dPdș0!rf)f*gCy7\+I[pp BAƢ)R( ͫP3A9K~3 ^5"ERP`JUvWaʠ ճ+*6Ͽ|˟嵺<vNk1TN㴆 Non%ňےKNJmGUF$臧BYk9SZ#a*fV@Nhڊ!ha +͝'/B;w}﹡BkEXyĉV94YՀn eK9bD휰lZJ/m H`áWn_.05 ; ^x K$"q*%71'TR Sϸ;e̻ /zl -JDCBkAn8q@+cQF fZF#W,"ݣA Pʵ |ZykHNg,LpaH:Yy FK^H>JR3ƂR;M>0eXTLD@ĕ7;}s6.\-Ρ~cFO׹A{O{9Ko`ux?w{yբgt-_**d Q!HYfTN Ov}͏>ijoAwy)V9%pS]pP68~ 4(sₚZ8尧῭ 9(J:VB <Ä10~Ե_hPgGp{1^~3r݀k EV 5q#n̞Z> Iލ!:!6!`&;ڐb.8 |K3F ;o %xa2 rVozm~Ox~piBN,)m-Ƶ6QXrrL>_ #%ZTA$RU7kQ(R'x~[tVPSKKhu,@"ML}ٴcf#5"ՕyVA6&Hk+d] -SEN#vAO kψ' 󃇔m2J9rEB7۵Qʧg*rLmr;Eo} W N~ϯFk7ѓ}$lcf`LJ&n׹3Z% /lK1(%`FpBcA)+dy^S6ksYq 8 JbVBNu#w{ܷ ^<݀ȭCL|Ci H,eileHF/)cLkb@Okt֊lT)ti@\j>9P_u7S_yhн\AXV({֦V+@e {\%Ҏc(E k<{w? dNb+PTYҐ-bNJmhTQ 8C=a [{wcî+ &=yI}ΧxnRDT8JdC9JlaGTm:KY)ٸ(;=a5/"IDC+*`vۋ .|TX-ؿo2ֹDc-1Z&67^M8Sh]Ą_9/򳳸YC_`cF㗣P!%*̼rP)Qr~hdA촦XTx*2JQ>ƈ[[ ^OXZp}| TAeXac$ ;q创TmŸiˡ4 6P/!bF)a;g91nI%7ɦm\EL':[յr&`aFRXXCR0QMCaB(%UA.,<ˑj)O+A{("p7(pho0%xHIU9ggq'>m?2IfP&ě-D+inȃ^gdbM nE\y)>BN}/F!7VhhN^F[HՓ3jI[+Tj8zˁJᬡo +ßC+QUT0tk0MM\ dW!,zI=Z*CXeHW<tD%M`&5Z c5 [~ IDAT1Rp_o{2<;ĻYb/r EXr'H̰¶RyhM{T2rXrC 0JV'QrΣ e!~V,{̞˻?wcH!i,: AV[YBE <0/jbgל<" ))k4) @YJ+Pǣؼe k]Cj8x U " Xkke/y,zπ4"I|u*8 () %W(0~kF|AL#)0$O;ŴD9BԂ/y Vb~Mv.Jn.$|&*N8|cۀ>"O2bLEvͥTK>*->' c'5F$yKwttmC1WԆq!\E*iԆ-yW?O𯽍:1.C& K+J70 <+]Z,ZjD1eak"'y& m#1^RVȾTi1cLn -̞lEL ?x1*q5TKw2:?RH滯-=bĬR+EӊN*?@VmlIJ03%}5*ZJz4`!l2Z[q Ɩ5QK!~Q0 TCфLZi C?dVٴƛ ⁓b Qru -I{\(L_q*V9l ^`T[ dY?3L{}/;w1n̝"XMc>ak+E+fCTRØxiQۊ;Ҵ*Iv"LeČ"n~kFcv+ ~q(զDxRlH;!`53m8zZXb"+Nn9 O"W#NREUJ(!@Ch# "ERҝl"F;nD cµ5G~<{ ߇ ^GdQ$ YX'.9HA8 4]V2o!r U[-[5o 6:M Id4NH#hxZ`x^0Zv.]+xHԥq;πŖ":[YRi1(PꛘY=Ǖ/"-nx>ůuUaCt\1${iڻw ݲ'DUY3$bqp/e BdЭ%;1^--\F@O0H 61e3"\vn{RyV3?yOF4~I k*I22ۯDT)hQ/n8))DLjuZ;62}mE1a&KS".d.1S7HG^!uVAkirci+L1laD!meZ+؜7>qҙ|u2 }zcqĻjqF|0.ivtںU/3r?|-W7=龖?]t'õ9l#.$L"?b'JEO312+ɰ SB:vEYb m rGhg5X|KXJR L,/cnܴE80\ \XO "ȅC)>N*B1K߀9te⃧8̇xx։N+' 맴%"$f/\€EFf7ʍ}ӣǟtOg>&تo/֪ZehSHhybH́x7Is2˘5k QP\ؙΡ%dd #nO-vrʌ; {~d V`Y-#:52&.DHS ם!6G7"^8EG@_nj"F$^5zVbD/5xXĘ%w_˵O67rOOtnK[[o(ck A7V0 ݀rG %ec7ʨ\hVXL3*erHؙ+l|]_9oz4ak@oɣ=@b{䫸߁cqhA2 D skNԹ12Ԩ@X6W2(;U+FqR7bw6,jʰhJt N|9$d2[ōO"u=?C,>sL m%۵tS9gPU Ay 3zF$$Ed\]Fm {;wRQPL Ǖ`",1R'DOH D[sA-sxi4!L;ŷ8g軁~  TZd3S JWxV+=T(h-9T;% q>#WܷnO,[#/SHv %Q'>@H.BCoh-ԺtZޣR"vA6GM{;exeʘɌ=J9dz`1CLcxiҕ J ah1jsh9hvPH-s1,q޷=0/*l4[Cd,)i bؒb! Z+ܟOgFy-\kH-of a8pjg'K艣90#DX2V@^}d(Đ[způw̤q71֑L")CSזA1H׌2!,|⬭[_=w|t$9@i>`gN6J3;MF(p;mk^>p78l8T>ΠVp)ܛRõ?G3h CE61  #D}Myv>QMdPr+mWQv5 e2i11+v.)"U̞֬r6=xƐ˧-Xu[ci=c`#,>A-¡N'[b CS B*YTBJ>Q_jw]v~=|u_O\m덳4k )9u7"ҚH¤QI%% s☄Sƈ212%*c!Q@ʀ}+8+?-}"~ѭh$:q3RH1Jd)m!f"4JYF1)TNj&cNkU~x |Cs@+)fG5et'~Q6 o{.ٴf>_iyeZ!"+Ĭ"(ib:T%4jUJ8F)C'Z O0o6;yMBzVH5oeҙDڐȸPQM\oCt4=Qdƭz΢5 Zab\xI} y^B ] ))#{\ EJ)!o>ɔiƲx>*F?%g3W))R4+_l$$#Ǹ_O}0G~UGH^VjwCpj1vՓ|q.#֥@(S)R?RMD20.GIl3ȡ4jaXR|jb,ς-5lѰ>N|"^v.{^?9b4m3a|/z|cR7&9 IGFƄm "N\j{~0@EVkLn|6q4>pT˾k_] N.VſI'%|{ˡl¯Yn^'1M"6ruLZ;/DGF"6@2yc{N+wZZ˛7ί'hR LGuq>?~Nѕ ȋ`I!gD d>`LMXBJ3ѴO䦄T''Tme<(O1xQo..OxSwku.}꓌_zNLI ZIi-49dX-2pD#6|lb*E13&E6i[2'X*9w'.;!sx23U6JaNШsyՓKW +m3#˂Ӵe+3ŒUW)BfTdIJN)#xzlQIV? CݷD)<闄J6j`sC0y1/c3oz4?ڠ|ֿU֞E(EA`'vh<ͨM2f%!jD泹OOdȼ;1Y#.|Lkf=ڤI:QBrH'| h[buÏ=|DA*aerE&ju-,^ C'`f3fmg%;'ET]ٔJSݨPVaqB @6j&4aN.ginT3m-卒b`uHE-D!q)6fsB3WҋL&qIzYRb _PjMˤBXρV(hGcy|F]?'t>PT^EMn jjfS(jeYcg ,,]'-Qmjx:g[k%]ӕ3t{a5 bnd״n2:F0vZ2"ЦZ'V5F#LU l&7S]PSNS&?HYl&^zJFdo׳QJF%cz|&laFy -\NWQ13M|ҝ-j>JES^3BT-{}uMZ?ߟF\:o^Kf)$%TL;j$6Sm&N؉e\7JlIqxa'Ԭ-Z|+=1B;np2F Q:PءڗNIk)>UߨgE]4* $iʺo]N'4x7ZE[!qf80c扟@/+醻L B(^]PCt0O$1Fx?`ts"t5KM"GЖuR* P5vK(znS2Hz{m*C, $}sQVR{TTJB6On, Lq)eM9CZaeN4}-OI 7^*$(QFh ]NX]tu#в+betMQXqlЮK1!?$rZuLR)')oTiKμIDAT@D&nй#z]J\/c(>SG~|3,Z,wHdFi:2-Y\VJ5¡ZKu*[jЩRhzijhYMvu'`FٳJ\!Kunք?`=>D\a]"h*Z%Pb-B!)+Ac%ЃG:H6fWD'zT **74[+s5s0Y3ƪ"ޕx/ʠ>Mf"˜h#]t]'<PPT6+U-AbIP| LpQ"[*D)IM&I>ءEFXEQpjZtnZ3ިNp U7 +NhRR%i"tۛM%v`SPDV67zS ,6[ި;)&[Ә ) ݸÇ;\ǏO(շk4z]?DHQ8"u#ӫ꺡*kF㊮ EV6 j*q&KH˒IIIP'kmтR"`vhq=  fI=ⲣhImdw}+h" 6SRM^az.Dk0N4[ BXIgS*_,zSd]덖>*Q-:?'VI /Ҹas8*~#sGh/o~Ѹf4V8evD* +UP.;)53t )R.[`|k.5Eڱ0oHk: `P0L[XVTI=+4]+jݑ({N$gmiJIݪT:VYU| i-;-,UFk/YAbD%8RRӈoD U˟Ԗ2*>?H}eٯs#oxf\+. ]E-pJȟEѶ @ES-YBU;u9V ڧ`^p9oUٚyͰRI)>+8)5c|F yg· ÊW6 :)|eJc&_9NwIUuӥZ\fc3 _i,/) _i,Il+YÕV||xNa Lu^?yy络WQ^yf+79};u>^BŬgystZae|2:tit-Ơ^!Cds8^YOƾiܞa, a= e8A|G SK3az=mxe.=Uyt.r^3ϑY@%~Y}\=? \;B,Xbc11K~Yt1@i82'}g˱CX~{0EE\ן-.{}|9lɃo}̠J^½MCtŇ'<㏓-$_>3X9l^<~ܵ/iU ܾ 8z@2CxZD"R!Fƛ32l>AzK_;O!3;r /N~0*8R[\~3\Dgvf.݇T9xf8?]_|la?HlQhP3x˨Ͽ],Hb{oay,šØh Eh~]`sBϿagɝkd{cF9tQ?@"jUy|W^ZriJAJ6*|ѽ![񁹂zoޕ8CgM| JTXYط\VXB}~->X +WM'P2cEE17gt{ESq=(lQښc Z-5Q!UZO3t864z6D+뭞F$Y$=Hu'/#t1%Ӵbc\3lZxgx!ɋ|]lN O%) VRj1pp"k[vƷq~w ~OZviw9|7I2gɬ8ˆs,7⭦cP=:҆_]`;}U|/'|=Pӄg3g4+JfY>\ x~bԾ sY6~KL:BiΚ@]2K[S Ge Μ9MYcX>={J)I9ygJٵ1nJ \ɉܨns[_{[g`>'8} "@Ӷ4MC9.%Fbh <\B&pDTMfC޶q1#s\EuZQLJ*~zj JO;q%Fl @M-"` b&L~Ad\,: :Tbc 9o5];$]ΰaΞ9<#/r,W}44:g"ؐ:yG':[S[g-l$vh wB&rm}4 63Vv񘦩)uPeYQ75R!F܅l@^<(u޽xG(PC<'/M:-LqܲD g#@R;yL&OC8ZcA:qF|]}cKGYYYin(>C;v sss C>.paŘΟJO;l6Ppϰ[EJVL`[?OFf2x r+@O0"'$ʚSVhslfy,(@m#G9z8Y!EQy$ IӋvz:&#_pc?`$a 5NڤӜgLIQey~>rΥN߉@崓r.|WPґ\eg>g8Sz8ki#.F+~iiP\˂ׯn1mSvpM),`ԏDw~ qY%seYR9f:yQWlYGg:I7jz=wb2}7cS=\t&rOD'l d&3­;nܛvW) Ka/F`{si0wZ 5Хu{h {[Wo:,#fOI=ɨ7og>ی!C bɋodlJ^d|[tw ܅OhyԃL'ViO<1;]wiy.:JSѦ$TݬڬoGD% upa~9>ι{>o7qYn3p9CZКH[t"XIHZdB`<;۾={2 }x着 A1qBU /kγ'Z `t o7{1y3F*zijYvsΊ@btEVV]{usJ>|6F p`$6VfۮeOJO+4Ktw(^}UⅦZ K.bmKm^k J%11zyMUB. +tmGFctD&lu;F<xۻ%| 2ڶk[ jJk|296Rkܫ/2?W7- `}},X#K/r$nD,X5M4hpR0+a:eS8x1(fz8NPVN@ v[noBE$P,%c&@iWNocaO`/9hˇ9~ehs'?s0i4i`hLyR0Z xsb1k }3ύ ֿW>Ο_iZկA2s?{ FD1iQ}|+yx3 C9%~y'w `}>׮_Ci͇?wq;mu[Bf{LXmD}ʋ,:ÜbϱewW *nֈ#=s{ke0ߟ еDkE+accCZq%NSNs ,8ì f߱es|BݮW'СC+o.]>A^xyy>C?ٻc~fLIO|"h}W#֞< |u4[ዟ1o\cǎ[gYƩg>O|Go~?~ 9MWW!Py"g.MY;7eoj1KUZՊL)2ȝavq{Z 0}oskyC{보tpȵkoε8cE8 ALE=z3~>p[>¸l;/=O(> 5Y1af8C(t\N:VX[\6{ Ĺse{衇;y\~%^? zTZaůlƻ9]SN}\ke6x˶Sl?7_k'9~Wgm7 ,,,1qk:hvՍ:*n9-޼D'aԚQa׮g6ƟpGɟ,}`g(#Cܩ_6NX PG(|{5=wE4\| 7&uN8Yz80 oFpK -> l7B˻'%F-Y`![Wo1wˎV⶟=~oIENDB`(@ B#')++,,,,,,,,,,,,,,,,,,,,,,,,,,+*(%"$,27:<>>???????????@@@@@@@@@???>>=;951,& %/8@FJMOOPPPPPQQQQQQQQQQQQQQQQQQQPOLIE@:2*"!,7AJQVY[\\]]]]]]]]]]]]]]]]]]]]]]]\[YVRLD<3) 1!!!&&&''' $H ~ { pv4'###&&&&&&&&&&&&-/A t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t u v w z ~ x]$$$&&&&&&)))=<;@??05J,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,C,C-C-D.F0I3L*C#g'''&&&&&&322876#(@:E{;E|;F};F};F~>&&&&&&LKKrqqrqs-"%(,887&&&&&&988dbbsrqxvv{yy|zz}}~}}||{zy~}}~~}|{rpq- "/25>==&&&&&&&&&22279LCKDLEMGNHOIPJQJQJRKSLSLTMTMUMUNUNTNTNTNTNTNTNTNTNTNTNUNUNUNUMUMUMTLTKSKSJQHPDK?F}OStfglnmmqooljl-""!%,14EEE655&&&&&&%%%2:w\]dbab,""!%").'/46;@CEFDBB?>='A$7qJifIifQna{e~Ggd~Gfd~_zQmd}Cbd}QmYue~Hgc}Lj^xe~Gfc}Hgd~_yRod~Ddd~Ro[weLjeD]@S-$JKa}}*""!&!(,&-2)27*28%,2!/%K%H,~%G*n&Q%G-$F.%G&P)m$F-$F)l(Y$F,}$F+v&P%F,$E*{$F&P(l$G.%G)n'Z%G,~%G.z1r;XRq6H%mls(""!%!)-'/3*27*28$+1#68787476664437445747677466555437557857780*o0HiWj+5&"""&!(,&,0*27*38$+1#5([767867878:75686444555546877:755866576777.(R)L5M!!$!(+%-0*27*27$+0!:89<;9;9:;:7;87:79767:89;8:;:7:9888:98:=;9=:8)@\r""& ',&.2)16+59$+0#: ;9<<:>89;<8;8::88:879:8;79:<9;9:;:9<:9<<:=3(SCa"!$ '+%-1*27*27%,2"<)[>;=<;:<;:;:;;;:;:8=8;<99;9:::<<;:<;:>;==;<>1]u!!& '+&/3)17*28$+1#>>=>>><=<<;;<<::;:=<;===:;<;:;<=;;<<>>=>?>=>>'ILe"! %#(&.2)17*17$+1#@+]?>><?=?=><><==<;=<=;3RNhj=><?>??>=@?@+^B]"! %&%*%) '* %? AA>@>?@?>@>>??=OkxBa@>?@??A??A1sYo""#$)42:VUXMMO'',"?CA?@?@@?>B`Olw\uPl@<?<>@?>??=A'J'K?BA?A?BBA'I8V""!%$*/8<@?BF25='*/ $D+]ABB?Pl@A=?A?>@>>?@BAA@A?AAkB@@BAAACD6Yq"" %!(-%,0*28+38%,2!D B?CD@(K^xBb?<?C@@@=@B>?AA?BAB@=@CbBB@CDBBB(IE`"! $!(,&.3*28*27$,1$DGEECABAA(N^yCCB@CBB@@@@ACC@DDCED7XFEDBDDCD3tUn"! % ',&.3)17*37%,2!EGADEDECCDFQoDCBB>ABCDAACEDCEDBFE*OFADEGHEE+UZu"!!%!',&.2*27+48%,2#H HIFEGGGFFC+P)MDCEECCECFEFDDFGEGCEDGHFGIII*J=["! $!(-$*/*38*28$+1! I.^ J GFHE IGEFGFF`zSqDGDDFCGDDFFFGFGFH GFI G G IG!K H :]v#! # '+&/3)17*28%,1"!K"L"L!K!L H!IG H I H HG H I,Q IG IFGEGHG HG!I!J G G J!I!K!K!J"L!I!L J!L*J?`" $!(,%-2)27+59%-2!#M 0_#K$M"K#L#L#L"J"J"I"J H!I!G!H!I|/T!H"J"I"J!H!G!I!I H"J"I"J"I"K"I"K"J$M#L$N#N$O#M!;`z" %"*-&/3)16+39$+1##L $L$L$M#K"J#L#M#L$M#N"K"I"J#L"I!HHiVs"H!H"I"K"K#L#M"K#J#K$M"I"J"K#K#K$L$M$L$M$M$O +K\x"!% (,%-2*28+38$+1"%N%P$M%M%N$N%O"J$N#K#K"H$M"J$M"I#L#K"I#L#K"I#M"J"J"H$M#J%N#J$N$N#L$N$L%M$O%O%O#M%P!.UId! $ $!',%-1*38*17%-2!&O%O%Q&Q%M%N%N&Q%N%M%M%P$N$M#L#K#L#K$L#K$MWv>c$L$M#L%O$M%N$L$L$M#M$N%N&P&Q$O&O%O&S%O#>>>==;961-&  '.5;?ACCDDDDCCA?<71*#  T++*'''$R a a a a b b b b b b b b b b b c c f j r o?$ 0//v'''221322:@]CODPDPEQEQFRFRFRFRFRFRFRFRFRFRFSERFTHU0D$9 ~ .--100PON~||}(?,~ &&&KIImt,A &&&lji)@ )))DCCxxvyyy+> !444)((ZZXussutt]h #"%555&&&=<<<@eELHOJQLRMTNUOVPVPWPWPWPWPWPWPVOVNULRGN`c~rrrlkkz  #" %):<=8884:N"?"?"?"?"?"?"?"?"?"?"?"?"?"?"@"?"?"?"?=+OQe #"!%'.3,4:)]7576877688676878687=&L!;;<:;::;=;:<:;:;<=;;3O  "%(/4+38-f>=>>=><<=><>>=><<>>=>>,L!'/3+38.hA@AAA@A@AAPmyk@AAAAA"A  #"'@@C#&*=BA6WQoQmllQmQoQmRoBABAC"B""%05905;.dDF8[*ODECDDDFFD{mDEEE$D""%(04,49/iGGGHGhTsGFFFGGHHHa}GGGH$F"!%'.3,491j!L!K!L!J!J!J!K!J!J!J!J!J!J!J!J!L!K!K!K'I!%(/4+382j$O$O$N$N$N$N$NXv1X$M$N$N$M$N$L$O$O$N$N$O)K"%'.3+382j'P'Q'P'P'P'O'O&O3YYy&P'O'P'O%O'O'O'R'Q'Q+M" $(/3,49 4k)T)R)S)R)S)R)R(Q(Q(St)S)R)R)Q)Q)S)T)T)S.O "'),#$F+V+W+U+U*U*UCh*U*T*U*VPsPs*T+T+T+V+W+V+U/Q"#';=?*.3!1_.Y.X.Y.Y.X-Y.W.Y.Y.Y.Z.Z1T####""%'.3+39"5l1[1[1Z1\1\1\1[0[0Z0[0[0[0\1\1\1[1\1Z1[1\1\1]9Z"!%(/3+38$6m2^3_3^3_3_3]3]3^3_3]3^3]3_3_3^3^3]3_3]3_3^3`TmMPS"%(.3,49$8m5a5a6`6a6a6b6b6b6a6`6`6`6a6a6b6b6b6a5a5a6a6b|49<(.3,39$:n8f7d7e7e8d8d8d8c8c8e8d8e8e8d8d8e7c7c7e8f8fgu(0 ` +SqHqHqHqHqHqHqHqHqHqHqHqHqHrGrGm#&&&q'''/...~.~.~.~.~.~.~.~.~.~.~.~./0.% ](+,866VUUQ_ 1,38y~:K-48x~'.3[bgz5ELVYpcfhijmnporpsqsqsqsqspsormogiadsrq$+019=4>>>>@>>=;;;%K#*/#*/=N7BC$F(J,K*L*J)L*K+K*J(HD?@F $!&)%> D'K0Q8WVon[s*MECB$*/,.5(,2(@%IVqj=[2S-Q.Q5VIe2T#JFD$*/$*/$+/AU%C0TJhw@]1T)N'O+P4V[uKi(N IJ$+0$+/#+/+I$J)R3W>_s=^3X,S(Q+R-T,S&P#M!L$+/$+/.K&O)R.V6[AaUpSn<^1X-S*S)R&Q%P%P$+/$+0>U(H/X5]=`CdKhRlAc7\/W*V(T(T(U#$&+!$(6N/V7^oz~On7]0Y,X,W,X$+/&,2)/43R2Y:bPqv{:a2^/[/\/\#*.$*/#*/BZ.P7b=eAgBhBgCgCgChChAg=d7b3_2`2_1]-9@#*/#*/?]4^6d8e9d9c9f9e9d9e9e9d8c6d5c5b5cKj3 ',/$)-:S9g9i9f9h9h9g9h9h9i9g9h9g9h9g;fSvϪ  (  @q+//////---------./!2\af454UTS.?;AFLSW=DI*Qnrv"!'+)I(M/O3R9WKep|Fb,M G!Ikqs&,148A/OLjut~4V%KHswz!'/4>Q4WXsNhGcA`?]a{Nl*P#Mgnp&,1'.21T0X9^EdWsCc9]5[1Y+T(Rpsv!&.22V2[9`CeMks?b5\/X,X+WFbr"$)25;AU6_v7_1[/[/[Ifwv%,1%,1;`8c=f@hBhDiDiBi>g9d6b4a4bQr/+49&-1=c9f:h zeal.ico browser/assets/css/darkmode.css browser/assets/css/fa-brands.min.css browser/assets/css/fa-solid.min.css browser/assets/css/fontawesome.min.css browser/assets/css/highlight.css browser/assets/css/welcome.min.css browser/assets/fonts/fa-brands-400.woff browser/assets/fonts/fa-solid-900.woff browser/welcome.html browser/welcome-noad.html icons/type/Abbreviation.png icons/type/Abbreviation@2x.png icons/type/Alias.png icons/type/Alias@2x.png icons/type/Annotation.png icons/type/Annotation@2x.png icons/type/Attribute.png icons/type/Attribute@2x.png icons/type/Axiom.png icons/type/Axiom@2x.png icons/type/Binding.png icons/type/Binding@2x.png icons/type/Bookmark.png icons/type/Bookmark@2x.png icons/type/Builtin.png icons/type/Builtin@2x.png icons/type/Callback.png icons/type/Callback@2x.png icons/type/Category.png icons/type/Category@2x.png icons/type/Class.png icons/type/Class@2x.png icons/type/Collection.png icons/type/Collection@2x.png icons/type/Column.png icons/type/Column@2x.png icons/type/Command.png icons/type/Command@2x.png icons/type/Component.png icons/type/Component@2x.png icons/type/Constant.png icons/type/Constant@2x.png icons/type/Constructor.png icons/type/Constructor@2x.png icons/type/Conversion.png icons/type/Conversion@2x.png icons/type/Data Source.png icons/type/Data Source@2x.png icons/type/Database.png icons/type/Database@2x.png icons/type/Decorator.png icons/type/Decorator@2x.png icons/type/Define.png icons/type/Define@2x.png icons/type/Delegate.png icons/type/Delegate@2x.png icons/type/Diagram.png icons/type/Diagram@2x.png icons/type/Directive.png icons/type/Directive@2x.png icons/type/Element.png icons/type/Element@2x.png icons/type/Entry.png icons/type/Entry@2x.png icons/type/Enumeration.png icons/type/Enumeration@2x.png icons/type/Environment.png icons/type/Environment@2x.png icons/type/Error.png icons/type/Error@2x.png icons/type/Event.png icons/type/Event@2x.png icons/type/Exception.png icons/type/Exception@2x.png icons/type/Extension.png icons/type/Extension@2x.png icons/type/Field.png icons/type/Field@2x.png icons/type/File.png icons/type/File@2x.png icons/type/Filter.png icons/type/Filter@2x.png icons/type/Flag.png icons/type/Flag@2x.png icons/type/Foreign Key.png icons/type/Foreign Key@2x.png icons/type/Framework.png icons/type/Framework@2x.png icons/type/Function.png icons/type/Function@2x.png icons/type/Global.png icons/type/Global@2x.png icons/type/Guide.png icons/type/Guide@2x.png icons/type/Helper.png icons/type/Helper@2x.png icons/type/Hook.png icons/type/Hook@2x.png icons/type/Index.png icons/type/Index@2x.png icons/type/Indirection.png icons/type/Indirection@2x.png icons/type/Inductive.png icons/type/Inductive@2x.png icons/type/Instance.png icons/type/Instance@2x.png icons/type/Instruction.png icons/type/Instruction@2x.png icons/type/Interface.png icons/type/Interface@2x.png icons/type/Keyword.png icons/type/Keyword@2x.png icons/type/Lemma.png icons/type/Lemma@2x.png icons/type/Library.png icons/type/Library@2x.png icons/type/Literal.png icons/type/Literal@2x.png icons/type/Macro.png icons/type/Macro@2x.png icons/type/Member.png icons/type/Member@2x.png icons/type/Message.png icons/type/Message@2x.png icons/type/Method.png icons/type/Method@2x.png icons/type/Mixin.png icons/type/Mixin@2x.png icons/type/Modifier.png icons/type/Modifier@2x.png icons/type/Module.png icons/type/Module@2x.png icons/type/Namespace.png icons/type/Namespace@2x.png icons/type/NewSnippet.png icons/type/NewSnippet@2x.png icons/type/Node.png icons/type/Node@2x.png icons/type/Notation.png icons/type/Notation@2x.png icons/type/Object.png icons/type/Object@2x.png icons/type/Operator.png icons/type/Operator@2x.png icons/type/Option.png icons/type/Option@2x.png icons/type/Package.png icons/type/Package@2x.png icons/type/Parameter.png icons/type/Parameter@2x.png icons/type/Pattern.png icons/type/Pattern@2x.png icons/type/Pipe.png icons/type/Pipe@2x.png icons/type/Plugin.png icons/type/Plugin@2x.png icons/type/Procedure.png icons/type/Procedure@2x.png icons/type/Projection.png icons/type/Projection@2x.png icons/type/Property.png icons/type/Property@2x.png icons/type/Protocol.png icons/type/Protocol@2x.png icons/type/Provider.png icons/type/Provider@2x.png icons/type/Provisioner.png icons/type/Provisioner@2x.png icons/type/Query.png icons/type/Query@2x.png icons/type/Reference.png icons/type/Reference@2x.png icons/type/Record.png icons/type/Record@2x.png icons/type/Relationship.png icons/type/Relationship@2x.png icons/type/Report.png icons/type/Report@2x.png icons/type/Request.png icons/type/Request@2x.png icons/type/Resource.png icons/type/Resource@2x.png icons/type/Sample.png icons/type/Sample@2x.png icons/type/Schema.png icons/type/Schema@2x.png icons/type/Script.png icons/type/Script@2x.png icons/type/Section.png icons/type/Section@2x.png icons/type/Sender.png icons/type/Sender@2x.png icons/type/Service.png icons/type/Service@2x.png icons/type/Setting.png icons/type/Setting@2x.png icons/type/Shortcut.png icons/type/Shortcut@2x.png icons/type/Signature.png icons/type/Signature@2x.png icons/type/Special Form.png icons/type/Special Form@2x.png icons/type/Statement.png icons/type/Statement@2x.png icons/type/Structure.png icons/type/Structure@2x.png icons/type/Style.png icons/type/Style@2x.png icons/type/Syntax.png icons/type/Syntax@2x.png icons/type/Subroutine.png icons/type/Subroutine@2x.png icons/type/Table.png icons/type/Table@2x.png icons/type/Tactic.png icons/type/Tactic@2x.png icons/type/Tag.png icons/type/Tag@2x.png icons/type/Test.png icons/type/Test@2x.png icons/type/Trait.png icons/type/Trait@2x.png icons/type/Trigger.png icons/type/Trigger@2x.png icons/type/Type.png icons/type/Type@2x.png icons/type/Union.png icons/type/Union@2x.png icons/type/Unknown.png icons/type/Unknown@2x.png icons/type/Value.png icons/type/Value@2x.png icons/type/Variable.png icons/type/Variable@2x.png icons/type/Variant.png icons/type/Variant@2x.png icons/type/View.png icons/type/View@2x.png icons/type/Word.png icons/type/Word@2x.png icons/logo/64x64.png icons/logo/128x128.png icons/logo/icon.png icons/logo/icon@2x.png zeal-0.6.1/src/app/versioninfo.rc.in000066400000000000000000000037001335333561500173230ustar00rootroot00000000000000#include #pragma code_page(65001) IDI_ICON1 ICON DISCARDABLE "resources/zeal.ico" #define VER_COMPANYNAME_STR "${PROJECT_COMPANY_NAME}" #define VER_FILEDESCRIPTION_STR "${PROJECT_DESCRIPTION}" #define VER_FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH} #define VER_FILEVERSION_STR "${PROJECT_VERSION}" #define VER_INTERNALNAME_STR "${PROJECT_NAME}" #define VER_LEGALCOPYRIGHT_STR "${PROJECT_COPYRIGHT}" #define VER_LEGALTRADEMARKS1_STR "" #define VER_LEGALTRADEMARKS2_STR "" #define VER_ORIGINALFILENAME_STR "${PROJECT_OUTPUT_NAME}.exe" #define VER_PRODUCTNAME_STR "${PROJECT_NAME}" #define VER_PRODUCTVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH} #define VER_PRODUCTVERSION_STR "${PROJECT_VERSION}" #ifndef DEBUG #define VER_DEBUG 0 #else #define VER_DEBUG VS_FF_DEBUG #endif VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION PRODUCTVERSION VER_PRODUCTVERSION FILEFLAGSMASK VS_FFI_FILEFLAGSMASK //TODO: Set file flags. //FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG) FILEFLAGS 0 FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "CompanyName", VER_COMPANYNAME_STR VALUE "FileDescription", VER_FILEDESCRIPTION_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_INTERNALNAME_STR VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR VALUE "LegalTrademarks1", VER_LEGALTRADEMARKS1_STR VALUE "LegalTrademarks2", VER_LEGALTRADEMARKS2_STR VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR VALUE "ProductName", VER_PRODUCTNAME_STR VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 1200 END END zeal-0.6.1/src/libs/000077500000000000000000000000001335333561500142005ustar00rootroot00000000000000zeal-0.6.1/src/libs/CMakeLists.txt000066400000000000000000000001361335333561500167400ustar00rootroot00000000000000add_subdirectory(core) add_subdirectory(registry) add_subdirectory(ui) add_subdirectory(util) zeal-0.6.1/src/libs/core/000077500000000000000000000000001335333561500151305ustar00rootroot00000000000000zeal-0.6.1/src/libs/core/CMakeLists.txt000066400000000000000000000007101335333561500176660ustar00rootroot00000000000000add_library(Core application.cpp applicationsingleton.cpp extractor.cpp filemanager.cpp networkaccessmanager.cpp settings.cpp ) target_link_libraries(Core Registry Ui) find_package(Qt5 COMPONENTS Network WebKit Widgets REQUIRED) target_link_libraries(Core Qt5::Network Qt5::WebKit Qt5::Widgets) find_package(LibArchive REQUIRED) include_directories(${LibArchive_INCLUDE_DIRS}) target_link_libraries(Core ${LibArchive_LIBRARIES}) zeal-0.6.1/src/libs/core/application.cpp000066400000000000000000000174271335333561500201520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "application.h" #include "extractor.h" #include "filemanager.h" #include "networkaccessmanager.h" #include "settings.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Zeal; using namespace Zeal::Core; namespace { const char ReleasesApiUrl[] = "http://api.zealdocs.org/v1/releases"; } Application *Application::m_instance = nullptr; Application::Application(QObject *parent) : QObject(parent) { // Ensure only one instance of Application Q_ASSERT(!m_instance); m_instance = this; m_settings = new Settings(this); m_networkManager = new NetworkAccessManager(this); m_fileManager = new FileManager(this); // Extractor setup m_extractorThread = new QThread(this); m_extractor = new Extractor(); m_extractor->moveToThread(m_extractorThread); m_extractorThread->start(); connect(m_extractor, &Extractor::completed, this, &Application::extractionCompleted); connect(m_extractor, &Extractor::error, this, &Application::extractionError); connect(m_extractor, &Extractor::progress, this, &Application::extractionProgress); m_docsetRegistry = new Registry::DocsetRegistry(); connect(m_settings, &Settings::updated, this, &Application::applySettings); applySettings(); m_mainWindow = new WidgetUi::MainWindow(this); if (m_settings->startMinimized) { if (m_settings->showSystrayIcon && m_settings->minimizeToSystray) return; m_mainWindow->showMinimized(); } else { m_mainWindow->show(); } } Application::~Application() { m_extractorThread->quit(); m_extractorThread->wait(); delete m_extractor; delete m_mainWindow; delete m_docsetRegistry; } /*! * \internal * \brief Returns a pointer to the Core::Application instance. * \return A pointer or \c nullptr, if no instance has been created. */ Application *Application::instance() { return m_instance; } WidgetUi::MainWindow *Application::mainWindow() const { return m_mainWindow; } QNetworkAccessManager *Application::networkManager() const { return m_networkManager; } Settings *Application::settings() const { return m_settings; } Registry::DocsetRegistry *Application::docsetRegistry() { return m_docsetRegistry; } FileManager *Application::fileManager() const { return m_fileManager; } void Application::executeQuery(const Registry::SearchQuery &query, bool preventActivation) { m_mainWindow->search(query); if (preventActivation) return; m_mainWindow->bringToFront(); } void Application::extract(const QString &filePath, const QString &destination, const QString &root) { QMetaObject::invokeMethod(m_extractor, "extract", Qt::QueuedConnection, Q_ARG(QString, filePath), Q_ARG(QString, destination), Q_ARG(QString, root)); } QNetworkReply *Application::download(const QUrl &url) { static const QString ua = userAgent(); static const QByteArray uaJson = userAgentJson().toUtf8(); QNetworkRequest request(url); request.setHeader(QNetworkRequest::UserAgentHeader, ua); if (url.host().endsWith(QLatin1String(".zealdocs.org", Qt::CaseInsensitive))) request.setRawHeader("X-Zeal-User-Agent", uaJson); return m_networkManager->get(request); } /*! \internal Performs a check whether a new Zeal version is available. Setting \a quiet to true supresses error and "you are using the latest version" message boxes. */ void Application::checkForUpdates(bool quiet) { QNetworkReply *reply = download(QUrl(ReleasesApiUrl)); connect(reply, &QNetworkReply::finished, this, [this, quiet]() { QScopedPointer reply( qobject_cast(sender())); if (reply->error() != QNetworkReply::NoError) { if (!quiet) emit updateCheckError(reply->errorString()); return; } QJsonParseError jsonError; const QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &jsonError); if (jsonError.error != QJsonParseError::NoError) { if (!quiet) emit updateCheckError(jsonError.errorString()); return; } const QJsonObject latestVersionInfo = jsonDoc.array().first().toObject(); const Util::Version latestVersion = latestVersionInfo[QStringLiteral("version")].toString(); if (latestVersion > Util::Version(QCoreApplication::applicationVersion())) emit updateCheckDone(latestVersion.toString()); else if (!quiet) emit updateCheckDone(); }); } void Application::applySettings() { m_docsetRegistry->setStoragePath(m_settings->docsetPath); m_docsetRegistry->setFuzzySearchEnabled(m_settings->fuzzySearchEnabled); // HTTP Proxy Settings switch (m_settings->proxyType) { case Core::Settings::ProxyType::None: QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy); break; case Core::Settings::ProxyType::System: QNetworkProxyFactory::setUseSystemConfiguration(true); break; case Core::Settings::ProxyType::UserDefined: { QNetworkProxy proxy(QNetworkProxy::HttpProxy, m_settings->proxyHost, m_settings->proxyPort); if (m_settings->proxyAuthenticate) { proxy.setUser(m_settings->proxyUserName); proxy.setPassword(m_settings->proxyPassword); } QNetworkProxy::setApplicationProxy(proxy); // Force NM to pick up changes. m_networkManager->clearAccessCache(); break; } } } QString Application::userAgent() { return QStringLiteral("Zeal/%1").arg(QCoreApplication::applicationVersion()); } QString Application::userAgentJson() const { QJsonObject app = { {QStringLiteral("version"), QCoreApplication::applicationVersion()}, {QStringLiteral("qt_version"), qVersion()}, {QStringLiteral("install_id"), m_settings->installId} }; QJsonObject os = { {QStringLiteral("arch"), QSysInfo::currentCpuArchitecture()}, {QStringLiteral("name"), QSysInfo::prettyProductName()}, {QStringLiteral("product_type"), QSysInfo::productType()}, {QStringLiteral("product_version"), QSysInfo::productVersion()}, {QStringLiteral("kernel_type"), QSysInfo::kernelType()}, {QStringLiteral("kernel_version"), QSysInfo::kernelVersion()}, {QStringLiteral("locale"), QLocale::system().name()} }; QJsonObject ua = { {QStringLiteral("app"), app}, {QStringLiteral("os"), os} }; return QString::fromUtf8(QJsonDocument(ua).toJson(QJsonDocument::Compact)); } zeal-0.6.1/src/libs/core/application.h000066400000000000000000000055231335333561500176110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_CORE_APPLICATION_H #define ZEAL_CORE_APPLICATION_H #include class QNetworkAccessManager; class QNetworkReply; class QThread; namespace Zeal { namespace Registry { class DocsetRegistry; class SearchQuery; } // namespace Registry namespace WidgetUi { class MainWindow; } // namespace WidgetUi namespace Core { class Extractor; class FileManager; class Settings; class Application : public QObject { Q_OBJECT public: explicit Application(QObject *parent = nullptr); ~Application() override; static Application *instance(); WidgetUi::MainWindow *mainWindow() const; QNetworkAccessManager *networkManager() const; Settings *settings() const; Registry::DocsetRegistry *docsetRegistry(); FileManager *fileManager() const; public slots: void executeQuery(const Registry::SearchQuery &query, bool preventActivation); void extract(const QString &filePath, const QString &destination, const QString &root = QString()); QNetworkReply *download(const QUrl &url); void checkForUpdates(bool quiet = false); signals: void extractionCompleted(const QString &filePath); void extractionError(const QString &filePath, const QString &errorString); void extractionProgress(const QString &filePath, qint64 extracted, qint64 total); void updateCheckDone(const QString &version = QString()); void updateCheckError(const QString &message); private slots: void applySettings(); private: static inline QString userAgent(); QString userAgentJson() const; static Application *m_instance; Settings *m_settings = nullptr; QNetworkAccessManager *m_networkManager = nullptr; FileManager *m_fileManager = nullptr; QThread *m_extractorThread = nullptr; Extractor *m_extractor = nullptr; Registry::DocsetRegistry *m_docsetRegistry = nullptr; WidgetUi::MainWindow *m_mainWindow = nullptr; }; } // namespace Core } // namespace Zeal #endif // ZEAL_CORE_APPLICATION_H zeal-0.6.1/src/libs/core/applicationsingleton.cpp000066400000000000000000000120251335333561500220620ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "applicationsingleton.h" #include #include #include #include #include #include #include #include using namespace Zeal::Core; static Q_LOGGING_CATEGORY(log, "zeal.core.applicationsingleton") struct SharedData { qint64 primaryPid; }; ApplicationSingleton::ApplicationSingleton(QObject *parent) : QObject(parent) { if (QCoreApplication::instance() == nullptr) { qFatal("QCoreApplication (or derived type) must be created before ApplicationSingleton."); } m_id = computeId(); qCDebug(log, "Singleton ID: %s", qPrintable(m_id)); m_sharedMemory = new QSharedMemory(m_id, this); m_isPrimary = m_sharedMemory->create(sizeof(SharedData)); if (m_isPrimary) { setupPrimary(); return; } #ifdef Q_OS_UNIX // Verify it's not a segment that survived an application crash. m_sharedMemory->attach(); m_sharedMemory->detach(); m_isPrimary = m_sharedMemory->create(sizeof(SharedData)); if (m_isPrimary) { setupPrimary(); return; } #endif if (!m_sharedMemory->attach(QSharedMemory::ReadOnly)) { qCWarning(log) << "Cannot attach to the shared memory segment:" << m_sharedMemory->errorString(); return; } setupSecondary(); } bool ApplicationSingleton::isPrimary() const { return m_isPrimary; } bool ApplicationSingleton::isSecondary() const { return !m_isPrimary; } qint64 ApplicationSingleton::primaryPid() const { return m_primaryPid; } bool ApplicationSingleton::sendMessage(QByteArray &data, int timeout) { // No support for primary to secondary communication. if (m_isPrimary) { return false; } QScopedPointer socket(new QLocalSocket); socket->connectToServer(m_id); if (!socket->waitForConnected(timeout)) { qCWarning(log) << "Cannot connect to the local service:" << socket->errorString(); return false; } socket->write(data); socket->flush(); // Required for Linux. return socket->waitForBytesWritten(timeout); } void ApplicationSingleton::setupPrimary() { m_primaryPid = QCoreApplication::applicationPid(); qCInfo(log, "Starting as a primary instance. (PID: %lld)", m_primaryPid); m_sharedMemory->lock(); SharedData *sd = static_cast(m_sharedMemory->data()); sd->primaryPid = m_primaryPid; m_sharedMemory->unlock(); QLocalServer::removeServer(m_id); m_localServer = new QLocalServer(this); m_localServer->setSocketOptions(QLocalServer::UserAccessOption); connect(m_localServer, &QLocalServer::newConnection, [this] { QLocalSocket *socket = m_localServer->nextPendingConnection(); connect(socket, &QLocalSocket::readyRead, [this, socket] { QByteArray data = socket->readAll(); emit messageReceived(data); socket->deleteLater(); }); }); if (!m_localServer->listen(m_id)) { qCWarning(log) << "Cannot start the local service:" << m_localServer->errorString(); return; } } void ApplicationSingleton::setupSecondary() { m_sharedMemory->lock(); SharedData *sd = static_cast(m_sharedMemory->data()); m_primaryPid = sd->primaryPid; m_sharedMemory->unlock(); qCInfo(log, "Starting as a secondary instance. (Primary PID: %lld)", m_primaryPid); } QString ApplicationSingleton::computeId() { // Make sure the result can be used as a name for the local socket. static const QByteArray::Base64Options base64Options = QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals; QCryptographicHash hash(QCryptographicHash::Sha256); hash.addData(QCoreApplication::applicationName().toUtf8()); hash.addData(QCoreApplication::organizationName().toUtf8()); hash.addData(QCoreApplication::organizationDomain().toUtf8()); // Support multi-user setup. hash.addData(QDir::homePath().toUtf8()); return QString::fromLatin1(hash.result().toBase64(base64Options)); } zeal-0.6.1/src/libs/core/applicationsingleton.h000066400000000000000000000033541335333561500215340ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_CORE_APPLICATIONSINGLETON_H #define ZEAL_CORE_APPLICATIONSINGLETON_H #include class QLocalServer; class QSharedMemory; namespace Zeal { namespace Core { class ApplicationSingleton : public QObject { Q_OBJECT public: explicit ApplicationSingleton(QObject *parent = nullptr); bool isPrimary() const; bool isSecondary() const; qint64 primaryPid() const; bool sendMessage(QByteArray &data, int timeout = 500); signals: void messageReceived(const QByteArray &data); private: void setupPrimary(); void setupSecondary(); static QString computeId(); QString m_id; bool m_isPrimary = false; qint64 m_primaryPid = 0; QSharedMemory *m_sharedMemory = nullptr; QLocalServer *m_localServer = nullptr; }; } // namespace Core } // namespace Zeal #endif // ZEAL_CORE_APPLICATIONSINGLETON_H zeal-0.6.1/src/libs/core/extractor.cpp000066400000000000000000000101351335333561500176470ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "extractor.h" #include #include #include #include using namespace Zeal::Core; Extractor::Extractor(QObject *parent) : QObject(parent) { } void Extractor::extract(const QString &sourceFile, const QString &destination, const QString &root) { ExtractInfo info = { archive_read_new(), // archiveHandle sourceFile, // filePath QFileInfo(sourceFile).size(), // totalBytes 0 // extractedBytes }; archive_read_support_filter_all(info.archiveHandle); archive_read_support_format_all(info.archiveHandle); int r = archive_read_open_filename(info.archiveHandle, qPrintable(sourceFile), 10240); if (r) { emit error(sourceFile, QString::fromLocal8Bit(archive_error_string(info.archiveHandle))); return; } QDir destinationDir(destination); if (!root.isEmpty()) { destinationDir = destinationDir.filePath(root); } // TODO: Do not strip root directory in archive if it equals to 'root' archive_entry *entry; while (archive_read_next_header(info.archiveHandle, &entry) == ARCHIVE_OK) { #ifndef Q_OS_WIN32 QString pathname = QString::fromUtf8(archive_entry_pathname(entry)); #else // TODO: Remove once https://github.com/libarchive/libarchive/issues/587 is resolved. QString pathname = QString::fromWCharArray(archive_entry_pathname_w(entry)); #endif if (!root.isEmpty()) { pathname.remove(0, pathname.indexOf(QLatin1String("/")) + 1); } const QString filePath = destinationDir.absoluteFilePath(pathname); const auto filetype = archive_entry_filetype(entry); if (filetype == S_IFDIR) { QDir().mkpath(QFileInfo(filePath).absolutePath()); continue; } else if (filetype != S_IFREG) { qWarning("Unsupported filetype %d for %s!", filetype, qPrintable(pathname)); continue; } QScopedPointer file(new QFile(filePath)); if (!file->open(QIODevice::WriteOnly)) { qWarning("Cannot open file for writing: %s", qPrintable(pathname)); continue; } const void *buffer; size_t size; std::int64_t offset; for (;;) { int rc = archive_read_data_block(info.archiveHandle, &buffer, &size, &offset); if (rc != ARCHIVE_OK) { if (rc == ARCHIVE_EOF) { break; } qWarning("Cannot read from archive: %s", archive_error_string(info.archiveHandle)); emit error(sourceFile, QString::fromLocal8Bit(archive_error_string(info.archiveHandle))); return; } file->write(static_cast(buffer), size); } emitProgress(info); } emit completed(sourceFile); archive_read_free(info.archiveHandle); } void Extractor::emitProgress(ExtractInfo &info) { const qint64 extractedBytes = archive_filter_bytes(info.archiveHandle, -1); if (extractedBytes == info.extractedBytes) { return; } info.extractedBytes = extractedBytes; emit progress(info.filePath, extractedBytes, info.totalBytes); } zeal-0.6.1/src/libs/core/extractor.h000066400000000000000000000033601335333561500173160ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_CORE_EXTRACTOR_H #define ZEAL_CORE_EXTRACTOR_H #include struct archive; namespace Zeal { namespace Core { class Extractor : public QObject { Q_OBJECT public: explicit Extractor(QObject *parent = nullptr); public slots: void extract(const QString &sourceFile, const QString &destination, const QString &root = QString()); signals: void error(const QString &filePath, const QString &message); void completed(const QString &filePath); void progress(const QString &filePath, qint64 extracted, qint64 total); private: struct ExtractInfo { archive *archiveHandle; QString filePath; qint64 totalBytes; qint64 extractedBytes; }; void emitProgress(ExtractInfo &info); }; } // namespace Core } // namespace Zeal #endif // ZEAL_CORE_EXTRACTOR_H zeal-0.6.1/src/libs/core/filemanager.cpp000066400000000000000000000053531335333561500201140ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "filemanager.h" #include #include #include #include #include #include #include #include using namespace Zeal::Core; static Q_LOGGING_CATEGORY(log, "zeal.core.filemanager") FileManager::FileManager(QObject *parent) : QObject(parent) { // Ensure that cache location exists. // TODO: Check for errors. QDir().mkpath(cacheLocation()); } bool FileManager::removeRecursively(const QString &path) { qCDebug(log, "Removing '%s'...", qPrintable(path)); if (!QFileInfo(path).isDir()) { qCWarning(log, "'%s' is not a directory.", qPrintable(path)); return false; } const QString deletePath = QStringLiteral("%1.%2.deleteme") .arg(path, QString::number(QDateTime::currentMSecsSinceEpoch())); if (!QDir().rename(path, deletePath)) { qCWarning(log, "Failed to rename '%s' to '%s'.", qPrintable(path), qPrintable(deletePath)); return false; } else { qCDebug(log, "Renamed '%s' to '%s'.", qPrintable(path), qPrintable(deletePath)); } QFutureWatcher *watcher = new QFutureWatcher(); connect(watcher, &QFutureWatcher::finished, [=] { if (!watcher->result()) { qCWarning(log, "Failed to remove '%s'.", qPrintable(deletePath)); } else { qCDebug(log, "Removed '%s'.", qPrintable(deletePath)); } watcher->deleteLater(); }); watcher->setFuture(QtConcurrent::run([deletePath] { return QDir(deletePath).removeRecursively(); })); return true; } QString FileManager::cacheLocation() { #ifndef PORTABLE_BUILD return QStandardPaths::writableLocation(QStandardPaths::CacheLocation); #else return QCoreApplication::applicationDirPath() + QLatin1String("/cache"); #endif } zeal-0.6.1/src/libs/core/filemanager.h000066400000000000000000000024231335333561500175540ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_CORE_FILEMANAGER_H #define ZEAL_CORE_FILEMANAGER_H #include namespace Zeal { namespace Core { class FileManager : public QObject { Q_OBJECT public: explicit FileManager(QObject *parent = nullptr); bool removeRecursively(const QString &path); static QString cacheLocation(); }; } // namespace Core } // namespace Zeal #endif // ZEAL_CORE_FILEMANAGER_H zeal-0.6.1/src/libs/core/networkaccessmanager.cpp000066400000000000000000000036641335333561500220530ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "networkaccessmanager.h" #include using namespace Zeal::Core; NetworkAccessManager::NetworkAccessManager(QObject *parent) : QNetworkAccessManager(parent) { } QNetworkReply *NetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) { static const QStringList localSchemes = {QStringLiteral("file"), QStringLiteral("qrc")}; const QUrl url = request.url(); // Forward all non-local schemaless URLs via HTTPS. if (localSchemes.contains(url.scheme()) && !url.host().isEmpty()) { QUrl overrideUrl(url); overrideUrl.setScheme(QStringLiteral("https")); QNetworkRequest overrideRequest(request); overrideRequest.setUrl(overrideUrl); return QNetworkAccessManager::createRequest(GetOperation, overrideRequest, outgoingData); } return QNetworkAccessManager::createRequest(op, request, outgoingData); } zeal-0.6.1/src/libs/core/networkaccessmanager.h000066400000000000000000000026451335333561500215160ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_CORE_NETWORKACCESSMANAGER_H #define ZEAL_CORE_NETWORKACCESSMANAGER_H #include namespace Zeal { namespace Core { class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: NetworkAccessManager(QObject *parent = nullptr); protected: QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = nullptr) override; }; } // namespace Core } // namespace Zeal #endif // ZEAL_CORE_NETWORKACCESSMANAGER_H zeal-0.6.1/src/libs/core/settings.cpp000066400000000000000000000326751335333561500175110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "settings.h" #include "filemanager.h" #include #include #include #include #include #include #include namespace { // Configuration file groups const char GroupContent[] = "content"; const char GroupDocsets[] = "docsets"; const char GroupGlobalShortcuts[] = "global_shortcuts"; const char GroupSearch[] = "search"; const char GroupTabs[] = "tabs"; const char GroupInternal[] = "internal"; const char GroupState[] = "state"; const char GroupProxy[] = "proxy"; } using namespace Zeal::Core; Settings::Settings(QObject *parent) : QObject(parent) { qRegisterMetaTypeStreamOperators("ExternalLinkPolicy"); // Enable local storage due to https://github.com/zealdocs/zeal/issues/872. QWebSettings *webSettings = QWebSettings::globalSettings(); webSettings->setLocalStoragePath(FileManager::cacheLocation() + QLatin1String("/localStorage")); webSettings->setAttribute(QWebSettings::LocalStorageEnabled, true); load(); } Settings::~Settings() { save(); } void Settings::load() { QScopedPointer settings(qsettings()); migrate(settings.data()); // TODO: Put everything in groups startMinimized = settings->value(QStringLiteral("start_minimized"), false).toBool(); checkForUpdate = settings->value(QStringLiteral("check_for_update"), true).toBool(); showSystrayIcon = settings->value(QStringLiteral("show_systray_icon"), true).toBool(); minimizeToSystray = settings->value(QStringLiteral("minimize_to_systray"), false).toBool(); hideOnClose = settings->value(QStringLiteral("hide_on_close"), false).toBool(); settings->beginGroup(GroupGlobalShortcuts); showShortcut = settings->value(QStringLiteral("show")).value(); settings->endGroup(); settings->beginGroup(GroupTabs); openNewTabAfterActive = settings->value(QStringLiteral("open_new_tab_after_active"), false).toBool(); settings->endGroup(); settings->beginGroup(GroupSearch); fuzzySearchEnabled = settings->value(QStringLiteral("fuzzy_search_enabled"), false).toBool(); settings->endGroup(); settings->beginGroup(GroupContent); // Fonts QWebSettings *webSettings = QWebSettings::globalSettings(); serifFontFamily = settings->value(QStringLiteral("serif_font_family"), webSettings->fontFamily(QWebSettings::SerifFont)).toString(); sansSerifFontFamily = settings->value(QStringLiteral("sans_serif_font_family"), webSettings->fontFamily(QWebSettings::SansSerifFont)).toString(); fixedFontFamily = settings->value(QStringLiteral("fixed_font_family"), webSettings->fontFamily(QWebSettings::FixedFont)).toString(); static const QMap fontFamilies = { {QStringLiteral("sans-serif"), QWebSettings::SansSerifFont}, {QStringLiteral("serif"), QWebSettings::SerifFont}, {QStringLiteral("monospace"), QWebSettings::FixedFont} }; defaultFontFamily = settings->value(QStringLiteral("default_font_family"), QStringLiteral("serif")).toString(); // Fallback to the serif font family. if (!fontFamilies.contains(defaultFontFamily)) { defaultFontFamily = QStringLiteral("serif"); } webSettings->setFontFamily(QWebSettings::SansSerifFont, sansSerifFontFamily); webSettings->setFontFamily(QWebSettings::SerifFont, serifFontFamily); webSettings->setFontFamily(QWebSettings::FixedFont, fixedFontFamily); const QString defaultFontFamilyResolved = webSettings->fontFamily(fontFamilies.value(defaultFontFamily)); webSettings->setFontFamily(QWebSettings::StandardFont, defaultFontFamilyResolved); defaultFontSize = settings->value(QStringLiteral("default_font_size"), webSettings->fontSize(QWebSettings::DefaultFontSize)).toInt(); defaultFixedFontSize = settings->value(QStringLiteral("default_fixed_font_size"), webSettings->fontSize(QWebSettings::DefaultFixedFontSize)).toInt(); minimumFontSize = settings->value(QStringLiteral("minimum_font_size"), webSettings->fontSize(QWebSettings::MinimumFontSize)).toInt(); webSettings->setFontSize(QWebSettings::DefaultFontSize, defaultFontSize); webSettings->setFontSize(QWebSettings::DefaultFixedFontSize, defaultFixedFontSize); webSettings->setFontSize(QWebSettings::MinimumFontSize, minimumFontSize); darkModeEnabled = settings->value(QStringLiteral("dark_mode"), false).toBool(); highlightOnNavigateEnabled = settings->value(QStringLiteral("highlight_on_navigate"), true).toBool(); customCssFile = settings->value(QStringLiteral("custom_css_file")).toString(); externalLinkPolicy = settings->value(QStringLiteral("external_link_policy"), QVariant::fromValue(ExternalLinkPolicy::Ask)).value(); isSmoothScrollingEnabled = settings->value(QStringLiteral("smooth_scrolling"), false).toBool(); isAdDisabled = settings->value(QStringLiteral("disable_ad"), false).toBool(); settings->endGroup(); settings->beginGroup(GroupProxy); proxyType = static_cast(settings->value(QStringLiteral("type"), ProxyType::System).toUInt()); proxyHost = settings->value(QStringLiteral("host")).toString(); proxyPort = static_cast(settings->value(QStringLiteral("port"), 0).toUInt()); proxyAuthenticate = settings->value(QStringLiteral("authenticate"), false).toBool(); proxyUserName = settings->value(QStringLiteral("username")).toString(); proxyPassword = settings->value(QStringLiteral("password")).toString(); settings->endGroup(); settings->beginGroup(GroupDocsets); if (settings->contains(QStringLiteral("path"))) { docsetPath = settings->value(QStringLiteral("path")).toString(); } else { #ifndef PORTABLE_BUILD docsetPath = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + QLatin1String("/docsets"); #else docsetPath = QCoreApplication::applicationDirPath() + QLatin1String("/docsets"); #endif QDir().mkpath(docsetPath); } settings->endGroup(); settings->beginGroup(GroupState); windowGeometry = settings->value(QStringLiteral("window_geometry")).toByteArray(); verticalSplitterGeometry = settings->value(QStringLiteral("splitter_geometry")).toByteArray(); tocSplitterState = settings->value(QStringLiteral("toc_splitter_state")).toByteArray(); settings->endGroup(); settings->beginGroup(GroupInternal); installId = settings->value(QStringLiteral("install_id"), // Avoid curly braces (QTBUG-885) QUuid::createUuid().toString().mid(1, 36)).toString(); settings->endGroup(); } void Settings::save() { QScopedPointer settings(qsettings()); // TODO: Put everything in groups settings->setValue(QStringLiteral("start_minimized"), startMinimized); settings->setValue(QStringLiteral("check_for_update"), checkForUpdate); settings->setValue(QStringLiteral("show_systray_icon"), showSystrayIcon); settings->setValue(QStringLiteral("minimize_to_systray"), minimizeToSystray); settings->setValue(QStringLiteral("hide_on_close"), hideOnClose); settings->beginGroup(GroupGlobalShortcuts); settings->setValue(QStringLiteral("show"), showShortcut); settings->endGroup(); settings->beginGroup(GroupTabs); settings->setValue(QStringLiteral("open_new_tab_after_active"), openNewTabAfterActive); settings->endGroup(); settings->beginGroup(GroupSearch); settings->setValue(QStringLiteral("fuzzy_search_enabled"), fuzzySearchEnabled); settings->endGroup(); settings->beginGroup(GroupContent); settings->setValue(QStringLiteral("default_font_family"), defaultFontFamily); settings->setValue(QStringLiteral("serif_font_family"), serifFontFamily); settings->setValue(QStringLiteral("sans_serif_font_family"), sansSerifFontFamily); settings->setValue(QStringLiteral("fixed_font_family"), fixedFontFamily); settings->setValue(QStringLiteral("default_font_size"), defaultFontSize); settings->setValue(QStringLiteral("default_fixed_font_size"), defaultFixedFontSize); settings->setValue(QStringLiteral("minimum_font_size"), minimumFontSize); settings->setValue(QStringLiteral("dark_mode"), darkModeEnabled); settings->setValue(QStringLiteral("highlight_on_navigate"), highlightOnNavigateEnabled); settings->setValue(QStringLiteral("custom_css_file"), customCssFile); settings->setValue(QStringLiteral("external_link_policy"), QVariant::fromValue(externalLinkPolicy)); settings->setValue(QStringLiteral("smooth_scrolling"), isSmoothScrollingEnabled); settings->setValue(QStringLiteral("disable_ad"), isAdDisabled); settings->endGroup(); settings->beginGroup(GroupProxy); settings->setValue(QStringLiteral("type"), proxyType); settings->setValue(QStringLiteral("host"), proxyHost); settings->setValue(QStringLiteral("port"), proxyPort); settings->setValue(QStringLiteral("authenticate"), proxyAuthenticate); settings->setValue(QStringLiteral("username"), proxyUserName); settings->setValue(QStringLiteral("password"), proxyPassword); settings->endGroup(); settings->beginGroup(GroupDocsets); settings->setValue(QStringLiteral("path"), docsetPath); settings->endGroup(); settings->beginGroup(GroupState); settings->setValue(QStringLiteral("window_geometry"), windowGeometry); settings->setValue(QStringLiteral("splitter_geometry"), verticalSplitterGeometry); settings->setValue(QStringLiteral("toc_splitter_state"), tocSplitterState); settings->endGroup(); settings->beginGroup(GroupInternal); settings->setValue(QStringLiteral("install_id"), installId); // Version of configuration file format, should match Zeal version. Used for migration rules. settings->setValue(QStringLiteral("version"), QCoreApplication::applicationVersion()); settings->endGroup(); settings->sync(); emit updated(); } /*! * \internal * \brief Migrates settings from older application versions. * \param settings QSettings object to update. * * The settings migration process relies on 'internal/version' option, that was introduced in the * release 0.2.0, so a missing option indicates pre-0.2 release. */ void Settings::migrate(QSettings *settings) const { settings->beginGroup(GroupInternal); // TODO: [Qt 5.6] Use QVersionNumber. const QString version = settings->value(QStringLiteral("version")).toString(); settings->endGroup(); // // Pre 0.4 // // Rename 'browser' group into 'content'. if (version < QLatin1String("0.4")) { settings->beginGroup(QStringLiteral("browser")); const QVariant tmpMinimumFontSize = settings->value(QStringLiteral("minimum_font_size")); settings->endGroup(); settings->remove(QStringLiteral("browser")); if (tmpMinimumFontSize.isValid()) { settings->beginGroup(GroupContent); settings->setValue(QStringLiteral("minimum_font_size"), tmpMinimumFontSize); settings->endGroup(); } } // // Pre 0.3 // // Unset 'state/splitter_geometry', because custom styles were removed. if (version < QLatin1String("0.3")) { settings->beginGroup(GroupState); settings->remove(QStringLiteral("splitter_geometry")); settings->endGroup(); } } /*! * \internal * \brief Returns an initialized QSettings object. * \param parent Optional parent object. * \return QSettings object. * * QSettings is initialized according to build options, e.g. standard vs portable. * Caller is responsible for deleting the returned object. */ QSettings *Settings::qsettings(QObject *parent) { #ifndef PORTABLE_BUILD return new QSettings(parent); #else return new QSettings(QCoreApplication::applicationDirPath() + QLatin1String("/zeal.ini"), QSettings::IniFormat, parent); #endif } QDataStream &operator<<(QDataStream &out, const Settings::ExternalLinkPolicy &policy) { out << static_cast::type>(policy); return out; } QDataStream &operator>>(QDataStream &in, Settings::ExternalLinkPolicy &policy) { std::underlying_type::type value; in >> value; policy = static_cast(value); return in; } zeal-0.6.1/src/libs/core/settings.h000066400000000000000000000070271335333561500171470ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_CORE_SETTINGS_H #define ZEAL_CORE_SETTINGS_H #include #include class QSettings; namespace Zeal { namespace Core { class Settings : public QObject { Q_OBJECT public: /* This public members are here just for simplification and should go away * once a more advanced settings management come in place. */ // Startup bool startMinimized; bool checkForUpdate; // TODO: bool restoreLastState; // System Tray bool showSystrayIcon; bool minimizeToSystray; bool hideOnClose; // Global Shortcuts QKeySequence showShortcut; // TODO: QKeySequence searchSelectedTextShortcut; // Tabs Behavior bool openNewTabAfterActive; // Search bool fuzzySearchEnabled; // Content QString defaultFontFamily; QString serifFontFamily; QString sansSerifFontFamily; QString fixedFontFamily; int defaultFontSize; int defaultFixedFontSize; int minimumFontSize; enum class ExternalLinkPolicy : unsigned int { Ask = 0, Open, OpenInSystemBrowser }; Q_ENUM(ExternalLinkPolicy) ExternalLinkPolicy externalLinkPolicy = ExternalLinkPolicy::Ask; bool darkModeEnabled; bool highlightOnNavigateEnabled; QString customCssFile; bool isSmoothScrollingEnabled; bool isAdDisabled; // Network enum ProxyType : unsigned int { None, System, UserDefined }; Q_ENUM(ProxyType) // Internal // -------- // InstallId is a UUID used to indentify a Zeal installation. Created on first start or after // a settings wipe. It is not attached to user hardware or software, and is sent exclusevely // to *.zealdocs.org hosts. QString installId; ProxyType proxyType = ProxyType::System; QString proxyHost; quint16 proxyPort; bool proxyAuthenticate; QString proxyUserName; QString proxyPassword; // Other QString docsetPath; // State QByteArray windowGeometry; QByteArray verticalSplitterGeometry; QByteArray tocSplitterState; explicit Settings(QObject *parent = nullptr); ~Settings() override; public slots: void load(); void save(); signals: void updated(); private: void migrate(QSettings *settings) const; static QSettings *qsettings(QObject *parent = nullptr); }; } // namespace Core } // namespace Zeal QDataStream &operator<<(QDataStream &out, const Zeal::Core::Settings::ExternalLinkPolicy &policy); QDataStream &operator>>(QDataStream &in, Zeal::Core::Settings::ExternalLinkPolicy &policy); Q_DECLARE_METATYPE(Zeal::Core::Settings::ExternalLinkPolicy) #endif // ZEAL_CORE_SETTINGS_H zeal-0.6.1/src/libs/registry/000077500000000000000000000000001335333561500160505ustar00rootroot00000000000000zeal-0.6.1/src/libs/registry/CMakeLists.txt000066400000000000000000000005431335333561500206120ustar00rootroot00000000000000add_library(Registry cancellationtoken.h docset.cpp docsetmetadata.cpp docsetregistry.cpp listmodel.cpp searchmodel.cpp searchquery.cpp searchresult.h # Only for Qt Creator to see it. ) find_package(Qt5 COMPONENTS Concurrent Gui Network REQUIRED) target_link_libraries(Registry Util Qt5::Concurrent Qt5::Gui Qt5::Network) zeal-0.6.1/src/libs/registry/cancellationtoken.h000066400000000000000000000026561335333561500217270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 Artur Spychaj ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef CANCELLATIONTOKEN_H #define CANCELLATIONTOKEN_H #include namespace Zeal { namespace Registry { /// Token that stores whether cancel was called on it. /// In async code can be used to check if another thread called cancel. class CancellationToken { public: inline bool isCanceled() const { return m_canceled; } inline void cancel() { m_canceled = true; } inline void reset() { m_canceled = false; } private: std::atomic_bool m_canceled; }; } // namespace Registry } // namespace Zeal #endif // CANCELLATIONTOKEN_H zeal-0.6.1/src/libs/registry/docset.cpp000066400000000000000000001023271335333561500200420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "docset.h" #include "cancellationtoken.h" #include "searchresult.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace Zeal::Registry; namespace { const char IndexNamePrefix[] = "__zi_name"; // zi - Zeal index const char IndexNameVersion[] = "0001"; // Current index version namespace InfoPlist { const char CFBundleName[] = "CFBundleName"; //const char CFBundleIdentifier[] = "CFBundleIdentifier"; const char DashDocSetFamily[] = "DashDocSetFamily"; const char DashDocSetKeyword[] = "DashDocSetKeyword"; const char DashDocSetPluginKeyword[] = "DashDocSetPluginKeyword"; const char DashIndexFilePath[] = "dashIndexFilePath"; const char DocSetPlatformFamily[] = "DocSetPlatformFamily"; //const char IsDashDocset[] = "isDashDocset"; //const char IsJavaScriptEnabled[] = "isJavaScriptEnabled"; } } static void sqliteScoreFunction(sqlite3_context *context, int argc, sqlite3_value **argv); Docset::Docset(const QString &path) : m_path(path) { QDir dir(m_path); if (!dir.exists()) return; loadMetadata(); // Attempt to find the icon in any supported format for (const QString &iconFile : dir.entryList({QStringLiteral("icon.*")}, QDir::Files)) { m_icon = QIcon(dir.filePath(iconFile)); if (!m_icon.availableSizes().isEmpty()) break; } // TODO: Report errors here and below if (!dir.cd(QStringLiteral("Contents"))) return; // TODO: 'info.plist' is invalid according to Apple, and must alsways be 'Info.plist' // https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPRuntimeConfig // /Articles/ConfigFiles.html Util::Plist plist; if (dir.exists(QStringLiteral("Info.plist"))) plist.read(dir.filePath(QStringLiteral("Info.plist"))); else if (dir.exists(QStringLiteral("info.plist"))) plist.read(dir.filePath(QStringLiteral("info.plist"))); else return; if (plist.hasError()) return; if (m_name.isEmpty()) { // Fallback if meta.json is absent if (plist.contains(InfoPlist::CFBundleName)) { m_name = m_title = plist[InfoPlist::CFBundleName].toString(); // TODO: Remove when MainWindow::docsetName() will not use directory name m_name.replace(QLatin1Char(' '), QLatin1Char('_')); } else { m_name = QFileInfo(m_path).fileName().remove(QStringLiteral(".docset")); } } if (m_title.isEmpty()) { m_title = m_name; m_title.replace(QLatin1Char('_'), QLatin1Char(' ')); } // TODO: Verify if this is needed if (plist.contains(InfoPlist::DashDocSetFamily) && plist[InfoPlist::DashDocSetFamily].toString() == QLatin1String("cheatsheet")) { m_name = m_name + QLatin1String("cheats"); } if (!dir.cd(QStringLiteral("Resources")) || !dir.exists(QStringLiteral("docSet.dsidx"))) return; m_db = new Util::SQLiteDatabase(dir.filePath(QStringLiteral("docSet.dsidx"))); if (!m_db->isOpen()) { qWarning("SQL Error: %s", qPrintable(m_db->lastError())); return; } sqlite3_create_function(m_db->handle(), "zealScore", 2, SQLITE_UTF8, nullptr, sqliteScoreFunction, nullptr, nullptr); m_type = m_db->tables().contains(QStringLiteral("searchIndex"), Qt::CaseInsensitive) ? Type::Dash : Type::ZDash; createIndex(); if (m_type == Docset::Type::ZDash) { createView(); } if (!dir.cd(QStringLiteral("Documents"))) { m_type = Type::Invalid; return; } // Setup keywords if (plist.contains(InfoPlist::DocSetPlatformFamily)) m_keywords << plist[InfoPlist::DocSetPlatformFamily].toString(); if (plist.contains(InfoPlist::DashDocSetPluginKeyword)) m_keywords << plist[InfoPlist::DashDocSetPluginKeyword].toString(); if (plist.contains(InfoPlist::DashDocSetKeyword)) m_keywords << plist[InfoPlist::DashDocSetKeyword].toString(); if (plist.contains(InfoPlist::DashDocSetFamily)) { const QString kw = plist[InfoPlist::DashDocSetFamily].toString(); if (!kw.contains(QLatin1String("dashtoc"))) { m_keywords << kw; } } m_keywords.removeDuplicates(); // Prefer index path provided by the docset over metadata. if (plist.contains(InfoPlist::DashIndexFilePath)) { m_indexFileUrl = createPageUrl(plist[InfoPlist::DashIndexFilePath].toString()); } else if (m_indexFileUrl.isEmpty()) { if (dir.exists(QStringLiteral("index.html"))) m_indexFileUrl = createPageUrl(QStringLiteral("index.html")); else qWarning("Cannot determine index file for docset %s", qPrintable(m_name)); } countSymbols(); } Docset::~Docset() { delete m_db; } bool Docset::isValid() const { return m_type != Type::Invalid; } QString Docset::name() const { return m_name; } QString Docset::title() const { return m_title; } QStringList Docset::keywords() const { return m_keywords; } QString Docset::version() const { return m_version; } QString Docset::revision() const { return m_revision; } QString Docset::feedUrl() const { return m_feedUrl; } QString Docset::path() const { return m_path; } QString Docset::documentPath() const { return QDir(m_path).filePath(QStringLiteral("Contents/Resources/Documents")); } QIcon Docset::icon() const { return m_icon; } QIcon Docset::symbolTypeIcon(const QString &symbolType) const { static const QIcon unknownIcon(QStringLiteral("typeIcon:Unknown.png")); const QIcon icon(QStringLiteral("typeIcon:%1.png").arg(symbolType)); return icon.availableSizes().isEmpty() ? unknownIcon : icon; } QUrl Docset::indexFileUrl() const { return m_indexFileUrl; } QMap Docset::symbolCounts() const { return m_symbolCounts; } int Docset::symbolCount(const QString &symbolType) const { return m_symbolCounts.value(symbolType); } const QMap &Docset::symbols(const QString &symbolType) const { if (!m_symbols.contains(symbolType)) loadSymbols(symbolType); return m_symbols[symbolType]; } QList Docset::search(const QString &query, const CancellationToken &token) const { QString sql; if (m_type == Docset::Type::Dash) { if (m_fuzzySearchEnabled) { sql = QStringLiteral("SELECT name, type, path, '', zealScore('%1', name) as score" " FROM searchIndex" " WHERE score > 0"); } else { sql = QStringLiteral("SELECT name, type, path, '', -length(name) as score" " FROM searchIndex" " WHERE (name LIKE '%%1%' ESCAPE '\\')"); } } else { if (m_fuzzySearchEnabled) { sql = QStringLiteral("SELECT name, type, path, fragment, zealScore('%1', name) as score" " FROM searchIndex" " WHERE score > 0"); } else { sql = QStringLiteral("SELECT name, type, path, fragment, -length(name) as score" " FROM searchIndex" " WHERE (name LIKE '%%1%' ESCAPE '\\')"); } } // Limit for very short queries. // TODO: Show a notification about the reduced result set. if (query.size() < 3) { sql += QLatin1String(" LIMIT 1000"); } // Make it safe to use in a SQL query. QString sanitizedQuery = query; sanitizedQuery.replace(QLatin1Char('\''), QLatin1String("''")); m_db->prepare(sql.arg(sanitizedQuery)); QList results; while (m_db->next() && !token.isCanceled()) { results.append({m_db->value(0).toString(), parseSymbolType(m_db->value(1).toString()), m_db->value(2).toString(), m_db->value(3).toString(), const_cast(this), m_db->value(4).toInt()}); } return results; } QList Docset::relatedLinks(const QUrl &url) const { QList results; // Strip docset path and anchor from url const QString dir = documentPath(); QString urlPath = url.path(); int dirPosition = urlPath.indexOf(dir); QString path = url.path().mid(dirPosition + dir.size() + 1); // Get the url without the #anchor. QUrl cleanUrl(path); cleanUrl.setFragment(QString()); // Prepare the query to look up all pages with the same url. QString sql; if (m_type == Docset::Type::Dash) { sql = QStringLiteral("SELECT name, type, path" " FROM searchIndex" " WHERE path LIKE \"%1%%\" AND path <> \"%1\""); } else if (m_type == Docset::Type::ZDash) { sql = QStringLiteral("SELECT name, type, path, fragment" " FROM searchIndex" " WHERE path = \"%1\" AND fragment IS NOT NULL"); } m_db->prepare(sql.arg(cleanUrl.toString())); while (m_db->next()) { results.append({m_db->value(0).toString(), parseSymbolType(m_db->value(1).toString()), m_db->value(2).toString(), m_db->value(3).toString(), const_cast(this), 0}); } if (results.size() == 1) results.clear(); return results; } QUrl Docset::searchResultUrl(const SearchResult &result) const { return createPageUrl(result.urlPath, result.urlFragment); } void Docset::loadMetadata() { const QDir dir(m_path); // Fallback if meta.json is absent if (!dir.exists(QStringLiteral("meta.json"))) return; QScopedPointer file(new QFile(dir.filePath(QStringLiteral("meta.json")))); if (!file->open(QIODevice::ReadOnly)) return; QJsonParseError jsonError; const QJsonObject jsonObject = QJsonDocument::fromJson(file->readAll(), &jsonError).object(); if (jsonError.error != QJsonParseError::NoError) return; m_name = jsonObject[QStringLiteral("name")].toString(); m_title = jsonObject[QStringLiteral("title")].toString(); m_version = jsonObject[QStringLiteral("version")].toString(); m_revision = jsonObject[QStringLiteral("revision")].toString(); if (jsonObject.contains(QStringLiteral("feed_url"))) { m_feedUrl = jsonObject[QStringLiteral("feed_url")].toString(); } if (jsonObject.contains(QStringLiteral("extra"))) { const QJsonObject extra = jsonObject[QStringLiteral("extra")].toObject(); if (extra.contains(QStringLiteral("indexFilePath"))) { m_indexFileUrl = createPageUrl(extra[QStringLiteral("indexFilePath")].toString()); } if (extra.contains(QStringLiteral("keywords"))) { for (const QJsonValueRef kw : extra[QStringLiteral("keywords")].toArray()) m_keywords << kw.toString(); } } } void Docset::countSymbols() { static const QString sql = QStringLiteral("SELECT type, COUNT(*)" " FROM searchIndex" " GROUP BY type"); if (!m_db->prepare(sql)) { qWarning("SQL Error: %s", qPrintable(m_db->lastError())); return; } while (m_db->next()) { const QString symbolTypeStr = m_db->value(0).toString(); // A workaround for https://github.com/zealdocs/zeal/issues/980. if (symbolTypeStr.isEmpty()) { qWarning("Empty symbol type in the '%s' docset, skipping...", qPrintable(m_name)); continue; } const QString symbolType = parseSymbolType(symbolTypeStr); m_symbolStrings.insertMulti(symbolType, symbolTypeStr); m_symbolCounts[symbolType] += m_db->value(1).toInt(); } } // TODO: Fetch and cache only portions of symbols void Docset::loadSymbols(const QString &symbolType) const { for (const QString &symbol : m_symbolStrings.values(symbolType)) loadSymbols(symbolType, symbol); } void Docset::loadSymbols(const QString &symbolType, const QString &symbolString) const { QString sql; if (m_type == Docset::Type::Dash) { sql = QStringLiteral("SELECT name, path" " FROM searchIndex" " WHERE type='%1'" " ORDER BY name"); } else { sql = QStringLiteral("SELECT name, path, fragment" " FROM searchIndex" " WHERE type='%1'" " ORDER BY name"); } if (!m_db->prepare(sql.arg(symbolString))) { qWarning("SQL Error: %s", qPrintable(m_db->lastError())); return; } QMap &symbols = m_symbols[symbolType]; while (m_db->next()) symbols.insertMulti(m_db->value(0).toString(), createPageUrl(m_db->value(1).toString(), m_db->value(2).toString())); } void Docset::createIndex() { static const QString indexListQuery = QStringLiteral("PRAGMA INDEX_LIST('%1')"); static const QString indexDropQuery = QStringLiteral("DROP INDEX '%1'"); static const QString indexCreateQuery = QStringLiteral("CREATE INDEX IF NOT EXISTS %1%2" " ON %3 (%4 COLLATE NOCASE)"); const QString tableName = m_type == Type::Dash ? QStringLiteral("searchIndex") : QStringLiteral("ztoken"); const QString columnName = m_type == Type::Dash ? QStringLiteral("name") : QStringLiteral("ztokenname"); m_db->prepare(indexListQuery.arg(tableName)); QStringList oldIndexes; while (m_db->next()) { const QString indexName = m_db->value(1).toString(); if (!indexName.startsWith(IndexNamePrefix)) continue; if (indexName.endsWith(IndexNameVersion)) return; oldIndexes << indexName; } // Drop old indexes for (const QString &oldIndexName : oldIndexes) m_db->execute(indexDropQuery.arg(oldIndexName)); m_db->execute(indexCreateQuery.arg(IndexNamePrefix, IndexNameVersion, tableName, columnName)); } void Docset::createView() { static const QString viewCreateQuery = QStringLiteral("CREATE VIEW IF NOT EXISTS searchIndex AS" " SELECT" " ztokenname AS name," " ztypename AS type," " zpath AS path," " zanchor AS fragment" " FROM ztoken" " INNER JOIN ztokenmetainformation" " ON ztoken.zmetainformation = ztokenmetainformation.z_pk" " INNER JOIN zfilepath" " ON ztokenmetainformation.zfile = zfilepath.z_pk" " INNER JOIN ztokentype" " ON ztoken.ztokentype = ztokentype.z_pk"); m_db->execute(viewCreateQuery); } QUrl Docset::createPageUrl(const QString &path, const QString &fragment) const { QString realPath; QString realFragment; if (fragment.isEmpty()) { const QStringList urlParts = path.split(QLatin1Char('#')); realPath = urlParts[0]; if (urlParts.size() > 1) realFragment = urlParts[1]; } else { realPath = path; realFragment = fragment; } static const QRegularExpression dashEntryRegExp(QLatin1String("")); realPath.remove(dashEntryRegExp); realFragment.remove(dashEntryRegExp); // Absolute file path is required here to handle relative path to the docset storage (see #806). QUrl url = QUrl::fromLocalFile(QDir(documentPath()).absoluteFilePath(realPath)); if (!realFragment.isEmpty()) { if (realFragment.startsWith(QLatin1String("//apple_ref")) || realFragment.startsWith(QLatin1String("//dash_ref"))) { url.setFragment(realFragment, QUrl::DecodedMode); } else { url.setFragment(realFragment); } } return url; } QString Docset::parseSymbolType(const QString &str) { // Dash symbol aliases const static QHash aliases = { // Attribute {QStringLiteral("Package Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Private Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Protected Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Public Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Static Package Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Static Private Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Static Protected Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("Static Public Attributes"), QStringLiteral("Attribute")}, {QStringLiteral("XML Attributes"), QStringLiteral("Attribute")}, // Binding {QStringLiteral("binding"), QStringLiteral("Binding")}, // Category {QStringLiteral("cat"), QStringLiteral("Category")}, {QStringLiteral("Groups"), QStringLiteral("Category")}, {QStringLiteral("Pages"), QStringLiteral("Category")}, // Class {QStringLiteral("cl"), QStringLiteral("Class")}, {QStringLiteral("specialization"), QStringLiteral("Class")}, {QStringLiteral("tmplt"), QStringLiteral("Class")}, // Constant {QStringLiteral("data"), QStringLiteral("Constant")}, {QStringLiteral("econst"), QStringLiteral("Constant")}, {QStringLiteral("enumdata"), QStringLiteral("Constant")}, {QStringLiteral("enumelt"), QStringLiteral("Constant")}, {QStringLiteral("clconst"), QStringLiteral("Constant")}, {QStringLiteral("structdata"), QStringLiteral("Constant")}, {QStringLiteral("writerid"), QStringLiteral("Constant")}, {QStringLiteral("Notifications"), QStringLiteral("Constant")}, // Constructor {QStringLiteral("structctr"), QStringLiteral("Constructor")}, {QStringLiteral("Public Constructors"), QStringLiteral("Constructor")}, // Enumeration {QStringLiteral("enum"), QStringLiteral("Enumeration")}, {QStringLiteral("Enum"), QStringLiteral("Enumeration")}, {QStringLiteral("Enumerations"), QStringLiteral("Enumeration")}, // Event {QStringLiteral("event"), QStringLiteral("Event")}, {QStringLiteral("Public Events"), QStringLiteral("Event")}, {QStringLiteral("Inherited Events"), QStringLiteral("Event")}, {QStringLiteral("Private Events"), QStringLiteral("Event")}, // Field {QStringLiteral("Data Fields"), QStringLiteral("Field")}, // Function {QStringLiteral("dcop"), QStringLiteral("Function")}, {QStringLiteral("func"), QStringLiteral("Function")}, {QStringLiteral("ffunc"), QStringLiteral("Function")}, {QStringLiteral("signal"), QStringLiteral("Function")}, {QStringLiteral("slot"), QStringLiteral("Function")}, {QStringLiteral("grammar"), QStringLiteral("Function")}, {QStringLiteral("Function Prototypes"), QStringLiteral("Function")}, {QStringLiteral("Functions/Subroutines"), QStringLiteral("Function")}, {QStringLiteral("Members"), QStringLiteral("Function")}, {QStringLiteral("Package Functions"), QStringLiteral("Function")}, {QStringLiteral("Private Member Functions"), QStringLiteral("Function")}, {QStringLiteral("Private Slots"), QStringLiteral("Function")}, {QStringLiteral("Protected Member Functions"), QStringLiteral("Function")}, {QStringLiteral("Protected Slots"), QStringLiteral("Function")}, {QStringLiteral("Public Member Functions"), QStringLiteral("Function")}, {QStringLiteral("Public Slots"), QStringLiteral("Function")}, {QStringLiteral("Signals"), QStringLiteral("Function")}, {QStringLiteral("Static Package Functions"), QStringLiteral("Function")}, {QStringLiteral("Static Private Member Functions"), QStringLiteral("Function")}, {QStringLiteral("Static Protected Member Functions"), QStringLiteral("Function")}, {QStringLiteral("Static Public Member Functions"), QStringLiteral("Function")}, // Guide {QStringLiteral("doc"), QStringLiteral("Guide")}, // Namespace {QStringLiteral("ns"), QStringLiteral("Namespace")}, // Macro {QStringLiteral("macro"), QStringLiteral("Macro")}, // Method {QStringLiteral("clm"), QStringLiteral("Method")}, {QStringLiteral("enumcm"), QStringLiteral("Method")}, {QStringLiteral("enumctr"), QStringLiteral("Method")}, {QStringLiteral("enumm"), QStringLiteral("Method")}, {QStringLiteral("intfctr"), QStringLiteral("Method")}, {QStringLiteral("intfcm"), QStringLiteral("Method")}, {QStringLiteral("intfm"), QStringLiteral("Method")}, {QStringLiteral("intfsub"), QStringLiteral("Method")}, {QStringLiteral("instsub"), QStringLiteral("Method")}, {QStringLiteral("instctr"), QStringLiteral("Method")}, {QStringLiteral("instm"), QStringLiteral("Method")}, {QStringLiteral("structcm"), QStringLiteral("Method")}, {QStringLiteral("structm"), QStringLiteral("Method")}, {QStringLiteral("structsub"), QStringLiteral("Method")}, {QStringLiteral("Class Methods"), QStringLiteral("Method")}, {QStringLiteral("Inherited Methods"), QStringLiteral("Method")}, {QStringLiteral("Instance Methods"), QStringLiteral("Method")}, {QStringLiteral("Private Methods"), QStringLiteral("Method")}, {QStringLiteral("Protected Methods"), QStringLiteral("Method")}, {QStringLiteral("Public Methods"), QStringLiteral("Method")}, // Operator {QStringLiteral("intfopfunc"), QStringLiteral("Operator")}, {QStringLiteral("opfunc"), QStringLiteral("Operator")}, // Property {QStringLiteral("enump"), QStringLiteral("Property")}, {QStringLiteral("intfdata"), QStringLiteral("Property")}, {QStringLiteral("intfp"), QStringLiteral("Property")}, {QStringLiteral("instp"), QStringLiteral("Property")}, {QStringLiteral("structp"), QStringLiteral("Property")}, {QStringLiteral("Inherited Properties"), QStringLiteral("Property")}, {QStringLiteral("Private Properties"), QStringLiteral("Property")}, {QStringLiteral("Protected Properties"), QStringLiteral("Property")}, {QStringLiteral("Public Properties"), QStringLiteral("Property")}, // Protocol {QStringLiteral("intf"), QStringLiteral("Protocol")}, // Structure {QStringLiteral("struct"), QStringLiteral("Structure")}, {QStringLiteral("Data Structures"), QStringLiteral("Structure")}, {QStringLiteral("Struct"), QStringLiteral("Structure")}, // Type {QStringLiteral("tag"), QStringLiteral("Type")}, {QStringLiteral("tdef"), QStringLiteral("Type")}, {QStringLiteral("Data Types"), QStringLiteral("Type")}, {QStringLiteral("Package Types"), QStringLiteral("Type")}, {QStringLiteral("Private Types"), QStringLiteral("Type")}, {QStringLiteral("Protected Types"), QStringLiteral("Type")}, {QStringLiteral("Public Types"), QStringLiteral("Type")}, {QStringLiteral("Typedefs"), QStringLiteral("Type")}, // Variable {QStringLiteral("var"), QStringLiteral("Variable")} }; return aliases.value(str, str); } bool Docset::isFuzzySearchEnabled() const { return m_fuzzySearchEnabled; } void Docset::setFuzzySearchEnabled(bool enabled) { m_fuzzySearchEnabled = enabled; } /** * \brief Returns score based on a substring position in a string. * \param str Original string. * \param index Index of the substring within \a str. * \param length Substring length. * \return Score value between 1 and 100. */ static int scoreFuzzy(const char *str, int index, int length) { if (index == 0 || str[index - 1] == '.') { // score between 66..99, if the match follows a dot, or starts the string return qMax(66, 100 - length); } else if (str[index + length] == 0) { // score between 33..66, if the match is at the end of the string return qMax(33, 67 - length); } else { // score between 1..33 otherwise (match in the middle of the string) return qMax(1, 34 - length); } } // Based on https://github.com/bevacqua/fuzzysearch static void matchFuzzy(const char *needle, int needleLength, const char *haystack, int haystackLength, int *start, int *length) { static const int MaxDistance = 8; static const int MaxGroupCount = 3; *start = -1; int groupCount = 0; int bestRecursiveScore = -1; int bestRecursiveStart = -1; int bestRecursiveLength = -1; for (int i = 0, j = 0; i < needleLength; ++i) { bool found = false; bool first = true; int distance = 0; while (j < haystackLength) { if (needle[i] == haystack[j++]) { if (*start == -1) { *start = j; // first matched char // try starting the search later in case the first character occurs again later int recursiveStart; int recursiveLength; matchFuzzy(needle, needleLength, haystack + j, haystackLength - j, &recursiveStart, &recursiveLength); if (recursiveStart != -1) { int recursiveScore = scoreFuzzy(haystack, recursiveStart, recursiveLength); if (recursiveScore > bestRecursiveScore) { bestRecursiveScore = recursiveScore; bestRecursiveStart = recursiveStart; bestRecursiveLength = recursiveLength; } } } *length = j - *start + 1; found = true; break; } // Optimizations to reduce returned number of results // (search was returning too many irrelevant results with large docsets) // Optimization #1: too many mismatches. if (first) { if (++groupCount >= MaxGroupCount) { break; } first = false; } // Optimization #2: too large distance between found chars. if (i != 0 && ++distance >= MaxDistance) { break; } } if (!found) { // End of haystack, char not found. if (bestRecursiveScore != -1) { // Can still match with the same constraints if matching started later // (smaller distance from first char to 2nd char) *start = bestRecursiveStart; *length = bestRecursiveLength; } else { *start = -1; } return; } } int score = scoreFuzzy(haystack, *start, *length); if (bestRecursiveScore > score) { *start = bestRecursiveStart; *length = bestRecursiveLength; } } // Ported from DevDocs (https://github.com/Thibaut/devdocs), see app/searcher.coffee. static int scoreExact(int matchIndex, int matchLen, const char *value, int valueLen) { static const char DOT = '.'; int score = 100; // Remove one point for each unmatched character. score -= (valueLen - matchLen); if (matchIndex > 0) { if (value[matchIndex - 1] == DOT) { // If the character preceding the query is a dot, assign the same // score as if the query was found at the beginning of the string, // minus one. score += matchIndex - 1; } else if (matchLen == 1) { // Don't match a single-character query unless it's found at the // beginning of the string or is preceded by a dot. return 0; } else { // (1) Remove one point for each unmatched character up to // the nearest preceding dot or the beginning of the // string. // (2) Remove one point for each unmatched character // following the query. int i = matchIndex - 2; while (i >= 0 && value[i] != DOT) --i; score -= (matchIndex - i) // (1) + (valueLen - matchLen - matchIndex); // (2) } // Remove one point for each dot preceding the query, except for the // one immediately before the query. for (int i = matchIndex - 2; i >= 0; --i) { if (value[i] == DOT) --score; } } // Remove five points for each dot following the query. for (int i = valueLen - matchLen - matchIndex - 1; i >= 0; --i) { if (value[matchIndex + matchLen + i] == DOT) score -= 5; } return qMax(1, score); } static inline int scoreFunction(const char *needleOrig, const char *haystackOrig) { const int needleLength = static_cast(qstrlen(needleOrig)); const int haystackLength = static_cast(qstrlen(haystackOrig)); QVarLengthArray needle(needleLength + 1); QVarLengthArray haystack(haystackLength + 1); for (int i = 0, j = 0; i <= needleLength; ++i, ++j) { const char c = needleOrig[i]; if ((i > 0 && needleOrig[i - 1] == ':' && c == ':') // C++ (::) || c == '/' || c == '_' || c == ' ') { // Go, some Guides needle[j] = '.'; } else if (c >= 'A' && c <= 'Z') { needle[j] = c + 32; } else { needle[j] = c; } } for (int i = 0, j = 0; i <= haystackLength; ++i, ++j) { const char c = haystackOrig[i]; if ((i > 0 && haystackOrig[i - 1] == ':' && c == ':') // C++ (::) || c == '/' || c == '_' || c == ' ') { // Go, some Guides haystack[j] = '.'; } else if (c >= 'A' && c <= 'Z') { haystack[j] = c + 32; } else { haystack[j] = c; } } int score = 0; int matchIndex = -1; int matchLength = 0; int exactIndex = -1; const char *exactMatch = std::strstr(haystack.data(), needle.data()); if (exactMatch != nullptr) { exactIndex = exactMatch - haystack.data(); } if (exactIndex == -1) { matchFuzzy(needle.data(), needleLength, haystack.data(), haystackLength, &matchIndex, &matchLength); } if (matchIndex == -1 && exactIndex == -1) { // no match // simply return 0 return 0; } else if (exactIndex != -1) { // +100 to make sure exact matches are always on top. score = scoreExact(exactIndex, needleLength, haystack.data(), haystackLength) + 100; } else { score = scoreFuzzy(haystack.data(), matchIndex, matchLength); int indexOfLastDot; for (indexOfLastDot = haystackLength - 1; indexOfLastDot >= 0; --indexOfLastDot) { if (haystack[indexOfLastDot] == '.') break; } if (indexOfLastDot != -1) { matchIndex = -1; matchFuzzy(needle.data(), needleLength, haystack.data() + indexOfLastDot + 1, haystackLength - (indexOfLastDot + 1), &matchIndex, &matchLength); if (matchIndex != -1) { score = qMax(score, scoreFuzzy(haystack.data() + indexOfLastDot + 1, matchIndex, matchLength)); } } } return score; } static void sqliteScoreFunction(sqlite3_context *context, int argc, sqlite3_value **argv) { Q_UNUSED(argc); const char *needle = reinterpret_cast(sqlite3_value_text(argv[0])); const char *haystack = reinterpret_cast(sqlite3_value_text(argv[1])); sqlite3_result_int(context, scoreFunction(needle, haystack)); } zeal-0.6.1/src/libs/registry/docset.h000066400000000000000000000063551335333561500175130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef DOCSET_H #define DOCSET_H #include #include #include #include namespace Zeal { namespace Util { class SQLiteDatabase; } namespace Registry { class CancellationToken; struct SearchResult; class Docset { public: explicit Docset(const QString &path); ~Docset(); bool isValid() const; QString name() const; QString title() const; QStringList keywords() const; QString version() const; QString revision() const; QString feedUrl() const; QString path() const; QString documentPath() const; QIcon icon() const; QIcon symbolTypeIcon(const QString &symbolType) const; QUrl indexFileUrl() const; QMap symbolCounts() const; int symbolCount(const QString &symbolType) const; const QMap &symbols(const QString &symbolType) const; QList search(const QString &query, const CancellationToken &token) const; QList relatedLinks(const QUrl &url) const; // FIXME: This a temporary solution to create URL on demand. QUrl searchResultUrl(const SearchResult &result) const; // FIXME: This is an ugly workaround before we have a proper docset sources implementation bool hasUpdate = false; bool isFuzzySearchEnabled() const; void setFuzzySearchEnabled(bool enabled); private: enum class Type { Invalid, Dash, ZDash }; void loadMetadata(); void countSymbols(); void loadSymbols(const QString &symbolType) const; void loadSymbols(const QString &symbolType, const QString &symbolString) const; void createIndex(); void createView(); QUrl createPageUrl(const QString &path, const QString &fragment = QString()) const; static QString parseSymbolType(const QString &str); QString m_name; QString m_title; QStringList m_keywords; QString m_version; QString m_revision; QString m_feedUrl; Docset::Type m_type = Type::Invalid; QString m_path; QIcon m_icon; QUrl m_indexFileUrl; QMap m_symbolStrings; QMap m_symbolCounts; mutable QMap> m_symbols; Util::SQLiteDatabase *m_db = nullptr; bool m_fuzzySearchEnabled = false; }; } // namespace Registry } // namespace Zeal #endif // DOCSET_H zeal-0.6.1/src/libs/registry/docsetmetadata.cpp000066400000000000000000000131171335333561500215410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "docsetmetadata.h" #include #include #include #include #include #include using namespace Zeal::Registry; DocsetMetadata::DocsetMetadata() { } DocsetMetadata::DocsetMetadata(const QJsonObject &jsonObject) { m_name = jsonObject[QStringLiteral("name")].toString(); m_title = jsonObject[QStringLiteral("title")].toString(); m_rawIcon = QByteArray::fromBase64(jsonObject[QStringLiteral("icon")].toString().toLocal8Bit()); m_icon.addPixmap(QPixmap::fromImage(QImage::fromData(m_rawIcon))); m_rawIcon2x = QByteArray::fromBase64(jsonObject[QStringLiteral("icon2x")].toString() .toLocal8Bit()); if (qApp->devicePixelRatio() > 1.0) { QPixmap pixmap = QPixmap::fromImage(QImage::fromData(m_rawIcon2x)); pixmap.setDevicePixelRatio(2.0); m_icon.addPixmap(pixmap); } for (const QJsonValueRef vv : jsonObject[QStringLiteral("aliases")].toArray()) m_aliases << vv.toString(); for (const QJsonValueRef vv : jsonObject[QStringLiteral("versions")].toArray()) m_versions << vv.toString(); m_revision = jsonObject[QStringLiteral("revision")].toString(); m_feedUrl = QUrl(jsonObject[QStringLiteral("feed_url")].toString()); for (const QJsonValueRef vv : jsonObject[QStringLiteral("urls")].toArray()) m_urls.append(QUrl(vv.toString())); m_extra = jsonObject[QStringLiteral("extra")].toObject(); } /*! Creates meta.json for specified docset \a version in the \a path. */ void DocsetMetadata::save(const QString &path, const QString &version) { QScopedPointer file(new QFile(path + QLatin1String("/meta.json"))); if (!file->open(QIODevice::WriteOnly)) return; QJsonObject jsonObject; jsonObject[QStringLiteral("name")] = m_name; jsonObject[QStringLiteral("title")] = m_title; if (!version.isEmpty()) jsonObject[QStringLiteral("version")] = version; if (version == latestVersion() && !m_revision.isEmpty()) jsonObject[QStringLiteral("revision")] = m_revision; if (!m_feedUrl.isEmpty()) jsonObject[QStringLiteral("feed_url")] = m_feedUrl.toString(); if (!m_urls.isEmpty()) { QJsonArray urls; for (const QUrl &url : m_urls) urls.append(url.toString()); jsonObject[QStringLiteral("urls")] = urls; } if (!m_extra.isEmpty()) jsonObject[QStringLiteral("extra")] = m_extra; file->write(QJsonDocument(jsonObject).toJson()); file->close(); if (m_rawIcon.isEmpty()) return; file->setFileName(path + QLatin1String("/icon.png")); if (file->open(QIODevice::WriteOnly)) file->write(m_rawIcon); file->close(); if (m_rawIcon2x.isEmpty()) return; file->setFileName(path + QLatin1String("/icon@2x.png")); if (file->open(QIODevice::WriteOnly)) file->write(m_rawIcon2x); file->close(); } QString DocsetMetadata::name() const { return m_name; } QIcon DocsetMetadata::icon() const { return m_icon; } QString DocsetMetadata::title() const { return m_title; } QStringList DocsetMetadata::aliases() const { return m_aliases; } QStringList DocsetMetadata::versions() const { return m_versions; } QString DocsetMetadata::latestVersion() const { return m_versions.isEmpty() ? QString() : m_versions.first(); } QString DocsetMetadata::revision() const { return m_revision; } QUrl DocsetMetadata::feedUrl() const { return m_feedUrl; } QUrl DocsetMetadata::url() const { return m_urls.at(qrand() % m_urls.size()); } QList DocsetMetadata::urls() const { return m_urls; } DocsetMetadata DocsetMetadata::fromDashFeed(const QUrl &feedUrl, const QByteArray &data) { DocsetMetadata metadata; metadata.m_name = feedUrl.fileName(); metadata.m_name.chop(4); // Strip ".xml" extension metadata.m_title = metadata.m_name; metadata.m_title.replace(QLatin1Char('_'), QLatin1Char(' ')); metadata.m_feedUrl = feedUrl; QXmlStreamReader xml(data); while (!xml.atEnd()) { const QXmlStreamReader::TokenType token = xml.readNext(); if (token != QXmlStreamReader::StartElement) continue; // Try to pull out the relevant data if (xml.name() == QLatin1String("version")) { if (xml.readNext() != QXmlStreamReader::Characters) continue; metadata.m_versions << xml.text().toString(); } else if (xml.name() == QLatin1String("url")) { if (xml.readNext() != QXmlStreamReader::Characters) continue; metadata.m_urls.append(QUrl(xml.text().toString())); } } return metadata; } zeal-0.6.1/src/libs/registry/docsetmetadata.h000066400000000000000000000037511335333561500212110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef DOCSETMETADATA_H #define DOCSETMETADATA_H #include #include #include #include namespace Zeal { namespace Registry { class DocsetMetadata { public: explicit DocsetMetadata(); explicit DocsetMetadata(const QJsonObject &jsonObject); void save(const QString &path, const QString &version); QString name() const; QString title() const; QStringList aliases() const; QStringList versions() const; QString latestVersion() const; QString revision() const; QIcon icon() const; QUrl feedUrl() const; QUrl url() const; QList urls() const; static DocsetMetadata fromDashFeed(const QUrl &feedUrl, const QByteArray &data); private: QString m_name; QString m_title; QStringList m_aliases; QStringList m_versions; QString m_revision; QByteArray m_rawIcon; QByteArray m_rawIcon2x; QIcon m_icon; QJsonObject m_extra; QUrl m_feedUrl; QList m_urls; }; } // namespace Registry } // namespace Zeal #endif // DOCSETMETADATA_H zeal-0.6.1/src/libs/registry/docsetregistry.cpp000066400000000000000000000137031335333561500216320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "docsetregistry.h" #include "docset.h" #include "searchquery.h" #include "searchresult.h" #include #include #include #include using namespace Zeal::Registry; void MergeQueryResults(QList &finalResult, const QList &partial) { finalResult << partial; } DocsetRegistry::DocsetRegistry(QObject *parent) : QObject(parent), m_thread(new QThread(this)) { // Register for use in signal connections. qRegisterMetaType>("QList"); // FIXME: Only search should be performed in a separate thread moveToThread(m_thread); m_thread->start(); } DocsetRegistry::~DocsetRegistry() { m_thread->exit(); m_thread->wait(); qDeleteAll(m_docsets); } QString DocsetRegistry::storagePath() const { return m_storagePath; } void DocsetRegistry::setStoragePath(const QString &path) { if (path == m_storagePath) { return; } m_storagePath = path; unloadAllDocsets(); addDocsetsFromFolder(path); } bool DocsetRegistry::isFuzzySearchEnabled() const { return m_fuzzySearchEnabled; } void DocsetRegistry::setFuzzySearchEnabled(bool enabled) { if (enabled == m_fuzzySearchEnabled) { return; } m_fuzzySearchEnabled = enabled; for (Docset *docset : m_docsets) { docset->setFuzzySearchEnabled(enabled); } } int DocsetRegistry::count() const { return m_docsets.count(); } bool DocsetRegistry::contains(const QString &name) const { return m_docsets.contains(name); } QStringList DocsetRegistry::names() const { return m_docsets.keys(); } void DocsetRegistry::loadDocset(const QString &path) { QFutureWatcher *watcher = new QFutureWatcher(); connect(watcher, &QFutureWatcher::finished, this, [this, watcher] { QScopedPointer, QScopedPointerDeleteLater> guard(watcher); Docset *docset = watcher->result(); // TODO: Emit error if (!docset->isValid()) { qWarning("Could not load docset from '%s'. Reinstall the docset.", qPrintable(docset->path())); delete docset; return; } docset->setFuzzySearchEnabled(m_fuzzySearchEnabled); const QString name = docset->name(); if (m_docsets.contains(name)) { unloadDocset(name); } m_docsets[name] = docset; emit docsetLoaded(name); }); watcher->setFuture(QtConcurrent::run([path] { return new Docset(path); })); } void DocsetRegistry::unloadDocset(const QString &name) { emit docsetAboutToBeUnloaded(name); delete m_docsets.take(name); emit docsetUnloaded(name); } void DocsetRegistry::unloadAllDocsets() { for (const QString &name : m_docsets.keys()) { unloadDocset(name); } } Docset *DocsetRegistry::docset(const QString &name) const { return m_docsets[name]; } Docset *DocsetRegistry::docset(int index) const { if (index < 0 || index >= m_docsets.size()) return nullptr; return (m_docsets.cbegin() + index).value(); } QList DocsetRegistry::docsets() const { return m_docsets.values(); } void DocsetRegistry::search(const QString &query) { m_cancellationToken.cancel(); if (query.isEmpty()) { emit searchCompleted({}); return; } QMetaObject::invokeMethod(this, "_runQuery", Qt::QueuedConnection, Q_ARG(QString, query)); } void DocsetRegistry::_runQuery(const QString &query) { m_cancellationToken.reset(); QList enabledDocsets; const SearchQuery searchQuery = SearchQuery::fromString(query); if (searchQuery.hasKeywords()) { for (Docset *docset : m_docsets) { if (searchQuery.hasKeywords(docset->keywords())) enabledDocsets << docset; } } else { enabledDocsets = docsets(); } QFuture> queryResultsFuture = QtConcurrent::mappedReduced(enabledDocsets, std::bind(&Docset::search, std::placeholders::_1, searchQuery.query(), std::ref(m_cancellationToken)), &MergeQueryResults); QList results = queryResultsFuture.result(); if (m_cancellationToken.isCanceled()) return; std::sort(results.begin(), results.end()); if (m_cancellationToken.isCanceled()) return; emit searchCompleted(results); } // Recursively finds and adds all docsets in a given directory. void DocsetRegistry::addDocsetsFromFolder(const QString &path) { const QDir dir(path); for (const QFileInfo &subdir : dir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllDirs)) { if (subdir.suffix() == QLatin1String("docset")) loadDocset(subdir.filePath()); else addDocsetsFromFolder(subdir.filePath()); } } zeal-0.6.1/src/libs/registry/docsetregistry.h000066400000000000000000000046771335333561500213110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef DOCSETREGISTRY_H #define DOCSETREGISTRY_H #include "cancellationtoken.h" #include #include class QThread; namespace Zeal { namespace Registry { class Docset; struct SearchResult; class DocsetRegistry : public QObject { Q_OBJECT public: explicit DocsetRegistry(QObject *parent = nullptr); ~DocsetRegistry() override; QString storagePath() const; void setStoragePath(const QString &path); bool isFuzzySearchEnabled() const; void setFuzzySearchEnabled(bool enabled); int count() const; bool contains(const QString &name) const; QStringList names() const; void loadDocset(const QString &path); void unloadDocset(const QString &name); void unloadAllDocsets(); Docset *docset(const QString &name) const; Docset *docset(int index) const; QList docsets() const; void search(const QString &query); const QList &queryResults(); signals: void docsetLoaded(const QString &name); void docsetAboutToBeUnloaded(const QString &name); void docsetUnloaded(const QString &name); void searchCompleted(const QList &results); private slots: void _runQuery(const QString &query); private: void addDocsetsFromFolder(const QString &path); QString m_storagePath; bool m_fuzzySearchEnabled = false; QThread *m_thread = nullptr; QMap m_docsets; CancellationToken m_cancellationToken; }; } // namespace Registry } // namespace Zeal #endif // DOCSETREGISTRY_H zeal-0.6.1/src/libs/registry/itemdatarole.h000066400000000000000000000005111335333561500206700ustar00rootroot00000000000000#ifndef ZEAL_REGISTRY_ITEMDATAROLE_H #define ZEAL_REGISTRY_ITEMDATAROLE_H #include namespace Zeal { namespace Registry { enum ItemDataRole { DocsetIconRole = Qt::UserRole, DocsetNameRole, UpdateAvailableRole, UrlRole }; } // namespace Registry } // namespace Zeal #endif // ZEAL_REGISTRY_ITEMDATAROLE_H zeal-0.6.1/src/libs/registry/listmodel.cpp000066400000000000000000000172061335333561500205560ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "listmodel.h" #include "docset.h" #include "docsetregistry.h" #include "itemdatarole.h" using namespace Zeal::Registry; ListModel::ListModel(DocsetRegistry *docsetRegistry, QObject *parent) : QAbstractItemModel(parent), m_docsetRegistry(docsetRegistry) { connect(m_docsetRegistry, &DocsetRegistry::docsetLoaded, this, &ListModel::addDocset); connect(m_docsetRegistry, &DocsetRegistry::docsetAboutToBeUnloaded, this, &ListModel::removeDocset); for (const QString &name : m_docsetRegistry->names()) addDocset(name); } ListModel::~ListModel() { for (DocsetItem *item : m_docsetItems) { qDeleteAll(item->groups); delete item; } } QVariant ListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); switch (role) { case Qt::DecorationRole: switch (indexLevel(index)) { case Level::DocsetLevel: return m_docsetRegistry->docset(index.row())->icon(); case Level::GroupLevel: { DocsetItem *docsetItem = static_cast(index.internalPointer()); const QString symbolType = docsetItem->groups.at(index.row())->symbolType; return docsetItem->docset->symbolTypeIcon(symbolType); } case Level::SymbolLevel: { GroupItem *groupItem = static_cast(index.internalPointer()); return groupItem->docsetItem->docset->symbolTypeIcon(groupItem->symbolType); } default: return QVariant(); } case Qt::DisplayRole: switch (indexLevel(index)) { case Level::DocsetLevel: return m_docsetRegistry->docset(index.row())->title(); case Level::GroupLevel: { DocsetItem *docsetItem = static_cast(index.internalPointer()); const QString symbolType = docsetItem->groups.at(index.row())->symbolType; return QStringLiteral("%1 (%2)").arg(pluralize(symbolType), QString::number(docsetItem->docset->symbolCount(symbolType))); } case Level::SymbolLevel: { GroupItem *groupItem = static_cast(index.internalPointer()); auto it = groupItem->docsetItem->docset->symbols(groupItem->symbolType).cbegin() + index.row(); return it.key(); } default: return QVariant(); } case ItemDataRole::UrlRole: switch (indexLevel(index)) { case Level::DocsetLevel: return m_docsetRegistry->docset(index.row())->indexFileUrl(); case Level::SymbolLevel: { GroupItem *groupItem = static_cast(index.internalPointer()); auto it = groupItem->docsetItem->docset->symbols(groupItem->symbolType).cbegin() + index.row(); return it.value(); } default: return QVariant(); } case ItemDataRole::DocsetNameRole: if (index.parent().isValid()) return QVariant(); return m_docsetRegistry->docset(index.row())->name(); case ItemDataRole::UpdateAvailableRole: if (index.parent().isValid()) return QVariant(); return m_docsetRegistry->docset(index.row())->hasUpdate; default: return QVariant(); } } QModelIndex ListModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); switch (indexLevel(parent)) { case Level::RootLevel: return createIndex(row, column); case Level::DocsetLevel: { auto it = m_docsetItems.begin() + parent.row(); return createIndex(row, column, static_cast(it.value())); } case Level::GroupLevel: { DocsetItem *docsetItem = static_cast(parent.internalPointer()); return createIndex(row, column, docsetItem->groups.at(parent.row())); } default: return QModelIndex(); } } QModelIndex ListModel::parent(const QModelIndex &child) const { switch (indexLevel(child)) { case Level::GroupLevel: { DocsetItem *item = static_cast(child.internalPointer()); return createIndex(m_docsetItems.keys().indexOf(item->docset->name()), 0); } case SymbolLevel: { GroupItem *item = static_cast(child.internalPointer()); return createIndex(item->docsetItem->groups.indexOf(item), 0, item->docsetItem); } default: return QModelIndex(); } } int ListModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 1; } int ListModel::rowCount(const QModelIndex &parent) const { if (parent.column() > 0) return 0; switch (indexLevel(parent)) { case Level::RootLevel: return m_docsetRegistry->count(); case Level::DocsetLevel: return m_docsetRegistry->docset(parent.row())->symbolCounts().count(); case Level::GroupLevel: { DocsetItem *docsetItem = static_cast(parent.internalPointer()); return docsetItem->docset->symbolCount(docsetItem->groups.at(parent.row())->symbolType); } default: return 0; } } void ListModel::addDocset(const QString &name) { const int index = m_docsetRegistry->names().indexOf(name); beginInsertRows(QModelIndex(), index, index); DocsetItem *docsetItem = new DocsetItem(); docsetItem->docset = m_docsetRegistry->docset(name); for (const QString &symbolType : docsetItem->docset->symbolCounts().keys()) { GroupItem *groupItem = new GroupItem(); groupItem->docsetItem = docsetItem; groupItem->symbolType = symbolType; docsetItem->groups.append(groupItem); } m_docsetItems.insert(name, docsetItem); endInsertRows(); } void ListModel::removeDocset(const QString &name) { const int index = m_docsetItems.keys().indexOf(name); // TODO: Investigate why this can happen (see #420) if (index == -1) return; beginRemoveRows(QModelIndex(), index, index); DocsetItem *docsetItem = m_docsetItems.take(name); qDeleteAll(docsetItem->groups); delete docsetItem; endRemoveRows(); } QString ListModel::pluralize(const QString &s) { if (s.endsWith(QLatin1String("y"))) return s.left(s.length() - 1) + QLatin1String("ies"); else return s + (s.endsWith('s') ? QLatin1String("es") : QLatin1String("s")); } ListModel::Level ListModel::indexLevel(const QModelIndex &index) { if (!index.isValid()) return Level::RootLevel; else if (!index.internalPointer()) return Level::DocsetLevel; else if (*static_cast(index.internalPointer()) == Level::DocsetLevel) return Level::GroupLevel; else return Level::SymbolLevel; } zeal-0.6.1/src/libs/registry/listmodel.h000066400000000000000000000046261335333561500202250ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef LISTMODEL_H #define LISTMODEL_H #include #include namespace Zeal { namespace Registry { class Docset; class DocsetRegistry; class ListModel : public QAbstractItemModel { Q_OBJECT public: explicit ListModel(DocsetRegistry *docsetRegistry, QObject *parent = nullptr); ~ListModel() override; QVariant data(const QModelIndex &index, int role) const override; QModelIndex index(int row, int column, const QModelIndex &parent) const override; QModelIndex parent(const QModelIndex &child) const override; int columnCount(const QModelIndex &parent) const override; int rowCount(const QModelIndex &parent) const override; private slots: void addDocset(const QString &name); void removeDocset(const QString &name); private: enum Level { RootLevel, DocsetLevel, GroupLevel, SymbolLevel }; inline static QString pluralize(const QString &s); inline static Level indexLevel(const QModelIndex &index); DocsetRegistry *m_docsetRegistry = nullptr; struct DocsetItem; struct GroupItem { const Level level = Level::GroupLevel; DocsetItem *docsetItem = nullptr; QString symbolType; }; struct DocsetItem { const Level level = Level::DocsetLevel; Docset *docset = nullptr; QList groups; }; QMap m_docsetItems; }; } // namespace Registry } // namespace Zeal #endif // LISTMODEL_H zeal-0.6.1/src/libs/registry/searchmodel.cpp000066400000000000000000000064101335333561500210430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "searchmodel.h" #include "docset.h" #include "itemdatarole.h" using namespace Zeal::Registry; SearchModel::SearchModel(QObject *parent) : QAbstractListModel(parent) { } SearchModel::SearchModel(const SearchModel &other) : QAbstractListModel(other.d_ptr->parent), m_dataList(other.m_dataList) { } bool SearchModel::isEmpty() const { return m_dataList.isEmpty(); } QVariant SearchModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); SearchResult *item = static_cast(index.internalPointer()); switch (role) { case Qt::DisplayRole: return item->name; case Qt::DecorationRole: return item->docset->symbolTypeIcon(item->type); case ItemDataRole::DocsetIconRole: return item->docset->icon(); case ItemDataRole::UrlRole: return item->docset->searchResultUrl(*item); default: return QVariant(); } } QModelIndex SearchModel::index(int row, int column, const QModelIndex &parent) const { if (parent.isValid() || m_dataList.count() <= row || column > 1) return QModelIndex(); // FIXME: const_cast SearchResult *item = const_cast(&m_dataList.at(row)); return createIndex(row, column, item); } int SearchModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_dataList.count(); return 0; } bool SearchModel::removeRows(int row, int count, const QModelIndex &parent) { if (row + count <= m_dataList.size() && !parent.isValid()) { beginRemoveRows(parent, row, row + count - 1); while (count) { m_dataList.removeAt(row); --count; } endRemoveRows(); return true; } return false; } void SearchModel::removeSearchResultWithName(const QString &name) { QMutableListIterator iterator(m_dataList); int rowNum = 0; while (iterator.hasNext()) { if (iterator.next().docset->name() == name) { beginRemoveRows(QModelIndex(), rowNum, rowNum); iterator.remove(); rowNum -= 1; endRemoveRows(); } rowNum += 1; } } void SearchModel::setResults(const QList &results) { beginResetModel(); m_dataList = results; endResetModel(); emit updated(); } zeal-0.6.1/src/libs/registry/searchmodel.h000066400000000000000000000035661335333561500205210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef SEARCHMODEL_H #define SEARCHMODEL_H #include "searchresult.h" #include namespace Zeal { namespace Registry { class SearchModel : public QAbstractListModel { Q_OBJECT public: explicit SearchModel(QObject *parent = nullptr); SearchModel(const SearchModel &other); bool isEmpty() const; QVariant data(const QModelIndex &index, int role) const override; QModelIndex index(int row, int column, const QModelIndex &parent) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; void removeSearchResultWithName(const QString &name); public slots: void setResults(const QList &results = QList()); signals: void updated(); private: QList m_dataList; }; } // namespace Registry } // namespace Zeal #endif // SEARCHMODEL_H zeal-0.6.1/src/libs/registry/searchquery.cpp000066400000000000000000000060511335333561500211110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "searchquery.h" using namespace Zeal::Registry; namespace { const char prefixSeparator = ':'; const char keywordSeparator = ','; } SearchQuery::SearchQuery() { } SearchQuery::SearchQuery(const QString &query, const QStringList &keywords) : m_query(query) { setKeywords(keywords); } SearchQuery SearchQuery::fromString(const QString &str) { const int sepAt = str.indexOf(prefixSeparator); const int next = sepAt + 1; QString query; QStringList keywords; if (sepAt > 0 && (next >= str.size() || str.at(next) != prefixSeparator)) { query = str.mid(next).trimmed(); const QString keywordStr = str.left(sepAt).trimmed(); keywords = keywordStr.split(keywordSeparator); } else { query = str.trimmed(); } return SearchQuery(query, keywords); } QString SearchQuery::toString() const { if (m_keywords.isEmpty()) return m_query; else return m_keywordPrefix + m_query; } bool SearchQuery::isEmpty() const { return m_query.isEmpty() && m_keywords.isEmpty(); } QStringList SearchQuery::keywords() const { return m_keywords; } void SearchQuery::setKeywords(const QStringList &list) { if (list.isEmpty()) return; m_keywords = list; m_keywordPrefix = list.join(keywordSeparator) + prefixSeparator; } bool SearchQuery::hasKeywords() const { return !m_keywords.isEmpty(); } bool SearchQuery::hasKeywords(const QStringList &keywords) const { for (const QString &keyword : keywords) { if (m_keywords.contains(keyword, Qt::CaseInsensitive)) { return true; } } return false; } int SearchQuery::keywordPrefixSize() const { return m_keywordPrefix.size(); } QString SearchQuery::query() const { return m_query; } void SearchQuery::setQuery(const QString &str) { m_query = str; } QDataStream &operator<<(QDataStream &out, const Zeal::Registry::SearchQuery &query) { out << query.toString(); return out; } QDataStream &operator>>(QDataStream &in, Zeal::Registry::SearchQuery &query) { QString str; in >> str; query = SearchQuery::fromString(str); return in; } zeal-0.6.1/src/libs/registry/searchquery.h000066400000000000000000000060121335333561500205530ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef SEARCHQUERY_H #define SEARCHQUERY_H #include namespace Zeal { namespace Registry { /** * @short The search query model. */ class SearchQuery { public: explicit SearchQuery(); explicit SearchQuery(const QString &query, const QStringList &keywords = QStringList()); /// Creates a search query from a string. Single separator will be /// used to contstruct docset filter, but separator repeated twice /// will be left inside coreQuery part since double semicolon is /// used inside qualified symbol names in popular programming /// languages (c++, ruby, perl, etc.). /// /// Examples: /// "android:setTypeFa" #=> docsetFilters = ["android"], coreQuery = "setTypeFa" /// "noprefix" #=> docsetFilters = [], coreQuery = "noprefix" /// ":find" #=> docsetFilters = [], coreQuery = ":find" /// "std::string" #=> docsetFilters = [], coreQuery = "std::string" /// "c++:std::string" #=> docsetFilters = ["c++"], coreQuery = "std::string" /// /// Multiple docsets are supported using the ',' character: /// "java,android:setTypeFa #=> docsetFilters = ["java", "android"], coreQuery = "setTypeFa" static SearchQuery fromString(const QString &str); QString toString() const; bool isEmpty() const; QStringList keywords() const; void setKeywords(const QStringList &list); /// Returns true if there's a docset filter for the given query bool hasKeywords() const; /// Returns true if one the query contains one of the @c keywords. bool hasKeywords(const QStringList &keywords) const; /// Returns the docset filter raw size for the given query int keywordPrefixSize() const; QString query() const; void setQuery(const QString &str); private: QString m_query; QStringList m_keywords; QString m_keywordPrefix; }; } // namespace Registry } // namespace Zeal QDataStream &operator<<(QDataStream &out, const Zeal::Registry::SearchQuery &query); QDataStream &operator>>(QDataStream &in, Zeal::Registry::SearchQuery &query); #endif // SEARCHQUERY_H zeal-0.6.1/src/libs/registry/searchresult.h000066400000000000000000000027621335333561500207340ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef SEARCHRESULT_H #define SEARCHRESULT_H #include #include namespace Zeal { namespace Registry { class Docset; struct SearchResult { QString name; QString type; QString urlPath; QString urlFragment; Docset *docset; int score; inline bool operator<(const SearchResult &other) const { if (score == other.score) return QString::compare(name, other.name, Qt::CaseInsensitive) < 0; return score > other.score; } }; } // namespace Registry } // namespace Zeal #endif // SEARCHRESULT_H zeal-0.6.1/src/libs/ui/000077500000000000000000000000001335333561500146155ustar00rootroot00000000000000zeal-0.6.1/src/libs/ui/CMakeLists.txt000066400000000000000000000013511335333561500173550ustar00rootroot00000000000000add_subdirectory(qxtglobalshortcut) list(APPEND Widgets_SOURCES widgets/searchedit.cpp widgets/searchtoolbar.cpp widgets/shortcutedit.cpp widgets/toolbarframe.cpp widgets/webview.cpp widgets/webviewtab.cpp ) set(Ui_FORMS aboutdialog.ui docsetsdialog.ui mainwindow.ui settingsdialog.ui ) add_library(Ui aboutdialog.cpp docsetlistitemdelegate.cpp docsetsdialog.cpp mainwindow.cpp progressitemdelegate.cpp searchitemdelegate.cpp settingsdialog.cpp webbridge.cpp ${Widgets_SOURCES} ${Ui_FORMS} # For Qt Creator. ) target_link_libraries(Ui QxtGlobalShortcut Registry) find_package(Qt5 COMPONENTS WebKitWidgets REQUIRED) target_link_libraries(Ui Qt5::WebKitWidgets) zeal-0.6.1/src/libs/ui/aboutdialog.cpp000066400000000000000000000027021335333561500176140ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "aboutdialog.h" #include "ui_aboutdialog.h" #include using namespace Zeal::WidgetUi; AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDialog) { ui->setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); const QString buildInfo = tr("Version: %1
").arg(QCoreApplication::applicationVersion()); ui->buildInfoLabel->setText(buildInfo); ui->buttonBox->setFocus(Qt::OtherFocusReason); } AboutDialog::~AboutDialog() { delete ui; } zeal-0.6.1/src/libs/ui/aboutdialog.h000066400000000000000000000025121335333561500172600ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_ABOUTDIALOG_H #define ZEAL_WIDGETUI_ABOUTDIALOG_H #include namespace Zeal { namespace WidgetUi { namespace Ui { class AboutDialog; } // namespace Ui class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(QWidget *parent = nullptr); ~AboutDialog() override; private: Ui::AboutDialog *ui; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_ABOUTDIALOG_H zeal-0.6.1/src/libs/ui/aboutdialog.ui000066400000000000000000000167701335333561500174610ustar00rootroot00000000000000 Zeal::WidgetUi::AboutDialog 0 0 400 420 About Zeal QFrame::StyledPanel QFrame::Sunken 10 :/icons/logo/64x64.png 0 <h1>Zeal</h1> 0 About <strong>A simple offline documentation browser</strong> <br><br> Copyright &copy; Oleg Shparber and other contributors, 2013-2018. <br> <a href="https://zealdocs.org">zealdocs.org</a> <br> <a href="irc://irc.freenode.net/zealdocs">#zealdocs</a> on <a href="https://www.freenode.net">Freenode</a> <br><br> Zeal is an open source software available under the terms of the General Public License version 3 (<a href="https://www.gnu.org/copyleft/gpl.html">GPLv3</a>) or later. <br><br> Docsets are courtesy of <a href="https://kapeli.com/dash">Dash</a>. Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true true Licenses <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zeal heavily relies on other open source software listed below.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Bulma</span> - <a href="https://bulma.io/"><span style=" text-decoration: underline; color:#007af4;">bulma.io</span></a><br />License: MIT License </p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Font Awesome</span> - <a href="http://fontawesome.io/"><span style=" text-decoration: underline; color:#007af4;">fontawesome.io</span></a><br />License: SIL OFL 1.1 (font), MIT License (css) </p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">libarchive</span> - <a href="https://www.libarchive.org/"><span style=" text-decoration: underline; color:#007af4;">www.libarchive.org</span></a><br />License: Simplified BSD License </p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">LibQxt</span> - <a href="https://bitbucket.org/libqxt/libqxt"><span style=" text-decoration: underline; color:#007af4;">bitbucket.org/libqxt/libqxt</span></a><br />License: New BSD License </p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Qt</span> - <a href="https://www.qt.io/"><span style=" text-decoration: underline; color:#007af4;">www.qt.io</span></a><br />License: GNU LGPL version 3 </p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">SQLite</span> - <a href="https://www.sqlite.org/"><span style=" text-decoration: underline; color:#007af4;">www.sqlite.org</span></a><br />License: Public Domain </p></body></html> true QDialogButtonBox::Close buttonBox clicked(QAbstractButton*) Zeal::WidgetUi::AboutDialog close() 248 254 157 274 zeal-0.6.1/src/libs/ui/docsetlistitemdelegate.cpp000066400000000000000000000050161335333561500220520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "docsetlistitemdelegate.h" #include #include using namespace Zeal; using namespace Zeal::WidgetUi; DocsetListItemDelegate::DocsetListItemDelegate(QObject *parent) : QStyledItemDelegate(parent) { } void DocsetListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyledItemDelegate::paint(painter, option, index); if (!index.model()->data(index, Registry::ItemDataRole::UpdateAvailableRole).toBool()) return; const QString text = tr("Update available"); QFont font(painter->font()); font.setItalic(true); const QFontMetrics fontMetrics(font); QRect textRect = option.rect; textRect.setLeft(textRect.right() - fontMetrics.width(text) - 2); painter->save(); QPalette palette = option.palette; #ifdef Q_OS_WIN32 // QWindowsVistaStyle overrides highlight colour. if (option.widget->style()->objectName() == QLatin1String("windowsvista")) { palette.setColor(QPalette::All, QPalette::HighlightedText, palette.color(QPalette::Active, QPalette::Text)); } #endif const QPalette::ColorGroup cg = (option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive; if (option.state & QStyle::State_Selected) { painter->setPen(palette.color(cg, QPalette::HighlightedText)); } else { painter->setPen(palette.color(cg, QPalette::Text)); } painter->setFont(font); painter->drawText(textRect, text); painter->restore(); } zeal-0.6.1/src/libs/ui/docsetlistitemdelegate.h000066400000000000000000000027141335333561500215210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_DOCSETLISTITEMDELEGATE_H #define ZEAL_WIDGETUI_DOCSETLISTITEMDELEGATE_H #include namespace Zeal { namespace WidgetUi { class DocsetListItemDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit DocsetListItemDelegate(QObject *parent = nullptr); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_DOCSETLISTITEMDELEGATE_H zeal-0.6.1/src/libs/ui/docsetsdialog.cpp000066400000000000000000000707051335333561500201560ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "docsetsdialog.h" #include "ui_docsetsdialog.h" #include "docsetlistitemdelegate.h" #include "progressitemdelegate.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Zeal; using namespace Zeal::WidgetUi; #ifdef Q_OS_WIN32 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; #endif namespace { const char ApiServerUrl[] = "http://api.zealdocs.org/v1"; const char RedirectServerUrl[] = "https://go.zealdocs.org"; // TODO: Each source plugin should have its own cache const char DocsetListCacheFileName[] = "com.kapeli.json"; // TODO: Make the timeout period configurable constexpr int CacheTimeout = 24 * 60 * 60 * 1000; // 24 hours in microseconds // QNetworkReply properties const char DocsetNameProperty[] = "docsetName"; const char DownloadTypeProperty[] = "downloadType"; const char DownloadPreviousReceived[] = "downloadPreviousReceived"; const char ListItemIndexProperty[] = "listItem"; } DocsetsDialog::DocsetsDialog(Core::Application *app, QWidget *parent) : QDialog(parent), ui(new Ui::DocsetsDialog()), m_application(app), m_docsetRegistry(app->docsetRegistry()) { ui->setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); loadDocsetList(); #ifdef Q_OS_WIN32 qt_ntfs_permission_lookup++; #endif m_isStorageReadOnly = !QFileInfo(m_application->settings()->docsetPath).isWritable(); #ifdef Q_OS_WIN32 qt_ntfs_permission_lookup--; #endif #ifdef Q_OS_OSX ui->availableDocsetList->setAttribute(Qt::WA_MacShowFocusRect, false); ui->installedDocsetList->setAttribute(Qt::WA_MacShowFocusRect, false); #endif ui->combinedProgressBar->hide(); ui->cancelButton->hide(); ui->readOnlyLabel->setVisible(m_isStorageReadOnly); connect(m_application, &Core::Application::extractionCompleted, this, &DocsetsDialog::extractionCompleted); connect(m_application, &Core::Application::extractionError, this, &DocsetsDialog::extractionError); connect(m_application, &Core::Application::extractionProgress, this, &DocsetsDialog::extractionProgress); connect(ui->cancelButton, &QPushButton::clicked, this, &DocsetsDialog::cancelDownloads); setupInstalledDocsetsTab(); setupAvailableDocsetsTab(); if (m_isStorageReadOnly) { disableControls(); // Updating the docset list is fine; ui->refreshButton->setEnabled(true); } } DocsetsDialog::~DocsetsDialog() { delete ui; } void DocsetsDialog::reject() { if (m_replies.isEmpty() && m_tmpFiles.isEmpty()) { QDialog::reject(); return; } QMessageBox::information(this, QStringLiteral("Zeal"), tr("Please wait for all operations to finish.")); } void DocsetsDialog::addDashFeed() { QString clipboardText = QApplication::clipboard()->text(); if (!clipboardText.startsWith(QLatin1String("dash-feed://"))) clipboardText.clear(); QString feedUrl = QInputDialog::getText(this, QStringLiteral("Zeal"), tr("Feed URL:"), QLineEdit::Normal, clipboardText); if (feedUrl.isEmpty()) return; if (feedUrl.startsWith(QLatin1String("dash-feed://"))) { feedUrl = feedUrl.remove(0, 12); feedUrl = QUrl::fromPercentEncoding(feedUrl.toUtf8()); } QNetworkReply *reply = download(QUrl(feedUrl)); reply->setProperty(DownloadTypeProperty, DownloadDashFeed); } void DocsetsDialog::updateSelectedDocsets() { for (const QModelIndex &index : ui->installedDocsetList->selectionModel()->selectedRows()) { if (!index.data(Registry::ItemDataRole::UpdateAvailableRole).toBool()) continue; downloadDashDocset(index); } } void DocsetsDialog::updateAllDocsets() { QAbstractItemModel *model = ui->installedDocsetList->model(); for (int i = 0; i < model->rowCount(); ++i) { const QModelIndex index = model->index(i, 0); if (!index.data(Registry::ItemDataRole::UpdateAvailableRole).toBool()) continue; downloadDashDocset(index); } } void DocsetsDialog::removeSelectedDocsets() { QItemSelectionModel *selectonModel = ui->installedDocsetList->selectionModel(); if (!selectonModel->hasSelection()) return; int ret; const QModelIndexList selectedIndexes = selectonModel->selectedRows(); if (selectedIndexes.size() == 1) { const QString docsetTitle = selectedIndexes.first().data().toString(); ret = QMessageBox::question(this, QStringLiteral("Zeal"), tr("Remove %1 docset?").arg(docsetTitle)); } else { ret = QMessageBox::question(this, QStringLiteral("Zeal"), tr("Remove %n docset(s)?", nullptr, selectedIndexes.size())); } if (ret == QMessageBox::No) return; // Gather names first, because model indicies become invalid when docsets are removed. QStringList names; for (const QModelIndex &index : selectedIndexes) names.append(index.data(Registry::ItemDataRole::DocsetNameRole).toString()); for (const QString &name : names) removeDocset(name); } void DocsetsDialog::updateDocsetFilter(const QString &filterString) { const bool doSearch = !filterString.simplified().isEmpty(); for (int i = 0; i < ui->availableDocsetList->count(); ++i) { QListWidgetItem *item = ui->availableDocsetList->item(i); // Skip installed docsets if (m_docsetRegistry->contains(item->data(Registry::ItemDataRole::DocsetNameRole).toString())) continue; item->setHidden(doSearch && !item->text().contains(filterString, Qt::CaseInsensitive)); } } void DocsetsDialog::downloadSelectedDocsets() { QItemSelectionModel *selectionModel = ui->availableDocsetList->selectionModel(); for (const QModelIndex &index : selectionModel->selectedRows()) { selectionModel->select(index, QItemSelectionModel::Deselect); // Do nothing if a download is already in progress. if (index.data(ProgressItemDelegate::ShowProgressRole).toBool()) continue; QAbstractItemModel *model = ui->availableDocsetList->model(); model->setData(index, tr("Downloading: %p%"), ProgressItemDelegate::FormatRole); model->setData(index, 0, ProgressItemDelegate::ValueRole); model->setData(index, true, ProgressItemDelegate::ShowProgressRole); downloadDashDocset(index); } } /*! \internal Should be connected to all \l QNetworkReply::finished signals in order to process possible HTTP-redirects correctly. */ void DocsetsDialog::downloadCompleted() { QScopedPointer reply( qobject_cast(sender())); m_replies.removeOne(reply.data()); if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::OperationCanceledError) { const int ret = QMessageBox::warning(this, QStringLiteral("Zeal"), reply->errorString(), QMessageBox::Retry | QMessageBox::Default, QMessageBox::Cancel | QMessageBox::Escape, QMessageBox::NoButton); if (ret == QMessageBox::Retry) { QNetworkReply *newReply = download(reply->request().url()); // Copy properties newReply->setProperty(DocsetNameProperty, reply->property(DocsetNameProperty)); newReply->setProperty(DownloadTypeProperty, reply->property(DownloadTypeProperty)); newReply->setProperty(ListItemIndexProperty, reply->property(ListItemIndexProperty)); return; } bool ok; QListWidgetItem *listItem = ui->availableDocsetList->item( reply->property(ListItemIndexProperty).toInt(&ok)); if (ok && listItem) listItem->setData(ProgressItemDelegate::ShowProgressRole, false); } resetProgress(); return; } QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirectUrl.isValid()) { if (redirectUrl.isRelative()) redirectUrl = reply->request().url().resolved(redirectUrl); // TODO: Verify if scheme can be missing if (redirectUrl.scheme().isEmpty()) redirectUrl.setScheme(reply->request().url().scheme()); QNetworkReply *newReply = download(redirectUrl); // Copy properties newReply->setProperty(DocsetNameProperty, reply->property(DocsetNameProperty)); newReply->setProperty(DownloadTypeProperty, reply->property(DownloadTypeProperty)); newReply->setProperty(ListItemIndexProperty, reply->property(ListItemIndexProperty)); return; } switch (reply->property(DownloadTypeProperty).toUInt()) { case DownloadDocsetList: { const QByteArray data = reply->readAll(); QScopedPointer file(new QFile(cacheLocation(DocsetListCacheFileName))); if (file->open(QIODevice::WriteOnly)) file->write(data); ui->lastUpdatedLabel->setText(QFileInfo(file->fileName()) .lastModified().toString(Qt::SystemLocaleShortDate)); QJsonParseError jsonError; const QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError); if (jsonError.error != QJsonParseError::NoError) { // TODO: Log QJsonParseError. const QMessageBox::StandardButton rc = QMessageBox::warning(this, QStringLiteral("Zeal"), tr("Server returned a corrupted docset list."), QMessageBox::Retry | QMessageBox::Cancel); if (rc == QMessageBox::Retry) { downloadDocsetList(); } break; } processDocsetList(jsonDoc.array()); break; } case DownloadDashFeed: { Registry::DocsetMetadata metadata = Registry::DocsetMetadata::fromDashFeed(reply->request().url(), reply->readAll()); if (metadata.urls().isEmpty()) { QMessageBox::warning(this, QStringLiteral("Zeal"), tr("Invalid docset feed!")); break; } m_userFeeds[metadata.name()] = metadata; Registry::Docset *docset = m_docsetRegistry->docset(metadata.name()); if (docset == nullptr) { // Fetch docset only on first feed download, // since further downloads are only update checks QNetworkReply *reply = download(metadata.url()); reply->setProperty(DocsetNameProperty, metadata.name()); reply->setProperty(DownloadTypeProperty, DownloadDocset); } else { // Check for feed update if (metadata.latestVersion() != docset->version() || metadata.revision() > docset->revision()) { docset->hasUpdate = true; if (!m_isStorageReadOnly) { ui->updateAllDocsetsButton->setEnabled(true); } ui->installedDocsetList->reset(); } } break; } case DownloadDocset: { const QString docsetName = reply->property(DocsetNameProperty).toString(); const QString docsetDirectoryName = docsetName + QLatin1String(".docset"); if (QDir(m_application->settings()->docsetPath).exists(docsetDirectoryName)) { removeDocset(docsetName); } QTemporaryFile *tmpFile = m_tmpFiles[docsetName]; if (!tmpFile) { tmpFile = new QTemporaryFile(this); tmpFile->open(); m_tmpFiles.insert(docsetName, tmpFile); } while (reply->bytesAvailable()) tmpFile->write(reply->read(1024 * 1024)); // Use small chunks tmpFile->close(); QListWidgetItem *item = findDocsetListItem(docsetName); if (item) { item->setData(ProgressItemDelegate::ValueRole, 0); item->setData(ProgressItemDelegate::FormatRole, tr("Installing: %p%")); } m_application->extract(tmpFile->fileName(), m_application->settings()->docsetPath, docsetDirectoryName); break; } } // If all enqueued downloads have finished executing if (m_replies.isEmpty()) resetProgress(); } // creates a total download progress for multiple QNetworkReplies void DocsetsDialog::downloadProgress(qint64 received, qint64 total) { // Don't show progress for non-docset pages if (total == -1 || received < 10240) return; QNetworkReply *reply = qobject_cast(sender()); if (!reply || !reply->isOpen()) return; if (reply->property(DownloadTypeProperty).toInt() == DownloadDocset) { const QString docsetName = reply->property(DocsetNameProperty).toString(); QTemporaryFile *tmpFile = m_tmpFiles[docsetName]; if (!tmpFile) { tmpFile = new QTemporaryFile(this); tmpFile->open(); m_tmpFiles.insert(docsetName, tmpFile); } tmpFile->write(reply->read(received)); } // Try to get the item associated to the request QListWidgetItem *item = ui->availableDocsetList->item(reply->property(ListItemIndexProperty).toInt()); if (item) item->setData(ProgressItemDelegate::ValueRole, percent(received, total)); qint64 previousReceived = 0; const QVariant previousReceivedVariant = reply->property(DownloadPreviousReceived); if (!previousReceivedVariant.isValid()) m_combinedTotal += total; else previousReceived = previousReceivedVariant.toLongLong(); m_combinedReceived += received - previousReceived; reply->setProperty(DownloadPreviousReceived, received); updateCombinedProgress(); } void DocsetsDialog::extractionCompleted(const QString &filePath) { const QString docsetName = docsetNameForTmpFilePath(filePath); const QDir dataDir(m_application->settings()->docsetPath); const QString docsetPath = dataDir.filePath(docsetName + QLatin1String(".docset")); // Write metadata about docset Registry::DocsetMetadata metadata = m_availableDocsets.contains(docsetName) ? m_availableDocsets[docsetName] : m_userFeeds[docsetName]; metadata.save(docsetPath, metadata.latestVersion()); m_docsetRegistry->loadDocset(docsetPath); QListWidgetItem *listItem = findDocsetListItem(docsetName); if (listItem) { listItem->setHidden(true); listItem->setData(ProgressItemDelegate::ShowProgressRole, false); } resetProgress(); delete m_tmpFiles.take(docsetName); } void DocsetsDialog::extractionError(const QString &filePath, const QString &errorString) { const QString docsetName = docsetNameForTmpFilePath(filePath); QMessageBox::warning(this, QStringLiteral("Zeal"), tr("Cannot extract docset %1: %2").arg(docsetName, errorString)); QListWidgetItem *listItem = findDocsetListItem(docsetName); if (listItem) listItem->setData(ProgressItemDelegate::ShowProgressRole, false); delete m_tmpFiles.take(docsetName); } void DocsetsDialog::extractionProgress(const QString &filePath, qint64 extracted, qint64 total) { const QString docsetName = docsetNameForTmpFilePath(filePath); QListWidgetItem *listItem = findDocsetListItem(docsetName); if (listItem) listItem->setData(ProgressItemDelegate::ValueRole, percent(extracted, total)); } void DocsetsDialog::loadDocsetList() { loadUserFeedList(); const QFileInfo fi(cacheLocation(DocsetListCacheFileName)); if (!fi.exists() || fi.lastModified().msecsTo(QDateTime::currentDateTime()) > CacheTimeout) { downloadDocsetList(); return; } QScopedPointer file(new QFile(fi.filePath())); if (!file->open(QIODevice::ReadOnly)) { downloadDocsetList(); return; } QJsonParseError jsonError; const QJsonDocument jsonDoc = QJsonDocument::fromJson(file->readAll(), &jsonError); if (jsonError.error != QJsonParseError::NoError) { downloadDocsetList(); return; } // TODO: Show more user friendly labels, like "5 hours ago" ui->lastUpdatedLabel->setText(fi.lastModified().toString(Qt::SystemLocaleShortDate)); processDocsetList(jsonDoc.array()); } void DocsetsDialog::setupInstalledDocsetsTab() { using Registry::ListModel; ui->installedDocsetList->setItemDelegate(new DocsetListItemDelegate(this)); ui->installedDocsetList->setModel(new ListModel(m_application->docsetRegistry(), this)); if (m_isStorageReadOnly) { return; } connect(ui->installedDocsetList, &QListView::activated, this, [this](const QModelIndex &index) { if (!index.data(Registry::ItemDataRole::UpdateAvailableRole).toBool()) { return; } downloadDashDocset(index); }); QItemSelectionModel *selectionModel = ui->installedDocsetList->selectionModel(); connect(selectionModel, &QItemSelectionModel::selectionChanged, [this, selectionModel]() { ui->removeDocsetsButton->setEnabled(selectionModel->hasSelection()); for (const QModelIndex &index : selectionModel->selectedRows()) { if (index.data(Registry::ItemDataRole::UpdateAvailableRole).toBool()) { ui->updateSelectedDocsetsButton->setEnabled(true); return; } } ui->updateSelectedDocsetsButton->setEnabled(false); }); connect(ui->addFeedButton, &QPushButton::clicked, this, &DocsetsDialog::addDashFeed); connect(ui->updateSelectedDocsetsButton, &QPushButton::clicked, this, &DocsetsDialog::updateSelectedDocsets); connect(ui->updateAllDocsetsButton, &QPushButton::clicked, this, &DocsetsDialog::updateAllDocsets); connect(ui->removeDocsetsButton, &QPushButton::clicked, this, &DocsetsDialog::removeSelectedDocsets); } void DocsetsDialog::setupAvailableDocsetsTab() { using Registry::DocsetRegistry; ui->availableDocsetList->setItemDelegate(new ProgressItemDelegate(this)); connect(m_docsetRegistry, &DocsetRegistry::docsetUnloaded, this, [this](const QString name) { QListWidgetItem *item = findDocsetListItem(name); if (!item) return; item->setHidden(false); }); connect(m_docsetRegistry, &DocsetRegistry::docsetLoaded, this, [this](const QString name) { QListWidgetItem *item = findDocsetListItem(name); if (!item) return; item->setHidden(true); }); connect(ui->refreshButton, &QPushButton::clicked, this, &DocsetsDialog::downloadDocsetList); connect(ui->docsetFilterInput, &QLineEdit::textEdited, this, &DocsetsDialog::updateDocsetFilter); if (m_isStorageReadOnly) { return; } connect(ui->availableDocsetList, &QListView::activated, this, [this](const QModelIndex &index) { // TODO: Cancel download if it's already in progress. if (index.data(ProgressItemDelegate::ShowProgressRole).toBool()) return; ui->availableDocsetList->selectionModel()->select(index, QItemSelectionModel::Deselect); QAbstractItemModel *model = ui->availableDocsetList->model(); model->setData(index, tr("Downloading: %p%"), ProgressItemDelegate::FormatRole); model->setData(index, 0, ProgressItemDelegate::ValueRole); model->setData(index, true, ProgressItemDelegate::ShowProgressRole); downloadDashDocset(index); }); QItemSelectionModel *selectionModel = ui->availableDocsetList->selectionModel(); connect(selectionModel, &QItemSelectionModel::selectionChanged, [this, selectionModel]() { for (const QModelIndex &index : selectionModel->selectedRows()) { if (!index.data(ProgressItemDelegate::ShowProgressRole).toBool()) { ui->downloadDocsetsButton->setEnabled(true); return; } } ui->downloadDocsetsButton->setEnabled(false); }); connect(ui->downloadDocsetsButton, &QPushButton::clicked, this, &DocsetsDialog::downloadSelectedDocsets); } void DocsetsDialog::enableControls() { // Available docsets ui->refreshButton->setEnabled(true); if (m_isStorageReadOnly) { return; } // Installed docsets ui->addFeedButton->setEnabled(true); QItemSelectionModel *selectionModel = ui->installedDocsetList->selectionModel(); bool hasSelectedUpdates = false; for (const QModelIndex &index : selectionModel->selectedRows()) { if (index.data(Registry::ItemDataRole::UpdateAvailableRole).toBool()) { hasSelectedUpdates = true; break; } } ui->updateSelectedDocsetsButton->setEnabled(hasSelectedUpdates); ui->updateAllDocsetsButton->setEnabled(updatesAvailable()); ui->removeDocsetsButton->setEnabled(selectionModel->hasSelection()); } void DocsetsDialog::disableControls() { // Installed docsets ui->addFeedButton->setEnabled(false); ui->updateSelectedDocsetsButton->setEnabled(false); ui->updateAllDocsetsButton->setEnabled(false); ui->downloadDocsetsButton->setEnabled(false); ui->removeDocsetsButton->setEnabled(false); // Available docsets ui->refreshButton->setEnabled(false); } QListWidgetItem *DocsetsDialog::findDocsetListItem(const QString &name) const { for (int i = 0; i < ui->availableDocsetList->count(); ++i) { QListWidgetItem *item = ui->availableDocsetList->item(i); if (item->data(Registry::ItemDataRole::DocsetNameRole).toString() == name) return item; } return nullptr; } bool DocsetsDialog::updatesAvailable() const { for (Registry::Docset *docset : m_docsetRegistry->docsets()) { if (docset->hasUpdate) return true; } return false; } QNetworkReply *DocsetsDialog::download(const QUrl &url) { QNetworkReply *reply = m_application->download(url); connect(reply, &QNetworkReply::downloadProgress, this, &DocsetsDialog::downloadProgress); connect(reply, &QNetworkReply::finished, this, &DocsetsDialog::downloadCompleted); m_replies.append(reply); disableControls(); updateCombinedProgress(); return reply; } void DocsetsDialog::cancelDownloads() { for (QNetworkReply *reply : m_replies) { // Hide progress bar QListWidgetItem *listItem = ui->availableDocsetList->item(reply->property(ListItemIndexProperty).toInt()); if (listItem) listItem->setData(ProgressItemDelegate::ShowProgressRole, false); if (reply->property(DownloadTypeProperty).toInt() == DownloadDocset) delete m_tmpFiles.take(reply->property(DocsetNameProperty).toString()); reply->abort(); } resetProgress(); } void DocsetsDialog::loadUserFeedList() { for (Registry::Docset *docset : m_docsetRegistry->docsets()) { if (!docset->feedUrl().isEmpty()) { QNetworkReply *reply = download(QUrl(docset->feedUrl())); reply->setProperty(DownloadTypeProperty, DownloadDashFeed); } } } void DocsetsDialog::downloadDocsetList() { ui->availableDocsetList->clear(); m_availableDocsets.clear(); QNetworkReply *reply = download(QUrl(ApiServerUrl + QLatin1String("/docsets"))); reply->setProperty(DownloadTypeProperty, DownloadDocsetList); } void DocsetsDialog::processDocsetList(const QJsonArray &list) { for (const QJsonValue &v : list) { QJsonObject docsetJson = v.toObject(); Registry::DocsetMetadata metadata(docsetJson); m_availableDocsets.insert(metadata.name(), metadata); } // TODO: Move into dedicated method for (const Registry::DocsetMetadata &metadata : m_availableDocsets) { QListWidgetItem *listItem = new QListWidgetItem(metadata.icon(), metadata.title(), ui->availableDocsetList); listItem->setData(Registry::ItemDataRole::DocsetNameRole, metadata.name()); if (m_docsetRegistry->contains(metadata.name())) { listItem->setHidden(true); Registry::Docset *docset = m_docsetRegistry->docset(metadata.name()); if (metadata.latestVersion() != docset->version() || metadata.revision() > docset->revision()) { docset->hasUpdate = true; if (!m_isStorageReadOnly) { ui->updateAllDocsetsButton->setEnabled(true); } } } } ui->installedDocsetList->reset(); } void DocsetsDialog::downloadDashDocset(const QModelIndex &index) { const QString name = index.data(Registry::ItemDataRole::DocsetNameRole).toString(); if (!m_availableDocsets.contains(name) && !m_userFeeds.contains(name)) return; QUrl url; if (!m_userFeeds.contains(name)) { // No feed present means that this is a Kapeli docset QString urlString = RedirectServerUrl + QString("/d/com.kapeli/%1/latest"); url = QUrl(urlString.arg(name)); } else { url = m_userFeeds[name].url(); } QNetworkReply *reply = download(url); reply->setProperty(DocsetNameProperty, name); reply->setProperty(DownloadTypeProperty, DownloadDocset); reply->setProperty(ListItemIndexProperty, ui->availableDocsetList->row(findDocsetListItem(name))); } void DocsetsDialog::removeDocset(const QString &name) { if (m_docsetRegistry->contains(name)) { m_docsetRegistry->unloadDocset(name); } const QString docsetPath = QDir(m_application->settings()->docsetPath).filePath(name + QLatin1String(".docset")); if (!m_application->fileManager()->removeRecursively(docsetPath)) { const QString error = tr("Cannot remove directory %1! It might be in use" " by another process.").arg(docsetPath); QMessageBox::warning(this, QStringLiteral("Zeal"), error); return; } QListWidgetItem *listItem = findDocsetListItem(name); if (listItem) { listItem->setHidden(false); } } void DocsetsDialog::updateCombinedProgress() { if (m_replies.isEmpty()) { resetProgress(); return; } ui->combinedProgressBar->show(); ui->combinedProgressBar->setValue(percent(m_combinedReceived, m_combinedTotal)); ui->cancelButton->show(); } void DocsetsDialog::resetProgress() { if (!m_replies.isEmpty()) return; ui->cancelButton->hide(); ui->combinedProgressBar->hide(); ui->combinedProgressBar->setValue(0); m_combinedReceived = 0; m_combinedTotal = 0; enableControls(); } QString DocsetsDialog::docsetNameForTmpFilePath(const QString &filePath) const { for (auto it = m_tmpFiles.cbegin(), end = m_tmpFiles.cend(); it != end; ++it) { if (it.value()->fileName() == filePath) { return it.key(); } } return QString(); } int DocsetsDialog::percent(qint64 fraction, qint64 total) { if (!total) return 0; return static_cast(fraction / static_cast(total) * 100); } QString DocsetsDialog::cacheLocation(const QString &fileName) { return QDir(Core::FileManager::cacheLocation()).filePath(fileName); } zeal-0.6.1/src/libs/ui/docsetsdialog.h000066400000000000000000000071541335333561500176210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_DOCSETSDIALOG_H #define ZEAL_WIDGETUI_DOCSETSDIALOG_H #include #include #include #include class QListWidgetItem; class QNetworkReply; class QTemporaryFile; class QUrl; namespace Zeal { namespace Registry { class DocsetRegistry; } // namespace Registry namespace Core { class Application; } namespace WidgetUi { namespace Ui { class DocsetsDialog; } // namespace Ui class DocsetsDialog : public QDialog { Q_OBJECT public: explicit DocsetsDialog(Core::Application *app, QWidget *parent = nullptr); ~DocsetsDialog() override; void reject() override; private slots: void addDashFeed(); void updateSelectedDocsets(); void updateAllDocsets(); void removeSelectedDocsets(); void updateDocsetFilter(const QString &filterString); void downloadSelectedDocsets(); void downloadCompleted(); void downloadProgress(qint64 received, qint64 total); void extractionCompleted(const QString &filePath); void extractionError(const QString &filePath, const QString &errorString); void extractionProgress(const QString &filePath, qint64 extracted, qint64 total); void loadDocsetList(); private: enum DownloadType { DownloadDashFeed, DownloadDocset, DownloadDocsetList }; Ui::DocsetsDialog *ui = nullptr; Core::Application *m_application = nullptr; Registry::DocsetRegistry *m_docsetRegistry = nullptr; bool m_isStorageReadOnly = false; QList m_replies; qint64 m_combinedTotal = 0; qint64 m_combinedReceived = 0; // TODO: Create a special model QMap m_availableDocsets; QMap m_userFeeds; QHash m_tmpFiles; void setupInstalledDocsetsTab(); void setupAvailableDocsetsTab(); void enableControls(); void disableControls(); QListWidgetItem *findDocsetListItem(const QString &name) const; bool updatesAvailable() const; QNetworkReply *download(const QUrl &url); void cancelDownloads(); void loadUserFeedList(); void downloadDocsetList(); void processDocsetList(const QJsonArray &list); void downloadDashDocset(const QModelIndex &index); void removeDocset(const QString &name); void updateCombinedProgress(); void resetProgress(); // FIXME: Come up with a better approach QString docsetNameForTmpFilePath(const QString &filePath) const; static inline int percent(qint64 fraction, qint64 total); static QString cacheLocation(const QString &fileName); }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_DOCSETSDIALOG_H zeal-0.6.1/src/libs/ui/docsetsdialog.ui000066400000000000000000000167411335333561500200110ustar00rootroot00000000000000 Zeal::WidgetUi::DocsetsDialog Qt::ApplicationModal 0 0 600 500 Docsets 0 Installed QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows 16 16 Add feed Qt::Horizontal 40 20 false Update false Update all false Remove Available Filter docsets true QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows 16 16 Last updated: Refresh Qt::Horizontal 40 20 false Download <i>Docsets are provided by <a href="https://kapeli.com/dash">Dash</a>.</i> Qt::RichText true 100 0 Cancel <b>Docset storage is read only.</b> QDialogButtonBox::Close buttonBox accepted() Zeal::WidgetUi::DocsetsDialog accept() 248 254 157 274 buttonBox rejected() Zeal::WidgetUi::DocsetsDialog reject() 316 260 286 274 zeal-0.6.1/src/libs/ui/mainwindow.cpp000066400000000000000000000743161335333561500175100ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "mainwindow.h" #include "ui_mainwindow.h" #include "aboutdialog.h" #include "docsetsdialog.h" #include "searchitemdelegate.h" #include "settingsdialog.h" #include "webbridge.h" #include "qxtglobalshortcut/qxtglobalshortcut.h" #include "widgets/webviewtab.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Zeal; using namespace Zeal::WidgetUi; namespace { const char WelcomePageUrl[] = "qrc:///browser/welcome.html"; const char WelcomePageNoAdUrl[] = "qrc:///browser/welcome-noad.html"; const char DarkModeCssUrl[] = ":/browser/assets/css/darkmode.css"; const char HighlightOnNavigateCssUrl[] = ":/browser/assets/css/highlight.css"; } namespace Zeal { namespace WidgetUi { struct TabState { explicit TabState() { searchModel = new Registry::SearchModel(); tocModel = new Registry::SearchModel(); widget = new WebViewTab(); } TabState(const TabState &other) : searchQuery(other.searchQuery) , selections(other.selections) , expansions(other.expansions) , searchScrollPosition(other.searchScrollPosition) , tocScrollPosition(other.tocScrollPosition) { searchModel = new Registry::SearchModel(*other.searchModel); tocModel = new Registry::SearchModel(*other.tocModel); widget = new WebViewTab(); restoreHistory(other.saveHistory()); } ~TabState() { delete searchModel; delete tocModel; widget->deleteLater(); } void restoreHistory(const QByteArray &array) const { QDataStream stream(array); stream >> *widget->history(); } QByteArray saveHistory() const { QByteArray array; QDataStream stream(&array, QIODevice::WriteOnly); stream << *widget->history(); return array; } void goToStartPage() { if (Core::Application::instance()->settings()->isAdDisabled) { widget->load(QUrl(WelcomePageNoAdUrl)); } else { widget->load(QUrl(WelcomePageUrl)); } } QString searchQuery; // Content/Search results tree view state Registry::SearchModel *searchModel = nullptr; QModelIndexList selections; QModelIndexList expansions; int searchScrollPosition = 0; // TOC list view state Registry::SearchModel *tocModel = nullptr; int tocScrollPosition = 0; WebViewTab *widget = nullptr; }; } // namespace WidgetUi } // namespace Zeal MainWindow::MainWindow(Core::Application *app, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_application(app), m_settings(app->settings()), m_zealListModel(new Registry::ListModel(app->docsetRegistry(), this)), m_globalShortcut(new QxtGlobalShortcut(m_settings->showShortcut, this)), m_openDocsetTimer(new QTimer(this)) { ui->setupUi(this); // initialise key grabber connect(m_globalShortcut, &QxtGlobalShortcut::activated, this, &MainWindow::toggleWindow); setupTabBar(); // Setup application wide shortcuts. // Focus search bar. QShortcut *shortcut = new QShortcut(QStringLiteral("Ctrl+K"), this); connect(shortcut, &QShortcut::activated, ui->lineEdit, static_cast(&SearchEdit::setFocus)); shortcut = new QShortcut(QStringLiteral("Ctrl+L"), this); connect(shortcut, &QShortcut::activated, ui->lineEdit, static_cast(&SearchEdit::setFocus)); // Duplicate current tab. shortcut = new QShortcut(QStringLiteral("Ctrl+Alt+T"), this); connect(shortcut, &QShortcut::activated, this, [this]() { duplicateTab(m_tabBar->currentIndex()); }); restoreGeometry(m_settings->windowGeometry); ui->splitter->restoreState(m_settings->verticalSplitterGeometry); // Menu // File // Some platform plugins do not define QKeySequence::Quit. if (QKeySequence(QKeySequence::Quit).isEmpty()) ui->actionQuit->setShortcut(QStringLiteral("Ctrl+Q")); else ui->actionQuit->setShortcut(QKeySequence::Quit); // Follow Windows HIG. #ifdef Q_OS_WIN32 ui->actionQuit->setText(tr("E&xit")); #endif connect(ui->actionQuit, &QAction::triggered, qApp, &QCoreApplication::quit); // Edit ui->actionFind->setShortcut(QKeySequence::Find); connect(ui->actionFind, &QAction::triggered, this, [this]() { currentTab()->activateSearchBar(); }); if (QKeySequence(QKeySequence::Preferences).isEmpty()) { ui->actionPreferences->setShortcut(QStringLiteral("Ctrl+,")); } else { ui->actionPreferences->setShortcut(QKeySequence::Preferences); } connect(ui->actionPreferences, &QAction::triggered, [this]() { m_globalShortcut->setEnabled(false); QScopedPointer dialog(new SettingsDialog(this)); dialog->exec(); m_globalShortcut->setEnabled(true); }); ui->actionBack->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowBack)); ui->actionBack->setShortcut(QKeySequence::Back); connect(ui->actionBack, &QAction::triggered, this, [this]() { currentTab()->back(); }); addAction(ui->actionBack); ui->actionForward->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowForward)); ui->actionForward->setShortcut(QKeySequence::Forward); connect(ui->actionForward, &QAction::triggered, this, [this]() { currentTab()->forward(); }); addAction(ui->actionForward); // Tools Menu connect(ui->actionDocsets, &QAction::triggered, [this]() { QScopedPointer dialog(new DocsetsDialog(m_application, this)); dialog->exec(); }); // Help Menu connect(ui->actionSubmitFeedback, &QAction::triggered, [this]() { QDesktopServices::openUrl(QUrl(QStringLiteral("https://github.com/zealdocs/zeal/issues"))); }); connect(ui->actionCheckForUpdates, &QAction::triggered, m_application, &Core::Application::checkForUpdates); connect(ui->actionAboutZeal, &QAction::triggered, [this]() { QScopedPointer dialog(new AboutDialog(this)); dialog->exec(); }); // Update check connect(m_application, &Core::Application::updateCheckError, [this](const QString &message) { QMessageBox::warning(this, QStringLiteral("Zeal"), message); }); connect(m_application, &Core::Application::updateCheckDone, [this](const QString &version) { if (version.isEmpty()) { QMessageBox::information(this, QStringLiteral("Zeal"), tr("You are using the latest version.")); return; } // TODO: Remove this ugly workaround for #637. qApp->setQuitOnLastWindowClosed(false); const int ret = QMessageBox::information(this, QStringLiteral("Zeal"), tr("Zeal %1 is available. Open download page?").arg(version), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape); qApp->setQuitOnLastWindowClosed(true); if (ret == QMessageBox::Yes) { QDesktopServices::openUrl(QUrl(QStringLiteral("https://zealdocs.org/download.html"))); } }); m_backMenu = new QMenu(ui->backButton); connect(m_backMenu, &QMenu::aboutToShow, this, [this]() { m_backMenu->clear(); QWebHistory *history = currentTab()->history(); QList items = history->backItems(10); #if QT_VERSION >= 0x050600 for (auto it = items.crbegin(); it != items.crend(); ++it) { #else for (auto it = items.cend() - 1; it >= items.cbegin(); --it) { #endif const QIcon icon = docsetIcon(docsetName(it->url())); const QWebHistoryItem item = *it; #if QT_VERSION >= 0x050600 m_backMenu->addAction(icon, it->title(), [=](bool) { history->goToItem(item); }); #else QAction *action = m_backMenu->addAction(icon, it->title()); connect(action, &QAction::triggered, [=](bool) { history->goToItem(item); }); #endif } }); ui->backButton->setDefaultAction(ui->actionBack); ui->backButton->setMenu(m_backMenu); m_forwardMenu = new QMenu(ui->forwardButton); connect(m_forwardMenu, &QMenu::aboutToShow, this, [this]() { m_forwardMenu->clear(); QWebHistory *history = currentTab()->history(); for (const QWebHistoryItem &item: history->forwardItems(10)) { const QIcon icon = docsetIcon(docsetName(item.url())); #if QT_VERSION >= 0x050600 m_forwardMenu->addAction(icon, item.title(), [=](bool) { history->goToItem(item); }); #else QAction *action = m_forwardMenu->addAction(icon, item.title()); connect(action, &QAction::triggered, [=](bool) { history->goToItem(item); }); #endif } }); ui->forwardButton->setDefaultAction(ui->actionForward); ui->forwardButton->setMenu(m_forwardMenu); // Set default stretch factor. ui->splitter->setStretchFactor(1, 2); // treeView and lineEdit ui->lineEdit->setTreeView(ui->treeView); ui->lineEdit->setFocus(); setupSearchBoxCompletions(); SearchItemDelegate *delegate = new SearchItemDelegate(ui->treeView); delegate->setDecorationRoles({Registry::ItemDataRole::DocsetIconRole, Qt::DecorationRole}); connect(ui->lineEdit, &QLineEdit::textChanged, [delegate](const QString &text) { delegate->setHighlight(Registry::SearchQuery::fromString(text).query()); }); ui->treeView->setItemDelegate(delegate); ui->tocListView->setItemDelegate(new SearchItemDelegate(ui->tocListView)); connect(ui->tocSplitter, &QSplitter::splitterMoved, this, [this]() { m_settings->tocSplitterState = ui->tocSplitter->saveState(); }); m_webBridge = new WebBridge(this); connect(m_webBridge, &WebBridge::actionTriggered, this, [this](const QString &action) { // TODO: In the future connect directly to the ActionManager. if (action == "openDocsetManager") { ui->actionDocsets->trigger(); } else if (action == "openPreferences") { ui->actionPreferences->trigger(); } }); createTab(); connect(ui->treeView, &QTreeView::clicked, this, &MainWindow::openDocset); connect(ui->tocListView, &QListView::clicked, this, &MainWindow::openDocset); connect(ui->treeView, &QTreeView::activated, this, &MainWindow::openDocset); connect(ui->tocListView, &QListView::activated, this, &MainWindow::openDocset); connect(m_application->docsetRegistry(), &Registry::DocsetRegistry::searchCompleted, this, [this](const QList &results) { currentTabState()->searchModel->setResults(results); }); connect(m_application->docsetRegistry(), &Registry::DocsetRegistry::docsetAboutToBeUnloaded, this, [this](const QString &name) { for (TabState *tabState : m_tabStates) { if (tabState == currentTabState()) { // Disable updates because removeSearchResultWithName can // call {begin,end}RemoveRows multiple times, and cause // degradation of UI responsiveness. ui->treeView->setUpdatesEnabled(false); tabState->searchModel->removeSearchResultWithName(name); ui->treeView->setUpdatesEnabled(true); } else { tabState->searchModel->removeSearchResultWithName(name); } if (docsetName(tabState->widget->url()) == name) { tabState->tocModel->setResults(); // TODO: Add custom 'Page has been removed' page. tabState->goToStartPage(); } // TODO: Cleanup history } setupSearchBoxCompletions(); }); connect(m_application->docsetRegistry(), &Registry::DocsetRegistry::docsetLoaded, this, [this](const QString &) { setupSearchBoxCompletions(); }); connect(ui->lineEdit, &QLineEdit::textChanged, [this](const QString &text) { if (text == currentTabState()->searchQuery) return; currentTabState()->searchQuery = text; m_application->docsetRegistry()->search(text); }); // Setup delayed navigation to a page until user makes a pause in typing a search query. m_openDocsetTimer->setInterval(400); m_openDocsetTimer->setSingleShot(true); connect(m_openDocsetTimer, &QTimer::timeout, this, [this]() { QModelIndex index = m_openDocsetTimer->property("index").toModelIndex(); if (!index.isValid()) return; openDocset(index); // Get focus back. ui->lineEdit->setFocus(Qt::MouseFocusReason); }); ui->actionNewTab->setShortcut(QKeySequence::AddTab); connect(ui->actionNewTab, &QAction::triggered, this, [this]() { createTab(); }); addAction(ui->actionNewTab); connect(m_tabBar, &QTabBar::tabBarDoubleClicked, this, [this](int index) { if (index == -1) createTab(); }); // Save expanded items connect(ui->treeView, &QTreeView::expanded, [this](QModelIndex index) { if (currentTabState()->expansions.indexOf(index) == -1) currentTabState()->expansions.append(index); }); connect(ui->treeView, &QTreeView::collapsed, [this](QModelIndex index) { currentTabState()->expansions.removeOne(index); }); #ifdef Q_OS_WIN32 ui->actionCloseTab->setShortcut(QKeySequence(Qt::Key_W + Qt::CTRL)); #else ui->actionCloseTab->setShortcut(QKeySequence::Close); #endif addAction(ui->actionCloseTab); connect(ui->actionCloseTab, &QAction::triggered, this, [this]() { closeTab(); }); ui->actionNextTab->setShortcuts({QKeySequence::NextChild, QKeySequence(Qt::ControlModifier| Qt::Key_PageDown)}); addAction(ui->actionNextTab); connect(ui->actionNextTab, &QAction::triggered, [this]() { m_tabBar->setCurrentIndex((m_tabBar->currentIndex() + 1) % m_tabBar->count()); }); // TODO: Use QKeySequence::PreviousChild, when QTBUG-15746 is fixed. ui->actionPreviousTab->setShortcuts({QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Tab), QKeySequence(Qt::ControlModifier| Qt::Key_PageUp)}); addAction(ui->actionPreviousTab); connect(ui->actionPreviousTab, &QAction::triggered, [this]() { m_tabBar->setCurrentIndex((m_tabBar->currentIndex() - 1 + m_tabBar->count()) % m_tabBar->count()); }); #ifdef Q_OS_OSX ui->treeView->setAttribute(Qt::WA_MacShowFocusRect, false); ui->tocListView->setAttribute(Qt::WA_MacShowFocusRect, false); #endif connect(m_settings, &Core::Settings::updated, this, &MainWindow::applySettings); applySettings(); if (m_settings->checkForUpdate) m_application->checkForUpdates(true); } MainWindow::~MainWindow() { m_settings->verticalSplitterGeometry = ui->splitter->saveState(); m_settings->windowGeometry = saveGeometry(); // Delete the UI first, because it depends on tab states. delete ui; qDeleteAll(m_tabStates); } void MainWindow::search(const Registry::SearchQuery &query) { if (query.isEmpty()) return; ui->lineEdit->setText(query.toString()); emit ui->treeView->activated(ui->treeView->currentIndex()); } void MainWindow::openDocset(const QModelIndex &index) { const QVariant url = index.data(Registry::ItemDataRole::UrlRole); if (url.isNull()) return; currentTab()->load(url.toUrl()); currentTab()->focus(); } QString MainWindow::docsetName(const QUrl &url) const { const QRegExp docsetRegex(QStringLiteral("/([^/]+)[.]docset")); return docsetRegex.indexIn(url.path()) != -1 ? docsetRegex.cap(1) : QString(); } QIcon MainWindow::docsetIcon(const QString &docsetName) const { Registry::Docset *docset = m_application->docsetRegistry()->docset(docsetName); return docset ? docset->icon() : QIcon(QStringLiteral(":/icons/logo/icon.png")); } void MainWindow::queryCompleted() { m_openDocsetTimer->stop(); syncTreeView(); ui->treeView->setCurrentIndex(currentTabState()->searchModel->index(0, 0, QModelIndex())); m_openDocsetTimer->setProperty("index", ui->treeView->currentIndex()); m_openDocsetTimer->start(); } void MainWindow::closeTab(int index) { if (index == -1) index = m_tabBar->currentIndex(); if (index == -1) return; TabState *state = m_tabStates.takeAt(index); ui->webViewStack->removeWidget(state->widget); // Handle the tab bar last to avoid currentChanged signal coming too early. m_tabBar->removeTab(index); delete state; if (m_tabStates.isEmpty()) createTab(); } void MainWindow::moveTab(int from, int to) { m_tabStates.swap(from, to); const QSignalBlocker blocker(ui->webViewStack); QWidget *w = ui->webViewStack->widget(from); ui->webViewStack->removeWidget(w); ui->webViewStack->insertWidget(to, w); } WebViewTab *MainWindow::createTab(int index) { if (m_settings->openNewTabAfterActive) index = m_tabBar->currentIndex() + 1; else if (index == -1) index = m_tabStates.size(); TabState *newState = new TabState(); newState->widget->setWebBridgeObject("zAppBridge", m_webBridge); newState->goToStartPage(); m_tabStates.insert(index, newState); ui->webViewStack->insertWidget(index, newState->widget); m_tabBar->insertTab(index, tr("Loading...")); m_tabBar->setCurrentIndex(index); ui->lineEdit->setFocus(); return newState->widget; } void MainWindow::duplicateTab(int index) { if (index < 0 || index >= m_tabStates.size()) return; TabState *tabState = m_tabStates.at(index); syncTabState(tabState); TabState *newState = new TabState(*tabState); newState->widget->setWebBridgeObject("zAppBridge", m_webBridge); ++index; m_tabStates.insert(index, newState); ui->webViewStack->insertWidget(index, newState->widget); m_tabBar->insertTab(index, newState->widget->title()); m_tabBar->setCurrentIndex(index); } void MainWindow::syncTreeView() { QItemSelectionModel *oldSelectionModel = ui->treeView->selectionModel(); TabState *tabState = currentTabState(); if (tabState->searchQuery.isEmpty()) { ui->treeView->setModel(m_zealListModel); ui->treeView->setRootIsDecorated(true); } else { ui->treeView->setModel(tabState->searchModel); ui->treeView->setRootIsDecorated(false); } // TODO: Remove once QTBUG-49966 is addressed. QItemSelectionModel *newSelectionModel = ui->treeView->selectionModel(); if (oldSelectionModel && newSelectionModel != oldSelectionModel) { oldSelectionModel->deleteLater(); } ui->treeView->reset(); } void MainWindow::syncToc() { if (!currentTabState()->tocModel->isEmpty()) { ui->tocListView->show(); ui->tocSplitter->restoreState(m_settings->tocSplitterState); } else { ui->tocListView->hide(); } } TabState *MainWindow::currentTabState() const { return m_tabStates.at(m_tabBar->currentIndex()); } WebViewTab *MainWindow::currentTab() const { return qobject_cast(ui->webViewStack->currentWidget()); } void MainWindow::attachTab(TabState *tabState) { using Registry::SearchModel; connect(tabState->searchModel, &SearchModel::updated, this, &MainWindow::queryCompleted); connect(tabState->tocModel, &SearchModel::updated, this, &MainWindow::syncToc); connect(tabState->widget, &WebViewTab::urlChanged, this, [this, tabState](const QUrl &url) { const QString name = docsetName(url); m_tabBar->setTabIcon(m_tabBar->currentIndex(), docsetIcon(name)); Registry::Docset *docset = m_application->docsetRegistry()->docset(name); if (docset) tabState->tocModel->setResults(docset->relatedLinks(url)); ui->actionBack->setEnabled(tabState->widget->canGoBack()); ui->actionForward->setEnabled(tabState->widget->canGoForward()); }); connect(tabState->widget, &WebViewTab::titleChanged, this, [this](const QString &title) { if (title.isEmpty()) return; #ifndef PORTABLE_BUILD setWindowTitle(QStringLiteral("%1 - Zeal").arg(title)); #else setWindowTitle(QStringLiteral("%1 - Zeal Portable").arg(title)); #endif m_tabBar->setTabText(m_tabBar->currentIndex(), title); m_tabBar->setTabToolTip(m_tabBar->currentIndex(), title); }); ui->lineEdit->setText(tabState->searchQuery); ui->tocListView->setModel(tabState->tocModel); syncTreeView(); syncToc(); // Bring back the selections and expansions ui->treeView->blockSignals(true); for (const QModelIndex &selection: tabState->selections) ui->treeView->selectionModel()->select(selection, QItemSelectionModel::Select); for (const QModelIndex &expandedIndex: tabState->expansions) ui->treeView->expand(expandedIndex); ui->treeView->blockSignals(false); ui->actionBack->setEnabled(tabState->widget->canGoBack()); ui->actionForward->setEnabled(tabState->widget->canGoForward()); ui->treeView->verticalScrollBar()->setValue(tabState->searchScrollPosition); ui->tocListView->verticalScrollBar()->setValue(tabState->tocScrollPosition); } void MainWindow::detachTab(TabState *tabState) { tabState->searchModel->disconnect(this); tabState->tocModel->disconnect(this); tabState->widget->disconnect(this); } // Sets up the search box autocompletions. void MainWindow::setupSearchBoxCompletions() { QStringList completions; for (const Registry::Docset * const docset: m_application->docsetRegistry()->docsets()) { if (docset->keywords().isEmpty()) continue; completions << docset->keywords().first() + QLatin1Char(':'); } ui->lineEdit->setCompletions(completions); } void MainWindow::setupTabBar() { m_tabBar = new QTabBar(this); m_tabBar->installEventFilter(this); m_tabBar->setTabsClosable(true); m_tabBar->setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab); m_tabBar->setExpanding(false); m_tabBar->setUsesScrollButtons(true); m_tabBar->setDrawBase(false); m_tabBar->setDocumentMode(true); m_tabBar->setElideMode(Qt::ElideRight); m_tabBar->setStyleSheet(QStringLiteral("QTabBar::tab { width: 150px; }")); m_tabBar->setMovable(true); connect(m_tabBar, &QTabBar::currentChanged, this, [this](int index) { static const char PreviousTabState[] = "previousTabState"; if (index == -1) return; // Save previous tab state. Using 'void *' to avoid Q_DECLARE_METATYPE. TabState *previousTabState = static_cast(m_tabBar->property(PreviousTabState).value()); if (m_tabStates.contains(previousTabState)) { syncTabState(previousTabState); detachTab(previousTabState); } // Load current tab state TabState *tabState = m_tabStates.at(index); m_tabBar->setProperty(PreviousTabState, qVariantFromValue(static_cast(tabState))); attachTab(tabState); ui->webViewStack->setCurrentIndex(index); }); connect(m_tabBar, &QTabBar::tabCloseRequested, this, &MainWindow::closeTab); connect(m_tabBar, &QTabBar::tabMoved, this, &MainWindow::moveTab); for (int i = 1; i < 10; i++) { QAction *action = new QAction(m_tabBar); #ifdef Q_OS_LINUX action->setShortcut(QStringLiteral("Alt+%1").arg(i)); #else action->setShortcut(QStringLiteral("Ctrl+%1").arg(i)); #endif if (i == 9) { connect(action, &QAction::triggered, [=]() { m_tabBar->setCurrentIndex(m_tabBar->count() - 1); }); } else { connect(action, &QAction::triggered, [=]() { m_tabBar->setCurrentIndex(i - 1); }); } addAction(action); } QHBoxLayout *layout = static_cast(ui->navigationBar->layout()); layout->insertWidget(2, m_tabBar, 0, Qt::AlignBottom); } void MainWindow::createTrayIcon() { if (m_trayIcon) return; m_trayIcon = new QSystemTrayIcon(this); m_trayIcon->setIcon(QIcon::fromTheme(QStringLiteral("zeal-tray"), windowIcon())); m_trayIcon->setToolTip(QStringLiteral("Zeal")); connect(m_trayIcon, &QSystemTrayIcon::activated, [this](QSystemTrayIcon::ActivationReason reason) { if (reason != QSystemTrayIcon::Trigger && reason != QSystemTrayIcon::DoubleClick) return; toggleWindow(); }); QMenu *trayIconMenu = new QMenu(this); #if QT_VERSION >= 0x050600 QAction *toggleAction = trayIconMenu->addAction(tr("Show Zeal"), this, &MainWindow::toggleWindow); #else QAction *toggleAction = trayIconMenu->addAction(tr("Show Zeal")); connect(toggleAction, &QAction::triggered, this, &MainWindow::toggleWindow); #endif connect(trayIconMenu, &QMenu::aboutToShow, this, [this, toggleAction]() { toggleAction->setText(isVisible() ? tr("Minimize to Tray") : tr("Show Zeal")); }); trayIconMenu->addSeparator(); trayIconMenu->addAction(ui->actionQuit); m_trayIcon->setContextMenu(trayIconMenu); m_trayIcon->show(); } void MainWindow::removeTrayIcon() { if (!m_trayIcon) return; QMenu *trayIconMenu = m_trayIcon->contextMenu(); delete m_trayIcon; m_trayIcon = nullptr; delete trayIconMenu; } void MainWindow::syncTabState(TabState *tabState) { tabState->selections = ui->treeView->selectionModel()->selectedIndexes(); tabState->searchScrollPosition = ui->treeView->verticalScrollBar()->value(); tabState->tocScrollPosition = ui->tocListView->verticalScrollBar()->value(); } void MainWindow::bringToFront() { show(); setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); raise(); activateWindow(); ui->lineEdit->setFocus(); } void MainWindow::changeEvent(QEvent *event) { if (m_settings->showSystrayIcon && m_settings->minimizeToSystray && event->type() == QEvent::WindowStateChange && isMinimized()) { hide(); } QMainWindow::changeEvent(event); } void MainWindow::closeEvent(QCloseEvent *event) { if (m_settings->showSystrayIcon && m_settings->hideOnClose) { event->ignore(); toggleWindow(); } } bool MainWindow::eventFilter(QObject *object, QEvent *event) { if (object == m_tabBar) { switch (event->type()) { case QEvent::MouseButtonRelease: { QMouseEvent *e = static_cast(event); if (e->button() == Qt::MiddleButton) { const int index = m_tabBar->tabAt(e->pos()); if (index != -1) { closeTab(index); return true; } } break; } case QEvent::Wheel: // TODO: Remove in case QTBUG-8428 is fixed on all platforms return true; default: break; } } return QMainWindow::eventFilter(object, event); } // Captures global events in order to pass them to the search bar. void MainWindow::keyPressEvent(QKeyEvent *keyEvent) { switch (keyEvent->key()) { case Qt::Key_Escape: ui->lineEdit->setFocus(); ui->lineEdit->clearQuery(); break; case Qt::Key_Question: ui->lineEdit->setFocus(); ui->lineEdit->selectQuery(); break; default: QMainWindow::keyPressEvent(keyEvent); break; } } void MainWindow::applySettings() { m_globalShortcut->setShortcut(m_settings->showShortcut); if (m_settings->showSystrayIcon) createTrayIcon(); else removeTrayIcon(); // Content QByteArray ba = QByteArrayLiteral("body { background-color: white; }"); if (m_settings->darkModeEnabled) { QScopedPointer file(new QFile(DarkModeCssUrl)); if (file->open(QIODevice::ReadOnly)) { ba += file->readAll(); } } if (m_settings->highlightOnNavigateEnabled) { QScopedPointer file(new QFile(HighlightOnNavigateCssUrl)); if (file->open(QIODevice::ReadOnly)) { ba += file->readAll(); } } if (QFileInfo::exists(m_settings->customCssFile)) { QScopedPointer file(new QFile(m_settings->customCssFile)); if (file->open(QIODevice::ReadOnly)) { ba += file->readAll(); } } const QString cssUrl = QLatin1String("data:text/css;charset=utf-8;base64,") + ba.toBase64(); QWebSettings::globalSettings()->setUserStyleSheetUrl(QUrl(cssUrl)); QWebSettings::globalSettings()->setAttribute(QWebSettings::ScrollAnimatorEnabled, m_settings->isSmoothScrollingEnabled); } void MainWindow::toggleWindow() { const bool checkActive = sender() == m_globalShortcut; if (!isVisible() || (checkActive && !isActiveWindow())) { bringToFront(); } else { if (m_trayIcon) { hide(); } else { showMinimized(); } } } zeal-0.6.1/src/libs/ui/mainwindow.h000066400000000000000000000063051335333561500171460ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_MAINWINDOW_H #define ZEAL_WIDGETUI_MAINWINDOW_H #include class QxtGlobalShortcut; class QModelIndex; class QSystemTrayIcon; class QTabBar; class QTimer; namespace Zeal { namespace Core { class Application; class Settings; } // namespace Core namespace Registry { class ListModel; class SearchQuery; } //namespace Registry namespace WidgetUi { namespace Ui { class MainWindow; } // namespace Ui class WebBridge; class WebViewTab; struct TabState; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(Core::Application *app, QWidget *parent = nullptr); ~MainWindow() override; void search(const Registry::SearchQuery &query); void bringToFront(); WebViewTab *createTab(int index = -1); public slots: void toggleWindow(); protected: void changeEvent(QEvent *event) override; void closeEvent(QCloseEvent *event) override; bool eventFilter(QObject *object, QEvent *event) override; void keyPressEvent(QKeyEvent *keyEvent) override; private slots: void applySettings(); void openDocset(const QModelIndex &index); void queryCompleted(); void closeTab(int index = -1); void moveTab(int from, int to); void duplicateTab(int index); private: void syncTreeView(); void syncToc(); void setupSearchBoxCompletions(); void setupTabBar(); TabState *currentTabState() const; WebViewTab *currentTab() const; void attachTab(TabState *tabState); void detachTab(TabState *tabState); QString docsetName(const QUrl &url) const; QIcon docsetIcon(const QString &docsetName) const; void createTrayIcon(); void removeTrayIcon(); void syncTabState(TabState *tabState); QList m_tabStates; Ui::MainWindow *ui = nullptr; Core::Application *m_application = nullptr; Core::Settings *m_settings = nullptr; Registry::ListModel *m_zealListModel = nullptr; WebBridge *m_webBridge = nullptr; QMenu *m_backMenu = nullptr; QMenu *m_forwardMenu = nullptr; QxtGlobalShortcut *m_globalShortcut = nullptr; QTabBar *m_tabBar = nullptr; QSystemTrayIcon *m_trayIcon = nullptr; QTimer *m_openDocsetTimer = nullptr; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_MAINWINDOW_H zeal-0.6.1/src/libs/ui/mainwindow.ui000066400000000000000000000241521335333561500173340ustar00rootroot00000000000000 Zeal::WidgetUi::MainWindow 0 0 900 600 Zeal 0 0 0 0 0 Qt::Horizontal false 0 4 4 0 4 0 Enter your query true 150 0 Qt::Vertical QFrame::NoFrame true false QFrame::NoFrame Qt::ScrollBarAlwaysOff true 0 4 4 0 4 0 Go back one page QToolButton::menu-indicator { image: none; } true Go forward one page QToolButton::menu-indicator { image: none; } true Qt::Horizontal 40 20 600 0 0 0 900 20 &File &Help &Edit &Tools &Quit Prefere&nces About &Zeal false &Back false &Forward New &Tab &Close Tab Next Tab Previous Tab &Submit Feedback... &Check for updates... &Find &Docsets... SearchEdit QLineEdit
ui/widgets/searchedit.h
ToolBarFrame QWidget
ui/widgets/toolbarframe.h
1
zeal-0.6.1/src/libs/ui/progressitemdelegate.cpp000066400000000000000000000045231335333561500215430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "progressitemdelegate.h" #include #include using namespace Zeal::WidgetUi; ProgressItemDelegate::ProgressItemDelegate(QObject *parent) : QStyledItemDelegate(parent) { } void ProgressItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!index.model()->data(index, ShowProgressRole).toBool()) { QStyledItemDelegate::paint(painter, option, index); return; } bool ok; const int value = index.model()->data(index, ValueRole).toInt(&ok); if (!ok) { QStyledItemDelegate::paint(painter, option, index); return; } // Adjust maximum text width QStyleOptionViewItem styleOption = option; styleOption.rect.setRight(styleOption.rect.right() - progressBarWidth); // Size progress bar QScopedPointer renderer(new QProgressBar()); renderer->resize(progressBarWidth, styleOption.rect.height()); renderer->setRange(0, 100); renderer->setValue(value); const QString format = index.model()->data(index, FormatRole).toString(); if (!format.isEmpty()) renderer->setFormat(format); painter->save(); // Paint progress bar painter->translate(styleOption.rect.topRight()); renderer->render(painter); painter->restore(); QStyledItemDelegate::paint(painter, styleOption, index); } zeal-0.6.1/src/libs/ui/progressitemdelegate.h000066400000000000000000000031561335333561500212110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_PROGRESSITEMDELEGATE_H #define ZEAL_WIDGETUI_PROGRESSITEMDELEGATE_H #include namespace Zeal { namespace WidgetUi { class ProgressItemDelegate : public QStyledItemDelegate { Q_OBJECT public: enum ProgressRoles { ValueRole = Qt::UserRole + 10, FormatRole, ShowProgressRole }; explicit ProgressItemDelegate(QObject *parent = nullptr); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; private: static const int progressBarWidth = 150; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_PROGRESSITEMDELEGATE_H zeal-0.6.1/src/libs/ui/qxtglobalshortcut/000077500000000000000000000000001335333561500204065ustar00rootroot00000000000000zeal-0.6.1/src/libs/ui/qxtglobalshortcut/CMakeLists.txt000066400000000000000000000021161335333561500231460ustar00rootroot00000000000000list(APPEND QxtGlobalShortcut_SOURCES qxtglobalshortcut.cpp ) if(APPLE) list(APPEND QxtGlobalShortcut_SOURCES qxtglobalshortcut_mac.cpp ) elseif(UNIX) find_package(X11) if(X11_FOUND) list(APPEND QxtGlobalShortcut_SOURCES qxtglobalshortcut_x11.cpp ) endif() elseif(WIN32) list(APPEND QxtGlobalShortcut_SOURCES qxtglobalshortcut_win.cpp ) endif() add_library(QxtGlobalShortcut ${QxtGlobalShortcut_SOURCES}) find_package(Qt5Gui REQUIRED) target_link_libraries(QxtGlobalShortcut Qt5::Gui) if(APPLE) find_library(CARBON_LIBRARY Carbon) target_link_libraries(QxtGlobalShortcut ${CARBON_LIBRARY}) elseif(UNIX AND X11_FOUND) target_link_libraries(QxtGlobalShortcut ${X11_LIBRARIES}) find_package(Qt5 COMPONENTS X11Extras REQUIRED) target_link_libraries(QxtGlobalShortcut Qt5::X11Extras) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_FIND_MODULE_DIR}) find_package(XCB COMPONENTS XCB KEYSYMS REQUIRED) target_link_libraries(QxtGlobalShortcut XCB::XCB XCB::KEYSYMS) endif() zeal-0.6.1/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut.cpp000066400000000000000000000175701335333561500247150ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #include "qxtglobalshortcut.h" #include "qxtglobalshortcut_p.h" #include #ifndef Q_OS_OSX int QxtGlobalShortcutPrivate::ref = 0; #endif // Q_OS_OSX QHash, QxtGlobalShortcut *> QxtGlobalShortcutPrivate::shortcuts; QxtGlobalShortcutPrivate::QxtGlobalShortcutPrivate(QxtGlobalShortcut *qq) : q_ptr(qq) { #ifndef Q_OS_OSX if (ref == 0) QAbstractEventDispatcher::instance()->installNativeEventFilter(this); ++ref; #endif // Q_OS_OSX } QxtGlobalShortcutPrivate::~QxtGlobalShortcutPrivate() { #ifndef Q_OS_OSX --ref; if (ref == 0) { QAbstractEventDispatcher *ed = QAbstractEventDispatcher::instance(); if (ed != 0) ed->removeNativeEventFilter(this); } #endif // Q_OS_OSX } bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence &shortcut) { Q_Q(QxtGlobalShortcut); Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier; key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key((shortcut[0] ^ allMods) & shortcut[0]); mods = shortcut.isEmpty() ? Qt::KeyboardModifiers(0) : Qt::KeyboardModifiers(shortcut[0] & allMods); const quint32 nativeKey = nativeKeycode(key); const quint32 nativeMods = nativeModifiers(mods); const bool res = registerShortcut(nativeKey, nativeMods); if (res) shortcuts.insert({nativeKey, nativeMods}, q); else qWarning("QxtGlobalShortcut failed to register: %s", qPrintable(QKeySequence(key + mods).toString())); return res; } bool QxtGlobalShortcutPrivate::unsetShortcut() { Q_Q(QxtGlobalShortcut); bool res = false; const quint32 nativeKey = nativeKeycode(key); const quint32 nativeMods = nativeModifiers(mods); if (shortcuts.value({nativeKey, nativeMods}) == q) res = unregisterShortcut(nativeKey, nativeMods); if (res) shortcuts.remove({nativeKey, nativeMods}); else qWarning("QxtGlobalShortcut failed to unregister: %s", qPrintable(QKeySequence(key + mods).toString())); key = Qt::Key(0); mods = Qt::KeyboardModifiers(0); return res; } bool QxtGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods) { QxtGlobalShortcut *shortcut = shortcuts.value({nativeKey, nativeMods}); if (!shortcut || !shortcut->isEnabled()) return false; emit shortcut->activated(); return true; } /*! \class QxtGlobalShortcut \inmodule QxtWidgets \brief The QxtGlobalShortcut class provides a global shortcut aka "hotkey". A global shortcut triggers even if the application is not active. This makes it easy to implement applications that react to certain shortcuts still if some other application is active or if the application is for example minimized to the system tray. Example usage: \code QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window); connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility())); shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12")); \endcode \bold {Note:} Since Qxt 0.6 QxtGlobalShortcut no more requires QxtApplication. */ /*! \fn QxtGlobalShortcut::activated() This signal is emitted when the user types the shortcut's key sequence. \sa shortcut */ /*! Constructs a new QxtGlobalShortcut with \a parent. */ QxtGlobalShortcut::QxtGlobalShortcut(QObject *parent) : QObject(parent), d_ptr(new QxtGlobalShortcutPrivate(this)) { } /*! Constructs a new QxtGlobalShortcut with \a shortcut and \a parent. */ QxtGlobalShortcut::QxtGlobalShortcut(const QKeySequence &shortcut, QObject *parent) : QObject(parent), d_ptr(new QxtGlobalShortcutPrivate(this)) { setShortcut(shortcut); } /*! Destructs the QxtGlobalShortcut. */ QxtGlobalShortcut::~QxtGlobalShortcut() { Q_D(QxtGlobalShortcut); if (d->key != 0) d->unsetShortcut(); delete d; } /*! \property QxtGlobalShortcut::shortcut \brief the shortcut key sequence \bold {Note:} Notice that corresponding key press and release events are not delivered for registered global shortcuts even if they are disabled. Also, comma separated key sequences are not supported. Only the first part is used: \code qxtShortcut->setShortcut(QKeySequence("Ctrl+Alt+A,Ctrl+Alt+B")); Q_ASSERT(qxtShortcut->shortcut() == QKeySequence("Ctrl+Alt+A")); \endcode */ QKeySequence QxtGlobalShortcut::shortcut() const { Q_D(const QxtGlobalShortcut); return QKeySequence(d->key | d->mods); } bool QxtGlobalShortcut::setShortcut(const QKeySequence &shortcut) { Q_D(QxtGlobalShortcut); if (d->key != 0 && !d->unsetShortcut()) return false; if (shortcut.isEmpty()) return true; return d->setShortcut(shortcut); } /*! \property QxtGlobalShortcut::enabled \brief whether the shortcut is enabled A disabled shortcut does not get activated. The default value is \c true. \sa setDisabled() */ bool QxtGlobalShortcut::isEnabled() const { Q_D(const QxtGlobalShortcut); return d->enabled; } void QxtGlobalShortcut::setEnabled(bool enabled) { Q_D(QxtGlobalShortcut); d->enabled = enabled; } zeal-0.6.1/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut.h000066400000000000000000000070761335333561500243620ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #ifndef QXTGLOBALSHORTCUT_H #define QXTGLOBALSHORTCUT_H #include #include class QxtGlobalShortcutPrivate; class QxtGlobalShortcut : public QObject { Q_OBJECT QxtGlobalShortcutPrivate *d_ptr = nullptr; Q_DECLARE_PRIVATE(QxtGlobalShortcut) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut) public: explicit QxtGlobalShortcut(QObject *parent = nullptr); explicit QxtGlobalShortcut(const QKeySequence &shortcut, QObject *parent = nullptr); ~QxtGlobalShortcut() override; QKeySequence shortcut() const; bool setShortcut(const QKeySequence &shortcut); bool isEnabled() const; public slots: void setEnabled(bool enabled); signals: void activated(); }; #endif // QXTGLOBALSHORTCUT_H zeal-0.6.1/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_mac.cpp000066400000000000000000000235061335333561500255310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #include "qxtglobalshortcut_p.h" #include #include #include typedef QPair Identifier; static QMap keyRefs; static QHash keyIDs; static quint32 hotKeySerial = 0; static bool qxt_mac_handler_installed = false; OSStatus qxt_mac_handle_hot_key(EventHandlerCallRef nextHandler, EventRef event, void *data) { Q_UNUSED(nextHandler) Q_UNUSED(data) if (GetEventClass(event) == kEventClassKeyboard && GetEventKind(event) == kEventHotKeyPressed) { EventHotKeyID keyID; GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(keyID), NULL, &keyID); Identifier id = keyIDs.key(keyID.id); QxtGlobalShortcutPrivate::activateShortcut(id.second, id.first); } return noErr; } bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType, void *message, long *result) { Q_UNUSED(eventType) Q_UNUSED(message) Q_UNUSED(result) return false; } quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) { quint32 native = 0; if (modifiers & Qt::ShiftModifier) native |= shiftKey; if (modifiers & Qt::ControlModifier) native |= cmdKey; if (modifiers & Qt::AltModifier) native |= optionKey; if (modifiers & Qt::MetaModifier) native |= controlKey; if (modifiers & Qt::KeypadModifier) native |= kEventKeyModifierNumLockMask; return native; } quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key) { UTF16Char ch; // Constants found in NSEvent.h from AppKit.framework switch (key) { case Qt::Key_Return: return kVK_Return; case Qt::Key_Enter: return kVK_ANSI_KeypadEnter; case Qt::Key_Tab: return kVK_Tab; case Qt::Key_Space: return kVK_Space; case Qt::Key_Backspace: return kVK_Delete; case Qt::Key_Control: return kVK_Command; case Qt::Key_Shift: return kVK_Shift; case Qt::Key_CapsLock: return kVK_CapsLock; case Qt::Key_Option: return kVK_Option; case Qt::Key_Meta: return kVK_Control; case Qt::Key_F17: return kVK_F17; case Qt::Key_VolumeUp: return kVK_VolumeUp; case Qt::Key_VolumeDown: return kVK_VolumeDown; case Qt::Key_F18: return kVK_F18; case Qt::Key_F19: return kVK_F19; case Qt::Key_F20: return kVK_F20; case Qt::Key_F5: return kVK_F5; case Qt::Key_F6: return kVK_F6; case Qt::Key_F7: return kVK_F7; case Qt::Key_F3: return kVK_F3; case Qt::Key_F8: return kVK_F8; case Qt::Key_F9: return kVK_F9; case Qt::Key_F11: return kVK_F11; case Qt::Key_F13: return kVK_F13; case Qt::Key_F16: return kVK_F16; case Qt::Key_F14: return kVK_F14; case Qt::Key_F10: return kVK_F10; case Qt::Key_F12: return kVK_F12; case Qt::Key_F15: return kVK_F15; case Qt::Key_Help: return kVK_Help; case Qt::Key_Home: return kVK_Home; case Qt::Key_PageUp: return kVK_PageUp; case Qt::Key_Delete: return kVK_ForwardDelete; case Qt::Key_F4: return kVK_F4; case Qt::Key_End: return kVK_End; case Qt::Key_F2: return kVK_F2; case Qt::Key_PageDown: return kVK_PageDown; case Qt::Key_F1: return kVK_F1; case Qt::Key_Left: return kVK_LeftArrow; case Qt::Key_Right: return kVK_RightArrow; case Qt::Key_Down: return kVK_DownArrow; case Qt::Key_Up: return kVK_UpArrow; default: ; } if (key == Qt::Key_Escape) ch = 27; else if (key == Qt::Key_Return) ch = 13; else if (key == Qt::Key_Enter) ch = 3; else if (key == Qt::Key_Tab) ch = 9; else ch = key; CFDataRef currentLayoutData; TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); if (currentKeyboard == NULL) return 0; currentLayoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); CFRelease(currentKeyboard); if (currentLayoutData == NULL) return 0; UCKeyboardLayout *header = (UCKeyboardLayout *)CFDataGetBytePtr(currentLayoutData); UCKeyboardTypeHeader *table = header->keyboardTypeList; uint8_t *data = (uint8_t*)header; // God, would a little documentation for this shit kill you... for (quint32 i = 0; i < header->keyboardTypeCount; ++i) { UCKeyStateRecordsIndex *stateRec = 0; if (table[i].keyStateRecordsIndexOffset != 0) { stateRec = reinterpret_cast(data + table[i].keyStateRecordsIndexOffset); if (stateRec->keyStateRecordsIndexFormat != kUCKeyStateRecordsIndexFormat) stateRec = 0; } UCKeyToCharTableIndex *charTable = reinterpret_cast(data + table[i].keyToCharTableIndexOffset); if (charTable->keyToCharTableIndexFormat != kUCKeyToCharTableIndexFormat) continue; for (quint32 j=0; j < charTable->keyToCharTableCount; ++j) { UCKeyOutput *keyToChar = reinterpret_cast(data + charTable->keyToCharTableOffsets[j]); for (quint32 k=0; k < charTable->keyToCharTableSize; ++k) { if (keyToChar[k] & kUCKeyOutputTestForIndexMask) { long idx = keyToChar[k] & kUCKeyOutputGetIndexMask; if (stateRec && idx < stateRec->keyStateRecordCount) { UCKeyStateRecord *rec = reinterpret_cast(data + stateRec->keyStateRecordOffsets[idx]); if (rec->stateZeroCharData == ch) return k; } } else if (!(keyToChar[k] & kUCKeyOutputSequenceIndexMask) && keyToChar[k] < 0xFFFE) { if (keyToChar[k] == ch) return k; } } // for k } // for j } // for i return 0; } bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods) { if (!qxt_mac_handler_installed) { EventTypeSpec t; t.eventClass = kEventClassKeyboard; t.eventKind = kEventHotKeyPressed; InstallApplicationEventHandler(&qxt_mac_handle_hot_key, 1, &t, NULL, NULL); } EventHotKeyID keyID; keyID.signature = 'cute'; keyID.id = ++hotKeySerial; EventHotKeyRef ref = 0; bool rv = !RegisterEventHotKey(nativeKey, nativeMods, keyID, GetApplicationEventTarget(), 0, &ref); if (rv) { keyIDs.insert(Identifier(nativeMods, nativeKey), keyID.id); keyRefs.insert(keyID.id, ref); } return rv; } bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods) { Identifier id(nativeMods, nativeKey); if (!keyIDs.contains(id)) return false; EventHotKeyRef ref = keyRefs.take(keyIDs[id]); keyIDs.remove(id); return !UnregisterEventHotKey(ref); } zeal-0.6.1/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_p.h000066400000000000000000000077471335333561500247060ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #ifndef QXTGLOBALSHORTCUT_P_H #define QXTGLOBALSHORTCUT_P_H #include #include class QKeySequence; class QxtGlobalShortcut; class QxtGlobalShortcutPrivate : public QAbstractNativeEventFilter { QxtGlobalShortcut *q_ptr = nullptr; Q_DECLARE_PUBLIC(QxtGlobalShortcut) public: QxtGlobalShortcutPrivate(QxtGlobalShortcut *qq); ~QxtGlobalShortcutPrivate() override; bool enabled = true; Qt::Key key = Qt::Key(0); Qt::KeyboardModifiers mods = Qt::NoModifier; #ifndef Q_OS_OSX static int ref; #endif // Q_OS_OSX bool setShortcut(const QKeySequence &shortcut); bool unsetShortcut(); virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; static bool activateShortcut(quint32 nativeKey, quint32 nativeMods); private: static quint32 nativeKeycode(Qt::Key keycode); static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers); static bool registerShortcut(quint32 nativeKey, quint32 nativeMods); static bool unregisterShortcut(quint32 nativeKey, quint32 nativeMods); static QHash, QxtGlobalShortcut *> shortcuts; }; #endif // QXTGLOBALSHORTCUT_P_H zeal-0.6.1/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_win.cpp000066400000000000000000000174041335333561500255660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #include "qxtglobalshortcut_p.h" #include bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray &eventType, void *message, long *result) { Q_UNUSED(eventType) Q_UNUSED(result) MSG *msg = static_cast(message); if (msg->message == WM_HOTKEY) { const quint32 keycode = HIWORD(msg->lParam); const quint32 modifiers = LOWORD(msg->lParam); activateShortcut(keycode, modifiers); } return false; } quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) { // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN quint32 native = 0; if (modifiers & Qt::ShiftModifier) native |= MOD_SHIFT; if (modifiers & Qt::ControlModifier) native |= MOD_CONTROL; if (modifiers & Qt::AltModifier) native |= MOD_ALT; if (modifiers & Qt::MetaModifier) native |= MOD_WIN; // TODO: resolve these? //if (modifiers & Qt::KeypadModifier) //if (modifiers & Qt::GroupSwitchModifier) return native; } quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key) { switch (key) { case Qt::Key_Escape: return VK_ESCAPE; case Qt::Key_Tab: case Qt::Key_Backtab: return VK_TAB; case Qt::Key_Backspace: return VK_BACK; case Qt::Key_Return: case Qt::Key_Enter: return VK_RETURN; case Qt::Key_Insert: return VK_INSERT; case Qt::Key_Delete: return VK_DELETE; case Qt::Key_Pause: return VK_PAUSE; case Qt::Key_Print: return VK_PRINT; case Qt::Key_Clear: return VK_CLEAR; case Qt::Key_Home: return VK_HOME; case Qt::Key_End: return VK_END; case Qt::Key_Left: return VK_LEFT; case Qt::Key_Up: return VK_UP; case Qt::Key_Right: return VK_RIGHT; case Qt::Key_Down: return VK_DOWN; case Qt::Key_PageUp: return VK_PRIOR; case Qt::Key_PageDown: return VK_NEXT; case Qt::Key_F1: return VK_F1; case Qt::Key_F2: return VK_F2; case Qt::Key_F3: return VK_F3; case Qt::Key_F4: return VK_F4; case Qt::Key_F5: return VK_F5; case Qt::Key_F6: return VK_F6; case Qt::Key_F7: return VK_F7; case Qt::Key_F8: return VK_F8; case Qt::Key_F9: return VK_F9; case Qt::Key_F10: return VK_F10; case Qt::Key_F11: return VK_F11; case Qt::Key_F12: return VK_F12; case Qt::Key_F13: return VK_F13; case Qt::Key_F14: return VK_F14; case Qt::Key_F15: return VK_F15; case Qt::Key_F16: return VK_F16; case Qt::Key_F17: return VK_F17; case Qt::Key_F18: return VK_F18; case Qt::Key_F19: return VK_F19; case Qt::Key_F20: return VK_F20; case Qt::Key_F21: return VK_F21; case Qt::Key_F22: return VK_F22; case Qt::Key_F23: return VK_F23; case Qt::Key_F24: return VK_F24; case Qt::Key_Space: return VK_SPACE; case Qt::Key_Asterisk: return VK_MULTIPLY; case Qt::Key_Plus: return VK_ADD; case Qt::Key_Comma: return VK_SEPARATOR; case Qt::Key_Minus: return VK_SUBTRACT; case Qt::Key_Slash: return VK_DIVIDE; case Qt::Key_MediaNext: return VK_MEDIA_NEXT_TRACK; case Qt::Key_MediaPrevious: return VK_MEDIA_PREV_TRACK; case Qt::Key_MediaPlay: return VK_MEDIA_PLAY_PAUSE; case Qt::Key_MediaStop: return VK_MEDIA_STOP; // couldn't find those in VK_* //case Qt::Key_MediaLast: //case Qt::Key_MediaRecord: case Qt::Key_VolumeDown: return VK_VOLUME_DOWN; case Qt::Key_VolumeUp: return VK_VOLUME_UP; case Qt::Key_VolumeMute: return VK_VOLUME_MUTE; // numbers case Qt::Key_0: case Qt::Key_1: case Qt::Key_2: case Qt::Key_3: case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: case Qt::Key_8: case Qt::Key_9: return key; // letters case Qt::Key_A: case Qt::Key_B: case Qt::Key_C: case Qt::Key_D: case Qt::Key_E: case Qt::Key_F: case Qt::Key_G: case Qt::Key_H: case Qt::Key_I: case Qt::Key_J: case Qt::Key_K: case Qt::Key_L: case Qt::Key_M: case Qt::Key_N: case Qt::Key_O: case Qt::Key_P: case Qt::Key_Q: case Qt::Key_R: case Qt::Key_S: case Qt::Key_T: case Qt::Key_U: case Qt::Key_V: case Qt::Key_W: case Qt::Key_X: case Qt::Key_Y: case Qt::Key_Z: return key; default: return 0; } } bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods) { return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey); } bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods) { return UnregisterHotKey(0, nativeMods ^ nativeKey); } zeal-0.6.1/src/libs/ui/qxtglobalshortcut/qxtglobalshortcut_x11.cpp000066400000000000000000000152661335333561500254060ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** *****************************************************************************/ #include "qxtglobalshortcut_p.h" #include #include #include #include #include #include #include namespace { const quint32 maskModifiers[] = { 0, XCB_MOD_MASK_2, XCB_MOD_MASK_LOCK, (XCB_MOD_MASK_2 | XCB_MOD_MASK_LOCK) }; } // namespace bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray &eventType, void *message, long *result) { Q_UNUSED(result) if (eventType != "xcb_generic_event_t") return false; xcb_generic_event_t *event = reinterpret_cast(message); if ((event->response_type & ~0x80) != XCB_KEY_PRESS) return false; xcb_key_press_event_t *keyPressEvent = reinterpret_cast(event); // Avoid keyboard freeze xcb_connection_t *xcbConnection = QX11Info::connection(); xcb_allow_events(xcbConnection, XCB_ALLOW_REPLAY_KEYBOARD, keyPressEvent->time); xcb_flush(xcbConnection); unsigned int keycode = keyPressEvent->detail; unsigned int keystate = 0; if (keyPressEvent->state & XCB_MOD_MASK_1) keystate |= XCB_MOD_MASK_1; if (keyPressEvent->state & XCB_MOD_MASK_CONTROL) keystate |= XCB_MOD_MASK_CONTROL; if (keyPressEvent->state & XCB_MOD_MASK_4) keystate |= XCB_MOD_MASK_4; if (keyPressEvent->state & XCB_MOD_MASK_SHIFT) keystate |= XCB_MOD_MASK_SHIFT; return activateShortcut(keycode, keystate); } quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) { quint32 native = 0; if (modifiers & Qt::ShiftModifier) native |= XCB_MOD_MASK_SHIFT; if (modifiers & Qt::ControlModifier) native |= XCB_MOD_MASK_CONTROL; if (modifiers & Qt::AltModifier) native |= XCB_MOD_MASK_1; if (modifiers & Qt::MetaModifier) native |= XCB_MOD_MASK_4; return native; } quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key) { quint32 native = 0; KeySym keysym = XStringToKeysym(QKeySequence(key).toString().toLatin1().data()); if (keysym == XCB_NO_SYMBOL) keysym = static_cast(key); xcb_key_symbols_t *xcbKeySymbols = xcb_key_symbols_alloc(QX11Info::connection()); QScopedPointer keycodes( xcb_key_symbols_get_keycode(xcbKeySymbols, keysym)); if (!keycodes.isNull()) native = keycodes.data()[0]; // Use the first keycode xcb_key_symbols_free(xcbKeySymbols); return native; } bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods) { xcb_connection_t *xcbConnection = QX11Info::connection(); QList xcbCookies; for (quint32 maskMods : maskModifiers) { xcbCookies << xcb_grab_key_checked(xcbConnection, 1, QX11Info::appRootWindow(), nativeMods | maskMods, nativeKey, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); } bool failed = false; for (xcb_void_cookie_t cookie : xcbCookies) { QScopedPointer error(xcb_request_check(xcbConnection, cookie)); failed = !error.isNull(); } if (failed) unregisterShortcut(nativeKey, nativeMods); return !failed; } bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods) { xcb_connection_t *xcbConnection = QX11Info::connection(); QList xcbCookies; for (quint32 maskMods : maskModifiers) { xcb_ungrab_key(xcbConnection, nativeKey, QX11Info::appRootWindow(), nativeMods | maskMods); } bool failed = false; for (xcb_void_cookie_t cookie : xcbCookies) { QScopedPointer error(xcb_request_check(xcbConnection, cookie)); failed = !error.isNull(); } return !failed; } zeal-0.6.1/src/libs/ui/searchitemdelegate.cpp000066400000000000000000000167501335333561500211510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "searchitemdelegate.h" #include #include #include #include #include using namespace Zeal::WidgetUi; SearchItemDelegate::SearchItemDelegate(QObject *parent) : QStyledItemDelegate(parent) { } QList SearchItemDelegate::decorationRoles() const { return m_decorationRoles; } void SearchItemDelegate::setDecorationRoles(const QList &roles) { m_decorationRoles = roles; } bool SearchItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) { if (event->type() != QEvent::ToolTip) return QStyledItemDelegate::helpEvent(event, view, option, index); if (sizeHint(option, index).width() < view->visualRect(index).width()) { QToolTip::hideText(); return QStyledItemDelegate::helpEvent(event, view, option, index); } QToolTip::showText(event->globalPos(), index.data().toString(), view); return true; } void SearchItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem opt(option); QStyle *style = opt.widget->style(); // Find decoration roles with data present. QList roles; for (int role : m_decorationRoles) { if (!index.data(role).isNull()) roles.append(role); } // TODO: Implemented via initStyleOption() overload if (!roles.isEmpty()) { opt.features |= QStyleOptionViewItem::HasDecoration; opt.icon = index.data(roles.first()).value(); const QSize actualSize = opt.icon.actualSize(opt.decorationSize); opt.decorationSize = {std::min(opt.decorationSize.width(), actualSize.width()), std::min(opt.decorationSize.height(), actualSize.height())}; } style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, &opt, opt.widget) + 1; if (!roles.isEmpty()) { QIcon::Mode mode = QIcon::Normal; if (!(opt.state & QStyle::State_Enabled)) mode = QIcon::Disabled; else if (opt.state & QStyle::State_Selected) mode = QIcon::Selected; const QIcon::State state = (opt.state & QStyle::State_Open) ? QIcon::On : QIcon::Off; // All icons are sized after the first one. QRect iconRect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, opt.widget); const int dx = iconRect.width() + margin; for (int i = 1; i < roles.size(); ++i) { opt.decorationSize.rwidth() += dx; iconRect.translate(dx, 0); const QIcon icon = index.data(roles[i]).value(); icon.paint(painter, iconRect, opt.decorationAlignment, mode, state); } } // This should not happen unless a docset is corrupted. if (index.data().isNull()) return; // Match QCommonStyle behaviour. opt.features |= QStyleOptionViewItem::HasDisplay; opt.text = index.data().toString(); const QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, opt.widget) .adjusted(margin, 0, -margin, 0); const QFontMetrics &fm = opt.fontMetrics; const QString elidedText = fm.elidedText(opt.text, opt.textElideMode, textRect.width()); if (!m_highlight.isEmpty()) { painter->save(); painter->setRenderHint(QPainter::Antialiasing); painter->setPen(QColor::fromRgb(255, 253, 0)); const QColor highlightColor = (opt.state & (QStyle::State_Selected | QStyle::State_HasFocus)) ? QColor::fromRgb(255, 255, 100, 20) : QColor::fromRgb(255, 255, 100, 120); for (int i = 0;;) { const int matchIndex = opt.text.indexOf(m_highlight, i, Qt::CaseInsensitive); if (matchIndex == -1 || matchIndex >= elidedText.length() - 1) break; QRect highlightRect = textRect.adjusted(fm.width(elidedText.left(matchIndex)), 2, 0, -2); highlightRect.setWidth(fm.width(elidedText.mid(matchIndex, m_highlight.length()))); QPainterPath path; path.addRoundedRect(highlightRect, 2, 2); painter->fillPath(path, highlightColor); painter->drawPath(path); i = matchIndex + m_highlight.length(); } painter->restore(); } painter->save(); #ifdef Q_OS_WIN32 // QWindowsVistaStyle overrides highlight colour. if (style->objectName() == QLatin1String("windowsvista")) { opt.palette.setColor(QPalette::All, QPalette::HighlightedText, opt.palette.color(QPalette::Active, QPalette::Text)); } #endif const QPalette::ColorGroup cg = (opt.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive; if (opt.state & QStyle::State_Selected) painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); else painter->setPen(opt.palette.color(cg, QPalette::Text)); // Vertically align the text in the middle to match QCommonStyle behaviour. const QRect alignedRect = QStyle::alignedRect(opt.direction, opt.displayAlignment, QSize(1, fm.height()), textRect); painter->drawText(QPoint(alignedRect.x(), alignedRect.y() + fm.ascent()), elidedText); painter->restore(); } QSize SearchItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem opt(option); QStyle *style = opt.widget->style(); QSize size = QStyledItemDelegate::sizeHint(opt, index); size.setWidth(0); const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, &opt, opt.widget) + 1; // Find decoration roles with data present. QList roles; for (int role : m_decorationRoles) { if (!index.data(role).isNull()) roles.append(role); } if (!roles.isEmpty()) { const QIcon icon = index.data(roles.first()).value(); const QSize actualSize = icon.actualSize(opt.decorationSize); const int decorationWidth = std::min(opt.decorationSize.width(), actualSize.width()); size.rwidth() = (decorationWidth + margin) * roles.size() + margin; } size.rwidth() += opt.fontMetrics.width(index.data().toString()) + margin * 2; return size; } void SearchItemDelegate::setHighlight(const QString &text) { m_highlight = text; } zeal-0.6.1/src/libs/ui/searchitemdelegate.h000066400000000000000000000036511335333561500206120ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_SEARCHITEMDELEGATE_H #define ZEAL_WIDGETUI_SEARCHITEMDELEGATE_H #include namespace Zeal { namespace WidgetUi { class SearchItemDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit SearchItemDelegate(QObject *parent = nullptr); QList decorationRoles() const; void setDecorationRoles(const QList &roles); bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; public slots: void setHighlight(const QString &text); private: QList m_decorationRoles = {Qt::DecorationRole}; QString m_highlight; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_SEARCHITEMDELEGATE_H zeal-0.6.1/src/libs/ui/settingsdialog.cpp000066400000000000000000000305441335333561500203470ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "settingsdialog.h" #include "ui_settingsdialog.h" #include #include #include #include #include using namespace Zeal; using namespace Zeal::WidgetUi; namespace { // QFontDatabase::standardSizes() lacks some sizes, like 13, which QtWK uses by default. const int AvailableFontSizes[] = {9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40, 44, 48, 56, 64, 72}; const QWebSettings::FontFamily BasicFontFamilies[] = {QWebSettings::SerifFont, QWebSettings::SansSerifFont, QWebSettings::FixedFont}; } SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog()) { ui->setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); // Setup signals & slots connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &SettingsDialog::saveSettings); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &SettingsDialog::loadSettings); connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton *button) { if (button == ui->buttonBox->button(QDialogButtonBox::Apply)) saveSettings(); }); // Fonts ui->defaultFontComboBox->addItem(tr("Serif"), QStringLiteral("serif")); ui->defaultFontComboBox->addItem(tr("Sans-serif"), QStringLiteral("sans-serif")); ui->defaultFontComboBox->addItem(tr("Monospace"), QStringLiteral("monospace")); ui->minFontSizeComboBox->addItem(tr("None"), 0); for (int fontSize : AvailableFontSizes) { ui->fontSizeComboBox->addItem(QString::number(fontSize), fontSize); ui->fixedFontSizeComboBox->addItem(QString::number(fontSize), fontSize); ui->minFontSizeComboBox->addItem(QString::number(fontSize), fontSize); } // Fix tab order. setTabOrder(ui->defaultFontComboBox, ui->fontSizeComboBox); setTabOrder(ui->fontSizeComboBox, ui->serifFontComboBox); QWebSettings *webSettings = QWebSettings::globalSettings(); // Avoid casting in each connect. auto currentIndexChangedSignal = static_cast(&QComboBox::currentIndexChanged); auto syncStandardFont = [this, webSettings](QWebSettings::FontFamily fontFamily, const QFont &font) { const int index = ui->defaultFontComboBox->currentIndex(); if (BasicFontFamilies[index] == fontFamily) { webSettings->setFontFamily(QWebSettings::StandardFont, font.family()); } }; connect(ui->defaultFontComboBox, currentIndexChangedSignal, this, [webSettings](int index) { const QString fontFamily = webSettings->fontFamily(BasicFontFamilies[index]); webSettings->setFontFamily(QWebSettings::StandardFont, fontFamily); }); connect(ui->serifFontComboBox, &QFontComboBox::currentFontChanged, this, [webSettings, syncStandardFont](const QFont &font) { webSettings->setFontFamily(QWebSettings::SerifFont, font.family()); syncStandardFont(QWebSettings::SerifFont, font); }); connect(ui->sansSerifFontComboBox, &QFontComboBox::currentFontChanged, this, [webSettings, syncStandardFont](const QFont &font) { webSettings->setFontFamily(QWebSettings::SansSerifFont, font.family()); syncStandardFont(QWebSettings::SansSerifFont, font); }); connect(ui->fixedFontComboBox, &QFontComboBox::currentFontChanged, this, [webSettings, syncStandardFont](const QFont &font) { webSettings->setFontFamily(QWebSettings::FixedFont, font.family()); syncStandardFont(QWebSettings::FixedFont, font); }); connect(ui->fontSizeComboBox, currentIndexChangedSignal, this, [webSettings](int index) { webSettings->setFontSize(QWebSettings::DefaultFontSize, AvailableFontSizes[index]); }); connect(ui->fixedFontSizeComboBox, currentIndexChangedSignal, this, [webSettings](int index) { webSettings->setFontSize(QWebSettings::DefaultFixedFontSize, AvailableFontSizes[index]); }); connect(ui->minFontSizeComboBox, currentIndexChangedSignal, this, [webSettings](int index) { const int fontSize = index == 0 ? 0 : AvailableFontSizes[index-1]; webSettings->setFontSize(QWebSettings::MinimumFontSize, fontSize); }); loadSettings(); } SettingsDialog::~SettingsDialog() { delete ui; } void SettingsDialog::chooseCustomCssFile() { const QString file = QFileDialog::getOpenFileName(this, tr("Choose CSS File"), ui->customCssFileEdit->text(), tr("CSS Files (*.css);;All Files (*.*)")); if (file.isEmpty()) return; ui->customCssFileEdit->setText(QDir::toNativeSeparators(file)); } void SettingsDialog::chooseDocsetStoragePath() { QString path = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ui->docsetStorageEdit->text()); if (path.isEmpty()) { return; } #ifdef PORTABLE_BUILD // Use relative path if selected directory is under the application binary path. if (path.startsWith(QCoreApplication::applicationDirPath() + QLatin1String("/"))) { const QDir appDirPath(QCoreApplication::applicationDirPath()); path = appDirPath.relativeFilePath(path); } #endif ui->docsetStorageEdit->setText(QDir::toNativeSeparators(path)); } void SettingsDialog::loadSettings() { const Core::Settings * const settings = Core::Application::instance()->settings(); // General Tab ui->startMinimizedCheckBox->setChecked(settings->startMinimized); ui->checkForUpdateCheckBox->setChecked(settings->checkForUpdate); ui->systrayGroupBox->setChecked(settings->showSystrayIcon); ui->minimizeToSystrayCheckBox->setChecked(settings->minimizeToSystray); ui->hideToSystrayCheckBox->setChecked(settings->hideOnClose); ui->toolButton->setKeySequence(settings->showShortcut); ui->docsetStorageEdit->setText(QDir::toNativeSeparators(settings->docsetPath)); // Tabs Tab ui->openNewTabAfterActive->setChecked(settings->openNewTabAfterActive); // Search Tab ui->fuzzySearchCheckBox->setChecked(settings->fuzzySearchEnabled); // Content Tab for (int i = 0; i < ui->defaultFontComboBox->count(); ++i) { if (ui->defaultFontComboBox->itemData(i).toString() == settings->defaultFontFamily) { ui->defaultFontComboBox->setCurrentIndex(i); break; } } ui->serifFontComboBox->setCurrentText(settings->serifFontFamily); ui->sansSerifFontComboBox->setCurrentText(settings->sansSerifFontFamily); ui->fixedFontComboBox->setCurrentText(settings->fixedFontFamily); ui->fontSizeComboBox->setCurrentText(QString::number(settings->defaultFontSize)); ui->fixedFontSizeComboBox->setCurrentText(QString::number(settings->defaultFixedFontSize)); ui->minFontSizeComboBox->setCurrentText(QString::number(settings->minimumFontSize)); ui->darkModeCheckBox->setChecked(settings->darkModeEnabled); ui->highlightOnNavigateCheckBox->setChecked(settings->highlightOnNavigateEnabled); ui->customCssFileEdit->setText(QDir::toNativeSeparators(settings->customCssFile)); switch (settings->externalLinkPolicy) { case Core::Settings::ExternalLinkPolicy::Ask: ui->radioExternalLinkAsk->setChecked(true); break; case Core::Settings::ExternalLinkPolicy::Open: ui->radioExternalLinkOpen->setChecked(true); break; case Core::Settings::ExternalLinkPolicy::OpenInSystemBrowser: ui->radioExternalLinkOpenDesktop->setChecked(true); break; } ui->useSmoothScrollingCheckBox->setChecked(settings->isSmoothScrollingEnabled); ui->disableAdCheckBox->setChecked(settings->isAdDisabled); // Network Tab switch (settings->proxyType) { case Core::Settings::ProxyType::None: ui->noProxySettings->setChecked(true); break; case Core::Settings::ProxyType::System: ui->systemProxySettings->setChecked(true); break; case Core::Settings::ProxyType::UserDefined: ui->manualProxySettings->setChecked(true); break; } ui->httpProxy->setText(settings->proxyHost); ui->httpProxyPort->setValue(settings->proxyPort); ui->httpProxyNeedsAuth->setChecked(settings->proxyAuthenticate); ui->httpProxyUser->setText(settings->proxyUserName); ui->httpProxyPass->setText(settings->proxyPassword); } void SettingsDialog::saveSettings() { Core::Settings * const settings = Core::Application::instance()->settings(); // General Tab settings->startMinimized = ui->startMinimizedCheckBox->isChecked(); settings->checkForUpdate = ui->checkForUpdateCheckBox->isChecked(); settings->showSystrayIcon = ui->systrayGroupBox->isChecked(); settings->minimizeToSystray = ui->minimizeToSystrayCheckBox->isChecked(); settings->hideOnClose = ui->hideToSystrayCheckBox->isChecked(); settings->showShortcut = ui->toolButton->keySequence(); settings->docsetPath = QDir::fromNativeSeparators(ui->docsetStorageEdit->text()); // Tabs Tab settings->openNewTabAfterActive = ui->openNewTabAfterActive->isChecked(); // Search Tab settings->fuzzySearchEnabled = ui->fuzzySearchCheckBox->isChecked(); // Content Tab settings->defaultFontFamily = ui->defaultFontComboBox->currentData().toString(); settings->serifFontFamily = ui->serifFontComboBox->currentText(); settings->sansSerifFontFamily = ui->sansSerifFontComboBox->currentText(); settings->fixedFontFamily = ui->fixedFontComboBox->currentText(); settings->defaultFontSize = ui->fontSizeComboBox->currentData().toInt(); settings->defaultFixedFontSize = ui->fixedFontSizeComboBox->currentData().toInt(); settings->minimumFontSize = ui->minFontSizeComboBox->currentData().toInt(); settings->darkModeEnabled = ui->darkModeCheckBox->isChecked(); settings->highlightOnNavigateEnabled = ui->highlightOnNavigateCheckBox->isChecked(); settings->customCssFile = QDir::fromNativeSeparators(ui->customCssFileEdit->text()); if (ui->radioExternalLinkAsk->isChecked()) { settings->externalLinkPolicy = Core::Settings::ExternalLinkPolicy::Ask; } else if (ui->radioExternalLinkOpen->isChecked()) { settings->externalLinkPolicy = Core::Settings::ExternalLinkPolicy::Open; } else if (ui->radioExternalLinkOpenDesktop->isChecked()) { settings->externalLinkPolicy = Core::Settings::ExternalLinkPolicy::OpenInSystemBrowser; } settings->isSmoothScrollingEnabled = ui->useSmoothScrollingCheckBox->isChecked(); settings->isAdDisabled = ui->disableAdCheckBox->isChecked(); // Network Tab // Proxy settings if (ui->noProxySettings->isChecked()) settings->proxyType = Core::Settings::ProxyType::None; else if (ui->systemProxySettings->isChecked()) settings->proxyType = Core::Settings::ProxyType::System; else if (ui->manualProxySettings->isChecked()) settings->proxyType = Core::Settings::ProxyType::UserDefined; settings->proxyHost = ui->httpProxy->text(); settings->proxyPort = ui->httpProxyPort->text().toUShort(); settings->proxyAuthenticate = ui->httpProxyNeedsAuth->isChecked(); settings->proxyUserName = ui->httpProxyUser->text(); settings->proxyPassword = ui->httpProxyPass->text(); settings->save(); } zeal-0.6.1/src/libs/ui/settingsdialog.h000066400000000000000000000030441335333561500200070ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_SETTINGSDIALOG_H #define ZEAL_WIDGETUI_SETTINGSDIALOG_H #include namespace Zeal { namespace WidgetUi { namespace Ui { class SettingsDialog; } // namespace Ui class SettingsDialog : public QDialog { Q_OBJECT public: explicit SettingsDialog(QWidget *parent = nullptr); ~SettingsDialog() override; private slots: void chooseCustomCssFile(); void chooseDocsetStoragePath(); private: void loadSettings(); void saveSettings(); private: Ui::SettingsDialog *ui = nullptr; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_SETTINGSDIALOG_H zeal-0.6.1/src/libs/ui/settingsdialog.ui000066400000000000000000000704731335333561500202070ustar00rootroot00000000000000 Zeal::WidgetUi::SettingsDialog Qt::ApplicationModal 0 0 600 625 Preferences 0 General Startup Start minimized Check for update true Show system tray icon true Minimize to system tray instead of taskbar Hide to system tray on window close Global shortcuts QFormLayout::AllNonFixedFieldsGrow Show Zeal: Click to set shortcut true Docset storage QFormLayout::AllNonFixedFieldsGrow &Directory: docsetStorageEdit true &Browse... Qt::Vertical 20 40 Tabs Behavior Open new tab after active Qt::Vertical 20 40 Search Local search Use fuzzy search (experimental) Qt::Vertical 20 40 Content Fonts QLayout::SetMinimumSize De&fault: defaultFontComboBox &Serif: serifFontComboBox QFontComboBox::ScalableFonts Sa&ns-serif: sansSerifFontComboBox QFontComboBox::ScalableFonts &Monospace: fixedFontComboBox QFontComboBox::MonospacedFonts|QFontComboBox::ScalableFonts Si&ze: fontSizeComboBox Qt::Vertical 20 40 Siz&e: fixedFontSizeComboBox Qt::Horizontal 40 20 Minimum f&ont size: minFontSizeComboBox Style &Dark mode &Highlight on navigate &Custom CSS file: customCssFileEdit true Bro&wse... External Link Behavior &Ask everytime true &Open in desktop browser O&pen in Zeal Other Use smoo&th scrolling Disable ad&vertisement on the welcome page Qt::Vertical 20 40 Network HTTP Proxy No proxy false true System proxy settings true Manual proxy configuration false HTTP proxy: false false Port: false 65535 false HTTP proxy requires authentication false 0 0 0 false Username: false false Password: false QLineEdit::Password Qt::Vertical 20 40 QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok ShortcutEdit QLineEdit
ui/widgets/shortcutedit.h
buttonBox accepted() Zeal::WidgetUi::SettingsDialog accept() 248 254 157 274 buttonBox rejected() Zeal::WidgetUi::SettingsDialog reject() 316 260 286 274 manualProxySettings toggled(bool) httpProxyLabel setEnabled(bool) 104 74 121 97 manualProxySettings toggled(bool) httpProxyPortLabel setEnabled(bool) 349 78 347 96 manualProxySettings toggled(bool) httpProxy setEnabled(bool) 232 77 232 97 manualProxySettings toggled(bool) httpProxyPort setEnabled(bool) 392 74 392 96 manualProxySettings toggled(bool) httpProxyNeedsAuth setEnabled(bool) 53 75 100 129 httpProxyNeedsAuth toggled(bool) httpProxyPass setEnabled(bool) 287 134 285 182 httpProxyNeedsAuth toggled(bool) httpProxyUser setEnabled(bool) 183 135 182 154 manualProxySettings toggled(bool) httpAuthWidget setEnabled(bool) 54 79 53 179 httpProxyNeedsAuth toggled(bool) httpProxyUserLabel setEnabled(bool) 81 134 70 154 httpProxyNeedsAuth toggled(bool) httpProxyPassLabel setEnabled(bool) 87 137 84 186 customCssFileBrowseButton clicked() Zeal::WidgetUi::SettingsDialog chooseCustomCssFile() 526 232 299 249 docsetStorageBrowseButton clicked() Zeal::WidgetUi::SettingsDialog chooseDocsetStoragePath() 526 371 299 249
zeal-0.6.1/src/libs/ui/webbridge.cpp000066400000000000000000000026211335333561500172540ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "webbridge.h" #include #include #include using namespace Zeal::WidgetUi; WebBridge::WebBridge(QObject *parent) : QObject(parent) { } void WebBridge::openShortUrl(const QString &key) { QDesktopServices::openUrl(QUrl(QStringLiteral("https://go.zealdocs.org/l/") + key)); } void WebBridge::triggerAction(const QString &action) { emit actionTriggered(action); } QString WebBridge::appVersion() const { return QCoreApplication::applicationVersion(); } zeal-0.6.1/src/libs/ui/webbridge.h000066400000000000000000000027501335333561500167240ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_WEBBRIDGE_H #define ZEAL_WIDGETUI_WEBBRIDGE_H #include namespace Zeal { namespace WidgetUi { class WebBridge : public QObject { Q_OBJECT Q_PROPERTY(QString AppVersion READ appVersion CONSTANT) public: explicit WebBridge(QObject *parent = nullptr); signals: void actionTriggered(const QString &action); public slots: Q_INVOKABLE void openShortUrl(const QString &key); Q_INVOKABLE void triggerAction(const QString &action); private: QString appVersion() const; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_WEBBRIDGE_H zeal-0.6.1/src/libs/ui/widgets/000077500000000000000000000000001335333561500162635ustar00rootroot00000000000000zeal-0.6.1/src/libs/ui/widgets/searchedit.cpp000066400000000000000000000110721335333561500211030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "searchedit.h" #include #include #include #include #include #include using namespace Zeal; using namespace Zeal::WidgetUi; SearchEdit::SearchEdit(QWidget *parent) : QLineEdit(parent) { m_completionLabel = new QLabel(this); m_completionLabel->setObjectName(QStringLiteral("completer")); m_completionLabel->setStyleSheet(QStringLiteral("QLabel#completer { color: gray; }")); m_completionLabel->setFont(font()); connect(this, &SearchEdit::textChanged, this, &SearchEdit::showCompletions); } void SearchEdit::setTreeView(QTreeView *view) { m_treeView = view; m_focusing = false; } // Makes the line edit use autocompletions. void SearchEdit::setCompletions(const QStringList &completions) { if (m_prefixCompleter) delete m_prefixCompleter; m_prefixCompleter = new QCompleter(completions, this); m_prefixCompleter->setCompletionMode(QCompleter::InlineCompletion); m_prefixCompleter->setCaseSensitivity(Qt::CaseInsensitive); m_prefixCompleter->setWidget(this); } // Clear input with consideration to docset filters void SearchEdit::clearQuery() { setText(text().left(queryStart())); } void SearchEdit::selectQuery() { setSelection(queryStart(), text().size()); } bool SearchEdit::event(QEvent *event) { if (event->type() != QEvent::KeyPress) return QLineEdit::event(event); // Tab key cannot be overriden in keyPressEvent() if (static_cast(event)->key() != Qt::Key_Tab) return QLineEdit::event(event); const QString completed = currentCompletion(text()); if (!completed.isEmpty()) setText(completed); return true; } void SearchEdit::focusInEvent(QFocusEvent *event) { QLineEdit::focusInEvent(event); // Do not change default behaviour when focused with mouse if (event->reason() == Qt::MouseFocusReason) return; selectQuery(); m_focusing = true; } void SearchEdit::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Escape: clearQuery(); event->accept(); break; case Qt::Key_Return: case Qt::Key_Down: case Qt::Key_Up: case Qt::Key_PageDown: case Qt::Key_PageUp: QCoreApplication::sendEvent(m_treeView, event); break; default: QLineEdit::keyPressEvent(event); break; } } void SearchEdit::mousePressEvent(QMouseEvent *event) { // Let the focusInEvent code deal with initial selection on focus. if (!m_focusing) QLineEdit::mousePressEvent(event); m_focusing = false; } void SearchEdit::showCompletions(const QString &newValue) { const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); const int textWidth = fontMetrics().width(newValue); if (m_prefixCompleter) m_prefixCompleter->setCompletionPrefix(text()); const QString completed = currentCompletion(newValue).mid(newValue.size()); const QSize labelSize(fontMetrics().width(completed), size().height()); m_completionLabel->setMinimumSize(labelSize); m_completionLabel->move(frameWidth + 2 + textWidth, 0); m_completionLabel->setText(completed); } QString SearchEdit::currentCompletion(const QString &text) const { if (text.isEmpty() || !m_prefixCompleter) return QString(); return m_prefixCompleter->currentCompletion(); } int SearchEdit::queryStart() const { const Registry::SearchQuery currentQuery = Registry::SearchQuery::fromString(text()); // Keep the filter for the first Escape press return currentQuery.query().isEmpty() ? 0 : currentQuery.keywordPrefixSize(); } zeal-0.6.1/src/libs/ui/widgets/searchedit.h000066400000000000000000000037261335333561500205570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_SEARCHEDIT_H #define ZEAL_WIDGETUI_SEARCHEDIT_H #include class QCompleter; class QEvent; class QLabel; class QTreeView; namespace Zeal { namespace WidgetUi { class SearchEdit : public QLineEdit { Q_OBJECT public: explicit SearchEdit(QWidget *parent = nullptr); void setTreeView(QTreeView *view); void clearQuery(); void selectQuery(); void setCompletions(const QStringList &completions); protected: bool event(QEvent *event) override; void focusInEvent(QFocusEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private slots: void showCompletions(const QString &text); private: QString currentCompletion(const QString &text) const; int queryStart() const; QCompleter *m_prefixCompleter = nullptr; QTreeView *m_treeView = nullptr; QLabel *m_completionLabel = nullptr; bool m_focusing = false; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_SEARCHEDIT_H zeal-0.6.1/src/libs/ui/widgets/searchtoolbar.cpp000066400000000000000000000157001335333561500216220ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "searchtoolbar.h" #include #include #include #include #include #include #include #include #include using namespace Zeal::WidgetUi; SearchToolBar::SearchToolBar(QWebView *webView, QWidget *parent) : QWidget(parent) , m_webView(webView) { QHBoxLayout *layout = new QHBoxLayout(this); layout->setContentsMargins(4, 4, 4, 4); layout->setSpacing(4); m_lineEdit = new QLineEdit(); m_lineEdit->installEventFilter(this); m_lineEdit->setPlaceholderText(tr("Find in page")); m_lineEdit->setMaximumWidth(200); connect(m_lineEdit, &QLineEdit::textChanged, this, &SearchToolBar::findNext); connect(m_lineEdit, &QLineEdit::textChanged, this, &SearchToolBar::updateHighlight); layout->addWidget(m_lineEdit); m_findPreviousButton = new QToolButton(); m_findPreviousButton->setAutoRaise(true); m_findPreviousButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowBack)); m_findPreviousButton->setToolTip(tr("Previous result")); connect(m_findPreviousButton, &QToolButton::clicked, this, &SearchToolBar::findPrevious); layout->addWidget(m_findPreviousButton); // A workaround for QAbstractButton lacking support for multiple shortcuts. QAction *action = new QAction(m_findPreviousButton); action->setShortcuts(QKeySequence::FindPrevious); // TODO: Investigate why direct connection does not work. //connect(action, &QAction::triggered, m_findPreviousButton, &QToolButton::animateClick); connect(action, &QAction::triggered, this, [this]() { m_findPreviousButton->animateClick(); }); addAction(action); m_findNextButton = new QToolButton(); m_findNextButton->setAutoRaise(true); m_findNextButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowForward)); m_findNextButton->setToolTip(tr("Next result")); connect(m_findNextButton, &QToolButton::clicked, this, &SearchToolBar::findNext); layout->addWidget(m_findNextButton); action = new QAction(m_findNextButton); action->setShortcuts(QKeySequence::FindNext); connect(action, &QAction::triggered, this, [this]() { m_findNextButton->animateClick(); }); addAction(action); m_highlightAllButton = new QToolButton(); m_highlightAllButton->setAutoRaise(true); m_highlightAllButton->setCheckable(true); m_highlightAllButton->setText(tr("High&light All")); connect(m_highlightAllButton, &QToolButton::toggled, this, &SearchToolBar::updateHighlight); layout->addWidget(m_highlightAllButton); m_matchCaseButton = new QToolButton(); m_matchCaseButton->setAutoRaise(true); m_matchCaseButton->setCheckable(true); m_matchCaseButton->setText(tr("Mat&ch Case")); connect(m_matchCaseButton, &QToolButton::toggled, this, &SearchToolBar::updateHighlight); layout->addWidget(m_matchCaseButton); layout->addStretch(); QToolButton *closeButton = new QToolButton(); closeButton->setAutoRaise(true); closeButton->setIcon(qApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton)); closeButton->setToolTip(tr("Close find bar")); connect(closeButton, &QToolButton::clicked, this, &QWidget::hide); layout->addWidget(closeButton); setLayout(layout); setMaximumHeight(sizeHint().height()); setMinimumWidth(sizeHint().width()); } void SearchToolBar::setText(const QString &text) { m_lineEdit->setText(text); } void SearchToolBar::activate() { show(); m_lineEdit->selectAll(); m_lineEdit->setFocus(); } bool SearchToolBar::eventFilter(QObject *object, QEvent *event) { if (object == m_lineEdit && event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); switch (keyEvent->key()) { case Qt::Key_Enter: case Qt::Key_Return: if (keyEvent->modifiers().testFlag(Qt::ShiftModifier)) { findPrevious(); } else { findNext(); } return true; case Qt::Key_Down: case Qt::Key_Up: case Qt::Key_PageDown: case Qt::Key_PageUp: QCoreApplication::sendEvent(m_webView, event); return true; default: break; } } return QWidget::eventFilter(object, event); } void SearchToolBar::hideEvent(QHideEvent *event) { hideHighlight(); m_webView->setFocus(); QWidget::hideEvent(event); } void SearchToolBar::showEvent(QShowEvent *event) { activate(); QWidget::showEvent(event); } void SearchToolBar::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) { hide(); } } void SearchToolBar::findNext() { if (!isVisible()) { return; } QWebPage::FindFlags ff = QWebPage::FindWrapsAroundDocument; #if QT_VERSION >= 0x050700 ff.setFlag(QWebPage::FindCaseSensitively, m_matchCaseButton->isChecked()); #else if (m_matchCaseButton->isChecked()) { ff |= QWebPage::FindCaseSensitively; } #endif m_webView->findText(m_lineEdit->text(), ff); } void SearchToolBar::findPrevious() { if (!isVisible()) { return; } QWebPage::FindFlags ff = QWebPage::FindWrapsAroundDocument; #if QT_VERSION >= 0x050700 ff.setFlag(QWebPage::FindCaseSensitively, m_matchCaseButton->isChecked()); ff.setFlag(QWebPage::FindBackward); #else if (m_matchCaseButton->isChecked()) { ff |= QWebPage::FindCaseSensitively; } ff |= QWebPage::FindBackward; #endif m_webView->findText(m_lineEdit->text(), ff); } void SearchToolBar::hideHighlight() { m_webView->findText(QString(), QWebPage::HighlightAllOccurrences); } void SearchToolBar::updateHighlight() { hideHighlight(); if (m_highlightAllButton->isChecked()) { QWebPage::FindFlags ff = QWebPage::HighlightAllOccurrences; #if QT_VERSION >= 0x050700 ff.setFlag(QWebPage::FindCaseSensitively, m_matchCaseButton->isChecked()); #else if (m_matchCaseButton->isChecked()) { ff |= QWebPage::FindCaseSensitively; } #endif m_webView->findText(m_lineEdit->text(), ff); } } zeal-0.6.1/src/libs/ui/widgets/searchtoolbar.h000066400000000000000000000036651335333561500212760ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_SEARCHTOOLBAR_H #define ZEAL_WIDGETUI_SEARCHTOOLBAR_H #include class QLineEdit; class QToolButton; class QWebView; namespace Zeal { namespace WidgetUi { class SearchToolBar : public QWidget { Q_OBJECT public: explicit SearchToolBar(QWebView *webView, QWidget *parent = nullptr); void setText(const QString &text); void activate(); bool eventFilter(QObject *object, QEvent *event) override; protected: void hideEvent(QHideEvent *event) override; void showEvent(QShowEvent *event) override; void keyPressEvent(QKeyEvent *event) override; private: void findNext(); void findPrevious(); void hideHighlight(); void updateHighlight(); QLineEdit *m_lineEdit = nullptr; QToolButton *m_findNextButton = nullptr; QToolButton *m_findPreviousButton = nullptr; QToolButton *m_highlightAllButton = nullptr; QToolButton *m_matchCaseButton = nullptr; QWebView *m_webView = nullptr; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_SEARCHTOOLBAR_H zeal-0.6.1/src/libs/ui/widgets/shortcutedit.cpp000066400000000000000000000057121335333561500215150ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "shortcutedit.h" #include #include using namespace Zeal::WidgetUi; ShortcutEdit::ShortcutEdit(QWidget *parent) : ShortcutEdit(QString(), parent) { } ShortcutEdit::ShortcutEdit(const QString &text, QWidget *parent) : QLineEdit(text, parent) { connect(this, &QLineEdit::textChanged, [this](const QString &text) { m_key = QKeySequence(text, QKeySequence::NativeText)[0]; }); } bool ShortcutEdit::event(QEvent *event) { switch (event->type()) { case QEvent::KeyPress: { QKeyEvent *keyEvent = static_cast(event); switch (keyEvent->key()) { case Qt::Key_Alt: case Qt::Key_Control: case Qt::Key_Meta: case Qt::Key_Shift: return true; default: m_key = keyEvent->key(); m_key |= translateModifiers(keyEvent->modifiers(), keyEvent->text()); setText(keySequence().toString(QKeySequence::NativeText)); } return true; } case QEvent::ShortcutOverride: case QEvent::KeyRelease: case QEvent::Shortcut: return true; default: return QLineEdit::event(event); } } QKeySequence ShortcutEdit::keySequence() const { return QKeySequence(m_key); } void ShortcutEdit::setKeySequence(const QKeySequence &keySequence) { setText(keySequence.toString(QKeySequence::NativeText)); } // Inspired by QKeySequenceEditPrivate::translateModifiers() int ShortcutEdit::translateModifiers(Qt::KeyboardModifiers state, const QString &text) { int modifiers = 0; // The shift modifier only counts when it is not used to type a symbol // that is only reachable using the shift key if ((state & Qt::ShiftModifier) && (text.isEmpty() || !text.at(0).isPrint() || text.at(0).isLetterOrNumber() || text.at(0).isSpace())) { modifiers |= Qt::ShiftModifier; } modifiers |= state & Qt::ControlModifier; modifiers |= state & Qt::MetaModifier; modifiers |= state & Qt::AltModifier; return modifiers; } zeal-0.6.1/src/libs/ui/widgets/shortcutedit.h000066400000000000000000000031071335333561500211560ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_SHORTCUTEDIT_H #define ZEAL_WIDGETUI_SHORTCUTEDIT_H #include namespace Zeal { namespace WidgetUi { class ShortcutEdit : public QLineEdit { Q_OBJECT public: explicit ShortcutEdit(QWidget *parent = nullptr); explicit ShortcutEdit(const QString &text, QWidget *parent = nullptr); bool event(QEvent *event) override; QKeySequence keySequence() const; void setKeySequence(const QKeySequence &keySequence); private: int translateModifiers(Qt::KeyboardModifiers state, const QString &text); int m_key = 0; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_SHORTCUTEDIT_H zeal-0.6.1/src/libs/ui/widgets/toolbarframe.cpp000066400000000000000000000007141335333561500214460ustar00rootroot00000000000000#include "toolbarframe.h" #include using namespace Zeal::WidgetUi; ToolBarFrame::ToolBarFrame(QWidget *parent) : QWidget(parent) { setMaximumHeight(40); setMinimumHeight(40); } void ToolBarFrame::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); // Draw a line at the bottom. QPainter painter(this); painter.setPen(palette().mid().color()); painter.drawLine(0, height() - 1, width() - 1, height() - 1); } zeal-0.6.1/src/libs/ui/widgets/toolbarframe.h000066400000000000000000000006131335333561500211110ustar00rootroot00000000000000#ifndef ZEAL_WIDGETUI_TOOLBARFRAME_H #define ZEAL_WIDGETUI_TOOLBARFRAME_H #include namespace Zeal { namespace WidgetUi { class ToolBarFrame : public QWidget { Q_OBJECT public: explicit ToolBarFrame(QWidget *parent = nullptr); private: void paintEvent(QPaintEvent *event) override; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_TOOLBARFRAME_H zeal-0.6.1/src/libs/ui/widgets/webview.cpp000066400000000000000000000222111335333561500204350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "webview.h" #include "webviewtab.h" #include "../mainwindow.h" #include #include #include #include #include #include #include #include using namespace Zeal::WidgetUi; WebView::WebView(QWidget *parent) : QWebView(parent) { page()->setNetworkAccessManager(Core::Application::instance()->networkManager()); } int WebView::zoomLevel() const { return m_zoomLevel; } void WebView::setZoomLevel(int level) { if (level == m_zoomLevel) { return; } level = qMax(0, level); level = qMin(level, availableZoomLevels().size() - 1); m_zoomLevel = level; setZoomFactor(availableZoomLevels().at(level) / 100.0); emit zoomLevelChanged(); } const QVector &WebView::availableZoomLevels() { static const QVector zoomLevels = {30, 40, 50, 67, 80, 90, 100, 110, 120, 133, 150, 170, 200, 220, 233, 250, 270, 285, 300}; return zoomLevels; } const int &WebView::defaultZoomLevel() { static const int level = availableZoomLevels().indexOf(100); return level; } void WebView::zoomIn() { setZoomLevel(m_zoomLevel + 1); } void WebView::zoomOut() { setZoomLevel(m_zoomLevel - 1); } void WebView::resetZoom() { setZoomLevel(defaultZoomLevel()); } QWebView *WebView::createWindow(QWebPage::WebWindowType type) { Q_UNUSED(type) return Core::Application::instance()->mainWindow()->createTab()->m_webView; } void WebView::contextMenuEvent(QContextMenuEvent *event) { #if QT_VERSION >= 0x050600 const QWebHitTestResult hitTestResult = hitTestContent(event->pos()); // Return standard menu for input fields. if (hitTestResult.isContentEditable()) { QWebView::contextMenuEvent(event); return; } event->accept(); if (m_contextMenu) { m_contextMenu->deleteLater(); } QMenu *m_contextMenu = new QMenu(this); const QUrl linkUrl = hitTestResult.linkUrl(); const QString linkText = hitTestResult.linkText(); if (linkUrl.isValid()) { const QString scheme = linkUrl.scheme(); if (scheme != QLatin1String("javascript")) { m_contextMenu->addAction(tr("Open Link in New Tab"), this, [this]() { triggerPageAction(QWebPage::WebAction::OpenLinkInNewWindow); }); } if (scheme != QLatin1String("qrc")) { if (scheme != QLatin1String("javascript")) { m_contextMenu->addAction(tr("Open Link in Desktop Browser"), this, [linkUrl]() { QDesktopServices::openUrl(linkUrl); }); } m_contextMenu->addAction(pageAction(QWebPage::CopyLinkToClipboard)); } } if (hitTestResult.isContentSelected()) { if (!m_contextMenu->isEmpty()) { m_contextMenu->addSeparator(); } m_contextMenu->addAction(pageAction(QWebPage::Copy)); } if (!linkUrl.isValid() && url().scheme() != QLatin1String("qrc")) { if (!m_contextMenu->isEmpty()) { m_contextMenu->addSeparator(); } m_contextMenu->addAction(pageAction(QWebPage::Back)); m_contextMenu->addAction(pageAction(QWebPage::Forward)); m_contextMenu->addSeparator(); m_contextMenu->addAction(tr("Open Page in Desktop Browser"), this, [this]() { QDesktopServices::openUrl(url()); }); } if (m_contextMenu->isEmpty()) { return; } m_contextMenu->popup(event->globalPos()); #else QWebView::contextMenuEvent(event); #endif } void WebView::mousePressEvent(QMouseEvent *event) { switch (event->button()) { case Qt::BackButton: back(); event->accept(); return; case Qt::ForwardButton: forward(); event->accept(); return; case Qt::LeftButton: case Qt::MiddleButton: m_clickedLink = hitTestContent(event->pos()).linkUrl(); if (!m_clickedLink.isValid() || m_clickedLink.scheme() == QLatin1String("javascript")) { break; } event->accept(); return; default: break; } QWebView::mousePressEvent(event); } void WebView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() != Qt::LeftButton && event->button() != Qt::MiddleButton) { QWebView::mouseReleaseEvent(event); return; } const QUrl clickedLink = hitTestContent(event->pos()).linkUrl(); if (!clickedLink.isValid() || clickedLink != m_clickedLink || clickedLink.scheme() == QLatin1String("javascript")) { QWebView::mouseReleaseEvent(event); return; } if (isUrlExternal(clickedLink)) { switch (Core::Application::instance()->settings()->externalLinkPolicy) { case Core::Settings::ExternalLinkPolicy::Open: break; case Core::Settings::ExternalLinkPolicy::Ask: { QScopedPointer mb(new QMessageBox()); mb->setIcon(QMessageBox::Question); mb->setText(tr("How do you want to open the external link?
URL: %1") .arg(clickedLink.toString())); QCheckBox *checkBox = new QCheckBox("Do ¬ ask again"); mb->setCheckBox(checkBox); QPushButton *openInBrowserButton = mb->addButton(tr("Open in &Desktop Browser"), QMessageBox::ActionRole); QPushButton *openInZealButton = mb->addButton(tr("Open in &Zeal"), QMessageBox::ActionRole); mb->addButton(QMessageBox::Cancel); mb->setDefaultButton(openInBrowserButton); if (mb->exec() == QMessageBox::Cancel) { event->accept(); return; } if (mb->clickedButton() == openInZealButton) { if (checkBox->isChecked()) { Core::Application::instance()->settings()->externalLinkPolicy = Core::Settings::ExternalLinkPolicy::Open; Core::Application::instance()->settings()->save(); } break; } else if (mb->clickedButton() == openInBrowserButton) { if (checkBox->isChecked()) { Core::Application::instance()->settings()->externalLinkPolicy = Core::Settings::ExternalLinkPolicy::OpenInSystemBrowser; Core::Application::instance()->settings()->save(); } } } case Core::Settings::ExternalLinkPolicy::OpenInSystemBrowser: QDesktopServices::openUrl(clickedLink); event->accept(); return; } } switch (event->button()) { case Qt::LeftButton: if (!(event->modifiers() & Qt::ControlModifier || event->modifiers() & Qt::ShiftModifier)) { load(clickedLink); event->accept(); return; } case Qt::MiddleButton: createWindow(QWebPage::WebBrowserWindow)->load(clickedLink); event->accept(); return; default: break; } QWebView::mouseReleaseEvent(event); } void WebView::wheelEvent(QWheelEvent *event) { if (event->modifiers() & Qt::ControlModifier) { const QPoint angleDelta = event->angleDelta(); int delta = qAbs(angleDelta.x()) > qAbs(angleDelta.y()) ? angleDelta.x() : angleDelta.y(); const int direction = delta > 0 ? 1 : -1; int levelDelta = 0; while (delta * direction >= 120) { levelDelta += direction; delta -= 120 * direction; } setZoomLevel(m_zoomLevel + levelDelta); event->accept(); return; } QWebView::wheelEvent(event); } QWebHitTestResult WebView::hitTestContent(const QPoint &pos) const { return page()->mainFrame()->hitTestContent(pos); } bool WebView::isUrlExternal(const QUrl &url) { static const QStringList localSchemes = { QStringLiteral("file"), QStringLiteral("qrc"), }; const QString scheme = url.scheme(); return !scheme.isEmpty() && !localSchemes.contains(scheme); } zeal-0.6.1/src/libs/ui/widgets/webview.h000066400000000000000000000040651335333561500201110ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_WEBVIEW_H #define ZEAL_WIDGETUI_WEBVIEW_H #include #include #include namespace Zeal { namespace WidgetUi { class WebView : public QWebView { Q_OBJECT public: explicit WebView(QWidget *parent = nullptr); int zoomLevel() const; void setZoomLevel(int level); static const QVector &availableZoomLevels(); static const int &defaultZoomLevel(); public slots: void zoomIn(); void zoomOut(); void resetZoom(); signals: void zoomLevelChanged(); protected: QWebView *createWindow(QWebPage::WebWindowType type) override; void contextMenuEvent(QContextMenuEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void wheelEvent(QWheelEvent *event) override; private: QWebHitTestResult hitTestContent(const QPoint &pos) const; static bool isUrlExternal(const QUrl &url); QMenu *m_contextMenu = nullptr; QUrl m_clickedLink; int m_zoomLevel = defaultZoomLevel(); }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_WEBVIEW_H zeal-0.6.1/src/libs/ui/widgets/webviewtab.cpp000066400000000000000000000070221335333561500211270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "webviewtab.h" #include "searchtoolbar.h" #include "webview.h" #include #include #include #include #include #include #include using namespace Zeal::WidgetUi; WebViewTab::WebViewTab(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); m_webView = new WebView(); connect(m_webView->page(), &QWebPage::linkHovered, [this](const QString &link) { if (link.startsWith(QLatin1String("file:")) || link.startsWith(QLatin1String("qrc:"))) return; setToolTip(link); }); connect(m_webView, &QWebView::titleChanged, this, &WebViewTab::titleChanged); connect(m_webView, &QWebView::urlChanged, this, &WebViewTab::urlChanged); layout->addWidget(m_webView); setLayout(layout); } int WebViewTab::zoomLevel() const { return m_webView->zoomLevel(); } void WebViewTab::setZoomLevel(int level) { m_webView->setZoomLevel(level); } void WebViewTab::setWebBridgeObject(const QString &name, QObject *object) { connect(m_webView->page()->mainFrame(), &QWebFrame::javaScriptWindowObjectCleared, this, [=]() { m_webView->page()->mainFrame()->addToJavaScriptWindowObject(name, object); }); } void WebViewTab::load(const QUrl &url) { m_webView->load(url); } void WebViewTab::focus() { m_webView->setFocus(); } void WebViewTab::activateSearchBar() { if (m_searchToolBar == nullptr) { m_searchToolBar = new SearchToolBar(m_webView); layout()->addWidget(m_searchToolBar); } if (m_webView->hasSelection()) { const QString selectedText = m_webView->selectedText().simplified(); if (!selectedText.isEmpty()) { m_searchToolBar->setText(selectedText); } } m_searchToolBar->activate(); } void WebViewTab::back() { m_webView->back(); } void WebViewTab::forward() { m_webView->forward(); } bool WebViewTab::canGoBack() const { return m_webView->history()->canGoBack(); } bool WebViewTab::canGoForward() const { return m_webView->history()->canGoForward(); } QString WebViewTab::title() const { return m_webView->title(); } QUrl WebViewTab::url() const { return m_webView->url(); } QWebHistory *WebViewTab::history() const { return m_webView->history(); } void WebViewTab::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Slash: activateSearchBar(); break; default: event->ignore(); break; } } zeal-0.6.1/src/libs/ui/widgets/webviewtab.h000066400000000000000000000037311335333561500205770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Copyright (C) 2013-2014 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_WIDGETUI_WEBVIEWTAB_H #define ZEAL_WIDGETUI_WEBVIEWTAB_H #include class QWebHistory; namespace Zeal { namespace WidgetUi { class SearchToolBar; class WebView; class WebViewTab : public QWidget { Q_OBJECT public: explicit WebViewTab(QWidget *parent = nullptr); void load(const QUrl &url); void focus(); bool canGoBack() const; bool canGoForward() const; QString title() const; QUrl url() const; QWebHistory *history() const; int zoomLevel() const; void setZoomLevel(int level); void setWebBridgeObject(const QString &name, QObject *object); signals: void titleChanged(const QString &title); void urlChanged(const QUrl &url); public slots: void activateSearchBar(); void back(); void forward(); protected: void keyPressEvent(QKeyEvent *event) override; private: friend class WebView; WebView *m_webView = nullptr; SearchToolBar *m_searchToolBar = nullptr; }; } // namespace WidgetUi } // namespace Zeal #endif // ZEAL_WIDGETUI_WEBVIEWTAB_H zeal-0.6.1/src/libs/util/000077500000000000000000000000001335333561500151555ustar00rootroot00000000000000zeal-0.6.1/src/libs/util/CMakeLists.txt000066400000000000000000000006661335333561500177250ustar00rootroot00000000000000# Nothing to moc here, so avoid empty build units. set(CMAKE_AUTOMOC OFF) add_library(Util plist.cpp sqlitedatabase.cpp version.cpp ) find_package(Qt5Core REQUIRED) target_link_libraries(Util Qt5::Core) find_package(SQLite REQUIRED) include_directories(${SQLite_INCLUDE_DIR}) target_link_libraries(Util ${SQLite_LIBRARY}) # TODO: Do not export SQLite headers. target_include_directories(Util PUBLIC ${SQLite_INCLUDE_DIR}) zeal-0.6.1/src/libs/util/plist.cpp000066400000000000000000000043671335333561500170260ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "plist.h" #include #include using namespace Zeal::Util; Plist::Plist() : QHash() { } bool Plist::read(const QString &fileName) { QScopedPointer file(new QFile(fileName)); if (!file->open(QIODevice::ReadOnly)) { // TODO: Report/log error m_hasError = true; return false; } QXmlStreamReader xml(file.data()); while (!xml.atEnd()) { const QXmlStreamReader::TokenType token = xml.readNext(); if (token != QXmlStreamReader::StartElement) continue; if (xml.name() != QLatin1String("key")) continue; // TODO: Should it fail here? const QString key = xml.readElementText(); // Skip whitespaces between tags while (xml.readNext() == QXmlStreamReader::Characters); if (xml.tokenType() != QXmlStreamReader::StartElement) continue; QVariant value; if (xml.name() == QLatin1String("string")) value = xml.readElementText(); else if (xml.name() == QLatin1String("true")) value = true; else if (xml.name() == QLatin1String("false")) value = false; else continue; // Skip unknown types insert(key, value); } return m_hasError; } bool Plist::hasError() const { return m_hasError; } zeal-0.6.1/src/libs/util/plist.h000066400000000000000000000024021335333561500164570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_UTIL_PLIST_H #define ZEAL_UTIL_PLIST_H #include #include namespace Zeal { namespace Util { class Plist : public QHash { public: Plist(); bool read(const QString &fileName); bool hasError() const; private: bool m_hasError = false; }; } // namespace Util } // namespace Zeal #endif // ZEAL_UTIL_PLIST_H zeal-0.6.1/src/libs/util/sqlitedatabase.cpp000066400000000000000000000133051335333561500206510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "sqlitedatabase.h" #include using namespace Zeal::Util; SQLiteDatabase::SQLiteDatabase(const QString &path) { if (sqlite3_initialize() != SQLITE_OK) return; if (sqlite3_open16(path.constData(), &m_db) != SQLITE_OK) { updateLastError(); close(); } } SQLiteDatabase::~SQLiteDatabase() { finalize(); close(); } bool SQLiteDatabase::isOpen() const { return m_db != nullptr; } QStringList SQLiteDatabase::tables() { // FIXME: Do not use the shared statement. Q_ASSERT(!m_stmt); static const QString sql = QStringLiteral("SELECT name" " FROM" " (SELECT * FROM sqlite_master UNION ALL" " SELECT * FROM sqlite_temp_master)" " WHERE type='table'" " ORDER BY name"); if (m_db == nullptr || !prepare(sql)) { return {}; } QStringList list; while (next()) { list.append(value(0).toString()); } return list; } QStringList SQLiteDatabase::views() { // FIXME: Do not use the shared statement. Q_ASSERT(!m_stmt); static const QString sql = QStringLiteral("SELECT name" " FROM" " (SELECT * FROM sqlite_master UNION ALL" " SELECT * FROM sqlite_temp_master)" " WHERE type='view'" " ORDER BY name"); if (m_db == nullptr || !prepare(sql)) { return {}; } QStringList list; while (next()) { list.append(value(0).toString()); } return list; } bool SQLiteDatabase::prepare(const QString &sql) { if (m_db == nullptr) { return false; } if (m_stmt != nullptr) { finalize(); } m_lastError.clear(); sqlite3_mutex_enter(sqlite3_db_mutex(m_db)); const void *pzTail = nullptr; const int res = sqlite3_prepare16_v2(m_db, sql.constData(), (sql.size() + 1) * 2, &m_stmt, &pzTail); // 2 = sizeof(QChar) sqlite3_mutex_leave(sqlite3_db_mutex(m_db)); if (res != SQLITE_OK) { // "Unable to execute statement" updateLastError(); finalize(); return false; } else if (pzTail && !QString(static_cast(pzTail)).trimmed().isEmpty()) { // Unable to execute multiple statements at a time updateLastError(); finalize(); return false; } return true; } bool SQLiteDatabase::next() { if (m_stmt == nullptr) return false; sqlite3_mutex_enter(sqlite3_db_mutex(m_db)); const int res = sqlite3_step(m_stmt); sqlite3_mutex_leave(sqlite3_db_mutex(m_db)); switch (res) { case SQLITE_ROW: return true; case SQLITE_DONE: case SQLITE_CONSTRAINT: case SQLITE_ERROR: case SQLITE_MISUSE: case SQLITE_BUSY: default: updateLastError(); } return false; } bool SQLiteDatabase::execute(const QString &sql) { if (m_db == nullptr) { return false; } m_lastError.clear(); char *errmsg = nullptr; const int rc = sqlite3_exec(m_db, sql.toUtf8(), nullptr, nullptr, &errmsg); if (rc != SQLITE_OK) { if (errmsg) { m_lastError = QString::fromUtf8(errmsg); sqlite3_free(errmsg); } return false; } return true; } QVariant SQLiteDatabase::value(int index) const { Q_ASSERT(index >= 0); // sqlite3_data_count() returns 0 if m_stmt is nullptr. if (index >= sqlite3_data_count(m_stmt)) return QVariant(); sqlite3_mutex_enter(sqlite3_db_mutex(m_db)); const int type = sqlite3_column_type(m_stmt, index); QVariant ret; switch (type) { case SQLITE_INTEGER: ret = sqlite3_column_int64(m_stmt, index); break; case SQLITE_NULL: ret = QVariant(QVariant::String); break; default: ret = QString(static_cast(sqlite3_column_text16(m_stmt, index)), sqlite3_column_bytes16(m_stmt, index) / 2); // 2 = sizeof(QChar) break; } sqlite3_mutex_leave(sqlite3_db_mutex(m_db)); return ret; } QString SQLiteDatabase::lastError() const { return m_lastError; } void SQLiteDatabase::close() { sqlite3_close(m_db); m_db = nullptr; } void SQLiteDatabase::finalize() { sqlite3_finalize(m_stmt); m_stmt = nullptr; } void SQLiteDatabase::updateLastError() { if (!m_db) return; m_lastError = QString(static_cast(sqlite3_errmsg16(m_db))); } sqlite3 *SQLiteDatabase::handle() const { return m_db; } zeal-0.6.1/src/libs/util/sqlitedatabase.h000066400000000000000000000032741335333561500203220ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Jerzy Kozera ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_UTIL_SQLITEDATABASE_H #define ZEAL_UTIL_SQLITEDATABASE_H #include #include struct sqlite3; struct sqlite3_stmt; namespace Zeal { namespace Util { class SQLiteDatabase { public: explicit SQLiteDatabase(const QString &path); virtual ~SQLiteDatabase(); bool isOpen() const; QStringList tables(); QStringList views(); bool prepare(const QString &sql); bool next(); bool execute(const QString &sql); QVariant value(int index) const; QString lastError() const; sqlite3 *handle() const; private: void close(); void finalize(); void updateLastError(); sqlite3 *m_db = nullptr; sqlite3_stmt *m_stmt = nullptr; QString m_lastError; }; } // namespace Util } // namespace Zeal #endif // ZEAL_UTIL_SQLITEDATABASE_H zeal-0.6.1/src/libs/util/version.cpp000066400000000000000000000044701335333561500173530ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #include "version.h" #include using namespace Zeal::Util; Version::Version(uint major, uint minor, uint patch) : m_major(major), m_minor(minor), m_patch(patch) { } Version::Version(const QString &str) { m_valid = fromString(str); } bool Version::isValid() const { return m_valid; } QString Version::toString() const { return QStringLiteral("%1.%2.%3").arg(m_major).arg(m_minor).arg(m_patch); } bool Version::fromString(const QString &str) { const QStringList parts = str.split(QLatin1Char('.')); if (parts.size() != 3) return false; bool ok; m_major = parts[0].toUInt(&ok); if (!ok) return false; m_minor = parts[1].toUInt(&ok); if (!ok) return false; m_patch = parts[2].toUInt(&ok); if (!ok) return false; return true; } namespace Zeal { namespace Util { bool operator==(const Version &lhs, const Version &rhs) { return lhs.m_major == rhs.m_major && lhs.m_minor == rhs.m_minor && lhs.m_patch == rhs.m_patch; } bool operator<(const Version &lhs, const Version &rhs) { if (lhs.m_major < rhs.m_major) return true; else if (lhs.m_major > rhs.m_major) return false; if (lhs.m_minor < rhs.m_minor) return true; else if (lhs.m_minor > rhs.m_minor) return false; if (lhs.m_patch < rhs.m_patch) return true; return false; } } // namespace Util } // namespace Zeal zeal-0.6.1/src/libs/util/version.h000066400000000000000000000040241335333561500170130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015-2016 Oleg Shparber ** Contact: https://go.zealdocs.org/l/contact ** ** This file is part of Zeal. ** ** Zeal 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. ** ** Zeal 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 Zeal. If not, see . ** ****************************************************************************/ #ifndef ZEAL_UTIL_VERSION_H #define ZEAL_UTIL_VERSION_H #include namespace Zeal { namespace Util { // Based on Semantic Versioning (http://semver.org/) // TODO: Add support for prerelease tags and build metadata class Version { public: Version(uint major = 0, uint minor = 0, uint patch = 0); Version(const QString &str); bool isValid() const; QString toString() const; friend bool operator==(const Version &lhs, const Version &rhs); friend bool operator< (const Version &lhs, const Version &rhs); friend bool operator!=(const Version &lhs, const Version &rhs) { return !operator==(lhs, rhs); } friend bool operator> (const Version &lhs, const Version &rhs) { return operator< (rhs, lhs); } friend bool operator<=(const Version &lhs, const Version &rhs) { return !operator> (lhs, rhs); } friend bool operator>=(const Version &lhs, const Version &rhs) { return !operator< (lhs, rhs); } private: bool fromString(const QString &str); bool m_valid = true; uint m_major = 0; uint m_minor = 0; uint m_patch = 0; }; } // namespace Util } // namespace Zeal #endif // ZEAL_UTIL_VERSION_H