pax_global_header00006660000000000000000000000064132316616310014514gustar00rootroot0000000000000052 comment=a23ec0a8abbcee2f03e36a9698c1c2774b29f8ff qstardict-qstardict-1.3/000077500000000000000000000000001323166163100153515ustar00rootroot00000000000000qstardict-qstardict-1.3/.gitignore000066400000000000000000000002421323166163100173370ustar00rootroot00000000000000qstardict/qstardict qstardict/translations/*.qm *.o *.so moc_*.cpp qrc_*.cpp ui_*.h Makefile .*.sw[a-z] CMakeLists.txt.user *.pro.user build-kdeplasma-* *-meta.h qstardict-qstardict-1.3/AUTHORS000066400000000000000000000011001323166163100164110ustar00rootroot00000000000000Alexander Rodin The authors of the StarDict plugin: Hu Zheng Opera Wang Rickard E. Faith The author of the SWAC plugin: Nicolas Vion The author of the Multitran plugin and KDE 4 plasmoid: Nick Shaforostoff QStarDict uses the Oxygen icons (http://oxygen-icons.org). The QStarDict icon is taken from an old revision of Oxygen Icons, originally it was commited to KDE SVN repository by Jeff Cooper . qstardict-qstardict-1.3/COPYING000066400000000000000000000431031323166163100164050ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qstardict-qstardict-1.3/ChangeLog000066400000000000000000000104261323166163100171260ustar00rootroot00000000000000* Version 0.01 - initial release * Version 0.02 - add dictionary directories selection in settings dialog - redesign menus - add Oxygen icons - add "Save translation" action - add pop up window opacity item to settings dialog - rename actions - add .desktop file * Version 0.03 - fix bug when build fails on x86_64 - fix categories in .desktop file - add option "Show pop up only if modifier pressed" in settings dialog - improve selection scanning - fix bug with closing window when it must hide - setting Qt 4.2 compitibility - add russian translation - add traditional chinese translation * Version 0.04 - add ukrainian translation - fix bug when popup window violates from desktop - add translations reformater - add popup window timeout before hide after mouse over to settings dialog - fix bug with "Up" buttons in settings dialog - add popup window default width and height items to settings dialog - change PopupWindow base class from QWidget to QFrame - add D-Bus support - make popup window resizable - add current translation title to main window header * Version 0.05 - fix bug with hard font-family in translation CSS - make popup window border more useful - fix bug with words list - add simplified chinese translation - fix bug with uncorrect displayed hierarchical lists - set to run only one instance of application - set to search for dictionaries recursively * Version 0.06 - add bulgarian translation - add speech support - fix bug with broken main window title when search is empty * Version 0.07 - add "translate" and "translateHtml" methods to D-Bus interface - change license from GPLv3 to GPLv2 * Version 0.08 - add czech translation - fix bug with multiple running from different users - add brazilian portuguese translation - update the traditional chinese translation - add support for configurable instant search - add support for separate translations * Version 0.09 - add polish translation - fix bug with instant search - add italian translation - fix bug with simlinks to dictionaries - add german translation - improve popup window - update the german translation - reorganize project - add basic Windows support - add plugins support - add toolbar to dictionary widget - add for links in translations (by pressing Ctrl and clicking on the word) - improve instant search - improve popup window - add support for closing popup by double click on toolbar * Version 0.10 - change tray icon if scanning disabled - add font editor - some improves and bugfixes * Version 0.11 - fix bug with bad source word - fix bug with removed last letter in translation * Version 0.12 - update italian translation - add support for popup window moving * Version 0.12.1 - fix critical bug with popup window * Version 0.12.2 - fix bug with building on Ubuntu Hardy * Version 0.12.3 - update simplified chinese translation * Version 0.12.4 - update polish translation * Version 0.12.5 - fix bug with main window title * Version 0.12.6 - update german translation * Version 0.12.7 - fix bug with empty speech cmd * Version 0.12.8 - add localization for standard Qt dialogs - add support for Escape key in main window - update ukrainian translation - update chinese translation - fix bug with speaker - remove alphabetical sorting of results - improve saving - add a tooltip for the tray icon * Version 0.12.9 - update german translation - fix typo in the COPYING filename * Version 0.13.0 - add french and turkish translation - improve Windows port - add SWAC and Multitran plugins - add command line support - improve the simplified chinese translation - fix bug with settings saving - improve D-Bus support - fix bug with Qt 4.5 * Version 0.13.1 - fix bugs with installation - add spanish translation - update italian and german translations * Version 0.13.2 - improve system tray support - improve the save dialog - updated the traditional chinese translation - added the lithuanian translation * Version 1.0 - search in dict widget - stabilized release after some months of usage * Version 1.0.1 - compilation fix for newer UNIX/Linux systems - fix for 'unsaved prefs' thanks to Robin 'cheese' Lee from Fedora Project * Version 1.1 - add support for showing translation by shortcut * Version 1.2 - Update libqxt * Version 1.3 - Fix KDE integration plugin qstardict-qstardict-1.3/Doxyfile000066400000000000000000001562511323166163100170710ustar00rootroot00000000000000# Doxyfile 1.5.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = qstardict # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = devel-doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, # and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h *.cpp # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is enabled by default, which results in a transparent # background. Warning: Depending on the platform used, enabling this option # may lead to badly anti-aliased labels on the edges of a graph (i.e. they # become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO qstardict-qstardict-1.3/INSTALL000066400000000000000000000017131323166163100164040ustar00rootroot00000000000000You need Qt >= 4.2 and glib >= 2.0. If you have QtDBus module QStarDict will be compiled with D-Bus support. To disable D-Bus support add NO_DBUS=1 to qmake arguments. To disable translations add NO_TRANSLATIONS=1 to qmake arguments. If you want to select plugins to compile add ENABLED_PLUGINS="plugin1 plugin2 ..." to qmake arguments. Available plugins: * stardict - supports StarDict dictionaries * web - supports any web search engine * swac - supports SWAC speaking system (http://shtooka.net) * multitran - supports Multitran dictionaries (http://multitran.sourceforge.net) By default the only "stardict" and "web" plugins enabled. To enable developer mode add DEVEL=1 to qmake arguments. In this mode you will be able to set QSTARDICT_PLUGINS_DIR environment variable to override default. To build and install: 1) qmake [switches] 2) make 3) make install If you want to compile KDE 4 plasmoid please read kdeplasma/COMPILING. qstardict-qstardict-1.3/README000066400000000000000000000005451323166163100162350ustar00rootroot00000000000000QStarDict is a StarDict clone written using Qt4. The user interface is similar to StarDict. Main features * Full support of StarDict dictionaries * Working in system tray * Scanning mouse selection and showing popup window with translation of the selected word * Translations reformatting * Pronouncing translated word * Plugins support * KDE 4 plasmoid qstardict-qstardict-1.3/README.MACOS000066400000000000000000000017721323166163100171010ustar00rootroot00000000000000QStarDict for macOS is set to be built as a "bundle" application. Distributed packages should contain all required stuff to run out-of-the-box. All following notes are important for developers. BUILDING REQUIREMENTS: * Qt4 libraries/frameworks (tested with macport's qt4-mac+universal) * glib2 devel environment (I'm using macports for it too) * all other libraries are propably part of mac's OS CONFIRURE PHASE: qmake it will build qstardict and install it into /opt (sudo make install will be required) or: qmake INSTALL_PREFIX=/absolute/path/to/selected/dir it will build qstardict and install it into this location. The path *must* be absolute. Relative path will cause install problems. example: qmake INSTALL_PREFIX=/Users/pvanek/oss/qstardict/release MAKE PHASE: just run: make INSTALL PHASE: make install DEPLOY PHASE: macdeployqt path/to/QStarDict.app/ or: macdeployqt path/to/QStarDict.app/ -dmg for dmg build (but I'm using another tool for it) qstardict-qstardict-1.3/README.WINDOWS000066400000000000000000000005111323166163100173570ustar00rootroot00000000000000qmake params for Windows: GLIB2PATH - path to the Glib-2.x development environment (includes, ...) ZLIBPATH - path to the Zlib development environment (includes, ...) sample usage: qmake GLIB2PATH=d:\oss\glib\ ZLIBPATH=d:\oss\zlib\ Requirements: Glib2 development env. Glib2 runtime env. Zlib env. qstardict-qstardict-1.3/README.md000066400000000000000000000017101323166163100166270ustar00rootroot00000000000000QStarDict is a StarDict clone written using Qt. The user interface is similar to StarDict. ### Main features ### * Full support of StarDict dictionaries * Working in system tray * Scanning mouse selection and showing popup window with translation of the selected word * Translations reformatting * Pronouncing translated word * Plugins support * KDE 4 plasmoid ### Installation ### QStarDict is available in Ubuntu, Debian and other distros repositories. If you want to compile it youself install Qt4 and GLib2 development files and run in the project's directory qmake INSTALL_PREFIX= make [sudo] make install More information about installation: * [GNU/Linux](https://github.com/therussianphysicist/qstardict/blob/master/INSTALL) * [macOS](https://github.com/therussianphysicist/qstardict/blob/master/README.MACOS) * [Windows](https://github.com/therussianphysicist/qstardict/blob/master/README.WINDOWS) qstardict-qstardict-1.3/THANKS000066400000000000000000000027611323166163100162720ustar00rootroot00000000000000Thanks to: Petr Vanek who offered some improves and added the Windows support, Mac OS X support Andrew Gaydenko who helped to fix a bug with building in x86_64 Vadim Kalinnikov who gave a hosting Hoopoe who added a traditional chinese translation Yurij Goncharuck who fixed bug when popup window violates from desktop and add ukrainian translation Truth who added a simplified chinese translation Nikola Valentinov Petrov who added a bulgarian translation Jiri Hlinka who added a czech translation Klaos Lacerda and Bruno Gonçalves who added a brazilian portuguese translation Zhengpeng Hou who updated the traditional chinese translation Grzegorz Gibas who added the polosh translation Simone Solinas who added the italian translation Stefan Kombrink who improved the popup window and update german translation Matthias Fehring who updated german translations Albert Tugushev who helped to fix bug with empty speech cmd Ilya Kotov who helped to improve localization Alex Koudr who helped with with mouse scanning on Windows Nicolas Vion who added the french translation Andriy Rysin who added the command line support Yao Ziyuan who improved the simplified chinese translation Serdar Soytetir who added the turkish translation Sergey Ilinyh who improved the D-Bus support Frank Ren who improved the save dialog Embarembar who added the lithuanian translation Frank Ren who updated the traditional chinese translation qstardict-qstardict-1.3/config.tests/000077500000000000000000000000001323166163100177575ustar00rootroot00000000000000qstardict-qstardict-1.3/config.tests/kde/000077500000000000000000000000001323166163100205225ustar00rootroot00000000000000qstardict-qstardict-1.3/config.tests/kde/kde.pro000066400000000000000000000001131323166163100220020ustar00rootroot00000000000000QT *= widgets KGlobalAccel KWindowSystem KNotifications SOURCES = main.cpp qstardict-qstardict-1.3/config.tests/kde/main.cpp000066400000000000000000000002211323166163100221450ustar00rootroot00000000000000#include #include #include int main(void) { new KStatusNotifierItem("qstardict", 0); } qstardict-qstardict-1.3/kdeplasma/000077500000000000000000000000001323166163100173125ustar00rootroot00000000000000qstardict-qstardict-1.3/kdeplasma/CMakeLists.txt000066400000000000000000000012441323166163100220530ustar00rootroot00000000000000project(kdeplasma-qstardict) cmake_minimum_required(VERSION 3.5) option(KF5 "Compile against KF5" ON) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) if (KF5) message(STATUS "Compile against KF5") find_package(Qt5Core REQUIRED) find_package(Qt5Gui REQUIRED) find_package(KF5Plasma REQUIRED) else(KF5) message(STATUS "Compile against KDE4") find_package(KDE4 REQUIRED) include (KDE4Defaults) endif(KF5) #include(MacroOptionalAddSubdirectory) add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES}) add_subdirectory(applet) add_subdirectory(dataengine) qstardict-qstardict-1.3/kdeplasma/COMPILING000066400000000000000000000001771323166163100205630ustar00rootroot00000000000000One can build and install Plasma widgets using following commands: cmake -D CMAKE_INSTALL_PREFIX=/usr . make sudo make install qstardict-qstardict-1.3/kdeplasma/applet/000077500000000000000000000000001323166163100205775ustar00rootroot00000000000000qstardict-qstardict-1.3/kdeplasma/applet/CMakeLists.txt000066400000000000000000000020021323166163100233310ustar00rootroot00000000000000project(plasma-qstardict) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(qstardict_SRCS dict.cpp) if (KF5) find_package(Qt5Widgets REQUIRED) find_package(KF5Completion REQUIRED) find_package(KF5ConfigWidgets REQUIRED) #include_directories(${Qt5Widgets_INCLUDES}Qt5::Widgets) set( CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}" ) add_library(plasma_applet_qstardict MODULE ${qstardict_SRCS}) set_target_properties(plasma_applet_qstardict PROPERTIES PREFIX "") target_link_libraries(plasma_applet_qstardict Qt5::Widgets Qt5::Gui KF5::Plasma KF5::Completion KF5::ConfigWidgets) plasma_install_package(. qstardict) else (KF5) kde4_add_plugin(plasma_applet_qstardict ${qstardict_SRCS}) target_link_libraries(plasma_applet_qstardict ${KDE4_PLASMA_LIBS} ${KDE4_KDEUI_LIBS}) install(TARGETS plasma_applet_qstardict DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES plasma-qstardict-default.desktop DESTINATION ${SERVICES_INSTALL_DIR}) endif (KF5) qstardict-qstardict-1.3/kdeplasma/applet/Messages.sh000077500000000000000000000001131323166163100227000ustar00rootroot00000000000000#! /usr/bin/env bash $XGETTEXT *.cpp -o $podir/plasma_applet_qstardict.pot qstardict-qstardict-1.3/kdeplasma/applet/dict.cpp000066400000000000000000000305461323166163100222360ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "dict.h" #include #include #include // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define AUTO_DEFINE_TIMEOUT 500 using namespace Plasma; const char* translationCSS = "body {\n" "font-size: 10pt; }\n" "font.dict_name {\n" "color: blue;\n" "font-style: italic; }\n" "font.title {\n" "font-size: 16pt;\n" "font-weight: bold; }\n" "font.explanation {\n" "color: #7f7f7f;\n" "font-style: italic; }\n" "font.abbreviature {\n" "font-style: italic; }\n" "font.example {\n" "font-style: italic; }\n" "font.transcription {\n" "font-weight: bold; }\n"; QStarDictApplet::QStarDictApplet(QObject *parent, const QVariantList &args) : Plasma::Applet(parent, args) , m_dictsModel(0) //m_flash(0) { setHasConfigurationInterface(true); setAspectRatioMode(Plasma::IgnoreAspectRatio); resize(500,200); } QStarDictApplet::~QStarDictApplet() { m_defBrowser->deleteLater(); } void QStarDictApplet::init() { // KConfigGroup cg = config(); m_wordEdit = new LineEdit(this); m_wordEdit->nativeWidget()->setClearButtonShown( true ); m_wordEdit->nativeWidget()->setClickMessage(i18n("Enter word to define here")); m_wordEdit->show(); //Plasma::Animator::self()->animateItem(m_wordEdit, Plasma::Animator::AppearAnimation); // m_defBrowser = new QWebView(); m_defBrowser = new QTextBrowser(); m_defBrowser->document()->setDefaultStyleSheet(QLatin1String(translationCSS)); m_defBrowserProxy = new QGraphicsProxyWidget(this); m_defBrowserProxy->setWidget(m_defBrowser); m_defBrowserProxy->hide(); // Icon in upper-left corner QString iconpath = KStandardDirs::locate("icon", "oxygen/scalable/apps/accessories-dictionary.svgz"); m_icon = new Plasma::IconWidget(this); m_icon->setSvg(iconpath); // Position lineedits //const int wordEditOffset = 40; m_icon->setPos(12,3); //m_wordProxyWidget->setPos(15 + wordEditOffset,7); //m_wordProxyWidget->show(); // TODO m_wordEdit->setDefaultTextColor(Plasma::Theme::self()->color(Plasma::Theme::TextColor)); // Timer for auto-define m_timer = new QTimer(this); m_timer->setInterval(AUTO_DEFINE_TIMEOUT); m_timer->setSingleShot(true); connect(m_timer, SIGNAL(timeout()), this, SLOT(define())); m_horLayout = new QGraphicsLinearLayout(Qt::Horizontal); m_horLayout->addItem(m_icon); m_horLayout->addItem(m_wordEdit); m_layout = new QGraphicsLinearLayout(Qt::Vertical); m_layout->addItem(m_horLayout); m_layout->addItem(m_defBrowserProxy); setLayout(m_layout); m_source.clear(); dataEngine("qstardict")->connectSource(m_source, this); connect(m_wordEdit, SIGNAL(editingFinished()), this, SLOT(define())); connect(m_wordEdit->nativeWidget(), SIGNAL(textChanged(const QString&)), this, SLOT(autoDefine(const QString&))); dataEngine("qstardict")->connectSource("list-dictionaries", this); //connect(m_defEdit, SIGNAL(linkActivated(const QString&)), this, SLOT(linkDefine(const QString&))); // This is the fix for links/selecting text //QGraphicsItem::GraphicsItemFlags flags = m_defEdit->flags(); //flags ^= QGraphicsItem::ItemIsMovable; // m_defEdit->setFlags(flags); /*m_flash = new Plasma::Flash(this); m_flash->setColor(Qt::gray); QFont fnt = qApp->font(); fnt.setBold(true); m_flash->setFont(fnt); m_flash->setPos(25,-10); m_flash->resize(QSize(200,20));*/ KConfigGroup cg = config(); m_dicts = cg.readEntry("KnownDictionaries", QStringList()); QStringList activeDictNames = cg.readEntry("ActiveDictionaries", QStringList()); for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i) m_activeDicts[*i]=activeDictNames.contains(*i); } void QStarDictApplet::linkDefine(const QString &text) { kDebug() <<"ACTIVATED"; m_wordEdit->setText(text); define(); } void QStarDictApplet::dataUpdated(const QString& source, const Plasma::DataEngine::Data &data) { if (source=="list-dictionaries") { QStringList newDicts=data["dictionaries"].toStringList(); bool changed=false; for (QStringList::const_iterator i = newDicts.constBegin(); i != newDicts.constEnd(); ++i) { if (!m_dicts.contains(*i)) { m_dicts<<*i; m_activeDicts[*i]=true; changed=true; } } QStringList::iterator it = m_dicts.begin(); while (it != m_dicts.end()) { if (!newDicts.contains(*it)) { it=m_dicts.erase(it); changed=true; } else ++it; } if (changed) configAccepted(); // cg.writeEntry("KnownDictionaries", m_dicts); } // Q_UNUSED(source); /*if (m_flash) { m_flash->kill(); }*/ if (!m_source.isEmpty()) { m_defBrowserProxy->show(); // TODO Phase::self()->animateItem(m_defBrowserProxy, Phase::Appear); } /* if (data.contains("gcide")) { QString defHeader; m_defList = data[QString("gcide")].toString().split(""); // for (int n = 0; n < m_defList.size(); ++n) { if (m_defList[n].contains("") && m_defList[n].contains("")) { defHeader=m_defList[n]; } else if (m_defList[n].contains("")) { defHeader=m_defList.takeAt(n); } if (n < m_defList.size() && !m_defList[n].contains("")) m_defList[n].prepend(defHeader); } if (m_defList.size() > 1) m_defList.removeAt(0); m_i = m_defList.begin(); m_defEdit->setHtml(*m_i); if (m_i != --m_defList.end()) m_rightArrow->show(); else m_rightArrow->hide(); m_leftArrow->hide(); } */ if (data.contains("text")) { m_defBrowser->setHtml(data[QString("text")].toString()); // m_defBrowser->setHtml(wnToHtml(data[QString("wn")].toString())); } updateGeometry(); } void QStarDictApplet::define() { if (m_timer->isActive()) m_timer->stop(); QString newSource=m_wordEdit->text(); QStringList dictsList; for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i) if (m_activeDicts.contains(*i) && m_activeDicts.value(*i)) dictsList<<*i; if (!newSource.isEmpty() && !dictsList.isEmpty()) newSource.prepend(dictsList.join(",")+':'); if (newSource == m_source) return; dataEngine("qstardict")->disconnectSource(m_source, this); qWarning()<<"here"<flash(i18n("Looking up ") + m_word); m_source = newSource; dataEngine("qstardict")->connectSource(m_source, this); qWarning()<<"connectSource"<animateItem(m_defBrowserProxy, Phase::Disappear); m_defBrowserProxy->hide(); } updateConstraints(); } void QStarDictApplet::autoDefine(const QString &word) { Q_UNUSED(word) m_timer->start(); } class CheckableStringListModel: public QStringListModel { public: CheckableStringListModel(QObject* parent, const QStringList& dicts, const QHash& activeDicts_) : QStringListModel(parent) , activeDicts(activeDicts_) { setStringList(dicts); /* setHeaderData (0, Qt::Horizontal, "020", Qt::DisplayRole); setHeaderData (0, Qt::Vertical, "020", Qt::DisplayRole);*/ } QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const { Q_UNUSED(section) Q_UNUSED(orientation) if (role!=Qt::DisplayRole) return QVariant(); return i18n("Dictionary"); } Qt::DropActions supportedDropActions() const{return Qt::MoveAction;} Qt::ItemFlags flags(const QModelIndex& index) const { if (!index.isValid()) return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled; } bool setData (const QModelIndex& index, const QVariant& value, int role=Qt::EditRole) { if (role==Qt::CheckStateRole) { activeDicts[stringList().at(index.row())]=value.toInt()==Qt::Checked; return true; } else return QStringListModel::setData(index,value,role); } QVariant data(const QModelIndex& index, int role=Qt::EditRole) const { if (!index.isValid()) return QVariant(); if (role==Qt::CheckStateRole) return ( activeDicts.contains(stringList().at(index.row()))&&activeDicts.value(stringList().at(index.row())) )?Qt::Checked:Qt::Unchecked; return QStringListModel::data(index,role); } public: QHash activeDicts; }; void QStarDictApplet::createConfigurationInterface(KConfigDialog *parent) { // KConfigGroup cg = config(); //QWidget *widget = new QWidget(parent); // QListView* widget=new KEditListBox(i18n("Dictionaries activation and order"), // KEditListBox::CustomEditor::CustomEditor(), // parent, // "dict-order", // false, // KEditListBox::UpDown); // QListView* widget=new QListView(parent); QTreeView* widget=new QTreeView(parent); widget->setDragEnabled(true); widget->setAcceptDrops(true); // widget->viewposrt()->setAcceptDrops(true); widget->setDragDropMode(QAbstractItemView::InternalMove); widget->setDropIndicatorShown(true); widget->setItemsExpandable(false); widget->setAllColumnsShowFocus(true); widget->setRootIsDecorated(false); delete m_dictsModel; m_dictsModel=new CheckableStringListModel(parent,m_dicts,m_activeDicts); widget->setModel(m_dictsModel); // parent->setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Apply ); parent->addPage(widget, parent->windowTitle(), Applet::icon()); connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted())); connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted())); } void QStarDictApplet::configAccepted() { if (m_dictsModel) { m_dicts=m_dictsModel->stringList(); m_activeDicts=m_dictsModel->activeDicts; } KConfigGroup cg = config(); cg.writeEntry("KnownDictionaries", m_dicts); QStringList activeDictNames; for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i) if (m_activeDicts.contains(*i) && m_activeDicts.value(*i)) activeDictNames<<*i; cg.writeEntry("ActiveDictionaries", activeDictNames); define(); emit configNeedsSaving(); } K_EXPORT_PLASMA_APPLET(qstardict, QStarDictApplet) qstardict-qstardict-1.3/kdeplasma/applet/dict.h000066400000000000000000000045021323166163100216740ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DICT_H #define DICT_H #include #include class QTimer; class CheckableStringListModel; class QTextBrowser; class QGraphicsProxyWidget; class QGraphicsLinearLayout; namespace Plasma { class IconWidget; class LineEdit; } class QStarDictApplet: public Plasma::Applet { Q_OBJECT public: QStarDictApplet(QObject *parent, const QVariantList &args); ~QStarDictApplet(); void init(); void setPath(const QString&); public slots: void dataUpdated(const QString &name, const Plasma::DataEngine::Data &data); void autoDefine(const QString &word); void linkDefine(const QString &word); protected slots: void define(); void configAccepted(); protected: void createConfigurationInterface(KConfigDialog *parent); private: QString m_source; QTimer* m_timer; //QGraphicsPixmapItem *m_graphicsIcon; QGraphicsLinearLayout *m_layout; QGraphicsLinearLayout *m_horLayout; Plasma::LineEdit *m_wordEdit; //Plasma::Flash *m_flash; QStringList m_defList; QStringList::iterator m_i; QTextBrowser* m_defBrowser; QGraphicsProxyWidget *m_defBrowserProxy; Plasma::IconWidget *m_icon; // QList< QPair > m_dicts; QPointer m_dictsModel; QStringList m_dicts; QHash m_activeDicts; }; #endif qstardict-qstardict-1.3/kdeplasma/applet/plasma-qstardict-default.desktop000066400000000000000000000066601323166163100270750ustar00rootroot00000000000000[Desktop Entry] Name=QStarDict Dictionary Name[ca]=QStarDict Diccionari Name[cs]=QStarDict Slovník Name[csb]=QStarDict Slowôrz Name[da]=QStarDict Ordbog Name[de]=QStarDict Wörterbuch Name[el]=QStarDict Λεξικό Name[es]=QStarDict Diccionario Name[et]=QStarDict Sõnaraamat Name[fi]=QStarDict Sanakirja Name[fr]=QStarDict Dictionnaire Name[ga]=QStarDict Foclóir Name[gl]=QStarDict Dicionario Name[hu]=QStarDict Szótár Name[it]=QStarDict Dizionario Name[ja]=QStarDict 辞書 Name[km]=QStarDict វចនានុក្រម Name[ko]=QStarDict 사전 Name[lv]=QStarDict VÄrdnÄ«ca Name[ms]=QStarDict Kamus Name[nds]=QStarDict Wöörbook Name[nl]=QStarDict Woordenboek Name[nn]=QStarDict Ordbok Name[oc]=QStarDict Diccionari Name[pa]=QStarDict ਡਿਕਸ਼ਨਰੀ Name[pl]=QStarDict SÅ‚ownik Name[pt]=QStarDict Dicionário Name[pt_BR]=QStarDict Dicionário Name[ro]=QStarDict DicÈ›ionar Name[ru]=Словарь QStarDict Name[sl]=QStarDict Slovar Name[sr]=QStarDict речник Name[sr@latin]=QStarDict reÄnik Name[sv]=QStarDict Ordlista Name[th]=QStarDict พจนานุà¸à¸£à¸¡ Name[tr]=QStarDict Sözlük Name[uk]=Словник QStarDict Name[wa]=QStarDict Motî Name[x-test]=xxQStarDict Dictionaryxx Name[zh_CN]=QStarDict è¯å…¸ Name[zh_TW]=QStarDict å­—å…¸ Comment=Look up the meaning of words Comment[ca]=Cerca el significat de les paraules Comment[cs]=Vyhledat význam slov Comment[csb]=Szëkôj za znaczeniama słów Comment[da]=SlÃ¥ ords betydning op Comment[de]=Die Bedeutung von Wörtern nachschlagen Comment[el]=Αναζήτηση σημασίας λέξεων Comment[es]=Busca el significado de las palabras Comment[et]=Sõnade tähenduse otsimine Comment[fi]=Etsi sanojen merkityksiä Comment[fr]=Recherche la signification d'un mot Comment[ga]=Aimsigh sainmhíniú ar fhocal Comment[gl]=Procura o significado de palabras Comment[hu]=Angol nyelvű értelmezÅ‘ szótár Comment[it]=Cerca il significato delle parole Comment[ja]=å˜èªžã®æ„味を調ã¹ã¾ã™ Comment[km]=រក​មើល​អážáŸ’ážáž“áŸáž™â€‹ážšáž”ស់​ពាក្យ Comment[ko]=ë‹¨ì–´ì˜ ëœ»ì„ ì°¾ìŠµë‹ˆë‹¤ Comment[lv]=UzmeklÄ“ vÄrdu nozÄ«mes Comment[nds]=Kiekt de Bedüden vun Wöör na Comment[nl]=Zoek de betekenis van woorden op Comment[nn]=SlÃ¥ opp tydinga til ord Comment[pa]=ਸ਼ਬਦਾਂ ਦੇ ਅਰਥ ਵੇਖੋ Comment[pl]=Szukanie znaczeÅ„ słów Comment[pt]=Procurar o significado das palavras Comment[pt_BR]=Procurar o significado das palavras Comment[ro]=Caută semnificaÈ›ia cuvintelor Comment[sl]=PoiÅ¡Äite pomen besed Comment[sr]=Потражите значења речи Comment[sr@latin]=Potražite znaÄenja reÄi Comment[sv]=SlÃ¥ upp ords betydelse Comment[th]=ค้นหาความหมายของคำ Comment[tr]=Sözcüklerin anlamlarına hızlı ulaÅŸmak için Comment[uk]=ПоглÑньте на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñлів Comment[wa]=Cache après çou k' volèt dire les mots Comment[x-test]=xxLook up the meaning of wordsxx Comment[zh_CN]=查找è¯ä¹‰ Comment[zh_TW]=查看單字的æ„義 Type=Service Icon=accessories-dictionary X-KDE-ServiceTypes=Plasma/Applet X-KDE-Library=plasma_applet_qstardict X-KDE-PluginInfo-Author=Nick Shaforostoff X-KDE-PluginInfo-Email=shaforostoff@kde.ru X-KDE-PluginInfo-Name=qstardict X-KDE-PluginInfo-Version=pre0.1 X-KDE-PluginInfo-Website=http://youonlylivetwice.info/ X-KDE-PluginInfo-Category=Language X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true qstardict-qstardict-1.3/kdeplasma/dataengine/000077500000000000000000000000001323166163100214115ustar00rootroot00000000000000qstardict-qstardict-1.3/kdeplasma/dataengine/CMakeLists.txt000066400000000000000000000016341323166163100241550ustar00rootroot00000000000000project(plasma-qstardictengine) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../../plugins) #set(CMAKE_AUTOMOC ON) #set(CMAKE_INCLUDE_CURRENT_DIR ON) set(qstardict_engine_SRCS dictengine.cpp ) if (KF5) add_library(plasma_engine_qstardict MODULE ${qstardict_engine_SRCS}) set_target_properties(plasma_engine_qstardict PROPERTIES PREFIX "") target_link_libraries(plasma_engine_qstardict KF5::Plasma) else (KF5) kde4_add_plugin(plasma_engine_qstardict ${qstardict_engine_SRCS}) target_link_libraries(plasma_engine_qstardict ${KDE4_KDECORE_LIBS} ${KDE4_PLASMA_LIBS} ) endif (KF5) set(QSTARDICT_PLUGINS_DIR ${LIB_INSTALL_DIR}/qstardict/plugins) configure_file(config.h.cmake config.h) install(TARGETS plasma_engine_qstardict DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES plasma-dataengine-qstardict.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) qstardict-qstardict-1.3/kdeplasma/dataengine/Messages.sh000077500000000000000000000001061323166163100235140ustar00rootroot00000000000000#! /usr/bin/env bash $XGETTEXT *.cpp -o $podir/plasma_engine_dict.pot qstardict-qstardict-1.3/kdeplasma/dataengine/config.h.cmake000066400000000000000000000001701323166163100241040ustar00rootroot00000000000000 //#define QSTARDICT_PLUGINS_DIR "${QSTARDICT_PLUGINS_DIR}" #define QSTARDICT_PLUGINS_DIR "/usr/lib/qstardict/plugins" qstardict-qstardict-1.3/kdeplasma/dataengine/dictengine.cpp000066400000000000000000000166011323166163100242320ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "dictengine.h" #include "dictplugin.h" #include "config.h" #include #include #include #include #include #include #include // #include #include #define MEMORYFREE_DELAY 60000 /** * This class represents a dictionary provided by a plugin */ class Dictionary { public: Dictionary(const QString &plugin, const QString &name) : m_plugin(plugin) , m_name(name) {} Dictionary() {} const QString &plugin() const {return m_plugin;} const QString &name() const {return m_name;} void setPlugin(const QString &plugin) {m_plugin=plugin;} void setName(const QString &name) {m_name=name;} bool operator == (const Dictionary &dict) {return m_name==dict.m_name && m_plugin==dict.m_plugin;} private: QString m_plugin; QString m_name; }; struct QStarDictEngine::Private { QString currentWord; QTimer timer; QHash > plugins; //name to pointer // QList dicts; // QHash dictToPlugin; //name to metastructure QHash dicts; //name to metastructure }; QStarDictEngine::QStarDictEngine(QObject* parent, const QVariantList& args) : Plasma::DataEngine(parent, args) , d(new Private) { Q_UNUSED(args) // QTime a;a.start(); #ifdef Q_OS_WIN QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("*0.dll"),QDir::Files|QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) d->plugins[i->fileName().left(i->fileName().length()-5))]=0; #else qWarning()<plugins[i->fileName().mid(3, i->fileName().length()-6)]=0; #endif // use cache to not load redudant plugins? 16->10 ms // QSettings settings("qstardict","qstardict"); // m_dictDirs = settings.value("Multitran/dictDirs", m_dictDirs).toStringList(); d->timer.setInterval(MEMORYFREE_DELAY); d->timer.setSingleShot(true); connect(&d->timer, SIGNAL(timeout()), this, SLOT(unloadPlugins())); QList plugins=d->plugins.keys(); for (QList::const_iterator i = plugins.constBegin(); i != plugins.constEnd(); ++i) { // QStringList dicts = settings.value(*i+"/dicts", QStringList()).toStringList(); // if (!dicts.isEmpty()) // { QStarDict::DictPlugin* plugin = dictPlugin(*i); if (!plugin) continue; QStringList dicts=plugin->availableDicts(); // settings.setValue(*i+"/dicts", QVariant(dicts)); // plugin->setdicts(dicts); // } for (QStringList::const_iterator j = dicts.constBegin(); j != dicts.constEnd(); ++j) d->dicts[*j]=Dictionary(*i, *j); // d->dicts<plugins.contains(name) ) return 0; if (! d->plugins.value(name) ) { #ifdef Q_OS_WIN QString pluginFilename = QSTARDICT_PLUGINS_DIR "/" + name + "0.dll"; #else QString pluginFilename = QSTARDICT_PLUGINS_DIR "/" "lib" + name + ".so"; #endif QPluginLoader* plugin = new QPluginLoader(pluginFilename); if (! plugin->load()) { kWarning() << plugin->errorString(); delete plugin; return 0; } d->plugins[name]=plugin; } return qobject_cast(d->plugins.value(name)->instance()); } void QStarDictEngine::unloadPlugins() { for (QHash >::iterator i = d->plugins.begin(); i != d->plugins.end(); ++i) { if (*i) { (*i)->instance()->deleteLater(); (*i)->deleteLater(); } } } bool QStarDictEngine::sourceRequestEvent(const QString &word) { qWarning()<<"sourceRequestEvent"<timer.start();//delay freeing resources / activate delayed resources freeing if (word=="list-dictionaries") { QStringList result; int i=d->plugins.keys().size(); while (--i>=0) { QStarDict::DictPlugin* plugin = dictPlugin(d->plugins.keys().at(i)); if (!plugin) continue; result << plugin->availableDicts(); } setData("list-dictionaries", "dictionaries", result); qWarning()<::const_iterator i = d->dicts.constBegin(); i != d->dicts.constEnd(); ++i) queriedDicts<name(); d->currentWord = word; QString result; if (simplifiedWord.length() == 0) { setData(d->currentWord, "text", QString()); return true; } for (QStringList::const_iterator i = queriedDicts.constBegin(); i != queriedDicts.constEnd(); ++i) { if (!d->dicts.contains(*i)) continue; QStarDict::DictPlugin* plugin = dictPlugin(d->dicts.value(*i).plugin()); if (!plugin) continue; QStringList ld=plugin->loadedDicts(); if (!ld.contains(*i)) plugin->setLoadedDicts(ld<<*i); if ( !plugin->isTranslatable(*i, simplifiedWord)) continue; QStarDict::DictPlugin::Translation translation = plugin->translate(*i, simplifiedWord); if (translation.translation().isEmpty()) continue; result += "

\n" "" + translation.dictName() + "
\n" "" + translation.title() + "
\n" + translation.translation() + "

\n"; } setData(d->currentWord, "text", result); return true; } K_EXPORT_PLASMA_DATAENGINE(qstardict, QStarDictEngine) qstardict-qstardict-1.3/kdeplasma/dataengine/dictengine.h000066400000000000000000000031211323166163100236700ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DICTENGINE_H #define DICTENGINE_H #include #include #include namespace QStarDict {class DictPlugin;} /** * This class evaluates the basic expressions given in the interface. */ class QStarDictEngine : public Plasma::DataEngine { Q_OBJECT public: QStarDictEngine(QObject* parent, const QVariantList& args ); ~QStarDictEngine(); protected: bool sourceRequestEvent(const QString &word); private: /** * also loads plugin if it's not loaded */ QStarDict::DictPlugin* dictPlugin(const QString &name); private slots: void unloadPlugins(); private: class Private; Private * const d; }; #endif qstardict-qstardict-1.3/kdeplasma/dataengine/plasma-dataengine-qstardict.desktop000066400000000000000000000073521323166163100303610ustar00rootroot00000000000000[Desktop Entry] Name=QStarDict Dictionary Name[be@latin]=QStarDict SÅ‚oÅ­nik Name[el]=QStarDict Λεξικό Name[gl]=QStarDict Dicionario Name[gu]=QStarDict ડિકà«àª¶àª¨àª°à«€ Name[he]=QStarDict מילון Name[kk]=QStarDict Сөздік Name[km]=QStarDict វចនានុក្រម Name[kn]=QStarDict ಶಬà³à²¦à²•ೋಶ Name[nb]=QStarDict Ordbok Name[nds]=QStarDict Wöörbook Name[pa]=QStarDict ਡਿਕਸ਼ਨਰੀ Name[pt]=QStarDict Dicionário Name[pt_BR]=QStarDict Dicionário Name[ro]=QStarDict DicÈ›ionar Name[ru]=Словарь QStarDict Name[sv]=QStarDict Ordlista Name[tr]=QStarDict Sözlük Name[uk]=Словник QStarDict Name[x-test]=xxQStarDict Dictionaryxx Name[zh_TW]=QStarDict å­—å…¸ Comment=Look up word meanings Comment[af]=Slaan woordbetekenisse na Comment[be@latin]=PoÅ¡uk znaÄeÅ„niaÅ­ sÅ‚ovaÅ­ Comment[bg]=ТърÑене на думи Comment[bn_IN]=শবà§à¦¦à§‡à¦° অরà§à¦¥ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨ Comment[ca]=Cerca els significats de paraules Comment[cs]=Vyhledávání významu slov Comment[da]=SlÃ¥ ords betydning op Comment[de]=Nachschlagen von Wortbedeutungen Comment[el]=Αναζήτηση σημασίας λέξεων Comment[eo]=Serĉi difinojn de vortoj Comment[es]=Buscar significado de las palabras Comment[et]=Sõna tähenduse otsimine Comment[fi]=Tarkista sanojen merkityksiä Comment[fr]=Connaître la signification des mots Comment[fy]=Sykje de wurdbetekenissen op Comment[ga]=Aimsigh sainmhíniú ar fhocal Comment[gl]=Procura o significado de palabras Comment[gu]=શબà«àª¦àª¨àª¾àª‚ અરà«àª¥à«‹ શોધો Comment[he]=בדיקת משמעות מלה Comment[hu]=ÉrtelmezÅ‘ szótár Comment[is]=Flettu upp merkingu orða Comment[it]=Cerca il significato di una parola Comment[ja]=å˜èªžã®æ„味を調ã¹ã‚‹ Comment[kk]=Сөздің мәнін қараÑтыру Comment[km]=រក​មើល​អážáŸ’ážáž“áŸáž™â€‹ážšáž”ស់​ពាក្យ Comment[kn]=ಪದಗಳ ಅರà³à²¥à²—ಳಿಗನà³à²¨à³ ಹà³à²¡à³à²•à³ Comment[ko]=ë‹¨ì–´ì˜ ëœ» 찾기 Comment[lv]=Atrod vÄrdu nozÄ«mes Comment[ml]=വാകàµà´•àµà´•à´³àµà´Ÿàµ† à´…à´°àµâ€à´¤àµà´¥à´™àµà´™à´³àµâ€ നിഘണàµà´Ÿàµà´µà´¿à´²àµâ€ തിരയàµà´• Comment[mr]=शबà¥à¤¦à¤¾à¤‚चे अरà¥à¤¥ शोधणà¥à¤¯à¤¾à¤•रीता लà¥à¤•अप Comment[nb]=SlÃ¥ opp betydningen av ord Comment[nds]=Woortbedüden naslaan Comment[ne]=शबà¥à¤¦à¤•ो अरà¥à¤¥ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ Comment[nl]=Zoek de betekenis van woorden op Comment[nn]=SlÃ¥ opp tydinga til ord Comment[pa]=ਸ਼ਬਦ ਅਰਥ ਖੋਜ Comment[pl]=Wyszukiwanie znaczenia słów Comment[pt]=Procurar os significados das palavras Comment[pt_BR]=Procurar os significados das palavras Comment[ro]=Caută înÈ›elesul cuvintelor Comment[ru]=Ð’Ñ‹ÑÑнение Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñлов Comment[se]=Oza maid sátni máksá Comment[sl]=PoiÅ¡Äite pomene besed Comment[sr]=Потражите значења речи Comment[sr@latin]=Potražite znaÄenja reÄi Comment[sv]=SlÃ¥ upp ords betydelse Comment[te]=పదమౠఅరà±à°§à°¾à°²à°¨à± చూడà±à°®à± Comment[th]=ค้นหาความหมายของคำ Comment[tr]=Sözcük anlamlarına bak Comment[uk]=Пошук значень Ñлів Comment[wa]=Cweri çou k' vout dire on mot Comment[x-test]=xxLook up word meaningsxx Comment[zh_CN]=查阅å•è¯å«ä¹‰ Comment[zh_TW]=尋找單字的æ„義 X-KDE-ServiceTypes=Plasma/DataEngine Type=Service Icon=accessories-dictionary X-KDE-Library=plasma_engine_qstardict X-KDE-PluginInfo-Author=Nick Shaforostoff X-KDE-PluginInfo-Email=shaforostoff@kde.ru X-KDE-PluginInfo-Name=qstardict X-KDE-PluginInfo-Version=0.1 X-KDE-PluginInfo-Website= X-KDE-PluginInfo-Category= X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License= qstardict-qstardict-1.3/plugins/000077500000000000000000000000001323166163100170325ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/baseplugin.h000066400000000000000000000051041323166163100213340ustar00rootroot00000000000000/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef BASEPLUGIN_H #define BASEPLUGIN_H #include #include #include #include #include #include #include "metadata.h" #include "pluginserver.h" namespace QStarDict { /** * This is a base class for all dictionary plugins classes. */ class BasePlugin { public: /** * Accessor to QStarDict internals */ PluginServer *qsd; // QStarDict API accessor /** * Destructor. */ virtual ~BasePlugin() { } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) /** * Return the plugin's metadata. */ virtual PluginMetadata metadata() const = 0; #else virtual QIcon pluginIcon() const = 0; #endif }; class ConfigurablePlugin { public: virtual ~ConfigurablePlugin() {} /** * Run a settings dialog and return QDialog::DialogCode. */ virtual int execSettingsDialog(QWidget *parent = 0) = 0; }; } // namespace QStarDict Q_DECLARE_INTERFACE(QStarDict::BasePlugin, "org.qstardict.BasePlugin/1.0") Q_DECLARE_INTERFACE(QStarDict::ConfigurablePlugin, "org.qstardict.ConfigurablePlugin/1.0") #endif // BASEPLUGIN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/dictplugin.h000066400000000000000000000163641323166163100213570ustar00rootroot00000000000000/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTPLUGIN_H #define DICTPLUGIN_H #include #include #include #include #include #include "baseplugin.h" namespace QStarDict { /** * This is a base class for all dictionary plugins classes. */ class DictPlugin { public: /** * This enum describes a features of dictionary plugin. */ enum Feature { /** * No features. */ None = 0x00, /** * Dictionary plugin can search for similar words using * fuzzy algoritms. */ SearchSimilar = 0x01, }; Q_DECLARE_FLAGS(Features, Feature) /** * This class represents information about dictionary. */ class DictInfo { public: /** * Construct empty DictInfo object. */ DictInfo() : m_wordsCount(-1L) { } /** * Construct DictInfo object from data. * @param plugin A plugin name * @param name A dictionary name * @param author A dictionary author * @param desription A dictionary description * @param wordsCount A count of words that available in dictionary */ DictInfo(const QString &plugin, const QString &name, const QString &author = QString(), const QString &description = QString(), long wordsCount = -1L) : m_plugin(plugin), m_name(name), m_author(author), m_description(description), m_wordsCount(wordsCount) { } const QString &plugin() const { return m_plugin; } const QString &name() const { return m_name; } const QString &author() const { return m_author; } const QString &description() const { return m_description; } long wordsCount() const { return m_wordsCount; } void setPlugin(const QString &plugin) { m_plugin = plugin; } void setName(const QString &name) { m_name = name; } void setAuthor(const QString &author) { m_author = author; } void setDescription(const QString &description) { m_description = description; } void setWordsCount(long wordsCount) { m_wordsCount = wordsCount; } private: QString m_plugin; QString m_name; QString m_author; QString m_description; long m_wordsCount; }; /** * This class represent a translation. */ class Translation { public: /** * Construct an empty translation. */ Translation() { } /** * Construct a translation from data. * @param title A translation title * @param dictName A full dictionary name * @param translation A translation */ Translation(const QString &title, const QString &dictName, const QString &translation) : m_title(title), m_dictName(dictName), m_translation(translation) { } /** * Return the translation title. */ const QString &title() const { return m_title; } /** * Return the dictionary name. */ const QString &dictName() const { return m_dictName; } /** * Return the translation. */ const QString &translation() const { return m_translation; } /** * Set a translation title. */ void setTitle(const QString &title) { m_title = title; } /** * Set a dictionary name. */ void setDictName(const QString &dictName) { m_dictName = dictName; } /** * Set a translation. */ void setTranslation(const QString &translation) { m_translation = translation; } private: QString m_title; QString m_dictName; QString m_translation; }; /** * Destructor. */ virtual ~DictPlugin() { } /** * Return a features supported by dictionary plugin. */ virtual Features features() const { return Features(None); } /** * Return a list of available dictionaries. */ virtual QStringList availableDicts() const = 0; /** * Return a list of loaded dictionaries. */ virtual QStringList loadedDicts() const = 0; /** * Set a list of loaded dictionaries. */ virtual void setLoadedDicts(const QStringList &loadedDicts) = 0; /** * Return true if translation exists in dictionary, * otherwise returns false. */ virtual bool isTranslatable(const QString &dict, const QString &word) = 0; /** * Return translation for word from dictionary. If word not found * returns empty string. */ virtual Translation translate(const QString &dict, const QString &word) = 0; /** * Return a list of similar to "word" words from all loaded dictionaries. * Works only if SearchSimilar feature is enabled. */ virtual QStringList findSimilarWords(const QString &dict, const QString &word) { Q_UNUSED(dict); return QStringList(word); } /** * Return a required resource. Scheme of URLs: * plugin://plugin_name/... */ virtual QVariant resource(int type, const QUrl &name) { Q_UNUSED(type) Q_UNUSED(name) return QVariant(); } /** * Return an information about dictionary. The dictionary may be not loaded * but available. */ virtual DictInfo dictInfo(const QString &dict) = 0; }; Q_DECLARE_OPERATORS_FOR_FLAGS(DictPlugin::Features) } Q_DECLARE_INTERFACE(QStarDict::DictPlugin, "org.qstardict.DictPlugin/1.0") #endif // DICTPLUGIN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/kdeintegration/000077500000000000000000000000001323166163100220415ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/kdeintegration/kdeintegration-meta.h.in000066400000000000000000000004561323166163100265570ustar00rootroot00000000000000#ifndef KDEINTEGRATION_META_H #define KDEINTEGRATION_META_H #define PLUGIN_ID \"$$TARGET\" #define PLUGIN_NAME \"$$META_NAME\" #define PLUGIN_VERSION \"$$VERSION\" #define PLUGIN_DESCRIPTION \"$$META_DESC\" #define PLUGIN_AUTHORS \"$$META_AUTHORS\" #define PLUGIN_FEATURES \"$$META_FEATURES\" #endif qstardict-qstardict-1.3/plugins/kdeintegration/kdeintegration.cpp000066400000000000000000000110141323166163100255510ustar00rootroot00000000000000/* Ported from QtNote project Copyright (C) 2016 Sergey Ili'nykh This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Contacts: E-Mail: rion4ik@gmail.com XMPP: rion@jabber.ru */ #include #include #ifndef USE_KDE5 #include #include #else #include #include #endif #include #include #include #include #include #include "kdeintegration.h" #if QT_VERSION < QT_VERSION_CHECK(5,0,0) #include "kdeintegration-meta.h" #endif namespace QStarDict { static const QLatin1String pluginId("kde_de"); class KDEIntegration::Private { public: KStatusNotifierItem *sni; }; //------------------------------------------------------------ // KDEIntegration //------------------------------------------------------------ KDEIntegration::KDEIntegration(QObject *parent) : QObject(parent), d(new Private) { d->sni = 0; } KDEIntegration::~KDEIntegration() { uninitTray(); delete d; } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata KDEIntegration::metadata() const { QStarDict::PluginMetadata md; md.id = PLUGIN_ID; md.name = QString::fromUtf8(PLUGIN_NAME); md.version = PLUGIN_VERSION; md.description = PLUGIN_DESCRIPTION; md.authors = QString::fromUtf8(PLUGIN_AUTHORS).split(';', QString::SkipEmptyParts); md.features = QString::fromLatin1(PLUGIN_FEATURES).split(';', QString::SkipEmptyParts); md.icon = QIcon(":/icons/kde-logo"); return md; } #else QIcon KDEIntegration::pluginIcon() const { return QIcon(":/icons/kde-logo"); } #endif QStarDict::TrayIconPlugin::TrayCompat KDEIntegration::isDECompatible() { QString session = qgetenv("XDG_CURRENT_DESKTOP"); QString dataDirs = qgetenv("XDG_DATAD_DIRS"); if (session == "KDE" || session.contains("kde") || session.contains("plasma")) return QStarDict::TrayIconPlugin::CompatFull; else return QStarDict::TrayIconPlugin::CompatNone; } void KDEIntegration::initTray() { if (d->sni) return; d->sni = new KStatusNotifierItem("qstardict", this); d->sni->setIconByName("qstardict"); // TODO review dev mode when no icon in /usr/share d->sni->setStatus(KStatusNotifierItem::Active); d->sni->setTitle("QStarDict"); connect(d->sni, SIGNAL(secondaryActivateRequested(QPoint)), SIGNAL(translateClipboard())); } void KDEIntegration::uninitTray() { if (d->sni) { d->sni->setParent(0); delete d->sni; d->sni = 0; } } TrayIconPlugin::Features KDEIntegration::features() const { return ClipoardTranslate; } void KDEIntegration::setContextMenu(QMenu *menu) { #ifdef USE_KDE5 d->sni->setContextMenu(menu); #else KMenu *kmenu = new KMenu(menu); foreach (QAction *a, menu->actions()) { KAction *ka = new KAction(KIcon(a->icon()), a->text(), a); if (!ka->isSeparator()) { connect(ka, SIGNAL(triggered(bool)), a, SIGNAL(triggered(bool))); } kmenu->addAction(ka); } d->sni->setContextMenu(kmenu); #endif } void KDEIntegration::setMainWindow(QWidget *w) { d->sni->setAssociatedWidget(w); } void KDEIntegration::setScanEnabled(bool enabled) { // TODO rewrite to system icons QIcon icon(enabled ? ":/icons/qstardict.png" : ":/icons/qstardict-disabled.png"); d->sni->setIconByPixmap(icon); d->sni->setToolTip(icon, "QStarDict", tr("scanning is %1").arg(enabled ? tr("enabled") : tr("disabled"))); } void KDEIntegration::setVisible(bool visible) { d->sni->setStatus(visible? KStatusNotifierItem::Active : KStatusNotifierItem::Passive); } bool KDEIntegration::isVisible() const { return d->sni->status() != KStatusNotifierItem::Passive; } /* void KDEIntegration::activateWidget(QWidget *w) { KWindowSystem::forceActiveWindow(w->winId(), 0); // just activateWindow doesn't work when started from tray } */ } // namespace QStarDict #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(kdeintegration, QStarDict::KDEIntegration) #endif qstardict-qstardict-1.3/plugins/kdeintegration/kdeintegration.h000066400000000000000000000035001323166163100252170ustar00rootroot00000000000000/* Ported from QtNote project Copyright (C) 2016 Sergey Ili'nykh This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Contacts: E-Mail: rion4ik@gmail.com XMPP: rion@jabber.ru */ #ifndef KDEINTEGRATION_H #define KDEINTEGRATION_H #include #include "../trayplugin.h" class QMenu; namespace QStarDict { class KDEIntegration : public QObject, public QStarDict::BasePlugin, public QStarDict::TrayIconPlugin { Q_OBJECT #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.KDEPlugin/1.0" FILE "kdeintegration.json") #endif Q_INTERFACES(QStarDict::BasePlugin QStarDict::TrayIconPlugin) public: explicit KDEIntegration(QObject *parent = 0); ~KDEIntegration(); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata metadata() const; #else QIcon pluginIcon() const; #endif TrayCompat isDECompatible(); void initTray(); void uninitTray(); Features features() const; void setContextMenu(QMenu *menu); void setMainWindow(QWidget *w); void setScanEnabled(bool enabled); void setVisible(bool visible); bool isVisible() const; signals: void translateClipboard(); public slots: private: class Private; friend class Private; Private *d; }; } // namespace QtNote #endif // KDEINTEGRATION_H qstardict-qstardict-1.3/plugins/kdeintegration/kdeintegration.json.in000066400000000000000000000003171323166163100263510ustar00rootroot00000000000000{ \"id\": \"$$TARGET\", \"name\": \"$$META_NAME\", \"version\" : \"$$VERSION\", \"description\": \"$$META_DESC\", \"authors\": \"$$META_AUTHORS\", \"features\": \"$$META_FEATURES\" } qstardict-qstardict-1.3/plugins/kdeintegration/kdeintegration.pro000066400000000000000000000010621323166163100255710ustar00rootroot00000000000000TARGET = kdeintegration META_VERSION = 0.1 META_NAME = KDE Integration META_DESC = Makes QStarDict fill more native on KDE META_AUTHORS = Sergey Il\'inykh META_FEATURES = de;defenable include(../plugin.pri) QT *= gui greaterThan(QT_MAJOR_VERSION, 4) { QT *= widgets KGlobalAccel KWindowSystem KNotifications DEFINES += USE_KDE5 } else { INCLUDEPATH += /usr/include/KDE LIBS += -lkdeui } SOURCES += \ kdeintegration.cpp HEADERS += \ kdeintegration.h RESOURCES += \ kdeintegration.qrc OTHER_FILES += \ kdeintegration.json qstardict-qstardict-1.3/plugins/kdeintegration/kdeintegration.qrc000066400000000000000000000001551323166163100255600ustar00rootroot00000000000000 logo.png qstardict-qstardict-1.3/plugins/kdeintegration/logo.png000066400000000000000000000015151323166163100235110ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs››¨ÄÂvíIDAT8Ë¥ÆÏkUÀñï{ovfwv&»ÙD]•´©Ô_Ðæ`*XK-bÁƒ'‘‚ ')ø?õ¦äàAzð&T”žìAÅCÅ46VQ‰©!‘­iºÙݙٙݙyï‡þ‚ŸÓGÌ_øìÓ0h]Š’‘ üZ­yŽtZ´ÃÖBœæÆ)“4a2Mé´æl:N®l]{ý=Á©ë..ý}îT‡§—ºtZ-f‚µZ ¥Ž„¼4”eI2Îèbný±Ëæ–æ¯í_— ×Ïúžá‘…#”4‰ —ƒÔ£7’¼zÒcåøƒû~ƒ7Ît8ýÔÇžèbLÃõ³Ž¬ÊЩ7èE’À(º®b4šL-Р0†Q:åüË-´©øî7M/’4‚Y•¡ƒTB¨:Iá`¦piÙãè‚Ë7?§!QÊòιzMñáõûìVd…ƒëù •ÊQ²æúH¥ÈMÁµõ!“Ö~!,´]ª³½?å§Ý˜Ü %F¸(GI‰¨©Â ¦Ú°²Tãµå«k÷Ø9HØ»Ÿsc+æÄ£ .œ ˜qR¨))¥ ²û£˜7WBž?Öäî|¯ €‚+ߦš·Ïth7 YžRU)@W%e–qñãV¯xñD‹¼hå–Þ¡á ò¸º6&Ë /=é£'cŒ-p¬ÖvšePSHo†¹¦Ëùg]¦…Ëû_h„¼ûJ›ŽÃå¯6ÿLÉÇ •p±Z[ÇèÒfIŒuÍzÈÑŽf㎥Ô«o• 3Á×7öö#žYÐÜü5'‹‡TÊÇèÒ:TÚkÉҌċùèËCfgÂÐç¹îˆ;÷\~Üù~S2D$ID–%Í&TÚ8¶¿qÛUM¦•êô¨ Dñfs†ËŸ»hét4E}ƒ}„t <×üÓ߸­('w'ƒÓíÙŇÃzP‰"×®1Ú-­.Ç­Ç©&Ë´*síÙJÏ¡«"Û½ñÉåp{Uð€–yþ›>p ¨ø¿þx"wZë©^NIEND®B`‚qstardict-qstardict-1.3/plugins/metadata.h000066400000000000000000000046711323166163100207730ustar00rootroot00000000000000/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2016 Ilinykh Sergey * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef QSD_METADATA_H #define QSD_METADATA_H #include #include #include #include namespace QStarDict { // IMPORTANT: If you change this structure, // don't forget to change BasePlugin interface version struct PluginMetadata { QString id; // not-human name. to identify QString name; // human name. to display it QString version; // plugin's version QString description; // short discription to show in plugins list or tooltip QStringList authors; // list of authors preferably in format "Name " QStringList features; // comma-separated list of supported features qstardict knows about // "dict" - dictionay plugin, // "defenable" - enable this plugin by default if not cached // "de" - desktop environment plugin QIcon icon; // plugin's icon. it's cached as soon as we enable plugin once QVariantMap extra; // for any not described here use }; } // namespace QStarDict #endif // QSD_METADATA_H qstardict-qstardict-1.3/plugins/multitran/000077500000000000000000000000001323166163100210515ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/multitran/README000066400000000000000000000016701323166163100217350ustar00rootroot00000000000000You need the following external libraries to compile the plugin: libmtsupport libbtree libfacet libmtquery FILE=libmtsupport-0.0.1alpha2 wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install FILE=libbtree-0.0.1alpha2 wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install FILE=libfacet-0.0.1alpha2 wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install FILE=libmtquery-0.0.1alpha3-shaforostoff wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install Then put this dir into qstardict/plugins and run qmake && make && sudo make install Download multitran-data.tar.bz2 from multitran.sf.net tar xjf multitran-data.tar.bz2 && cd multitran-data && make && sudo make install See multitran.sf.net and multitran.ru for detailsqstardict-qstardict-1.3/plugins/multitran/multitran.cpp000066400000000000000000000171471323166163100236060ustar00rootroot00000000000000/***************************************************************************** * This file is a part of QStarDict, a StarDict clone written using Qt * * multitran.cpp - Plugin for multitran-data (multitran.sf.net) * * Copyright (C) 2008 Nick Shaforostoff * * Copyright (C) 2004 Stanislav Ievlev * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "multitran.h" //#include "settingsdialog.h" #include // #include #include /* /usr/include/mt/query /usr/include/btree /usr/include/mt/support /usr/include/facet */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef mt::singleton_array txtdb_type; struct compare_names { compare_names(const std::string& from,const std::string& to): from_(from), to_(to) {} bool operator()(const mt::lang_pair& lng1,const mt::lang_pair& lng2) { return distance(lng1) < distance(lng2); } int distance(const mt::lang_pair& lng) { std::string from_name=mt::lang_name(lng.first); std::string to_name=mt::lang_name(lng.second); return (!from_.empty() && !from_name.compare(0,from_.size(),from_)) + (!to_.empty() && !to_name.compare(0,to_.size(),to_)); } std::string from_,to_; }; int compare_articles(const mt::article& a1,const mt::article& a2) { if (a1.lgk() != a2.lgk()) return a2.lgk() > a1.lgk(); else return a2.subject() > a1.subject(); } struct show { show(std::string& r_, bool& found_): r(r_),found(found_) {} void operator()(mt::article_set as) { mt::file_map& subj = txtdb_type::instance(mt::datapath+mt::path_separator()+"subjects.txt"); mt::file_map& spart = txtdb_type::instance(mt::datapath+mt::path_separator()+"speechparts.txt"); if (!as.articles_.empty()) { found=true; std::sort(as.articles_.begin(),as.articles_.end(),compare_articles); int prev_lgk = -1; std::string prev_subject = "x"; for(size_t i=0;i(mt::speech_part(a.lgk())))+""; prev_lgk = a.lgk(); prev_subject = "x";//reset subject } if (prev_subject != a.subject()) { r+=""; r+=subj.any_name(a.subject()); r+=""; r+=a.translated(); prev_subject = a.subject(); } else r+=", "+a.translated(); } r+=""; } } std::string &r; bool& found; }; std::string do_translate(const std::string& text,mt::lang_code from,mt::lang_code to) { bool found=false; std::string r=""; mt::phrase ph; mt::fill_phrase(ph,text,from); mt::translation tr(ph,from,to); std::for_each(tr.asets().begin(), tr.asets().end(), show(r,found)); r+="
"; if (found) return r; return ""; } Multitran::Multitran(QObject *parent) : QObject(parent) { // QSettings settings("qstardict","qstardict"); // m_dictDirs = settings.value("Multitran/dictDirs", m_dictDirs).toStringList(); // m_reformatLists = settings.value("Multitran/reformatLists", true).toBool(); } Multitran::~Multitran() { // QSettings settings("qstardict","qstardict"); // settings.setValue("Multitran/dictDirs", m_dictDirs); // settings.setValue("Multitran/reformatLists", m_reformatLists); } QStringList Multitran::availableDicts() const { return QStringList("Multitran"); } void Multitran::setLoadedDicts(const QStringList &loadedDicts) { } Multitran::DictInfo Multitran::dictInfo(const QString &dict) { // ::DictInfo nativeInfo; // nativeInfo.wordcount = 0; DictInfo result(name(), dict); result.setAuthor("Multitran.ru"); result.setDescription(tr("1 mln words excerpt of multitran.ru")); result.setWordsCount(-1); return result; } bool Multitran::isTranslatable(const QString &dict, const QString &word) { return true; } Multitran::Translation Multitran::translate(const QString &dict, const QString &word) { QTextCodec* c=QTextCodec::codecForMib(2251); std::string text=c->fromUnicode(word).data(); std::string from_lang,to_lang; int i=word.size(); while(--i>=0) if (word.at(i).unicode()>127) break; if (i!=-1) from_lang="russian"; else from_lang="english"; mt::linguas avail_langs; mt::linguas::iterator lang = std::max_element(avail_langs.begin(), avail_langs.end(), compare_names(from_lang,to_lang)); if (lang == avail_langs.end() || (!from_lang.empty() && !to_lang.empty() && (compare_names(from_lang,to_lang).distance(*lang)!=2))) { //std::cerr<<"illegal language names"<
multitran

"; QString queryResult=c->toUnicode(do_translate(lower_str(lang->first,text), lang->first,lang->second).c_str()); if (queryResult.isEmpty()) return Translation(); return Translation(word,"Multitran",queryResult); } QStringList Multitran::findSimilarWords(const QString &dict, const QString &word) { return QStringList(); } int Multitran::execSettingsDialog(QWidget *parent) { //::SettingsDialog dialog(this, parent); //return dialog.exec(); return 0; } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(multitran, Multitran) #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/plugins/multitran/multitran.h000066400000000000000000000061631323166163100232470ustar00rootroot00000000000000/***************************************************************************** * This file is a part of QStarDict, a StarDict clone written using Qt * * multitran.cpp - Plugin for multitran-data (multitran.sf.net) * * Copyright (C) 2008 Nick Shaforostoff * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef MULTITRAN_H #define MULTITRAN_H #include "../dictplugin.h" #include #include #include class Multitran: public QObject, public QStarDict::DictPlugin { Q_OBJECT Q_INTERFACES(QStarDict::DictPlugin) #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.DictPlugin/1.0" FILE "multitran.json") #endif public: Multitran(QObject *parent = 0); ~Multitran(); QString name() const { return "multitran"; } QString version() const { return "0.1"; } QString description() const { return "The Multitran plugin"; } QStringList authors() const { return QStringList() << tr("Stanislav Ievlev ") << tr("Nick Shaforostoff "); } Features features() const { return Features(/*SearchSimilar | SettingsDialog*/); } QStringList availableDicts() const; QStringList loadedDicts() const {return QStringList("Multitran");}//{ return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &loadedDicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); virtual QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); //friend class SettingsDialog; private: QStringList m_dictDirs; QHash m_loadedDicts; }; #endif // MULTITRAN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/multitran/multitran.json000066400000000000000000000000551323166163100237630ustar00rootroot00000000000000{ "name": "multitran", "version" : "0.1" } qstardict-qstardict-1.3/plugins/multitran/multitran.pro000066400000000000000000000032061323166163100236130ustar00rootroot00000000000000############################################################################# # multitran.pro - QStarDict, a StarDict clone written using Qt # # Copyright (C) 2008 Nick Shaforostoff # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = multitran include(../plugin.pri) win32:CONFIG += plugin HEADERS += multitran.h SOURCES += multitran.cpp # FORMS += settingsdialog.ui # RESOURCES += pixmaps/pixmaps.qrc LIBS += -lmtquery -lmtsupport -lbtree -lfacet OTHER_FILES += \ multitran.json qstardict-qstardict-1.3/plugins/plugin.pri000066400000000000000000000040671323166163100210530ustar00rootroot00000000000000############################################################################# # plugin.pri - QStarDict, a StarDict clone written using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# isEmpty(TARGET):error(You must set TARGET before including $$_FILE_) isEmpty(META_DESC):error(You must set META_DESC before including $$_FILE_) TEMPLATE = lib QMAKE_TARGET_PRODUCT = QStarDict QMAKE_TARGET_DESCRIPTION = $$META_DESC include(../qstardict.pri) VERSION = $$META_VERSION CONFIG += plugin INCLUDEPATH += $$dirname(PWD) target.path = $$PLUGINS_DIR INSTALLS += target OTHER_FILES += \ $${TARGET}.json.in \ $${TARGET}-meta.h.in greaterThan(QT_MAJOR_VERSION, 4) { QMAKE_SUBSTITUTES += $${TARGET}.json.in # the same as in json DEFINES += PLUGIN_ID=\\\"$$TARGET\\\" } else { QMAKE_SUBSTITUTES += $${TARGET}-meta.h.in PRECOMPILED_HEADER += $${TARGET}-meta.h } qstardict-qstardict-1.3/plugins/plugins.pri000066400000000000000000000004731323166163100212330ustar00rootroot00000000000000isEmpty(ENABLED_PLUGINS) { ENABLED_PLUGINS=stardict web !win32 { greaterThan(QT_MAJOR_VERSION, 4) { load(configure) qtCompileTest(kde):ENABLED_PLUGINS += kdeintegration } else { exists(/usr/include/KDE):ENABLED_PLUGINS += kdeintegration } } } qstardict-qstardict-1.3/plugins/plugins.pro000066400000000000000000000027031323166163100212370ustar00rootroot00000000000000############################################################################# # plugins.pro - QStarDict, a StarDict clone written using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# include(plugins.pri) TEMPLATE = subdirs SUBDIRS = $$ENABLED_PLUGINS qstardict-qstardict-1.3/plugins/pluginserver.h000066400000000000000000000044261323166163100217360ustar00rootroot00000000000000/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2016 Sergey Il'inykh * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ /* * This interface is intended to be used from plugin * to access QStarDict internals */ #ifndef PLUGINSERVER_H #define PLUGINSERVER_H #include "metadata.h" namespace QStarDict { class PluginServer { public: virtual ~PluginServer() {} /** * Returns plugin's metadata. name/descriptions/authors/etc. */ virtual const PluginMetadata &metadata(const QString &pluginId) const = 0; /** * Return a directory that contains plugin's cofiguration data. */ virtual QString configDir(const QString &pluginId) const = 0; /** * Returns plugin's id. where instance is instance of plugin */ virtual QString idForPlugin(QObject *instance) const = 0; }; } // namepace QStarDict Q_DECLARE_INTERFACE(QStarDict::PluginServer, "org.qstardict.PluginServer/1.0") #endif // PLUGINSERVER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/stardict/000077500000000000000000000000001323166163100206475ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/stardict/dictziplib.cpp000066400000000000000000000417401323166163100235160ustar00rootroot00000000000000/* dictziplib.c -- * http://stardict.sourceforge.net * Copyright (C) 2003-2003 Hu Zheng * This file is a modify version of dictd-1.9.7's data.c * * data.c -- * Created: Tue Jul 16 12:45:41 1996 by faith@dict.org * Revised: Sat Mar 30 10:46:06 2002 by faith@dict.org * Copyright 1996, 1997, 1998, 2000, 2002 Rickard E. Faith (faith@dict.org) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //#define HAVE_MMAP //it will defined in config.h. this can be done by configure.in with a AC_FUNC_MMAP. #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #ifdef Q_OS_UNIX #include #endif #ifdef Q_OS_WIN32 #include #endif #include #include #include #include "dictziplib.hpp" #define USE_CACHE 1 #define BUFFERSIZE 10240 /* * Output buffer must be greater than or * equal to 110% of input buffer size, plus * 12 bytes. */ #define OUT_BUFFER_SIZE 0xffffL #define IN_BUFFER_SIZE ((unsigned long)((double)(OUT_BUFFER_SIZE - 12) * 0.89)) /* For gzip-compatible header, as defined in RFC 1952 */ /* Magic for GZIP (rfc1952) */ #define GZ_MAGIC1 0x1f /* First magic byte */ #define GZ_MAGIC2 0x8b /* Second magic byte */ /* FLaGs (bitmapped), from rfc1952 */ #define GZ_FTEXT 0x01 /* Set for ASCII text */ #define GZ_FHCRC 0x02 /* Header CRC16 */ #define GZ_FEXTRA 0x04 /* Optional field (random access index) */ #define GZ_FNAME 0x08 /* Original name */ #define GZ_COMMENT 0x10 /* Zero-terminated, human-readable comment */ #define GZ_MAX 2 /* Maximum compression */ #define GZ_FAST 4 /* Fasted compression */ /* These are from rfc1952 */ #define GZ_OS_FAT 0 /* FAT filesystem (MS-DOS, OS/2, NT/Win32) */ #define GZ_OS_AMIGA 1 /* Amiga */ #define GZ_OS_VMS 2 /* VMS (or OpenVMS) */ #define GZ_OS_UNIX 3 /* Unix */ #define GZ_OS_VMCMS 4 /* VM/CMS */ #define GZ_OS_ATARI 5 /* Atari TOS */ #define GZ_OS_HPFS 6 /* HPFS filesystem (OS/2, NT) */ #define GZ_OS_MAC 7 /* Macintosh */ #define GZ_OS_Z 8 /* Z-System */ #define GZ_OS_CPM 9 /* CP/M */ #define GZ_OS_TOPS20 10 /* TOPS-20 */ #define GZ_OS_NTFS 11 /* NTFS filesystem (NT) */ #define GZ_OS_QDOS 12 /* QDOS */ #define GZ_OS_ACORN 13 /* Acorn RISCOS */ #define GZ_OS_UNKNOWN 255 /* unknown */ #define GZ_RND_S1 'R' /* First magic for random access format */ #define GZ_RND_S2 'A' /* Second magic for random access format */ #define GZ_ID1 0 /* GZ_MAGIC1 */ #define GZ_ID2 1 /* GZ_MAGIC2 */ #define GZ_CM 2 /* Compression Method (Z_DEFALTED) */ #define GZ_FLG 3 /* FLaGs (see above) */ #define GZ_MTIME 4 /* Modification TIME */ #define GZ_XFL 8 /* eXtra FLags (GZ_MAX or GZ_FAST) */ #define GZ_OS 9 /* Operating System */ #define GZ_XLEN 10 /* eXtra LENgth (16bit) */ #define GZ_FEXTRA_START 12 /* Start of extra fields */ #define GZ_SI1 12 /* Subfield ID1 */ #define GZ_SI2 13 /* Subfield ID2 */ #define GZ_SUBLEN 14 /* Subfield length (16bit) */ #define GZ_VERSION 16 /* Version for subfield format */ #define GZ_CHUNKLEN 18 /* Chunk length (16bit) */ #define GZ_CHUNKCNT 20 /* Number of chunks (16bit) */ #define GZ_RNDDATA 22 /* Random access data (16bit) */ #define DICT_UNKNOWN 0 #define DICT_TEXT 1 #define DICT_GZIP 2 #define DICT_DZIP 3 int dictData::read_header(const std::string &fname, int computeCRC) { FILE *str; int id1, id2, si1, si2; char buffer[BUFFERSIZE]; int extraLength, subLength; int i; char *pt; int c; struct stat sb; unsigned long crc = crc32( 0L, Z_NULL, 0 ); int count; unsigned long offset; if (!(str = fopen(fname.c_str(), "rb"))) { //err_fatal_errno( __FUNCTION__, // "Cannot open data file \"%s\" for read\n", filename ); } this->headerLength = GZ_XLEN - 1; this->type = DICT_UNKNOWN; id1 = getc( str ); id2 = getc( str ); if (id1 != GZ_MAGIC1 || id2 != GZ_MAGIC2) { this->type = DICT_TEXT; fstat( fileno( str ), &sb ); this->compressedLength = this->length = sb.st_size; this->origFilename = fname; this->mtime = sb.st_mtime; if (computeCRC) { rewind( str ); while (!feof( str )) { if ((count = fread( buffer, 1, BUFFERSIZE, str ))) { crc = crc32(crc, (Bytef *)buffer, count); } } } this->crc = crc; fclose( str ); return 0; } this->type = DICT_GZIP; this->method = getc( str ); this->flags = getc( str ); this->mtime = getc( str ) << 0; this->mtime |= getc( str ) << 8; this->mtime |= getc( str ) << 16; this->mtime |= getc( str ) << 24; this->extraFlags = getc( str ); this->os = getc( str ); if (this->flags & GZ_FEXTRA) { extraLength = getc( str ) << 0; extraLength |= getc( str ) << 8; this->headerLength += extraLength + 2; si1 = getc( str ); si2 = getc( str ); if (si1 == GZ_RND_S1 || si2 == GZ_RND_S2) { subLength = getc( str ) << 0; subLength |= getc( str ) << 8; this->version = getc( str ) << 0; this->version |= getc( str ) << 8; if (this->version != 1) { //err_internal( __FUNCTION__, // "dzip header version %d not supported\n", // this->version ); } this->chunkLength = getc( str ) << 0; this->chunkLength |= getc( str ) << 8; this->chunkCount = getc( str ) << 0; this->chunkCount |= getc( str ) << 8; if (this->chunkCount <= 0) { fclose( str ); return 5; } this->chunks = (int *)malloc(sizeof( this->chunks[0] ) * this->chunkCount ); for (i = 0; i < this->chunkCount; i++) { this->chunks[i] = getc( str ) << 0; this->chunks[i] |= getc( str ) << 8; } this->type = DICT_DZIP; } else { fseek( str, this->headerLength, SEEK_SET ); } } if (this->flags & GZ_FNAME) { /* FIXME! Add checking against header len */ pt = buffer; while ((c = getc( str )) && c != EOF) * pt++ = c; *pt = '\0'; this->origFilename = buffer; this->headerLength += this->origFilename.length() + 1; } else { this->origFilename = ""; } if (this->flags & GZ_COMMENT) { /* FIXME! Add checking for header len */ pt = buffer; while ((c = getc( str )) && c != EOF) * pt++ = c; *pt = '\0'; comment = buffer; headerLength += comment.length() + 1; } else { comment = ""; } if (this->flags & GZ_FHCRC) { getc( str ); getc( str ); this->headerLength += 2; } if (ftell( str ) != this->headerLength + 1) { //err_internal( __FUNCTION__, // "File position (%lu) != header length + 1 (%d)\n", // ftell( str ), this->headerLength + 1 ); } fseek( str, -8, SEEK_END ); this->crc = getc( str ) << 0; this->crc |= getc( str ) << 8; this->crc |= getc( str ) << 16; this->crc |= getc( str ) << 24; this->length = getc( str ) << 0; this->length |= getc( str ) << 8; this->length |= getc( str ) << 16; this->length |= getc( str ) << 24; this->compressedLength = ftell( str ); /* Compute offsets */ this->offsets = (unsigned long *)malloc( sizeof( this->offsets[0] ) * this->chunkCount ); for (offset = this->headerLength + 1, i = 0; i < this->chunkCount; i++) { this->offsets[i] = offset; offset += this->chunks[i]; } fclose( str ); return 0; } bool dictData::open(const std::string& fname, int computeCRC) { struct stat sb; int j; int fd; this->initialized = 0; #ifdef Q_OS_UNIX if (stat(fname.c_str(), &sb) || !S_ISREG(sb.st_mode)) #elif defined(Q_OS_WIN32) if (_stat(fname.c_str(), &sb) || !(sb.stMode & _S_IFREG)) #endif { //err_warning( __FUNCTION__, // "%s is not a regular file -- ignoring\n", fname ); return false; } if (read_header(fname, computeCRC)) { //err_fatal( __FUNCTION__, // "\"%s\" not in text or dzip format\n", fname ); return false; } if ((fd = ::open(fname.c_str(), O_RDONLY )) < 0) { //err_fatal_errno( __FUNCTION__, // "Cannot open data file \"%s\"\n", fname ); return false; } if (fstat(fd, &sb)) { //err_fatal_errno( __FUNCTION__, // "Cannot stat data file \"%s\"\n", fname ); return false; } this->size = sb.st_size; ::close(fd); if (!mapfile.open(fname.c_str(), size)) return false; this->start = mapfile.begin(); this->end = this->start + this->size; for (j = 0; j < DICT_CACHE_SIZE; j++) { cache[j].chunk = -1; cache[j].stamp = -1; cache[j].inBuffer = NULL; cache[j].count = 0; } return true; } void dictData::close() { int i; if (this->chunks) free(this->chunks); if (this->offsets) free(this->offsets); if (this->initialized) { if (inflateEnd( &this->zStream )) { //err_internal( __FUNCTION__, // "Cannot shut down inflation engine: %s\n", // this->zStream.msg ); } } for (i = 0; i < DICT_CACHE_SIZE; ++i) { if (this -> cache [i].inBuffer) free (this -> cache [i].inBuffer); } } void dictData::read(char *buffer, unsigned long start, unsigned long size) { char *pt; unsigned long end; int count; char *inBuffer; char outBuffer[OUT_BUFFER_SIZE]; int firstChunk, lastChunk; int firstOffset, lastOffset; int i, j; int found, target, lastStamp; static int stamp = 0; end = start + size; //buffer = malloc( size + 1 ); //PRINTF(DBG_UNZIP, // ("dict_data_read( %p, %lu, %lu )\n", //h, start, size )); switch (this->type) { case DICT_GZIP: //err_fatal( __FUNCTION__, // "Cannot seek on pure gzip format files.\n" // "Use plain text (for performance)" // " or dzip format (for space savings).\n" ); break; case DICT_TEXT: memcpy( buffer, this->start + start, size ); //buffer[size] = '\0'; break; case DICT_DZIP: if (!this->initialized) { ++this->initialized; this->zStream.zalloc = NULL; this->zStream.zfree = NULL; this->zStream.opaque = NULL; this->zStream.next_in = 0; this->zStream.avail_in = 0; this->zStream.next_out = NULL; this->zStream.avail_out = 0; if (inflateInit2( &this->zStream, -15 ) != Z_OK) { //err_internal( __FUNCTION__, // "Cannot initialize inflation engine: %s\n", //this->zStream.msg ); } } firstChunk = start / this->chunkLength; firstOffset = start - firstChunk * this->chunkLength; lastChunk = end / this->chunkLength; lastOffset = end - lastChunk * this->chunkLength; //PRINTF(DBG_UNZIP, // (" start = %lu, end = %lu\n" //"firstChunk = %d, firstOffset = %d," //" lastChunk = %d, lastOffset = %d\n", //start, end, firstChunk, firstOffset, lastChunk, lastOffset )); for (pt = buffer, i = firstChunk; i <= lastChunk; i++) { /* Access cache */ found = 0; target = 0; lastStamp = INT_MAX; for (j = 0; j < DICT_CACHE_SIZE; j++) { #if USE_CACHE if (this->cache[j].chunk == i) { found = 1; target = j; break; } #endif if (this->cache[j].stamp < lastStamp) { lastStamp = this->cache[j].stamp; target = j; } } this->cache[target].stamp = ++stamp; if (found) { count = this->cache[target].count; inBuffer = this->cache[target].inBuffer; } else { this->cache[target].chunk = i; if (!this->cache[target].inBuffer) this->cache[target].inBuffer = (char *)malloc( IN_BUFFER_SIZE ); inBuffer = this->cache[target].inBuffer; if (this->chunks[i] >= OUT_BUFFER_SIZE ) { //err_internal( __FUNCTION__, // "this->chunks[%d] = %d >= %ld (OUT_BUFFER_SIZE)\n", // i, this->chunks[i], OUT_BUFFER_SIZE ); } memcpy( outBuffer, this->start + this->offsets[i], this->chunks[i] ); this->zStream.next_in = (Bytef *)outBuffer; this->zStream.avail_in = this->chunks[i]; this->zStream.next_out = (Bytef *)inBuffer; this->zStream.avail_out = IN_BUFFER_SIZE; if (inflate( &this->zStream, Z_PARTIAL_FLUSH ) != Z_OK) { //err_fatal( __FUNCTION__, "inflate: %s\n", this->zStream.msg ); } if (this->zStream.avail_in) { //err_internal( __FUNCTION__, // "inflate did not flush (%d pending, %d avail)\n", // this->zStream.avail_in, this->zStream.avail_out ); } count = IN_BUFFER_SIZE - this->zStream.avail_out; this->cache[target].count = count; } if (i == firstChunk) { if (i == lastChunk) { memcpy( pt, inBuffer + firstOffset, lastOffset - firstOffset); pt += lastOffset - firstOffset; } else { if (count != this->chunkLength ) { //err_internal( __FUNCTION__, // "Length = %d instead of %d\n", //count, this->chunkLength ); } memcpy( pt, inBuffer + firstOffset, this->chunkLength - firstOffset ); pt += this->chunkLength - firstOffset; } } else if (i == lastChunk) { memcpy( pt, inBuffer, lastOffset ); pt += lastOffset; } else { assert( count == this->chunkLength ); memcpy( pt, inBuffer, this->chunkLength ); pt += this->chunkLength; } } //*pt = '\0'; break; case DICT_UNKNOWN: //err_fatal( __FUNCTION__, "Cannot read unknown file type\n" ); break; } } qstardict-qstardict-1.3/plugins/stardict/dictziplib.hpp000066400000000000000000000023051323166163100235150ustar00rootroot00000000000000#ifndef __DICT_ZIP_LIB_H__ #define __DICT_ZIP_LIB_H__ #include #include #include #include "mapfile.hpp" #define DICT_CACHE_SIZE 5 struct dictCache { int chunk; char *inBuffer; int stamp; int count; }; struct dictData { dictData() {} bool open(const std::string& filename, int computeCRC); void close(); void read(char *buffer, unsigned long start, unsigned long size); ~dictData() { close(); } private: const char *start; /* start of mmap'd area */ const char *end; /* end of mmap'd area */ unsigned long size; /* size of mmap */ int type; z_stream zStream; int initialized; int headerLength; int method; int flags; time_t mtime; int extraFlags; int os; int version; int chunkLength; int chunkCount; int *chunks; unsigned long *offsets; /* Sum-scan of chunks. */ std::string origFilename; std::string comment; unsigned long crc; unsigned long length; unsigned long compressedLength; dictCache cache[DICT_CACHE_SIZE]; MapFile mapfile; int read_header(const std::string &filename, int computeCRC); }; #endif//!__DICT_ZIP_LIB_H__ qstardict-qstardict-1.3/plugins/stardict/distance.cpp000066400000000000000000000132571323166163100231550ustar00rootroot00000000000000/* writer : Opera Wang E-Mail : wangvisual AT sohu DOT com License: GPL */ /* filename: distance.cc */ /* http://www.merriampark.com/ld.htm What is Levenshtein Distance? Levenshtein distance (LD) is a measure of the similarity between two strings, which we will refer to as the source string (s) and the target string (t). The distance is the number of deletions, insertions, or substitutions required to transform s into t. For example, * If s is "test" and t is "test", then LD(s,t) = 0, because no transformations are needed. The strings are already identical. * If s is "test" and t is "tent", then LD(s,t) = 1, because one substitution (change "s" to "n") is sufficient to transform s into t. The greater the Levenshtein distance, the more different the strings are. Levenshtein distance is named after the Russian scientist Vladimir Levenshtein, who devised the algorithm in 1965. If you can't spell or pronounce Levenshtein, the metric is also sometimes called edit distance. The Levenshtein distance algorithm has been used in: * Spell checking * Speech recognition * DNA analysis * Plagiarism detection */ #include #include //#include #include "distance.h" #define OPTIMIZE_ED /* Cover transposition, in addition to deletion, insertion and substitution. This step is taken from: Berghel, Hal ; Roach, David : "An Extension of Ukkonen's Enhanced Dynamic Programming ASM Algorithm" (http://www.acm.org/~hlb/publications/asm/asm.html) */ #define COVER_TRANSPOSITION /****************************************/ /*Implementation of Levenshtein distance*/ /****************************************/ EditDistance::EditDistance() { currentelements = 2500; // It's enough for most conditions :-) d = (int*)malloc(sizeof(int) * currentelements); } EditDistance::~EditDistance() { // printf("size:%d\n",currentelements); if (d) free(d); } #ifdef OPTIMIZE_ED int EditDistance::CalEditDistance(const gunichar *s, const gunichar *t, const int limit) /*Compute levenshtein distance between s and t, this is using QUICK algorithm*/ { int n = 0, m = 0, iLenDif, k, i, j, cost; // Remove leftmost matching portion of strings while ( *s && (*s == *t) ) { s++; t++; } while (s[n]) { n++; } while (t[m]) { m++; } // Remove rightmost matching portion of strings by decrement n and m. while ( n && m && (*(s + n - 1) == *(t + m - 1)) ) { n--; m--; } if ( m == 0 || n == 0 || d == (int*)0 ) return (m + n); if ( m < n ) { const gunichar * temp = s; int itemp = n; s = t; t = temp; n = m; m = itemp; } iLenDif = m - n; if ( iLenDif >= limit ) return iLenDif; // step 1 n++; m++; // d=(int*)malloc(sizeof(int)*m*n); if ( m*n > currentelements ) { currentelements = m * n * 2; // double the request d = (int*)realloc(d, sizeof(int) * currentelements); if ( (int*)0 == d ) return (m + n); } // step 2, init matrix for (k = 0;k < n;k++) d[k] = k; for (k = 1;k < m;k++) d[k*n] = k; // step 3 for (i = 1;i < n;i++) { // first calculate column, d(i,j) for ( j = 1;j < iLenDif + i;j++ ) { cost = s[i - 1] == t[j - 1] ? 0 : 1; d[j*n + i] = minimum(d[(j - 1) * n + i] + 1, d[j * n + i - 1] + 1, d[(j - 1) * n + i - 1] + cost); #ifdef COVER_TRANSPOSITION if ( i >= 2 && j >= 2 && (d[j*n + i] - d[(j - 2)*n + i - 2] == 2) && (s[i - 2] == t[j - 1]) && (s[i - 1] == t[j - 2]) ) d[j*n + i]--; #endif } // second calculate row, d(k,j) // now j==iLenDif+i; for ( k = 1;k <= i;k++ ) { cost = s[k - 1] == t[j - 1] ? 0 : 1; d[j*n + k] = minimum(d[(j - 1) * n + k] + 1, d[j * n + k - 1] + 1, d[(j - 1) * n + k - 1] + cost); #ifdef COVER_TRANSPOSITION if ( k >= 2 && j >= 2 && (d[j*n + k] - d[(j - 2)*n + k - 2] == 2) && (s[k - 2] == t[j - 1]) && (s[k - 1] == t[j - 2]) ) d[j*n + k]--; #endif } // test if d(i,j) limit gets equal or exceed if ( d[j*n + i] >= limit ) { return d[j*n + i]; } } // d(n-1,m-1) return d[n*m - 1]; } #else int EditDistance::CalEditDistance(const char *s, const char *t, const int limit) { //Step 1 int k, i, j, n, m, cost; n = strlen(s); m = strlen(t); if ( n != 0 && m != 0 && d != (int*)0 ) { m++; n++; if ( m*n > currentelements ) { currentelements = m * n * 2; d = (int*)realloc(d, sizeof(int) * currentelements); if ( (int*)0 == d ) return (m + n); } //Step 2 for (k = 0;k < n;k++) d[k] = k; for (k = 0;k < m;k++) d[k*n] = k; //Step 3 and 4 for (i = 1;i < n;i++) for (j = 1;j < m;j++) { //Step 5 if (s[i - 1] == t[j - 1]) cost = 0; else cost = 1; //Step 6 d[j*n + i] = minimum(d[(j - 1) * n + i] + 1, d[j * n + i - 1] + 1, d[(j - 1) * n + i - 1] + cost); #ifdef COVER_TRANSPOSITION if ( i >= 2 && j >= 2 && (d[j*n + i] - d[(j - 2)*n + i - 2] == 2) && (s[i - 2] == t[j - 1]) && (s[i - 1] == t[j - 2]) ) d[j*n + i]--; #endif } return d[n*m - 1]; } else return (n + m); } #endif qstardict-qstardict-1.3/plugins/stardict/distance.h000066400000000000000000000011111323166163100226040ustar00rootroot00000000000000#ifndef DISTANCE_H #define DISTANCE_H #include class EditDistance { private: int *d; int currentelements; /*Gets the minimum of three values */ inline int minimum( const int a, const int b, const int c ) { int min = a; if ( b < min ) min = b; if ( c < min ) min = c; return min; }; public: EditDistance( ); ~EditDistance( ); int CalEditDistance( const gunichar *s, const gunichar *t, const int limit ); }; #endif qstardict-qstardict-1.3/plugins/stardict/file.hpp000066400000000000000000000035501323166163100223020ustar00rootroot00000000000000#ifndef _FILE_HPP_ #define _FILE_HPP_ #include #include #include #include typedef std::list List; template void __for_each_file(const std::string& dirname, const std::string& suff, const List& order_list, const List& disable_list, Function f) { GDir *dir = g_dir_open(dirname.c_str(), 0, NULL); if (dir) { const gchar *filename; while ((filename = g_dir_read_name(dir)) != NULL) { std::string fullfilename(dirname + G_DIR_SEPARATOR_S + filename); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_IS_DIR)) __for_each_file(fullfilename, suff, order_list, disable_list, f); else if (g_str_has_suffix(filename, suff.c_str()) && std::find(order_list.begin(), order_list.end(), fullfilename) == order_list.end()) { bool disable = std::find(disable_list.begin(), disable_list.end(), fullfilename) != disable_list.end(); f(fullfilename, disable); } } g_dir_close(dir); } } template void for_each_file(const List& dirs_list, const std::string& suff, const List& order_list, const List& disable_list, Function f) { List::const_iterator it; for (it = order_list.begin(); it != order_list.end(); ++it) { bool disable = std::find(disable_list.begin(), disable_list.end(), *it) != disable_list.end(); f(*it, disable); } for (it = dirs_list.begin(); it != dirs_list.end(); ++it) __for_each_file(*it, suff, order_list, disable_list, f); } #endif//!_FILE_HPP_ qstardict-qstardict-1.3/plugins/stardict/lib.cpp000066400000000000000000001600431323166163100221250ustar00rootroot00000000000000#ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include "distance.h" #include "file.hpp" #include "mapfile.hpp" #include "lib.h" // Notice: read src/tools/DICTFILE_FORMAT for the dictionary // file's format information! static inline bool bIsVowel(gchar inputchar) { gchar ch = g_ascii_toupper(inputchar); return ( ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U' ); } static bool bIsPureEnglish(const gchar *str) { // i think this should work even when it is UTF8 string :). for (int i = 0; str[i] != 0; i++) //if(str[i]<0) //if(str[i]<32 || str[i]>126) // tab equal 9,so this is not OK. // Better use isascii() but not str[i]<0 while char is default unsigned in arm if (!isascii(str[i])) return false; return true; } static inline gint stardict_strcmp(const gchar *s1, const gchar *s2) { gint a = g_ascii_strcasecmp(s1, s2); if (a == 0) return strcmp(s1, s2); else return a; } bool DictInfo::load_from_ifo_file(const std::string& ifofilename, bool istreedict) { ifo_file_name = ifofilename; gchar *buffer; if (!g_file_get_contents(ifofilename.c_str(), &buffer, NULL, NULL)) return false; #define TREEDICT_MAGIC_DATA "StarDict's treedict ifo file\nversion=2.4.2\n" #define DICT_MAGIC_DATA "StarDict's dict ifo file\nversion=2.4.2\n" const gchar *magic_data = istreedict ? TREEDICT_MAGIC_DATA : DICT_MAGIC_DATA; if (!g_str_has_prefix(buffer, magic_data)) { g_free(buffer); return false; } gchar *p1, *p2, *p3; p1 = buffer + strlen(magic_data) - 1; p2 = strstr(p1, "\nwordcount="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\nwordcount=") - 1, '\n'); gchar *tmpstr = (gchar *)g_memdup(p2 + sizeof("\nwordcount=") - 1, p3 - (p2 + sizeof("\nwordcount=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\nwordcount=") - 1)] = '\0'; wordcount = atol(tmpstr); g_free(tmpstr); if (istreedict) { p2 = strstr(p1, "\ntdxfilesize="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\ntdxfilesize=") - 1, '\n'); tmpstr = (gchar *)g_memdup(p2 + sizeof("\ntdxfilesize=") - 1, p3 - (p2 + sizeof("\ntdxfilesize=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\ntdxfilesize=") - 1)] = '\0'; index_file_size = atol(tmpstr); g_free(tmpstr); } else { p2 = strstr(p1, "\nidxfilesize="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\nidxfilesize=") - 1, '\n'); tmpstr = (gchar *)g_memdup(p2 + sizeof("\nidxfilesize=") - 1, p3 - (p2 + sizeof("\nidxfilesize=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\nidxfilesize=") - 1)] = '\0'; index_file_size = atol(tmpstr); g_free(tmpstr); } p2 = strstr(p1, "\nbookname="); if (!p2) { g_free(buffer); return false; } p2 = p2 + sizeof("\nbookname=") - 1; p3 = strchr(p2, '\n'); bookname.assign(p2, p3 - p2); p2 = strstr(p1, "\nauthor="); if (p2) { p2 = p2 + sizeof("\nauthor=") - 1; p3 = strchr(p2, '\n'); author.assign(p2, p3 - p2); } p2 = strstr(p1, "\nemail="); if (p2) { p2 = p2 + sizeof("\nemail=") - 1; p3 = strchr(p2, '\n'); email.assign(p2, p3 - p2); } p2 = strstr(p1, "\nwebsite="); if (p2) { p2 = p2 + sizeof("\nwebsite=") - 1; p3 = strchr(p2, '\n'); website.assign(p2, p3 - p2); } p2 = strstr(p1, "\ndate="); if (p2) { p2 = p2 + sizeof("\ndate=") - 1; p3 = strchr(p2, '\n'); date.assign(p2, p3 - p2); } p2 = strstr(p1, "\ndescription="); if (p2) { p2 = p2 + sizeof("\ndescription=") - 1; p3 = strchr(p2, '\n'); description.assign(p2, p3 - p2); } p2 = strstr(p1, "\nsametypesequence="); if (p2) { p2 += sizeof("\nsametypesequence=") - 1; p3 = strchr(p2, '\n'); sametypesequence.assign(p2, p3 - p2); } g_free(buffer); return true; } //=================================================================== DictBase::DictBase() { dictfile = NULL; cache_cur = 0; } DictBase::~DictBase() { if (dictfile) fclose(dictfile); } gchar* DictBase::GetWordData(guint32 idxitem_offset, guint32 idxitem_size) { for (int i = 0; i < WORDDATA_CACHE_NUM; i++) if (cache[i].data && cache[i].offset == idxitem_offset) return cache[i].data; if (dictfile) fseek(dictfile, idxitem_offset, SEEK_SET); gchar *data; if (!sametypesequence.empty()) { gchar *origin_data = (gchar *)g_malloc(idxitem_size); if (dictfile) fread(origin_data, idxitem_size, 1, dictfile); else dictdzfile->read(origin_data, idxitem_offset, idxitem_size); guint32 data_size; gint sametypesequence_len = sametypesequence.length(); //there have sametypesequence_len char being omitted. data_size = idxitem_size + sizeof(guint32) + sametypesequence_len; //if the last item's size is determined by the end up '\0',then +=sizeof(gchar); //if the last item's size is determined by the head guint32 type data,then +=sizeof(guint32); switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': data_size += sizeof(gchar); break; case 'W': case 'P': data_size += sizeof(guint32); break; default: if (g_ascii_isupper(sametypesequence[sametypesequence_len - 1])) data_size += sizeof(guint32); else data_size += sizeof(gchar); break; } data = (gchar *)g_malloc(data_size); gchar *p1, *p2; p1 = data + sizeof(guint32); p2 = origin_data; guint32 sec_size; //copy the head items. for (int i = 0; i < sametypesequence_len - 1; i++) { *p1 = sametypesequence[i]; p1 += sizeof(gchar); switch (sametypesequence[i]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': sec_size = strlen(p2) + 1; memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; case 'W': case 'P': sec_size = *reinterpret_cast(p2); sec_size += sizeof(guint32); memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; default: if (g_ascii_isupper(sametypesequence[i])) { sec_size = *reinterpret_cast(p2); sec_size += sizeof(guint32); } else { sec_size = strlen(p2) + 1; } memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; } } //calculate the last item 's size. sec_size = idxitem_size - (p2 - origin_data); *p1 = sametypesequence[sametypesequence_len - 1]; p1 += sizeof(gchar); switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': memcpy(p1, p2, sec_size); p1 += sec_size; *p1 = '\0'; //add the end up '\0'; break; case 'W': case 'P': *reinterpret_cast(p1) = sec_size; p1 += sizeof(guint32); memcpy(p1, p2, sec_size); break; default: if (g_ascii_isupper(sametypesequence[sametypesequence_len - 1])) { *reinterpret_cast(p1) = sec_size; p1 += sizeof(guint32); memcpy(p1, p2, sec_size); } else { memcpy(p1, p2, sec_size); p1 += sec_size; *p1 = '\0'; } break; } g_free(origin_data); *reinterpret_cast(data) = data_size; } else { data = (gchar *)g_malloc(idxitem_size + sizeof(guint32)); if (dictfile) fread(data + sizeof(guint32), idxitem_size, 1, dictfile); else dictdzfile->read(data + sizeof(guint32), idxitem_offset, idxitem_size); *reinterpret_cast(data) = idxitem_size + sizeof(guint32); } g_free(cache[cache_cur].data); cache[cache_cur].data = data; cache[cache_cur].offset = idxitem_offset; cache_cur++; if (cache_cur == WORDDATA_CACHE_NUM) cache_cur = 0; return data; } inline bool DictBase::containSearchData() { if (sametypesequence.empty()) return true; return sametypesequence.find_first_of("mlgxty") != std::string::npos; } bool DictBase::SearchData(std::vector &SearchWords, guint32 idxitem_offset, guint32 idxitem_size, gchar *origin_data) { int nWord = SearchWords.size(); std::vector WordFind(nWord, false); int nfound = 0; if (dictfile) fseek(dictfile, idxitem_offset, SEEK_SET); if (dictfile) fread(origin_data, idxitem_size, 1, dictfile); else dictdzfile->read(origin_data, idxitem_offset, idxitem_size); gchar *p = origin_data; guint32 sec_size; int j; if (!sametypesequence.empty()) { gint sametypesequence_len = sametypesequence.length(); for (int i = 0; i < sametypesequence_len - 1; i++) { switch (sametypesequence[i]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': for (j = 0; j < nWord; j++) if (!WordFind[j] && strstr(p, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; sec_size = strlen(p) + 1; p += sec_size; break; default: if (g_ascii_isupper(sametypesequence[i])) { sec_size = *reinterpret_cast(p); sec_size += sizeof(guint32); } else { sec_size = strlen(p) + 1; } p += sec_size; } } switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': sec_size = idxitem_size - (p - origin_data); for (j = 0; j < nWord; j++) if (!WordFind[j] && g_strstr_len(p, sec_size, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; break; } } else { while (guint32(p - origin_data) < idxitem_size) { switch (*p) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': for (j = 0; j < nWord; j++) if (!WordFind[j] && strstr(p, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; sec_size = strlen(p) + 1; p += sec_size; break; default: if (g_ascii_isupper(*p)) { sec_size = *reinterpret_cast(p); sec_size += sizeof(guint32); } else { sec_size = strlen(p) + 1; } p += sec_size; } } } return false; } class offset_index : public index_file { public: offset_index() : idxfile(NULL) {} ~offset_index(); bool load(const std::string& url, gulong wc, gulong fsize); const gchar *get_key(glong idx); void get_data(glong idx); const gchar *get_key_and_data(glong idx); bool lookup(const char *str, glong &idx); private: static const gint ENTR_PER_PAGE = 32; static const char *CACHE_MAGIC; std::vector wordoffset; FILE *idxfile; gulong wordcount; gchar wordentry_buf[256 + sizeof(guint32)*2]; // The length of "word_str" should be less than 256. See src/tools/DICTFILE_FORMAT. struct index_entry { glong idx; std::string keystr; void assign(glong i, const std::string& str) { idx = i; keystr.assign(str); } }; index_entry first, last, middle, real_last; struct page_entry { gchar *keystr; guint32 off, size; }; std::vector page_data; struct page_t { glong idx; page_entry entries[ENTR_PER_PAGE]; page_t(): idx( -1) {} void fill(gchar *data, gint nent, glong idx_); } page; gulong load_page(glong page_idx); const gchar *read_first_on_page_key(glong page_idx); const gchar *get_first_on_page_key(glong page_idx); bool load_cache(const std::string& url); bool save_cache(const std::string& url); static strlist_t get_cache_variant(const std::string& url); }; const char *offset_index::CACHE_MAGIC = "StarDict's Cache, Version: 0.1"; class wordlist_index : public index_file { public: wordlist_index() : idxdatabuf(NULL) {} ~wordlist_index(); bool load(const std::string& url, gulong wc, gulong fsize); const gchar *get_key(glong idx); void get_data(glong idx); const gchar *get_key_and_data(glong idx); bool lookup(const char *str, glong &idx); private: gchar *idxdatabuf; std::vector wordlist; }; void offset_index::page_t::fill(gchar *data, gint nent, glong idx_) { idx = idx_; gchar *p = data; glong len; for (gint i = 0; i < nent; ++i) { entries[i].keystr = p; len = strlen(p); p += len + 1; entries[i].off = g_ntohl(*reinterpret_cast(p)); p += sizeof(guint32); entries[i].size = g_ntohl(*reinterpret_cast(p)); p += sizeof(guint32); } } offset_index::~offset_index() { if (idxfile) fclose(idxfile); } inline const gchar *offset_index::read_first_on_page_key(glong page_idx) { fseek(idxfile, wordoffset[page_idx], SEEK_SET); guint page_size = wordoffset[page_idx + 1] - wordoffset[page_idx]; fread(wordentry_buf, std::min(sizeof(wordentry_buf), page_size), 1, idxfile); //TODO: check returned values, deal with word entry that strlen>255. return wordentry_buf; } inline const gchar *offset_index::get_first_on_page_key(glong page_idx) { if (page_idx < middle.idx) { if (page_idx == first.idx) return first.keystr.c_str(); return read_first_on_page_key(page_idx); } else if (page_idx > middle.idx) { if (page_idx == last.idx) return last.keystr.c_str(); return read_first_on_page_key(page_idx); } else return middle.keystr.c_str(); } bool offset_index::load_cache(const std::string& url) { strlist_t vars = get_cache_variant(url); for (strlist_t::const_iterator it = vars.begin(); it != vars.end(); ++it) { struct stat idxstat, cachestat; if (g_stat(url.c_str(), &idxstat) != 0 || g_stat(it->c_str(), &cachestat) != 0) continue; if (cachestat.st_mtime < idxstat.st_mtime) continue; MapFile mf; if (!mf.open(it->c_str(), cachestat.st_size)) continue; if (strncmp(mf.begin(), CACHE_MAGIC, strlen(CACHE_MAGIC)) != 0) continue; memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC), wordoffset.size()*sizeof(wordoffset[0])); return true; } return false; } strlist_t offset_index::get_cache_variant(const std::string& url) { strlist_t res; res.push_back(url + ".oft"); if (!g_file_test(g_get_user_cache_dir(), G_FILE_TEST_EXISTS) && g_mkdir(g_get_user_cache_dir(), 0700) == -1) return res; std::string cache_dir = std::string(g_get_user_cache_dir()) + G_DIR_SEPARATOR_S + "sdcv"; if (!g_file_test(cache_dir.c_str(), G_FILE_TEST_EXISTS)) { if (g_mkdir(cache_dir.c_str(), 0700) == -1) return res; } else if (!g_file_test(cache_dir.c_str(), G_FILE_TEST_IS_DIR)) return res; gchar *base = g_path_get_basename(url.c_str()); res.push_back(cache_dir + G_DIR_SEPARATOR_S + base + ".oft"); g_free(base); return res; } bool offset_index::save_cache(const std::string& url) { strlist_t vars = get_cache_variant(url); for (strlist_t::const_iterator it = vars.begin(); it != vars.end(); ++it) { FILE *out = fopen(it->c_str(), "wb"); if (!out) continue; if (fwrite(CACHE_MAGIC, 1, strlen(CACHE_MAGIC), out) != strlen(CACHE_MAGIC)) continue; if (fwrite(&wordoffset[0], sizeof(wordoffset[0]), wordoffset.size(), out) != wordoffset.size()) continue; fclose(out); printf("save to cache %s\n", url.c_str()); return true; } return false; } bool offset_index::load(const std::string& url, gulong wc, gulong fsize) { wordcount = wc; gulong npages = (wc - 1) / ENTR_PER_PAGE + 2; wordoffset.resize(npages); if (!load_cache(url)) { //map file will close after finish of block MapFile map_file; if (!map_file.open(url.c_str(), fsize)) return false; const gchar *idxdatabuffer = map_file.begin(); const gchar *p1 = idxdatabuffer; gulong index_size; guint32 j = 0; for (guint32 i = 0; i < wc; i++) { index_size = strlen(p1) + 1 + 2 * sizeof(guint32); if (i % ENTR_PER_PAGE == 0) { wordoffset[j] = p1 - idxdatabuffer; ++j; } p1 += index_size; } wordoffset[j] = p1 - idxdatabuffer; if (!save_cache(url)) fprintf(stderr, "cache update failed\n"); } if (!(idxfile = fopen(url.c_str(), "rb"))) { wordoffset.resize(0); return false; } first.assign(0, read_first_on_page_key(0)); last.assign(wordoffset.size() - 2, read_first_on_page_key(wordoffset.size() - 2)); middle.assign((wordoffset.size() - 2) / 2, read_first_on_page_key((wordoffset.size() - 2) / 2)); real_last.assign(wc - 1, get_key(wc - 1)); return true; } inline gulong offset_index::load_page(glong page_idx) { gulong nentr = ENTR_PER_PAGE; if (page_idx == glong(wordoffset.size() - 2)) if ((nentr = wordcount % ENTR_PER_PAGE) == 0) nentr = ENTR_PER_PAGE; if (page_idx != page.idx) { page_data.resize(wordoffset[page_idx + 1] - wordoffset[page_idx]); fseek(idxfile, wordoffset[page_idx], SEEK_SET); fread(&page_data[0], 1, page_data.size(), idxfile); page.fill(&page_data[0], nentr, page_idx); } return nentr; } const gchar *offset_index::get_key(glong idx) { load_page(idx / ENTR_PER_PAGE); glong idx_in_page = idx % ENTR_PER_PAGE; wordentry_offset = page.entries[idx_in_page].off; wordentry_size = page.entries[idx_in_page].size; return page.entries[idx_in_page].keystr; } void offset_index::get_data(glong idx) { get_key(idx); } const gchar *offset_index::get_key_and_data(glong idx) { return get_key(idx); } bool offset_index::lookup(const char *str, glong &idx) { bool bFound = false; glong iFrom; glong iTo = wordoffset.size() - 2; gint cmpint; glong iThisIndex; if (stardict_strcmp(str, first.keystr.c_str()) < 0) { idx = 0; return false; } else if (stardict_strcmp(str, real_last.keystr.c_str()) > 0) { idx = INVALID_INDEX; return false; } else { iFrom = 0; iThisIndex = 0; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, get_first_on_page_key(iThisIndex)); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } if (!bFound) idx = iTo; //prev else idx = iThisIndex; } if (!bFound) { gulong netr = load_page(idx); iFrom = 1; // Needn't search the first word anymore. iTo = netr - 1; iThisIndex = 0; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, page.entries[iThisIndex].keystr); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } idx *= ENTR_PER_PAGE; if (!bFound) idx += iFrom; //next else idx += iThisIndex; } else { idx *= ENTR_PER_PAGE; } return bFound; } wordlist_index::~wordlist_index() { g_free(idxdatabuf); } bool wordlist_index::load(const std::string& url, gulong wc, gulong fsize) { gzFile in = gzopen(url.c_str(), "rb"); if (in == NULL) return false; idxdatabuf = (gchar *)g_malloc(fsize); gulong len = gzread(in, idxdatabuf, fsize); gzclose(in); if (len != fsize) return false; wordlist.resize(wc + 1); gchar *p1 = idxdatabuf; guint32 i; for (i = 0; i < wc; i++) { wordlist[i] = p1; p1 += strlen(p1) + 1 + 2 * sizeof(guint32); } wordlist[wc] = p1; return true; } const gchar *wordlist_index::get_key(glong idx) { return wordlist[idx]; } void wordlist_index::get_data(glong idx) { gchar *p1 = wordlist[idx] + strlen(wordlist[idx]) + sizeof(gchar); wordentry_offset = g_ntohl(*reinterpret_cast(p1)); p1 += sizeof(guint32); wordentry_size = g_ntohl(*reinterpret_cast(p1)); } const gchar *wordlist_index::get_key_and_data(glong idx) { get_data(idx); return get_key(idx); } bool wordlist_index::lookup(const char *str, glong &idx) { bool bFound = false; glong iTo = wordlist.size() - 2; if (stardict_strcmp(str, get_key(0)) < 0) { idx = 0; } else if (stardict_strcmp(str, get_key(iTo)) > 0) { idx = INVALID_INDEX; } else { glong iThisIndex = 0; glong iFrom = 0; gint cmpint; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, get_key(iThisIndex)); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } if (!bFound) idx = iFrom; //next else idx = iThisIndex; } return bFound; } //=================================================================== bool Dict::load(const std::string& ifofilename) { gulong idxfilesize; if (!load_ifofile(ifofilename, idxfilesize)) return false; std::string fullfilename(ifofilename); fullfilename.replace(fullfilename.length() - sizeof("ifo") + 1, sizeof("ifo") - 1, "dict.dz"); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_EXISTS)) { dictdzfile.reset(new dictData); if (!dictdzfile->open(fullfilename, 0)) { //g_print("open file %s failed!\n",fullfilename); return false; } } else { fullfilename.erase(fullfilename.length() - sizeof(".dz") + 1, sizeof(".dz") - 1); dictfile = fopen(fullfilename.c_str(), "rb"); if (!dictfile) { //g_print("open file %s failed!\n",fullfilename); return false; } } fullfilename = ifofilename; fullfilename.replace(fullfilename.length() - sizeof("ifo") + 1, sizeof("ifo") - 1, "idx.gz"); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_EXISTS)) { idx_file.reset(new wordlist_index); } else { fullfilename.erase(fullfilename.length() - sizeof(".gz") + 1, sizeof(".gz") - 1); idx_file.reset(new offset_index); } if (!idx_file->load(fullfilename, wordcount, idxfilesize)) return false; //g_print("bookname: %s , wordcount %lu\n", bookname.c_str(), narticles()); return true; } bool Dict::load_ifofile(const std::string& ifofilename, gulong &idxfilesize) { DictInfo dict_info; if (!dict_info.load_from_ifo_file(ifofilename, false)) return false; if (dict_info.wordcount == 0) return false; ifo_file_name = dict_info.ifo_file_name; wordcount = dict_info.wordcount; bookname = dict_info.bookname; idxfilesize = dict_info.index_file_size; sametypesequence = dict_info.sametypesequence; return true; } bool Dict::LookupWithRule(GPatternSpec *pspec, glong *aIndex, int iBuffLen) { int iIndexCount = 0; for (guint32 i = 0; i < narticles() && iIndexCount < iBuffLen - 1; i++) if (g_pattern_match_string(pspec, get_key(i))) aIndex[iIndexCount++] = i; aIndex[iIndexCount] = -1; // -1 is the end. return (iIndexCount > 0); } //=================================================================== Libs::Libs(progress_func_t f) { progress_func = f; iMaxFuzzyDistance = MAX_FUZZY_DISTANCE; //need to read from cfg. } Libs::~Libs() { for (std::vector::iterator p = oLib.begin(); p != oLib.end(); ++p) delete *p; } void Libs::load_dict(const std::string& url) { Dict *lib = new Dict; if (lib->load(url)) oLib.push_back(lib); else delete lib; } class DictLoader { public: DictLoader(Libs& lib_): lib(lib_) {} void operator()(const std::string& url, bool disable) { if (!disable) lib.load_dict(url); } private: Libs& lib; }; void Libs::load(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list) { for_each_file(dicts_dirs, ".ifo", order_list, disable_list, DictLoader(*this)); } class DictReLoader { public: DictReLoader(std::vector &p, std::vector &f, Libs& lib_) : prev(p), future(f), lib(lib_) {} void operator()(const std::string& url, bool disable) { if (!disable) { Dict *dict = find(url); if (dict) future.push_back(dict); else lib.load_dict(url); } } private: std::vector &prev; std::vector &future; Libs& lib; Dict *find(const std::string& url) { std::vector::iterator it; for (it = prev.begin(); it != prev.end(); ++it) if ((*it)->ifofilename() == url) break; if (it != prev.end()) { Dict *res = *it; prev.erase(it); return res; } return NULL; } }; void Libs::reload(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list) { std::vector prev(oLib); oLib.clear(); for_each_file(dicts_dirs, ".ifo", order_list, disable_list, DictReLoader(prev, oLib, *this)); for (std::vector::iterator it = prev.begin(); it != prev.end(); ++it) delete *it; } const gchar *Libs::poGetCurrentWord(glong * iCurrent) { const gchar *poCurrentWord = NULL; const gchar *word; for (std::vector::size_type iLib = 0; iLib= narticles(iLib) || iCurrent[iLib] < 0) continue; if ( poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib], iLib); } else { word = poGetWord(iCurrent[iLib], iLib); if (stardict_strcmp(poCurrentWord, word) > 0 ) poCurrentWord = word; } } return poCurrentWord; } const gchar * Libs::poGetNextWord(const gchar *sWord, glong *iCurrent) { // the input can be: // (word,iCurrent),read word,write iNext to iCurrent,and return next word. used by TopWin::NextCallback(); // (NULL,iCurrent),read iCurrent,write iNext to iCurrent,and return next word. used by AppCore::ListWords(); const gchar *poCurrentWord = NULL; std::vector::size_type iCurrentLib = 0; const gchar *word; for (std::vector::size_type iLib = 0;iLibLookup(sWord, iCurrent[iLib]); if (iCurrent[iLib] == INVALID_INDEX) continue; if (iCurrent[iLib] >= narticles(iLib) || iCurrent[iLib] < 0) continue; if (poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib], iLib); iCurrentLib = iLib; } else { word = poGetWord(iCurrent[iLib], iLib); if (stardict_strcmp(poCurrentWord, word) > 0 ) { poCurrentWord = word; iCurrentLib = iLib; } } } if (poCurrentWord) { iCurrent[iCurrentLib] ++; for (std::vector::size_type iLib = 0;iLib= narticles(iLib) || iCurrent[iLib] < 0) continue; if (strcmp(poCurrentWord, poGetWord(iCurrent[iLib], iLib)) == 0 ) iCurrent[iLib]++; } poCurrentWord = poGetCurrentWord(iCurrent); } return poCurrentWord; } const gchar * Libs::poGetPreWord(glong * iCurrent) { // used by TopWin::PreviousCallback(); the iCurrent is cached by AppCore::TopWinWordChange(); const gchar *poCurrentWord = NULL; std::vector::size_type iCurrentLib = 0; const gchar *word; for (std::vector::size_type iLib = 0;iLib narticles(iLib) || iCurrent[iLib] <= 0) continue; } if ( poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib] - 1, iLib); iCurrentLib = iLib; } else { word = poGetWord(iCurrent[iLib] - 1, iLib); if (stardict_strcmp(poCurrentWord, word) < 0 ) { poCurrentWord = word; iCurrentLib = iLib; } } } if (poCurrentWord) { iCurrent[iCurrentLib] --; for (std::vector::size_type iLib = 0;iLib narticles(iLib) || iCurrent[iLib] <= 0) continue; if (strcmp(poCurrentWord, poGetWord(iCurrent[iLib] - 1, iLib)) == 0) { iCurrent[iLib]--; } else { if (iCurrent[iLib] == narticles(iLib)) iCurrent[iLib] = INVALID_INDEX; } } } return poCurrentWord; } bool Libs::LookupSimilarWord(const gchar* sWord, glong & iWordIndex, int iLib) { glong iIndex; bool bFound = false; gchar *casestr; if (!bFound) { // to lower case. casestr = g_utf8_strdown(sWord, -1); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); // to upper case. if (!bFound) { casestr = g_utf8_strup(sWord, -1); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } // Upper the first character and lower others. if (!bFound) { gchar *nextchar = g_utf8_next_char(sWord); gchar *firstchar = g_utf8_strup(sWord, nextchar - sWord); nextchar = g_utf8_strdown(nextchar, -1); casestr = g_strdup_printf("%s%s", firstchar, nextchar); g_free(firstchar); g_free(nextchar); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } if (bIsPureEnglish(sWord)) { // If not Found , try other status of sWord. int iWordLen = strlen(sWord); bool isupcase; gchar *sNewWord = (gchar *)g_malloc(iWordLen + 1); //cut one char "s" or "d" if (!bFound && iWordLen > 1) { isupcase = sWord[iWordLen - 1] == 'S' || !strncmp(&sWord[iWordLen - 2], "ED", 2); if (isupcase || sWord[iWordLen - 1] == 's' || !strncmp(&sWord[iWordLen - 2], "ed", 2)) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 1] = '\0'; // cut "s" or "d" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } //cut "ly" if (!bFound && iWordLen > 2) { isupcase = !strncmp(&sWord[iWordLen - 2], "LY", 2); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "ly", 2))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; // cut "ly" if (iWordLen > 5 && sNewWord[iWordLen - 3] == sNewWord[iWordLen - 4] && !bIsVowel(sNewWord[iWordLen - 4]) && bIsVowel(sNewWord[iWordLen - 5])) { //doubled sNewWord[iWordLen - 3] = '\0'; if ( oLib[iLib]->Lookup(sNewWord, iIndex) ) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 3] = sNewWord[iWordLen - 4]; //restore } } if (!bFound) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } //cut "ing" if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "ING", 3); if (isupcase || !strncmp(&sWord[iWordLen - 3], "ing", 3) ) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if ( iWordLen > 6 && (sNewWord[iWordLen - 4] == sNewWord[iWordLen - 5]) && !bIsVowel(sNewWord[iWordLen - 5]) && bIsVowel(sNewWord[iWordLen - 6])) { //doubled sNewWord[iWordLen - 4] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 4] = sNewWord[iWordLen - 5]; //restore } } if ( !bFound ) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } if (!bFound) { if (isupcase) strcat(sNewWord, "E"); // add a char "E" else strcat(sNewWord, "e"); // add a char "e" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } //cut two char "es" if (!bFound && iWordLen > 3) { isupcase = (!strncmp(&sWord[iWordLen - 2], "ES", 2) && (sWord[iWordLen - 3] == 'S' || sWord[iWordLen - 3] == 'X' || sWord[iWordLen - 3] == 'O' || (iWordLen > 4 && sWord[iWordLen - 3] == 'H' && (sWord[iWordLen - 4] == 'C' || sWord[iWordLen - 4] == 'S')))); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "es", 2) && (sWord[iWordLen - 3] == 's' || sWord[iWordLen - 3] == 'x' || sWord[iWordLen - 3] == 'o' || (iWordLen > 4 && sWord[iWordLen - 3] == 'h' && (sWord[iWordLen - 4] == 'c' || sWord[iWordLen - 4] == 's'))))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } //cut "ed" if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 2], "ED", 2); if (isupcase || !strncmp(&sWord[iWordLen - 2], "ed", 2)) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (iWordLen > 5 && (sNewWord[iWordLen - 3] == sNewWord[iWordLen - 4]) && !bIsVowel(sNewWord[iWordLen - 4]) && bIsVowel(sNewWord[iWordLen - 5])) { //doubled sNewWord[iWordLen - 3] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 3] = sNewWord[iWordLen - 4]; //restore } } if (!bFound) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } // cut "ied" , add "y". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "IED", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "ied", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (isupcase) strcat(sNewWord, "Y"); // add a char "Y" else strcat(sNewWord, "y"); // add a char "y" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "ies" , add "y". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "IES", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "ies", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (isupcase) strcat(sNewWord, "Y"); // add a char "Y" else strcat(sNewWord, "y"); // add a char "y" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "er". if (!bFound && iWordLen > 2) { isupcase = !strncmp(&sWord[iWordLen - 2], "ER", 2); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "er", 2))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "est". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "EST", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "est", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } g_free(sNewWord); } if (bFound) iWordIndex = iIndex; #if 0 else { //don't change iWordIndex here. //when LookupSimilarWord all failed too, we want to use the old LookupWord index to list words. //iWordIndex = INVALID_INDEX; } #endif return bFound; } bool Libs::SimpleLookupWord(const gchar* sWord, glong & iWordIndex, int iLib) { bool bFound = oLib[iLib]->Lookup(sWord, iWordIndex); if (!bFound) bFound = LookupSimilarWord(sWord, iWordIndex, iLib); return bFound; } struct Fuzzystruct { char * pMatchWord; int iMatchWordDistance; }; inline bool operator<(const Fuzzystruct & lh, const Fuzzystruct & rh) { if (lh.iMatchWordDistance != rh.iMatchWordDistance) return lh.iMatchWordDistance < rh.iMatchWordDistance; if (lh.pMatchWord && rh.pMatchWord) return stardict_strcmp(lh.pMatchWord, rh.pMatchWord) < 0; return false; } static inline void unicode_strdown(gunichar *str) { while (*str) { *str = g_unichar_tolower(*str); ++str; } } bool Libs::LookupWithFuzzy(const gchar *sWord, gchar *reslist[], gint reslist_size, gint iLib) { if (sWord[0] == '\0') return false; Fuzzystruct *oFuzzystruct = new Fuzzystruct[reslist_size]; for (int i = 0; i < reslist_size; i++) { oFuzzystruct[i].pMatchWord = NULL; oFuzzystruct[i].iMatchWordDistance = iMaxFuzzyDistance; } int iMaxDistance = iMaxFuzzyDistance; int iDistance; bool Found = false; EditDistance oEditDistance; glong iCheckWordLen; const char *sCheck; gunichar *ucs4_str1, *ucs4_str2; glong ucs4_str2_len; ucs4_str2 = g_utf8_to_ucs4_fast(sWord, -1, &ucs4_str2_len); unicode_strdown(ucs4_str2); // for (std::vector::size_type iLib = 0; iLib=0 && stardict_strcmp(sWord, poGetWord(narticles(iLib)-1,iLib))<=0) { //there are Chinese dicts and English dicts... if (TRUE) { const int iwords = narticles(iLib); for (int index = 0; index < iwords; index++) { sCheck = poGetWord(index, iLib); // tolower and skip too long or too short words iCheckWordLen = g_utf8_strlen(sCheck, -1); if (iCheckWordLen - ucs4_str2_len >= iMaxDistance || ucs4_str2_len - iCheckWordLen >= iMaxDistance) continue; ucs4_str1 = g_utf8_to_ucs4_fast(sCheck, -1, NULL); if (iCheckWordLen > ucs4_str2_len) ucs4_str1[ucs4_str2_len] = 0; unicode_strdown(ucs4_str1); iDistance = oEditDistance.CalEditDistance(ucs4_str1, ucs4_str2, iMaxDistance); g_free(ucs4_str1); if (iDistance < iMaxDistance && iDistance < ucs4_str2_len) { // when ucs4_str2_len=1,2 we need less fuzzy. Found = true; bool bAlreadyInList = false; int iMaxDistanceAt = 0; for (int j = 0; j < reslist_size; j++) { if (oFuzzystruct[j].pMatchWord && strcmp(oFuzzystruct[j].pMatchWord, sCheck) == 0 ) { //already in list bAlreadyInList = true; break; } //find the position,it will certainly be found (include the first time) as iMaxDistance is set by last time. if (oFuzzystruct[j].iMatchWordDistance == iMaxDistance ) { iMaxDistanceAt = j; } } if (!bAlreadyInList) { if (oFuzzystruct[iMaxDistanceAt].pMatchWord) g_free(oFuzzystruct[iMaxDistanceAt].pMatchWord); oFuzzystruct[iMaxDistanceAt].pMatchWord = g_strdup(sCheck); oFuzzystruct[iMaxDistanceAt].iMatchWordDistance = iDistance; // calc new iMaxDistance iMaxDistance = iDistance; for (int j = 0; j < reslist_size; j++) { if (oFuzzystruct[j].iMatchWordDistance > iMaxDistance) iMaxDistance = oFuzzystruct[j].iMatchWordDistance; } // calc new iMaxDistance } // add to list } // find one } // each word } // ok for search // } // each lib g_free(ucs4_str2); if (Found) // sort with distance std::sort(oFuzzystruct, oFuzzystruct + reslist_size); for (gint i = 0; i < reslist_size; ++i) reslist[i] = oFuzzystruct[i].pMatchWord; delete[] oFuzzystruct; return Found; } inline bool less_for_compare(const char *lh, const char *rh) { return stardict_strcmp(lh, rh) < 0; } gint Libs::LookupWithRule(const gchar *word, gchar **ppMatchWord) { glong aiIndex[MAX_MATCH_ITEM_PER_LIB + 1]; gint iMatchCount = 0; GPatternSpec *pspec = g_pattern_spec_new(word); for (std::vector::size_type iLib = 0; iLib LookupWithRule(pspec, aiIndex, MAX_MATCH_ITEM_PER_LIB + 1)) { if (progress_func) progress_func(); for (int i = 0; aiIndex[i] != -1; i++) { const gchar * sMatchWord = poGetWord(aiIndex[i], iLib); bool bAlreadyInList = false; for (int j = 0; j < iMatchCount; j++) { if (strcmp(ppMatchWord[j], sMatchWord) == 0) { //already in list bAlreadyInList = true; break; } } if (!bAlreadyInList) ppMatchWord[iMatchCount++] = g_strdup(sMatchWord); } } } g_pattern_spec_free(pspec); if (iMatchCount) // sort it. std::sort(ppMatchWord, ppMatchWord + iMatchCount, less_for_compare); return iMatchCount; } bool Libs::LookupData(const gchar *sWord, std::vector *reslist) { std::vector SearchWords; std::string SearchWord; const char *p = sWord; while (*p) { if (*p == '\\') { p++; switch (*p) { case ' ': SearchWord += ' '; break; case '\\': SearchWord += '\\'; break; case 't': SearchWord += '\t'; break; case 'n': SearchWord += '\n'; break; default: SearchWord += *p; } } else if (*p == ' ') { if (!SearchWord.empty()) { SearchWords.push_back(SearchWord); SearchWord.clear(); } } else { SearchWord += *p; } p++; } if (!SearchWord.empty()) { SearchWords.push_back(SearchWord); SearchWord.clear(); } if (SearchWords.empty()) return false; guint32 max_size = 0; gchar *origin_data = NULL; for (std::vector::size_type i = 0; i containSearchData()) continue; if (progress_func) progress_func(); const gulong iwords = narticles(i); const gchar *key; guint32 offset, size; for (gulong j = 0; j < iwords; ++j) { oLib[i] ->get_key_and_data(j, &key, &offset, &size); if (size > max_size) { origin_data = (gchar *)g_realloc(origin_data, size); max_size = size; } if (oLib[i]->SearchData(SearchWords, offset, size, origin_data)) reslist[i].push_back(g_strdup(key)); } } g_free(origin_data); std::vector::size_type i; for (i = 0; i #include #include #include #include #include "dictziplib.hpp" const int MAX_MATCH_ITEM_PER_LIB = 100; const int MAX_FUZZY_DISTANCE = 3; // at most MAX_FUZZY_DISTANCE-1 differences allowed when find similar words struct cacheItem { guint32 offset; gchar *data; //write code here to make it inline cacheItem() { data = NULL; } ~cacheItem() { g_free(data); } }; const int WORDDATA_CACHE_NUM = 10; const int INVALID_INDEX = -100; class DictBase { public: DictBase(); ~DictBase(); gchar * GetWordData(guint32 idxitem_offset, guint32 idxitem_size); bool containSearchData(); bool SearchData(std::vector &SearchWords, guint32 idxitem_offset, guint32 idxitem_size, gchar *origin_data); protected: std::string sametypesequence; FILE *dictfile; std::unique_ptr dictdzfile; private: cacheItem cache[WORDDATA_CACHE_NUM]; gint cache_cur; }; //this structure contain all information about dictionary struct DictInfo { std::string ifo_file_name; guint32 wordcount; std::string bookname; std::string author; std::string email; std::string website; std::string date; std::string description; guint32 index_file_size; std::string sametypesequence; bool load_from_ifo_file(const std::string& ifofilename, bool istreedict); }; class index_file { public: guint32 wordentry_offset; guint32 wordentry_size; virtual ~index_file() {} virtual bool load(const std::string& url, gulong wc, gulong fsize) = 0; virtual const gchar *get_key(glong idx) = 0; virtual void get_data(glong idx) = 0; virtual const gchar *get_key_and_data(glong idx) = 0; virtual bool lookup(const char *str, glong &idx) = 0; }; class Dict : public DictBase { private: std::string ifo_file_name; gulong wordcount; std::string bookname; std::unique_ptr idx_file; bool load_ifofile(const std::string& ifofilename, gulong &idxfilesize); public: Dict() {} bool load(const std::string& ifofilename); gulong narticles() { return wordcount; } const std::string& dict_name() { return bookname; } const std::string& ifofilename() { return ifo_file_name; } const gchar *get_key(glong index) { return idx_file->get_key(index); } gchar *get_data(glong index) { idx_file->get_data(index); return DictBase::GetWordData(idx_file->wordentry_offset, idx_file->wordentry_size); } void get_key_and_data(glong index, const gchar **key, guint32 *offset, guint32 *size) { *key = idx_file->get_key_and_data(index); *offset = idx_file->wordentry_offset; *size = idx_file->wordentry_size; } bool Lookup(const char *str, glong &idx) { return idx_file->lookup(str, idx); } bool LookupWithRule(GPatternSpec *pspec, glong *aIndex, int iBuffLen); }; typedef std::list strlist_t; class Libs { public: typedef void (*progress_func_t)(void); Libs(progress_func_t f = NULL); ~Libs(); void load_dict(const std::string& url); void load(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list); void reload(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list); glong narticles(int idict) { return oLib[idict]->narticles(); } const std::string& dict_name(int idict) { return oLib[idict]->dict_name(); } gint ndicts() { return oLib.size(); } const gchar * poGetWord(glong iIndex, int iLib) { return oLib[iLib]->get_key(iIndex); } gchar * poGetWordData(glong iIndex, int iLib) { if (iIndex == INVALID_INDEX) return NULL; return oLib[iLib]->get_data(iIndex); } const gchar *poGetCurrentWord(glong *iCurrent); const gchar *poGetNextWord(const gchar *word, glong *iCurrent); const gchar *poGetPreWord(glong *iCurrent); bool LookupWord(const gchar* sWord, glong& iWordIndex, int iLib) { return oLib[iLib]->Lookup(sWord, iWordIndex); } bool LookupSimilarWord(const gchar* sWord, glong & iWordIndex, int iLib); bool SimpleLookupWord(const gchar* sWord, glong & iWordIndex, int iLib); bool LookupWithFuzzy(const gchar *sWord, gchar *reslist[], gint reslist_size, gint iLib); gint LookupWithRule(const gchar *sWord, gchar *reslist[]); bool LookupData(const gchar *sWord, std::vector *reslist); private: std::vector oLib; // word Libs. int iMaxFuzzyDistance; progress_func_t progress_func; }; typedef enum { qtSIMPLE, qtREGEXP, qtFUZZY, qtDATA } query_t; extern query_t analyze_query(const char *s, std::string& res); #endif//!__SD_LIB_H__ qstardict-qstardict-1.3/plugins/stardict/mapfile.hpp000066400000000000000000000044611323166163100230020ustar00rootroot00000000000000#ifndef _MAPFILE_HPP_ #define _MAPFILE_HPP_ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_MMAP # include # include # include #endif #ifdef _WIN32 # include #endif #include class MapFile { public: MapFile(void) : data(NULL), #ifdef HAVE_MMAP mmap_fd( -1) #elif defined(_WIN32) hFile(0), hFileMap(0) #endif { } ~MapFile(); bool open(const char *file_name, unsigned long file_size); inline gchar *begin(void) { return data; } private: char *data; unsigned long size; #ifdef HAVE_MMAP int mmap_fd; #elif defined(_WIN32) HANDLE hFile; HANDLE hFileMap; #endif }; inline bool MapFile::open(const char *file_name, unsigned long file_size) { size = file_size; #ifdef HAVE_MMAP if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0) { //g_print("Open file %s failed!\n",fullfilename); return false; } data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0); if ((void *)data == (void *)( -1)) { //g_print("mmap file %s failed!\n",idxfilename); data = NULL; return false; } #elif defined( _WIN32) #ifdef UNICODE gunichar2 *fn = g_utf8_to_utf16(file_name, -1, NULL, NULL, NULL); #else // UNICODE gchar *fn = file_name; #endif // UNICODE hFile = CreateFile(fn, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); #ifdef UNICODE g_free(fn); #endif // UNICODE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, file_size, NULL); data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size); #else // defined( _WIN32) gsize read_len; if (!g_file_get_contents(file_name, &data, &read_len, NULL)) return false; if (read_len != file_size) return false; #endif return true; } inline MapFile::~MapFile() { if (!data) return ; #ifdef HAVE_MMAP munmap(data, size); close(mmap_fd); #else # ifdef _WIN32 UnmapViewOfFile(data); CloseHandle(hFileMap); CloseHandle(hFile); # else g_free(data); # endif #endif } #endif//!_MAPFILE_HPP_ qstardict-qstardict-1.3/plugins/stardict/pixmaps/000077500000000000000000000000001323166163100223305ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/stardict/pixmaps/arrow-down.png000066400000000000000000000231071323166163100251400ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× $ ^6[É IDATxÚí}yxUÕÙïïÝûL™s20…‚@ÈLH­U¿~¨·½÷Q¤Š2£Ô‡O[¾¶·×Ú^[µZÛ>¶×QT$sCÂ<†Ld&Ó÷ºœ çì³§3‚ÍʳŸœµ×žÖzß÷÷ë]{Ce¨ •¡2T†ÊP*Ce¨ •¡2T†ÊPùw)ôCíWJFÆ$"šÆÀ%cc@4 @"%rÄ"Ü»N$hÐ@„:õÕX¥Î©//*úöì Ò’žžçŸíË"޲ ÈÈìIàþîj¯{ìkC9q\9cØÇ;m» /1ÀU*Ó33yþƒ–!/GP7)W©K3FôÿtNî_ùù{ 1ÀÀKúHø{AXÂ2<ÈFþ¼‡¤êW¨ ªd`orvû;ùùùÍC Ä’œ–Îñx ÀÝ J´&‚»]λîyQ½ xboîÛ»wßø_¸”ŒìŸáQs|ÕãJǨXAÊ5ÕÝ¢”ýbÿ×_ÿkˆ|()™97Ø+Dlz °³91f3bÌ1ˆŽŽ‚Á`€Ñh„^§‡Á`Øl68XlVØl6´µµ¡¥¥-­­hiiAGg§6‚÷ìÛÚÆmûîëÝ{†@¡¤fgOýŠ€›}%¸^o@¨‘“8£GFbÂh„…‡)t”GĽµ³³ ÕÕÕ¸X]ªêjÔÕÖÂîp(\ºÎ°‡[ûÝž=‡†À­dggGZA/°€N«{bÂĉ‘4i®Ÿ0z½^A‡€Ô‡àpØqæÌY?y§Îœ†ÅbÑ`7ôý°Ñ˰ٶïÝ»×òoÏiYYsñï«Å˜ãy×O˜€ôÔTŒ¿î:p)wGA=a]ƒôçÏáàÁC8sæ Æ”Q ¯ŽãÑŠ=ŸþÝ¿%¤§§ëáY"¬ˆWsÏš2©©3¡Ö½@úòe¨HúÞíí8tè0WAWW·ÌñѯDë?ýôSë¿ ¤çä$1FïHSsÏBCC•™‰ôÔTèt:iwÍ7õ.)Õä3Áåïàt:P~èJËÊÐÝmQtA{Î)`:þίþùÏê<¤æä,à@»D)¹gF£iiÈHO‡A¬ÛÕ¤Ú‡våݤbG(3‰ÝnÇòƒ(?x6»M-.q ŒÝ½ûÓO¿ùÁ2@FNÞ2ö;"è•‚0'^çÞ€ð°pÕ§$ zZ;ì“VmâÕB ÏØÙÕ…}û÷ãÌ™3²Ç“k‡ƒ€õŸÿë_¯ÿЀÒsrŸ'Âf¥°jDDæÏ‹ëÆÓð”â ‹Q´›>¾2Á¥N&ç/\À¾ýûÑÑÑáNt1€€—>ûç?7ÿ à®»îâÏW×þ_F¸GÉ=š4i"nœ{ƒÜûë¾J´\P’Í|Do˜ïW ßççãÔéÓ húïO?ùäQìZfÊÊÍû=@ÈI=Ïó˜“;S§LÕäŽQPê«ÔËTMêE"Þ÷óĉ(,.†Óé”c€Ø[aÓƒ;wîttàÉ»áuö€\\=*27-\€Ø˜‚ ÂZa|lï0b5·óY_»<Á™¨`b‚²þ&^=âbcñÍwßár{»ˆ±{Ÿ’–w:l÷ ðFü9s_a‘K_RŽë݆ÅÅáÖ[nFDx„«kŒõô‘¹þsßÕÓ}æùǘ¨^íLjÚÁÜ7ÏKI¶3ÏvÆ\é5‚+£€w;PTT„‹5Õö˜ÐÆ3ÌÚµk×±AÇÓ¦ÝeˆŠkØ ¢©ùñ„Q£—;Ï{Ý”p×”%Z‹õîí{ÓJ ¬«\Ü\bAPX\Œºú:/ÕÕS/Õ³wîÜiTFà¤iÃ^'¢%"DÀ°añ˜“›ë‚}7¯ß¨LlI´÷ÃÌeÜyž±ñx¶‰¤R|®›Ùg¿z´³þv·‡ƒLt×5`äÈ‘hiié1 =g"Œ8N¬¢bÏ A€Ü æÀ¾ñŒ›¸~†…†bÁüa4%ÌËøTÜ”„ŠQR´D6(Áf·aß÷ߣ»»Ûc@zÚŒ±ùøá·WæÍ›grp\9&{Àó<æÝp¢¢" °ïW‚y5‚{Ò’TT¼Z»úŒ¥´‡âúÑÞ~……p:¯qcÀ9¯›ñÞ{ï´6!à@Àéž$b“¥ôtZêLDDD¸’$À<â*LVO3 «e‰—ÖëŒ1e½îÖΤô¶[¡?.!…nM½5±wµS¿zë­[à)<<Ó§MáǽúDÀ8s>`ÍUC€9 ¤¨€^ q‰‰£13e†tç5„U}5Ü|1äÔ`<Ø'Y›TÚ@U o÷>IåÑ£¨©­‘곃Xòûï¿ìª Gô:@z±Þ7™L˜š”ÆC‡i†yo©V“h&©·ÝäIŒb‰•"²XÊÅÇ÷´»_‰`‰-Jq ÁãzîBÄÀ@ä 7·4ÃjµŠÇAÇxî—~|Å`îâÅ7B¾’Z4‘‘ž¸ØE½®evMNªIVo«¡€·±)§©IA4¥»B²â¬íß™HÚ6iiiÁ¡Ã‡%P£Eï¿ûîî+êŽ?á="JìsS@àˆ0:!cLj$XÊ}ëó}<Ý1Ð?“tϘÄ wͽUÊ]ë;†Á³ñ.ÏãÅn`¿“ê~[©ãÕçs$¦?æBU›Í†Î®N× ‡™I“&¿YYYÉ®ˆ ˜¿hÑ- 4[,Õz½ãLJÐýâÙ3Í®11÷‹aÝ#{RÆ¡`ˆ‰aZ û1 {nLIo3wØg¢ã%°E† 7zëq%‚K)u&G@ƼôºšpõÛ휞Žét:ŒNH@ÕÅ*)Õú¨? à³ °ðæ›óðØš7MÈHOÏó¾éu… LPô¶Œ?Nòf½·^WÓã^FÊ‘(’`’X£(º1c> ›Íæe[ÇÒþü‡?P`·ªªû`Lâh”º%vÞIÌKbUüo7?™D°. û$%±Ê°N"\VµÀºêÄÇ»PAäôtŽ<‰$evÔÈQ8á¼C1Æ=`é€!ÀâÅ‹cž¿ Äýæz½©3g‚ç8u‰–2ueüoͳm¤UÂ!VUõǃ"å$?"ò (½CEe=ëÝîesòúqï¾ùfí€ €Àó÷wnÄðá "ÉÉ/Ü]ÒDz›ÉémT 7©g^ˆàuóWËYëÊ’ä©ÇUà ÒðļP´w8ãããQWW'fï´ßàåa"Z!ænžã&nKó$ “‚p±±&‚}rS!né]JaVë°Ë<Æ‚)ƒªˆà ‰$ë0¯#À˜È°bÌ1hhhèË¥ìm爖øÂšUÀ¢ÛnK"ÆŽŠ.q11ë–ǯ ÛŒáØÑ£¨ªªBxx8’SR©É½‡UÕ~x €È¾ò–p•€Œ¬ñæm ©Ïe@[[ŽUE{{;"""3«ÒŠÔ‚b„êšj´¶¶ŠeÆ óÖ[o] *Ñ­$¡Ç£££!8šõvÅ‘#¸pî@@s³ ß}û-’’’pÝøñ.5â™Z*o­3Ñ 2•AUbµ÷¸[±â˜‡ûµc8sú4*ŽTÀÙ#Ám—Û`(+ÃÌÔT‚yÉRTdÚÚÚÄÞ%Þj$pâäÉÏÑupKôÐëõ9rd’Do„IǾN?޳gÎ ÄdÂk¯¾Šð°0TVV¢áÒ%4·4#&6:žïØy¦óJ*aɈ r5“$°¼uàYº»»QTX„³=ËÄ–üä?±rå |³÷›Hgˆ÷ž½”¸N¯ÇåË—ûb nÅ!e%¥oÞuW”Npþš¼{vŠÙÝ¿~OÜyÑŸ?w'ŽÇqxåå—1gÎÌ™3S¦LAaQšššP]u¡¡¡w{³$ÌG¹°+I²ƒ²^÷ˆòŠÃÝBÃDjçz‡¾Åת©®Aþþý¸|¹f³ÏoߎŸýìgHLLÄ„ °gÏ—hlh€Á`@ŒÙ,î­g˜º‡3œ',=“D})øD‰ié¿---í L¹þúۉ觩I 6 z½AÑB&555¨è™Èxî¹çpÓM7õµ;?þñ­8{ö,Ξ;‡ÚÚZtww#&6ÇÉGüz}fC”4ä\×`šÜ5ç¦$$³šÉápà`y9ŽV…Ó) 77;Þx“'Oö‡„„|óÍ7¨¯«GXX"£#eêÞ=Ghïèè£Ip þÛÒ’’“Aa€IS¦¬ ¢Yî‹8ŽÃ°añ^“0⼸Kõ—pø`9cXûøã¸óÎ;½®Š›o¾±11(..Fss3jkk £ÑÔ—/×+U÷O‰ÄÓkúF”oè~>D9‰b4ñê'¼DÜÞÒÜŒüýûÑØÐSˆ O¬}?öBCC½ÕìõŠ‚‚ÔÕÕ!*2 ááá^“Q}“OŒçu¸|¹ÍCp®íTIqÉÞ 0Àä)S6Ñ87ˆAXHÂ#"¼“,ݬ­¥åeep –Ý¿ +W®T221mÚ4,˜?BmM ª/^˜³Ù¬I¿JϦ‰–ôxH¬²ºðZ)¤A¥¸zÇGù°ÙlHJJÂŽ;;{¶bŒ!996» Ê ®¶qñq “|28جV8Ѫ"XKŠJÞ Lú:™z¹Œ#Bdd$Œƒ¬ÎíèhGiI œN'î¼óN¬_·N5¸f³wÜ~» 6DSSššaމ‘| ”×Ô°ˆàŒ‰á^àRK¿Ä3w¢®TéêìDQaª/^áÞ{—â¹gŸCll¬&333#MMͨ¨¨DMu5†î•Të^œ‚[¯ÐG#Î\\TüJÀ pë’%ãy¢¢Ôd„„˜`2š$c® ÀáƒÑÙÙ‰… `ûsÏã8Ív6Ïó˜•ôŒ ¡±±ÕÕÕ0ˆˆŒðr½HÞ ðö¿ÅA'µ M®a©ªªBqq :»º0rÄüê—¿ÂÜq‡×$™ŠËÜÙ³qúô)œ>}ÝÝݘ ;Ye·Ùa³YE)äɘ•ñ~IaI“Ò½T©ÂÍ„ U< ¦µµ­mmA``sEŒ 趸^’tÇíwøD|÷’‘žŽ~ˆÅ‹ÃápàÈáÃ(/-ƒÍfc‚Äæ®Ç]u¡o xèðžsúž½gcâÍûî› ˜«Õ†’â¹?[{{;.·_­Åpш?=`˜2uê"šïný÷þ¶Z­°Û.x"‘Ú››ðÕ×_#%9£Gök ŒF#nZ¸cQXXˆ––ÔÔÔ <"¦P C̽îuäe$Š Eæ± Å­‘!Øoò466¢¨ ­-­ˆÇSO>…|P¶ÕJQQ6l܇É & &6ÖC{ ‚€Ëm—ÑÕÝíAÑJìü¢‚¢‚€`ê´iw(ËÝt_ýãp8Ñmé†A¯ï‘tWâGTTì6;Zš›±{÷n¤Îœ‰„„¿dÒ¤I¸å–[pôh%.VU¡¶¶‡Ñf³Wœ\)†/§·•cåLÂuIÿ±cÇPq¤‡©©iøíoë·Ô÷–ÒÒR<¶öqX-Œ»n¦LIòhwØh½Ü‡ÃÞCñê¡^¡¢¨ è‹À`úôeD4¢€;Ç1Æ`µZÁ¡'.àò‰cãbaµZÑÚҌϿøéé®È¡Ÿ%""·ßv; zÊÊJÑÒÜŒ†K 0ÇD÷¼÷—©u’–·Ú;ÚQR\ŒKõõÐétX½z5¶=µÍc^ßràÀ¬yäX¬Œ3ÉÉÉèk0tuu¢³³ÃÅȰïî QUa~áG1@ròCŒóŒ4¡÷›Ýá€ÕjÏqàx @l\, Z[[ðÅîÝÈÌÈÀˆ#ü "BZZrsóPRR‚K—.¡¦º<Ï#**J[0×+̪98Ï;‡òòrX-Œ;;ÞØÅ‹kòr”ÊÁC±æ‘5.£oL"Rf¤ôÞn·£½£v»½ï¹=sž4éa×¶‚ü‚?ÄÓ’§m" NŠàRc V› ‡Ç#Bll,, Zš›ñÅîÝÈÎÎÆðáìaÆá?ò´´¶âHÅ456¡µ­æ˜—Åíæñ1Ϥ=¹‰ý6€{v0-ît·,V ÊËàÂù `ŒáÎ%wâÕ_½ŠQ£F<Ãp¤¢?ü0º:;‘0:))É}¡Þ®®.X,Ý®Éeo)—ßx8 öì’Ÿ!¢ˆn®V6›N§žç‡îîn´´´àóÏ?GÎìÙРét:Ì;S¦LAAa+‚XSƒÐЄ……Ièq5ý/?±s©îJKJÑÑѳ/½ø"î½ç^×ÛK,GÅêÕ¢£££FBÊŒL€Åb…ÅjÀm÷¶¬ùû ~HD>IS“àt:\Ó»—2…Íšÿ}þK"€&Žë'¸ôÖ{,ÃuãÇ#<" ¸ÿe8uêTP”ˆð³Ÿþýà$%MFWWŠ‹‹qæô8A9 ä¾OpúÔi¡«« “'OÆï€ŸþŸlèõ–Ó§OcŪhnjF´9IS“&B ϪΜ<ǹ]~d;Áñ&'MF”9XzßR·÷è^&L˜€÷Þ}K—Þ"™3gPVRŠ®Î.Ïˆš š½ºººPR\‚3§Oƒ@¸ïÞ¥x÷w1~üø =ßÙ³g±|År455!&6)3RÀó¼äX)«H=§„5%üqêP·¬+s 2Tq<¤)IˆŽŽFcS–ÞΟ?´A6 X÷ÄxëÍßcĈhmkCqaêjk¥Öí`¨­­EQA!ÚZÛ0bļùæ›X»vmß·…‚QÎ_8ßGüØØØâs²VÛ8ò$¸¨Ý0€¨Ë_PÍSà8S¦MEtt4.5`é}÷áBÕ³deeáãvañ¢Ep8œ¨¬8ŠC‡\+kz!ßj³áðÁè<âʵ_´h>Úù²2³‚ú,UUUX¾|9ƒ3g¸I>i†uU!ëg¢Æ€À©3ï&¢1R°®F`-ÜËq„¸øx´_¾Œæ¦&ìÙ³ . 8¢&žOX¼h1PTTˆÖ–Ô××#<<ÝÝÝ8xà ._¾ŒððplÛ¶ ¬y$ 8¾T©©©ÁË@]]bb̘™6Óõ¢L ‚+Áºw$–Dù€n4ช}ßî{;@#»¨ÖµÁ•÷uxžÃÔéÓ…ÚÚZ,½©ë­™A.wÜqvíÚ…™©©°Z¬(/;€ò²°Z,˜9s&>úè#ÜqûA¿omm-X¾ uuu0›Í˜™–êA|1ì+ÁºZÝ“1XCà6ÑE_ˆìŽ\OˆÒƒà2Ü«Óé0-y:"##Q]]ƒûî¿uõõA'F¨üùí?aÍÃkÀóS[êE®\·CåÑÑÙ‰I“&áoýÁ-Cxp–ÖÖV¬\¹'NžDDD82²2\ÄâÊ•¿UÜWo}öéíæ€#âJ¤áÆ÷€çJŒÌL‰°°0œiÍæQ ³+x qv£Îú…&áÖÚÑþà^Ì•z3¦umF8æ`µXQZZ K·iiiøÝÿþL&ÓU!¾ÅbÁC=„²ò2„„„ {VBCB$ß`*¡§b(ö£ì» ¾ÞöäÓóƒ‡Çþæ·Ÿ/B Ù¬²›)Ä„ôŒ4˜L&”••ᡇ‚Åb¹*Ä_óÈ(/CˆÉ„ìYÙ Õ†Œj°®f ËŽSßuþ¥9(¦yz• »ˆˆù«Ç•:ÏùöDD Ezf:L!&””–àÑG½¢L`±XðøÚÇPZZSñÃÂBµëqß3{l+ïëðÄ43€Oé-­y¨YÁ†uµWªÉ}+ «³%Å%°Ú¬˜={6Þxí ÎÝK›Í†Ç×>Žüü|˜LFÌÊÉv% ªúç¾…y¥Þ)$ÿÍ7A*¶lÞ6=èÐC¨]¾&~ø™Íª)+&,< ™™0 Èß¿kŸXÛ—7?Ån·cݺu(ÈχÑh@vN6ÂÃÃ5yGZâœd¦oavFô{ŸæE|9XÇéÞ!‚ÍW=®ëjiOJY0aaÈÌÊ„Áhľ}û°~Ãúa»ÝŽM›6âûýû`00+'Úõ8ù¬ÇýÙºC Îw|é—O¯‹/((èÈÎÉžHÀ _ô¸?:Ï—,£Ñˆ¸ø8Ô××ãÌ™Ó8sö,,Xà÷ªd//ØéÄ–-›ñõÞ½0\ÄŒŒÔÔ'm1(&ÒjÊt¥ëýuýºm0è9ãõ`ÀºjÚ“Y0D„ȈHdfe@¯×cÏž=زe‹Ç©ý-‚ `ë“[±ç«¯ 7è0+'QQQÚfîa]K"­rÝ3)€Àþ¯ýóùƒEùEu³rfÍ#ŽÆ)<ÐlVß§G]Á¢Ø¸XÔÕÖáÔ©“¸Pu7Þ8ßïTnAðÔ¶§°{÷ÐëuÈÉ™…(s”f=˜0(gaKô©dÓÆ'Ÿò]žýI¨à¹jz<ÀlVÿÔ\/®ÌÌÊ„^§ÇgŸ}†gžyÆ/$Ï>÷ >ÿü3èõzÌÊÉF´9zÀõ¸ÒZ Jnó‡–~}2&1!ñd”9ê'D4|€²Y5Ô=ìîFhhHbbcP[[‡ãÇáR}=n¸a®f$`ŒaûóÛñÉ'Ÿ@§Ó!;'±11šô¸/È'û^°®Í™ß¿iýÖÍWŒ*++Yn^î)"Ü3 Ù¬dÁô´õ1AMŽ;†Æ¦FÌÉ›£þpÆðâ‹/àÿøt¼‹øqq1õ¸ï6OR.G†¥_~ùÕ¹+Æÿ}þ™Ù¹³3‰hRгYÈ‚q¯‡††"ÆlFm]ŽVV¢­­ ³^ÓÆÃ/ù v}¼ ¼ŽGvNâââ|Ðã¨÷§|½iãÖgü=90?‰Ç:"r;›Õ§éRƉ‹CVVxžÇ‡þ¯½öªlw^{ý5|¸óCð<ìY™ˆóYo¿˜yÎÈIDAT¤ÇýOð„Ç#a%_~c^ÞìaÔ÷!ßôx Y0¤u!LXx¢¢£QWS‡Ã‡£««³fåxôåõ×_Ã_Þÿ 8ÎEüáÇù°î1zÜÂ^Ú¸aëûWঅéß;ýψ(ÚW=îwŒaÖˆð0DE»ž:tv› YY®¥_¿ùÍoðî{ï¸$?;ÃGŒðÉ]`)—+Ç­Ýöÿ¹wï^G  ÊÓnܺñ¾À{'?Bú;BÚ“%ç¿ÕêrJµ5µ()9Æ,`9à­?¼Žã‘™ŽQ£FBíÓ¶WÈò³ó ¹6lù.Ð ­'›ŸÚü"Û„lVÍWš=S"`MMŠ‹Š=𙕄„Q’×÷¤>ѯ7¯ß²&×Ò롌¼ñv§õ&¤HŒDVŒÖicq=!a$Ú§$¡êB†ä”dŒ9r°I¹œÄæ[:mOñzÁ+›ŸÞœÄ T Ê‹ÀëRRîk}°\D®KÄøô7^” O>ýä|bìS†ÁFðÁ 늃-ܰaË7Á¼(ì§üvï·gçÍŸ[K Û}Ïf„aÖÁ¢÷u›6lý Ø×åâa¿Ùûíyóæšˆ£<5wMûtéÕ ³£/nÞ°õù²),HAÏ<÷‹·AìÞ!=È8ÒŽÍ·<:P×çêÂD`S“*—qDoùó©Af Ôÿæ ›È[ÐÀ÷ÑöžyÀ¨úìê>ü’Ð’°ÏÞ™0vÒýwß}·óšf€Þ²ý…§_hÓ¬kÓù›ÖmÙJò(¾öÀÅÏ>FD¯¹ †îVì xpó†­¼‚¥+[^xù…¹„‰0lˆà¥–lܸuÏ -]žnu{‚ÎA˜5Dw@™ÀÑÿÚ²n˱+}ã«&~;vì0vYÚ_ððÕ|Ž«\œ{Å¿mÕªUö«ñW}à_~ù…9ØïLþ·2ô€ó<èž`LéRø«=»wï¹—{Ã[¼Ž'"ä †gàâ`„ßYMö;·®}êäÕ~˜A½¯¼ò|Š“áU ~ˆ”'°Ïœ÷Ä–u[*Ï3 Âò_ÿõüÆáY0ÌþaGpë7oØüÙ |¶Á[^zåù[Áð €ôkTϰ7¬]Ž¿=ýôÓ eÎÁ_^zi{ã±’Ý d?® À‡Œã^ß¼nsé5€N×NyõÕ§clý=V˜:¸„%Œa—`ÀŸ·>¾µöZÓkÖÿ~á—/$‘“ÝJD?XÃ~'ö°ËÁ³¿?ùÄ“Uר}rÕïëþy#÷ßœD›Ô9¸éö›"3g¤Í7CrxžOá8.™QAòV§ ”:쎋ÕRröÔ‰’>ø{£˜Ldö‹Ï¹¦@L8w¢‘h?Üþ“è·Ô…:döõí¿õÖʼnc®7-*2òz^¯ãù8Žçãyâbˆ§X‚÷$cB§Ó)Ô:ìŽZ‡ÃYoµYk,]Ý5ÕÕO|úéEÈr–ª‹ÛÑo÷}âM¹wÐÀ]9Bs* À©ÔýÝä ¨¡Ôw¦P×BdHH¹/›àÃ~AãoAAăÀ)U Èý÷…i8ˆ¢•AdQBƘS’n5k!¢ ¡MÐØ®F|¥ó½$œüüïï¹þ^ß×kŠ÷»«"¨èlæãà ‰áëµcü¾>/£Ïƒñt·–ó|vR0ÊÄÒ«4¸Nj•T5D`2ödìAåzð÷?ɨ­’¥êýÿ@ì¨xj>=4vþèvtº?íJûüòȪ󑘜ŠW )|鯜A¨$¥±ì+g ÏpÅãb‚pî ¿Äü³úýí'óÁ+Ps µ2dˆ _ûCˆúbø"õä§ôË_‹¾½*A-åÿ¹ˆäÌ´ÆIEND®B`‚qstardict-qstardict-1.3/plugins/stardict/pixmaps/arrow-up.png000066400000000000000000000227371323166163100246250ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× #0×{¼ IDATxÚí}y|TÕÝ÷÷wïd–ì YL€Ö„l$ìAqikûôµö}û¶õí¦µõ±}DöZlm©VP´}µ­•úhEDdIHØ l a d²g¶{ÏóÇd™¹sï;K h~ùÜOæÌ¹Û9ßßùþ–sî\`@d@d@d@d@d@d@d@¾*B_ÖvedÑX.•¢d© ”Ê‹pm:à€D¸à:@×@ì¤N©3_|³Õç`±X4ø =ìDôGØlËvíÚeùÊ+@^aá4Fü›†jqæxžÃˆôtäçæbxZ8ŽÔ›£PwZצ Ýߊ"Ãù‹pôè1TWWCdLzÊ8ÃýtǶm%_IÈÏÏuúßá)€xoáYXXr³Ç#7w<"""´Óº‡ÈïC¾tÉ_»µ­ÇŽÇñUèèèTØß-a zÅ@ôÔÖ­[­_ÈŸ4icô7yÞ³ÐP 'L@~n.t:|¸æ›y—Õä3àÊW*Ãá#GÐÙiQ A»ŽÙÇtüƒŸmÙRó¥W€ÜI“fr wD©…gƒyy(Èχ^jÛ½jêÕ¿&/~„º’ØívTTEåÑ£°ÙmÞòu`lÎö­[wi `ÒÔ1°µDQKÂddŒÀÅÓîõ.IƒÖNû¤ÕšxÔÊ=¶wt ´¬ ÕÕÕŠû“ó Omûð×¾l @ù“¦ºiÓ&¡¯Òõi‚gêô—Ø•òêQ‘‘¸çî™ Q½(€VZ'ë{1·’Ëñ¬§^p&©˜PÖ»Cƈˆ4»KJÐÒÚ*QìŸ´;lz÷ð}þ´âå Ì%rÚKê²qÝÛà¸8Üÿõ¯!"<ÂÙ4ƺÚÈœŒ¹~ÕÕ|æþǘ¤õnûHêÁ\7÷SÉÖ3÷zÆÜ÷aŒ¹^ʳΥž06t(ênÜ@gg§[ÿ ÷óøÌÑ# ŸŸ>³ã¶1§Mû5@/*Mž¤¦¤àÎâbèt:¯#Z­k´ãª®…·zÙL•j=©öx/9{ËÊP[[+[ßÕy?Ùüßÿ½±ß+À¤iw3?%@'§#†ÇäIÁçP¿i^«]¦¾܃Öåë:„ /ºÙ@êM%ÛDQüúæ÷Þû¬ß*@ÑŒ)c‡ìºH¢ûóÐ!C0uêp>¼ðŒ|\mo€«³€g=pàÀ\¹Zùˆ Í<ÃÄwß}÷t¿S€±cgë£ânìÑ$¹ùñ;’“1uÊdp<ïqQ \SÑÊÞû±£GQ}îc˜PT„ÔÔT,µÐº7ÀUXÀ%$Eûĵë×PqÌœÎûq—.^Äýûa³Ù`³ÙpñâEDEF"2*ÊÍSï9/su(ÝÜÈÿÕ­žõֻܜÄd’‹8ÏIII0›Í]Ž¡»óL„d‘ãBNŸ8±£ß(À”™3§h ‘3µázÓá¡a˜>m*t:ŒgÎz¼9À]zÆ tiÏ1™z%oþò¥KØ[Z ‘1<üÃ"7'•••¸|ù²S "#{½u×›r½+Ö ºl½œRH£8æ®X®*EDHHŒÚk×àp8<#ФÑcÇî:uâÄÅ[®3fÌ02¢ˆ(Î]S :Ó¦LAhh¨òˆ–P p(®\ÏzFVMM JKJ Š"þï÷¾‡Ÿþô§ÈÍÍ…ÍfÃÑ£GqùÊÄÄÄtM7«ª­ž¹¥”wI5ô|Ãq< ŠÅÕÚZ8—¸±¢;óÆç¼qüøqë-U€!ÃG,áH¨ äå!..ÎæåF´tT{Ò<ó0Zw•«W¯¢d÷nˆ¢ˆï>ô{챞º‚‚t´·£êøq\ºt ±±±wÉE¸'dW` OÚ—œIR!΃õ=BCCQWW"€s`Ñ ,âÄñª­·L¦Íœ™MD%ï6úA’šŠŒôîWP}T3Y!µÍRp©»^[‹’’¢ˆ‡æÌÁã?î±aa!ÚÚÛQUU…Ë—.aРA÷™öáQï–òœ¹,ITáaá°Z­hkkƒ”a‰¸¼ìqã6UUUÕßHKOÿ¥KoÌd2¡ /Ç©Øqßh\ `·,œ@]]Jöì ˜5kžøÏÿô˜…sU‚æ–œ8q¢K âæ•öÝ|YÀ!¸tIf³›ùb¢cp½î:ApgY€Ç¥U;þ÷›®Å÷Ýw'€¥RÚ'rsrÞÕqò{¦]™4e*õÆ%€»ž”)œ»®®%»wC|ûÛ߯Ü'ŸT]©ê‰EEh¨¯Ç©S§péò%ÄÇÇ#44Lp摇–QÀ=óÏ2=G ë2R@fVöø²ªcǪoª žþ7"JíñøAàˆrÇ’:D³]wË—{ô…tYåéU×k4ܸ’’=p|ó›ß‚ùóUÁwU‚É“'ãz]NŸ>Ë—º”Àd’ÐåÚ vÜp/¢¤F£6› íínQ@ 9£2G¾vòäIvSà®{ïý:-à\b}"BHH²²²Àñœ‹ÍW±ë2€wo¤!ïémI‡744 ´¤»ßøÆ7°háÂ.s¤1;F„)S¦àÚµk8óùç¸rù2âÇÃd •|¯+Úq/3&3Áå>tz®Žë×ëzBE"Lj(A§ç+ŽU;}S`xFÆ?J–ÒѰ¡C£:»&kÛfÓWaÆF3J÷ìÝnǽ÷܃§óŸÀwU‚©S§âÒ•Ëøâ‹/påòe$ N€Ñh’åxEeì:óª$’cº®Àqˆ-­- "‰Ç*ýµÏàî¯}m*€%=ôÓuF£#Gf‚ˆT§KÕ„T”—fÙœû6›Í(-)ÍnÃÝ3ïÆïžyÆ/ð]• xz1.^¼ˆ³gÏâòåËHHH€Ñhðm”kœyÎÀº!¸°@x Š¢Ô–“?þƒ£G¯õ©¤ef>K@¶TÓ† CxX˜ç<¸ÔN+I‚„É„M²V—’477;Á·ÙpçwbÙïž<ÑID(..Fõùó8wîj®\ABB" Fƒß€3)à®)qò ¥<Ï£¹¥¹w5u œéXEåû}¦÷Ýw_,8n…¸Ú~½^áÇ»Œ~y€Ý“÷Ò¬˜—^fÿî][ZZ°·¤V«ÅÓ§ãÙeËœÏI8ŽCñôé8w«Qså aдÙqæ ¨[?‘;HÉAªôF£ `ŒI#‚ÑY 7;|¸­O`øÈ‘?ð-‰íÁÉɈŒŒT\†Â¥4Î$ŽS`…îƒ@kk+ö–”Àj³aÊäÉøÃóÏË?#hΜç1cÆ œ>sç/œÇ•+5HLL„Þ`P«LF‘™§)çÉH—îAäüßÞÞ.5<‰BÝъʽ}¢#237Ñ`·|?Ï#-- ‘ì²'÷¬¿§Ý–M³ÊÑ>$Kô˜ü²½{aµZ1iâD¬X±¢ç‘゙çq×]wáÔÉS¸xá®ÖÔ 1)z}ˆ'mKgʱgÌ#Ä,ºß}±‚а0E@›kÜ/ö~™³!nÇJ©§ƒºög í(/+CgG'rss°ò¥—n*ø®Jðç?ÿ99ãÑÙÙ‰Ò’R´··»·1€ME÷¹Q²È`2…"$$¤'Û =Tp÷ìÙQ:Qx…n³~11ѽÏïI¹^£7/Í£+ X,ì+/CGGÆgÇË«^v¦ho‘èt:Ìœ9‡Á•š+¸V{ IÉIÎÅ/’Ù@ù¹ É,£Ôz¸Ìî~,V«”R òò×>|¸#( `°Zï%t‡~½S¾‘]ÏéK§KE¹™:æÙÀ%âz®ÎÎNì++GG{Æ‹—W­BXh(nµ„††båK/aì˜1hïhGYi),–Nx¬r’ Ž\Ž0b׿™Ip_ƒÐ{hxx¨&]JÀƒç‹‚g8n²ô¡Žã`0dí¼­ ^|WÓÑmÿ:;-Ø_^Žö¶6Œ= k֬陫ïŽW^~£GŽB[[JKJÑÙÙéiç]6w»ßÕV߉ Lp7•NÛïr.Q„^oèžpÀs( šQŽ„bj21ô:%’d vK®ìtüzAwm´ÍjÁýûÐÞÞ†‘#3ñêêþ¾›¼ò 222ÑÖÚ†²Ò½]JàÚ^QÑG}*»œ &£Ñ}†Ð95?1ø €^ 3…†J—6L¹,Üt¸œÏjµààþhkmCƈ ¬}u-¢¢¢Ð_%22kV¯FFÆ´¶¶b_Y9,–N €{ë;õÍ`4z˜ޏhXöïUîŸ5k8G- 7ÔV½ˆ vÜsvÏ 8Iœ%Àf·ãð¡ChimEzz:Ö­[‡èèhôw‰ŽŽÆšÕk0|øp´´´`_ù~جV™”®GÎ\2·,ö.˜uM!É$]l¿ëâœØŸ?ñóÌ€€'Êé^éãJ1MMMhjnöÁêf@ì垣Áu³Ùl8|ð ZZZ6l^[·111¸]$&&k_]‹¡Ã†¡¹¹ååû`³Ù<úÃíkaÕÖÖV´´¶HžÅpbă°pÀ©÷ßý¹¥¥ ÁÝys£yL%©!õ!ì6Ž<„–æf IMÅú×^àAƒú¨ªª*TUUõɹccc±vÍ«’šŠæ¦&ì//‡Ífsé'¡k“8†f‘õôŸkY4™›œ‹E!Iõ&êRW¢©èš²X,¸Q£WÙHnVê +%=ìv;*Ass3RRR±aýÄÇÇQ±~ýzüðá‡ñÇÆú ëÝ~Ÿ Xµ¯®EJJ ššš°ÿ>ØívÏY”±íŠÏM0Ømv4šÍ°Ú¬ ;KÖh¦î%z<î%Ñ8Qœ¿©ÛÚÚ8dìzu“™árTVT¢©¹IÉÉØ°~=‚ÊÕ«Wñ£ÿ«×¬ «×¬Á~òc\½z5è×KHHÀºµë”œŒ&s8Á!Èæ@dý· %†öŽ64·49V†ö]CAޏ (ÇÅ{PŒçC €ŽÎN4šaµZ=ì:“µoΑïp8PYQ¦&3’’ñÆÆHJJ :lÞŒçÌFEe Fò'ä£`B>Œ*+*0{ÎlÞ¼9è×MLLÄkk×!!! 8¸ÿ‡{¿€u»}=¢Ë'›Í†¦æfX,–žL¡»ivÇĹyU¯©à±YcÇÉPŒÜƃÕfƒÃáÇqàˆ\æø™{: ‡€ãGÂl6#!!ol|)))A ¥¥K~³6¬‡ÝfCBBrór£É„äädttvÀl6ã³;Q}¾‹Š‚:»ââb|¶ó3ܸqMf$&&võ$K¦z£Á! ££ÃNJ@÷Š Ǿ²}«bÅ÷h”TÃTÊv»­­-hko‡CœNŒDãA@Õ±ãhl4cpü`¼¾a£âcÚþʃñàìÙØ¶íð<1cÇ"+;»'_σN§CöølŒ7:žÇ'Û¶aöC³qðàÁ ÞKJJ Ö­]‡¸ø8Ô74àðáÃD¡k¬»ûFÁŽŽN´µ·Á!8´.õ@¡3À¸ì¬EDd$M à錈¢3¬c¢â8ç\LʘˆÇ«ÐØØ€AƒâðÆë¯c˜ô÷›Í†•+WbÙ³ËÐÚÚŠ¨èhäæç"Æeí‚tMBDd’’ÐÚÜ‚úúzlùh :::ŸŸ”õ……iS§áÓO·£¡¡ÍÍ-HJLì±á‚ Àj³Âjµz,ù’t’gÜêI(/+>@È^ ¬r(\׫÷”»½|Á!@Eœ>u ˆ‰Á_GzzzÐÀ?wîûÅ/ðéŽO¤ Ž1cF+.c’¾¤ä$qhl4ãhe%öìÙƒüüü å"¢££1eÊlß¾ hinAl\,l6{ðRÀ•™Êf-ß«®ÞM€F“NHx„$]û ¢€“UU¸~í"#"±aÃŒ1"(ËÃ?Þþæ|÷!œ>} &“yyš6¬'ú_£àN¿ mx ` 5áÌ™3øîÿþ.ÞþçÛ²KÛý‘ôôt¬]»‘‘¸Z{••rK½U™·2§áI(¯ •“½€ Ï® ËÐG#àìganh@tTþò—70j䨠th}}=æÎ‹·þö‡€¤ä$degÁh2Ê u÷5¤° Á`0 ùŽdجV˜Íf”””¢êDŠ ‹„©èAƒaÒ¤IØþÉv466¢££ ƒUúQ½Ì¹O kYiY` À:•h]]=ÙãÜgÑØÐ€ˆÈH¼ñú=jtPÀß¹s'øÎ()-.$c³ÇaäèQ.vÛ}M1©,:‘–yžÇè±c“”––bÖì±k×® Üû¨‘£°ní:„‡‡£îzNTT ~ùÍõñÙþ ÌfX, "N–Ö•MƒG¢îòÞ’½¯êÔ*Ѻ·P°{«>w7nÜ@XXÖ¯{ ÙÙÙAÉãÏzðAüów@Dž>YÙÙÑ…¨§Y}*»ûz½9¹9‘™ŽãðοÞÁì‡f£êDàó ãÆÃêÕ«†Ú«µ8uò”,­{fbÝËn,Àq×f€ñ¹¹÷aœªÆ©lÕgÏ¡îzLFÖ¯_ü¼¼€:JlذóÌGcc#ÂÂÃ5> qqƒ|ÛP^¸¨¾gttââãÐÜÔŒºº:|ðïÀóþ8Þ{ÿ=0Æ’zÆŒã|NO%/®^†g½†4k·ƒ(Š"Ìf3öØ °¨°çFþHRRrrrñÉöí07ša·Û1xð`ï}/3#â>+ÝSº5  ‚]ñ%ØýÂÕš«¨­½“ɈWW¯Aaaa@àoÞ²ßùÎwpäÈa dådcDÆð<ï¥3HmºTpY7žç‘92yùy0 ¨¨8‚Ù³gãÃ{QhAAV¾´&“—/]Fõ¹jïm’™©å€ë›€Üܼ;ˆ£9ê^¨§yøüÌ«V®Â´iÓüîŒÖÖV,Y²¯®}6› qññÈÊÎBxx¸Jgx‹£É/À•¢ŸÐÐP$ß‘ŒÎÎN˜Ífìøl.\¸€‰EýžOHIIAFF>þx::Ú‘6<Íã§x”Ø­§-<¿zÏ®=§[Ty\F;F#@„÷޿祾ÊÁCñÀwÀG[?¯ÓaÔèQ—5z½jkdi]fº4À4«[Ùé ŽÇ¸¬qÐétضícÌž3‡ò{ÍÂæÍ›""#U•˜S`2•3@EEEc^~ÞãD0É{òu7pöìY444 ¸¸X³ƒd·Û±rÕJ<ó»gœyü¨(dçŽGLlŒ²÷FërÓ¥¥YeóÈÈ$&% ¥¹õõ زe ,V òó´Ï'0ÆðÜóÏá£>Dˆ.9yãa4zÚÄ©˜.—­é™¥Ë¬WP0“ér¿¬ÔzƒQÑQ¸QwUU'`·Û0iâ$¯×ª®®ÆÏ{ Ÿlÿ!-mF }ˆ^ÝŽ™Öµ¤Y•Â3½^””³ÙŒÊÊ ”–îE^^ž¦ù„W^yÿÇßÁó<Š&"::JÝñ–.Ø%€8Ú·{çž¿E ò3@Tìö¥a4†ú 8rä0ÂÑ““£¨õÿ|çüú¿~k×jj2!{|6“UG'<À4«×plРAˆ‹CcC#jkkñïþ¨¨(Œ=F‘ ßzë-¼ºöUð¼ü\ÄÅÇ©G4P0ÇàÞßµs÷¶à(@aA@ÿGUã<|g9,4F“õõ (+/Cjj*FfŽt;CCæ>5o¾ù&‡3?> ¦ÐP¯ç°ã¦Y5m&“ )©)°Ùœó ¥¥%8uò$ ‹ jrŸOøè£ðÜsË"ŒÏÍvÎJÊš6 ÷ÂáÅ]Ÿí>ÈÏË7GO'G›œ—x;"<!!z444bçÎ5jÒÒÒ»wïÆ#>‚Ó§O#$$cÆÅ°aC¿ˆåÅŽkMI{ßǯ4«æ“çy$$& 2" õ8á>úðC¤¥¥aèСÎ~س‹-c cÇÅСCÔÓì* Äg7è,~úé^¯?$­9mõècîb@±Ë‹ zΠµ|¾ú<.^¸Ðóhõ®]»ðΦMcˆ‰Áè1£O¹H¦£¡ZvoŠ·rïwäñ :o¯€ïùNµ Ƚ*‡\æ/Ž=ŽúúzfÍzÓ§OǼyó`±X‘1#GgªßOO¿z¶©{~ìé%KïÒ‚«fxä—Í\üâñ_ìg@¡2Íkk¼6Z'¿h^ph^žöÕi]›øv}eÓ¥ÞœX´ðéqZ1õi"›ˆÞ…›pmvÛW;~Óhä_m«Fã>Òº¦2Öû‚©O  ãto:˜ã÷ Ò«5^Þn÷3Z÷¸Ÿ£üf.)wCoú4¨}ÍQ?þ«Çÿ àÁ¡uÒDû~®J³Á±ãZW£uo€úbþºúû­ó¿Ï ËÃx‰ý Øá)¾2Õ_»MA±ãª´î­?ã}Ô{0­ÈÖù §_ËWžøõ;‰£j€û2êå~Cñ–„gro½õ´®»È¡óû¼âƯՌÏ­bŒÍèwvü&Ñz_.CëZ™ùi°ôK®\¼òAʰ”ãdi¥7M€ûD³ž=NAÜ—ð,»-w¿ÖÊÌ]ì×ëãüz›Â¦M›ޏ'=d¨Ìžù´šU±¬aŒ×õ€^fòdî‘“1ã[N`IDAT!„Â0¾•¥OTù#$b ü”€^ýä¼'·áþ[šf½=³ÀF¸ºì\0oñ]þØ <æ£ûºÏÓ_Ò¬þîŸ'®1<ë+±ó„_r.ƒ_xî…Ó¬õwºTÖ9—ei3!òkÔi]ËsÊ´Þ—ÂþøÔS‹rހ߫j´.î´™¾ `Ø—=Ízi]‹œ±vÚ—z’ ÜùüÅó§ðþKœf½Õ€» ~TiJ«ÞfiÖ~"”[ÚmOñ|Á“…KŽâEÚ J[¸6@ë>ÂUGŒÏŸ?þ•~©°dé’»ˆ±­ô_š4kÿº{Þ¼E»ƒyR>Øw¹gמó3î*®%Ðø¾šUÝŽûžy†k7+<ë»Ì]0oñÛÁ>/ß7»{מŠ3ŠÄÑÔÛ=ÍÚ/À'<·pÞâgûȧè³$=óûßþÄ~0`ÇéGZµpþ¢'úêü\_˜l̨“?âˆ6øûÈöížõúÌ[ø«¾¼õ}-[þÌJû3=úUåò´ÏÞLšùÿæÌ™#ÜÖ Ð-Ë–/} ´®Íæ/˜»h1±¾¾ÖMíÝeË÷+"ZA䚀ÜEì xtá¼Å¯ßÄÄÒÍ•å\^ Q|‡ƒw“fb˜5þâ75µt+ZºìÅewèô/@Û»í¾rDäè{‹æ.:}³/|ˆߪU« –Ö~y+ïã‹°1QñO?òÈ#ö[q·¼ãÿøÇåÓD°õF~¥=à"ú~0¦tþVwÄöí;.M2}¯ã‰“úÃ=õ±8a­Õhpñýæ‹[}3ýŠzW¬x6[`xÀÌ/#òö±ÀqO.š»èdÿ¹§~(øÃ³3‡ßaò—xT‰àžZ8oáÇýðÞú¯<¿âÙûÁð €üÛÔΗl¥µÃñÞÒ¥KÅ~ªœý_ž~ÙTÆãgÄèA¦~~»6ï0Ž{iáÜ…‡ovº}äÅ—ÆÚ!ßð3cú×`Ç!Æð®¨Çÿ_üëŵ·‘yº=eùŸ–"ÝODߨTú›Ã3 ”€w<{É“K.ߦþÉ-¿.¹”]?s2urÇàžÿ¸'rÂø¼»ŒÓ$žç³9ŽË"BTy“ ЇvÇ!‹ÕrèüÙϽýöûõ` e@Tø^zÌm¥Rà\A#É÷pùO’ÏrTÊPø®çûûï¿/uHÚ°±Q‘‘#t!!ñ:žãx>ž'.–x$ƒÆÄvAkvG­Ã!\·Ú¬W-Wkj®|¾uëöó‹ÅÈJË•¥u¢ä³ëwÒMT¸vÐÀu4r @s^€óRöwSR¨°†ZÛÕÞ£dÈŒr_6чïEŸEo "íNT-J ôߥá42ŠVQd gNmt{X ˆ¢†:Qc½7ðÕŽ÷áäçõ÷ü¾žSú½«)‚›Í|ì|Q#¾þ÷¶ßççìy0þCƒíÖrœ/ÔN*N™tôªu®  Ö‘ꘂAôr>øûŸ֑̂¥•êý¡ÿ@üx‰ ¼ÅôÐèØùcÛý±éþÔ«}çW@>ë <ÎG09/Q¦ð¥½J¡Ú(…‚gÜaËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× # fpý˜‡IDATxÚí]{”Å™ÿ}Õ÷Þy?ä5ÃâƒÇâ#A†Q4Y%pâñ‘=Q1Ùl6Fy¸qb¢AÝÝ$&Ù³wÏr4nrö¨˜5FTÆD bâQ“…  Œ30Ìûv}ûÇ}uWW¿îí;3àýæô¹S·úVwÕ÷}¿ïQÕÕ@‰JT¢•¨D%*Q‰JT¢•¨D%ú¸¨ý:kΜiDt:C´ódMРA\cí:pÀa"ð@‡@üfÌŒïúõ¯_Ø[€QJ­­­M&Œ6<—µ0 ;ƒsÝ ^¶}ׯ.b3væà3/¿üòÑ’ŒqöÙ-†¤¿aÂ2"Ì`¸1Ô¢å>e½È6Réò ;˜è©˜)ž|é¥ío• øš>aƵ ,„96¶Q¾ O³ÔŸáeDo2øa14ôÈK/½ôQI"¤3g·µ 7X Q¨Fb¸¥9gÙ~¥ÜÐO â‡wlß¾£$ù“8kNÛåDø€aí¸×9~ öÐò@e‹@¼Êà;v>÷Ü“%AgÝ~ 7ñ…ÀzMM5êÑØÐ€Æ†FÔ××!‘H ¬¬ ñX‰D0883™DÿàqäÈtvv¡³« 8ÖÓŒáéïT’@;Áâ/>÷̳%ð Ymm3%Ó}\–áñx“&NÀä–f477£eR3ªª«<:Jž#b­íééŰÿÀ¼wà<ˆ¡dÒ‹áú2ãY&¾ùÅgŸÝ] µµµÕ€î&`%€XÐ𬲢S§NÅŒiÓpÚ©§"b¨çßà’É!ìÙ³oÿáøãžÿC¿!ûÏmÂàà†íÛ·÷ì`öܹ ˜ŒGüUgÎ0N;õT´Îš…SN>Bww0ÔëÁ$󭔌½ûþ„×_ß={ö@2{£@¶Œ·Ñ Ïþüç/~, µµ5.c‰;‰° Ã/<«ªªÂ¬³>Y³>šššà°îý9f¨HíîcÝØ½û ¼ñûß¡··Ïå|[ ú§2¢UÛ¶møØ@k{û fúO³ý³ÊÊ Ì=ûl´Îš…X,¦×™w­VSh†»_Á4“ص{7^}í5ôõõ{† éßüŠcÆç~ùÄNx˜ÕÞ¾X€Pçž•••aÎìÙ˜ÓÚŠ„jÛý´:D½÷×äãGx ÉÐÐ~»ëuìzýu  úå%þ æÏlÛöü +sÚç‘Áß#BÜ+ 3uêi8áy¨®ªö½K `§ƒÃ>µ&Žò¸ÇžÞ^ìØ¹{öìq=ŸR_$ Xõó'ŸÜr¢ µ¶Ÿ{Öz¥UkjjpÁÂ…8yÊ”w©&]ìµú;^x½½=ÝxeUÎ[¸ãÇÌpt€}ヒ;wâØ±cV¦«Bîyú‰'ÖcŒb_`ùòåFu}ã¿‘ ¯ˆ„ô§¥<}Ú4|æÒ¥ÓØf3ÒŸé¹ÿS•”zpîøå/~îcÝßrh‡Æô3R—²÷b»¾íHÝ;,÷Ą̈«­ÅŒiÓÐÓÛ‹ÎÎNÛËÿ š?uúô1|ç§‹ÍŸX±5ßû¿¢kÜrï†a`Á¹ç`æ_ÏL9P’ÓáÛ[âœÆ³¶ÞîGtuužzê©‚:ðé¥KÑÕÕiJ‡Ö³«Ö§jÔ[ŒX ç-X€ñãÆáåßü¦i:2‹éòW?ýÙË*ªå_zì±ÇÌãRÚæŸ·…Á×¹åÕëjkqÑ…‹1¦±RJŸx\ã÷“ûU'8Õ’d©0T…yÖȬâ…pî„©§†¦1cðü‹/âhw·bÊ2½ ë{’ƒ e—¬$ŠÆü 7‚ð)XKõË y'55á3—.EC}X2XJ0§ÉRJHÉéºô‘©³œc¯çl]ÔÄ’!%CræÈ\?wH)³õÌ쬳ÔKfÔ××cÉE¡©©)•R¶›”i]{éåŸÝX,>Eæ-Xðu¯U;“9ZZZð©K.A"QfÇa”¦G½t­Ïú…2>}Hi¦è0=údm'‘H`ñùçcÒĉ–1ìþ’XsÙW\w\@û‚ó‚Ä&R˜ž9¦žz*.X´†ZöÒêàõ2˸HL€EkYÕzk«ÖKK=g/S/aþ¹çâä)Sl2ìNâ¿\vùåŒjh[´¨B>JD1JÏ’Y=Ü)“'cÞ¼6€‘ê¼)jç+ÃÙy§™ôgM@˜WÏaßz0£µµ-ÍÍY°GH†øïeË–Í•púéËãQ"q’Ðh~ó¤IhŸ×f×X;žc°©hE¹& #:¦û1œmõÒ·̘ÓÚŠ ã'ØMAê¤ÿ±|ùòĨ€ú±‡ï#¢v§ÍN:i,ÎiŸY.§Ñ¦V£]´^ÑxÓÍ1‹Ú8nÉNÔò}É2—7H×g"¡9­­ÛÔäôRåÖ¤ßUpîâÅ ˆÄWr°Ÿ»éêÊ*´·µˆœvZJ°™Ñ;Ã3³ªõÖ„K:jPÍG1qša9†³½Öz‹P˜:†sŽáªP1K"´ÎžÊÊJ—È«®X±â¼Q!‹-*'æPŠl7‹ÅÐ>oâñx;žóŽÝÎZ†ëê£Ø.¼. ·×Ë\¶ÐƒáY°´‹ÅÑ:{6b±˜&{ ƒýûUW]U;≠)b·ñtu6fÏú$jjjÒɶD«9}K%³&çOAÏGQAœÍ-Pªm¶dü”$Û2“¬ÉQªž2§å Ö4Vuu5Î8ýtì~ã ÇÜS’lÞà«#† /> „ÕºÜþä–L?Aãís w¯×Çãj>>j û쨷h¹ÕW±˜k"ÌŠŒ,ãN‡I'iCjøÒ•W^9cÄ@m(ž“–——c挭qj½÷" §V«3gV&çæH›v* ´i¸¬ÀÊ<%kç+ìk{Öd7ƒA”JÔùÔqˆ±!¾ àÒaG€…K–œ¢óí™âÁ™gœÃ0<ì4Û(’õ™3ÛùºÐÏÒ–ÚvdQ2sІ+vÜ¡á.Z®¦»­‡d†0fLŸ}r K¯¼úꋆßHޠƪ"ï7648`Ü&™Ò3«&uL× þüH3AìÆ@%å wBÖ÷-#õuõ˜0~|z¼sQ@ û–/_n › ¸àâ‹?Å sTÇc8å”S²“1êì)Ó¥¬Lç‘ ë¶Õ“vX'·©ÃL9bê“f[aŸíͺEÇ,6ÛgÙnî8;J„É“'ãÿüRšª3|fYUÙe~6,@BÜ™ºQ;ƒ'·´ ‹¥ì%(3…ï:]ªÚv/;®õ´SÁ9»Ìˆv¹SÖçp1êìÆ@f‡]w®"MäaùMºc±X Í“&á½ýïé|§¯å#¡MÀ…—\2Àœ,ü¤¡¨¼¼'Nô.õ‚<5ͪõ´-p«¦UmñwÄ™ÀP°®Øué{~æþ3çç~ðûãÇCYY™Æ‹®½îÚYEGâÆTç$prKs ¶û«.Š`‡Æ²‚:½à\™5XªÆßEXéh]cà ëÄžžB%HwŽlƒDZœ›8a"ö½»Ï¢Ìâ&_(,Y²¤QËÔyëD"1cÆxjt.õkúO—jµÉy¾©^K™]‹2¨F$6 —š…*êùŠæÛÆ Ös„”ö1`)ÑÐЀx<î@AøüÕ+WN(Hø@…“7D”[°é4ôŠ¢(Ѳj·U;ï‚ dÑzV!ê a5¹Ä:ÿÃq)?`èÖ:ZRPŽ«‡±cÇâСCª•0Ì¡kl*ŠÑ ªãf¦¦¦ì œ’§UÒ!dc¸ÎÃc7Ø'‹ a‹Cå–fxA€” ¬“ÛEHËp¶ ®—è°ã 0+Ž%ÐØÐˆÃ‡gCÞL½ ZF›€‹/»l®Îõ764 ‹Ù/l_ÍšDPz!w&ÌÎ-¥f¤ò{%-œ]n½ª¥ì’ì(q€¥Õ (ËÓ–°-·ý)÷Ãlïs ö•q€÷aêêê, n™1<ûúë¯oŽˆh)Á¹=J}}=¤i*«Y݃”íeÒ¤YUE!»º;ž ¢ˆgƒ²y)}÷+°z±jÎÃåI ‹€‘g½q2—­«­Á‘#G”TXàhXJdgX,GeUU †´ Ö{ó*ƒYÇ`—Ù3µ)7[\<€³ÑkÃŽh¶À>9S•ˆÇã0³›UdÍèåA ¸pùò:A˜¯®N©««Õ@t8o^Í£;ÚQÊ^iW°5!dœTÅ;·º5 ¶œ¾vnCY\Âö§Ÿ¬Ëä­æÏ=ÔT×8V`Ñü•+W6E&e(®NùÖ¦ŸÓWí¸tt„õv[ZÅê&zr¶W¦ †Ý.³#Úˆj:Øyo–å"!3£éuXÏ¥t;©Cñ!lcœž)MÕÕ•p>r†Ñ âÕn "”••i'^È ÖƒØqr†C¤ØRö´•T ¥}l§µv^ñU˜5f’t©o÷¤W"Q–Ú%…íÑæx2 ¢Oªv½²¢"-‘Òåq-ò7VÅižÁ °ˆ}ÉÒËÅÍz÷Vž³¾Ùõ¹·€C¥ô.ÅíŠòrô÷÷+9Ì‹ ²`ñÖ+*+-‹$tÌqïk¼¸LM¾ ·ÅÌÑg‚³&ÌæÒª Ö"!`xaŽdYy9lð!@s4Ù÷ð°tÙ²SPïL¸¸XÚth|¬»ûöîÅàÀ@ê©XðA£µ,AKÙ¶6b1Ë@ 𕘽íX,¹ 8ðÞ~7åpM z'|<`ßBå•hÛA”2!šdbÆö+ jüò×¾<í»|÷í‚À ú$,sÒ™+wuu¨­­ufüxoß¾´T¦´2ª¤)94ä¡äátx8v¹øÓž½ÞåýÓ‰Í1mú4-R;Ö“Ú!»_¡åÑ{g(L0ÓÖ¸åGÁÐÐêëë-Ûµ¥>ûúR»d=¿};˜9»+˜¦‰ÞÞÞœ0$“i–¢ÔŽêëëCÒ"@=½=iç3u­îîÜF,%zzz"cüç¯ü€ ÇÊ6gVÈêïïÇᣡ¾>½Q#ƒØ¾"‡ˆ²[»e¨¾¾Ç­¼aåˆ^ÿ¿¶nEÒ4m“QÉ¡$Ž; iš9§Ó±c)àæ‚DãÉ3KHÓDgg'*+*PUU £DQF!”&êííAvõ”ÛÎåé;€c)»û¥‡ó ·¯ƒƒ¨®ªBI¢‚ÁÁAôöõ¦æ]ÛeÅ‹'…âñž ¥,¥ÄÑîî< Qâ]á§dË8zÖ©v?žL(X46‹ú… wãf‰ƒ’u¾ßüí®)•… Y÷ñ r¾Ûs—(ÊÎ z¹³\…—8[¹$ÅO†;×(D)^$¿ýÛJ”ãµà¦tö2E"°>áaß›)ñ/2°#±‹æ¡2ÔÇ”ÚÙÛoÛsÒ<¡U¢hdÀMœOÆÙâõd‰ ^ Àp‡¹(1?R`Óò௼û0 à €SôûÜûG%ŠØ óÊ;¢C€ØoÛÚ!p. $Q‚€}{˜ o6åÃ…ûDû9¤Æ•œÀˆ]@Ф`˜Dá ÁûEˆ `n‰"À¯²µdb>ˆ ïyÙ}í3”•—a`` Î[ Ê à;R>ƒ<ÿ|a¯àY¸h¡ry Ó§¹¼£†€ÊÊŠì<öq÷y“©o,ð;öc¸¥"S7a<Þßÿ>’É¡|ºžËav(†uÍW‰D'ŸrrŠ·!_]k ¹+?aTÎùâ ×}B£ŽáöýÊÐÀ™ÝfäWvvþõ×^x~{a°hÑ"@ëÜVÏ—Z Ï"zC¹÷»Š³å®;;64ž˜H¼â‹=ý 8®~…* Š ²f\‘a^ë!z-÷ë³2ü™ûݤ{–… ¯˜èb?Ø×uÖ²ìßùbæ a`Ø2‚¼‚Þ»œ*õ†": A¿VvopÕr?††‚õ¶DEÄðÂ`݃áJ™xgd/“A&(÷š¹HìxXXGð5 ‘ °¢KX˜/&ý®ODC‰XßÿB¶ '=üðà ¢™„Çûÿ‚—¡Ù Ÿ4ûÞÏ9ºv"ÏÃYvBUwFuî”êòÊíÖïú2¼¯¥WÛÛE€kÖÜ{$:À‚J,Faǽ´#X¦Qç+eŠþ‰¢³ãùºïBléÉ ] , J<ž„ù»“Ÿ‡/ÖÕ£†ÝŽ»„œ†ÛÊX/Û}衇ö ¢ßøÂ:8ò„u¿ïôe¡Y<‰€u¿>3!äØ÷Ǿ)' nÒi- ¢ß¯[×ñVä„ÇÌ-Žã¦“îð«`¨«‘( hãñè`=P™„é[(ˆ‰Ø#IN~ D‰0v<:X´ &=¨GEƒõ®”ûÊãÉGBå7œ¼eË–ƒD´UóŠÖƒ™2r ŠriºnÃôÉ Öýúäóº²"züæ›;>*¤Ef 1][(¬ZÍZ@šµ©àÐ÷ã©å~ãà¯õ¤•üýðì IÝÿÐo ´Ý/%½ö ŽB9KºrÑœÀy"WMÒZîÖÇWÖ¬¹}GØ~åõ¾aˆ™yQÑíxiÖˆÀbÛqk¡Yàùô-/Ø¿oÿÿ4Oi~ƒ€3ƒÂ[ÈÕ¬¡Ó¬®ŽZ„©à ]˜ùËs.ƒ°sÍ­ë·å¥Ìùüè±Ç3‰[È5Vuº„’fUcò\*¢5¾ñ8Bç.|`=ؽIÜžo¿ò~~û¾M÷=Гz& /»ÆËn‰&«ÃUØŽS¡v<zî¶ÛÖ?—ï {s¨[‰iI¦¼ìx‘fÏŠ• ö³ÛÙñð4dn*¤‚vp¸ïîûÞ"à{ùΆ™= fZ\#oX/&1cÓªUëw˜@eùÀz"úS>vœ|ìxàéREØÃëAèí¾¡ …6R°ttXÖÛß½Àßã㻩˜ ðæ†º±ß¸ñƇFâF|à7mÚ¸@‚`úljó ì3@×D5«—/#=Ï<óì»óÏ=ï‡FÌ "´†{*2%™ð½ò¡Ï­¿ùÿ0Ò73ª wóæ»Î2÷X|"ržÀO›BܲîÖuoŽž{…tï½w-f;Á8çÄ`<~'!V­]½öéQxo£—îÙ|×R0¾  õ8µó/üÀ@oò§r” çè§{îÙ0Ÿ ¬$¦Ï!À‹F˜<ÊBlY{ëÚWt:~èþû;“ñk¬0st);^aÆã2¯ÿúúƒÇ‘y:>iã·7Î “—ѧž 1Ü1<;xsQíÙŸ˜}AyYE»ag !Î$B]ÄJÞeJùjr(ùJÿ@ÿ+{ÿøÎ+[·þìCإ̤Ë÷êoŽ+Pge)ßÃòIÊÿºe¸|—ý~éÒ%-“Ožrz]míi±x|lÌ0š„aŒ5H4’Act» 2ËÓ”“CɃɤùÁÀàÀûý½}ï8°ÿmÛžÙÛßßïÇd7ëÊjTþ·~§ÒåÚ‘ €U… £…Ÿr¾‡›€À5¼úÎå L†FËÃ2Ä÷2àÿÒO@ÔAL "nŸa„FD” âŠ.Μ—vû18e€:°Þù^¿wh8åù™ïoóm?l›ê÷VS›Í!_dFØO¿sònßp±çQ|"€íò»0ÐNN™ª½^ƒkº00¨¦ú!»øpñ¤O{È÷“\ÌBPÍ õùÀ!þ|"¿˜»|l{>6=Ÿz¯ïòŠ(cý˜'B2SøDA"LÝB/-…‹g Ÿ#(5÷0ìy•!BæËl ?¯?ß~rˆ¨À/, *pa.Â0öDȆñ Âh=å©ýnÌboG$É„þ€²JŠ‚ì•IEND®B`‚qstardict-qstardict-1.3/plugins/stardict/pixmaps/list-remove.png000066400000000000000000000203031323166163100253020ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× #¬E< IDATxÚí}yxç}æû$@ŠÀ›àR¤Dê²|ÄR_qj×¶V޶ënë¶Þnw[{›uœ4û4i6ó4ÇÚí&OÒl¶Ù8Ž%Q‡mÅqb[²-ÉåÚ­[)ËIàM@ÇÌ· Ì`%ã{ž±<Àpæ›ï}¿÷w|¿ù–où–où–où–où–où–où–oùöIit5ÞÈ]ˆ‡Õ‚€Áq€5hPRÜ:‘@ q6NÀ#Œ4BĺyÎtÚ93w1O€%ÚÜ%¨…°7°À ²«ï–ÒÛIGhÀiNÑñ9Cèµ¶)\Êà2µ! ÷3ÂV70¤ prÀãÃCšû!gD¿æ üËÍ“¡ž<rÜúŠPK H [ÜR ˜ à‰NL ÒF¢nÆØ?s‚éÙ†K—¦òÈbë/Âõð8íP `³<À'@Œí`üç&÷xž™;rÜ [è1·dUÖSíkŽL&Ä¡÷Ðל—^Î æ*ÆÝŒ§ï‚°z!²Î•ZÁUVÁPY®ª\YÈlY, “ TX€À‚s`‘0X`,8arÂøøÉqãc.]Ê€8$íâ ⸿­9œ'@2©/À*2Ò÷º;]À©°†&'LËÛ`lYãòVPIIâÛ$CCó^BäÂD.^@øÂyðý`¡°¶¿ 뢊‡î¯Æ<¿Ë@Ò>*Ciá÷€GõÊ:£`í:˜®¹¦5k@¦‚$v[çpPêïY(„ðÙ3¿ÿ>Bg>›v‘#«¹&°[ìßlîë›ûÄ`ÀŒ[È`x–Mºì8ÇÁ´fÌ7ßSÇ*€¸$v;ÕÓ @`÷žEðäq„»»AHBÙN/#üYã°çØ'’ï¦êbã7Ø 2¤ò²¹’RÜt ?s 8›=K3 í¶ö!”tä„™iOž@è.>¯ö0ˉÁ@ìÏ•?Ñvþ|ðC€‹%í&<àºT^5/ƒùŽÏ¡ðæÛ@&SŠÞ“¾ÛÍ)ˆá0‚'ÞÆÜÑ7Àfý:Lº@ØÖ089tÕ ¿Øø9"ìȚ̫&K o½ æ[o&ém*/“Jº‰Ã‚Aß>†à‰c`sÁÄÄÏ;° ƒo]µ(1=àGLÉ’)¦5ëP´ù~µ4;€'øž28bÞK¼ò2ÂÝg/ú="z¢~`ô髊 WIÁßøJ²YÏÙì°Üw?L+;Òè%e.á¤÷zÏ“\Y"çÎ!ðÊËf¦S…¸ßnýÊUAK þ…'K¦¬»–Í÷kÈýÀ¡…È~6ˆ£þž…B¢œù UŽãŸêûG#€]±`¹¬…?ð' 0£–»7¡àú²b׉ô€GŽ éŸõ)œÔÐéGàÈk@$’˜8 ÿ§¾øÏ à¯H¸l–gc•(¯Î••¡hëªjôÉ|6f´^sBY @b†Š¾Áøf„à™Nx ûyÃÅá?Ê•äŒVó·@øJ¢¸ÞPë@ÑŽàŠŠµ»ÅfºÏb¦§!¯…ee¨¸á:XêÙ'EÆ€kÏú¹Ñ1Ì ƒ¥¾–šš„‡³ÙY̾tüȈŠ'¾]wÁý•+†6ËðýDöÞØÒŠ¢û¶&mÓÁópÿöuø.ö)&¡âÓ7¢üºkÓßhÊ _Ö™ `ôè1Lÿîƒø|%À¶ªÕw|d0hž‡…#üæeð}ù ŸÖüé’'€Ëf¾½Q‹¦Õk`¹ón€ã4»ÂxîW_ƒ¯ á5*7n@ùuëGÆ É5øÃ¿y—>¾ ùý2§u›îŽ“@yaîÍÃ÷œM!„ÀÑ=õ½ýG–,Ë,õ ôª´dßÔ¶–{7EoNÃCæ ½ö:ü1ð{Ù•>…²k¯ÑB(ûvõfÞ8Å>Ÿg0ÀR]=—ÆÅu—É÷âgŒç1üêëð^ƒov:aª¨@d*^žžÆÜøJZšca’ò:ƦfS“.ÍDUS¶™ѧÿ¤¦îg?ç—¾\^ô4mUtXtøêPtϽ ƒA~|c<¡×À?0(¿­ í{÷bÙúõ(¹q¿‚‡……Mߟ˜>¼dLÀ@eÉ-`ì-Y)D4ÞæJJ`Ù²d¶hÆãLà>ü&üƒÚà›*«bŸyßyçþð~¿ìØŠO]²ukÓˆóuÔ¦ø;&0Œ>¯ÂQ5;hßÛ‰‚ÚZðñqôìØÀùdý*nj@Ý]wÊCi47‡Ù_óù´úË `w4ž½xô²à¢fÎWrš#¬TyÕF#ŠþÃýàÊ˵oRà~ã-ø]nmð«ªT–×_‡²ukôƒJéÅìÒ}&0ŒyÞ¾þ¤àÇf½ŒñVÜØÇ¿2pš×<~ûëx¶>K˜®)?þÒe5O˜J¿ND[Tö ó­·ÃP[«)ÉŒçá~ã(üƒCàwj‚…uu(Ù°žC‡ÀBŸÀ=â8Xª*ÓõÇhœ‡1#GÞÔ¿sŸ |0£lÓ&Ì>‚ÈäTlŽ„g.!81§S¬kÜÜÙ ®¤¼k@m ˆla#Jþ×øÔ+—M\Uöu€ð.“R~ËÛPxÓgÎüá·Þ†È-ëE*ðUJð©” üºõ([³:¸žRd%²ÏFÞ< ¯"DM¾\ ÆD%øH¡ pÜùY,4Ž_7øî;ˆ\¼¨µŽáˆÖ:>8—qTÀ-Ì€Oƒ`’;~¡àºë—l `á†ß:ÿÐŒñ–ÖVÝà@É7bÅ/žƒ¡¨8v˜ü·Ó˜úàC€b×Lwc›Àó~ã-qæKÁÜÔ¤ |0UV¡}ï^XÚÚdŸû].¸_=!ѼvÁÚk@EEÐPY£|÷²(À`í³ŒáˆÖÊ—ùöÏÂPS«º ?ÿðˆZö;÷é_¥=¨V‚õ× lu‡¾ª¡Tq>€‘£ÇáS„¨f§íûöë_¦c‰” µwÜ&Q‚x?øñ1O¼­]…̸»ê><ûÚ¢*#|3–БÄýÆæpUU`¯`2á·OÂçc,¶™[[3?¦Ïý\qqL€‰ÓïcêÃn0^¼~|†ó©U€Å7&ðyë|ý.H/`nÊ |0UÍ+A+¤'õ»1üÆQ@`Ñ-ÞCEŒMMQÐåJÀ8ö=¶=3.#¸jì÷t“ÔáÈTÓê5¢ü*¶™óàR{ûûög ¾”+Ÿ{†¢¢˜4c˜<ý>/Ä”bþ{ç1rì¼®A™²:› ¾’æÖV‰*Þ/jú0ajY.‚IsT[ô;ì7ƒèeº—ŠŠ`lnI8ÐaŸÜF×?ùå¬/#Ás¿CI›øÝ‡ðt÷èwy£oŸ„×5(wøœNtd |) ê¿ô¤Ìãû|1ù§ùM7Cc#Èb†ÒñfÄÝ>tͪksNŽ ÿInû£³yTÊ jaÉ2Ù`^ø«¿„÷Ô©l/F¢dCT $æŒEIЛÔÞ#ª£'NÁ«ÈO˜››Ñ±ÿ@VÁŸwb/<þ¸¬Ü£°´T#"a` úYñµ8däÏ)\õ¥eæûçma! ÕµI*{k‹ì\¼ßÞvåÏÇÌAL ><ƒ©³½uâU¡ÞÈÉ(ø9žù"ø§ÐûЃà}Þx@Y{[R…2TV‰¶*L0í껾£6‡ Pø0‹< ±ã•öUèÂ2;Ê:V^vLž9 OÏ9mÙïúW•£jnnFÇ(¨uäü‡Àû|ò”öÚÕ0WVÄI3z!‚ÁáP™˜Èøpî@ôg*çÏh„¡Ö‘¸³1O–‡½¹ å+Ûd³‹÷ùлkgnI 0“gÎÂÓûQ´oà**âaÏknPl6g#ÊÛ–ËbkÞïË= bJ ^vòl/.z>EfRœùQàÈÕÌW€¿ªö¶åŠÔ9‘øÿÇÆ/žàìePšcý*ÀéWlR®öQA¸’R•Ã]xy†››³å­ËeÙ5ÞçCïÎðžêÊ vï‰*Aââ³Ó™Cð;|Œ¡¼c%l­-jÙççå_‘`ñ–-¨|hKV×>n±[ Ë8ÀLÒÕ1Cu5ŒÎäg$JzÉé¾L¿ Z>]¹gJ6lÌ:¼§N¡w×NÕÚAlæ|!‡à+f~ÇJØÚ–+††R¬^Êwy÷ø‰q(jy Qã½÷&²¢…¬è.éª_4ýƒÍžÚV¥ØlM([®"îÜ™C%Pû9ÿÔ²ß.Î|ÙxhúN‚ú‰£R+4Êð B!6dÍ„›H<ˆƒd±¨ì;"r;…Èügó[$j âvÎÖè@Ùr§::رÞ®\`£H‚¨O`v:sþ.µì¯lƒ­¥)>& Ö"âë|ÂÌf€3¨H@ 7fÑz…£*.C—Ù¥ù0…id±â›úk½ö§†ä{ö hÍt¼ðbÁ—Ïü²­°67iŽAÜÎóÑM1®óë±1ŒVÅÍíüÆ‘.û©Ëlmð°Iíº¡ªZRë§ç›ZöL}ùi× <úe"ú(Ù˜}ŸŒé/ Õ ~zwiƒokq&¹^ŠgÔ( èìÝSµÇß©HõLaJè_ÑØ"›2×ÓiÙ-A»OºiÔ Úêëaoi’†äà}~ôîØž%XT𛛢v\c|´ÆF‹¬ êÅBHÍt™û37¬X° à­qJjðãà''äÅ :×ÙUÃax€ °Õ;`onT›ƒ\‘ ÇàÛ[[`u6È aT¦O”FWšñïç‰$x¦ LMBkyž8ÚT}6ê°«â™&…s89  ÂPQÖ/å«Z‘â{qßê¨S}ñ2¬ˆß‡žÛѾ7Gæ`!àwu‰á¥ø¶ÆzÑÙÓc“ì“t_ÀOM‚Š¿‘˜_ެŒP-y*E½5; Þ=67ŸåI•@CÂ…ùˆk­«AYSƒÌ>z·o[RJüåNüXˆ§'4V$Ô„ø[¸ Á×Pçx‘Õ/˜Äq5Zò"õX„?6 azŒi€,¤\õYÜ*IÀDü~ô,x»ºÐ³k">/X¬ëö'¬ õrÙ×ÚT²Î.RüœŒ13ÓàÇÇEE‘¯ªMe ®R•oV?¤ ª’Ï atB ¹Ie(Ã'ugTM¬µU(k¬Sù—›Þ®.ôìÜ!&yâ(¡¬¹ Ö†:‰Ã'%¿ žåÑMZ˜¢ôØ\üÄ8¿1Ç^½ Ûg:`L}›¬&W¥3žóL… âe £©^”HÉ^©Ý·ÖTÔ+^©Ãû|èÙ¶íûö/ºO_éí;a­¯ÜTvÔß³PÂŒÌëÂa‰­´càDq1ÑØëkÕæ`ÛÖE1‰Áo€µ¾&J:(vOB‚8_~o` ˆ„Á|^—fÄGáSȼ¦9Žï[² ¤kv¦’u‰/x0A…â2&HÁZ–x_r kuÀÏT |èÙö´ï;3%H~YS=¬ŽZ‘Ü©r¬$×Dß ŽOXò¶qÒVëù‰›l`v|>~e9°ÀÈdŒ¦¨Ÿ€dïØWí—VØe¦@ô üè{òKXûÆ›ï ÊR›wê¤Mê$—c ÙŽDÀ^ñ®ÀtØJo>ãŠIJ/_!DÂpDëq&‰c0av,›8R*©Aøp#©ÇÑÒÞŽö={s~ÉÆhß·_µ”ìÄÌ [#«É+ÊÎyQâCA°À,X(¨ç´ÆJ§ùÕ2Ç:X:@ˆ•Ïoª§R’®£ÃóÑC8$:>Á è/DÔ9!ÁèÇ}ÆÂ!q+^»«~õ2LÒwò-& \C˜q¨Ýž‹D¢NqPtêæ³‚ºì¸ÎM5æˆ"YÈr³ÉgybP“©ö£/‰Œ" ‡ÁÂaÁ FÎ÷!䟕 ò²k¯CÇ¡_ÁTQ±(Q€H‚}0AÃx\C˜t‹?@ŽÎôp8 8K|߉Õ3VÉÕw" €aÝ²Ž ™«úLq3‚>ÂÈ…„g2ºdãFt¼øŒ6Û¢æJ6~ZT‚¢b™BMº13<ª<­É g’AÏxŽd! ¤Ádv\{K"û ÔY,ÅßD"Œö !<”…Î¥·ÜŠŽƒ/ÀPZzY2%?öýjs0=4‚™‘ñØñ$¦Tqb¦š£ñ…+h0­€>Ppõyùpc}ƒˆCqï–Ûw¢½³\Q.gKL‚a 2¶ã)Ç›Ä̆°Á´le¸ÆyÃÁ0Fú\ˆ„Ã’{"ØïÝ„•Ïïg¹¼àk’@r_" Æjǵy´WFYD£ 'gpécnêʼn¤€+> CësG$Œ&”oùVü¿ŸGIK§‰$8Cñ2Yø5=8O‚$v\‡ p•Jp\÷£àC]v\—/ 8¡¹ ~Dþ6ÔŠ;ÑúÓŸ.9ðS…ˆÓ.7f†ÇžJÖ=Mókà §udyR€ÜŸºf@Yêê•Ù)«X¡ÙÆú!ðrð«þã¡åé§s—áËvÊxÛVÕÃ'¶Æ:±ÒI#}Ki¤Ùõì0]óÒ+ö+ DïjÏ`dÉ·àlc}.ø5>Š–gžÉ:øÞ®“ðv\% `Ú5$†ˆiËzJ;ÿÚ}Âi=}Õ7¢D]š€S† Döç«YƒþÆ.º ðòœºã±ÇàüÎw³_½Ûu=Û¶¡gëÖÜ’`Y±l2L á’{X¿¬ë «ÕÇP6 À÷΂âz ¡ "|~Œ]P-¨Ô=ù$¿ñ?s Ñ'ѳ}x¿üì,z¶å¦²¨dãF´wj­DÓÆ É–¦q'²FŽÇ)ñÈPªHôùmÖëÃxŸ+~ôô _ûþ櫹±ÏÛ·ƒ÷ÅÒ5—õ" ö©IÐïÂÌÐpÙR¤‘fçÂ…Æà«Y#€ã½÷&Ññl.U…Ùi/&ú\bAdì94=õmÔýõsþ6ÕzþÒ –ª"Ã4;Ž—u¾>“=Çè`*;.\Ë HnÂç™Áx¿+º´>ƒš¿÷}Ôþç¿XTð/ ¢àzú]˜Ö´ã§ÙA/ëÆU·D,‘×çFÁ˜ô`j@þ62°ü?@õ#,ø¶†:Ø”ÕÆ³~ôlÏ1 –É“Ež¾±ž KivFL7Òr­Ý·l8H;NY½¢>Î;>‰©Áaù×F#–ÿèǨضmñÀo¬˸˜q`z`PÖqCq1Ú;÷夼,VZ¦ÈØ››`m¬Kç§È£8S»ïÅ5YW1)Äö§.JL,c—´À/(@Û¿ülqÁoª‡µ®66‹luµ°7Ö«ÍÁöF{;Õ>ÁÅ~‰deÑOÒéKZ(ÿ,@¡´Ò½Ñ}~xàsf3Vþâ9”mÞœ[ð%jikª‡­®V•fµÖ;`oZ$¸ÐàôL† ! „az6g¨<öÞ0»ÓûA$.J/l±`åî=°ÝuWŽ$VŒó¥¶ÒÞX[‰ 4D4\HÆnf`0mðÅõìoèìœÊĤžNm›š/æˆ~Üú£Ãzûí¹³¯’8ìõ°Ö;RöÛÚP»³QÖW~v=9z4½dãF,ÿÁeŸgºd_žJ8?N÷úi îèÉÑ›©KÄä6ÈŽs}ë[æ|ÅCM ðS§Y­ u°7K~œa^ r@‚ðØ\O}Kö™Iõ6ðDu²önUçÁã9'@”zÿ¨í&žYÅe²SÎõ¢{ó}Y#.ðÓH³Zq%šƒ,’ <6†îû?À¹s²Ï‹kªõ®pÐ…¿Í¤ ¶¼ö%}N5kIUŠìÖœ )ø ŽŒÓ¬ÖÆú¨dŸ Á¯¬@i½#%àŠv¢vÏ ¯,¨³“g྘n5kE[ ,¶ì’ ÙƒšÖ†º§Y­Šwe‰À/ª(GåÚUiŸ1üL‰¸ 5V÷·þ à6%fPž bŒaüÜÇxfd‡ZV¬Äª—¥õ+" Áon„µ¾NãNSRh%³âž¹çBŸ,éb(.Fûž½i%‹’_µnµâ·uµ7jö¸#S ø»ÜŸ>Ñ_ÍJ‡Ê•­°ØmèsçÐ}ßf„ÇÆÒ_r~{s“~UµzҬ֦ؗ7«• ÷æü0qôøB \¯¾ÙCÄ~”n5+Çq¨joƒEåè#Aìå ~¿LÖe²Ÿî:»Ž·… à`ÿPýüþß]6@gù*ˆúÒ­f%ŽPÕ¾"ªúIèÍvg£˜GO»?½¤–µ©Aóço’‘ àXoÀbýæBñËJ•ûÞ;n£#4‹)‘@`Œaìì9<Ó²sZV®Àªå>ABðçßÉ“…¢T=ûD„™o9Wú¹™ù`q·9vï;¶Pì²Reéøõ‘£ úeðÌ qª:VÂRf—}8÷º?_L ‚ßÒkc}VŠRõ?ˆX(K¡9~ ð,ü|ü|{dýõÇ,‘འr¤[Ì@¡¸¢!Ÿ‘¹¹Ø9#““˜~íUTWã£Gþ89ø¥êM³j5³Í Žã˜òħf8Œ©_„¥µÿ×ÿ’}ð ''Ã?ìîæ³[VKmÝ›ïj'P¬Éd?QxƆ±³½²MÔì-Nü,Êz¦MËhµƒÏ01áúúç f ³ìÖZÙ|Ï ì‰Ol§cëîA`Ò“|ŪÝbž ² û&°ß«í<øV6ûõÇlj½r„€¿È¬š5ê¬î@QE¹ @"‚}y³~Úï!€î¼z&ÍêlDY[‹æ¹‹++ >@ìKÙ?' 3Ÿ¿÷)¾¬? §ž±>÷|£cÏÍ¡ ¨6g# ¥©äEžåzZÐ3 OßB~?Lf –ÕV£¤®v¡(=U³ûÀß䢿9!ÐÈ–{F¸˜áÙU×ýcÍÞýåêôÆ\˜ÆŒÅ G!þ4ƒâÆO&àòöÓê½ûÏår>‚  ‘/l~À_¦ ø'ôùq{¶F0ü1uvòW4b>ÁÖÍOèËùY®ÏæWï>ðÕT¿÷sEÜÛîœß‘™ž<àÒ£?¯Ù»ÿÿ.×¹ oßr{Tå—§@ÜÖšÝû/æEýuµß21ãuDÔ•?6 ÿMàhãbƒYCÞKÛüÁÎ-áÆìÛUÖŠŽç÷÷\&ò]ÞæÞµíãÂ@+?aà÷ Ä=œ­U½+J¤Í±{ß±Y‹u=Àþ@ø|„€šŒ–u—ü%¡Ò6úÀÖuL¾Ðç®ÊØžá7`†/Övvv/•>-I/ld×¶Ï ßpÓU‚ý‡Çž¨zþào– ºtÛð®/lâ@Ç»þÊôîÙ10UkÒ׿.,Ñdé·±í[næ9z”€m@êBºÌ-b{ž=íè|á½+ ½rškûö2'< ´j ux—Ûo4ÒÏ+q`ø ÊA\™ÍýÀÖvÏ61à^n°Ø/æA8†ý<ñ/Ôí~Ñueš©« M>ôPi$}ù*¼sì9r€±ÙIò¢PƒA%H%N‚W•fÚ<”Ù‡ößóÄs€ü”â' îÜÍ›K»·lÉO¾oÚ¼ùÓg¯h;ÿ»-—]è\aKQÌ’!ÛX+I9ê«õˆ ‡GGôÐø ÈXAbc5ŽbæÛ )œ+0çE~çìÜ̧&¶ínò6‚Ë[·é3›’­¹5ø³_ÿ³ÊCsO_ØRwÀGrÂy3ó³Äbµ«VuÃ}ƒ¦¯«Ç$¥DZY‹#£#ŒLO Õ¤¬Ö±&Âm—‘æ¹#âCćàHóô7Ýûôÿd3–-oM{o ÜwÜa~øas2z}åOþ¤vç«/¾¯™µn/\þ⨿Ùjáœ+V /’ÈÆ¶¶™oÖ¥V­Qo5hå©1Ô’ŠAɽÃy*€ªUTUœ/¼±VUÃx–·?´ÿž§ç-¦‡ nóæÍv [8yb?÷™Ïœ2™Nßžzw{Ü©Ïñ… ÆX×S©ØÕKWÙr¥¬3ósrðÄQZyJîrEDÊQ‰rãUñ!Ð*RÔÄÆTAUFŒäEáR׎ r«ˆ?1vÿc? p'¿Wå>õ›ŽÏÎܚŠq<ŸõÕº¥Z®F+/5F¡•ez`ä¨4Z <ªyQHÇ t6Ãù‚"x¬´£@è€P‘¼fEÎâÁ!9}ÙÊb÷Á½22=þ¹£÷îøì‚do àÔœ¢òó¿ö>z¢>ñs™/Î èbç!¸"¶qX>4œ,;e1Ív›éúSó³LÖg‰U#"I£ª¤EŽ* ¸à‰M„Òù¬(( Á{Œ²"W#"}}á7>ñKrËÕ7èŸþÝ䯾ùµ–n?´uÇ÷àµózKàÐwÝ|ÅÕµ®žÿSNÊg¨ˆAA¿fåa §/îªVŸ™äèø¨ŽÏNKVdˆˆÆ6k,%‘¹œ´È ‡Zp–Î<8ЧŽÈD´³6K‡ùóÿü{:69Îöçžflj\^xu·›˜›ŽÐ°·ÅÌU#÷ì|3š³ÿâÝjWõ|Úkx¿ˆõ¥¨äUƒ jÒ¢°µJ…û^Ñ'ŽÊ\«!ÑR\’RKÅxõ4ò´(+$€ªJÐÐјSsÓÔ› 4(¹Ë©”nÙpçŸs®¬;ï"ùÆýwËWïý†&IÉÎåQd‡ñ¥%Ë.ìûÎDåTÃÈÈÕÞ‚ëZ=t A®c(ÙØF66AU ïžÔzÚ-ljDÆ ¹s¤®Ày× b”¼È1Æ‚#ŠbŒ|dEÁk/âÓüï»úÚiÊØÌ/í™íÏ<εë7èÒáEòø ;4Í3Œã¼/l×n™Ñùí;žZÿGúßëÁ™…'ÄË»—[Ý("‰Cdc1ˆ†àRQ2‘ JV8Ö4(Î{ŒB¨*§-[A£Ý"²Y‘£ªXc¸éò¼ûâË™ãÝ—®çƒ7ÜÂÃÏ<ÆÈä83õ:sõyùôš±é žÙõ‚Ô*ñ!ÁÆÑ¥Õ•CÖ÷ްËî7øzpú_þøk7œsñPêK¦òÖµªÚcM„1"•8‘ÈD3£ªž€ÒÎ2¦fgèïîcñÀ cÓTËeæ[M~êšY½l<÷$kÏ8ÃC|ö—“¿ùö×ùÓ¿ý<‡Nœàc›nãü3Ïå;<ˆˆppä§-YÁGn¼Uzú1vÜ£årÙª†`Dú"cÎï>sà[sñxÆî7Îö¤j¯X¼xóüÞ½ÛnÏ´§>0+ù"S©˜ÂÙH’¸D@ÉŠ*J–ç6^|·^}ŸùØÏ³xhˆû{„j­Â\}ž«.\ÏÏÞ¶™‹–0Ü?Ès{vÑ]ëâÓúiö:È\«É-®gß¡¼wõ”“ ß{|…/xùÀ^6m¸^7]u u÷1WŸg¦>k5P`dUp”æî¹‘Ü- T*ËJ•ÊŸV*•KµKLÐÞB½I«‘d®ï="† Š1†,˸è]køý_ýO ö p|b”¼È¸øÜ󙞛á¥}{èëîá– ×sñ¹çTùý/ý>(õV“»ºû^áæ+¯%Ž#þükÍÊ¥+øè¦Ûxìùg(Š‚rR¡T*É`o_ÛúMÙsd?Ö‚Bp—VO~©±ìå“ñâ‡ÌrUOÏå¶Tú­(Šò(ŽÅF‘dŒ–˜¤,Y‘aŒÁC¥Ta®1ÏygžÃoýì¯ð7ßúG¾¸å«¼zø÷>úO¿ôð*‡Žá£ï}?õF§^z–Z¹Â¡‘ã\rö>xý-|ñ_åÄä(SSlÚp={ïmäyAVd<ùâ³ü¯;¿ÌáÑcÛh¡îTÅA¸0_5p·;01û†>·¬«kCÇc\R.—L)ãUšyF«,K$y(ˆmLd#Ò<å“·~$Nøâ_¡R.Å1•¤Ìl£ÁˇöaDh¥)ÓõYv¾ú gŸz·¿ç}öiŽOŒQNJl\w%7o¸ŽCÇŽPo6øÔ>Î=Û¾G£ÝæÙWvò¿C½U'¶%ÊIY‚ED|P?\R7Vè}¬où× °¤V»1¶öF±ÖÇq)2‘Å ŽYM%O ¾p k Aá´%Ëyÿõ›°Æ2ßlÙk„Þjj¥Šª’gÖX\pìzõnºêZ.y×yÜóÈ´ÚmZ­6×­¿ŠlºÜx+/î…/|ã«üÓ÷¿Ãc‡éíêÁ x õc$ ¢0bDQDÕ#guÙÊXýî‰“Ü œüpåŠP‰ãßqªYoo_RéªÑ)ÑGÝ,G{11!(½]}X3Ø;ÀïþÒäÚõW1ߨ3ߨãƒ!Ë2fê³|瑇Øúè÷™š›áÃ7ÜÂýúçó_ÿ2ß{b§-]ɱ±ãœwÖ¹´ÚmîÞþ=(Å1yžS8‡,$ÿÂÞQ.%ªÁ‹Ú)<ˆUï÷Átô—ž9™Ò,`—÷÷ß”$ÉU.ÏC©\¶6Ž;‡"PÊóEí©aÅàÔS.%dYΓ/>Ë {v153Å|³ÉÌܳs³LÏÍTYþÅ\}éåaÿ±Ãì=z€žj¿ðÁ³á‚uì9´{}ˆÝû_å¹=/GA•,Ï:…B »‚žjœ~ÕRY&ê³jtSD4à$’! ~y#w3ÕÎNj®rþ¢EŸêêú5Wy¹R)Uj5¬Ä¦ÒyöÖrâÞ~žR©L5©aÄR¸<ÖX"ÛyL„WÏÒ¡E|þ¿~Žz«É'~çßÇ1Á.X}Îvî™ØF cÀ9Gî ò"_ØÏÄ%N^Fw/cÓ;F^õz²”[(_ó8Ž’¢(þðxÚÿY¶m  ­4mJµªˆ¨+  à]K=QîYR.1eÁž¬È°&¢–Ô(—’ò<£¿§Â9¬µ<þÒžÞõ}hPD:îðä®çQJœtLÏ|áÉ‹1ÐSé¢V©0Ü7Dd-ûOfס½äÞª¨†ŽiÕ8ŠÅ7[- Áª~³ÏF@žåùdV"ÆB¯ªÕ¤$«Î[ËgŸÅà¢ÅŒÏNñåG¾ÅaZ$jÈ‹Œ$*aŒ!)Wù™›nãïîÞÂî¯RŠ#¼¼oÃ{XzÊ"¾ôÍ¿ÇX‹†Î—ËeD%`¬¡¥TJ ýC ôôÑßÝËñÉQ§µieqc !4 "‰I+okpÎ_ræyñò¡%;Ÿ<´ëøK!‚sn<¡]I‚ªº,“¨·W'NœË®¹†|ò“|á>G¶ûñ©ÝÂe´³ˆj¹ÊäÜ4cÓ“|åü[¸T©$ezûøâ–¯ðìž]”K !¼*‘A;¾ t÷2ØÛÇâþSžà¹}»˜oÖ‰¬EÄD1€.DMk#BPq¾Ãõ®YzWŸ·ÞÞtÕua°`³fÉš¯Ÿ5´Šb8a9CU½Á¦­–xùe’j•÷}ô#T«5¤B>WPˆP ¤.#*"ÊqÂ÷ßÍ5ë®àÃ7ÜÂÿþ§¿g†9þá»ßbº>GwµÖ)^µãäi–Ç1+-¥Z*ÓU­rtb„{_B•Ã˘o×92~‚$ŠðÞ£ªtZKO³Ý¤¿ÚûVžÍUk/•+/XÏé«N‰mZ®$Ë:xð|0ã¹÷#]åòéÁû`D¬±V‡–,õžÆ|óÖ­£ü×1=óMšeðÕ Þ¾@Œ!IþÛ_þ1]å2/îß‹ôtuÑ×ÝCQt8U¯‹°zÙJzj]äEA#m±û•}¬^ÂÚUgRxO+m1רcÄB§ôÞÓh׬ôpÃ…—sÕ…ë¹àœ5¬X²\%¶x ˆª–ã$e5@´Æó¢Ñð!¢&FG9²o«Î: €JnèoÂDÉ!&¢·°ÖbŒ!/ ÆÛ-V,^ (í<¥¥”ãk-=Õ.Ö¬8ƒ±ÙIö=HZäøà(¼£™¶969ÆÄÜ4Î;Œ1D6"w9!º’„÷ž7^¶‘³Ï:›þ¾~5ÆHî ‰.£'NpÁå—ÓÝÛCÞNéo ³¶…ëë&ø@æ²NòŽc-­¬†€1B§e…EýCh<¾çy­"‚ƒˆ”JLÎÍ I)AQÚyFb,Ëû‡¹dõn\ çœy¶VkUQTƒÑ ‰ï½qÁS+W¤–TŠï>µí*üC´PI»<ËŽµK%—”J"êC@Ú­“##¨*+Ï8“ñ#T(3ÐH™î h“f-bS¸k,F@­A¬…¢È90r„N]ˆ#‹Åw8Ê¥Š2Û˜£bK¬]v:W¬¹˜+ο”Õ«Î ©$Z¸B|ð ˆ1F}ð‚j­RÑZ¹ê÷?\úÇîbëã^ɰ=ë5píމµ3Ö˜S\Q„R™‚FÖÊñÇQ`õÚ5¼øÌÓ$•2Í‚Éãä‹ú‰ã­¬IW¹ç;-ÑU·d¡Q¡ðÌŘkÕ)›˜u§Ëõ—\É®gñ¢ÅkqÁiQb¬Q *>UAËqJq‰ƒ'ŽØ­ß|ûû÷NìØùÔ3nnö›L²?Z¨1C#Mxïg4އ|ž—$Æ9G¹VãèÁƒÌMO³lÅ Ž:Lÿ)ƒôöö±é¢ky¾˜àÀÈQJq‰´hSŽ+x ˜…„mŒÁ¿Ÿ<¨`Ò"Ń]}\¶f.¸Œ+/XÏ)‹NÑÂ;Ñ4h@APï=ƘÐÛÕ­í4ÕöíŽ|r»>ðøC‡žÙñØÌæÖàñŠë­§õù“š“Œäy>×U.#ƨªª† ÞuÆc‘µÜðþ÷“çi«Iî |–³ï¡oQ6årVÖ¦—±˜Î®Bð Ú :jÈ\N»ÑdåÐR6¬]Çç¯cí™ç088HîižŠŠ„SĺË]´Ûm¹kûýæÁ'ö;v>óÜ®—ž„ÅcCÃ¥ç‡ÏݳgOõ|¡é{m-^30ð¥ZíVU-j]]±† g®]Ë%6H}v–‡39>ŽsE–SŸ›£‘69܃+WqtêåR•JRAÄv̰C$ãƒâƒÇ¹ŒÅ½ƒÜ¼î:6\r+—ŸJ­ZÅpÎÛ¡Ô½k¬–¢E%Írxê¾~ß·ŠÝ¯ìÜ1r`ß]̱#éfïO¶ylË[ :c®×ú¹×ƒë;»·÷»º~EUµR©H’$b㘬Ý&xˆàCÀƒ˜N¤³‘eÂ7_R!¥'TJ5"£tذà=Ýå ˇ±ñü+¸öÒ«X²l16Š ÁãƒGèDÏÌ唢X+¥DÒ<×c“£<ýâ³~Ë}ÿ<»ã¥/6Ž~›&OTkÕ#×mœÞºuk±è‡8”èu Óv‡´HÕEHÊe±"Z®T:f¯Š[0S±¶Ãʨ2DætƒöPyO‰l„(,êêgÍÊÕ¬_{ëÖ^Äð)§tèóð®“KE Îkêé§ÑjÊS{_äá'·‡íÛ²/îÚùB}~æ 4xjIÏ’ÑÒp©qøðálëÖ­?vfðzpY+M¹j5­ÄqŇ Á{œ1ˆ³À ³P1hèBYB W•¹$% V±ª.gã¹ë¹ýšMœyút÷tã5P‘NCëU ÞK_­‡fÖæþ§ÿ/ßyä{úè#JýØ ín«žiK#nð»G›S#Í÷FZúqàP_'œ÷ ãTPWb£èµÝŒ18ï©Ôjt÷õQ*—‰Êe‚wô¦S<Û%ªVYÚÝÏænáâ .zÀH'©{ïIâ˜È$ŒÎLrßÛx`ûƒ<úèä£ã2b]n+ÇV¼ §÷Z†ŽÂ‰áJo ˜É-ŠâTk­xïE@­µòb¢“³‚÷xçH[-´Õ"OS´U§Ï:¦ãŒ¥ƒÃ 㼇b:ƒEâ(¦TŽyõȶ>þ0=¹};_ =6Å ­°ÜôªØH@Qœ±fu¯g°óÍ{=8 ˜õp¬ÚÓ³¾È2\Qh¹Z•ÂBIßáUÈÒ”´ÕêœLgJ@*Yæêm U\Qà‚'OÉDÄqgøxxì_ÛúOlls#³Mz¤Ä²dõ * EU\*Æ”Täbà®· N€¹¸\>ÅqÈÛmÑßPÕ×¢cPEãµÿÑ1U œzærŽebf†³WŸI2Û˜çÕ¯pÏC[¹kë·ÉFÆ©5sºL™JÔéæ}ቓ„¤RÑ8IˆJ¥ÐÝÛ;çöîß¹ó‰×[Ù[g€F³Ù<2oL°`±vrXÐ-˜!Yiã˜há –ˉÃǸÿÙGèîïá¹=/ðà#òÔ“RLϳ¬ÔÍ@÷Rz—õQë饧¿ŸÞþ~zéОþ~í4½Å¢¥KK¥$yòÔ¥K¿»@S¼é¹øëÁ)@+M·£h¾»ZBèµQ$² ¥ úšßåΑgÞ{Œ5˜8¦ÛE<ôÀV¶íØŽo´°n¿ò&V®8EK—28)(Ú‰~ Ó!ä5®_­5kUDôä EA¬1 x !~þ‰'Æþà·{€t½-ÍAGííܹ£…ˆ®¹ürsˇ>¤=]]'ÇCB xÞ¿v'x/ 9LBhØ8ƃ5F£8Ö8I:÷ÃT5xoƒ÷âòܸ<—´Ý&m6i·Û´[-šóóLML„#ûöß{oüÒÁƒÀØ[öFàÀ\£qp`Ñ¢úÅW_Ý]-—qE#,”Z!tæì!„Þ²¬6Ž5.•´”$ÁF‘æiJ»Ù4Y«5ëuI›MÓœerr’é©)f§§ÃÜìlsvz:™I§&'›“““s££³ã333M˜&#xYïUÙ{FÍvõôtkçâ‹kÕZK\*©1F¢8VcŒdY&sSSÔGFL³^g~zÚÎLM1>6ÆØÈS““©‰‰ù±±±ÙV½^ϼŸŸ¯×'çæç'gTÇq`˜êÄq£¼xqc`x¸]”ËéôSOå@þCr¾ p'ë½Î¹QQ=52&¤­–Mc~v–‰ÑQf¦¦˜ž˜`jr2LOMå³SS­É©©ù©‰‰™‘±±™™ùù©“&40±ðLu eñâ|å¢EÅò•+ýÒ$q€Û¶m éè(éè(ü@Soë:ð…ªËËå_Ýpå•¿=´t©™žœ¬ÏÎÎÎ×ëõÙF³9;3333=773ßv ˜Yxæ€Y–/Ÿ£¿¿…H¾zãFwÝÚµ/} €;v°cá¶oâÐ;Y?*®Z`¹+TèœöÜÂÓZÔj­Óo¾9}÷Í7gIžû%¿ø‹þ³ÀgEø½ÿ_}Ýóoºþp§Èo34ÉIEND®B`‚qstardict-qstardict-1.3/plugins/stardict/pixmaps/pixmaps.qrc000066400000000000000000000003511323166163100245170ustar00rootroot00000000000000 arrow-down.png arrow-up.png list-add.png list-remove.png logo.png qstardict-qstardict-1.3/plugins/stardict/settingsdialog.cpp000066400000000000000000000062551323166163100244030ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include "stardict.h" SettingsDialog::SettingsDialog(StarDict *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin) { setupUi(this); reformatListsBox->setChecked(m_plugin->m_reformatLists); expandAbbreviationsBox->setChecked(m_plugin->m_expandAbbreviations); dictDirsList->addItems(m_plugin->m_dictDirs); connect(this, SIGNAL(accepted()), SLOT(apply())); } void SettingsDialog::on_addDictDirButton_clicked() { QString dirName = QFileDialog::getExistingDirectory(this, tr("Select dictionaries directory")); if (! dirName.isEmpty()) { dictDirsList->addItem(dirName); } } void SettingsDialog::on_removeDictDirButton_clicked() { delete dictDirsList->takeItem(dictDirsList->currentRow()); } void SettingsDialog::on_moveUpDictDirButton_clicked() { if (dictDirsList->currentRow() > 0) { dictDirsList->insertItem(dictDirsList->currentRow(), dictDirsList->takeItem(dictDirsList->currentRow())); dictDirsList->setCurrentRow(dictDirsList->currentRow() - 1); } } void SettingsDialog::on_moveDownDictDirButton_clicked() { if (dictDirsList->currentRow() < dictDirsList->count() - 1) dictDirsList->insertItem(dictDirsList->currentRow(), dictDirsList->takeItem(dictDirsList->currentRow() + 1)); } void SettingsDialog::apply() { m_plugin->m_reformatLists = reformatListsBox->isChecked(); m_plugin->m_expandAbbreviations = expandAbbreviationsBox->isChecked(); m_plugin->m_dictDirs.clear(); for (int i = 0; i < dictDirsList->count(); ++i) m_plugin->m_dictDirs << dictDirsList->item(i)->text(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/plugins/stardict/settingsdialog.h000066400000000000000000000040231323166163100240370ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" class StarDict; class SettingsDialog: public QDialog, private Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(StarDict *plugin, QWidget *parent = 0); private slots: void on_addDictDirButton_clicked(); void on_removeDictDirButton_clicked(); void on_moveUpDictDirButton_clicked(); void on_moveDownDictDirButton_clicked(); void apply(); private: StarDict *m_plugin; }; #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/stardict/settingsdialog.ui000066400000000000000000000202601323166163100242260ustar00rootroot00000000000000 SettingsDialog 0 0 466 332 StarDict plugin settings Translations If enabled all lists in translation wil be formated using HTML <li> tag (may be slow) Reformat lists Expand abbreviations if dictionary contains it (may be slow) Expand abbreviations false <b><font color="red">Warning!</font></b> Reformatted translations may display incorrectly. Data directories 9 9 9 9 6 6 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add directory</p></body></html> Add :/icons/list-add.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remove directory</p></body></html> Remove :/icons/list-remove.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move up</p></body></html> Up :/icons/arrow-up.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move down</p></body></html> Down :/icons/arrow-down.png Qt::Horizontal 342 26 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() SettingsDialog accept() 227 311 157 274 buttonBox rejected() SettingsDialog reject() 295 317 286 274 reformatListsBox toggled(bool) reformatTranslationsWarningLabel setVisible(bool) 55 43 48 86 qstardict-qstardict-1.3/plugins/stardict/stardict-meta.h.in000066400000000000000000000004421323166163100241660ustar00rootroot00000000000000#ifndef STARDICT_META_H #define STARDICT_META_H #define PLUGIN_ID \"$$TARGET\" #define PLUGIN_NAME \"$$META_NAME\" #define PLUGIN_VERSION \"$$VERSION\" #define PLUGIN_DESCRIPTION \"$$META_DESC\" #define PLUGIN_AUTHORS \"$$META_AUTHORS\" #define PLUGIN_FEATURES \"$$META_FEATURES\" #endif qstardict-qstardict-1.3/plugins/stardict/stardict.cpp000066400000000000000000000300401323166163100231650ustar00rootroot00000000000000/***************************************************************************** * stardict.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "stardict.h" #include #include #include #include #include #include #include #include #include #include #include "lib.h" #include "file.hpp" #include "settingsdialog.h" #include "../pluginserver.h" #include #if QT_VERSION < QT_VERSION_CHECK(5,0,0) #include "stardict-meta.h" #endif namespace { void xdxf2html(QString &str); QString whereDict(const QString &name, const QStringList &dictDirs); const int MaxFuzzy = 24; class StdList: public std::list { public: StdList() : std::list() { } StdList(const QList &list) : std::list() { for (QList::const_iterator i = list.begin(); i != list.end(); ++i) push_back(i->toUtf8().data()); } StdList(const std::list &list) : std::list(list) { } QStringList toStringList() const { QStringList list; for (const_iterator i = begin(); i != end(); ++i) list << QString::fromUtf8(i->c_str()); return list; } }; class IfoListSetter { public: IfoListSetter(QStringList *list) : m_list(list) { } void operator ()(const std::string &filename, bool) { DictInfo info; if (info.load_from_ifo_file(filename, false)) m_list->push_back(QString::fromUtf8(info.bookname.c_str())); } private: QStringList *m_list; }; class IfoFileFinder { public: IfoFileFinder(const QString &name, QString *filename) : m_name(name.toUtf8().data()), m_filename(filename) { } void operator()(const std::string &filename, bool) { DictInfo info; if (info.load_from_ifo_file(filename, false) && info.bookname == m_name) { *m_filename = QString::fromUtf8(filename.c_str()); } } private: std::string m_name; QString *m_filename; }; } StarDict::StarDict(QObject *parent) : QObject(parent) { m_sdLibs = new Libs; QSettings settings("qstardict","qstardict"); m_dictDirs = settings.value("StarDict/dictDirs", m_dictDirs).toStringList(); m_reformatLists = settings.value("StarDict/reformatLists", true).toBool(); m_expandAbbreviations = settings.value("StarDict/expandAbbreviations", true).toBool(); if (m_dictDirs.isEmpty()) { #ifdef Q_OS_UNIX m_dictDirs << "/usr/share/stardict/dic"; #else m_dictDirs << QCoreApplication::applicationDirPath() + "/dic"; #endif // Q_OS_UNIX m_dictDirs << QDir::homePath() + "/.stardict/dic"; } } StarDict::~StarDict() { QSettings settings("qstardict","qstardict"); settings.setValue("StarDict/dictDirs", m_dictDirs); settings.setValue("StarDict/reformatLists", m_reformatLists); settings.setValue("StarDict/expandAbbreviations", m_expandAbbreviations); delete m_sdLibs; } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata StarDict::metadata() const { QStarDict::PluginMetadata md; md.id = PLUGIN_ID; md.name = QString::fromUtf8(PLUGIN_NAME); md.version = PLUGIN_VERSION; md.description = PLUGIN_DESCRIPTION; md.authors = QString::fromUtf8(PLUGIN_AUTHORS).split(';', QString::SkipEmptyParts); md.features = QString::fromLatin1(PLUGIN_FEATURES).split(';', QString::SkipEmptyParts); md.icon = QIcon(":/icons/logo.png"); return md; } #else QIcon StarDict::pluginIcon() const { return QIcon(":/icons/logo.png"); } #endif QStringList StarDict::availableDicts() const { QStringList result; IfoListSetter setter(&result); for_each_file(StdList(m_dictDirs), ".ifo", StdList(), StdList(), setter); return result; } void StarDict::setLoadedDicts(const QStringList &loadedDicts) { QStringList available = availableDicts(); StdList disabled; for (QStringList::const_iterator i = available.begin(); i != available.end(); ++i) { if (! loadedDicts.contains(*i)) disabled.push_back(i->toUtf8().data()); } m_sdLibs->reload(StdList(m_dictDirs), StdList(loadedDicts), disabled); m_loadedDicts.clear(); for (int i = 0; i < m_sdLibs->ndicts(); ++i) m_loadedDicts[QString::fromUtf8(m_sdLibs->dict_name(i).c_str())] = i; } StarDict::DictInfo StarDict::dictInfo(const QString &dict) { ::DictInfo nativeInfo; nativeInfo.wordcount = 0; if (! nativeInfo.load_from_ifo_file(whereDict(dict, m_dictDirs).toUtf8().data(), false)) { return DictInfo(); } QString pluginId = qsd->idForPlugin(this); DictInfo result(pluginId, dict); result.setAuthor(QString::fromUtf8(nativeInfo.author.c_str())); result.setDescription(QString::fromUtf8(nativeInfo.description.c_str())); result.setWordsCount(nativeInfo.wordcount ? static_cast(nativeInfo.wordcount) : -1); return result; } bool StarDict::isTranslatable(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return false; long ind; return m_sdLibs->SimpleLookupWord(word.toUtf8().data(), ind, m_loadedDicts[dict]); } StarDict::Translation StarDict::translate(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return Translation(); if (word.isEmpty()) return Translation(); int dictIndex = m_loadedDicts[dict]; long ind; if (! m_sdLibs->SimpleLookupWord(word.toUtf8().data(), ind, m_loadedDicts[dict])) return Translation(); return Translation(QString::fromUtf8(m_sdLibs->poGetWord(ind, dictIndex)), QString::fromUtf8(m_sdLibs->dict_name(dictIndex).c_str()), parseData(m_sdLibs->poGetWordData(ind, dictIndex), dictIndex, true, m_reformatLists, m_expandAbbreviations)); } QStringList StarDict::findSimilarWords(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return QStringList(); gchar *fuzzy_res[MaxFuzzy]; if (! m_sdLibs->LookupWithFuzzy(word.toUtf8().data(), fuzzy_res, MaxFuzzy, m_loadedDicts[dict])) return QStringList(); QStringList result; for (gchar **p = fuzzy_res, **end = fuzzy_res + MaxFuzzy; p != end && *p; ++p) { result << QString::fromUtf8(*p); g_free(*p); } return result; } int StarDict::execSettingsDialog(QWidget *parent) { ::SettingsDialog dialog(this, parent); return dialog.exec(); } QString StarDict::parseData(const char *data, int dictIndex, bool htmlSpaces, bool reformatLists, bool expandAbbreviations) { QString result; quint32 dataSize = *reinterpret_cast(data); const char *dataEnd = data + dataSize; const char *ptr = data + sizeof(quint32); while (ptr < dataEnd) { switch (*ptr++) { case 'm': case 'l': case 'g': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; result += str; break; } case 'x': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; xdxf2html(str); result += str; break; } case 't': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; result += ""; result += str; result += ""; break; } case 'y': { ptr += strlen(ptr) + 1; break; } case 'W': case 'P': { ptr += *reinterpret_cast(ptr) + sizeof(quint32); break; } default: ; // nothing } } if (expandAbbreviations) { QRegExp regExp("_\\S+[\\.:]"); int pos = 0; while ((pos = regExp.indexIn(result, pos)) != -1) { long ind; if (m_sdLibs->SimpleLookupWord(result.mid(pos, regExp.matchedLength()).toUtf8().data(), ind, dictIndex)) { QString expanded = ""; expanded += parseData(m_sdLibs->poGetWordData(ind, dictIndex)); if (result[pos + regExp.matchedLength() - 1] == ':') expanded += ':'; expanded += ""; result.replace(pos, regExp.matchedLength(), expanded); pos += expanded.length(); } else pos += regExp.matchedLength(); } } if (reformatLists) { int pos = 0; QStack openedLists; while (pos < result.length()) { if (result[pos].isDigit()) { int n = 0; while (result[pos + n].isDigit()) ++n; pos += n; if (result[pos] == '&' && result.mid(pos + 1, 3) == "gt;") result.replace(pos, 4, ">"); QChar marker = result[pos]; QString replacement; if (marker == '>' || marker == '.' || marker == ')') { if (n == 1 && result[pos - 1] == '1') // open new list { if (openedLists.contains(marker)) { replacement = ""; while (openedLists.size() && openedLists.top() != marker) { replacement += ""; openedLists.pop(); } } openedLists.push(marker); replacement += "
    "; } else { while (openedLists.size() && openedLists.top() != marker) { replacement += "
"; openedLists.pop(); } replacement += ""; } replacement += "
  • "; pos -= n; n += pos; while (result[pos - 1].isSpace()) --pos; while (result[n + 1].isSpace()) ++n; result.replace(pos, n - pos + 1, replacement); pos += replacement.length(); } else ++pos; } else ++pos; } while (openedLists.size()) { result += "
  • "; openedLists.pop(); } } if (htmlSpaces) { int n = 0; while (result[n].isSpace()) ++n; result.remove(0, n); n = 0; while (result[result.length() - 1 - n].isSpace()) ++n; result.remove(result.length() - n, n); for (int pos = 0; pos < result.length();) { switch (result[pos].toLatin1()) { case '[': result.insert(pos, ""); pos += 28 + 1; // sizeof "" + 1 break; case ']': result.insert(pos + 1, ""); pos += 7 + 1; // sizeof "" + 1 break; case '\t': result.insert(pos, "    "); pos += 24 + 1; // sizeof "    " + 1 break; case '\n': { int count = 1; n = 1; while (result[pos + n].isSpace()) { if (result[pos + n] == '\n') ++count; ++n; } if (count > 1) result.replace(pos, n, "

    "); else result.replace(pos, n, "
    "); break; } default: ++pos; } } } return result; } namespace { QString whereDict(const QString &name, const QStringList &dictDirs) { QString filename; IfoFileFinder finder(name, &filename); for_each_file(StdList(dictDirs), ".ifo", StdList(), StdList(), finder); return filename; } void xdxf2html(QString &str) { str.replace("", ""); str.replace("", "["); str.replace("", "]"); str.replace("", ""); str.replace(QRegExp(".*<\\/k>"), ""); str.replace(QRegExp("(<\\/abr>)|(<\\ex>)"), " #include #include class StarDict: public QObject, public QStarDict::BasePlugin, public QStarDict::DictPlugin, public QStarDict::ConfigurablePlugin { Q_OBJECT #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.StarDictPlugin/1.0" FILE "stardict.json") #endif Q_INTERFACES(QStarDict::BasePlugin QStarDict::DictPlugin QStarDict::ConfigurablePlugin) public: StarDict(QObject *parent = 0); ~StarDict(); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata metadata() const; #else QIcon pluginIcon() const; #endif Features features() const { return Features(SearchSimilar); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &loadedDicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); virtual QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); friend class SettingsDialog; private: QString parseData(const char *data, int dictIndex = -1, bool htmlSpaces = false, bool reformatLists = false, bool expandAbbreviations = false); Libs *m_sdLibs; QStringList m_dictDirs; QHash m_loadedDicts; bool m_reformatLists; bool m_expandAbbreviations; }; #endif // STARDICT_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/stardict/stardict.json.in000066400000000000000000000002751323166163100237700ustar00rootroot00000000000000{ \"id\": \"$$TARGET\", \"name\": \"$$META_NAME\", \"version\" : \"$$VERSION\", \"description\": \"$$META_DESC\", \"authors\": \"$$META_AUTHORS\", \"features\": \"$$META_FEATURES\" } qstardict-qstardict-1.3/plugins/stardict/stardict.pro000066400000000000000000000037341323166163100232150ustar00rootroot00000000000000############################################################################# # stardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = stardict META_VERSION = 1.0 META_NAME = StarDict META_DESC = The StarDict plugin META_AUTHORS = Hu Zheng ;Opera Wang ;Alexander Rodin META_FEATURES = dict;defenable include(../plugin.pri) win32:CONFIG += plugin HEADERS += \ stardict.h \ dictziplib.hpp \ distance.h \ file.hpp \ lib.h \ mapfile.hpp \ settingsdialog.h SOURCES += \ stardict.cpp \ dictziplib.cpp \ distance.cpp \ lib.cpp \ settingsdialog.cpp FORMS += \ settingsdialog.ui RESOURCES += \ pixmaps/pixmaps.qrc qstardict-qstardict-1.3/plugins/swac/000077500000000000000000000000001323166163100177675ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/swac/pixmaps/000077500000000000000000000000001323166163100214505ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/swac/pixmaps/pixmaps.qrc000066400000000000000000000001361323166163100236400ustar00rootroot00000000000000 sound.png qstardict-qstardict-1.3/plugins/swac/pixmaps/sound.png000077500000000000000000000014571323166163100233200ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDùC» pHYsHHFÉk>¡IDAT8Ë“_H•wÇ?Ïïõ„ˆ”i¹iVÚtÓ.ì,ZaTm¯‹Pº˜]lm¬Ñ`«íjƒkÐ?ºˆ­@¢"ZŽ‚ÚJ/²´ð„S°“Ø9y<ç}ßóž÷» “ˆØð <ðüáûð|¿Æв± d g‹Á‹¿à沃ÈÈš,æ=d%Í›ºfK/ãÛç ¿jYíëë“£2SÓÙ+7úg›çcìšFò/1Øÿã)††G*6¯}ÿ»ÖÞþ©¦º²¡{û6ÌH˜i=Æ"à0²vŒ]föâ„Ï¿?ÊÐðHEÇ–ÖCM u;ËËJç9³ÄÖ®/ÞAjL_ FÁ§‚F ‰{Cà ·lXs¨~iíN̹ÌT®üòõ;Å¢22ÛƒÌ!Æ vü)¬Øà®ö%Ù{ðXÇGm­g—ÔTïx~P 燉ÉôÔîD‰×h0 |‚q[°F♉Àà]·bùR*+¬ªª\¸.‰|PÀ …ˆ8V™sÖ$1Ži¹¤4hþóïù‚E.Íá‡r~ˆDøáLa„Y Ì°à CÑó<çnõÝelËæü°€™Ë65,ù¬Ç°3ˆ~™V “lXÞÄÐóË~Þz£> * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "swac.h" #include #include #include #include #include #include #if QT_VERSION < QT_VERSION_CHECK(5,0,0) #include "swac-meta.h" #endif Swac::Swac(QObject *parent) : QObject(parent) { db = new QSqlDatabase(); *db = QSqlDatabase::addDatabase("QSQLITE", QLatin1String("swac")); db->setDatabaseName(QDir::homePath() + "/.swac/swac.db"); db->open(); } Swac::~Swac() { db->close(); delete db; QSqlDatabase::removeDatabase("swac"); } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata Swac::metadata() const { QStarDict::PluginMetadata md; md.id = PLUGIN_ID; md.name = QString::fromUtf8(PLUGIN_NAME); md.version = PLUGIN_VERSION; md.description = PLUGIN_DESCRIPTION; md.authors = QString::fromUtf8(PLUGIN_AUTHORS).split(';', QString::SkipEmptyParts); md.features = QString::fromLatin1(PLUGIN_FEATURES).split(';', QString::SkipEmptyParts); return md; } #else QIcon Swac::pluginIcon() const { return QIcon(); } #endif QStringList Swac::availableDicts() const { QStringList result; QSqlQuery query = db->exec("SELECT packid FROM packages;"); while (query.next()) { result << query.value(0).toString(); } return result; } void Swac::setLoadedDicts(const QStringList &dicts) { QStringList available = Swac::availableDicts(); m_loadedDicts.clear(); for (QStringList::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { if (available.contains(*i)) m_loadedDicts << *i; } } Swac::DictInfo Swac::dictInfo(const QString &dict) { QSqlQuery query = db->exec("SELECT name, format, version, organization, readme FROM packages WHERE packid = \'" + dict + "\' LIMIT 1;"); if (query.first()) return DictInfo(query.value(0).toString(), dict, query.value(3).toString(), "

    " + query.value(4).toString() + "
    "); else return DictInfo("", dict, "", ""); } QSqlQuery Swac::search(const QString &dict, const QString &word, const QString &fields, const int limit) { QSqlQuery query(*db); query.prepare( "SELECT " + fields + " " + "FROM alphaidx" + " " + "INNER JOIN sounds ON alphaidx.sounds_idx = sounds.idx " + "INNER JOIN packages ON sounds.packages_idx = packages.idx " + "WHERE packages.packid = ?1 AND alphaidx.str = ?2 " + "LIMIT " + QString::number(limit) +";" ); query.addBindValue(dict); query.addBindValue(word); query.exec(); return query; } bool Swac::isTranslatable(const QString &dict, const QString &word) { QSqlQuery query = search(dict, word, "SWAC_TEXT", 1); return query.first(); } Swac::Translation Swac::translate(const QString &dict, const QString &word) { QSqlQuery query = search(dict, word, "SWAC_TEXT, packages.path, filename, SWAC_SPEAK_NAME", 128); QString article(""); int i = 0; while (query.next()) { if (i > 0) article += "
    \n"; article += "   " + query.value(0).toString() + ""; i++; } return Translation(word, dict, article); } QStringList Swac::findSimilarWords(const QString &dict, const QString &word) { Q_UNUSED(dict) Q_UNUSED(word) return QStringList(); } int Swac::execSettingsDialog(QWidget *parent) { return QMessageBox::information(parent, "SWAC Plugin for QStarDict", "To install new packages, please, use the swac-get command line program.\n" "More information about swac-get is available on Shtooka Project Homepage." ); } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(swac, Swac) #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/plugins/swac/swac.h000066400000000000000000000056721323166163100211070ustar00rootroot00000000000000/***************************************************************************** * This file is a part of QStarDict, a StarDict clone written using Qt * * swac.cpp - Plugin for words audio collections SWAC * * Copyright (C) 2008 Nicolas Vion * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SWAC_H #define SWAC_H #include "../dictplugin.h" #include "../metadata.h" #include #include class Swac: public QObject, public QStarDict::BasePlugin, public QStarDict::DictPlugin, public QStarDict::ConfigurablePlugin { Q_OBJECT #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.DictPlugin/1.0" FILE "swac.json") #endif Q_INTERFACES(QStarDict::BasePlugin QStarDict::DictPlugin QStarDict::ConfigurablePlugin) public: Swac(QObject *parent = 0); ~Swac(); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata metadata() const; #else QIcon pluginIcon() const; #endif Features features() const { return Features(SearchSimilar); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts; } void setLoadedDicts(const QStringList &dicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); // friend class SettingsDialog; private: QSqlQuery search(const QString &dict, const QString &word, const QString &fields, const int limit); QSqlDatabase *db; QStringList m_loadedDicts; }; #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/plugins/swac/swac.json.in000066400000000000000000000002751323166163100222300ustar00rootroot00000000000000{ \"id\": \"$$TARGET\", \"name\": \"$$META_NAME\", \"version\" : \"$$VERSION\", \"description\": \"$$META_DESC\", \"authors\": \"$$META_AUTHORS\", \"features\": \"$$META_FEATURES\" } qstardict-qstardict-1.3/plugins/swac/swac.pro000066400000000000000000000037641323166163100214600ustar00rootroot00000000000000############################################################################# # swac.pro # # This file is a part of QStarDict, a StarDict clone written with using Qt # # swac.cpp - Plugin for words audio collections SWAC # # Copyright (C) 2008 Nicolas Vion # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = swac META_VERSION = 0.2 META_NAME = swac META_DESC = "An experimental plugin for words audio collections (SWAC).
    For more information about SWAC, please, visit the Shtooka Project Homepage." META_AUTHORS = Nicolas Vion META_FEATURES = dict;defenable include(../plugin.pri) QT += sql HEADERS += \ swac.h SOURCES += \ swac.cpp RESOURCES += \ pixmaps/pixmaps.qrc OTHER_FILES += \ swac.json qstardict-qstardict-1.3/plugins/trayplugin.h000066400000000000000000000052341323166163100214050ustar00rootroot00000000000000/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2016 Sergey Ilinykh * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef TRAYPLUGIN_H #define TRAYPLUGIN_H #include #include #include #include #include #include "baseplugin.h" #include namespace QStarDict { /** * This is a base class for all tray plugins classes. */ class TrayIconPlugin { public: enum TrayCompat { CompatNone, CompatFallback, CompatFull }; enum Feature { None = 0x0, ClipoardTranslate = 0x1 }; Q_DECLARE_FLAGS(Features, Feature) virtual ~TrayIconPlugin() {} virtual TrayCompat isDECompatible() = 0; virtual void initTray() = 0; virtual void uninitTray() = 0; virtual Features features() const = 0; virtual void setContextMenu(QMenu *menu) = 0; virtual void setMainWindow(QWidget *w) = 0; virtual void setScanEnabled(bool enabled) = 0; virtual void setVisible(bool visible) = 0; virtual bool isVisible() const = 0; /* Possible signals: * void translateClipboard(); */ }; } // namespace QStarDict Q_DECLARE_OPERATORS_FOR_FLAGS(QStarDict::TrayIconPlugin::Features) Q_DECLARE_INTERFACE(QStarDict::TrayIconPlugin, "org.qstardict.TrayIconPlugin/1.1") #endif // TRAYPLUGIN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/web/000077500000000000000000000000001323166163100176075ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/web/adddictionarydialog.ui000066400000000000000000000066241323166163100241540ustar00rootroot00000000000000 AddDictionaryDialog 0 0 377 238 Add dictionary Name: Author: Description: HTTP query: <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The '%s' template will be replace to word.</p></body></html> HTML charset: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() AddDictionaryDialog accept() 227 217 157 237 buttonBox rejected() AddDictionaryDialog reject() 295 223 286 237 qstardict-qstardict-1.3/plugins/web/pixmaps/000077500000000000000000000000001323166163100212705ustar00rootroot00000000000000qstardict-qstardict-1.3/plugins/web/pixmaps/edit.png000066400000000000000000000172161323166163100227320ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ ,3$[IDATxÚíy|SeºÇïYrN’“¤{ ¥@…ÂȰ:£âŒ:£×aTdæ¢2.è¸ ã½:#êÈèE@á:Š#ŠŒË•]qap”Å…µ…ÒºÐBWº¥IÎvÿÈ9! i›¤'iKû~>/I›7)É÷Ùßç¼úFßè}£oôÒA"\Oà´I÷}|]>dnm*Ѽáz@–6Í}Ÿ—VeÚl§\ ±ïóïòQ¯ÝVÅKhMó$÷}þÝb˜;㎩¾Ï¯w¦³/ ªê}cFñ„LêÌóû,@Ÿ0fT×ÔÀãñø2KBt?œŸBH°„·ûs8‘à?ÒV.LHø93‰,ƒ&B£i‚ t/ðxÄá~f‘þÜà(À‡=Rà¤}[m\ò¯(ÝÏt¤é±Ðú¨ÁÄrsáÁŽLëã>jèa'½AÂñ÷‘À¹-ˆíþ¾n Rà$|-¹ \ØÆi}4à#‚© èn K]@§´Þ@ðá@Öç“Þ"Õt d£­A8Gkz ajzÇ&?L£À=. ø™jÏwQÀ7ÂD>èÑ'V© Èt˜ëG¢õ±.ôH-B,\ªvG¾ÑZß!ø}?1 x jj b‰¸º€háGâÿÂkD@h´Uè"—Ðe. 3n R­'Qj{$~ŸD¯1½Ë´ 5Žn€D =à­¶Ç¿§º€N[‚ ßÇ|¤. –¼‘¯C`\äo˜@DèÂu¤sÓeæ?†. JøQB&ál¬‘Ö Ö¡ÁÕĸ€Èá­õÑ€ï4t#¬B ÆèŒ´¹#øQAŽ|~?æZ­ª=C: ?b ‘èÈ÷G[õ#±N ªÛÃ'$2ðƒÔáïý#!;pàÀ¹ÇýÖ´ J_ôœîê˜X¼h,b€XùÿP`$YÆ·OAVÖ`Œ7®CÍ$Æ|h=ßßh7 x‚={vã¾»oƒGT°ví?C®‰ÆX Go‹:„%xxlúƒX¾bDIÁêÕ¨È izš 0¾aZßx ¨¨Sn¾Ç Ê?¹âRLúÕ¯ÂÎbêÔØ¶…ÄäÒ°¨Ý@ðCy$k h ^x?ÿc|»ÍŒ÷׬o;p à…—t4ýÞSÀlc}¯‰¢Òð0Ü€ËåÂË/<‰Û6¡©Åí[òàƒDZZZÔ~Ÿô°®`*¦ðƒ~[Ö¡ ­ï(Õ;|èλ×=‹g»Ón ’‰™OÍ‚Çã$IP4óK"ÐîÎ~~±ÒôØÇÑÀîd ¶¹×î*Š‚·—¼„$ò®ù±P< +~wÇOQvFÂOŸ§Ó –eÁ²¬÷é4ѪF[…X c úÇ ¾n ´¤+Þš…kÄ‚¨*Ù ÆdË9 R\ö“0räHH’†a42¤·^Ò)øŒH¹úÚ5Ëà¬Ü‚ —1ÝõP¡‚á`ùD˜Ì)XûéqÜ2õqȲìƒNQ”o^HÀc[ˆ1üHµ¾¾¾Kþ6 WLÙ€§µ¼àù$˜Ì)¨¬²r®Ã0 i4MƒaYÐ4Ý&üž=&A`ÌàûpáXýw_lÝ‚µïÎÀõãi0¨ƒÛY U•Àp˜Ì)0YÒÀYÒ°ùËRŒ3 À5™`2™ÀhðCùþ ~ׯ¡È0c€öL~kk+–¼þÆd·âÒòp·œ†§µ„Ð`Í©à,©>ø;÷•áªk&‚5™Àó<8“Ég "õý}Ivì(Ü€èiÆ®•0”)…§érïšÎ*P “9œ%]ƒŸ™8pòôIŒøQ,f3xž«™~=è #¦A`԰Äïÿ³,¹±wÝ$ðÒðÛUýùnpÖ pÖ ˜,éødó×1b, ,‹~¨À/Ú*^¯Ë:jðˆ | ø«™8}ô=@z2×6^„üÕÏ:rËál®èlÚ² —¿ f³V«Õgúé6"ÿp¡÷ú4°Ý /ð Á‰=AÙÑu™~è—ÂâÍÍC±7W øûc.NÅÓwµ`´ðêŠ×àdÅY¤¤¤Àjµz#Ž‹Øï_Hé`¬¢ÂÐÞcù|§¾Žò¼5 J3ÒíX¶ãøâ[wÀkŽúA:^}|Ò„ Ȳ„²¢Ý¸üò+`µZa±XÀq\ØÚ!h{Ì€„«Ýjz0ü3ÇVàÄ· ¹ýe|òÝ|¼Óð²9Ù)øÛÌqH¦ö@Uãå,<3`±X`ÖÒ>ßß´=®A`¸~?RøUëQ´ï%€MAZ¢Š­G‡aÕæÀ£ò H›ù’Ä „ÂÉÓºþ « ý&“©MíxNsH³[‚"ñû‘X‚³¥Ÿ£pÛ@zª ûŠãͶ¼Lÿô¼ûÒ­Hn^š1¡¤ÒƒÕ"1%V«5@ûi¶z{z*hx–ßÂ4T|üO€~ˆþi6䟀WÂOI¶cék÷!©yX–Eùi'¶”=ÞšêËùÛóýFåÿ=Ém_jC:* ·¿¥æ ò6O…"‹ÈHaQR7sÞ „Ÿà°òÍGÒ4ÇáTåY|R4 Ö„ xÿ¢?|#:yú‚ÀhM}{–€³>y[þ Œm²ÒdÔ830ãµ–€fY‹ÅŒ•ŸÔ¦¿‚ç€ÓgêñÁ±»Á Y‚ Àn·C_Ù·³U¿ %+  ×þN ƒÿp7—!oó]P) R¸b4ˆñ‡[ û–n2±Xõ÷'ѯõeXxÕÕµX{ø6˜„lØl6Øív$$$Àn·Ãjµúòþööû{K Àx ОéÐï{Z«÷ùƒ ¦ ò ÁŠim…(Ÿ[CÓ4–½ù$*oÀʵ¢¶º «÷Ok?!!‚ œWóïÍà:Òö,äiÀ‘O§@–)$&X ªY¸÷™V¸<@ÞYô†q+ ÐgQ[S…ßNmÿ!A€Ãု›þP‘¼ý{g_S힇Dµ/ áú}YjAîg·ƒ˜2‘Iï¡ÓpÇ3šƒ¾ï—ÿ„Ñ A •¨¯;ƒUßü(Û8|]l6[€ß×ì¾; Pì³€(ý¾"»‘ÿÅ €G‚¥&*wÍWPß(ñ¯<7—õß«R€³õÕX³ï§Ì—A°X`·Û}ðív»/òÄì÷¦¬Àø 0JÓ¯*Žn¹ _"ÁaE"“i €Ê9à)ÏΚ†«sÁ*@SÓY|ðÝ8´˜®„¥øáìôõƬ€1Ø6E$ >øª‚ã;ÇÙòmÚÏ õ xÕ›;~äÜøãjXœ_ÁÙ*â_ßE ®…`±Àf³ùà;_Õ/ø½­›:@9¾†E_=g}1Œü¬ŽþxlIòŠáÿ÷ý¿Æí×q0;?ƒËCaëÁd”Š7ÀÒ|ÿ?£!^(YKíÇôŸÜû Ø‘š@$ÿ ³—fà›\gÀò»n›€i·ßøˆŠ »s)mú5Ìf³¯È£ÃÁ×å Í¿ÐÒÁ˜fY‚²ï_BmÉVd$´@8<ÿ~¶}Ûð¼ÿœx»ÿRp5¯A$)8p´ßTO…Ùb>/ݳÙl¾.ŸŽ =ñ¼¾ÏÈ×S >/Àø~€0MeîÛ(û~22/†]à±äc+6~ÿºk.ÅìÇnWûd&¹ÇʰýÔàxo;W¨ /Ü=þxÂ7r;×h —, ØôW¬Eñ׳‘•ÜŒDùS¬Ü*`õgµK¯¸lžŸ=\Õ+PMÙÈ?–‡-'ïk _ßæí(Ý‹¦çïBÎ bsBH;Ú_wòSԜ،"9%¾‰%ë«ÖŒ™ƒ×^x¦ªAÌ9(*8€·5YÏ úô¿ôµç÷ãQì½]ÁahCùvîü’\ Gb¶æÂ‚¥g–å „·ý¸3 @[‡¡´p>8òŸ`9¯–Güz™·«á÷ÔàŠ—ö7ùy›¦ ‰+…­z&öP˜½øtÀs³ôÇÊ·ç‚«~ ´0Å{°æû@›Àó|Hø‹¥Ãt/’ `oË ¨xh¿³>G6þ ÉB ú§Û‘W3¼X°&==k—?¾f!Xa8ªJö`ÅÞŸâRÀó¼/ÝÓëüþšéO_:ë,Àÿj݆"þx"Ì ÈêgGiË8<0¿2 ¡#))ëW¾KÝ0Ù†£¶|/–îüˆ)ǵñ‡ÓÓ¤x†]“tM@îæS8òÉDXé* Ê´¡Zƒ»æT4tØl6üsõBØßç†úò]x÷‹¨¦Lð|ÿݽH6xbßÈ¡ªjØy½ªª?øç.€`í]58²q"X¹  ¶¡‰ŒÆmO({ŽÙlÆúU¯"ѵ\B*÷à­MéMƒÀ™L¾ ÿJŸÞÕcDÐoø¡`G]Ø!Ä¢PL,€ìiÄ‘On‚ê,À°!<¦bÊŒj´ºÏý‡Y–Åê¥ AþÞ1•»±äcDÓPp&“/↯wõÄ ~´Ç’¡p^é­›€,9‘÷éd¸ÏƨŠùbLyò,[νQš¦ñÞ’yȶ~ ^ÈBsÕ·Xò¡¢iX–õEüÁ-]ÑvõÄ30ÔÍzì€Àˆo6TEıM·¡ñôŒû´0 ·ÌlFu}àžþ¯<…‘ý `±öGKÍ÷xgC\ìå`Æ·Áª¥+œˆß(íFÀ:ßž´%mý?Tt³@Ueÿ÷=8[þÆ·À$ ÅÔy"NUKëÌ{ã‡×ÃlN„³>K7 \ –aÀóüyAŸÍfóÕøu¿k­Ž~[@ƒï‡”pÀ?Q!ÝÆ¨(Üþ jO|Œ±ÃÍ0;²ñ»€ã%l>5ã^ür¼ ¼I…«±k>üÕÊ/À0 8Žk³«'ÜN^#¶~Òü¶ &é>àØ¶GPu|5Æ ãaq ÄôE<ä7¬yhÚÍøÍõYà™V¸›JññÆm(óLMÓ0ùEü¡r}£L¿‘a{õ[EQÚ„®øÿ¿ü7˜(†|‘µÊ{')üjJ÷/˜V{&f¾ãÀ®ýõ‹ïœr~ç¥àɸg°õߟ"¯a"h†‚É/â.óê'wuæè£søPðÛßžtNhݨ‰™(À+úüãÍ]¼w>Fç˜`ud๵éØüuàÎÞ.ÇŸºfµ¢«{vlÀ¾Ó“@1l›ðõtíàÄή0ýíôŽ(Šâ÷˜Úé'”ŸEŸ2ÈDå]ãÖ˜ÄͨÔ{oÄÅ7ýãG eas¤cÑ¿bý–ÀÍ+ÇÂü™w‚WŽC›qxï?°­dŤ¥{V«Õí·tuÇt¯-í÷,Áɲb7²÷é2 þÂýìbÂr Dèq;ÔðÄÕüözŒ¸ýZ\5j(›=Ëwäàÿ6”¬;z(þö×ÿ/†,»qôÛUØxlÅù‚¾¶Ê¼á´t¥ýáZ‡Pšïß ‚,ËAS[«jkíµC ¥\I@( ´‰ÍÒ€$áðáC«TÄU¦ßŠËn_B›#ïWW”¬>4 o½ú(xi?TEAÑ÷Ëñá‘IP ïËõõ O×~ÿ ¯;ÕÚ|ÐÁàõ)I’6Ï €¿vÁÛ7)ÖlaÍ Š„Ò¢‚ƒ¿ùÕMP@Ž‹¼õ®ÌJÅÌ‘ÚîHÅŠÏ- ו8ü×d HDz7Ÿ€Uúpòà2¬?4 ±€aŸßo ~$çõÅCûÃ…ßxQ” Éd)È (2E…ª ´8ÀOô#k EÀYì`¬v¨î”–•VßwÏ=¿nmm­ Æ%Üô .ƒŠ#³;RñÑnkÃÂutüÔ”D¬ywlònB£,w9Ö¸ eCQéžîóýƒ¾`øÝa¿½­|¾-ð²,CEˆ¢èI‚¬YI’4ø ¿8@ñ2¿]>Š¢@Ó4x›»RC ªkªZ^}ùÕÿ8qâDegá‡-Ÿ¿‚QŠŠÙý`·'¤bÇ[í¼eT²ÿ‡Ã†õËž†CÞ B³¨È[†u&Ae’Á–e½e^-â†oTc‡‘Úß–Ý«õ2DÑãI‚ä»õ‚÷ €Ÿ+ðj¿D*  €¡i*É)p8ìhmªCm}¸vÍÚë?úè£|#à‡%›^ÁPEÅgý’‘šššŒÜ2û©'S™þîŠç9¬_ö4’Ô/AÑ&Tå¯Ä?ߕͣª`´2¯ HÔÌ~ð•»Ýá²íöÀw _‚Ç#žQ:'’hdÙgTUôïEÁ04Ì‚€Ì¬,Ðhjj@m]­²ýËS/^¼Ï(ø À§/`Q±9A@æ€þI¨<›xbÚ Èöoè ië–>tj†AMáûøàðD(lhUEQày‹ HLL ñyZ—‘¾?p³«mïñxÀã}¿µ[Y’ É2$Qôúxµß?ÚOKMÅ Aƒ V´´´ ©©µuµ8xàÀÿ<3û™Œ„ß®|úRi›8 ”€fOÒ‰[çÈÙ’Ì|«ßž‰–=`Y uÅÿÀ†#¡òCÁ( (Šk2Áb6ìî9˜Í樎iWÔ®ß×5ß;½ðÝ7œ--p¹\ðˆ"YäÓ|*d¨Š EQaæ­4x feÁl6ÃãñÀÏ?–ÿúôéþÍhøm ÀGï>2\¡Ïn¥kWdŽÌ QÉ¥×?î,*\ÀºÅ/ýQùAòŠcTÔøþ%TóКÙ×ý¾Ífó‚÷ƒÏó|Ô>?–Ö!”Ù.ôè·Þ(_×z]ó=hiiFsSZ].HZ ”äKÿ(à-Vdfd`ÐÀè×/ñ{þ9øÅ'Š?X°àű€RÖ®˜7\5gi'$dAfÖU^÷pS¦¨X>¹sïWÆ)¦xVD}ÉF|’{(û¥`„_±GßÛ·ÛípD™îÅS8‚Í~¨Jž¿ö‹¢xÎxDZ[]pº\p67CÃаZ$$8œ’‚þýû#9)I{Moa(üÒ’’]ËÞ[~Oaa¡'ðÏ€÷ææM¬°›³¦s<ÏC’Žä&fPÜrç¹+vg>z‹ò‹qÕÄÂ8q¶ä3lÊ¿LÒÏ Ë²÷[·´|ß¿§/xwϨ‹8b©ýþ¹pm_ôi¿7Ê×S?Û Û É#BQûî½§Í”²=øeåeG¿øbûÍÛ·oo‰| }š¿tZëÙ• ôË%p8¼8iéýÈ!CpèÐ!¸Ýnû,† ³Ù Hrð´èÞŒ¦êíX¸²¢ôµu8úËû¨l†a ª*hšÇó°Z,°Z­´v.ŽãÀú¥{]Qá‹ôo¶µ}+Ë2$ù\eÏWòÕ§G„,{‹@Gb¤ð]ùG§Ì›÷üxÀjæÚ}„\òâûÀòÏ-ò]s]Íy¥\Bii)fÏž#GŽ -- )))iØUz ÖîL¨œ·‡T@Õ;ztŸ¯Í*¬Ú,Ë‚ŽAÀkáµ/IÞ"Ž,Kš MM8EEjJr$ðÅ¢ÂÂ;çΙ¿%^ð€:uº{çí7Á²&Ì\ÜDÿ{_k*Ïó€òòrüýùعí#µ¹¹4MC=O½V¾MV½!,{®±ÃjµÌHš:âYá GÛÛ·²&Ú}­¸#‰^ÍWd Šª 333,ø••rqQÁ´Ù³ŸÙï÷N-_¾ü½·ßYŠ+®p:¨­õÖ‘Ìâå?e¶\šð©(ü5‡Ý ^^üjMm£K“R…ã8|‹ÅAƒïÿeLÝùÐÅŽ6üÀWÃ÷ßÕÓ7{d¢$z7zf³ÉÉÉáÀW ‹ 5kîò®°~Tzzú¢¼¼¼Ò;¾ÄC=hllD}]Þ~梦z¿Î| tÎ:ºàåïÞ³ïà)œk ó €¿è.!ž>?#t —¦¬Èç5zxM¿ *ú÷ï|Í™=óé×»ÊýQgΜi™0aÂ999u‹/ÆäÉ“AA¿þñÀ¬¶êêT©,¼g~Ëïwí.¬ÔÁkSÖ›;ô4/Xó»ƒßïL«w ùW +^øŠ¬ø¶veý¾,k[º@öàÁj~QqÑìY3çüo—~6úíÔ©SÑÜܼ|ûöíéPE45·BQTüüÒj6©¿ølj$`,€D(..þ ÏóPU5@ó½ýkTHñN£)k·(Šp¹Üp¹\p¹]pë÷].¸Ün_ú'ËL¬ ·Ü2ªŠ¶à+…ÓçÌzæ®V¡U«Vm-,,;mÚ´­·Üz»'--‰6¨MNõÁÏö Þ¶#Y×|mJþßÁí0ö„ámÚðîÙ–„ψ(B!;{p{ðÅ¢‚{»üàR°š››[“››;@ê˜1c®9x°êØwÇpÊo¤mJè êðEQ¼`à‡ÌUƒ­¹ÕÛÉ£7vzÃ" *Tdgg·ß]Ptüö9OÍý°»¼W¬žw*š[¨9xðà¬6õÇDM$]ô˶Eåñû Á` ¼ÚNT­ŸOUT(²¢]­›‘‘«Õ"ϯhÎ/È›aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× # fpý˜‡IDATxÚí]{”Å™ÿ}Õ÷Þy?ä5ÃâƒÇâ#A†Q4Y%pâñ‘=Q1Ùl6Fy¸qb¢AÝÝ$&Ù³wÏr4nrö¨˜5FTÆD bâQ“…  Œ30Ìûv}ûÇ}uWW¿îí;3àýæô¹S·úVwÕ÷}¿ïQÕÕ@‰JT¢•¨D%*Q‰JT¢•¨D%ú¸¨ý:kΜiDt:C´ódMРA\cí:pÀa"ð@‡@üfÌŒïúõ¯_Ø[€QJ­­­M&Œ6<—µ0 ;ƒsÝ ^¶}ׯ.b3væà3/¿üòÑ’ŒqöÙ-†¤¿aÂ2"Ì`¸1Ô¢å>e½È6Réò ;˜è©˜)ž|é¥ío• øš>aƵ ,„96¶Q¾ O³ÔŸáeDo2øa14ôÈK/½ôQI"¤3g·µ 7X Q¨Fb¸¥9gÙ~¥ÜÐO â‡wlß¾£$ù“8kNÛåDø€aí¸×9~ öÐò@e‹@¼Êà;v>÷Ü“%AgÝ~ 7ñ…ÀzMM5êÑØÐ€Æ†FÔ××!‘H ¬¬ ñX‰D0883™DÿàqäÈtvv¡³« 8ÖÓŒáéïT’@;Áâ/>÷̳%ð Ymm3%Ó}\–áñx“&NÀä–f477£eR3ªª«<:Jž#b­íééŰÿÀ¼wà<ˆ¡dÒ‹áú2ãY&¾ùÅgŸÝ] µµµÕ€î&`%€XÐ𬲢S§NÅŒiÓpÚ©§"b¨çßà’É!ìÙ³oÿáøãžÿC¿!ûÏmÂàà†íÛ·÷ì`öܹ ˜ŒGüUgÎ0N;õT´Îš…SN>Bww0ÔëÁ$󭔌½ûþ„×_ß={ö@2{£@¶Œ·Ñ Ïþüç/~, µµ5.c‰;‰° Ã/<«ªªÂ¬³>Y³>šššà°îý9f¨HíîcÝØ½û ¼ñûß¡··Ïå|[ ú§2¢UÛ¶møØ@k{û fúO³ý³ÊÊ Ì=ûl´Îš…X,¦×™w­VSh†»_Á4“ص{7^}í5ôõõ{† éßüŠcÆç~ùÄNx˜ÕÞ¾X€Pçž•••aÎìÙ˜ÓÚŠ„jÛý´:D½÷×äãGx ÉÐÐ~»ëuìzýu  úå%þ æÏlÛöü +sÚç‘Áß#BÜ+ 3uêi8áy¨®ªö½K `§ƒÃ>µ&Žò¸ÇžÞ^ìØ¹{öìq=ŸR_$ Xõó'ŸÜr¢ µ¶Ÿ{Öz¥UkjjpÁÂ…8yÊ”w©&]ìµú;^x½½=ÝxeUÎ[¸ãÇÌpt€}ヒ;wâØ±cV¦«Bîyú‰'ÖcŒb_`ùòåFu}ã¿‘ ¯ˆ„ô§¥<}Ú4|æÒ¥ÓØf3ÒŸé¹ÿS•”zpîøå/~îcÝßrh‡Æô3R—²÷b»¾íHÝ;,÷Ą̈«­ÅŒiÓÐÓÛ‹ÎÎNÛËÿ š?uúô1|ç§‹ÍŸX±5ßû¿¢kÜrï†a`Á¹ç`æ_ÏL9P’ÓáÛ[âœÆ³¶ÞîGtuužzê©‚:ðé¥KÑÕÕiJ‡Ö³«Ö§jÔ[ŒX ç-X€ñãÆáåßü¦i:2‹éòW?ýÙË*ªå_zì±ÇÌãRÚæŸ·…Á×¹åÕëjkqÑ…‹1¦±RJŸx\ã÷“ûU'8Õ’d©0T…yÖȬâ…pî„©§†¦1cðü‹/âhw·bÊ2½ ë{’ƒ e—¬$ŠÆü 7‚ð)XKõË y'55á3—.EC}X2XJ0§ÉRJHÉéºô‘©³œc¯çl]ÔÄ’!%CræÈ\?wH)³õÌ쬳ÔKfÔ××cÉE¡©©)•R¶›”i]{éåŸÝX,>Eæ-Xðu¯U;“9ZZZð©K.A"QfÇa”¦G½t­Ïú…2>}Hi¦è0=údm'‘H`ñùçcÒĉ–1ìþ’XsÙW\w\@û‚ó‚Ä&R˜ž9¦žz*.X´†ZöÒêàõ2˸HL€EkYÕzk«ÖKK=g/S/aþ¹çâä)Sl2ìNâ¿\vùåŒjh[´¨B>JD1JÏ’Y=Ü)“'cÞ¼6€‘ê¼)jç+ÃÙy§™ôgM@˜WÏaßz0£µµ-ÍÍY°GH†øïeË–Í•púéËãQ"q’Ðh~ó¤IhŸ×f×X;žc°©hE¹& #:¦û1œmõÒ·̘ÓÚŠ ã'ØMAê¤ÿ±|ùòĨ€ú±‡ï#¢v§ÍN:i,ÎiŸY.§Ñ¦V£]´^ÑxÓÍ1‹Ú8nÉNÔò}É2—7H×g"¡9­­ÛÔäôRåÖ¤ßUpîâÅ ˆÄWr°Ÿ»éêÊ*´·µˆœvZJ°™Ñ;Ã3³ªõÖ„K:jPÍG1qša9†³½Öz‹P˜:†sŽáªP1K"´ÎžÊÊJ—È«®X±â¼Q!‹-*'æPŠl7‹ÅÐ>oâñx;žóŽÝÎZ†ëê£Ø.¼. ·×Ë\¶ÐƒáY°´‹ÅÑ:{6b±˜&{ ƒýûUW]U;≠)b·ñtu6fÏú$jjjÒɶD«9}K%³&çOAÏGQAœÍ-Pªm¶dü”$Û2“¬ÉQªž2§å Ö4Vuu5Î8ýtì~ã ÇÜS’lÞà«#† /> „ÕºÜþä–L?Aãís w¯×Çãj>>j û쨷h¹ÕW±˜k"ÌŠŒ,ãN‡I'iCjøÒ•W^9cÄ@m(ž“–——c挭qj½÷" §V«3gV&çæH›v* ´i¸¬ÀÊ<%kç+ìk{Öd7ƒA”JÔùÔqˆ±!¾ àÒaG€…K–œ¢óí™âÁ™gœÃ0<ì4Û(’õ™3ÛùºÐÏÒ–ÚvdQ2sІ+vÜ¡á.Z®¦»­‡d†0fLŸ}r K¯¼úꋆßHޠƪ"ï7648`Ü&™Ò3«&uL× þüH3AìÆ@%å wBÖ÷-#õuõ˜0~|z¼sQ@ û–/_n › ¸àâ‹?Å sTÇc8å”S²“1êì)Ó¥¬Lç‘ ë¶Õ“vX'·©ÃL9bê“f[aŸíͺEÇ,6ÛgÙnî8;J„É“'ãÿüRšª3|fYUÙe~6,@BÜ™ºQ;ƒ'·´ ‹¥ì%(3…ï:]ªÚv/;®õ´SÁ9»Ìˆv¹SÖçp1êìÆ@f‡]w®"MäaùMºc±X Í“&á½ýïé|§¯å#¡MÀ…—\2Àœ,ü¤¡¨¼¼'Nô.õ‚<5ͪõ´-p«¦UmñwÄ™ÀP°®Øué{~æþ3çç~ðûãÇCYY™Æ‹®½îÚYEGâÆTç$prKs ¶û«.Š`‡Æ²‚:½à\™5XªÆßEXéh]cà ëÄžžB%HwŽlƒDZœ›8a"ö½»Ï¢Ìâ&_(,Y²¤QËÔyëD"1cÆxjt.õkúO—jµÉy¾©^K™]‹2¨F$6 —š…*êùŠæÛÆ Ös„”ö1`)ÑÐЀx<î@AøüÕ+WN(Hø@…“7D”[°é4ôŠ¢(Ѳj·U;ï‚ dÑzV!ê a5¹Ä:ÿÃq)?`èÖ:ZRPŽ«‡±cÇâСCª•0Ì¡kl*ŠÑ ªãf¦¦¦ì œ’§UÒ!dc¸ÎÃc7Ø'‹ a‹Cå–fxA€” ¬“ÛEHËp¶ ®—è°ã 0+Ž%ÐØÐˆÃ‡gCÞL½ ZF›€‹/»l®Îõ764 ‹Ù/l_ÍšDPz!w&ÌÎ-¥f¤ò{%-œ]n½ª¥ì’ì(q€¥Õ (ËÓ–°-·ý)÷Ãlïs ö•q€÷aêêê, n™1<ûúë¯oŽˆh)Á¹=J}}=¤i*«Y݃”íeÒ¤YUE!»º;ž ¢ˆgƒ²y)}÷+°z±jÎÃåI ‹€‘g½q2—­«­Á‘#G”TXàhXJdgX,GeUU †´ Ö{ó*ƒYÇ`—Ù3µ)7[\<€³ÑkÃŽh¶À>9S•ˆÇã0³›UdÍèåA ¸pùò:A˜¯®N©««Õ@t8o^Í£;ÚQÊ^iW°5!dœTÅ;·º5 ¶œ¾vnCY\Âö§Ÿ¬Ëä­æÏ=ÔT×8V`Ñü•+W6E&e(®NùÖ¦ŸÓWí¸tt„õv[ZÅê&zr¶W¦ †Ý.³#Úˆj:Øyo–å"!3£éuXÏ¥t;©Cñ!lcœž)MÕÕ•p>r†Ñ âÕn "”••i'^È ÖƒØqr†C¤ØRö´•T ¥}l§µv^ñU˜5f’t©o÷¤W"Q–Ú%…íÑæx2 ¢Oªv½²¢"-‘Òåq-ò7VÅižÁ °ˆ}ÉÒËÅÍz÷Vž³¾Ùõ¹·€C¥ô.ÅíŠòrô÷÷+9Ì‹ ²`ñÖ+*+-‹$tÌqïk¼¸LM¾ ·ÅÌÑg‚³&ÌæÒª Ö"!`xaŽdYy9lð!@s4Ù÷ð°tÙ²SPïL¸¸XÚth|¬»ûöîÅàÀ@ê©XðA£µ,AKÙ¶6b1Ë@ 𕘽íX,¹ 8ðÞ~7åpM z'|<`ßBå•hÛA”2!šdbÆö+ jüò×¾<í»|÷í‚À ú$,sÒ™+wuu¨­­ufüxoß¾´T¦´2ª¤)94ä¡äátx8v¹øÓž½ÞåýÓ‰Í1mú4-R;Ö“Ú!»_¡åÑ{g(L0ÓÖ¸åGÁÐÐêëë-Ûµ¥>ûúR»d=¿};˜9»+˜¦‰ÞÞÞœ0$“i–¢ÔŽêëëCÒ"@=½=iç3u­îîÜF,%zzz"cüç¯ü€ ÇÊ6gVÈêïïÇᣡ¾>½Q#ƒØ¾"‡ˆ²[»e¨¾¾Ç­¼aåˆ^ÿ¿¶nEÒ4m“QÉ¡$Ž; iš9§Ó±c)àæ‚DãÉ3KHÓDgg'*+*PUU £DQF!”&êííAvõ”ÛÎåé;€c)»û¥‡ó ·¯ƒƒ¨®ªBI¢‚ÁÁAôöõ¦æ]ÛeÅ‹'…âñž ¥,¥ÄÑîî< Qâ]á§dË8zÖ©v?žL(X46‹ú… wãf‰ƒ’u¾ßüí®)•… Y÷ñ r¾Ûs—(ÊÎ z¹³\…—8[¹$ÅO†;×(D)^$¿ýÛJ”ãµà¦tö2E"°>áaß›)ñ/2°#±‹æ¡2ÔÇ”ÚÙÛoÛsÒ<¡U¢hdÀMœOÆÙâõd‰ ^ Àp‡¹(1?R`Óò௼û0 à €SôûÜûG%ŠØ óÊ;¢C€ØoÛÚ!p. $Q‚€}{˜ o6åÃ…ûDû9¤Æ•œÀˆ]@Ф`˜Dá ÁûEˆ `n‰"À¯²µdb>ˆ ïyÙ}í3”•—a`` Î[ Ê à;R>ƒ<ÿ|a¯àY¸h¡ry Ó§¹¼£†€ÊÊŠì<öq÷y“©o,ð;öc¸¥"S7a<Þßÿ>’É¡|ºžËav(†uÍW‰D'ŸrrŠ·!_]k ¹+?aTÎùâ ×}B£ŽáöýÊÐÀ™ÝfäWvvþõ×^x~{a°hÑ"@ëÜVÏ—Z Ï"zC¹÷»Š³å®;;64ž˜H¼â‹=ý 8®~…* Š ²f\‘a^ë!z-÷ë³2ü™ûݤ{–… ¯˜èb?Ø×uÖ²ìßùbæ a`Ø2‚¼‚Þ»œ*õ†": A¿VvopÕr?††‚õ¶DEÄðÂ`݃áJ™xgd/“A&(÷š¹HìxXXGð5 ‘ °¢KX˜/&ý®ODC‰XßÿB¶ '=üðà ¢™„Çûÿ‚—¡Ù Ÿ4ûÞÏ9ºv"ÏÃYvBUwFuî”êòÊíÖïú2¼¯¥WÛÛE€kÖÜ{$:À‚J,Faǽ´#X¦Qç+eŠþ‰¢³ãùºïBléÉ ] , J<ž„ù»“Ÿ‡/ÖÕ£†ÝŽ»„œ†ÛÊX/Û}衇ö ¢ßøÂ:8ò„u¿ïôe¡Y<‰€u¿>3!äØ÷Ǿ)' nÒi- ¢ß¯[×ñVä„ÇÌ-Žã¦“îð«`¨«‘( hãñè`=P™„é[(ˆ‰Ø#IN~ D‰0v<:X´ &=¨GEƒõ®”ûÊãÉGBå7œ¼eË–ƒD´UóŠÖƒ™2r ŠriºnÃôÉ Öýúäóº²"züæ›;>*¤Ef 1][(¬ZÍZ@šµ©àÐ÷ã©å~ãà¯õ¤•üýðì IÝÿÐo ´Ý/%½ö ŽB9KºrÑœÀy"WMÒZîÖÇWÖ¬¹}GØ~åõ¾aˆ™yQÑíxiÖˆÀbÛqk¡Yàùô-/Ø¿oÿÿ4Oi~ƒ€3ƒÂ[ÈÕ¬¡Ó¬®ŽZ„©à ]˜ùËs.ƒ°sÍ­ë·å¥Ìùüè±Ç3‰[È5Vuº„’fUcò\*¢5¾ñ8Bç.|`=ؽIÜžo¿ò~~û¾M÷=Гz& /»ÆËn‰&«ÃUØŽS¡v<zî¶ÛÖ?—ï {s¨[‰iI¦¼ìx‘fÏŠ• ö³ÛÙñð4dn*¤‚vp¸ïîûÞ"à{ùΆ™= fZ\#oX/&1cÓªUëw˜@eùÀz"úS>vœ|ìxàéREØÃëAèí¾¡ …6R°ttXÖÛß½Àßã㻩˜ ðæ†º±ß¸ñƇFâF|à7mÚ¸@‚`úljó ì3@×D5«—/#=Ï<óì»óÏ=ï‡FÌ "´†{*2%™ð½ò¡Ï­¿ùÿ0Ò73ª wóæ»Î2÷X|"ržÀO›BܲîÖuoŽž{…tï½w-f;Á8çÄ`<~'!V­]½öéQxo£—îÙ|×R0¾  õ8µó/üÀ@oò§r” çè§{îÙ0Ÿ ¬$¦Ï!À‹F˜<ÊBlY{ëÚWt:~èþû;“ñk¬0st);^aÆã2¯ÿúúƒÇ‘y:>iã·7Î “—ѧž 1Ü1<;xsQíÙŸ˜}AyYE»ag !Î$B]ÄJÞeJùjr(ùJÿ@ÿ+{ÿøÎ+[·þìCإ̤Ë÷êoŽ+Pge)ßÃòIÊÿºe¸|—ý~éÒ%-“Ožrz]míi±x|lÌ0š„aŒ5H4’Act» 2ËÓ”“CɃɤùÁÀàÀûý½}ï8°ÿmÛžÙÛßßïÇd7ëÊjTþ·~§ÒåÚ‘ €U… £…Ÿr¾‡›€À5¼úÎå L†FËÃ2Ä÷2àÿÒO@ÔAL "nŸa„FD” âŠ.Μ—vû18e€:°Þù^¿wh8åù™ïoóm?l›ê÷VS›Í!_dFØO¿sònßp±çQ|"€íò»0ÐNN™ª½^ƒkº00¨¦ú!»øpñ¤O{È÷“\ÌBPÍ õùÀ!þ|"¿˜»|l{>6=Ÿz¯ïòŠ(cý˜'B2SøDA"LÝB/-…‹g Ÿ#(5÷0ìy•!BæËl ?¯?ß~rˆ¨À/, *pa.Â0öDȆñ Âh=å©ýnÌboG$É„þ€²JŠ‚ì•IEND®B`‚qstardict-qstardict-1.3/plugins/web/pixmaps/list-remove.png000066400000000000000000000203031323166163100242420ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× #¬E< IDATxÚí}yxç}æû$@ŠÀ›àR¤Dê²|ÄR_qj×¶V޶ënë¶Þnw[{›uœ4û4i6ó4ÇÚí&OÒl¶Ù8Ž%Q‡mÅqb[²-ÉåÚ­[)ËIàM@ÇÌ· Ì`%ã{ž±<Àpæ›ï}¿÷w|¿ù–où–où–où–où–où–où–oùöIit5ÞÈ]ˆ‡Õ‚€Áq€5hPRÜ:‘@ q6NÀ#Œ4BĺyÎtÚ93w1O€%ÚÜ%¨…°7°À ²«ï–ÒÛIGhÀiNÑñ9Cèµ¶)\Êà2µ! ÷3ÂV70¤ prÀãÃCšû!gD¿æ üËÍ“¡ž<rÜúŠPK H [ÜR ˜ à‰NL ÒF¢nÆØ?s‚éÙ†K—¦òÈbë/Âõð8íP `³<À'@Œí`üç&÷xž™;rÜ [è1·dUÖSíkŽL&Ä¡÷Ðל—^Î æ*ÆÝŒ§ï‚°z!²Î•ZÁUVÁPY®ª\YÈlY, “ TX€À‚s`‘0X`,8arÂøøÉqãc.]Ê€8$íâ ⸿­9œ'@2©/À*2Ò÷º;]À©°†&'LËÛ`lYãòVPIIâÛ$CCó^BäÂD.^@øÂyðý`¡°¶¿ 뢊‡î¯Æ<¿Ë@Ò>*Ciá÷€GõÊ:£`í:˜®¹¦5k@¦‚$v[çpPêïY(„ðÙ3¿ÿ>Bg>›v‘#«¹&°[ìßlîë›ûÄ`ÀŒ[È`x–Mºì8ÇÁ´fÌ7ßSÇ*€¸$v;ÕÓ @`÷žEðäq„»»AHBÙN/#üYã°çØ'’ï¦êbã7Ø 2¤ò²¹’RÜt ?s 8›=K3 í¶ö!”tä„™iOž@è.>¯ö0ˉÁ@ìÏ•?Ñvþ|ðC€‹%í&<àºT^5/ƒùŽÏ¡ðæÛ@&SŠÞ“¾ÛÍ)ˆá0‚'ÞÆÜÑ7Àfý:Lº@ØÖ089tÕ ¿Øø9"ìȚ̫&K o½ æ[o&ém*/“Jº‰Ã‚Aß>†à‰c`sÁÄÄÏ;° ƒo]µ(1=àGLÉ’)¦5ëP´ù~µ4;€'øž28bÞK¼ò2ÂÝg/ú="z¢~`ô髊 WIÁßøJ²YÏÙì°Üw?L+;Òè%e.á¤÷zÏ“\Y"çÎ!ðÊËf¦S…¸ßnýÊUAK þ…'K¦¬»–Í÷kÈýÀ¡…È~6ˆ£þž…B¢œù UŽãŸêûG#€]±`¹¬…?ð' 0£–»7¡àú²b׉ô€GŽ éŸõ)œÔÐéGàÈk@$’˜8 ÿ§¾øÏ à¯H¸l–gc•(¯Î••¡hëªjôÉ|6f´^sBY @b†Š¾Áøf„à™Nx ûyÃÅá?Ê•äŒVó·@øJ¢¸ÞPë@ÑŽàŠŠµ»ÅfºÏb¦§!¯…ee¨¸á:XêÙ'EÆ€kÏú¹Ñ1Ì ƒ¥¾–šš„‡³ÙY̾tüȈŠ'¾]wÁý•+†6ËðýDöÞØÒŠ¢û¶&mÓÁópÿöuø.ö)&¡âÓ7¢üºkÓßhÊ _Ö™ `ôè1Lÿîƒø|%À¶ªÕw|d0hž‡…#üæeð}ù ŸÖüé’'€Ëf¾½Q‹¦Õk`¹ón€ã4»ÂxîW_ƒ¯ á5*7n@ùuëGÆ É5øÃ¿y—>¾ ùý2§u›îŽ“@yaîÍÃ÷œM!„ÀÑ=õ½ýG–,Ë,õ ôª´dßÔ¶–{7EoNÃCæ ½ö:ü1ð{Ù•>…²k¯ÑB(ûvõfÞ8Å>Ÿg0ÀR]=—ÆÅu—É÷âgŒç1üêëð^ƒov:aª¨@d*^žžÆÜøJZšca’ò:ƦfS“.ÍDUS¶™ѧÿ¤¦îg?ç—¾\^ô4mUtXtøêPtϽ ƒA~|c<¡×À?0(¿­ í{÷bÙúõ(¹q¿‚‡……Mߟ˜>¼dLÀ@eÉ-`ì-Y)D4ÞæJJ`Ù²d¶hÆãLà>ü&üƒÚà›*«bŸyßyçþð~¿ìØŠO]²ukÓˆóuÔ¦ø;&0Œ>¯ÂQ5;hßÛ‰‚ÚZðñqôìØÀùdý*nj@Ý]wÊCi47‡Ù_óù´úË `w4ž½xô²à¢fÎWrš#¬TyÕF#ŠþÃýàÊ˵oRà~ã-ø]nmð«ªT–×_‡²ukôƒJéÅìÒ}&0ŒyÞ¾þ¤àÇf½ŒñVÜØÇ¿2pš×<~ûëx¶>K˜®)?þÒe5O˜J¿ND[Tö ó­·ÃP[«)ÉŒçá~ã(üƒCàwj‚…uu(Ù°žC‡ÀBŸÀ=â8Xª*ÓõÇhœ‡1#GÞÔ¿sŸ |0£lÓ&Ì>‚ÈäTlŽ„g.!81§S¬kÜÜÙ ®¤¼k@m ˆla#Jþ×øÔ+—M\Uöu€ð.“R~ËÛPxÓgÎüá·Þ†È-ëE*ðUJð©” üºõ([³:¸žRd%²ÏFÞ< ¯"DM¾\ ÆD%øH¡ pÜùY,4Ž_7øî;ˆ\¼¨µŽáˆÖ:>8—qTÀ-Ì€Oƒ`’;~¡àºë—l `á†ß:ÿÐŒñ–ÖVÝà@É7bÅ/žƒ¡¨8v˜ü·Ó˜úàC€b×Lwc›Àó~ã-qæKÁÜÔ¤ |0UV¡}ï^XÚÚdŸû].¸_=!ѼvÁÚk@EEÐPY£|÷²(À`í³ŒáˆÖÊ—ùöÏÂPS«º ?ÿðˆZö;÷é_¥=¨V‚õ× lu‡¾ª¡Tq>€‘£ÇáS„¨f§íûöë_¦c‰” µwÜ&Q‚x?øñ1O¼­]…̸»ê><ûÚ¢*#|3–БÄýÆæpUU`¯`2á·OÂçc,¶™[[3?¦Ïý\qqL€‰ÓïcêÃn0^¼~|†ó©U€Å7&ðyë|ý.H/`nÊ |0UÍ+A+¤'õ»1üÆQ@`Ñ-ÞCEŒMMQÐåJÀ8ö=¶=3.#¸jì÷t“ÔáÈTÓê5¢ü*¶™óàR{ûûög ¾”+Ÿ{†¢¢˜4c˜<ý>/Ä”bþ{ç1rì¼®A™²:› ¾’æÖV‰*Þ/jú0ajY.‚IsT[ô;ì7ƒèeº—ŠŠ`lnI8ÐaŸÜF×?ùå¬/#Ás¿CI›øÝ‡ðt÷èwy£oŸ„×5(wøœNtd |) ê¿ô¤Ìãû|1ù§ùM7Cc#Èb†ÒñfÄÝ>tͪksNŽ ÿInû£³yTÊ jaÉ2Ù`^ø«¿„÷Ô©l/F¢dCT $æŒEIЛÔÞ#ª£'NÁ«ÈO˜››Ñ±ÿ@VÁŸwb/<þ¸¬Ü£°´T#"a` úYñµ8däÏ)\õ¥eæûçma! ÕµI*{k‹ì\¼ßÞvåÏÇÌAL ><ƒ©³½uâU¡ÞÈÉ(ø9žù"ø§ÐûЃà}Þx@Y{[R…2TV‰¶*L0í껾£6‡ Pø0‹< ±ã•öUèÂ2;Ê:V^vLž9 OÏ9mÙïúW•£jnnFÇ(¨uäü‡Àû|ò”öÚÕ0WVÄI3z!‚ÁáP™˜Èøpî@ôg*çÏh„¡Ö‘¸³1O–‡½¹ å+Ûd³‹÷ùлkgnI 0“gÎÂÓûQ´oà**âaÏknPl6g#ÊÛ–ËbkÞïË= bJ ^vòl/.z>EfRœùQàÈÕÌW€¿ªö¶åŠÔ9‘øÿÇÆ/žàìePšcý*ÀéWlR®öQA¸’R•Ã]xy†››³å­ËeÙ5ÞçCïÎðžêÊ vï‰*Aââ³Ó™Cð;|Œ¡¼c%l­-jÙççå_‘`ñ–-¨|hKV×>n±[ Ë8ÀLÒÕ1Cu5ŒÎäg$JzÉé¾L¿ Z>]¹gJ6lÌ:¼§N¡w×NÕÚAlæ|!‡à+f~ÇJØÚ–+††R¬^Êwy÷ø‰q(jy Qã½÷&²¢…¬è.éª_4ýƒÍžÚV¥ØlM([®"îÜ™C%Pû9ÿÔ²ß.Î|ÙxhúN‚ú‰£R+4Êð B!6dÍ„›H<ˆƒd±¨ì;"r;…Èügó[$j âvÎÖè@Ùr§::رÞ®\`£H‚¨O`v:sþ.µì¯lƒ­¥)>& Ö"âë|ÂÌf€3¨H@ 7fÑz…£*.C—Ù¥ù0…id±â›úk½ö§†ä{ö hÍt¼ðbÁ—Ïü²­°67iŽAÜÎóÑM1®óë±1ŒVÅÍíüÆ‘.û©Ëlmð°Iíº¡ªZRë§ç›ZöL}ùi× <úe"ú(Ù˜}ŸŒé/ Õ ~zwiƒokq&¹^ŠgÔ( èìÝSµÇß©HõLaJè_ÑØ"›2×ÓiÙ-A»OºiÔ Úêëaoi’†äà}~ôîØž%XT𛛢v\c|´ÆF‹¬ êÅBHÍt™û37¬X° à­qJjðãà''äÅ :×ÙUÃax€ °Õ;`onT›ƒ\‘ ÇàÛ[[`u6È aT¦O”FWšñïç‰$x¦ LMBkyž8ÚT}6ê°«â™&…s89  ÂPQÖ/å«Z‘â{qßê¨S}ñ2¬ˆß‡žÛѾ7Gæ`!àwu‰á¥ø¶ÆzÑÙÓc“ì“t_ÀOM‚Š¿‘˜_ެŒP-y*E½5; Þ=67ŸåI•@CÂ…ùˆk­«AYSƒÌ>z·o[RJüåNüXˆ§'4V$Ô„ø[¸ Á×Pçx‘Õ/˜Äq5Zò"õX„?6 azŒi€,¤\õYÜ*IÀDü~ô,x»ºÐ³k">/X¬ëö'¬ õrÙ×ÚT²Î.RüœŒ13ÓàÇÇEE‘¯ªMe ®R•oV?¤ ª’Ï atB ¹Ie(Ã'ugTM¬µU(k¬Sù—›Þ®.ôìÜ!&yâ(¡¬¹ Ö†:‰Ã'%¿ žåÑMZ˜¢ôØ\üÄ8¿1Ç^½ Ûg:`L}›¬&W¥3žóL… âe £©^”HÉ^©Ý·ÖTÔ+^©Ãû|èÙ¶íûö/ºO_éí;a­¯ÜTvÔß³PÂŒÌëÂa‰­´càDq1ÑØëkÕæ`ÛÖE1‰Áo€µ¾&J:(vOB‚8_~o` ˆ„Á|^—fÄGáSȼ¦9Žï[² ¤kv¦’u‰/x0A…â2&HÁZ–x_r kuÀÏT |èÙö´ï;3%H~YS=¬ŽZ‘Ü©r¬$×Dß ŽOXò¶qÒVëù‰›l`v|>~e9°ÀÈdŒ¦¨Ÿ€dïØWí—VØe¦@ô üè{òKXûÆ›ï ÊR›wê¤Mê$—c ÙŽDÀ^ñ®ÀtØJo>ãŠIJ/_!DÂpDëq&‰c0av,›8R*©Aøp#©ÇÑÒÞŽö={s~ÉÆhß·_µ”ìÄÌ [#«É+ÊÎyQâCA°À,X(¨ç´ÆJ§ùÕ2Ç:X:@ˆ•Ïoª§R’®£ÃóÑC8$:>Á è/DÔ9!ÁèÇ}ÆÂ!q+^»«~õ2LÒwò-& \C˜q¨Ýž‹D¢NqPtêæ³‚ºì¸ÎM5æˆ"YÈr³ÉgybP“©ö£/‰Œ" ‡ÁÂaÁ FÎ÷!䟕 ò²k¯CÇ¡_ÁTQ±(Q€H‚}0AÃx\C˜t‹?@ŽÎôp8 8K|߉Õ3VÉÕw" €aÝ²Ž ™«úLq3‚>ÂÈ…„g2ºdãFt¼øŒ6Û¢æJ6~ZT‚¢b™BMº13<ª<­É g’AÏxŽd! ¤Ádv\{K"û ÔY,ÅßD"Œö !<”…Î¥·ÜŠŽƒ/ÀPZzY2%?öýjs0=4‚™‘ñØñ$¦Tqb¦š£ñ…+h0­€>Ppõyùpc}ƒˆCqï–Ûw¢½³\Q.gKL‚a 2¶ã)Ç›Ä̆°Á´le¸ÆyÃÁ0Fú\ˆ„Ã’{"ØïÝ„•Ïïg¹¼àk’@r_" Æjǵy´WFYD£ 'gpécnêʼn¤€+> CësG$Œ&”oùVü¿ŸGIK§‰$8Cñ2Yø5=8O‚$v\‡ p•Jp\÷£àC]v\—/ 8¡¹ ~Dþ6ÔŠ;ÑúÓŸ.9ðS…ˆÓ.7f†ÇžJÖ=Mókà §udyR€ÜŸºf@Yêê•Ù)«X¡ÙÆú!ðrð«þã¡åé§s—áËvÊxÛVÕÃ'¶Æ:±ÒI#}Ki¤Ùõì0]óÒ+ö+ DïjÏ`dÉ·àlc}.ø5>Š–gžÉ:øÞ®“ðv\% `Ú5$†ˆiËzJ;ÿÚ}Âi=}Õ7¢D]š€S† Döç«YƒþÆ.º ðòœºã±ÇàüÎw³_½Ûu=Û¶¡gëÖÜ’`Y±l2L á’{X¿¬ë «ÕÇP6 À÷΂âz ¡ "|~Œ]P-¨Ô=ù$¿ñ?s Ñ'ѳ}x¿üì,z¶å¦²¨dãF´wj­DÓÆ É–¦q'²FŽÇ)ñÈPªHôùmÖëÃxŸ+~ôô _ûþ櫹±ÏÛ·ƒ÷ÅÒ5—õ" ö©IÐïÂÌÐpÙR¤‘fçÂ…Æà«Y#€ã½÷&Ññl.U…Ùi/&ú\bAdì94=õmÔýõsþ6ÕzþÒ –ª"Ã4;Ž—u¾>“=Çè`*;.\Ë HnÂç™Áx¿+º´>ƒš¿÷}Ôþç¿XTð/ ¢àzú]˜Ö´ã§ÙA/ëÆU·D,‘×çFÁ˜ô`j@þ62°ü?@õ#,ø¶†:Ø”ÕÆ³~ôlÏ1 –É“Ež¾±ž KivFL7Òr­Ý·l8H;NY½¢>Î;>‰©Áaù×F#–ÿèǨضmñÀo¬˸˜q`z`PÖqCq1Ú;÷夼,VZ¦ÈØ››`m¬Kç§È£8S»ïÅ5YW1)Äö§.JL,c—´À/(@Û¿ülqÁoª‡µ®66‹luµ°7Ö«ÍÁöF{;Õ>ÁÅ~‰deÑOÒéKZ(ÿ,@¡´Ò½Ñ}~xàsf3Vþâ9”mÞœ[ð%jikª‡­®V•fµÖ;`oZ$¸ÐàôL† ! „az6g¨<öÞ0»ÓûA$.J/l±`åî=°ÝuWŽ$VŒó¥¶ÒÞX[‰ 4D4\HÆnf`0mðÅõìoèìœÊĤžNm›š/æˆ~Üú£Ãzûí¹³¯’8ìõ°Ö;RöÛÚP»³QÖW~v=9z4½dãF,ÿÁeŸgºd_žJ8?N÷úi îèÉÑ›©KÄä6ÈŽs}ë[æ|ÅCM ðS§Y­ u°7K~œa^ r@‚ðØ\O}Kö™Iõ6ðDu²önUçÁã9'@”zÿ¨í&žYÅe²SÎõ¢{ó}Y#.ðÓH³Zq%šƒ,’ <6†îû?À¹s²Ï‹kªõ®pÐ…¿Í¤ ¶¼ö%}N5kIUŠìÖœ )ø ŽŒÓ¬ÖÆú¨dŸ Á¯¬@i½#%àŠv¢vÏ ¯,¨³“g྘n5kE[ ,¶ì’ ÙƒšÖ†º§Y­Šwe‰À/ª(GåÚUiŸ1üL‰¸ 5V÷·þ à6%fPž bŒaüÜÇxfd‡ZV¬Äª—¥õ+" Áon„µ¾NãNSRh%³âž¹çBŸ,éb(.Fûž½i%‹’_µnµâ·uµ7jö¸#S ø»ÜŸ>Ñ_ÍJ‡Ê•­°ØmèsçÐ}ßf„ÇÆÒ_r~{s“~UµzҬ֦ؗ7«• ÷æü0qôøB \¯¾ÙCÄ~”n5+Çq¨joƒEåè#Aìå ~¿LÖe²Ÿî:»Ž·… à`ÿPýüþß]6@gù*ˆúÒ­f%ŽPÕ¾"ªúIèÍvg£˜GO»?½¤–µ©Aóço’‘ àXoÀbýæBñËJ•ûÞ;n£#4‹)‘@`Œaìì9<Ó²sZV®Àªå>ABðçßÉ“…¢T=ûD„™o9Wú¹™ù`q·9vï;¶Pì²Reéøõ‘£ úeðÌ qª:VÂRf—}8÷º?_L ‚ßÒkc}VŠRõ?ˆX(K¡9~ ð,ü|ü|{dýõÇ,‘འr¤[Ì@¡¸¢!Ÿ‘¹¹Ø9#““˜~íUTWã£Gþ89ø¥êM³j5³Í Žã˜òħf8Œ©_„¥µÿ×ÿ’}ð ''Ã?ìîæ³[VKmÝ›ïj'P¬Éd?QxƆ±³½²MÔì-Nü,Êz¦MËhµƒÏ01áúúç f ³ìÖZÙ|Ï ì‰Ol§cëîA`Ò“|ŪÝbž ² û&°ß«í<øV6ûõÇlj½r„€¿È¬š5ê¬î@QE¹ @"‚}y³~Úï!€î¼z&ÍêlDY[‹æ¹‹++ >@ìKÙ?' 3Ÿ¿÷)¾¬? §ž±>÷|£cÏÍ¡ ¨6g# ¥©äEžåzZÐ3 OßB~?Lf –ÕV£¤®v¡(=U³ûÀß䢿9!ÐÈ–{F¸˜áÙU×ýcÍÞýåêôÆ\˜ÆŒÅ G!þ4ƒâÆO&àòöÓê½ûÏår>‚  ‘/l~À_¦ ø'ôùq{¶F0ü1uvòW4b>ÁÖÍOèËùY®ÏæWï>ðÕT¿÷sEÜÛîœß‘™ž<àÒ£?¯Ù»ÿÿ.×¹ oßr{Tå—§@ÜÖšÝû/æEýuµß21ãuDÔ•?6 ÿMàhãbƒYCÞKÛüÁÎ-áÆìÛUÖŠŽç÷÷\&ò]ÞæÞµíãÂ@+?aà÷ Ä=œ­U½+J¤Í±{ß±Y‹u=Àþ@ø|„€šŒ–u—ü%¡Ò6úÀÖuL¾Ðç®ÊØžá7`†/Övvv/•>-I/ld×¶Ï ßpÓU‚ý‡Çž¨zþào– ºtÛð®/lâ@Ç»þÊôîÙ10UkÒ׿.,Ñdé·±í[næ9z”€m@êBºÌ-b{ž=íè|á½+ ½rškûö2'< ´j ux—Ûo4ÒÏ+q`ø ÊA\™ÍýÀÖvÏ61à^n°Ø/æA8†ý<ñ/Ôí~Ñueš©« M>ôPi$ edit.png list-add.png list-remove.png web.png qstardict-qstardict-1.3/plugins/web/pixmaps/web.png000066400000000000000000000032171323166163100225560ustar00rootroot00000000000000‰PNG  IHDR©JLÎtEXtSoftwareAdobe ImageReadyqÉe<$iTXtXML:com.adobe.xmp @ `IDATxÚÄ–MHTQÇßèjö…e2}P‹ˆ-­eQ¶¨M‹À¾¿ H§MEQD¹0¨$ZD³(° ʤ M-Ò2Zõ1I%1j–fC¥ö;ð1=ОöàÇ=÷ÜsϹ÷¾sî{ç/O8. Y ‹a&LÐÐ{h†z¸‹Å ä'0@€Bš£Pàø{,ÐAÖú D€LšÓ°Á3Ô¥P­þj(ƒLÝ(!`W¿2‘ÆV”½r>>ÙÑ1ù±ÇÞìîÀ8ø¢ )`v…Ø·»¶)ž¸AÚ`+¤k8â bt%ê¦kN›|ÔÊçŸ;Byžf£óoŸ*³éw ‚,¡©s†æYJ°[îÑS[ã¡Hý¸ú~ˆkN‘úɾì&LûºaÑ? :޼ÎÑßâgÙÌ©¤Ù åÌ9@? ù d@¾í¨Q+ȱ šW&]ñ ލXsÊ”(æ+GºÆ *ý¬b,rr+rŸÒÚªBЉþ3}›´ÔE¥ùoa|Dß­2éÕéŒ6?vtVÑ”ùÈw‘çÃdÝnyÏ`9<‘ó©p VÁ»¡¥W1 ®˜ÏÔPÈü8;h_ÐîR&v¨>®²€jÆìœ·ÉÁvÛµ^¾-$ŠÍullGë¡U·†-æ5쵄hûï`„*ºAõd˜‡“Fl²‘[à'܆¬ÐœéØ´`cîsí¤fÀè±§`ôÕ²KŽOÀIÉuD/¶MG`úrÙØ®j,ˆlšu³d$ù1›JÆ:‚ʘCpÖv„²ÕÍAn÷dÕN»ÍÝàºçZ<6ëìȰibü)ò;\8¼—ª v¥A*ùv‚IÊÌMúðíƒ3ª•µL¸ÔO¬¡¹?TÔ–ÚÙªÉÈ`?åvS,êçS^¯‹sÀOùÿù9Öß­¡úü%ÀùEXFyÄàIEND®B`‚qstardict-qstardict-1.3/plugins/web/settingsdialog.cpp000066400000000000000000000121351323166163100233350ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include #include "ui_adddictionarydialog.h" #include "../pluginserver.h" #if QT_VERSION < QT_VERSION_CHECK(5,0,0) #include "web-meta.h" #endif namespace { QStringList supportedCharsets() { QList list = QTextCodec::availableCodecs(); QStringList newList; for (QList::const_iterator i = list.begin(); i != list.end(); ++i) newList << *i; return newList; } } SettingsDialog::SettingsDialog(Web *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin) { setupUi(this); QStringList filenames = QDir(plugin->qsd->configDir(PLUGIN_ID)).entryList(QStringList("*.webdict"), QDir::Files, QDir::Name); for (QStringList::iterator i = filenames.begin(); i != filenames.end(); ++i) { QSettings dict(plugin->qsd->configDir(PLUGIN_ID) + "/" + *i, QSettings::IniFormat); m_oldDicts[i->remove(".webdict")] = Dict(dict.value("author").toString(), dict.value("description").toString(), dict.value("query").toString(), dict.value("charset").toByteArray()); } m_dicts = m_oldDicts; refresh(); } void SettingsDialog::on_editDictButton_clicked() { if (dictsList->currentRow() == -1) return; QString dict = dictsList->currentItem()->text(); Ui::AddDictionaryDialog ui; QDialog dialog(this); ui.setupUi(&dialog); dialog.setWindowTitle(tr("Edit dictionary")); ui.nameEdit->setText(dict); ui.authorEdit->setText(m_dicts[dict].author); ui.descEdit->setText(m_dicts[dict].description); ui.queryEdit->setText(m_dicts[dict].query); ui.charsetEdit->addItems(supportedCharsets()); ui.charsetEdit->setCurrentIndex(ui.charsetEdit->findText(m_dicts[dict].charset)); if (dialog.exec() != QDialog::Accepted) return; if (ui.nameEdit->text() != dict) { m_dicts.remove(dict); dict = ui.nameEdit->text(); } m_dicts[dict].author = ui.authorEdit->text(); m_dicts[dict].description = ui.descEdit->toPlainText(); m_dicts[dict].query = ui.queryEdit->text(); m_dicts[dict].charset = ui.charsetEdit->currentText().toLatin1(); refresh(); } void SettingsDialog::on_addDictButton_clicked() { Ui::AddDictionaryDialog ui; QDialog dialog(this); ui.setupUi(&dialog); ui.charsetEdit->addItems(supportedCharsets()); ui.charsetEdit->setCurrentIndex(ui.charsetEdit->findText("UTF-8")); if (dialog.exec() != QDialog::Accepted) return; m_dicts[ui.nameEdit->text()] = Dict(ui.authorEdit->text(), ui.descEdit->toPlainText(), ui.queryEdit->text()); refresh(); } void SettingsDialog::on_removeDictButton_clicked() { QListWidgetItem *item = dictsList->takeItem(dictsList->currentRow()); m_dicts.remove(item->text()); delete item; } void SettingsDialog::refresh() { dictsList->clear(); dictsList->insertItems(0, m_dicts.keys()); } void SettingsDialog::accept() { for (QHash::const_iterator i = m_dicts.begin(); i != m_dicts.end(); ++i) { QSettings dict(m_plugin->qsd->configDir(PLUGIN_ID) + "/" + i.key() + ".webdict", QSettings::IniFormat); dict.setValue("author", i->author); dict.setValue("description", i->description); dict.setValue("query", i->query); dict.setValue("charset", i->charset); m_oldDicts.remove(i.key()); } for (QHash::const_iterator i = m_oldDicts.begin(); i != m_oldDicts.end(); ++i) QFile::remove(m_plugin->qsd->configDir(PLUGIN_ID) + "/" + i.key() + ".webdict"); QDialog::accept(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/plugins/web/settingsdialog.h000066400000000000000000000050351323166163100230030ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" #include "web.h" class SettingsDialog: public QDialog, public Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(Web *plugin, QWidget *parent = 0); void accept(); private slots: void on_editDictButton_clicked(); void on_addDictButton_clicked(); void on_removeDictButton_clicked(); private: void refresh(); struct Dict { Dict(const QString &a = QString(), const QString &d = QString(), const QString &q = QString(), const QByteArray &c = QByteArray()) : author(a), description(d), query(q), charset(c) { } QString author; QString description; QString query; QByteArray charset; }; QHash m_oldDicts; QHash m_dicts; Web *m_plugin; }; #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/web/settingsdialog.ui000066400000000000000000000106531323166163100231730ustar00rootroot00000000000000 SettingsDialog 0 0 354 295 Web plugin settings Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok Dictionaries 9 9 9 9 6 6 6 0 0 0 0 Edit dictionary Edit :/icons/edit.png Add dictionary Add :/icons/list-add.png Remove dictionary Remove :/icons/list-remove.png Qt::Horizontal 342 26 buttonBox accepted() SettingsDialog accept() 227 311 157 274 buttonBox rejected() SettingsDialog reject() 295 317 286 274 qstardict-qstardict-1.3/plugins/web/web-meta.h.in000066400000000000000000000004301323166163100220630ustar00rootroot00000000000000#ifndef WEB_META_H #define WEB_META_H #define PLUGIN_ID \"$$TARGET\" #define PLUGIN_NAME \"$$META_NAME\" #define PLUGIN_VERSION \"$$VERSION\" #define PLUGIN_DESCRIPTION \"$$META_DESC\" #define PLUGIN_AUTHORS \"$$META_AUTHORS\" #define PLUGIN_FEATURES \"$$META_FEATURES\" #endif qstardict-qstardict-1.3/plugins/web/web.cpp000066400000000000000000000111671323166163100210760ustar00rootroot00000000000000/***************************************************************************** * web.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "web.h" #include #include #include #include #include #include #include #include #include #include "settingsdialog.h" #if QT_VERSION < QT_VERSION_CHECK(5,0,0) #include "web-meta.h" #endif Web::Web(QObject *parent) : QObject(parent) { } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata Web::metadata() const { QStarDict::PluginMetadata md; md.id = PLUGIN_ID; md.name = QString::fromUtf8(PLUGIN_NAME); md.version = PLUGIN_VERSION; md.description = PLUGIN_DESCRIPTION; md.authors = QString::fromUtf8(PLUGIN_AUTHORS).split(';', QString::SkipEmptyParts); md.features = QString::fromLatin1(PLUGIN_FEATURES).split(';', QString::SkipEmptyParts); md.icon = QIcon(":/icons/web.png"); return md; } #else QIcon Web::pluginIcon() const { return QIcon(":/icons/web.png"); } #endif QStringList Web::availableDicts() const { QStringList result = QDir(qsd->configDir(PLUGIN_ID)).entryList(QStringList("*.webdict"), QDir::Files, QDir::Name); result.replaceInStrings(".webdict", ""); return result; } void Web::setLoadedDicts(const QStringList &dicts) { for (QStringList::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { QString filename = qsd->configDir(PLUGIN_ID) + "/" + *i + ".webdict"; if (! QFile::exists(filename)) continue; QSettings dict(filename, QSettings::IniFormat); QString query = dict.value("query").toString(); if (! query.isEmpty()) { m_loadedDicts[*i].query = query; m_loadedDicts[*i].codec = dict.value("charset").toByteArray(); } } } Web::DictInfo Web::dictInfo(const QString &dict) { QString filename = qsd->configDir(PLUGIN_ID) + "/" + dict + ".webdict"; if (! QFile::exists(filename)) return DictInfo(); QSettings dictFile(filename, QSettings::IniFormat); DictInfo info(PLUGIN_ID, dict, dictFile.value("author").toString(), dictFile.value("description").toString()); return info; } bool Web::isTranslatable(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return false; // TODO Q_UNUSED(word); return true; } Web::Translation Web::translate(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return Translation(); QUrl url(m_loadedDicts[dict].query.replace("%s", word)); QEventLoop loop; QNetworkAccessManager qnam; QNetworkReply *reply = qnam.get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QTextCodec *codec = QTextCodec::codecForName(m_loadedDicts[dict].codec); QString translation; if (codec) translation = codec->toUnicode(reply->readAll()); else translation = QString::fromUtf8(reply->readAll()); return Translation(dict, word, translation); } int Web::execSettingsDialog(QWidget *parent) { ::SettingsDialog dialog(this, parent); return dialog.exec(); } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(web, Web) #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/plugins/web/web.h000066400000000000000000000053551323166163100205450ustar00rootroot00000000000000/***************************************************************************** * web.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef WEB_H #define WEB_H #include "../dictplugin.h" #include class Web: public QObject, public QStarDict::BasePlugin, public QStarDict::DictPlugin, public QStarDict::ConfigurablePlugin { Q_OBJECT Q_INTERFACES(QStarDict::BasePlugin QStarDict::DictPlugin QStarDict::ConfigurablePlugin) #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.WebPlugin/1.0" FILE "web.json") #endif public: Web(QObject *parent = 0); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStarDict::PluginMetadata metadata() const; #else QIcon pluginIcon() const; #endif Features features() const { return 0; } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &dicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); friend class SettingsDialog; private: struct QueryStruct { QString query; QByteArray codec; }; QHash m_loadedDicts; }; #endif // WEB_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/plugins/web/web.json.in000066400000000000000000000003171323166163100216650ustar00rootroot00000000000000{ \"id\": \"$$TARGET\", \"name\": \"$$META_NAME\", \"version\" : \"$$VERSION\", \"description\": \"$$META_DESC\", \"authors\": \"$$META_AUTHORS\", \"features\": \"$$META_FEATURES\" } qstardict-qstardict-1.3/plugins/web/web.pro000066400000000000000000000035321323166163100211110ustar00rootroot00000000000000############################################################################# # web.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = web META_VERSION = 0.1 META_NAME = Web META_DESC = An experimental plugin for WEB dictionaries.
    Warning: now this plugin is unstable META_AUTHORS = Alexander Rodin META_FEATURES = dict include(../plugin.pri) HEADERS += \ settingsdialog.h \ web.h SOURCES += \ settingsdialog.cpp \ web.cpp FORMS += \ adddictionarydialog.ui \ settingsdialog.ui RESOURCES += \ pixmaps/pixmaps.qrc qstardict-qstardict-1.3/qstardict.pri000066400000000000000000000130211323166163100200600ustar00rootroot00000000000000############################################################################# # qstardict.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# # It's common for all subprjects file. Keep it in mind changing it VERSION = 1.3 QT = \ core \ gui \ network \ xml greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets printsupport } CONFIG += \ qt \ warn_on greaterThan(QT_MAJOR_VERSION, 4) { CONFIG += c++11 } else { QMAKE_CXXFLAGS += -std=c++11 } unix { CONFIG += link_pkgconfig PKGCONFIG += glib-2.0 macx { LIBS += /System/Library/Frameworks/Carbon.framework/Carbon } else { LIBS += -lX11 } LIBS += -lz } win32 { CONFIG += console LIBS += -lzdll -lglib-2.0 -luser32 INCLUDEPATH += $$GLIB2PATH/include/glib-2.0 \ $$GLIB2PATH/lib/glib-2.0/include \ $$ZLIBPATH/include QMAKE_LIBDIR += $$GLIB2PATH/lib \ $$ZLIBPATH/lib } !isEmpty(DEVEL):DEFINES += DEVEL unix:DEFINES += HAVE_MMAP unix:isEmpty(NO_DBUS):!contains(QT_CONFIG, dbus): NO_DBUS = 1 unix:isEmpty(NO_DBUS):QT += dbus unix:isEmpty(NO_DBUS):DEFINES += QSTARDICT_WITH_DBUS isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_WITH_TRANSLATIONS include(plugins/plugins.pri) unix { macx { isEmpty(INSTALL_PREFIX) { INSTALL_PREFIX=/opt } # helper var to save text duplicity. # NOTE: it cannot use $$TARGET because the target is # different in every directory. Obviously. MAC_BUNDLE_PATH=$$INSTALL_PREFIX/QStarDict.app/Contents # bin dir is used for qstardict dir/main application # qmake created bundle for it itself. So it *has* to be # the same as install location BIN_DIR=$$INSTALL_PREFIX DATA_DIR=$$MAC_BUNDLE_PATH/share TRANSLATIONS_DIR=$$MAC_BUNDLE_PATH/i18n PLUGINS_DIR=$$MAC_BUNDLE_PATH/lib DOCS_DIR=$$MAC_BUNDLE_PATH/share/doc } else { isEmpty(INSTALL_PREFIX):INSTALL_PREFIX=/usr isEmpty(BIN_DIR):BIN_DIR=$$INSTALL_PREFIX/bin isEmpty(DATA_DIR):DATA_DIR=$$INSTALL_PREFIX/share/qstardict isEmpty(NO_TRANSLATIONS):isEmpty(TRANSLATIONS_DIR):TRANSLATIONS_DIR=$$DATA_DIR/translations isEmpty(LIB_DIR):LIB_DIR=$$INSTALL_PREFIX/lib/qstardict isEmpty(PLUGINS_DIR):PLUGINS_DIR=$$LIB_DIR/plugins isEmpty(DOCS_DIR):DOCS_DIR=$$INSTALL_PREFIX/share/doc/qstardict } DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" DEFINES += QSTARDICT_INSTALL_PREFIX=\\\"$$INSTALL_PREFIX\\\" DEFINES += QSTARDICT_BIN_DIR=\\\"$$BIN_DIR\\\" DEFINES += QSTARDICT_DATA_DIR=\\\"$$DATA_DIR\\\" isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" DEFINES += QSTARDICT_PLUGINS_DIR=\\\"$$PLUGINS_DIR\\\" } else:win32 { isEmpty(INSTALL_PREFIX) { INSTALL_PREFIX= } else { # handle path backslashes in defines correctly INSTALL_PREFIX = $$re_escape($$INSTALL_PREFIX) } isEmpty(BIN_DIR):BIN_DIR=$$INSTALL_PREFIX/ isEmpty(DATA_DIR):DATA_DIR=$$INSTALL_PREFIX/data isEmpty(NO_TRANSLATIONS):isEmpty(TRANSLATIONS_DIR):TRANSLATIONS_DIR=$$INSTALL_PREFIX/translations isEmpty(PLUGINS_DIR):PLUGINS_DIR=$$INSTALL_PREFIX/plugins isEmpty(DOCS_DIR):DOCS_DIR=$$INSTALL_PREFIX/docs DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" # DEFINES += QSTARDICT_INSTALL_PREFIX=\(QApplication::applicationDirPath\(\)+\\\"$$INSTALL_PREFIX\\\"\) # DEFINES += QSTARDICT_BIN_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$BIN_DIR\\\"\) # DEFINES += QSTARDICT_DATA_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$DATA_DIR\\\"\) # isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$TRANSLATIONS_DIR\\\"\) # DEFINES += QSTARDICT_PLUGINS_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$PLUGINS_DIR\\\"\) DEFINES += QSTARDICT_INSTALL_PREFIX=\\\"$$INSTALL_PREFIX\\\" DEFINES += QSTARDICT_BIN_DIR=\\\"$$BIN_DIR\\\" DEFINES += QSTARDICT_DATA_DIR=\\\"$$DATA_DIR\\\" isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" DEFINES += QSTARDICT_PLUGINS_DIR=\\\"$$PLUGINS_DIR\\\" } qstardict-qstardict-1.3/qstardict.pro000066400000000000000000000050011323166163100200650ustar00rootroot00000000000000############################################################################# # qstardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = subdirs include(qstardict.pri) SUBDIRS = qstardict plugins DOCS += \ AUTHORS \ COPYING \ ChangeLog \ THANKS DISTFILES += $$DOCS \ INSTALL \ README message("Enabled plugins: "$$ENABLED_PLUGINS) unix { isEmpty(NO_DBUS) { message("D-Bus support: enabled") } else { message("D-Bus support: disabled") } } isEmpty(NO_TRANSLATIONS) { message("Translations: enabled") } else { message("Translations: disabled") } message("Install prefix: "$$INSTALL_PREFIX) message("Binary directory: "$$BIN_DIR) message("Data directory: "$$DATA_DIR) isEmpty(NO_TRANSLATIONS):message("Translations directory: "$$TRANSLATIONS_DIR) message("Plugins directory: "$$PLUGINS_DIR) message("Documentation directory: "$$DOCS_DIR) win32 { isEmpty(GLIB2PATH) { error("No Glib2 library path (GLIB2PATH) is set.") } else { message("Glib2 location is set to $$GLIB2PATH") } isEmpty(ZLIBPATH) { error("No zlib library path (ZLIBPATH) is set.") } else { message("Zlib location is set to $$ZLIBPATH") } } docs.files = $$DOCS docs.path = $$DOCS_DIR INSTALLS += docs qstardict-qstardict-1.3/qstardict/000077500000000000000000000000001323166163100173475ustar00rootroot00000000000000qstardict-qstardict-1.3/qstardict/appinfo.cpp000066400000000000000000000125271323166163100215160ustar00rootroot00000000000000#include "appinfo.h" #include #include #include #if QT_VERSION < QT_VERSION_CHECK(5,0,0) # include #else # include #endif #ifdef DEVEL # include #endif namespace QStarDict { const QString AppInfo::genericDataDir() { #ifdef Q_OS_WIN // Force Roaming wchar_t path[MAX_PATH]; typedef HRESULT (WINAPI*SHGetFolderPathWFunc)(HWND, int, HANDLE, DWORD, LPTSTR); SHGetFolderPathWFunc SHGetFolderPathW = (SHGetFolderPathWFunc) QLibrary::resolve(QLatin1String("Shell32"), "SHGetFolderPathW"); if (SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, path) == S_OK) { return QDir::fromNativeSeparators(QString::fromWCharArray(path)); } else { return QString(); } #else # if QT_VERSION >= 0x050000 return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); # else # if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) QString dataDir = qgetenv("XDG_DATA_HOME"); if (dataDir.isEmpty()) { dataDir = QDir::homePath() + "/.local/share"; } return dataDir; # else return QDesktopServices::storageLocation(QDesktopServices::DataLocation); # endif # endif #endif } QString AppInfo::localAppDataDir() { static QString dataDir; if (dataDir.isEmpty()) { QSettings s; dataDir = genericDataDir() + QLatin1Char('/') + s.applicationName(); QDir d(dataDir); if (!d.exists()) { d.mkpath("."); } } return dataDir; } QString AppInfo::systemAppDataDir() { static QString dataDir; if (dataDir.isEmpty()) { #ifdef Q_OS_WIN dataDir = qApp->applicationDirPath(); #else dataDir = QString::fromLocal8Bit(QSTARDICT_DATA_DIR); #endif } return dataDir; } QString AppInfo::systemAppPluginsDir() { static QString libDir; if (libDir.isEmpty()) { #ifdef Q_OS_WIN libDir = qApp->applicationDirPath() + QLatin1String("/plugins"); #elif defined(Q_OS_MAC) QString binPath = QCoreApplication::applicationDirPath(); // navigate through mac's bundle tree structore QDir d(binPath + "/../lib/"); // TODO why not plugins? libDir = d.canonicalPath(); #else libDir = QString::fromLocal8Bit(QSTARDICT_PLUGINS_DIR); #endif } return libDir; } QStringList AppInfo::appPluginsDirs() { #if DEVEL QDir pluginsDir = QDir(qApp->applicationDirPath()); # if defined(Q_OS_WIN) QString dbgSubdir = pluginsDir.dirName(); if (!(dbgSubdir.toLower() == "debug" || dbgSubdir.toLower() == "release")) { dbgSubdir.clear(); } # else QString dbgSubdir; # endif # if defined(Q_OS_WIN) if (!dbgSubdir.isEmpty()) // if last part of app dir is debug or release pluginsDir.cdUp(); # elif defined(Q_OS_MAC) if (pluginsDir.dirName() == "MacOS") { pluginsDir.cdUp(); pluginsDir.cdUp(); pluginsDir.cdUp(); } # endif if (!(pluginsDir.cd("../plugins") || pluginsDir.cd("plugins"))) { qDebug() << "Can't find plugins dir directory, probably won't find plugins as well"; } QStringList pluginsDirs; foreach (const QString &dirName, pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { QDir d(pluginsDir); d.cd(dirName); if (!dbgSubdir.isEmpty()) { d.cd(dbgSubdir); } pluginsDirs << d.path(); } qDebug() << "Plugins dirs: " << pluginsDirs; return pluginsDirs; #else static QString localPluginsDir; if (localPluginsDir.isEmpty()) { localPluginsDir = localAppDataDir() + QLatin1String("/plugins"); } QDir local(localPluginsDir); QDir system(systemAppPluginsDir()); if (local == system) { return QStringList() << localPluginsDir; } return QStringList() << localPluginsDir << systemAppPluginsDir(); #endif } QString AppInfo::configDir() { static QString confDir; if (confDir.isEmpty()) { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) # if defined(Q_OS_MAC) QString ch = QDir::homePath() + QLatin1String("/Library/Caches"); confDir = ch + QLatin1Char('/') + qApp->applicationName(); # elif defined(Q_OS_LINUX) QString ch = QString::fromLocal8Bit(qgetenv("XDG_CACHE_HOME")); if (ch.isEmpty()) ch = QDir::homePath() + QLatin1String("/.config"); confDir = ch + QLatin1Char('/') + qApp->applicationName(); # else confDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); # endif #elif QT_VERSION < QT_VERSION_CHECK(5,5,0) # ifdef Q_OS_LINUX confDir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QLatin1Char('/') + qApp->applicationName(); # else confDir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); # endif #else confDir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); #endif QDir c(confDir); if (!c.exists()) { c.mkpath("."); } } return confDir; } QString AppInfo::cacheDir() { static QString cd; if (cd.isEmpty()) { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) cd = QDesktopServices::storageLocation(QDesktopServices::CacheLocation); #else cd = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); #endif QDir c(cd); if (!c.exists()) { c.mkpath("."); } } return cd; } } // namespace QStarDict qstardict-qstardict-1.3/qstardict/appinfo.h000066400000000000000000000007141323166163100211560ustar00rootroot00000000000000#ifndef QSTARDICT_APPINFO_H #define QSTARDICT_APPINFO_H #include namespace QStarDict { class AppInfo { public: static QString localAppDataDir(); static QString systemAppDataDir(); static QString systemAppPluginsDir(); static QStringList appPluginsDirs(); static QString configDir(); static QString cacheDir(); private: static const QString genericDataDir(); }; } // namespace QStarDict #endif // QSTARDICT_APPINFO_H qstardict-qstardict-1.3/qstardict/application.cpp000066400000000000000000000102031323166163100223520ustar00rootroot00000000000000/***************************************************************************** * application.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "application.h" #ifdef QSTARDICT_WITH_TRANSLATIONS #include #include #include #include #endif // QSTARDICT_WITH_TRANSLATIONS #include #include "qxt/qxtglobalshortcut.h" #include "dictcore.h" #include "mainwindow.h" #include "popupwindow.h" #include "speaker.h" #include "trayicon.h" #include "pluginmanager.h" #ifdef QSTARDICT_WITH_DBUS #include "dbusadaptor.h" #endif // QSTARDICT_WITH_DBUS namespace QStarDict { Application::Application(int &argc, char **argv) : QApplication(argc, argv) { //setOrganizationName("qstardict"); // breaks xdg dirs setApplicationName("qstardict"); setQuitOnLastWindowClosed(false); #ifdef QSTARDICT_WITH_TRANSLATIONS m_translator = new QTranslator; #ifdef Q_WS_MAC QString binPath = QCoreApplication::applicationDirPath(); // navigate through mac's bundle tree structore m_translator->load("qstardict-" + QLocale::system().name(), binPath + "/../i18n/"); #else m_translator->load("qstardict-" + QLocale::system().name(), QSTARDICT_TRANSLATIONS_DIR); #endif installTranslator(m_translator); m_qtTranslator = new QTranslator; m_qtTranslator->load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); installTranslator(m_qtTranslator); #endif // QSTARDICT_WITH_TRANSLATIONS m_pluginManager = new PluginManager; m_pluginManager->loadPlugins(); m_dictCore = new DictCore; m_popupWindow = new PopupWindow; m_popupWindow->setDict(m_dictCore); m_speaker = new Speaker; m_trayIcon = new TrayIcon; m_popupShortcut = new QxtGlobalShortcut; m_mainWindow = new MainWindow; m_trayIcon->setMainWindow(m_mainWindow); m_mainWindow->setDict(m_dictCore); #ifdef QSTARDICT_WITH_DBUS m_dbusAdaptor = new DBusAdaptor(m_mainWindow); #endif // QSTARDICT_WITH_DBUS } Application::~Application() { delete m_trayIcon; delete m_mainWindow; delete m_popupWindow; delete m_speaker; delete m_dictCore; delete m_popupShortcut; #ifdef QSTARDICT_WITH_TRANSLATIONS removeTranslator(m_translator); delete m_translator; removeTranslator(m_qtTranslator); delete m_qtTranslator; delete m_pluginManager; #endif // QSTARDICT_WITH_TRANSLATIONS } int Application::exec() { QString text = commandLineText(); if (text != QString::null) m_mainWindow->showTranslation(text); return QApplication::exec(); } QString Application::commandLineText() { QStringList args(arguments()); for(int i = 1; i < args.count(); ++i) { if(! args.at(i).startsWith('-')) return args.at(i); } return QString::null; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/application.h000066400000000000000000000103271323166163100220260ustar00rootroot00000000000000/***************************************************************************** * application.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef APPLICATION_H #define APPLICATION_H #include #ifdef QSTARDICT_WITH_TRANSLATIONS class QTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS class QxtGlobalShortcut; namespace QStarDict { class DictCore; class PluginManager; class MainWindow; class PopupWindow; class Speaker; class TrayIcon; #ifdef QSTARDICT_WITH_DBUS class DBusAdaptor; #endif // QSTARDICT_WITH_DBUS /** * Main application class. */ class Application: public QApplication { Q_OBJECT public: /** * Construct new QStarDict application. */ Application(int &argc, char **argv); /** * Destructor. */ ~Application(); /** * Enter the main event loop and wait until exit(). */ int exec(); /** * Returns a pointer to the application's QStarDict::Application instance. */ static Application *instance() { return qobject_cast(QCoreApplication::instance()); } /** * Returns a pointer to the DictCore instance. */ DictCore *dictCore() { return m_dictCore; } /** * Returns pointer to PluginManager instance */ PluginManager *pluginManager() { return m_pluginManager; } /** * Returns a pointer to the application's main window. */ MainWindow *mainWindow() { return m_mainWindow; } /** * Returns a pointer to the application's popup window. */ PopupWindow *popupWindow() { return m_popupWindow; } /** * Returns a pointer to the application's speacker. */ Speaker *speaker() { return m_speaker; } /** * Returns a pointer to the tray icon. */ TrayIcon *trayIcon() { return m_trayIcon; } /** * Returns a pointer to the popupShortcut instance. */ QxtGlobalShortcut *popupShortcut() { return m_popupShortcut; } #ifdef QSTARDICT_WITH_DBUS /** * Returns a pointer to the DBusAdaptor instance. */ DBusAdaptor *dbusAdaptor() { return m_dbusAdaptor; } #endif // QSTARDICT_WITH_DBUS private: #ifdef QSTARDICT_WITH_TRANSLATIONS QTranslator *m_translator; QTranslator *m_qtTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS DictCore *m_dictCore; PluginManager *m_pluginManager; MainWindow *m_mainWindow; PopupWindow *m_popupWindow; Speaker *m_speaker; TrayIcon *m_trayIcon; QxtGlobalShortcut *m_popupShortcut; #ifdef QSTARDICT_WITH_DBUS DBusAdaptor *m_dbusAdaptor; #endif // QSTARDICT_WITH_DBUS QString commandLineText(); }; } #endif // APPLICATION_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/qstardict/cssedit.cpp000066400000000000000000000317431323166163100215210ustar00rootroot00000000000000/***************************************************************************** * cssedit.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "cssedit.h" #include #include namespace QStarDict { CSSEdit::CSSEdit(QWidget *parent) : QWidget(parent) { setupUi(this); connect(m_elementCombo, SIGNAL(currentIndexChanged(int)), SLOT(setCurrentElement(int))); connect(m_fontCombo, SIGNAL(currentFontChanged(const QFont&)), SLOT(propertyChanged())); connect(m_sizeSpin, SIGNAL(valueChanged(int)), SLOT(propertyChanged())); connect(m_boldButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_italicButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_underlineButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_colorButton, SIGNAL(clicked()), SLOT(colorSelectClicked())); connect(m_backgroundButton, SIGNAL(clicked()), SLOT(colorSelectClicked())); } void CSSEdit::setCSS(const QString &css) { m_elements.clear(); bool inBlock = false; QString element; QString currentProperty; QString currentValue; for (int i = 0; i < css.length(); ++i) { if (! inBlock) { element.clear(); for (; i < css.length() && css[i] != '{'; ++i) if (! css[i].isSpace()) element += css[i]; if (i < css.length() && css[i] == '{') { inBlock = true; ++i; } } else { currentProperty.clear(); for (; i < css.length() && css[i] != ':'; ++i) if (! css[i].isSpace()) currentProperty += css[i]; if (! inBlock) continue; currentValue.clear(); char quote = '\0'; for (++i; i < css.length() && css[i] != ';'; ++i) { if (quote) { if (css[i] == quote) { while (i < css.length() && css[i] != ';') ++i; break; } else currentValue += css[i]; } else if (! css[i].isSpace()) { if (css[i] == '\'' || css[i] == '\"') quote = css[i].toLatin1(); else currentValue += css[i]; } } m_elements[element][currentProperty] = currentValue; while (css[i + 1].isSpace()) ++i; if (css[i + 1] == '}') { ++i; inBlock = false; } } } updateElementCombo(); updatePreview(); } void CSSEdit::setElementsAliases(const QHash &aliases) { m_elementsAliases = aliases; updateElementCombo(); updatePreview(); } QString CSSEdit::css() const { QString result; for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { result += i.key() + "\n{\n"; for (Element::const_iterator j = i->begin(); j != i->end(); ++j) { result += j.key() + ": "; if (j->contains(' ')) result += "\"" + *j + "\";\n"; else result += *j + ";\n"; } result += "}\n"; } return result; } void CSSEdit::setCurrentElement(int index) { if (! m_elements.contains(m_elementCombo->itemData(index).toString())) return; m_currentElement = m_elementCombo->itemData(index).toString(); Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); QColor color(element->contains("color") ? element->value("color") : parentElement["color"]); m_colorButton->setText(color.name()); QPalette palette = m_colorButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); m_colorButton->setPalette(palette); color = QColor(element->contains("background-color") ? element->value("background-color") : parentElement["background-color"]); m_backgroundButton->setText(color.name()); palette = m_backgroundButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); m_backgroundButton->setPalette(palette); m_fontCombo->setCurrentFont(element->contains("font-family") ? element->value("font-family") : parentElement["font-family"]); QString value = element->contains("font-size") ? element->value("font-size") : parentElement["font-size"]; if (! value.endsWith("pt")) value = parentElement["font-size"]; m_sizeSpin->setValue(value.left(value.length() - 2).toInt()); value = element->contains("font-weight") ? element->value("font-weight") : parentElement["font-weight"]; m_boldButton->setChecked(value == "bold"); value = element->contains("font-style") ? element->value("font-style") : parentElement["font-style"]; m_italicButton->setChecked(value == "italic"); value = element->contains("text-decoration") ? element->value("text-decoration") : parentElement["text-decoration"]; m_underlineButton->setChecked(value == "underline"); updatePreview(); } void CSSEdit::propertyChanged() { if (! sender()) return; if (! m_elements.contains(m_currentElement)) return; Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); if (sender() == m_fontCombo) { QString font = m_fontCombo->currentText(); if (parentElement["font-family"] == font) element->remove("font-family"); else element->insert("font-family", font); } else if (sender() == m_sizeSpin) { QString size = QString::number(m_sizeSpin->value()) + "pt"; if (parentElement["font-size"] == size) element->remove("font-size"); else element->insert("font-size", size); } else if (sender() == m_boldButton) { QString weight = (m_boldButton->isChecked() ? "bold" : "normal"); if (parentElement["font-weight"] == weight) element->remove("font-weight"); else element->insert("font-weight", weight); } else if(sender() == m_italicButton) { QString style = (m_italicButton->isChecked() ? "italic" : "normal"); if (parentElement["font-style"] == style) element->remove("font-style"); else element->insert("font-style", style); } else if(sender() == m_underlineButton) { QString decoration = (m_underlineButton->isChecked() ? "underline" : "none"); if (parentElement["text-decoration"] == decoration) element->remove("text-decoration"); else element->insert("text-decoration", decoration); } updatePreview(); } void CSSEdit::colorSelectClicked() { QToolButton *colorButton; QString propertyName; if (sender() == m_colorButton) { colorButton = m_colorButton; propertyName = "color"; } else if (sender() == m_backgroundButton) { colorButton = m_backgroundButton; propertyName = "background-color"; } else return; if (! m_elements.contains(m_currentElement)) return; Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); QColor color = QColorDialog::getColor(QColor(colorButton->text()), this); if (color.isValid()) { colorButton->setText(color.name()); QPalette palette = colorButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); colorButton->setPalette(palette); if (parentElement[propertyName] == color.name()) element->remove(propertyName); else element->insert(propertyName, color.name()); updatePreview(); } } void CSSEdit::updatePreview() { QString html = ""; html += ""; for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { QString alias; if (m_elementsAliases.contains(i.key())) alias = m_elementsAliases.value(i.key()); else alias = i.key(); int pos = i.key().indexOf('.'); if (pos == -1) html += "<" + i.key() + ">" + alias + "
    "; else { QString parent = i.key().left(pos); QString class_ = i.key().mid(pos + 1); html += "<" + parent + " class=\'" + class_ + "\'>" + alias + "
    "; } } html += ""; m_preview->setHtml(html); } void CSSEdit::updateElementCombo() { m_elementCombo->clear(); for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { QString alias; if (m_elementsAliases.contains(i.key())) alias = m_elementsAliases.value(i.key()); else alias = i.key(); m_elementCombo->addItem(alias, i.key()); } if (m_elements.begin() != m_elements.end()) m_currentElement = m_elements.begin().key(); else m_currentElement.clear(); } CSSEdit::Element CSSEdit::getParentElement(const QString &elementName) { Element body = m_elements.value("body"); if (elementName == "body") { body["color"] = QApplication::palette().color(QPalette::Normal, QPalette::Text).name(); body["background-color"] = QApplication::palette().color(QPalette::Normal, QPalette::Base).name(); body["font-family"] = QApplication::font().family(); body["font-size"] = QString::number(QApplication::font().pointSize()) + "pt"; body["font-weight"] = (QApplication::font().weight() == QFont::Bold) ? "bold" : "normal"; body["font-style"] = (QApplication::font().style() == QFont::StyleItalic) ? "italic" : "normal"; body["text-decoration"] = QApplication::font().underline() ? "underline" : "none"; return body; } else { if (! body.contains("color")) body["color"] = QApplication::palette().color(QPalette::Normal, QPalette::Text).name(); if (! body.contains("background-color")) body["background-color"] = QApplication::palette().color(QPalette::Normal, QPalette::Base).name(); if (! body.contains("font-family")) body["font-family"] = QApplication::font().family(); if (! body.contains("font-size")) body["font-size"] = QString::number(QApplication::font().pointSize()) + "pt"; if (! body.contains("font-weight")) body["font-weight"] = (QApplication::font().weight() == QFont::Bold) ? "bold" : "normal"; if (! body.contains("font-style")) body["font-style"] = (QApplication::font().style() == QFont::StyleItalic) ? "italic" : "normal"; if (! body.contains("text-decoration")) body["text-decoration"] = QApplication::font().underline() ? "underline" : "none"; } QString parentName; int pos = elementName.indexOf('.'); if (pos != -1) { parentName = elementName.left(pos); if (m_elements.contains(parentName)) { Element parent = m_elements[parentName]; for (Element::const_iterator i = body.begin(); i != body.end(); ++i) if (! parent.contains(i.key())) parent[i.key()] = *i; return parent; } else return body; } return body; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/cssedit.h000066400000000000000000000053011323166163100211550ustar00rootroot00000000000000/***************************************************************************** * cssedit.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef CSSEDIT_H #define CSSEDIT_H #include "ui_cssedit.h" #include namespace QStarDict { /** * CSS styles editor. */ class CSSEdit: public QWidget, private Ui::CSSEdit { Q_OBJECT public: /** * Constructor. */ CSSEdit(QWidget *parent = 0); /** * Set CSS style for editing. */ void setCSS(const QString &css); /** * Returns edited CSS style. */ QString css() const; /** * Set aliases for elements. */ void setElementsAliases(const QHash &aliases); /** * Returns elements aliases. */ const QHash &elementsAliases() const { return m_elementsAliases; } private slots: void colorSelectClicked(); void setCurrentElement(int index); void propertyChanged(); private: typedef QHash Element; void updateElementCombo(); void updatePreview(); Element getParentElement(const QString &elementName); QHash m_elements; QHash m_elementsAliases; QString m_currentElement; }; } #endif // CSSEDIT_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/qstardict/cssedit.ui000066400000000000000000000113661323166163100213530ustar00rootroot00000000000000 QStarDict::CSSEdit 0 0 100 30 Preview true Element Foreground Background Select element Click to select color #000000 Click to select color #000000 Font Size Select font Select font size pt 4 150 2 10 75 true Bold B true 50 true false Italic I true 50 false true Underline U true m_elementCombo m_colorButton m_fontCombo m_sizeSpin m_boldButton m_italicButton m_underlineButton qstardict-qstardict-1.3/qstardict/dbusadaptor.cpp000066400000000000000000000050751323166163100223720ustar00rootroot00000000000000/***************************************************************************** * dbusadaptor.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dbusadaptor.h" #include #include "application.h" #include "mainwindow.h" #include "popupwindow.h" namespace QStarDict { DBusAdaptor::DBusAdaptor(MainWindow *mainWindow) : QDBusAbstractAdaptor(mainWindow), m_mainWindow(mainWindow) { QDBusConnection connection = QDBusConnection::sessionBus(); connection.registerService("org.qstardict.dbus"); connection.registerObject("/qstardict", mainWindow); } bool DBusAdaptor::mainWindowVisible() const { return m_mainWindow->isVisible(); } void DBusAdaptor::setMainWindowVisible(bool visible) { m_mainWindow->setVisible(visible); } void DBusAdaptor::showTranslation(const QString &text) { m_mainWindow->showTranslation(text); } void DBusAdaptor::showPopup(const QString &text) { Application::instance()->popupWindow()->showTranslation(text); } QString DBusAdaptor::translate(const QString &text) { return Application::instance()->dictCore()->translate(text); } QString DBusAdaptor::translateHtml(const QString &text) { return Application::instance()->dictCore()->translate(text); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dbusadaptor.h000066400000000000000000000056461323166163100220430ustar00rootroot00000000000000/***************************************************************************** * dbusadaptor.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DBUSADAPTOR_H #define DBUSADAPTOR_H #include namespace QStarDict { class MainWindow; /** * The DBusAdaptor class represents and QStarDict D-Bus interface. */ class DBusAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.qstardict.dbus") /** * The main window visible property. */ Q_PROPERTY(int mainWindowVisible READ mainWindowVisible WRITE setMainWindowVisible) public: /** * Construct a DBusAdaptor. */ DBusAdaptor(MainWindow *mainWindow); /** * Return true if main window is visible, otherwise return * false. */ bool mainWindowVisible() const; /** * Set visible state of main window. */ void setMainWindowVisible(bool visible); public slots: /** * Show main window with translation of text. */ void showTranslation(const QString &text); /** * Show popup window with translation of text. */ void showPopup(const QString &text); /** * Return a translation of text in plain text format. */ QString translate(const QString &text); /** * Return a translation of text in HTML format. */ QString translateHtml(const QString &text); private: MainWindow *m_mainWindow; }; } #endif // DBUSADAPTOR_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dictbrowser.cpp000066400000000000000000000132401323166163100224020ustar00rootroot00000000000000/***************************************************************************** * dictbrowser.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include #include "dictbrowser.h" #include #include #include #include #include #include #include "../plugins/dictplugin.h" #include "application.h" #include "pluginmanager.h" namespace { const QString translationCSS = "body {\n" "font-size: 10pt; }\n" "font.dict_name {\n" "color: blue;\n" "font-style: italic; }\n" "font.title {\n" "font-size: 16pt;\n" "font-weight: bold; }\n" "font.explanation {\n" "color: #7f7f7f;\n" "font-style: italic; }\n" "font.abbreviature {\n" "font-style: italic; }\n" "font.example {\n" "font-style: italic; }\n" "font.transcription {\n" "font-weight: bold; }\n"; } namespace QStarDict { DictBrowser::DictBrowser(QWidget *parent) : QTextBrowser(parent), m_dict(0), m_highlighted(false), m_searchUndo(false) { document()->setDefaultStyleSheet(translationCSS); setOpenLinks(false); setOpenExternalLinks(false); connect(this, SIGNAL(anchorClicked(const QUrl &)), SLOT(on_anchorClicked(const QUrl &))); } QVariant DictBrowser::loadResource(int type, const QUrl &name) { if (type == QTextDocument::HtmlResource && name.scheme() == "qstardict") { QString str = name.toString(QUrl::RemoveScheme); QString result = m_dict->translate(str); if (result.isEmpty()) result = "
    " + tr("The word %1 is not found.").arg(str) + "
    "; return "Translation for \"" + str + "\"\n" + "" + result + ""; } else if (name.scheme() == "plugin") { DictPlugin *plugin = Application::instance()->pluginManager()->plugin(name.host()); if (! plugin) return QVariant(); return plugin->resource(type, name); } return QTextBrowser::loadResource(type, name); } void DictBrowser::search(const QString & exp, QTextDocument::FindFlags options) { bool found = false; QList extraSelections; moveCursor(QTextCursor::Start); QColor color = QColor(Qt::gray).lighter(130); while (find(exp, options)) { found = true; QTextEdit::ExtraSelection extra; extra.format.setBackground(color); extra.cursor = textCursor(); extraSelections.append(extra); } setExtraSelections(extraSelections); emit searchResult(found); } void DictBrowser::mouseMoveEvent(QMouseEvent *event) { if (m_highlighted) { m_oldCursor.setCharFormat(m_oldFormat); m_highlighted = false; } if (event->modifiers().testFlag(Qt::ControlModifier)) { QTextCursor cursor = cursorForPosition(event->pos()); cursor.select(QTextCursor::WordUnderCursor); QString selection = cursor.selection().toPlainText().simplified(); if (m_dict->isTranslatable(selection)) { m_oldCursor = cursor; m_oldFormat = cursor.charFormat(); QTextCharFormat format = m_oldFormat; format.setForeground(Qt::blue); format.setFontUnderline(true); cursor.setCharFormat(format); m_highlighted = true; } } QTextBrowser::mouseMoveEvent(event); } void DictBrowser::mousePressEvent(QMouseEvent *event) { if (event->modifiers().testFlag(Qt::ControlModifier)) { QTextCursor cursor = cursorForPosition(event->pos()); cursor.select(QTextCursor::WordUnderCursor); QString selection = cursor.selection().toPlainText().simplified(); if (m_dict->isTranslatable(selection)) { setSource(selection); if (m_highlighted) m_highlighted = false; } } QTextBrowser::mousePressEvent(event); } void DictBrowser::on_anchorClicked(const QUrl &link) { QString scheme = link.scheme(); if (scheme == "plugin" || scheme == "qrc") setSource(link); else QDesktopServices::openUrl(link); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dictbrowser.h000066400000000000000000000055771323166163100220650ustar00rootroot00000000000000/***************************************************************************** * dictbrowser.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTBROWSER_H #define DICTBROWSER_H #include #include #include #include "dictcore.h" namespace QStarDict { /** * The DictBrowser widget provides view of translations from given dictionary. */ class DictBrowser: public QTextBrowser { Q_OBJECT public: /** * Construct empty DictWidget. */ DictBrowser(QWidget *parent = 0); /** * Set source dictionary. * Warning: DictBrowser will copy only a pointer to dict. So set dictionaries * allocated from heap and don't destroy it befor DictWidget. */ void setDict(DictCore *dict) { m_dict = dict; } /** * Return pointer to dictionary. */ const DictCore* dict() const { return m_dict; } QVariant loadResource(int type, const QUrl &name); signals: void searchResult(bool success); public slots: void search(const QString & exp, QTextDocument::FindFlags options); protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); private slots: void on_anchorClicked(const QUrl &link); private: DictCore *m_dict; QTextCursor m_oldCursor; QTextCharFormat m_oldFormat; bool m_highlighted; bool m_searchUndo; }; } #endif // DICTBROWSER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dictbrowsersearch.cpp000066400000000000000000000050421323166163100235710ustar00rootroot00000000000000/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Petr Vanek * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictbrowsersearch.h" namespace QStarDict { DictBrowserSearch::DictBrowserSearch(QWidget *parent) : QWidget(parent) { setupUi(this); connect(searchEdit, SIGNAL(textEdited(QString)), this, SLOT(searchAll())); connect(caseSensitiveCheckBox, SIGNAL(clicked()), this, SLOT(searchAll())); connect(wholeWordsCheckBox, SIGNAL(clicked()), this, SLOT(searchAll())); } void DictBrowserSearch::searchAll() { QTextDocument::FindFlags f = 0; if (caseSensitiveCheckBox->isChecked()) f |= QTextDocument::FindCaseSensitively; if (wholeWordsCheckBox->isChecked()) f |= QTextDocument::FindWholeWords; emit search(searchEdit->text(), f); } void DictBrowserSearch::searchResult(bool success) { QPalette p; if (!success) { p.setColor(QPalette::Base, Qt::red); } searchEdit->setPalette(p); } void DictBrowserSearch::showEvent(QShowEvent * event) { QWidget::showEvent(event); searchEdit->setFocus(Qt::OtherFocusReason); if (searchEdit->text().length()) searchAll(); } void DictBrowserSearch::closeEvent(QCloseEvent * event) { QWidget::closeEvent(event); } } // namespace qstardict-qstardict-1.3/qstardict/dictbrowsersearch.h000066400000000000000000000037541323166163100232460ustar00rootroot00000000000000/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Petr Vanek * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTBROWSERSEARCH_H #define DICTBROWSERSEARCH_H #include #include "ui_dictbrowsersearch.h" namespace QStarDict { class DictBrowserSearch : public QWidget, private Ui::DictBrowserSearch { Q_OBJECT public: explicit DictBrowserSearch(QWidget *parent = 0); signals: void search(const QString & exp, QTextDocument::FindFlags options); public slots: void searchResult(bool success); private slots: void searchAll(); private: void showEvent(QShowEvent * event); void closeEvent(QCloseEvent * event); }; } // namespace #endif // DICTBROWSERSEARCH_H qstardict-qstardict-1.3/qstardict/dictbrowsersearch.ui000066400000000000000000000021241323166163100234220ustar00rootroot00000000000000 DictBrowserSearch 0 0 413 50 Form Search: Case sensitive Whole words qstardict-qstardict-1.3/qstardict/dictcore.cpp000066400000000000000000000153631323166163100216570ustar00rootroot00000000000000/***************************************************************************** * dictcore.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictcore.h" #include #include #include #include #include #include #include #include "../plugins/dictplugin.h" #include "application.h" #include "pluginmanager.h" namespace QStarDict { DictCore::DictCore(QObject *parent) : QObject(parent) { loadSettings(); } DictCore::~DictCore() { saveSettings(); } bool DictCore::isTranslatable(const QString &word) { for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { auto plugin = Application::instance()->pluginManager()->plugin(i->plugin()); if (!plugin) continue; if (plugin->isTranslatable(i->name(), word)) return true; } return false; } QString DictCore::translate(const QString &word) { QString simplifiedWord = word.simplified(); QString result; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { auto plugin = Application::instance()->pluginManager()->plugin(i->plugin()); if (!plugin) continue; if (! plugin->isTranslatable(i->name(), simplifiedWord)) continue; DictPlugin::Translation translation = plugin->translate(i->name(), simplifiedWord); result += "

    \n" "" + translation.dictName() + "
    \n" "" + translation.title() + "
    \n" + translation.translation() + "

    \n"; } return result; } QStringList DictCore::findSimilarWords(const QString &word) { QString simplifiedWord = word.simplified(); QStringList result; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { auto plugin = Application::instance()->pluginManager()->plugin(i->plugin()); if (!plugin) continue; if (! plugin->features().testFlag(DictPlugin::SearchSimilar)) continue; QStringList similar = plugin->findSimilarWords(i->name(), simplifiedWord); for (QStringList::const_iterator j = similar.begin(); j != similar.end(); ++j) if (! result.contains(*j, Qt::CaseSensitive)) result << *j; } return result; } QList DictCore::availableDicts() const { QList result; auto pm = Application::instance()->pluginManager(); foreach (const QString &pluginId, pm->availablePlugins()) { auto plugin = pm->plugin(pluginId); if (plugin) { QStringList dicts = plugin->availableDicts(); for (QStringList::const_iterator j = dicts.begin(); j != dicts.end(); ++j) result << Dictionary(pluginId, *j); } } return result; } void DictCore::setLoadedDicts(const QList &loadedDicts) { auto pm = Application::instance()->pluginManager(); QHash dicts; for (QList::const_iterator i = loadedDicts.begin(); i != loadedDicts.end(); ++i) dicts[i->plugin()] << i->name(); for (QHash::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { auto plugin = pm->plugin(i.key()); if (!plugin) continue; plugin->setLoadedDicts(*i); dicts[i.key()] = plugin->loadedDicts(); } m_loadedDicts.clear(); for (QList::const_iterator i = loadedDicts.begin(); i != loadedDicts.end(); ++i) if (dicts.contains(i->plugin()) && dicts[i->plugin()].contains(i->name())) m_loadedDicts << *i; } void DictCore::saveSettings() { QSettings config; QStringList rawDictsList; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) rawDictsList << i->plugin() << i->name(); config.setValue("DictCore/loadedDicts", rawDictsList); } void DictCore::loadSettings() { QSettings config; QStringList rawDictsList = config.value("DictCore/loadedDicts").toStringList(); if (rawDictsList.isEmpty()) setLoadedDicts(availableDicts()); else { QList dicts; for (QStringList::const_iterator i = rawDictsList.begin(); i != rawDictsList.end(); i += 2) dicts << Dictionary(*i, *(i + 1)); setLoadedDicts(dicts); } } void DictCore::reloadDicts() { QList loaded; foreach (const QString &pluginId, Application::instance()->pluginManager()->availablePlugins()) { DictPlugin *plugin = Application::instance()->pluginManager()->plugin(pluginId); if (!plugin) { continue; } plugin->setLoadedDicts(plugin->loadedDicts()); QStringList loadedNames = plugin->loadedDicts(); for (QStringList::const_iterator j = loadedNames.begin(); j != loadedNames.end(); ++j) loaded << Dictionary(pluginId, *j); } QList oldLoaded = m_loadedDicts; m_loadedDicts.clear(); for (QList::iterator i = oldLoaded.begin(); i != oldLoaded.end(); ++i) if (loaded.contains(*i)) m_loadedDicts << *i; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dictcore.h000066400000000000000000000107241323166163100213200ustar00rootroot00000000000000/***************************************************************************** * dictcore.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTCORE_H #define DICTCORE_H #include #include #include #include #include "../plugins/dictplugin.h" namespace QStarDict { /** * The DictCore is a base dictionary class. */ class DictCore: public QObject { Q_OBJECT public: /** * This class represents a dictionary. */ class Dictionary { public: Dictionary(const QString &plugin, const QString &name) : m_plugin(plugin), m_name(name) { } Dictionary() { } const QString &plugin() const { return m_plugin; } const QString &name() const { return m_name; } void setPlugin(const QString &plugin) { m_plugin = plugin; } void setName(const QString &name) { m_name = name; } bool operator == (const Dictionary &dict) { return m_name == dict.m_name && m_plugin == dict.m_plugin; } private: QString m_plugin; QString m_name; }; /** * Construct dictionary. */ DictCore(QObject *parent = 0); /** * Destructor. */ ~DictCore(); /** * Returns true if word is exists in dictionaries, * otherwise false. */ bool isTranslatable(const QString &word); /** * Returns translation for word. If word not found, returns * "Not found!" */ QString translate(const QString &word); /** * Returns a list of similar words contained in dictionaries. */ QStringList findSimilarWords(const QString &word); /** * Returns a list of available dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. */ QList availableDicts() const; /** * Returns a list of loaded dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. */ const QList &loadedDicts() const { return m_loadedDicts; } /** * Sets a loaded dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. * If dictionary cannot be loaded it will not be added to * availableDicts list. */ void setLoadedDicts(const QList &loadedDicts); /** * Reload loaded dicts. */ void reloadDicts(); /** * Save settings. */ void saveSettings(); private: /** * Load settings. */ void loadSettings(); QList m_loadedDicts; }; } #endif // DICTCORE_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dictwidget.cpp000066400000000000000000000160061323166163100222050ustar00rootroot00000000000000/***************************************************************************** * dictwidget.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictwidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "application.h" #include "dictbrowser.h" #include "dictbrowsersearch.h" #include "speaker.h" namespace { class DictWidgetToolbar: public QToolBar { public: DictWidgetToolbar(QWidget *parent = 0) : QToolBar(parent) { } protected: virtual void mouseDoubleClickEvent(QMouseEvent *event) { if (! actionAt(event->pos())) QToolBar::mouseDoubleClickEvent(event); } }; } namespace QStarDict { DictWidget::DictWidget(QWidget *parent, Qt::WindowFlags f) : QFrame(parent, f) { m_translationView = new DictBrowser(this); setFrameStyle(m_translationView->frameStyle()); m_translationView->setFrameStyle(QFrame::NoFrame); m_translationView->verticalScrollBar()->setCursor(Qt::ArrowCursor); m_translationView->horizontalScrollBar()->setCursor(Qt::ArrowCursor); m_translationView->setOpenExternalLinks(true); connect(m_translationView, SIGNAL(sourceChanged(const QUrl&)), SLOT(on_translationView_sourceChanged(const QUrl&))); m_search = new DictBrowserSearch(this); connect(m_search, SIGNAL(search(const QString &,QTextDocument::FindFlags)), m_translationView, SLOT(search(const QString &,QTextDocument::FindFlags))); connect(m_translationView, SIGNAL(searchResult(bool)), m_search, SLOT(searchResult(bool))); m_search->hide(); m_toolBar = new DictWidgetToolbar(this); m_toolBar->setMouseTracking(true); QAction *actionBackward = m_toolBar->addAction(QIcon(":/icons/go-previous.png"), tr("Go to &previous translation"), m_translationView, SLOT(backward())); actionBackward->setDisabled(true); connect(m_translationView, SIGNAL(backwardAvailable(bool)), actionBackward, SLOT(setEnabled(bool))); QAction *actionForward = m_toolBar->addAction(QIcon(":/icons/go-next.png"), tr("Go to &next translation"), m_translationView, SLOT(forward())); actionForward->setDisabled(true); connect(m_translationView, SIGNAL(forwardAvailable(bool)), actionForward, SLOT(setEnabled(bool))); m_toolBar->addAction(QIcon(":/icons/document-save-as.png"), tr("&Save to file"), this, SLOT(saveToFile())); m_toolBar->addAction(QIcon(":/icons/document-print.png"), tr("Prin&t translation"), this, SLOT(print())); m_toolBar->addAction(QIcon(":/icons/speaker.png"), tr("Speak &word"), this, SLOT(speak())); QAction *actionSearch = m_toolBar->addAction(QIcon(":/icons/system-search.png"), tr("Search"), this, SLOT(handleSearch())); actionSearch->setCheckable(true); actionSearch->setShortcut(QKeySequence::Find); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); layout->addWidget(m_toolBar); layout->addWidget(m_translationView); layout->addWidget(m_search); setLayout(layout); } void DictWidget::translate(const QString &str) { m_translationView->setSource(QUrl("qstardict:" + str)); } void DictWidget::on_translationView_sourceChanged(const QUrl &name) { emit wordTranslated(name.toString(QUrl::RemoveScheme)); } void DictWidget::saveToFile() { static QDir dir( QDir::homePath() ); //added by Frank static QString filter(tr("Text files (*.txt)")); //added by Frank QFileDialog dialog(this, tr("Save translation"), dir.path(), filter); //updated by Frank dialog.selectFile(translatedWord());//added by Frank dialog.setNameFilters(QStringList() << tr("HTML files (*.html *.htm)") << tr("Text files (*.txt)"));//updated by Frank dialog.selectNameFilter(filter); //added by Frank if (dialog.exec() && dialog.selectedFiles().size()) { QString fileName = dialog.selectedFiles().first(); /*QString*/ filter = dialog.selectedNameFilter();//updated by Frank dir = dialog.directory(); //added by Frank if (filter == tr("HTML files (*.html, *.htm)") && ! (fileName.endsWith(".html", Qt::CaseInsensitive) || fileName.endsWith(".htm", Qt::CaseInsensitive))) fileName += ".html"; else if (filter == tr("Text files (*.txt)") && ! fileName.endsWith(".txt", Qt::CaseInsensitive)) fileName += ".txt"; QFile outputFile(fileName); if (! outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Error"), tr("Cannot save translation as %1").arg(fileName)); return; } QTextStream outputStream(&outputFile); if (filter == tr("HTML files (*.html, *.htm)")) outputStream << m_translationView->document()->toHtml("UTF-8"); else outputStream << m_translationView->toPlainText(); } } void DictWidget::speak() { Application::instance()->speaker()->speak(translatedWord()); } void DictWidget::print() { QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer, this); if (dialog.exec() == QDialog::Accepted) m_translationView->print(&printer); } void DictWidget::handleSearch() { m_search->setVisible(!m_search->isVisible()); } void DictWidget::setDefaultStyleSheet(const QString &css) { m_translationView->document()->setDefaultStyleSheet(css); m_translationView->reload(); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/dictwidget.h000066400000000000000000000073201323166163100216510ustar00rootroot00000000000000/***************************************************************************** * dictwidget.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTWIDGET_H #define DICTWIDGET_H #include #include "dictcore.h" #include "dictbrowser.h" class QToolBar; class QAction; namespace QStarDict { class DictBrowserSearch; /** * The DictBrowser widget provides view of translations from given dictionary. */ class DictWidget: public QFrame { Q_OBJECT public: /** * Construct empty DictWidget. */ DictWidget(QWidget *parent = 0, Qt::WindowFlags f = 0); /** * Set source dictionary. * Warning: DictWidget will copy only a pointer to dict. So set dictionaries * allocated from heap and don't destroy it befor DictWidget. */ void setDict(DictCore *dict) { m_translationView->setDict(dict); } /** * Return pointer to dictionary. */ const DictCore* dict() const { return m_translationView->dict(); } /** * Clear translation text. */ void clear() { m_translationView->clear(); } /** * Clear history. */ void clearHistory() { m_translationView->clearHistory(); } /** * Show translation of str. */ void translate(const QString &str); /** * Return last translated word. */ QString translatedWord() const { return m_translationView->source().toString(QUrl::RemoveScheme); } /** * Return toolbar. */ QToolBar *toolBar() { return m_toolBar; } void setDefaultStyleSheet(const QString &css); QString defaultStyleSheet() const { return m_translationView->document()->defaultStyleSheet(); } void reload() { m_translationView->reload(); } signals: /** * Emits when translated word is shown. */ void wordTranslated(const QString &word); private slots: void on_translationView_sourceChanged(const QUrl &name); void saveToFile(); void speak(); void print(); void handleSearch(); private: DictBrowser *m_translationView; QToolBar *m_toolBar; DictBrowserSearch *m_search; }; } #endif // DICTWIDGET_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/keyboard.cpp000066400000000000000000000062261323166163100216610ustar00rootroot00000000000000/***************************************************************************** * keyboard.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include #include "keyboard.h" #ifdef Q_OS_WIN #include #include namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { Qt::KeyboardModifiers result; if (GetAsyncKeyState(VK_MENU) & 0x8000) result |= Qt::AltModifier; if (GetAsyncKeyState(VK_CONTROL) & 0x8000) result |= Qt::ControlModifier; if (GetAsyncKeyState(VK_SHIFT) & 0x8000) result |= Qt::ShiftModifier; if ((GetAsyncKeyState(VK_LWIN) & 0x8000) || (GetAsyncKeyState(VK_RWIN) & 0x8000)) result |= Qt::MetaModifier; return result; } } // namespace #elif defined(Q_OS_MAC) #include namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { return QApplication::keyboardModifiers(); } } // namespace #elif defined(Q_OS_UNIX) #if QT_VERSION < 0x040800 #include #endif #include #include namespace { const unsigned mAlt = 0010; const unsigned mCtrl = 0004; const unsigned mShift = 0001; const unsigned mWin = 0100; } namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { #if QT_VERSION < 0x040800 Qt::KeyboardModifiers result; XkbStateRec state; XkbGetState(QX11Info::display(), XkbUseCoreKbd, &state); if (state.base_mods & mAlt) result |= Qt::AltModifier; if (state.base_mods & mCtrl) result |= Qt::ControlModifier; if (state.base_mods & mShift) result |= Qt::ShiftModifier; if (state.base_mods & mWin) result |= Qt::MetaModifier; return result; #else return QApplication::queryKeyboardModifiers(); #endif } } // namespace #endif // Q_WS_MAC // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/keyboard.h000066400000000000000000000034461323166163100213270ustar00rootroot00000000000000/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef KEYBOARD_H #define KEYBOARD_H #include namespace QStarDict { /** * The Keyboard class is a representation. */ class Keyboard { public: /** * Return active keyboard modifiers. */ static Qt::KeyboardModifiers activeModifiers(); }; } #endif // KEYBOARD_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/main.cpp000066400000000000000000000056611323166163100210070ustar00rootroot00000000000000/***************************************************************************** * main.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "application.h" #ifdef Q_OS_UNIX #include #include #include #include #include #elif defined(Q_OS_WIN) // Q_OS_UNIX #include #include #endif // Q_OS_WIN #ifdef QSTARDICT_WITH_TRANSLATIONS #include #include #endif // QSTARDICT_WITH_TRANSLATIONS int main(int argc, char *argv[]) { QStarDict::Application app(argc, argv); #ifdef Q_OS_UNIX QSettings lockFile(QDir::homePath() + "/.qstardict/qstardict.pid", QSettings::IniFormat); QString lastPid = lockFile.value("LastStart/pid").toString(); if (lastPid.length() && QDir("/proc/" + lastPid).exists() && lockFile.value("LastStart/time").toDateTime() == QFileInfo("/proc/" + lastPid).created()) { qDebug("qstardict: already running"); return 0; } lockFile.setValue("LastStart/pid", getpid()); lockFile.setValue("LastStart/time", QFileInfo("/proc/" + QString::number(getpid())).created()); lockFile.sync(); #elif defined(Q_OS_WIN) // Q_OS_UNIX HANDLE hMutex = CreateMutex(NULL, true, (LPCTSTR)"qstardict"); if (GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox::information(0, "Warning", "QStarDict is already running"); // Strange encoding issue... // MessageBox(0, (LPCWSTR)"Warning", (LPCWSTR)"QStarDict is already running", MB_ICONWARNING); return 0; } #endif // Q_OS_WIN return app.exec(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/mainwindow.cpp000066400000000000000000000211521323166163100222300ustar00rootroot00000000000000/***************************************************************************** * mainwindow.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007-2009 Alexander * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dictcore.h" #include "application.h" #include "popupwindow.h" #include "settingsdialog.h" #include "trayicon.h" #include "qxt/qxtglobalshortcut.h" namespace QStarDict { MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_instantSearch(false), m_queryTimer(0) { setupUi(this); m_dict = 0; translationView->setDict(m_dict); menu_File->insertActions(actionQuit, translationView->toolBar()->actions()); menu_Options->insertAction(menu_Options->actions().first(), wordsListDock->toggleViewAction()); createConnections(); loadSettings(); } MainWindow::~MainWindow() { saveSettings(); } void MainWindow::showTranslation(const QString &text) { searchBox->setText(text); on_queryButton_clicked(); } void MainWindow::createConnections() { Application * const app = Application::instance(); connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit())); actionScan->setChecked(app->popupWindow()->isScan()); connect(actionScan, SIGNAL(toggled(bool)), app->popupWindow(), SLOT(setScan(bool))); connect(app->popupWindow(), SIGNAL(scanChanged(bool)), actionScan, SLOT(setChecked(bool))); connect(wordsList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(wordsListItemActivated(QListWidgetItem*))); connect(wordsList, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(wordsListItemActivated(QListWidgetItem*))); connect(translationView, SIGNAL(wordTranslated(const QString&)), SLOT(wordTranslated(const QString&))); connect(app->popupShortcut(), SIGNAL(activated()), app->popupWindow(), SLOT(showClipboardTranslation())); } void MainWindow::loadSettings() { Application * const app = Application::instance(); QSettings config; restoreGeometry(config.value("MainWindow/geometry", QByteArray()).toByteArray()); restoreState(config.value("MainWindow/state", QByteArray()).toByteArray()); setVisible(config.value("MainWindow/visible", true).toBool()); if (isHidden() && ! app->trayIcon()->isVisible()) show(); wordsListDock->setFloating(config.value("MainWindow/wordsListDock/floating", wordsListDock->isFloating()).toBool()); wordsListDock->setGeometry(config.value("MainWindow/wordsListDock/geometry", wordsListDock->geometry()).toRect()); setInstantSearch(config.value("MainWindow/instantSearch", true).toBool()); setDefaultStyleSheet(config.value("MainWindow/defaultStyleSheet", defaultStyleSheet()).toString()); app->popupShortcut()->setShortcut(QKeySequence( config.value("MainWindow/popupShortcutString", tr("Ctrl+T")).toString())); app->popupShortcut()->setEnabled( config.value("MainWindow/popupShortcutEnabled", false).toBool()); } void MainWindow::saveSettings() { QSettings config; config.setValue("MainWindow/geometry", saveGeometry()); config.setValue("MainWindow/state", saveState()); config.setValue("MainWindow/visible", isVisible()); config.setValue("MainWindow/wordsListDock/floating", wordsListDock->isFloating()); config.setValue("MainWindow/wordsListDock/geometry", wordsListDock->geometry()); config.setValue("MainWindow/instantSearch", m_instantSearch); config.setValue("MainWindow/defaultStyleSheet", defaultStyleSheet()); Application * const app = Application::instance(); config.setValue("MainWindow/popupShortcutString", app->popupShortcut()->shortcut().toString()); config.setValue("MainWindow/popupShortcutEnabled", app->popupShortcut()->isEnabled()); } void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, tr("About QStarDict"), tr("QStarDict %1 - Qt version of StarDict
    ").arg(QSTARDICT_VERSION) + tr("Copyright (C) 2007-2009 Alexander Rodin " "http://qstardict.ylsoftware.com")); } void MainWindow::on_actionSettings_triggered() { SettingsDialog dialog(this); dialog.exec(); } void MainWindow::on_actionHelp_triggered() { QDesktopServices::openUrl(QUrl("http://wiki.qstardict.ylsoftware.com")); } void MainWindow::on_queryButton_clicked() { if (searchBox->text().simplified().isEmpty()) { setWindowTitle(tr("QStarDict")); translationView->clear(); wordsList->clear(); return; } wordsList->clear(); wordsList->addItems(m_dict->findSimilarWords(searchBox->text())); translationView->translate(searchBox->text()); } void MainWindow::reload() { wordsList->clear(); wordsList->addItems(m_dict->findSimilarWords(translationView->translatedWord())); translationView->reload(); } void MainWindow::queryEdited(const QString &) { if (m_queryTimer) killTimer(m_queryTimer); m_queryTimer = startTimer(200); } void MainWindow::timerEvent(QTimerEvent *event) { if (event->timerId() == m_queryTimer) { killTimer(m_queryTimer); m_queryTimer = 0; on_queryButton_clicked(); } else QMainWindow::timerEvent(event); } void MainWindow::wordTranslated(const QString &word) { if (word.simplified().isEmpty()) setWindowTitle(tr("QStarDict")); else setWindowTitle(tr("%1 - QStarDict").arg(word)); if (m_queryTimer) { killTimer(m_queryTimer); m_queryTimer = 0; } } void MainWindow::wordsListItemActivated(QListWidgetItem *item) { searchBox->setText(item->text()); translationView->translate(item->text()); setWindowTitle(tr("%1 - QStarDict").arg(translationView->translatedWord())); } void MainWindow::setInstantSearch(bool instantSearch) { if (instantSearch == m_instantSearch) return; m_instantSearch = instantSearch; if (m_instantSearch) connect(searchBox, SIGNAL(textEdited(const QString&)), SLOT(queryEdited(const QString&))); else disconnect(searchBox, SIGNAL(textEdited(const QString&)), this, SLOT(queryEdited(const QString&))); } void MainWindow::setDict(DictCore *dict) { m_dict = dict; translationView->setDict(dict); } void MainWindow::keyPressEvent(QKeyEvent *event) { if (event->text().size() || event->key() == Qt::Key_Escape) { if (! searchBox->hasFocus()) { searchBox->setText(event->text()); searchBox->setFocus(Qt::OtherFocusReason); } if (event->key() == Qt::Key_Escape) { if (searchBox->text().isEmpty()) close(); else searchBox->clear(); } } QMainWindow::keyPressEvent(event); } void MainWindow::closeEvent(QCloseEvent *event) { if (! Application::instance()->trayIcon()->isVisible()) Application::instance()->quit(); QMainWindow::closeEvent(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/mainwindow.h000066400000000000000000000073511323166163100217020ustar00rootroot00000000000000/***************************************************************************** * mainwindow.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "ui_mainwindow.h" class QMenu; class QCloseEvent; namespace QStarDict { class DictCore; class SettingsDialog; /** * The main window of QStarDict. */ class MainWindow: public QMainWindow, private Ui::MainWindow { Q_OBJECT public: /** * Create new MainWindow. */ MainWindow(QWidget *parent = 0); /** * Destructor. */ ~MainWindow(); /** * Return true if instant search is on, otherwise false. */ bool isInstantSearch() const { return m_instantSearch; } /** * Set instant search mode. If instantSearch is true * translation will be shown when typing, otherwise only when * "Search" button clicked. */ void setInstantSearch(bool instantSearch); /** * Set the dictionary. */ void setDict(DictCore *dict); /** * Return the dictionary. */ DictCore *dict() const { return m_dict; } /** * Set default style sheet for translations. */ void setDefaultStyleSheet(const QString &css) { translationView->setDefaultStyleSheet(css); } /** * Return default style sheet. */ QString defaultStyleSheet() const { return translationView->defaultStyleSheet(); } void reload(); void saveSettings(); public slots: /** * Show translation of word. */ void showTranslation(const QString &word); protected: void timerEvent(QTimerEvent *event); void keyPressEvent(QKeyEvent *event); void closeEvent(QCloseEvent *event); private slots: void on_actionAbout_triggered(); void on_actionSettings_triggered(); void on_actionHelp_triggered(); void on_queryButton_clicked(); void wordsListItemActivated(QListWidgetItem *item); void wordTranslated(const QString &word); void queryEdited(const QString &); private: void createConnections(); void loadSettings(); DictCore *m_dict; bool m_instantSearch; int m_queryTimer; }; } #endif // MAINWINDOW_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/mainwindow.ui000066400000000000000000000155171323166163100220730ustar00rootroot00000000000000 QStarDict::MainWindow 0 0 742 511 QStarDict :/icons/qstardict.png:/icons/qstardict.png 9 6 6 0 Clear the search box Clear :/icons/clear-right.png:/icons/clear-right.png Qt::ToolButtonIconOnly Fuzzy query Search :/icons/search-filter.png:/icons/search-filter.png Qt::ToolButtonTextBesideIcon QDockWidget::AllDockWidgetFeatures Qt::NoDockWidgetArea Words list 1 9 6 0 0 742 22 &File &Help &Settings :/icons/application-exit.png:/icons/application-exit.png &Quit Ctrl+Q &About About &Qt :/icons/configure.png:/icons/configure.png &Configure QStarDict true &Scan :/icons/help-contents.png:/icons/help-contents.png QStarDict &Help F1 DictWidget QWidget
    dictwidget.h
    searchBox queryButton wordsList searchClearButton searchClearButton clicked() searchBox clear() 315 59 647 61 searchClearButton clicked() searchBox setFocus() 315 59 647 61 searchBox returnPressed() queryButton click() 438 50 661 51
    qstardict-qstardict-1.3/qstardict/pixmaps/000077500000000000000000000000001323166163100210305ustar00rootroot00000000000000qstardict-qstardict-1.3/qstardict/pixmaps/application-exit.png000066400000000000000000000261721323166163100250200ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœíy”Åç?‘™UÕU}Uõ¥«¥ÖÙº9dn30 700æ2—=öÎìxßì?k dû;Ý7³žñÉØ0À’ 8Ææ2Æf0ƒ®nu«ÕêS-õYGÆþ‘GEfe]Ý-ðÌöï½êÌŒŒŒŒˆï÷wDdd6ÌÈŒÌÈŒÌÈŒÌÈŒÌÈÿw"&{¡Ì^ë–±e åÍHérH€À½ íN—“)«lÀlà5@k=š¢Dãdj0#eK/P2fäBÈ&`Š2‰P2à÷€Q ¡ ‡!”£ª¢"”jhE€¤”3Và8JX9„úúRéññä1ÈÔA2 ©!HýÒוA„’À’ Þ£Âi¨×Ô$Ž47ߪ¯¿HÓõùãÝÝ•H.¡œ²eº®QÓDžôrï—/o±û—[fPš&ÄD¸¾~Xšæ~³§ç™æ¾¾‡‡†Žh0Ö©OAº%€­ùFTUC§œò_c«VýE¨¾¾Ê#3<̱]»ÊjPPž ŠLüãE¸rISîùRë8ýtôÊJ´Š Æ>:ò»ßý}Íï~÷ÝJn‡ñRH ©˜Œ=Õ!‘¼êªGë/½ôÆpSSaA&„`¼­­¬ÊåyÒ¥r>_" m22Ùû—S^Púd­NÕòåUUÕÕÄ,ˆT¯]{Þ]?)¼wïódöƒùƒ"ÅEî§õB$U×]öÓ¹7Þ¸ÞL&É {.”€Ìd 6èã2ÿù®/È|ä4K¨Óñp ùòjºŽ^U…^Y‰^Yi¡²’…·ÞzA[:ý£ª_üâ¶(˜›Á¼Þ %/$ˆ6U@ôèªUÿeî…ž#¥D¯ª!ÈTUaNL £Qª–,!²bF¬ø 2ÔØx{cSSuzx#¢Q¦IdáBöîåÈž=3 B2´w/Uóæ1ûÔSïêb¤¢©ëh##DçÌ©=\_SMW×?ãX^,Ç `ƒ=ì› fÏþS™J1–N#ÇÇ õ÷]º”î7ßd¸»ûø¶pFŠÊ±Ž4à~õjRï½ÇÄÄ"•"¤iH\íêúÑ›`l€ô†R p/Ð Ú„E(Ô2:2B*&™?Ÿc]]ëê:® ›‘Òåˆm *.äØ{ï1qô(‘áad,¶$á Ý l¸6[@œl…sF²¯7vð_Þ J°ì;ßáXoïŒÙÿ#“¡¶6ðîÆˆt#bnKKeŒ!Ð^Ê3çH€ë€6ÐD8¬ŒDð¨ªÂL§§¿32%I Ѱv-ÆìÙ¤;;I%SŒŽŒFôpX×’Iíº<×à%õ ¢ xΙ0£ý„’G‡Ñ ÒH`dx˜”åÊÅKåX€Z@€HÊ4™DÊOzD<#~q”Ò”ÒÅjb|œˆ0П纼¶-@&v ôÏøÍÈ‘8VYˆ¬²¦Ó¤ C+ðÌ'Ÿ:””Âô™{išŸøŒØŒäŠ”çù XÊš1MRÔ«ò\WÐè s\+0C€?J‘ØÖ¾“¤AL”k üT¦›๎ÞÝ¿Ÿ£##,nnæÏ–/g^¸èò‚ÿPÒ11Á3|@Û¡CÔVU±néR>3gNáDZeˆƒ‹T\Xº®ØÓ@á{: ’’‡~ÿ{v8à¦ínog_g'_øô§Y‰LÓ>YùhlŒ_y…Œ? ñó7ߤcáB>¿r%!QtYFq‘ás¶”O€7ATƒÈXkÿ<NRRòðGq°¯Ûn»SO=•ššöîÝËæÍ›ù—_ýŠ[Î>›E¡Ð4Üí““=<üë_³jÕ*®½öZ-ZÄÐлvíbË–-<¢iܰlÙ”I ÍU±×l¾Yî0,ÿ‘óL}6ïÝËá#GøÚ×¾Fkk«{nÍš5,_¾œø‡à‘×_ç¦ÓO§EŸ.CùñʾTŠÍ»vqê©§òå/ðº;‹qÅW°dÉþîïþŽÍûöqýâÅS^Ë€QXR¡¼ï5+¦Û÷+7šÊ/išlko§÷Ø1þæoþƾ#¡Pˆ¿ú«¿âÄ“NbëoË)Þó“øíO§yüw8ž*«W¯æ«_ý*=CC<~à))'OyÌ­€(¶zÃ3 pƒÀ)€¿£«‹ÞcÇøë¿þë@ð1 ƒ¯|å+¬=á÷]:§Ò9ó¯Í4ÙþÞ{œ¼n÷ÜsO øŽ¬ZµŠ¯|å+bÇ¡C“&;€×P$ÈK€QŸp 4§þ3½½ôó—ù—,[¶¬P½\|ñ‹_dÍÚµìøÃ8ÈÔ-Ðñþµ›&Ï|ø!'¯[ÇwÞY|GV­ZÅ—¾ô%zŽåÙ¾¾É‘ÀÚ.@YÍ$F'c*!eŽ Àa[¿”iò‹¡!ÆÆøò—¿ÌÒ¥K‹vŠ#†apçw²jõjžÝ·Cš6©:|¿Nàçmmœpâ‰Üzë­%ïÈÊ•+¹çž{èæ…£GÉHYÖ½¥iæLIÃÊ÷ÍK€1ã ©˜Œ È/Ž20>ÎÝwßÍ’%KJî)%RJ ÃàöÛogÅÊ•<à‡ ã×tÿï ®ó‹ŽV¯YÃÍ7ߌ®ënýK•åË—sÇwÐ;2‹££–6—xÿ|.`Ü~”ïžcÿ$Âdða(ÄÀø8·ß~;‹/.¹3\“fw¢®ëÜ|óͬX±‚»º8â ;¿C†ÁK]]¬^³†›nº Í^«¶¡TimmåÖ[o¥ot”Ýå´Q¹‡ßº_QLu0ÜrË-“_MÓun¸ÖåËùeo/½‘È'~w(Ä«}}¬Z½šë¯¿Þ¾ÿWª,[¶Œ›o¾™þ2ë"„pÝ€: (t¯@'µ.rf¯¸újšfÏ.9¿|? Ãàºë®cÛ¶m¼¶?gÅãÔŒ–u¼¥7ã7Gް|Å ®ºê*4MóÔW´gèœtQâ„ÏÒ¥K©­ª¢û¡‡JÊïö^à £yˆPФƒ.*“••É$áp¸¤†ßÙêºÎ5×\Ãâ%Kø÷áab±]ó{£Qv ³¬µ•+¯¼Ò~¡m©– /¹>þÀ¹K †Š ƒÌG¹ÃÀC/¿L("$A©à»×4®¼òJ/Y› VU}là÷Åb¼L²déR.½ôÒðƒL9$ˆÅb„B!º_~¹¬zAÖ¨.`JA P®nogßΆ‘—¥hLPš¦i\rÉ%,Z¼˜wM“#ÕÕÇüª*~,^²„‹/¾ØöK©o)$ˆÅb†Áþgža¸££tðíõA. ÆE§‚=@1¹‰˜®—_fÿsÏ’ ˜Ù,–¦ë:]t ZZøÀ0ª©9nàÕÔðàeáB.¸àÏP/ÐζPqÁÿ·ãàK/•]?Nöþ”¦‚3@š“›$9ðÜsìöÙ’H J±Îtb‚ .¸€æùóù¨¢‚áx|Ú'yŽÖÖòa$‚–>ó™ÏäŒóËñÿAÀÿùç9ðÌ3e×ÏY¤ÎJÃBçªJ§µ©ŽTiöY$°øâ‹‰F£ŒŽŽ曌UÐuóÎ;W_}•=ÝÝ,•’Êþ|K!Ë“cõõì­ªbþܹ¬_¿>'ª/%°+tMee¥þsÏÑþÌ3“ª£4ÍÀ_dÒi-"ßÊŠ¼ˆá =󓪢%í;w‚i²ø’KˆÅbŒØC¸R5©Pš®ë¬_¿ž×^{6Ã`‘€ho錄\%‘†ÚãqšçÌáŒ3ÎÈ ¤È—o躚ÿì³´íÜ9ÉšúúBÙ ±×œ¬v\€ZðT жs'¦”,½ôR*++¶ÊŸøþsš¦qæ™gòúë¯Ó¡ëÌ—’Xo›§Ô¶64ÒÙÐÈÜY³8õÔS' ~ðRJªªª…BìݹÓRŒ©ˆi? ð­È€(rà¹vuvð0.Às§ŸÓdéå——D‚RÏ5:8í´Óxë­·8dèÌ¢=¥½Èêd¤i‡fÏevc#ëÖ­+ ~ÞòHPSSCÈ0ØûôÓ´=ýtIu+$n¨ íöˆq]宊Éã¼*¸íé§‘R²ìŠ+¨ªªbxx8ogNfž`ݺu¼óÎ;ô„BÌÖ r¨´ZÇgÍ¡wþf74²víÚ’À/Åô;Ú_]]í‚¿ÿ©§Jë¬"âhZŽ ˆ¸./&@˜A. „€§iúiPHpìØ1œw&¨ûBÖ®]Ëûï¿O¿aÐ %Ý…I06{} ÓXWϪU«rÀ›Šÿ[óC!ö<õmÓ¾]1„hºžã¦mY¸{/eÌ9ÒöÔSH)i½òJª««9zôhÉ$(–¦ë:«V­âƒ>`P7¨>ÔX‰9Í .n¥¡®ŽÖÖV÷ÁŽ¿ìR#5¯‚ÚÚZ ü;hÛ±£¤ëK§>š½ˆVu…®ËK€¤µ˜0Ǹ7›fKàtȲ2HPê9MÓX±b»wïfÈXMBš„º¼$HΙÏPë*ê –.]šdz)Ú¯iš þî'ŸœvðAQJÝë‘,×,†€T pn6ÍØÿä“HÓ¤õê«©©©ahh¨ ¦•C MÓX¶lûöíãØê“¨‚ÐÁv’óplå $âq-Z”S–#ÅÀÊÇ ‡Ã|ôÄ´mß^z‡”#¦õ8Xh^`‚¨f幬` €½"(èfÓ €ôm¤¤õšk¨­­åÈ‘#@éñ@¡¸@Á¢E‹8pàÃ'|Š*L$‚ÑN!^S r® š±tÒý}d‰„þã[mã¸èŽj†µ„Þ¹… Ú¤cgQ­¯ÐìeJÓÜ a)Rhßñ`Òz͵Äãqé™,B0þ|<ÈèÉgPS]ͼyó벚žÏôkšF]]‘H„Ýo£}ûÅsN; ¤eŸ…J, ½UQþ»XŸÎ@Ps>jóTH8°ý °lHàßB0wî\>Œ‚Y³fåä ’|. §=ð£ýÉÇ-ðÁíD˜ÓHiš 4„À$ƒÀN{EP(` ì›M4tÇØ7:¶oC YzÍu$ ‹jy¡sþy‚¦¦¦‚§­zwþ¡b}}=ìÞ¶…ŽíYð °·rúHà< öJduÑYîDP¹A S"Ó`‚ž5 ûs–šb :ž| ¤ÉÒÏ~ŽD"ÁÀÀþo¸E”i œ…¥šÞºç¿±±‘ŠŠ ölÛLç“Û²m“ÖçuT7à¤[V5oJ’Ù§†i‚ª p‚Àñ<ך{©2S!€ã[œÒUó¯œwö;·?R²ôÚrH0.!è8°ÚE&ƒšššð·Zé¶ÉW-€Õ†Ç=”!‘D‚¦“N¢ñ䓉/^L÷o~ÍÀ‡ú‹)è^x¡˜š –†Ka/FÖC×ü;iJ< ܱ!$K>{#uuuô÷÷Oy²(è8(ݼ“¦Zü½Ûåà“[ƒWö-Wš QŒ¡ª*Ö®¥ñÄ©[±‚‰#GØ¿s'/õ«ô¾ý6‰e‹rb€BEæ%€úr¨GÄb‘5ïÎðBhXvJ±NL¨ù®ëzr BJ_{õõõôõõMj²¨Ð~äîþ¬Y³ˆF£ì}캞܂Ý$O°çt¤ãûý±€,@‚Ê9sH´¶R·bñ¥KIÓñ ìúÛ¿¥óå—ÝÏöéá°; tŠqVåC«¤a Z Í€² à²I-1=•t!ìÚ[O:9´c3 Y|íŸÓÐÐ@ooï”'‹ò·#ø[ÿ•î[< ¢ì»&^ù9y=iôhŒê–j.¤~Íb=p€Î—_æ7÷ßO÷®]˜ê·Õ~ xPhÙWÁ@šÒ@š“EVË•$¤´¿` ³ÚïüØGB÷öŸ&‹¯½™ÆÆFzz¬çýÓ¥ùÝ€¦iÌž=›X,ƾ­?åðöÍPýÀ®»êÿMÛè‘ *,¤rîø€LªÌOò ëI¸uÆÂ°Ð%‡þèQG÷ïåX×aŒŠ(áêê\µö‰æ?í8wu«›£ñ¾45½gû£ %‹®»•¦¦&zzz<úɀ_ÊdÐܹs‰Åb´m}ˆÞíæ˜s—¬¡0‰Œš8áDÑÙóˆÍmMc¸½#}H×Ë/Ðÿþû íßO&•AÊlÌ ‰òç ü@`­LæÉH€^Ùvxdb Ÿ#{ö`¦Òh¡¡ª*••±F,F¨²a?FÂÖÇþØûªIt¢üœ† h>K ¡oÇ#)Yxým455qøðá’µ¹Üx@Ó4æÍ›G,cÿ–í{[>Û¨ªA‹VbT×N4iœE(^Gft”‘®NF:Úxç-ŽîÝÍÐžÝ¤ÇÆ1m°MÛÔ:o¾;A¤£%Ï‘3–"÷æ±e%Lèf2Iz|ÆÆH 3 Yh(„ÐuŒŠ Œh”PÄJ×áH£¢‚ìl·ð ­÷‰þÁ™=ì{êaÀ¤ùê›s|õd]BhšF(¢ëOaÜOÓùŠ7 …Â$‡ïëa¢÷0{?dô`#ëí±´Ú~€jJ[)lp5¬?ð|»})à h¡,¤N](é_0° ºæQYišd&&ÈLLd3 A(&`D„*"$Ã!ôN¨"‚f膆¦khš†fhhºn¹ C³"mMCØq݃ô¯’ä|@æä64å£ “!Aб#©TŠöýû9ºçC´ßíb¢¿‡‰¾Æw#Ó)\hӴ̸+x¶²‰e 53 ¶&²éÂG†’]h  w8×Å¿Ø%˜É Ré 2ÃÒì@PM³ÈaDÂáz$ŒQ±þñQ$Œ­À‡š@˜–›ÑÃa+Z6t„®ƒ™AVÄ+t¢õ<òÎ^Ö›¹é¦› FõSöö÷ó¿žý%WLôÒ¼ûMk#ÁÙÆ$«ÙŽö«fÝñˆ¦M°®w,›K‘%|)®@€gAˆ&ˆæ<×µA. °QÁYœýÙišÍ&G:=9jù½¤sNSò)ûB€2Ð4 =l 4Í^ÿ(èX²ŽíHê¸ôÒKsë_ò¥I<çúÏÝÀ–Í›¹|Ìßó¦M?ØîV5ñZvø§¡¯É{Ê$@Ð( ˜ú ÓB:… ‚æl…æ%„&rÕkðòhxNÀè\Ýï^y&/$–QŸ¨ã _ø555e?Ù©ßBOU<ùÄã\¼f+$Pc‚ @a¢ê üÁ¡ëd¶‚«/Ð q|]€0ô@ýWµßÙ±WÙcü$ðh噼P·œD"Qøåä)¨ùýëW®\‰‚íO>Á…ËaN ü}¡™w×HŠÖ0™ivªhºÈ¢ìÜ7à¼?%U"ÊáÕgñJýJêê¸í¶Û¨ªª*·Ú%K©$°Úí퇕+W¢i;¶?ÉŸÁ¬^÷FöŽ™7p|ºð ŬöY#çÅ‚2¹™@Ÿx|¾}ìÎÛ—AŽ kгæ,~Ù´†úº:n¹åªªª šäܺ•öön©£‡ 2U"¬X±MÓxjÇvΚ>xÝ;ú!ÀnîVÞÉ—[e¦ .ÀïÍü$Ó\Óô®9›Wg¯%‘HxÀŸ àj¾ææf„´··—5#èÔ!ßñŠ+B°ó)ó€†÷_·\žã i¼š¦@MsÏå4 4cš‡; Pñ’k lKq'¬ç×sO¤.‘àóŸÿ|^ðËyQS½¦¹¹™ÊJë3Ê ,È!ÛöWPèswÎ9Ç<³Sç!¨ÿýo ›x©ôÙ¾’êy_Þ@7`(/´–ÐåÜ©9§ÁÎNö8È—»ç‚òøòœ°žßÌ_G]"ÁM7ÝT2ø¥Ì›7ÊÊJº¸2fß½‰–––²H –—o»råJt]ç™:ë…Füw¯ ôœ}éOSúÇ]AB›†‡AžÆç\áü AÉ£š í8a=»žB"žàÆoœvðçÎKee%=ÿ|/©‡ï [HfßõMZZZhkk+)ÆÈºÿüòåË-<­s†Ä"O­.åØy]Ë?ýè}èZ@”¶Iií˜[³$X´hQÎè à¥ü–-[†¦iü\7X òÆ+ÞØI%B€¿Ï> @ +‚Ô8 ßñØ)ç±çä ˆÇã\uÕUTVV–¤Õ¥AAcc#Ñh”Á‡6’yô>ïSFd€dW÷lý6}î°†ˆðÄå˜ÿ «àà†ÎR á7^ÉïÔ/à¸X¿kÆÇøµÛtб-§}šý§^H¼¦–«®ºŠX,æéÜ|¾<ß9õ²¯h>´‘ô#­µˆŽæ+À¹DÚà#³+yL äÖoÑ. :::ܺú•JǼ ,Ò4ôß¼äö¥?ð+zÜ…~\€ZÐD.ðä¼:ý|:ÎøSµq.¿ürøåZt)­Ï²8g|h#©G6f×(à;O"«ðM»­N{M ̭ߢ_@ý6¹Ÿ–ɶ§8øÅÈààECg¾í7/åÎ ÿØ})Å>Ö´ã< … ~a>P¤Ï8Ÿƒgÿµµq.»ì2Ù/Çí !¨««sÁO>¼Ñ5û.ð¾•Hªøv:Ò›mKð…M477ÓÕÕåÞs:,Á’%KBð¢ÌC ^{1G³Kêg,|Ž/4ÍãÐ=ÁŠzì“ÌçsèœK©­sÉ%—¸óðPد—²¯i‰D‚H$ÂÀƒ>ðñ‘À&J=¥]ØŸÞG¹N‹§ö-+&øÂýÌ;—îîn·®åZuߑŋ#Ä…¼¤ëÌ1_¿èé?ak¿ÓÉþcç¡vÜ]€€n19ó3ôœ9‰xœ‹/¾˜X,ûóbæ½Ø¾‚x†ÇÁ¢è ÀÍ+ öSg°ÿ‚+‰Çã\tÑEð³ùÊÞç#Œý¸MÔe %IDATÞÇØO7 ‹,`jšnȼê{'ý&½︦¦&úúúÜ6”ë‚dáÂ…ˆóÏç—šFÓÑ£L¼óf‰½m×óx@3|=W 2óîù¯ Œ$¹ð Áw³OÂì×ÔÔØàßÏÈCòÎð©»*ÈÎÚ–Œï½ç‚€Þ{x=@Ó÷ÑØØH¿ýŸIJÞI/$---pÞyìM[(1à™*EJŠè¤òÓÊt-gŸÇ¹çž[|GTÍ(¶_[[K8¦ï'÷sì'÷®¼ÚõXç¹Ö/£?ÝDϾA$¡¡¡]×­÷íßdÁw¤¥¥…Ó®ülIyU)ŸI¬ ”äìέ¬®&R]CÚþŽM1)Åì;Ÿ\ïýÉýûñ½ÁšïoƒÃ`‘>ã5_ 2ü/›fݹ‘D"ÁÐÐÛ†|Ö T1 ƒ†¦Fwv²$å ¨Pµ_€çi`)ÒÿÛ7Üÿ‹Sªi¼ó«®®& Ñóãû9òÀ½9ëö—T4Zfµß øœ×µaŸúf¯›—ìô°Z®Ú7G¼Ÿîm Çs,ÁdÁF£ ¼ûVÉר=÷1¹Å'#ç«~ビ&ÚyøÝÿ¼‰e;jÊUÀÜsxÁw¶Óú™¾sðÁC(ÿýŽüø>ýpáPˆššš¼ŠKü‰¡#¼rãåóJߎ r>ÉRXJ²ê¾`˜j¦ü~65|”§·N™Ö?X28ôÀ&úø ϽT€Qö¥éÞ´ÓLxǘ¦}ÎO3OÙʽÿù>º~¸‘aP]]íZ‚É‚¿óôVÒÃG=}¬®ö±*z™ ýËrš‘þB’ìçÙ3'G°þ¯^(âà6Ñûƒoäî'Ÿ«j¸ŸîOzÁwIP¦çžJ¾¾mäà6b±XlRà'‡Žðì™­$úŠ_ä·Â‚Àeû…¤dàl…<à÷‘þãä`?ÏŸU> œ¼¸‰žï}£°6˜yl'ÍÖþŒâœ}Ïg\Ì<„¸§Z—žn¤óû þ¯d¿¨à?w–¾Ä£|9Ç¢ÿ~‡7± ~àYpà×µ‚ÇÉÁ~~¾Þ"A4-JüŽlâÐw¿žõíA$P€"D¿¿÷Y5.ð_ç)Ó÷sê Ö­ûûèø^i$PÁ~½ ~‘~ÌçnÅñøîiM ïƒÆÏù˜›ìççç´2qd° ð|]ÿøõ`s¬ìi«   ¬™ÕvõçZ•(¢'F¨‡³íúî|·0 Tð~N+©¾¢–ÔMóõ¿#ëDPNE|Çž¡ÙÎJ öó¹ b±‘HÄ ˜ Ãpÿ—nû÷6qð;_÷”å–éÓzϱ8GÃUSôsÜA¡2òÝS­›Óàƒÿ´¶ÌƆa¸ó‘H„X,Frh_œci¾Çªà-Ëí?òCù. ¤‰ ¡î« ³Oz*« ¯ÉÊ$Lj°ŸÏkå3/D$aýw UÚ¾»‰Žï|ÝzJ'­:8lÔ-¦õtϵØïßÙ;γÀ]q+ÕF© %Û©ž/~ù>ñ–C4²[?A:þiXôßÈ™ 82À ç.'5èß!Þ:9õ F­à_$¡)”ñWµJgøý—Ú¨Ô`?/ž³„¾7^#“œ@JÉÄ@ïÿ;iÿû¬ÙWýk>èÔáìIr-€ÌZõ?ø9ÃÄ :)u–üß ¼ÿµ»˜èCJI&9Aÿ›¯ñâ9K\ðñõ‘ª89é¾>W¥àdŸˆñNK‰µ¢¯ÀNWµÂYêììK ©£Gxý³g£iörC¡l¥WûÁZ´aÚ[çv¦ôj½û.¸Zô<ô7Ji«?À úö_ 5ÈCD‡Ý[ààϰ\‘Bº@eQÓɦ{‚_²û®L”½À(@º&Þ—®ú~w_ISM´³JÇÄ"ƒ[¶½5:9¤À&¶ÙÕ?N!÷¦Çü:å9Ÿ5pÚìÉë«·,’¦v¼?/…òOBÊþ@DÎÿ"w@S+&”tÐè€ëA€‹¬–«>ÚÑtLûC Ú> `wX^(ípÒýVÀãÿóE-Gz­ç~þ¾ñ“É®”Ÿ(ne aUø4ÿ¿†t¦ðšLák]»Ú²7r*WÄÜ縅 k1û^Ûg74ARƒT Ì®  Éc*-‹šƵTzLDÂè‘‘ÚZÚw ²ê†Ó¼ï¡û*TÙBæ°Tóš£9~MV5ÒôŽë=c©<2æì}gÞ@ª€úîéX¿›¾6äÕò|m/¡?UÑÃ:+®û»Þå"kHF°þgdº2ë%‹`dÊú/##!dG:D«£‡ÃŒô§èþÃçë*Ï5¥œ ù&X<ç}š¥à‚ï^Üô§û§‚àý®@!‚šî' ß ^(X,GQürÞ¦+ùðÅéßßgEïD: ë 6ÎEA¬C@l\08dœT9kZ(„ Óß6Κk—3û¤¹xe7¦ýÏ<˪‹mE6`Ãw_3¤A‰v:ÉÒý“í4)ÉšX:=àØÉïÞù-UŽ—Hn·ÌB#Þ­#¡Êò¿?KbÅlùÒÃH$ÒVëy’ ɯ4èýL¼@‚|CE±¢!˜«ÁÉ»Bâ§Ÿ¯ˆÇ1BatÍ@È4'®…9kêxû_Ñù«½ŒöCHéýÔ«ïÓïÙaÕc¡äÏ Î¢Ï‚Ÿ˜%{Î}KI“ÊßxµW<¤QÀvòw>ðÁçLË{¬„™%UA‹â³|Aå¬jšÏZ‰·ŸÉG/}Äãÿ}©TÊ]…%ç¦ù¢o¡ËaŒ2À÷!4â°xŸÆ=õñ;œu6z8B&•$3‘ÄOoŽÑ¸H°àô…T5V¯I+-©h¦’®™D¹®ÉâRô²€ ¥Ü*ÈÔHSr¬çm¯·ñÛm¿¥ûÃC.ðŽ,Ëð½%&?°8r¾ÓåHÞ>• ž‚¨Mah}×àk©9³Ï™sÒɘ™ ™d’L*E&™äà»ÜFI hVž ä;7<Ê-k’˜ÿQK“É‹'eø¶€¢Ðs&Œ‹*R¤œ™œ8ÿšÓµN›2`âLtAênHòù~™”¦J[@m=ˆ[óÿO›ïŸÎÈÔ¤ÓÞ:všÀ|dÌë¬Ç!ÿ‘½ÚŒÌÈŒÌÈŒÌÈŒÌÈŒ|\òÿÆI \G=LjIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/arrow-down.png000066400000000000000000000110061323166163100236330ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ½IDATxœíý$ÅyÇ?Õ3;;»{oÜŽS€Ì‹ÛAÂÿ€q¤(±Mì,ùLâÈ$ÁùUg"ƒB°•ˆ„A¢c‘21’‰b!b^bHÄaî0/—Ãøî¸Û¹·½Ù™î®'?L÷Luuõ¼ìû.õYµzªºº§»Ÿ§ëùÖS3³àñx<Çãñx<Çãñx<Çãñx<Çãñx<Çãñx<Çãñx<Çãñx<g¹£fµ×\ˆð—ÀïcCï$KV90–´ìj“®Ó+ T{­¬6­W€²ÚÚmÌ2ÊQg]íTR.º»éûKRãb´I™¶QŽ6ÐbLv1.7òùè©‚w,dx¸‚óžNz_ó]{{Ð2F}êàvŽ"ÀÑ.÷Zuëìmf½¨î± ÷Ý5 m+Žv¢²e;€î\à ›õå|.z¶Ç»æú7±OˆÛ˜‹ñÛÇÈ^¬]f–e×1¥`;Ö¶AÖûÃ^_¿6š*'Ôßy³pøð,ö)fЛkw¶k{éõ¾Eç7lyXç°Äq¨«ßöÐåYœNÃ,üøÛ?æÔ³Ne²1‰Öš8މt„Ž5±Ž‰uŒÖ-º½N^ǃ†X’6¢„XLj±JöC#"í5Ò>Žñ×Ù‚dË"ˆt ‰‰Û÷JµëFGF™§yp߃]Q¢^Êtë‡Ý^" N–¨`¡ñÚnYÛÒ¶$Û$€ÒlLØeø½…Ÿ¡ø£´øÉÛ>É“w=I]Õi„ ¢("ŽãŽñÓ×QeëÄz–“u$Q·,11íu¤£vYe·ED61Éö´¬Œr²ŽTÄGÏøèœnžu_ºk»—ÁQž-JA`™oBv{˜áC@‰[£i1ŒC®ùî5œ7z …RÆb¨ ´l¶io +®:/ÝÇ2Ëi›N{²ÛìcÚÇ/+ãÎEc¤õ©ácÇöauOÏóQž{Z²Ž/1$Ã;À¿óŠOÓíŒxóЛ|ã¾Ák/È ,ƒ™†—¼1Íës ·2†ïeü¢zÉ0–8ûýôˆÙÆŽ¿:YÌ.ÛÕéŒè2ÖÍ6ê¯smø †¤4ì¼Ê.¤üNZõÆÁ7ØXÝÈ¥^ÊñÖñvü•n\NÿÒXß©—‚zW{û/m§Œö8Ú+«^ ç¯=ŸGwf‡—æÕÌ'Øu®!žil³7Ð} œÖE%ÐÖs»^áO¢/ÏÆ”³´yœ;P@Oa‡L×îÎÞ@!ET»è×­ÛO¸¬]K\о(4ôÄhë™——¸(ü4³dö ×/™•×ïz6F©”*™îèíî»SïêòíP‹dnªÒ%uŠ´M¡!z9„ý„Ûê][ë¢'{'ˆ„ålýˆLR 1KæâðŸL£Ø†% ¿pç8§zŽÛ`éÓ^H¯§Ø¥l˱OA¬ÏÅÐäœ)6º«®¨û6‡o¦0‡q¦3ؽy<¬:DÁŒ%X-6ÉÕü)¿É_ÝàÌÍ~Â[¾=ù6·ÿÓ휻æÜ\·ž>u…âòݻ݅c§—0t8KzãEdð.¿W7ï*ÛkûX9#“wŒ´Ü(· ûЧÈ×øÃhÇ–r2;hã…¿~ç×l¬näâ÷\ÌÉð$A— ?SjuƒŠ@e•¥@’Ô«ì¾['¶òÒÑ$‚ÙáÉžK°Û@¾›î¥Ìp[uö("cü„ÖsºFþ/†_Ü@Å̽HqˆÂ»»›Ãû3Q™BÌhXO·ÙµÅú#æ†#þwô@ºÝÕÕÐîÌ.Þ~ò]ݿݶ× @ÓzF«òKjágûÚc@æÏ DáMwßĺÖ:8‡PE*ß)ôú8‹ãŒ:Š?ç©ìÕõÅ{ט¿ŸØmŠBBúþ¡‚iËø%9L5ü}n½è³™OpŠÂHGÜüw7svõì¼Á ºÖ"•_Xoþ*ȾWjøÄ!´èÁâ|‘aímvþ¾H'Õ§çS¥ìùC‹rÕ\EŸÍü:8EáþÃûùþ¾Ï™kÎp§°…žñgŽ“¶·ºz¥óÝ}ÇÝ›ýÇ÷ýz{R§h8Øo}¢ÜöuÖËWùã迲ÁÌ´qˆÂ}‡ö±¡² ν€z«ž‚Î, Y/y±×³}*S‘‰uœD žµö,vÕvå®—èKë´UŸ®:ºžút=U‚V`¼¿‚5ò7„·ÌÆý˜ÿ Å! ïÿéýLî›dld,›ísüežnÇî„)þèÖ·¢£jt°!ž«ûw=ñ®iÜ¢}íõt ëPÙÉ‘ðÚá 0 ç¢pû}ÛY­ÍÆu{öP¬xowù†1Óö¹˜Ÿ`;DǹDÑŠ[Œ=À¥ø]#€~õ½Dbºn*8YÊžYqJø‘ù}6 é…¢pû?ngËèç.…oè[ùçz {T`'x cÐÔ)f¢ªAµ8î÷oƒ=*ØÇnw"[Œs5Ÿgÿ0·|XÖÀ) Örߣ÷±yl³; h‘ iþÀt+Ço 2Î[´ ZŠžËpn£÷î™NàJ+ƒ¶Dß:ná†ù}6 #m¢ðíÃo³¾²žsÎ:‡FØÈfÅÈÚâÏžf6³†¶Øs‰CcÛºÊ:jõÓátVà[ö{ƒ$“}À8?âÆð«s¿ñýYx§y/—§U/í}‰¾çƒTÖTˆ%ο—!Mµ¯Q4ŠHÓÅ"L”'¨‡uŽ7ggéóÚ¥9ŠŒßKñ7‚n²'5~…˜ ?ÂŽÌ8cÁXøÐÅ) ïøÁL„]aèŠë$‚z Ç2áÁÈ(mh³;òÝÿ q¿ßÀµ´T7Ù“È;¬[XÑg³˜à…±Ž¹ó;ÙTÞ$vê?'ÄOºëIµÁ©Š>fÙ•ñ³¢è!nÑ7ÁÕ\ÏÙßàáY¼ò*Gx//Ÿ"qÀéÆ4“µI.»ä2êQÝëµS¸4€«½±ßhi”z3 ÃÈ\÷¯éÝýÅ}³w™J>ÖÕÍ~ U¾ÌMÑÃós“gñœ¢ð@íkGÖ²õÌ­4ãf7~kËÌfÙŽ÷CL5k­©¢8âHãH^€[ø¹¶÷¶#Líé]säSå‡Ü~}>ní°,€S¾òæ+¼ï¬÷Q™¨´ 7ȓܣ·HÅžÓY’ ÙjrtæhvP$Í:ÓÀƒ_3A{Šº0ÂÿÒ?¶X¢Ïfq5@§(¼çá{¨ÎT‰Œ°¿\Ù>bf›2Sú]-½Ó¼®”o¿YA—NU[õ›çÈ;Œ†[LÑg³”P( ï}ô^Öëó Ë)Š„anŽÌ”pÅ”(e — À¢Y?Wk` ÆzÉvÐ&ã\ÉM‹+úl–.¤8Da}¦NíH\ðšq³(HóZçÃX:Àب4LNOvÏÇ5æÇª³»W½ùºQÊgúªêÏùJôè¼ÜÃ9°ôNQxèø!ª¥*güÖ´t«m8íˆ÷J²zÁ2t&dMA—U™(ЍÕkí7íûI¹FÍâ ›Y¬ÈøZôÍù¸usey8äE¡‚½û÷rþ–ó©NTÛßv<ŹQ‚ÝK¸²ƒI])(EG¦¸Õ~Q8éµÝt‚(1~r=”øÂø–JôÙ,­È’…É|ð‰Q Uï»{gâ}îC Ú€ÉÇ1e)÷NøÕeü:z@µÀS(ðØS¡gtqžÞŒ÷V¡«’EGº¸k·Ã½Î„ã»déù(9ÀHôñå$úl–³´E¡° ID¡€ÖšÇŸyœÉê€4Þƒ³ËÎŒ De§ƒ‹bÑk{  w+›êJ¾¹¼DŸÍòvèŠBID¡À±©cìx~UÉæø­¼¿9bpÓU¬º"Е¿/ÊëÛ=@9ÈN$ BEßÈöá~´q)X¾Àäöp-TW«£$%6oÚÜùi¹¾ÓÃVº Õjqìä±Þq¿(ß ÀHåÄÑ:3|òÏ|[o_˜›1¿¬ x…§¹ˆKP]QxàèN_:cÕ±¬ñµÎ‹C{®@…¢^¯sbúD÷}\O×v®¿¤`ÔúmØ¿ ˆ·-WÑg³üC@a‚ël¦ðÉOÒœibÖe€îꃜEFý?óçêú•‚ªuûÙOiy‹>›•äðÓ‰(„Ž(ܱs*VùîÙŒ÷–,Eóþæ`ÜRüФ\É­\Ø›0¿¬,x˜=`ˆBàDãÏî~–2åÜWÀr4F7®´Bbq?õ®x¤ËX`üDy Pæ~n‹o]ðë^V¦¼ÌÓ\Â%ÝéãÉ““lÛÀøèxÖðÚ!“QÀÔÔõF={lÛè)Uk¬¹ýÏR‰¯Z)¢Ïfå…€.Â(סÙeV>·÷yêõzg’(“´s1„­0?•kÇüTñ¯5â>@Ào·­$Ñg³’ - #cú8…Ïí}ž8J$‚= lNK¢ú4pŠe|Å #+OôÙ¬lx”×Ñ|ˆSãL7§yáùnÜ„©38E =ï¿1èÞ©4Ó§øßþÇ™—+W˜ìf¨§I¢z«ŽÖ¦ñMÙDPª’õää$afã~ŠU{È—û÷qGü‹y‰ Åêp€Ý<ÅûÕû‹Pplæ¥q&F'ÜŸ ÐÂdm’¨¹GkTÛRë·_>ÃD|õJ}6+?tJr-°Û¨awíe¦SÎ, âVìeà4ëçæoSYÙ¢Ïf59@" eŠc©át¬Ùuh7Qe ŸŠ@ç4oœnÏí3C\ÉwygѯkY]ð¯¼F Ÿ53…¨Á®Ã»ÛcÝý}% ê¬ÚÚÆ/“ÍôÜÀ_…Ï-þ-,«G˜¼Èë\ŠF©ËÓðÝÔM¢0fÃ膌8xà`')Ô6¾‚u™˜º—ïÅßY‚+YpV_ò·#”É èÈèÖ+8Åþé9yŠõñÐÿŒi¥°z„¹Í˦û¿Æ^N¶N¶?nÎŽ[¬?¼rÕj}6«ÙàaN‚lƒD&Ó¿¯5^'ŒÃöÇÁRÑ·5°$b†X_É߬.Ñg³ºà‡¼ r) [ÒâµÆtœ|ºølKô Ôù{ž_‚3^TV§´y‘׸PêC©( UD½U§5ÚJ’= íwwëÛ—âT›Þ¿¾¼ºP|N=†âŠöÿL.Ýü€üœ_ÉåìX½qßdõ‡€.B]>ƒð+«¶‹â-&äªw‹ñáÝåmQX’O‡[éOð×Îm«–w‡0y—ñ(¢¶› ˜ùeù÷òË¥>=Çãñx<Çãñx<Çãñx<Çãñx<Çãñx<Çãñx<Çãñx<ž^ü?ŘÚt ;!¨IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/arrow-left.png000066400000000000000000000133001323166163100236150ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆwIDATxœíyÕ}Ç?¯{fö’vµ+´+´B‡Å‚d!„1æp,aYŠÓŽmBUlC(GU&…âØÿÛØ!©Äqlâ²ÄŠ.'Q…26Ç‹B ]Xì²—v%í5;g¿—?ú˜×==³+,4³R«¦zæuÏÌSÿ¾ï÷ýþÞ{š…"Dˆ!B„"Dˆ!B„"DˆpšCTºg 6³,ç ˆã0ÓSé.Ä*ÝÓëh –.^tñǯ^}õ¢%­KŒ‡v >5ë©ïŇ¾Äc¤+Ù=³’_~Úc#í˜ü}M¼æÞ÷¿ûýóV/YmÎožodr™Ùãéñ˺»»-öñ«JvÑ¨ä—ŸÖØL'ð#·‰Ö¦V´, 6QK*“"M'PÜÎ&T²›N6¶b°»ÈñoÞ·òÌmœK[s©LŠñÔ8#É€¥(ÞUÉîF8™XG¿ãK˜<,s›-iÑPÓÀâÅ‹9:~”cÇ8>q ˜]©îBdO6Ò|Á@B?uþÂó¹îªë5Gdhtˆá±áÊô3€(œ ôÞwê}›ùÞCßã€u€±ìƒ#ƒì~sweú‚(ü!ØŠAwãaD!廸âǾȕk¯d÷Änšh¢Ñläù½Ï34:T‰Þ†""ÀÛ…­÷_Àä^ E?U_SÏ·ü6 g7°olJ)2Ù I#ɮû*ÔápDx;(£÷ :xôGƒô÷ ”bt|”x>ŽRª.ˆ'ŠÍt’å·ÄÓ±ñÒÜûý𷬻…lPÂùt›î9Ÿ®!úO!+„U‘8ÙØH;1¾Jœþú¾µ¹• k7 ã’L>®õ"¤-ŒJ»>8ºƒP'…³Ö¯· CøHTiÌ\l¦Á#˜ŽÞƒ7¢–Ÿ³œµ®%«²þr-˜ÖU‰T_Êâo+š*.®WÂ)U1úa&`+;¸ÁÃÄüõ½0—¯¼œŽÅ¤­ta¤‰Âh÷œ8eÚD@×õ넥ܬ ¶!|ßWiÌ,¬£|GïÁW߯[³ŽÙ³™ÌO뺖PøŽ>S²Šj]ó¨¥TöÐÞ'LQØV$˜9ØH;q¾F-7àÎç;¥TkS+W^x%µ²¾ôìKÓFÀø [˜þû&vDq]_d5¯S†BQw13°™NL¾AŒµ¾›'à¼çqQÇEäÈÔRx˜Ö[…‰…óÚÐÒµnòÜ á’ÂýL4b§Š§0€zŸª…ÕM€­üŽ;Iˆ‡1œßÒq(„àÒó.圶…¤-ç—Ö -ØhÁv5\Á®)”ÚuújŸÔ/5¢È(ˆ4€5! 0ô,PÙŠ z °Ž^á!šÄ½šï¦Õ%ê¸bÅû©¯«'M4ÞÑn°ŤÐ'€tRh lÐG-õë#lãˆ÷J!…´=€ó*ÈÕI€´SËר7 4½ÚšÚ¸äÜN$’l>ë3TëuRhfLe !mš4øˆ¢^Ÿ'[ÎL  ª~˜§ú°™Nâ›Ä¹ ðÝ¬Ž¶V´/''s….#ÓPž@ÙÁö¥p'½{¤qS½n upÉ£g'°%õ¿y„!†¨øÑQ=põ¾Vl%ÆRý”a¬Y¼†ÖYóHgÓöÍ5)Ü(èµRKëÎ$ŒG—(àó¾N€nZ× cXõ ŠIa{Q5 AP-XG»yˆfGïµ›S_[Ï%‹:I˜ 2¹ŒhHá;˜:)œT[42 ÅRÊ{Ùº^Ÿì ®-hðFç¹·TE•@å °‘vêù:5âz„³~  ­±Õg¯"ŸË“S9ÿ$ŽpÏPp÷Žþ›Z$|ºNÀ*е^PDºÐl€ò¥(È Ñ<€›é¤Nü1. ¦ÅsçŸË»f-%“ζ3z¼ €¾ÒÌMï–C7@.)–mu–=ô6]R‚¥'RhäŒÜü£›Í'·=y—¬W‹¸X¢PXÒB"1 ƒ \È£‰T*U˜ØqÓµF/]ëÑöÞë#_%´>8è>@û‹÷š„•™Õ–þá@)%Öÿíúúgž~æ¯fµÎþTM¢¦É0 ²ù,“ÙILÃdU먴"¥R…T®—k†3Äq;U€GC –[è#_Ïn68§ù y‚M:yœk…!ÎÌ2P)%€ÄÁ7>Ô<¿å³MõM‰ºxRIÆ3㘆I[¬•‰Ñ {û´®ë"pÃ]85¾žæ½ wôJZ™çÓum„k¸~Nž ôk|d3ìR°ZF?œ"¸ÁßòØ–óç4ÝÖÜÔœ˜S?‡„™ 'sœ뀔dph”ý?h|«mNÀ½Àk$íhhçôîʂԈâHƒçÜÏu3v°Ì 3…"„z›6!UkÔR—¨!ìGá”Ä©ÊP3š]Ùܨܾ`Κꚨ×ÒRÛÂÄñq“ƒÄÍ8ûçÔ$Ò§õFÌ(Œ8Î}t•{ô2þº;fƦ°3‚Ó41M³0* ¨‹ÕÙÓµÎ{â±8 3ÔšµÄcq„˜†é•Ž1C"½vW–bFÌ#@ÎÊÑ?Ùo—Ö÷JãT@Fm¢ÖŒgãÄ̦ab˜VÞb¸o˜·úÞ¢g¸‡‘&2ö¼y\ L™0¦ AÌ´7‰%böìZL€i·1ƒšš„a?†ýÂHS’•YûµÓ–‘{™Ö™¥“H²*koÝrÚ“VaräHËtÁ̹Ӻ¢Ä|nL4Ú‹AUdO_Ö¾lߎ]/ '‡¦ói à ceˆ5ÇIö%&•Ia)Ë+áò™¼ÝÓ<ö 7,Æ«¯1‡QæXêœ\öpFµ÷:,øa._; SV«d6ðTùQ d?³á3‡dÊÚ606˜íí§w¤žcoñrßË{œ–E-äUÞ看FÓTm¥¥GH{‚$ >{F6·ÏPiùN„ ÈŸ¼ì““:šüVßhßXïH/ý£ý '‡9|ì0 GèXs±X¬|0¡8¸ÁóÁ ßSŠ¥Žf‰÷”"E¦]×VI8ee K¥ÔÑùó¼û¯ï~e²1õ—ÒT‹òVKYd2RfŠŽËΣçÕn&&'œ7ëDi2Lu¾T€K¥ò©2ƒÞFàs‚ý‘!ÎÌyB d€os»8KýÀ3E›ž¶Ë‘d:¾ !Bª oCH°_Då °$+ØÂ€¼©ºõ›369Æžñ½\ðÞU4În,¦þ|:#¿Üµa¾ ¨ïfàX®JÐG¾iK€@TEà]T¶"ù1ÿÊu3iñ;[4‚œ•gç‘],\¾ˆ… N=â)ñ¼œ”#H˜ñ ¶—’­Ýž|rÞ\4%\T\l£‹^ëÆäOŽ/ö𞡽­q.X¾ªJó>” d©s”¸~ºÕÀtæªÊÇ¿ ¶/èUw1¤A8¾ÀA÷ÑnÞÊ÷ÑyÑ%$bÚ|N•Ü×Ó‘‹r޾ ‚¦0 ÂU·!¤: ¶/8Wn¡Çú3rªÛk0’aç‘]¬¹èbšg5OOÊIƒ{,÷¶"ÙÆcô˛ɰC¿iY+Ëo{^dqÇR–,X~3Kcº’p¢Æ1Ìy€2ÒUT7\l£‹ÃÖõŒÊŸ9÷Æ);{_Á˜gÍyûÓëTÇRç¦#å|@9?`RLª cfl_𦺋#ê(Ƽvo ¿Áád7W¼çÔÄk¦÷yaþÀ=–#†Qæ| 4"øÖª3‡`û‚¥ò/8lÝO^ÙÁÁ¹ŸÇ’ÇømÏ‹¬]ù>æÎžë_Øè/×^êš­tSÍœ$¸¾ G~”´z ð‚‘Égøå¡ç8wQgw¼ý0Úw–­¦ÐW¸ä¨0ª  oÛèâÜĈ|{«`¯#üö÷/"â&—u¬µo¸»î~²ÖßËe’Re¡¾|²ûó`æl_ð†ºƒ×†âþÁƒþ=´òCÔÆkÃßÿv0ÊB4…îIUNpfl_°X~žƒÖýXê-ýÆ'‡yîà \¹ü*æÍšWú3N„S][Ê'è‹Az†¨0f> à Þ°nbR¾¬ŸJçÓlßó ËÛÞÍŠ³W”N¿*äù‰\3 bUN2¶ÑÅ~yÇ­ÇQä½ù¥xîÀó+ƕˮ*ÌÆ…±TЃÁ/E†às÷aN|_qzl_p@ÝAŸüRë©xOÿ^^ï;ÀÆ×Qs|AXÀõGX›þ%^ëGË~+PDàÂv’,’Ÿç uYÕ x7|p|ÿ}í¬_v-m³ÛƒJHÛtFy0ø>TúD†áô$ؾàßyŒƒÖfRr§þ³,©\Š'^~š ZV³ºmõôƒ_j´ƒï]b¨nJ@àô%€‹mt±GndÔzÂóÂÞ_ðÌž_ 21>´tí J¥õ©R}©à2€°ªoK˜9õ%§ö3NO"¨§‰ @x ƒcƒ¤Òi®==¿ƒ¼Ì—_„âàéíJ;ºpÒb¶ ú ާŽν)À~ž¼ì‰áôÏ.¶“äùçì±î'¯ùúÇúyzç³iÉõ,˜µ ¼¡ ŽòR#Þ=æ GϺˆ2À)Ƴ(^c'mê×4ÒILÌ@ØÿaOï^®Xt³ëfÑŸìŸz…0·­„—h‰·Àƒc“Ç ×G ØF»åFFÔ“aç|!P~þêÿ &c|dÉF„þR.ìÌ šéÓG¿çÜ)À*Ùzfeû§Q=AMboƒaÿè“É׿{Ç“¹ò+„SÍ%8$:+qbØäèä±ÂµQ¨ ¶“d|=ùûªðÜ;ÚÇ_|œ›ßʆ…¥3@ŸÓ}äí‡ÈW߆37¸xÅ«ìdžü5sŒK0Å|7K笻ÞÚÍ5‹¯¡±¾‘Þ‰ÞÒÆ­Ô´²V>ÎKÌCŒ˜ §Ž>'ÊU‚mt±3ÿFäSöülç1nZúQÛè#>¤Þ/éd`?@$ƒ(èØÏ8³ÕÄi ÑñNÞé%™œä–•7³oäuÛ@éE¢‰£y5ó`Ü`89e€ªÅv’´ÊÙ›¿©úõ vëᇿùw¾ën5, ¯÷Ë<÷2øÉRAD Ï¢ØÅNÎ’ÏÑb\Š)Úܹ€œ•㥞—¹vÉzæÔÏ¡g¼»xäCèôqkm+"i2”*|W”ªÛèbG~còit_ ÿ±ã?&·-»½à ô‘¯g€…™@y€™…ýŒÓ 'Î,æˆ <_  ûxÉ$w­¾“=G_³ÿ‚I™Õ¶º6DÖäHòHáó£ 0°$óäçx5–@9›:•àðñn¾ûÂ÷ùÔò?a鬥%+Ï(Ã{o5¤€ˆÓÅV$ß综’¿ž¼Ü xñ›ÈLðÍ_ýW´]ÅUíW‡Kn«#ö@D€Ç6ºèʘqëçh¾@JÉ÷º~€HÇøøÊ?Ɔ? ¸á—‰ #"ÀÛÁSô²Ãº…¾ü£*©ŸúÅ¡_òÜßð¹Î™›íÿìÚFÖϨ² !Þ.¶“d®ü¯åîCȯ]Á¡á7øÇþ…O¯ù,Ë—õFŒÆX‚¹uÚfÔ*ÈQð‡àY¯ð2Íò9ÚÄZ­Èæ³¼pøÿ¸iåM´Ô5“Î ³dÎÙiÒ=:@Örvˆv[Q0ã±.~“¿–¤õsÌÂÞ_‰äŸ»¾ƒ¡bܶêêE‚ÚxŒ955U³94"ÀÉÂSôò¢u ½ùG1_à¤øížá¥¾Ü¾æVêcqjb1j±ªð‘œL"LJÕvÈ~ZÅe(1 À‚ÓbßÐkLæ&9žš •Í‘–ù=Ö?±žJu9Ê'[‘<Æwx%¿ äk({ §óyŽ&ÇK7L⦠J  8TÉîFx§ðCºx>¿ž´õ_J`¥r9&ó9ò–ÄP9z­oñƒ•ìf$ï$ö3Nú™ªUFn6ËPª6+¥ÊL ½>þu•¶¾ÂŽÊþ)é*°!g6±E; A‚~B¥»!B„"Dˆ!B„"Dˆ!B„Îü?ÌðXþÊÂÆIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/arrow-right.png000066400000000000000000000130511323166163100240030ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆàIDATxœí{t\Å}Ç?³»zX–eK~ÈK~H66~ÅØI€ i É)$¥&mBhÓœsNšsÒž““& çÄ„4&ïPH)->%äÕPLã'~acY²l KÖsW{g¦ܽ»sgïʲk¬‘t¿{öܹsçÞÝßw~¿ïüîì bĈ#FŒ1bĈ#FŒ1bĈ#Ƈé”ÄiÀc.8Ä/ié.E¸G€;¨œ>8ý.¹áΕM+gÊzÇú? áÖ $òÎÞNNôžàÍž7™3g+&"•4[6‘äkü‘/q5G¨·cn ‡ŽîŽŸ<ÎÑ®£œLžäúÕ×sÁì ìfuGr¡#ÆÀ-¸¹îèM÷2gÆ-YDk¶•Û/¿'N°«e—yFÁRàR–²]´D·G3œ%@¦ŸAo÷¿ûýt¦;9Ô{ˆk/¾–ùSçóܫυÏ4 xÍtr;Ûù5zz?*ád°õàVúÒ}d3H)Ùݽ›¯à‡Ÿÿ!UUvóXœœ&€Öš“½'9Ùs)%RJÚzÚðj=~ö¥Ÿ±`Öû”Xœ&œ&€’ ©$RI<é!•¤;ÓÍïýÃC¬½d­}Jœ/8 8O© ãç¼€T’Ao]Ý»Xwë:>{ëg‹OŒóÂó7FI2¼T~9ðû»÷³tåR6ü݆XœÜ'€VycÆÏ—sûÇúáMñØxÿFšÎk²/ë‚!à<쑵õ¤Gß`oxoð•¿ù ×¼ãû2±.(ç  ´*2vÈXaaï~>ò'áž›î)¾X¬ ŠàüMÐZÍŠax Oy´ô¶°xùb¾ú©¯2¡|‚}ÉXp üe*¹¥*J©â¸Eëýfÿ›ÈÉ’oüý7˜;s®ý)±.ÈÁ= $Hä¦ÚÙÁ”°è­ ¯`¥°Ÿ6¯û×ÝÏšUkìOŠu.À0>‰\(ᢦ…Q$iéoᦵ7q× wÞ8×îýÁ†ñ íúƒ$‘ŠÐ*ÚûÛY°dëïZOey¥ý©ãV¸G€$$r³mÛØÚFiOzt¥»Ð5š/òË4Ìh°?y\ê÷`kJŒtÓ˜$Ña xgd†ãê8ŸþóOsùòËíOwºÀ=Ø@é‚qµ ¢”0Û‡HcTÊ•;:h¾°™{?z/åvOÆ….p Š4@‘ÂÐEÆ×Åu¡p‘{÷dz5‚ÏÜùΟq¾ýU™1¯ Ü#@ M €atm A{ß‚QáÂ*ge–îD7¿ùã\táE!Ä×î­ œè¯ ²kV®¡£¿{)”_Ò¹wÔKe­ÃísûJ©¢cr€ÅÍ‹©«ªc÷¡Ý…Œ¤OFÝaÓØZw誹üñ«ß¶šãýÇ£.JØ|)¥Â5º¸¬´OˆŒ—aÚôi,›³Œv •4ÃB)ÞM“™Ãÿ²ŸìˆÝ«³÷B€%5:äî‡ RK<]"<”šØBQK¼’““¬»i3§Í´ûTG’û¨ºÀ=X@¡DVG?*I4ÒØÏr©åÄ·\{ Ëš—Ù$('Å-¤F¿.p/Ô„5À˯ ½·½àòí—0\¸u\éתaµÉª,Ísš™T1‰í0ûF‚4ïaþèÕ©‘î@`ÞÆ  -ü¯Aá¿u!@ -^ù:ã\7h”Ívhж½™^æ7Ígzítžøí f }41¯ñ2‹¹šm¿_à^0\­H_˜Ó@%‹§†–»/ ö3„Rç•zä¬%/Cù¤rn»ú6fÔÍg,“ÔQÁ}T>]àÌ9x´Ðyƒ{xEÆ÷´WØÈ K/ %-Bd“Y®»â:5.²ûZN9·P1ºt{ 67 "Áe‹/£­·-r¾ŸÏ ±ßŽûŠÜ|ߘ2æõ‚ŽxÛú ¢NjɼóæQ]QMKGK¡ÿ¦.h¦“ÛÜ×îjá‡ðWA.îSˆÙy-è]hÒ¹ýP;]BhKhCz¡_õÓx~#µ“jÙôò&2ƒ™üµ)§‰2¾Æ÷u{!ò*[Nè‚ë7Ü|ÈõÛO Íp`× 5 ÚXO‹¦—¹ç ƒrʪJnxç ̘2#´–A¸‰|Çe]àÂ7Ñw¹¶1•¤èe!÷±Œì눸/ÃÆ.Zo¥ ¬yÛÎZN Ê©äf&𘫺ÀÁ`ºóD~ ð§}ùéS7‘Û*ãF].r¡Â hò×)ª Â….ÑNù­V,XA]ÍT^ØóZëÂT±ŒËHòcÖ깈ï³u®ok)¸'§‰;J¥¸ø‚‹8Ø}0: ˆ¼Çñ†¦,•ª¬¬ë¨Âu¤”ÔTM¢qjmGð”gÎj©«9ÌdÝyŽàf0„ Âšò!‘BFk{ªh‡ {U§rŸe=#°ÃAÔÚÃAo²Tï[ö^ê'×þ&[Kµ¸—wt{!ÀX!‘HdÞ½›¡Ào^BÍ «Ž‚».rÿª8ûRÿfXQÆ,AƒPáB ŠKšßÁ®Öר{toáïÒ”3AÜLŠFnÔ÷ð/ž“ûZî ðI¹8­ñçÝ!ØS<ÓP„§†æ±PúW[#¾‡¦Áç¨:@ÓË\TÏ·SéIÔ73yâd^~ãe”T"”s) ñÖêõ#© ÜÓõa °ªy%ûº÷…“=Xy‚—(Äç¢AQI¢`_Yç™±?J¨]`&ŽTAH)™XVÅìÚÙë?NVf͇IµTŠÕ´2™†‘ÑîyÈ!„¿,,! Ê‚‹/9êEÄ(¶GlðQCìœë…i„3„˜ÞDÂÚ %”àò¹ïdë‘mí>šOvµT‰{Iê&Öòésý«èîÀÔ¢ð0(?ÅÃÈOÍ)™ 4 ÂpÏQuZ‡ÛØA*n—'‚™ATáëû*­XQ¿œ×'`_û¾Âêë‚SF#7êOK]à.‚’[š÷ À3G±È›¶XFéKôE À"m`ß6lHØžÆj700ÀœŠF&7LfKÛ¤”…¿»ŒKâ'|P¯gå¹Ñî@ø³­5RHã°aì iD[ácxŽR¢¯T]0ê!´ Ê €ù,R @z’ ¢’Ë.å•#[èË RÌcŠø¶éŬæA~Mú­»Ù.Ÿ$Àà »QlX3îíò†ƨ'LŽHmPJ(Qz´«âÑÒVÔÑ#¸¸þ"vvïâX÷1SLa²ø[„î¾ôVÝjp’!À„ò ”§ÊI«tx„óü"cCȽ‰>a,"­;lÚ¹³ÎÖv]ð9 úºúXTuS*jÙÓ±Ç\ UIåFýOpä­ºÝ ·Õ¾8Ò„+g\IY² ­5 ‘ðS¬¹Ñ"•ôëIàiÏ¥Bäë³^–´Lƒ‚A9HÖËæ ¯¥fÀÈ]+ÿ‘‰`Äk©ýÿU 5Zë<á’‰daÔæi~‹¿¢9(K)‹ô‚Víi3ƒÔ$«Y1m9;Nì,üo„”˜KV7Áx#@°@ž:ò݃݅ãÚØF½U¸\™¨¤Œ2ÐP•¨B+íViÊE9 ¾!rõ‰ _úïòD¹_ê”Fy ­4™LÆ/k ´ç÷=dÖ' xY-5rP¢¥FeÚÓ~_¥ÿ®ªªâü•³ýDØ9L ¹G€`AHÎ~ºÊ4¼½5.Œ} ­Ò¤µïzTOÞõ½eîiì›Û¨:sk·³ë<ã„Äî´YÓ¨j®foï>¿A64«ß@bÌÏ>Ü#@`Øàß0eÓè&בD?ö nv°•ܹY´Ãx3ŒºÜ¾H6Ò_—æPÏ¡B¿ü6iúô÷xšöˆžŸ5¸GSá¯Hêò[mìÛ†W §ðÏH`]qjcý²Ï3Û$¬ó`H¢¤R)š—/à°n¥·¯7¤ÐtÑ¥¾Å1þùônÞéÃ]ä4I½¦áÍ2„G½²ê[Ó`¦ñm¢ wt—:N¸\=©š†¥ìëÞ~6¾ÛïÐ_dßã§ã5h€€¦€°0G~°ø¢”Ë·ai¨QE„¡È1Dyæù3©n¨áµÎݾHÄh—Ñ/Ò¡?ÉÏÙÌφÑÿ³÷ᛟ$l÷Ä~Óý')­¤íQox(vïÉ÷Qe£NAóâfz«úÙ×¹/LhÈÒ­Ÿ¢Sß? ²ò$DØ=Ûîß6¸é¢Ü¹=r£Œj†4î©Êe©2.\¶„éƒt÷tŽûÃI:Ô:yp$–»G€F€è©Ÿéþ!,úLñg“†&u§òXe5“jhZÔÌöŽd³Ùðq©Ñ®¿À2¾7R BÜ#€™ÊM$ ©‹óöÔïT¢«m”£”ý)ÄÜ©<ÂìY³©™9…-Ƕúñ>! ýOóGN¨¿æq6óøiÜŸ³  `•ƒ¢¶ŒšóÛN€’Œ$Š},¢ß"!X²p)Ý©^vß k²œT¿ä¸þÔ¹Ž÷Qp„5 €håoŽrQÉ¡”ý©žÑ¯¢²QWž*çmKW²§s]'»ì¶'9¦7pLH¼‚{0E ~H°E )mÑ¥ð1ŽAi#×ÕGÕ ¨­®å‚…‹x¹u ƒÞ`!Ldõ!ލ/²„Gù¾;_ q“Áô¸Ô³#×?drg(AÇi”£¶VŸçΚ˔©u¼Ðòbñü>ÍKUÅclæ±aÝ…s÷á›ä¢ÜìäÎp]ü0G¹½B°rá*ºd7[Z_ Ÿ«sñþˆñ> n ‡ü³SÀ„íÞƒ­­ìíã¥FuÔ(@EY—,½”íGwr¢÷„-T»9¦7pD¯w%ÞGÁ]åÌÄÏp“ƒ6‹Ï[Ì´ÊlÚù¬íò¡_½B‹º{´Äû(¸«ðgB‰Â‚ͨµ¥ eà(C— Ђw7­FÈ¿Ûû?áäŽÆ£Sþ‚=êúÑï£à¦ŠB€4 Jlu‰ý¡Hc“„Â~eª’«^Íæý/ùßä5=Ô=´é }ñ> îÀF°¼:0X)2œÊ; ‡ ê'ÕséÌËØ´ýY²á)Þ n值ŸE<ÊwF_¼‚Óð¿BUÂ(¢Iå`X$X^¿œéåõ<ùÊ M÷ €´Úµn´»|îik ‚0Ô6tDùT¡Á¨ZpÕ¼«™Ïî|-t¡“òIvªµcÍøà¢°D Røßª êMCÛßæ)Eˆ¨ý\Ý„ÔÖ6]Ïïw?Ï‘.û+xº‡ÃúaZôÆB¼‚{°§ xÛ_íŠ*!gUÏâŠú+yê•§éÏö‡SΞne|€Ål䑱ï£àl˜ß§‹ráÃ1xDݪ高™œÅO7?^ˆ÷ÁµÓj ûÆ^¼‚ƒ@øo‚DAx„·f¹”7°·„\7w-¢?ÅÓÛŸA òŸ‡]ú)¶Íx÷<€¡Ð󳀨 l=`úªdjº‰_mû ­'Û¬<€î¥E=ÌAõÀX÷Qp„à€Ò°E¡I ³'Îæ½õWñØ‹OПéÏ}@p ÝÆkÞý\ÀF6ŒÝx7 LÍ<ÏÝKÅ{+¼cÆ%ÌJÎæÑçà§tƒäŽ2úUv{9^\¾ ÷ŒJóf"k•²âýó>DëÑ#üüÀ“vê×£Ký»åÝ®®×;pv~>{æq3' LLNä¶·óÌÖÿæPgîÿú䧘º—Võ0ûÆW¼‚ÓyóØY=4V7òY×ñýçþ >¥°Ûû<Ílä¡ñï£à Dj;@ˆ—Ï|³S løý#ÅëõõVvzw×x÷`j‘ `Ž|ü¶Ö|+-G[ùÉþ·¯êÑ­ža‡\7žã}Ü#@`h‘[&#¦Á6÷®.«æÎÅã©-Os°ó kÍ î¥E}›½êþñï£àŒE¡B'Jk€Üv^Í<>8ïOùö¾Ko¦Œ_E©v^ó>G3ùfï£à (äN!W7®¡±j._ÿíC(¥ çjÀSÛØæýE{Ï ×.È­ð= H¨w,¹‘NñèæŒïãG>Ífï±ñO ÷<€©Úƒo`RÅ$î^õ žØú$ûß|=|nB÷qX>Ìî8ÞîÀ^b„€¦Ú&>¼ä¾ù‡oÑ“î Ÿ'T;;¼Ï3Ÿï²)Ž÷Ã…ÛÐÂuÞ×|ó¦4ñOÏ}¥U¸­VÛÙâ}´: ‰ÙÇzއj@¨¼ê}ŒÆ.ÿlÀ­ÿº›>.d5‰wa÷M ϰYÞÌã¼62{p‹+ôЊ)‰&4H’´sØû&¯ª{øOÞé.Ž%œ­ßÑ8û¸‘ó¤FÐÊ“´t—bĈ#FŒ1bĈ#FŒ1bĈ#FŒQˆÿW)%úÂկIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/arrow-up.png000066400000000000000000000104111323166163100233070ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆÀIDATxœí[ŒÇu†¿ªî™½Ü¥VKRŠ(Å)Ki.EE¤šºQ‘d‹„Dƒ¤#;äv zDHŽ*ŒMŽ:„a%ºØ E;ä`?`(q ¿[€Há)^–;»3Ý•‡¾LuuuÏìÎÎÌî¦þÅ §kz¦»ëüuÎNÕÌ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒÃb‚è÷ôÎMÔÅq·#‘ ÞF¨'x‘ÿî÷¥õKŸÆf”x !®¢;–L"Ã{yŽ_ôñêúŽ¥M€GX‰¿Âc="¾Õ„Ñî)*á-|—ÿíÛ5ö²ßÐE”ø‚õF«Ž«¼7xŒ^^ØBÂÒ%À#òi÷èÓ*K¡¶Èìùõ-xý¾€®àO8ˆà‘¸üb„uÕpúS°¢ÇÍ|\|À/Õ/û{á½ÇÒó‡ØŒ/Ʀ *ª¬X‡"ºã÷ÔÉzÅqþ’]=¿Þ>ciàV"ÄÀH2º¥”Ü8t¿‚ðEäóð?!„4I ¨ÒÿÂü^¿.¿XJâu`CjT†×3\ŽîT@y€“*=.Ʀ½ýÿ$ —>'!¸Wwëk×2><Ž’ %"ñ'}‘À.(ø@#P@Õû§ž_Ÿ°4DàÃìGñdùŒ ŽqÃØG UˆÒþμ&%˜†ÈŠB%nf§8ËÛK_.~ð›Å÷uÑ7Tbãø‘¡%(›_(dE6CANÙD¡ø{žôoëíÍô‹›²©‰>À—>k¶à{~dø˜ 2ÆO§Âh›zª4Ôù×ôôžzŒÅLÁ°x¸^kaóêM  §Æ×Hð«~S&dð8£‰¢í’…‹—ŸãëÀ§šâ 6Œm`ÕÊUYן<¤„'"ƒë! !Â”Š„!èéá-,óžïé½õ‹S~–Ï ø.Bˆ„ÂkFÖpÓÚ* Œÿ ¥šàü¥óL7¦³^ ™’@HV2“[Ù%>äê¿zw“½Áâó¸ É )û–.gâº-Í/´‡ÿ•P‘0C€î <à\…Ðúõ0q9…zbˆoqÔ¿£‹wÞ,l`ÉOŒ  âW¸kë]Mß%,ih€$$@3˜F·…ý˜©0šFn¬BE/ 2&úâŽß=±ÀŽHF7Ùø_TRRáWü|êg#‚I¥ f¯P±Ššÿï]¼¢pá`_,ú4·»ãÆŒå>’Ôð:rí"&€­`kóÉf ¨HêåbÅVð¾×“>é¦|€}ˆXôÅ.ýúk®ç–M·0ÎD"Ï| •Võ¿Ô3Ä•À 87u®)òlî^X¶é$‘O€Œ¢éã-Ü-/òáÛ½í¨Î±ð<À>6"bÑ÷ñ•#W²sëNja-#ötã¦sü6£%ºÀSHO6 m€æÃöZ#ÖÐôu¾É7ü»ºÜ;óŽ…E€ŒÆ¢/îØŠ_aï'÷R—õLJ—–}!ë’uÕoV“_d\[& ‹ôãBC*¼Îß±¶ =Ó5,$¦y´JŸ€?ù a%4Öò“Iõô*`ZÒR?©(‹ýfH°y©H' š•ÂE' ör²¢ïŽ›ï`媕¹ž©úÑô!µP!›ÄÈUmnß6Ad#‰PDK‹5„Lày?˜ßÎéö°8¢ÇìMë6±eãêA=ãö1g’ Éõm©_bà+¨$«HÒkç‚ÿæB…ý#@"ú4Ü¿ó~FVª0©²å! Me¿æ=Ò4R¶ÿË\‘P¬(ð Oð1ªÞKöV×Ð$¢Oö¶1±e"Z¯§YÌbRF!H_¼Ç²(‚æl >úËB@a:hl‡Bðr¢ðù–ÿÄ<ö༡÷°ˆ¾5ãkØs×.Ö/V÷ÌÕ=™ ™}-#µ’®'={ѧ,ÎÛV›ïÑ«ŠCA\'ÐîrFãÿînti'è-tÑc :À—ö‰óáùttë+yõø_ª ,kÌ,Áócès¶¢O‘ÐÓ?3-4³•JE…i^ç8×Îw·v‚^ +úb<ºÿQ.{—³Ë·m©ŸilËÖZ ’Ùl Sj•Þ•„ZiƒŠŠñ±O°mÛ6&ë“‘ë‡æŠ›ñ¾©øs+Ú€m*²ÂŒšÉè‚¶²v3ÛqËÂÈè˜æ ßö¿Òq¿ÎºO‹è»züjöß·Ÿ³µ³ÍãLeßfü7…afZØÐ~ÅoŠÄ¢ù¼Ý)c›LÚ—Ç¢P÷j5ñ Nø4_Ýý–¯^N=¬çmþ ct'Ðumm`ÑB ÕJ•ZX+6x;£¿(h·H4f‰Û`ú/wÒÕ ;°ˆ¾Û&ncûöíÍbeħPd—\Y žñ–ïd¦„ãçžô²•A›äÙN&ÐŽ'ÀHyÜ—Å~Nø_cow„ù'€Eô­]µ–‡x˜S“§šŠ?¾k†(¹‘6º[zØØBЦ0‹Az[‘(4‰Q´„¼,àŠ¹rñ”ø[žõï™eowŒù%@è;úÅ£œœ>i}KÆh5€L»0ÚMïaViîë!bФ¦jMC·Òí¤ˆ¦‘‹Â…oo…—xç‡z* ç“VÑwì‹Ç8'Ï5¦?ôøodãé"0:S¹´¤„J(¼jAÍîþM¯`óE)¡"Z鋤-…: 1Æ¥àg|›¡¹›av˜?XDß—÷}™W­`º1qý9£ÚT¼*,0ÃAê%l+…D´Â8-¥sº(Ò¦û7G}+1¨‹Â!CN³éÿs›½Þ1æ‡Ñ·{Ûnv}|g§ÎZG±ÕõG/ä×”Uõ` æÌ¢>úmÛ²0P–1”‡<Ëg'ç ¢Å$:¦ägxÖÿÚ¬í0tN‹è»nõu&¹r!ŠãlNÔ‰ì>ä —>×´‚2^C.òŸ¡Ìcro²#9²—üƒËü\Ê _™éèßÙ´~ÞÉ r(S½¶×1^kw[FŠv>ÃaËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× # ÊÌØ¹IDATxÚíyp×}Ç¿o7E‘@<%E–e[$•D‰E‡íÄG;™8wÝÓi'ŽÈm:“üád¦îĶN.;±]§™‰g<:‰cG”›º1©¦xI")Ñ<,ÞH ’ ˆcßëH$â$ ¿ÏÌŽh¹Xìçû~ûv÷íàp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡“¯x3ÔüãŸ#¿°…o®0æ Û̻ôHWW—3_¿„7!Œ¼Àå¯I!#ø{(ÔسgOÑMÜÂ]ÇÜBû½‚øÇ]ûöioÊpÖ“ì½Rcí'>aàøàR/HhÚ½o_åÍÕ üØ^ùžL&CMuDQü@öù$˜Ìfx<žX³ 2áÓW/]¾)@Á#ÿô¨©©þ@6ó™™YüòW¯Àf³ÅšmŒ¸§³µµÿ¦ €N«Å¿þþºÖ;NüòW¯`Òj5Û!ìžÎ¶¶ë¹ü]d ÿ‚LI’>ÐP©Tøö7¿W^}ËD´ÙŒŒ‘¦ú=Ÿ¼¿«ãÒ囦ȃDé~R*•øæÃ£ºª*ÖæÒƒÐ?Öíݻ囹 ’äã}~2™ˆ¯}åËxí7¿ÅÈèh´ÙŠ Åÿ~øcŸüÜÕöKMy|·@|ù¡/àõ7Á¡¡h³m¢  »?º÷‹—[ÿSëoCEå“¡¯5 v×Õ‚1–ô4<4„îî.8N”hµ)-+•‰RŠ+—;ð§¦& A§ÓA©T%¼Bn½uìv;¦§g¢mJ9¾ZVQÕm5›úò7j5jkw2–ÔtåÊ\¹ÜÇì,,f3œN'Œåå~!Yœ$JÑÜü.Þc K.FGGQf4B¡T&¼<ر};fØíö¨Û›_2TT LšM×ò2jµµ»îHªÅu]½Š¾Þ÷ “Éðð㯯6Û”?Æò¬¶üÖK—0:2µZ§~úS,8ÆØè Jeâ˰mëV,:1ý<ࡲʪ1«Ùt5/+À·ßžðÆéîêD__/d2žxâ <øÀ¨Ýµ /^„Ífâs£1+òÛ[[0:ê—ÿôSO¡®®öïÇàÐ?c£(3 P(^>l©©Ûí†Õ:õ苟7TVLMšÍmyVT¸ý¶ÛÚ(׺»1Ð׿,ÿþOù—m0 ¶¶/þ v› ‹‹N” •ßÑÞ†±Ñ1¿ü§ŸÂ®]»üFÀÐàF†G`CiYYR!`Œ¡ºª ’D119ã$ù¬¡²Ê9i6½›W»€Ûn½uÝ¢çÚ5¼?à—ÿã'žÀþýû×AÓÅ‹°Ûíp-.¢´¬,3¾ŽŒùå?óôÓËò—›e0Cƒ†É4}iò!¨(/!–‰‰Xgbï3–WÐI‹ùOy•J;v¬k¼×s7ÞðËÿñWÉ A]m-.65aÚnÇ¢k¥¥ei•õÊe˜ÆòŸyf•üÕ!ðïÌ&ôúRÈ“ ÁP™L³Åã„<¹ÛXY©ž4›þ/ ÂŽ[n‰Û+î}¯ƒ7n@&“á'1䇅 ®M/bzz‹‹.èJKS>:(EçÕ«0›LÐÄ‘‚`ŸÀl6A«/…\.OjJõz¨U*˜ÌæX{ÀXQ©Ÿ4›þ'· Tâ–íÛc¦¾¿·Cƒƒ~ù?ù Ä‘¶;¨«CSSf¦§±ärA§×§Ôò¯uuÂb6A£ÑàÈ:䇆ààÄðð0&ÌfètzÈåò¤ÖE«-Á¦‚‚x!Øk¨¬¬<´ÿSzzzXÎV€íÚõ‹šÆÇñ~ÿŠüûZ!ÿî ‚t: ù×»»1a¶øåY¿ü°<ˆÁ@ÇÐ:9ƒÁQ’ AqQ a6[–Öà£Ó3Ží‡|êl„ á(•JlÛ¶5féw»ÝxüðaÜ{ï=I­”wP‹Æ¦&ÌÌÌ`iÉ…­nÝ»‰Rô\¿†‰‰ ü#¨MP~dZZ[aµZQ°i4Iï’6¢¨¨&³9zêí³sµú’âßMMMeô¼{âWÁ IRÔI­Vƒ1†×~ýëxƒ&bR__£GŽ@¡PÀl2¡·§>Ÿ/ægK’ŸÏ‡žk×0a±@­VãÈ3Ï$-?ÈÛo¿þ~ÿصFwâM†²2|ò{㌨b_Õ¯ïÛ·Os`KMMÔ2§ÑÀb6annÍ—.áàÁƒÐh4IW‚úº:465Á1; ÷ÒŠKJb–ýþÞ÷0e„F£ÁÑ#GP[[›Òzë­·pòÙgÁöm_®D©N:­–‰ PJ£}ü/cû zÝo&''½9…B‰šª*0ÊÖœDQ„±¼³33°ÙlhnnÆ¡4„àÆÆ@Ü(**öoÈÏ¥Å@_¦¬Vh4;z4-òOœ< ƶlýÊ+*¢~ïd&•JN‹‰ÉÉX!ØQv¨ªÜø[‹ÅâΉ PUU÷ê˜N§ƒÃ1 »ÍîÁ¡CP_Æw1çpÀíYÂæâb0¬´üý°OMùåK“ü~ùÕ[·ÂX‘™kJ¥z½“Vk¬‘V5”÷è·Ôüfj|ܵÁ@ÊŠŠøçÄ V«…Ãá€Ý¨‡¥‚ºúz46¾‡Ã·ÛÍEE ”bðý÷a·Ù Ñhpüر”å_xë-œ8cÍ–ò½  8"(Y¨$atxlÜohhX–_j0B«×#W$ }ýp:cöùl`BÒ÷$€ÛoÛ™Ò£’„ñÑ‘åœ=sfCBÐÐЀcǃR ½Á€­¹•(n܈‚Y&à³Ý­­Í€J¥ÂÎ;Rÿb”Â<> Ï’Û‚³Ù ACCŽóË×––¢¸$woï§Œbhx ±f[`„=ØÝÖv1£P.§å‹QŠIó8æÑß"¡HèÞƒ¤°mëÖô¥›RLYü·\×TWãܹ̆àüù È/ÖjQXTŒ|1³Å/òÕîö–72…[¶Ô¤·ÄQ Ûä¼Ë!8—‘œ?~Y~Q‰›6oF¾ÁäՊ¹¹˜!ðä[]í-ÿ•ö( TU¦ÿ!ŒRLOYáõzPSSƒçÒ‚óçÏãÈÑ£ ”¢°¨……Èg¦l¶x•@"„=ÜÙÖößi@¹Ñ˜™tSŠÙi¼/jjjðüsé ÁïÏŸÇ‘#~ù›6A³iòÆÆM¦XW`¬«½5f¹NøæPŸÏ§Ó •J•‘/Eˆ€Áf›‚ÕjM9³³³8}ú4(õŸ_WªÕyÿ|Æ–––Ö³ƒWÆ›%áPJa³Û!4 Ôjd¢,-_jq~·§NJx ßZãÔ©SøÁþ pLÛ±©¨h=Å/çðú|p¹\p¹\ñZ~ðøñÉ´÷ÖB©P@©RB©T‚$±acp9àóøåŸ>}»ëëÓºñz{{qøñÇ177™\õ¦B’û! ”ÂíñÀívÇ{8UØ&!?èjk9“•,/ŒÈår( (òu…1÷¢>¯gNŸÆîÝ»3²1ðýÇ133Q&‡zÓ¦œ¬’$ÁãõÀãñƺ*½Ýòhw[ËK9 L™L¶2­5’1¸—\¼^h4œ=“9ùA††‡ñØc߃Ífƒ(“A¡Ölx% ŒBòù´z}¾õ•÷h=èloy%c'‚’…Q!Š"d¢B¼î%0É&ãò—»Æccxì{ßÃÄĈ(B®TY  >k(0J8áá'€¾ÑÝÑúZB^²€HF!À?Šø¹sg³&?ˆÙbÁ£>“É2…*#!ð^õ §”†ÝFžFÜ ì+]mm¿O¸anD*(Ðhpî¹søp–å±NMá»>Š‘‘‚B™šè(Ï È0‹ä ×Ú[ÞNª2g;é–ïõz!—Ë“þ}»ÝŽG{ 7nÜĸ• Tl–$Gct]nýsÒ>²¹¶é–ÿÆoâk_ÿ;Xc?±3&:/½ø"vÞº` „ú@©¿mÊr ÖtgÀ„{S‘ŸÕdBþOŸz ÃÃÃxä»ßM)ÅÅÅxñÅüÃÉ Ršë§‰¦£Ÿéê¸Ô’²—|–ì=ŒŒ¦‚ÂÂBüügÏã#ùÈò:ccË{”3<°ˆ"¹«³½ýJZÜä³|JH‚FÒ‚‚‚<ÿÜ9ìÝ» ‚åZ%Erç•––ž´ùÉgù,ÐY£$}!P©T8sú”ÿ¡ŒåR%%Ù¡«--iu”ïò—Ϧ¥1J¥Ï>{wßuW P é%ùÁ+WÞI»§›A~&B —Ëqüø1Üÿ}óŸ¸"Œf_=C'<âW®üÕœ‰å'|gPüD1Ʋ.¹“D08føó_þŒOß}7 ’ ² àÓwß ‹Å‚þþ~ ðùYë´K ñÞkͶL}€þÄúKåôìËÏD%O>ùo¸ãŽ;¾_ø‹œI÷\onžÎh?-‡)€sgÏa(úãÓ3&?!xù¿@OOO Âd¥õÿž¥¿éèèpdü(-Ý Ê²OOã;ßy$©¤*?!ø—_ÆÏþ¨ d£ü_(‹ŸËÖŸ£ÍH'0•¤K~:B*_"BÎ ßJ.çCÍÍÍ.d‰Œ&‚tËO%Y—OðêÎm5_½~ýºY$£'‚ A¦ä'‚ ÿòέ[¾õÚk¯e}¸rV.û¡tZ-^zéElÛ¶-«òÃ×EaÀ–-5xñ…PVV¶¡ò ð\g{ëã!ýgÜ4`=• ›òãU‚ ¼³½õðFÉÏZˆV ººº“–¿ÞœÑ®ÙGV‚7Þ|3Ë><ÙÕÞúïØ`²:(`a›7oÆÂ‚ÿ’®(qYêò¿«7 QiD¼Ï0¯Œ1m.‚Ãáð  [bäÈŸ4ùQW{ë ä²´%‰0«^ÔëÁüüD…2¹"Lpd"Ý'ró ‹¨®¡™\¯Û…¹ù9‚Q¡€ Ê ŒxƒE„!ôçuŒîe äpw{ËóÈ’ € «þ]0%dETH Hà¯oB@ÄЖ¿"8¬Ä'„Xâ"O©TB¢’i„¬´òå¿¶v‚ïßózã>ÊW" ßéjoùOä²dZº\&[-DÂ_2_ä{á²ÃZ= LbT†Dú¡­6,$lV¿V-2 Jãµ~cøvWGË«È1’ €,"Y-[ ²èPÉAÁ‘ïù®Þ„·z²¦üÈ÷"÷Õ+¯YX5ÜÉÖ|Ÿ…$ø7 ø»Nç\<ù"àë]­­¯#In ŠaÒƒåžúsÄkAÂD¯%¹ZÀ.$,ý‚8}†ˆÏ^┊UAXN#^û'Ÿäüc>Þ­æ.ú¥®Öö·£$Qå>¼¥ Dˆ.]ÝE!\väëÀ.%²? ]XŸ!JXiø¡e|Eph(]ýÚ¿Œ!l8¸ÏçÃÌÌl¼7 ø|÷åöwÃ$õ|Ÿ$A! Ëò²ºÅ¯ÈBPô²ÔàÏ!ÒCôf…!¡Ufí#¾pá+eœ[4¥a²âŸ?(žº øáʃÇãuj*^Ëw \½ÜþWä8IU€……ˆ!½÷Õ‡l$úɆÈÿ‹õ{±züQ~oÕ±úªãí¿bßñøÛÀ^¯7Þù€iFÉ}W/·w Hú<@¾?f%CLRJî»v¹¥+_VXÆ¥ ƒtϵ˽ù´Ú7—ùÃL`‡º;òKþúÀ`â†cÒ/Aº³»­m0W>~ùg‹Üó›xW"ìÎë£yüâ³gϹGª¹ò”ÎuttØø–àp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8Îòÿ3< m†DÀIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/computer.png000066400000000000000000000020171323166163100233740ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®Îé pHYs „ „ªâcytIMEØ,$M÷ybKGDÿÿÿ ½§“IDATxÚ½•ÏkeÇ¿3ûÎþHIÐ4ì†uך •¢9((B¨ÿ@@‹æÔS è%žÔCŠA%9†´W¥üq-&…Æ·­®Ðmi“lÐݙٙw|æ™Ùi6æàô»<<ï¼Ë|æû¼Ïì³ø¯¤àÊåò‰DbLÊתª"”’Ãu]xžÇq`]ø³Æ¦§§aYþ‰2™ æççÇ„ïû¸«( è†a๳¯ g0à=úp–œÑ¹æ,)»žKß}‹ý¾á}ñéçŸY¹lNܬV±µµ…ýý}.Qíƃ=ÉŠ(Ëx}? ¸eH(›{ß_ Á¥‘’ÂòÊ ^Ìå ë:’É$lG´?8×ì~ÏòQkùÜ-EQƒ>°1a;}ac%7‚ÓM‹¿··Ž íØ‡C‹ÛäÒr}* Æj|/ƒÇÆð1vg¹t•ìðeô» NÔ=“«‰œ†ð„*ø^2€€}N )UáÍžžvlXò~ÙÅ]Ú3.=vÊ¡R¶«^ï€Ûüþ‘ý DÞ\__ÇÉã5 ?$!#Ç-ÐM ×@±Óè*P¯7¡ïî2O´ÛmAbpç%o6šVnÚ>šK„@€©ì6Ü÷\Ÿ ²cÛ¶aZCI±{Ãtp¯)Ñ ¨+.]¥…Œ ªƒCÇ]RDŠŸøÛÏ—p[oÄ714Ê|Íp%Êà‡ÜÛ¼%úy IÇJ¥R°n-ãäá¯+ÉpíàL©Â4á6›È¤Ó˜››Ã¿T™›çè:ŠÕ_кqBÓðÅ… }ô^xþ´šÏç}„Rßéïï=(µV«}BÃê ‰#¤|¸ð‘?<8ˆòò2^zõ5¸B ºqå«×=vLBÏf³/ìi:ßgLÓLP€šî \¦iv™æËù‰‰‰rø½Þw.µb±ˆ4m˶±½½ÀÛ•ë?åfffªôûï æ0Áyœvú iZ§ÙÎêêêSSS×)qñ«¯ßÎ ¥óçÎ=>;;‹z£»úïï¾õÆ›ÏV*9>>þ¹:A`n4å®aOîÝ/>¦éhvýƒŒŸ:ÕG.‹µÝÝÔH©¤'5íÎÚÚšPZ¡Pžœœ|rttô$MÂ>rªììì4XYZZºB~`wþž”C÷HüßúùNôFÆM2IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/configure.png000066400000000000000000000270001323166163100235160ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœíwœ\Õy÷¿çÜ™¹3³½Ìvi‹´Zõ^@½ãøC Ɖ±)ŠŒSœ7‰Ø&ŽãÛ€mlƒéÑD „zAZI«ÞW«íuÚ=çýãÌHB€Êüàrgvî.»ŸçwžóôiœÖŸõ/pB2åî^" )¥Þ¿¿àÞS_÷_&O®°=W\qaYfvîÕ‘pôLG«:ô”z=Òoy}^¿Ï‡Ïo+ŸÏÛiÛ¾fåÝ$¤\ÞÚÞ¾àá??¼´­­-Äé'ÅqùÅÒøä «¦¦&8eÚ¤[»:{®íëë©ÓJË@0HiI1%奒••‰×k‰hM4C9qâñ8ÊqˆÄ£-íÏlÚ¸õ·?üp=J†cFšŸ à …Bö9ç̾£µ­í¶ÞÞÞŸÏGí°Z&ŒOII1hp´B)…Ö åhTâýÁ—ûy4U]]o®Yµö_}ôÑ5"Ä0[Ä1ý¢i_X€÷óŸ¿ü Gé‡Z[ÛJ}^/ÓΘÆgœ‰´hR­µ°vP ”ã µÂQ ¥ÌgZ98Z¡•¼k­‰Çãñ–Öæûõ‹ß~¿¹¹¹CçX~Ù4Ž<@àª/\yGggÏýÝÝÝ9£ÇŒæK×^ËÐ!C‘–D ‰µ'’ÿ­SÖ±N¼ÔÉÐ!Z€@È@08yÊ´É—8qýæöíÛ»08*M&ÀñÀ?ã‹_¼êÇísAËK/¹˜sÎ=ŸÇ®ÀÉ—I¸?A@¿à]h÷ßä[÷&‹ÛÁ`ÐYüÞ’å-pT6çhNã°°€Œkÿæšïµµ´Ýäõx™3ç****ŸZ(­°h)PH©P$´q´Ð)‘”LH]H„ÐR ±pL×ׯï^¾låÆU+W½Çß‚@'=š_'‰F1ê½Ø¬LÜ›€ èJ<åƒBi;<@æyçŸs Z òó)¯¨0FœqÓÌS Ý/  –¡J*´–(a>æég8p YaºX ,N¼>€YéuƬøNàØ /““}¾Ç’ÔÖÖbIB7O Í“R ÐÉ-@jP@"hKƒ8J1yò¤¾_|ùiŒŠß4Ò¿Ú»1Bböz7Aô±&À±A6ÌȬEIiR !$B-`$$@j¡@ p¤–’h±hŒH$Ö‹Qó«0hŬv7îÔžBšÇ ØÁ`° ° b±8¹9¹‰Õ/D tJ¬] hK¡‰8 /Á‰„‰Çã}ÀŒ{·³êÝÕþ‰ M€cƒìÑ£GŒhÜ·_ööôÆŸ·„a‚6ãÃFh£îµ–€B) KHŒ«(¥ cöønúýûOüIãèaþ’ÒÒáøý~¶o߆t…/Í]H‰%%RZËBJ‰)%–Ë<+¤ £µÒ¡ì4ï‘"M€£‡÷÷ƒþá–”äää²yóⱘQÿB - KHóZ$¾&¤zân Ë|&%A,|ûü‡!M€£‡ÄxÁ¬Ìì¯ÏGNn6}}a¶lÝ’Xá)B—˲°¤4‚Ò² „D¸D1Q#³_¤ pBÃ%@†ßï/ÊÍÉÁ병R°~}=q¥’j^&….’ï­ä{ )–)(+/c̘ѹ>ŸÏâS¬ÓH§ƒ^ wܸÑSUV~.7/Ûö9tww‘•“CQa¨_ø2¡òÝø@B3hù´ÉHA4õ[–µ£¡¡aЃ±>Q¤5ÀÑÃìªêê1±h”PaŸÇ‹ÇëAXï¯Y Яþ…D&í×Lh!ÒÂ’BJÆŽ+++9### C´O\>i\0_?&’›—‹×öáñxðx<´µ´²yÛ–„€BZiö}Ër…/±†¢ÙŒAè÷ÙTUW–^~ù¥—7]Öœ9sßùέe$ó4ŽÉý?+3ch~~>>ŸÏçÃëóâõxÐV­\eÔ½”I»^€´¬ä×EJ¼@ãNœ8É***þÆe—]<Säq¬Û´|Ó§O/üáïþÞÙçÌÚ¾råús_êÏL‚ŽðÙ¶åóù‹ C…ضÏgcû|x¼^<^/û÷³uÛ6j‡Ö&rnÍ(­RšÔ/WPŽÄöù¨4(T6¨ì‰QcFýì7ÿwßttttcìòRúÎ/ž5û¼»ŠŠJ¿2hê{ýõ7@6&ؤ&ÀÑA¾±cG×9JY¡‚B|>¯Ñ>¯Ù z{{Y¾|9Æ 3Õ>)b³¤@)7Æ£ÑZ™R¯„†ÐR1eòdùÒ+/Ë¢¢â;îúî—lܰñ¦xpý‰ ƒá Þ;çËs*gM›ñ¯ÅÅ%W‚AŸR ljӰ©¡ÑqœA@>ýI¥4ލ®©žä÷Ùø~4ÀÆî³±}^¼/—]»v±sçNª««E "Åâ— 5ZZÈDµ¯¥5Bk´¶ðÙ>Š Ch­±íÀÈ£F½ñÿt×ÏüÓ_þ}çÎ©Ú )ønøÊ¨©Sϸ»¤´ôÂ`0ÃRJ¡…£´Ö¼õÖÛ½@!‹)"‘€JàÈ‘ …BÅ“‹Kб, ض¿ÏÆë³±m>Ÿ—®ÎN–-]JMÍd)8ì0Ù „4ib)QJ%=†I“'òâ‹/2hPÇëóún¿ñ¦ë¯Ø¾kç ÷ÿæþåM o¿ý›ÓF{wyYùô`0(„ý %R!I[{›^÷þ:fÕÛ¤Ø~i9$Æ€ÊÌÎά)..AZ(ßgãóá{}¶±<^6mÙ̞ݻ<¸·2H ‘´ÒH) !°h¤e¡µBX¯×GQq1ÑhÛö™h¢ÇªöÚ™gN}mÂ䉚2iÊ]å壃Á R"-™¬At‡¸0a„w¾Fcfå»uÚý£Ò82HÀ?~|”ÒŸŸŸ‡%%–ÇÂòXøí¶m¶¿Ï‡×륷·ÅK– ´··³tÉîùï{¸ûîgÆ ‰’o™ˆôG Ý`ÑäI“il܇嵰, ¯ÇKÀï÷¬_¿ñ¢‰ã'ý¹¦fȘ`0(<^Û›ðH¼Þ¤[Š€ž!†1ü:1YƤA™ÖG>bع¹ùx<^³¦žßoã÷°ý½ølcz<ëëëù¿_þŠmÛ¶³¿éáh xmþëŒ1 è¸i“Z›²ðĶàñX”•–Ñ×&3+Çx½^Á`"´lb –ÇDH‘h(U!hhhÐ;wîŠ;0•E=¤¦5À‘!éÿ—•—Í.--Á²$žDpÇ’’@ €ßïǶýÉØ€íóÓް~c-mDâ¯XÜaãÆ444$W{ò"7°ÌØ€ñ&ÐØ¸׋åñ˜­À²ðx¬d~A&’IV ­4Âüþw¿i­ÝJ£ªNàÈ ;''§ #˜YUZZŠey°¤†´,</€¿m›•ˆ /¡­£‹­m´ttÐÓÛÆë·immeþüW“‰#qPÀH`ÊÊ,Ë¢¼¢‚ŽŽ,Kâõz±ýþ$aLÑI¿qé(…Ò­4›7mÒË–-b*ŒöaÐKJŽ!M€#ƒøgœ5cF0°Á€Yy–…eyðx,åî ³¯±‰m;vÑÒÞAFf6Ÿp8Œ×ë5]½Žƒ£LSȪիٱ}GÂHØR¢…@JacÁØqcÙ½s>ËcáI¤“ЙH.¹®ŸråðóŸÿÂQJõ«1¦­˜@²Ø$m|4Ü àÌÊÁƒ/,/¯À’¦ŽK)Moo/m­mlݾíÛw²·±‘êª*.¼à<"ámíítuw³®~=ËW®"‰‰FÚ6ímíÌ›7[n¹•pÿTÂÔŽ!¸†ƒÓÜÒB(Tˆ×çM6– !L»¥úWZ³ðÝ…zùòQ` fÿßGï`24•Ö Ø@ ¯¸´drYYiâ§µ•¥ËVðÒ+óyñåWyíÍ´¶´•EyY9cF&/'‡úúz–­XI45SGi´,^²˜={÷šÖñÔm@ºžÙÆŽÃÎ;±<|>Z› Rg¹1$åÐÝÕÉýçâZë.LCÉNL_AEÓøhX@à’K.ºÀöپ–åAJ‹@ ˆwؼmAJI,î°aã~äQZÛÛÈÎÉ& ’•°â]„£Q|v€Žö^œ7áþ“ØH­@`Y‚òŠ šöÀ²¬Ä,³âq÷ÿ¸ƒrî¹ç¿Õ¦QŒð·bKZ9Dûxš þdÕ ©þÂàAƒS¬pyùy 6”Úš|~­5=}}lßµ›½{iØ´‰‰&RW;”¢‚rssÈÍÉIFê­±<^,x‹¦ýûMO¡0-%"QVæ––d̘Qlß¾ÌÌL4ljÅbÄâ1swâ<þÄ“ú¥—^ŽÛµô7˜¸!äHW}8<@樱£ÆMš8é'LÉJ^)-¼^Ñh”¦æfL;üðìì,ª*+=z Á€ŸýMèîî6*[)lÛ¦«£¯×Ä £cZC+•È!˜«·§—mÛ¶‘——GiIIÒøs”bùÒeú?ø¡ã8Î~à-Œñ·³ÿ@ýCZ|¼@ÖÙ³f};TX$B¡P¿°ŒŸ—ÏšFÔÕ‹FéíéF«8¡P!奥´µµ“•ÅÆYýþö7íO´‹ãÍÑËëãÕW_¥¥µÕä >|ÒÐýÚ`ô˜QXRòì3ϋljE£Äb1–.^¢ÿéŸþYÅb±`¦½l fõ¶¼,­ Èœ:uêÌI'Í=÷¼sE04Æš%“êZ×ë#‹±±¡žî”Ö4·´²gß^„”TUUQ\TÌþý´¶¶ÓÓÛ €V Giü~›Ž¶6lŸ±cÇb²Åfõ+Tÿ0)e^ww÷òè#rÞ¹çà˜÷Â<ýãÿDG"‘NàÌʳÿ·pëwð™Æ!ÿرcG^xÑO\|ñÅvqQ1R˜Ðk2f‰úlc•ÇcqvïÛ‡ÇãEH‰ã8XR R]M$¡¸¸ˆ’â"¤´him5Á'îP9x“&O6ÆNl)[‚›N<¨‚·¼Å®]»yõ•ùúé§ŸÑŽã´bVþj` ° 3?àCG¤ ðAHÀ;vì‹.¾pþ…\˜3tÈÐdÄÏ ¥&m2i ìÙ»—ή.œxœ¾¾^2‚AÊËʨªª¤¬¬Œ––6–,]ÆÞ}ûÈðZ¶k¿t _úÒµÉã'í€8¦\kÁ®]»˜?ÿ5vïÞ­€]˜6ò5‰«~ÃïC§†¤ 0ðUWWW~îs—-8çœs FÓßÜq°àS^û|>”Rôt÷°yëV:ÚZ±<^lÛ¦·¯—;w±jÍZÞX°­4„‰Æó½þg&L˜h :'1ÿK+Hl*ÞUÚ¤‘5ŠââV®\åttt¬Æt»Âß„1úº8‚2²t$°°kjj*þ꯮xcæÌY¡ñã'$fûõh\èİGG8  ¤¤˜ºaµ¬]¿žp_¶ßO[G'Z尿½ƒüÜ••„iok£·§´&//G9 RŽHô íÒÞÞÁÛo½Ãûk×°¿q?ñx\w÷ôDãñøVŒ¯_±ö·a&ˆtq„ãbÒ0€][[[uù—¿1ë¬YÅS¦LM_ð‹_üœ…‹Ñ×&*à«_¹Ž³Ï>Ǩ]³³²©<˜Q#†³……”•”P ‘‘á'‰ÒÑÑA[4‚eYø|^/YÂÂ… ™>ý #t¥Y³f ï¼ó6Ë–/çÀH!ÉÎÉŠµ4·´oÞ¼¥ÒmÂøú1*“=GÔ^–›þĉ£kÏ=ï‚×gΘU0eʤeÑÚÒÊ 7ÝHWgÁŒ (MO¸îÎ.fÏžÅÿþìg¦òÆqp…kkogÉ’¥ìÚ½›â¢"B…8Ê¡«³“æ–fZZÚhoo££½ƒÎÎNº{zL™<…µk×ÒÜÜL^^žÎÏÏW}}}=+V¬Ø¿uëÖVŒÐ;W+†;1‚ß‹ÓÇQN9Ým ØÓ¦M9ûœóÞ˜5svþĉ‘–ÅúúõÜxÓø¼>JJŠ ƒØ~›€ßO0#Ȇ ´w´3sÆŒd­ñz½x}^ª«*©©©& á8áH”X4F,%ʼn;q´ÒÚ‰ÇTWWW|Ò¤Iá®®®æE‹ÞÛ±hÑ¢†úúúmmm›0ûúÆ”«ØŒÑû0…®ð §³€Ú´icgÍ>ë•éÓ§g7Çâ7Þàÿù_… ÉÌÌ4±wŒE‹ÅˆEc„#a‘o¼öñxÜh¸ïî(' t”CkK+Mûinj¦éÀ~ö56ª½»÷FV¯^ݵcÇWmwcönw¥·%®ÖĽÃ#ú0þýǺÚðÏž={Ú´iSž›>}FƨѣÍãO<Áÿýú7”–ã÷ûþ>?·ˆSkWyéD>` 3Ù;¦×½¿6öÚ¯w¿÷î{M±X,UØ©ª½#h÷ugâ9Wèîhxw^ЀÏcÁéH øÏ=÷Ü™“&O|úŒ3§FŒÀ½÷ÝÇc=NIq±)¨L 1ùÃk 5Çã&›<´vg{ëdPèíwÞŽ>öØcí¯Í½Qkí Õ]Í©—KWؽô <ÊÀ©!Çu~ÀéF ð_zÅ¥çŒ1òñ3Ïœn«†Öð“{îaþ«¯QTBH‘\é®`ÍÔ6ɇâ¼<„8‰`RŠxÌaÞ¼çÃ?úÑOvíÞ½» SŠí^-•žºÂ]»Ý:îÐÇÔ£a>±§, ðù¿þüÆÖ>0ýÌ3½UÕÕ(¥øþ¿ýË–.#??àÂwï­4‘hŒï΋£Nâ ‡žž}×]wí}æ™g7a¦}íÃDä`„Ÿ:è1u…§ªôOTàãt!€\}õ®­¬ªúÅŒ3¬òò2´ÖÜyç\6nÜHnn®y2ÑX¡•kÙ'‚>Z!1‘¿˜r¸æê/RYUe„¯úºë¾Ú°xñⵘ,Üv Ð?è1uÿL~0Nx€àß|åÚ›ËËÊ8cæLY ‰D¹ãŽ;Ù³gYYYɯ´Bj™ÜË“ï¹p$ˆáù袋’ÂïêêÒ7ÜpcýâÅ‹Wë0nÚ.ŒÚw'|¼Ÿ8• HäðÕë¿rWqQÉwÏš9Säæå‰Døæ7oãÀ&222’iÖCÝS/ääóÍ[oE9މý÷õêo¼©~áÂ…n2¦žþ¨œÛ„qB =§*’G¸ÜpÃõ?Ý þ@oø¡âŽRÄbý³Ÿþï¦eË–/Ç|0]¶Ôc2ãd"€®¾öê˲³²þXYUé+**2®Ùk XðÆr²³ú}x©Þ%¡´í÷sõ5_ ¶¶å(´vôÃ=¼çå—_^‚þzLr§SHøpòÀ®»þoçØ^ßoª««<……h­yñå—Yºt)¹¹¹ý¡[¡@õÏæBà8Î!µÇëåÒK.fêäÉÄãÍ믿Ùò§?ýy!Fønrçýõ';Nx€àõ7}õzKX?®®©±òòrÑJ1綾yÿýuöÇì…°úÍÐ…~¸PJay¼Ì˜1 .<G)šåËWvþÏÿül¡Rj&гCÌÖ9Up" ™Î½ñÆëo×Z}¯fhÈÉÎFiͼçç±yóB……f,Z¢pS)ÎÀÕヌþ»”’£FpÕUW¢…–šmÛ¶õý÷=?]Ç×b„¿SÐqRûú†•ÉtîßÝòwÿωE¿U[7Ldff Ñ<óäsìݳ—P(”4ø„I"¸ªÞ]ýÀµ/¤¤¼¼Œë¿ú´RÄhlŠýð?þkigg§+|7ÐsÈÁ § ND¸ÂÏúûoÜ|O¤/rÝÐaµƒ´†'ŸxŠÖÖvŠŠ‹’³îÊWJ!œ”•I¥ªròòøÚ×®KÌÓSt´w:÷üä§«›ššÜÌ^Æ×?é=…ðfeeeå«_þuOoß_¨«Ãï·qÅSO=EooÅÅEHݦîõ8ý§wPýBø›/)ÙÍ ‡Õ}÷Þß°yóæ•Ỿþ7XžÌ8‘ oQQQÞÕ_ºúÏ=Ýç×ÕÃçósž~êY”£().>¼Áç|Ðàs à8¶msÕœ+ÉÉÉ1½NL?ôàÃ;/^¼”~_ÿ”t÷‡…ðUTT^ûåkïéí=£nx^¯—¸çé§ŸÃ’¡¢ÄžŸêã«C|©G6«„ÑgY\xᔣµB)ÍË/½ÒøÊ+¯¦úú;0¥Û§œ»w8œ€=|øð’¿¾êÊç4ztÝða(G‰„yö™äååõ|‰‰Ú.Ç`ð98X‰¾W“Й>m*C‡T'Á÷Þ]ÜöÈÃ.Á|õœâîÞáðY@¾ñÓÆºêŠ¿~ÙòZÕÅE!bñ=‘nž}ú²s²ðuúÉÕ/Œå?@姈Í%£4£Gg̸ÑÉÐp}ý†®?üáÅŽãœ6îÞáðY@öYgU}ùç.› f”ä‹Ç ‡Ã<ùÔ³†Bäææ Hê5põÊàsub”W”qæ´)(eNêܳ{wäÞßÞ·<‰¸E§…»w8|V€ÿ²Ë.qáEç¿’“Ÿ›—C,§»«›¿<ü¥%¥äää$»s”PÉ#×ÇI®~0Ÿ¹pŸw´Cn~çœ3Ëäù4hýúW¿]ÙÑÑáÖò¹ótNywïpø,`þk®™3aöÙçÎËËÍÍÊÎÉ&‹ÓÞÝÎÿüƒÊ+ŒðS&d %ª¿t+Uå¼ò•ÖØ?ç;‘8Ô£»»ÇùÃï¨ollt}ý˜Ö­ÓÂÝ;>mX€ÿk_ûÛY3fœõDAaa +; '§¹¥…?üáÔTW‘2uc`ÝN¿eðÐ&­5B @pöÙgá±,”ÖD£aýÈ_ÝÚаÉmÞ8%S»Ç‚O“ýøhÀ «IDATøú×ÿîâ©S§=XTTäËÌÊB©8M­-Üïï:d(ÙÙÙXýZ餥¨¡ ®Ç™>}~ÛvǧëgŸy~÷Ò¥KݼþzÌlÓÊÝ;>-x€À·n»õ ÆOþuqq‘ÇmÈÜ»·‰ßÞ{ÃG '333Y™›ìÒM±üSW*Ü€h,Æ”IÉÎÎLǦYðÆ[Þ|}Á2º{:>õt§A¼cîm_5rô=ÅÅEVvv ص{'÷Þ{?£G2ÂwWLhäd„OõŸ¿ëà˜¶-éž´e^wGz1b8y¹†V,]Ññì3Ï-ÓZ»©]×Ý;)kø? |’H¦sïºkî7j† ù~(’€`ëÖmüþ÷`ÜØ±ddd$bõ)ßíZþR%‹9R?s·4tõôP]YAiI(Yñ³iãæÞGy|Y<_G¿»çÖðrröéˆOŠÉtîw¾{ç?VTTÜ* ‰ŒŒ 6lä¡ê¾ì?0Ñ…R D¿ÊO®|Ì– µD E8!TT@ÅàŠ¤ð÷íÛýóƒ® ‡Ã®ð.ãN#O‚ÉîÜ»þaîäÜ …D0`Ò¹k×­ã‰ÇŸdlBøÒê?üÐêi­QBáç*_¨Ä¡JJ‰FñüÔÔT™Ã˜¶Ö6çüqmg{§èià«ä=ž8ÞHæòo¿ó¶ŸÙ>ÿ—‹ŠC´Ö¬]û>Ï<óãÆ#à$W¾™Ä-“M®¯ý¥Õ€<4EHÁðaCÍ©ÛBGÔ£<¾©±±É ô¤º{iáÇ“É\þõ×_÷´¾²´¬ €ÒŠU«Vóê«ó3f ¶m'…)SÎÌugñ;8Äu|€ÀS3|qÇ!‹2jdFàÄãúñǞܑâë§Ý½#Àñ"@2—?ç Wþ©§·÷‚#Gà·m”2Â_ðæ[Œ=¯×{È0`*œÎåÂqºº»1¢Ö WN¸‹/½øJãêU«Ý¢ŽÓ6»w´8Hæò?÷WW<ÚÞÞ>}äÈض¥5«V­añ{‹9r¤Ìâß'ûñÔ@ ÿ„þ$ƉÞÞÙÁðº¡XÒBkómï¼ónë‚7ßZ©µ®'íî>.à?~|錙g>ÕÞÑ>~X]->Û”[½ÿþ:–/]ÎÈ‘#±,k@t/ÙÀ!ú'mx­U’nο­½ƒ!Cª±,kë×uÏ{~ÞŠ„¯pËvÚâÿ|Àž4iRù´3¦<×ÑÙ1¢®nX²ÖnÃú ¬Y½–ÚaÃ’3v“µ{ÎÀhž+üTÃÏ%ˆ“8·¥µ•ºa5øl±h ­a׮ݑGÿòø*ÇqêI»{Ç„c%€|S§Nýð_Û¶oß>××O»{GC€„ðÏ®«ªü‚¢lHíÐdðfã†Ö®­§¢¢`àÊO1ñµÖXÚJ®ðÔ`ê3‘H„¼¼¦NB$Á²$RZ¼ôâËëëׯ!Ý;.8RHÀÎ…çŒTZþ¼×ë-©RÚÆõY½z-ƒ*ˆþH^ÊâOõíÝ,ž@ ¥NÚn8“•Å%—\L$5ábËÃ{‹·Í›÷’;7íî $à?ïâóÆ•?“_*..J Ë–­¬«ß@YY)J)¼/NÜ¢„ER,IÁ+×WÒDj£AR8|¶Íœ9WF±¤…%-6¬ßÐ{ÿ}¿[‘ðõÓٽㄚ¢#ÿùçŸ?vPeųå!7£w(D£Q¤°(ÈÑÚÚÊú ë“Btãþî5 •KçBKÀþ’o~÷Üsîó}yÎyîyn¯”Q]–+qku+ÔßÀ|Uƒ/ÌR¡ P]È:ÐfÃÞ2àÍÍиÿ·€y }P`“s@>À£…Bè©¶ã``AΆ?›ðÜ3и·#@ùÔ‡awÁq(d5÷Üøe˨œ?_4*³äÙxœäñãÄ yö,y@—BžÝ [ÿö­PŸƒ{ƒðZJK…Ú•+™¶n²2”üÐõÐÛÜLëŽô&“dÞì…u/ÂÐÍ(=‰‚¯ÜïgΣ2fáÂëß@ˆ™Ëqzûv:>úˆA95G»à+/Aú Pž%18…p…¦Q¿~=±ú™¨êè¸.P^/~U8©(ؖŹݻéøä唼±¾8x¥$gÊká`ÆÅ€)+VP1»ÇÊ`êi,3kfÁÖÁÒqű£‹ïò¢ ˜Ù,ù¡! áÞÎdP„€ÒiÓÈŠ,ÃÀ„Ù+ qšñJý|Ø€º VYIÅœ;Ä`ݤú.Sv×—ÿHu‘Mw ½¸Fß0#d û2NÕêž|’¬ãêèÀ¢&.]J)‘„[ž‚±×& <ã'Âk¥(G,Z€V©Ñ;”dÒ×¾Ãä»ï#X5žÀÄÉ|úî>T7‡_5ö1òizûzЦNgþS?Å_ZJåâÅœ;x½«‹¨¸qxK×1 ìë0\µè¾Ö $ „4•ð¸(¹|p4ŽšUk)Ö˜¹‹™ùÈfÚ»"¹l’Îî8NõTþä—¨þA‘àŒ H&}}DÇŽexlÀëApdÁÕðBªK)¨PRWŠÔéŽ_ ÙÙAõÒE dB5‘êéœøÛúúÑj°ü¯ ‚+y¦•Ã?B¹¡2mœT sp ˆNƒ÷ŽÀy PæAl l€V„ƒ6þH’`Ä!RªréäqºÚ;©ýâÊ+"Ê&M%Z3‹®D7«Ÿß5мët {ZËX3E%f[;F"‰ X€8ÿ¼ã”F˜ã¿à‹‚ªY8C„3Æh9´ƒý†ÁšŸo»"¢V¤RÀÈêüø{\M­2ÀXÕ†pQ êàC"Ÿùt«A˜¨yäj¡AV"…”…²Ì™’#~è÷¼ñôcò9¿Nµ·žb÷ºªC—©®Ì åE¤.¾ІMIÏèx)@ª))ºWPTpa£ŠSYsgÀ±=;8¼k;×–©çÙúÍ5T“LŸ‘r9Ÿ’\BUŠd- Pl0¤Y®8^÷ÌfòЖ€ºe,ÿÞÃ\[þ`ˆ‡÷'Íý-â!,ê%,¡#½â¦¡W$¡“0ÁµDȤ¡õ<¸ŸidÃΦa²ëÕ܆FÖnmâãÎÉœŒV-P´«f<®ž+ëÀÛpVi#–.‡tζƒRÛÈ··5áAÞsá$ïíÜ4Ꞹã®FV½ÐÄ…Þ}yp|@PtlË›ZÀ‚Ó€£·0`ÂÛ‚LÚ’à¯oäþ—G“÷_:É»[H}‘c;#DLÓ´â×M´…H`)r<Ë•U`޶†,m9ÔVÀ àzf}ÀŒÏsﮃ£ÈùûÏ70)ÖCÍdè¿ÐLª+Á„k¼;ÊÅBUZ=‹‹‡^'‡ÌE™€g2½6& ¥z3£„×U°Š)äE/¤Ðr‚ËGP¬ÔÅ“{¶1j±„€I•þ÷i}õjv>C|ÿ6‚* µ‘¿ö~ý€«áÕ9Ðr˜ `»ò øÚßi¢¼~8Ç656{ˆAqÀ6AÝ_ :ßL®7A¬þKœØr¹Ö¢$¤{ÅŸŒßø+•ÎèAÌ \ê†Þ†¯Ê•. zzÛÝœ F¼tË }ÄæÁX?hIj†„%çwÐC¦H|ë{Ã_«I1Þ1‰5öÍn×ÿ ü5çýµ¼IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/dialog-information.png000066400000000000000000000225511323166163100253250ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœíyœ]Guç¿u÷·ö¢n©%·Ô^dI¶$cK`ÙØ`Çl“Á!1"dø@HÈ„u’ù°8“dÈðâ`–0“I !d`–|0`á]²%[¶µZ²–ÖÖêýu÷Ûî½UóG½×ï¾§V¯¯»Ÿ<úéSºïÕë{oÕ=¿:uêÔ©º‚W!”R¢&«öûDyj¢KU ÄDsAc¢sÁ¡Fà‚J½j?3ÁçªKMðYçó«‚,"Bœ+h£&""Dój…Í‹&yžß/X2\p( ¾6'ú<!Æ/=A’T„^û9zO.LÐÚ ªk–>×kó&" L,̰”W>Ê òBªÉ½Æ¡šÁ×¶æ²@k“UJÑïÑÏi ˜¸Uh‡|Ž~¦Z"Hhl"4$Î#øhK¶j’9Ú‘ïµÉà\íç¶bIEÐÑäGR9FS­–hh"4"}|TPå–\+d'r,v9?!&ê`bU?‘À‹¥äŸçs”åkTi…F#AàƸ«míµw#©,üª¼Ñl!¶}ïñ®ÇÏ^:ë̃V*pÂå %,%T¢€R>P4L‘÷k`I:ybͪö£[®^u,wsh!"©xž¼ZâÔÚ C„† @Iøµø²àÝ R,úýí»jçc›Frë€vÓ4’®m Û2q,Û21 i˜†aLC+€PJ¤T„R†’P*ü ¤„úè2åгKšâû7¯[¹ó—oºz?Õ‚Ï•ŽyªIQ&Â9¡H°èPJE-ùÚ_°W›^<|zùƒì¾½wpì)e—k[1×±ð Ç2ql Ǯ߶L,Ó'€i CW_ ¿B€ ”5)úÅ $_ ( ~3 ãèÒ–ä‹[o¿öáõ—-ëA ?J„<ç!j@*!„\},júú©bC£¹Ô—ÿå‰Û_9Õw›R\é9–é96žcá¹6®]"@DøŽma[Æ8,³¢ òEÝ=GŒ·ü Ç àr\ðeäµðÉ|òÅ€|Ñ'_ Bqðò•müþ¯½þgÍÉØš9¦&¢Ú‹B€•µäª[z ˆÿ/­ùÞ{Þͯó+sm➣_"€[úì:B`Ø8nŒTÜ¥9éÒ”p‰;&–e`›:Y–@)B¥…^J¹BÀÀHá±£¹…BSHR( ]Ç @6_$§I‘{ö®_¹iÃ7ï¾eÃA K5Ê]Dt±h]‚ "ü²Ê/ ¾Üâc@ˆ}í‡;¯yø™}ï ‚ðÚ˜ë1×&šÊ-ß²L7ÉÒ¶&ºÚSt´Æ1… ç‡ä‹!ù¢$W )†’ ZàRQôCÛ6° e ,ËÀµ <ÛÄs <Ç$f›ø¡äT–îÞ =#…QÂ0×¹‚_“ŠÒ4]wm¹êkïyëk_B“ J†¨Á8îGXh,(JÂ/[øåV_«êã_ü—ǶlÛyø}RªqÏqÏ!îEoãØmmm\Õµ”ζ$B29ŸLÖ§o¸Àð˜O!Z‡Šb  ½éÀ4¶eàŒ'AkÒ¡5å’Ž[¤b6¡”;;ž#½d†ûðý|±B€lÞ'›/’ÍûÊ2ÅîÛ6­ùÛ¾ãõÏr®F(w eM.$ ŒáGûû²5b<{¨óËÿúøÌçƒ7Ä<[ÄKª¾,|×±ijja×°¶³© /SàìpÞá<¹bH¶NSÐ3…e bŽIµhorioriK»H©Øß=ȾWN“É RðkHPðÉå}s­G?´õ濸qC×I¥TNJ™ó .÷s 4'lÖu¦éZçØÙ~ðø ô’-«ºË4ýè;oúôê¶Ž!ÔØÊ•‰Ñ¦¦¦_Á|‘`> 0.ü¡¡!÷øñ±¤/üä×~öú'_<öYÛ²V$<‡rŸð¹b1¿vå²?üÀ›~b¹-#—.KŒ^zis”uou'@Tõ:4àééMüÑôßyö§ú†>÷\«<ž{6›6®ãž[ÖÓ;\`×áAFsA½‹ÔPhNØl^ÝBKÒá;¿ØË3/ì«ø Er¹bÐÙÖôßî}ë–o›13Ó•JŽlÞ|yŽyê æƒ`îÝÛëîïîKe é/=ôÌï Žä>œp£Üêq‡wÞñ6]¹Œ=LJÙbdÞÆïË4¸zUš«W¦yþPÿðÐ/È*CÆlÁ—-ÉØîýåëþÚ±íÌ-­™›nZ›gº‚º ¬úwî<íRÈŠÄ\ûÿ¼çökþg2å o¹|mfóæåEêÜԛƶmG§&G3Í>qðwF³¹ODý÷KZ›øÈo¼Dzx|/¹Bcçé˜Í-–R,ú|î~BßÀ`ÕœB2ÿÜÝ›.ÿ7žºeݚ̭·^Z¬§¨”RbÛ¶mæ÷Ñ›öM¯éç{öþÆÐXþOâ®mxŽçZt®XÊÇßõfò¾ä©ýøÁ«ËЛ-<ÇäëÛ‰9‚ÿþõŸÐ}ª‡|AÏ4fó¾l»ŸÜru烞#ßqãªá[o½µnZ ®¸÷›Ì‡^ëîÇßÜ›É~Åsl;æjá_ÒÑν÷.F|ž=4ðÿM?]X¦àæ«ÛiNX|ò¯âLo?…Ò,c¾èûíMÞ\ݹôá”aôýÍÿøíц#À]w=àÊ•nëñÁz†G¿á:V¼<_ßÒ”â3¿ûv†³Ï¿2´¨Þ¼TÌbýª&.[–$·Èd}ŽôŒ²çø0#‹8 1„àÚI¹&ÿùo38œ7(øþXG*ýó¬ÛkõýøÇ.Ôãžf=.[M£3Õ”¥Ðqb`äë¦i´Û–‰e™$1>ùþ»)‚]‡\øJ) Çܹi9ïzCW¯lbY³Gs¡9á°¬Ùc]gšÖµá9&G{F •¥ 8a®Pt÷eYÙžà¶×®åçÏ àû:d-TÎÐXî㡳á@qàÐòìóìkoH$—$ZNæ>/¯³,Ë4pl“OÜûv\ÇaÇÁ~B©PŠK:Ì ’®Åû︒—6ÇNø0 A×ÒkV¤yñȹ¢ÔB,X™¥„ãgÇX½¢‰-.çá§_$%¡”¡lÈæ:Û~$#û÷ç*¼¹`õ‡\”ÓšsÔ{|À2MLSàwîy —­hãéý½ø¡špñÝ|¥P)|?À4ü嵬lKL»Jé¸ÍåIv8« Õi¬ìRqô웯l£½­í/\B¹f4_ì Cs?‰†žŸSŸ5GÜgКk1[×*Ã|À4„e–"ooÞ¼‘·½q#ïé¥È¾ Å"aò¶ëWqÝKf\³¦„ÀÞãƒH%1MsAËHÅéþw¼v'²¼Ò}fP üO*IÑ÷‰»·\Ó1ëêýÒ5ˉ»EßG"¼ÙOìå#ï|#í­¥îPÊ Mþ£ØÌÚãÓWm`à6‰vâæ{0Ä» !0„À¶>óÁ{èÏ„t÷f´Ï/§b! X زv›V·Íþá‚ÓýYŽœA(Ã0¼.™"©˜Ã›¯_ÇwyŽ0”H¥PJ-Ç0z1x™3›Æ`笜*³×ëì4v¸ËøX9K¡øµ·Ü€çº¼|:³à-¦üÏÂ0dMgzÖÕ+cMga⇠¯ÉÊÿž>p––tœ÷Ü} Šˆ¶7ÍbØ+YCÓlë7KluðÌV<ëã(šA ¿­¥‰;oXÏî#e–.Jòý€0”4—úñ¹ 9á†ß­>¡T<úÒÞý–kiomŽ@µ`[ÁuÚX¿uV•V'›°Œ×‚øÕr–Rð­oæèÙQrũԢ¥Pê;Ý0ðÉ TI£ÈÅ­SÏpž#=£|êoGE«%øU,ë:œŽYiY`«C,±S¼Ÿˆ'ñu×ѵ| ÇÎf‘’EMJ ÂP102wgY_&O*Ô"×IJØq Ÿ«ºÚ¸yóúj:âý@ûl´ÀÌ °:Ù„ÍkÜRɼëŽ-ì=>¼¨ª¿œ,ËBJÉ‹Gzg\½Z¼t¤)%–e-z½üP²ã`ÿaë-Õ…Ü‚06bv5Ï´~3$ÀV×iǶÞ=÷†ë®BÃ9‰Zôd;&¡’<½ï Å9„ü§÷&TÛµ½^Å˧GH'=n¿ñºj9Zâ}¨ü2Ø:£‘ÝÌpyKÇ» Á›¢ÙwÝ|GzFR5DBØ–ÍÀHžï=ùÊŒªÅwŸ8ÌàhÛr±èõ*§ú¸÷îj%ù&lû*®M¤fRÇ™ î¶áˆwgÙÆµWà8.ù¢D-˜ÿ|)‘ˆƒ‚Þv'gTM€'ùçm¡t­Å®O4u÷eI%bÜxÝÕ‘ S¾#>#ÇÇ ÔÅV‡©5XƧxåÜ÷¼ý6zG‚öõO• Ã@)E¾è³ãÀÖ_º„¶tlZ5Ýß=ÈŸüãvr…X<Žç¹‹^ŸÚ4š¸iÃ*~øØs•‚ ±ßxˆžUg`ï´ú¾é`õ–Vâ±w`Š·–³Ú–´ð†M髃µ=pl‹P)²9Ÿm»O"€+/iÆ4'V|ùbÈw?ÌßÝM®âºÉD|a =M g‹Ü°®ƒ‡ŸÞK6_zþC!æìaðÙ±é\ÇšöøRLug4†äÆk¯¦g(lØÈ.A"žÀ4,r¹<ßøÙAzú([Öu°¾«•¶&­Èú†ó¼tt€íûÏÉA,ÃóÆó MuéÀt– ÌMQ]¸qÝeô%ÄK·Lˆñ"U¡ôSuF†)0Ìò^H%‘UKÒ†0tXØBƆÍN sëë6T ¸®4¨|³K^}ª­éfŠ Ö­”ö4JYi™%ir"̈4¦ñ¶QúÏ4- C4ªü9~vŒ›Ö.¯Î4Ä$KCS? l¶±œ× ĸ›1‹ãzùìœCÒf¥(ùäJ*” Ò%Pé³…ÏWeiWiªói­ˆ”…(‘@&bn¡3ó†‚/ñ\—T"ÁÈØ¸á¿Ó¸nÝ1•0õ0ðò·¥HXïÅ06•³®¼¢‹ÖÖ%Ôc¶m&Pª¤¦¥Òý÷·?ÇpS¢úO'-vÉŸ¡0tjdÄ ‰äðñÓ•L%zðšapç¤cô©5€°ÒÆÆhV{[~°ðr•P€|ýÃ[¦ÓÀz’æžÏ=^ñú)Eê5J*„aðƒOß>§{êa`ÉÑÀÈ}b^MÀ‹!<ì¤=ñ“À6PEÓ0±?T``F]À¥£Ôoý( ͨÃ^ƒRQ"@cd¨°Ìq*åá„“z{''€g(áVÙZ†Ù óä‘n©ìî/OI=RPç‰ü™ ô´±j:OŒÖ¤ËšKÒ„ç’Ôó'eîäÈÇ$iª;ÓjX‹X*½¶~ÜYT‡‚Êò ÁêÜœpXs‰ÞéähO†ï>}„—NÔx}…põ»)ÎÉ à>¢z¬Ù 1`2òú7Ögû9)ú]k®hJ8\¹"Íʶ$'ûGùÙóÝì<ÜS ɳ&XTœ\XSh€a•.FG¾R«"ý¿T¢.­VJí{X `›m .]–¤9îp²Œízxàû»Ï‹Q“§T‘Icö&'@Ÿô¹‚ªIÿPª†S‡UPÆãæ^PU6 ÎBÀ’”G×Ò$]K¡äÅcüó£/sàä S›!µÝ½(b[“nÃ:…#ḣæªùä@ª†}iƒTŒÏJ%AÎÝrWåúÎC-SÐÞcyKŒå­qžÅÉþ1ž?ÒÇ×~¶—Áц۵âTös‰x0„VYyÉ¢ù¦‚,OK©ËX‡¡›¤|­¹—/³YÖ££%ÎòÖ†éa߉A¾ýäaNöÎíâœ_þ÷¤AÓ U¦¥ï‡HåÖÆØ4”(²ä·©ÇÐ]–=3˜y²Mƒæ¤CkÒ¥5åÒštiNØ ŽéîeÇÁö 73¹…># TMw/É0u§Ay2º„ÐÏR$…]{³@Yõkcê±b¥¼AÃD]€k›¤b6ɘEsÜ¡%å²$åâX&=CYNô²ë•^Žô s¢wt~·Çu<ÈõWç©ÉƒA`:}Ñ¿* ÷2Ð~ Í"Ä®ƒ£¥žÐê¿ÒÌu4ÐokM{4%]’žMÒ³IÅmR1?-Ð?’çdÿÏo„3CÙù0&‡‡þÚ•ÐjÿT§MM£ø‚~ÍŸFv¸£CEìÁ4 \Ûœ Y8–~EûB>ˆÊlaiS…:tSëV¦±\ 9=8F_&GïPŽ3C9²…Ò‚v #ÕyJîžê´© U»I ¥æ$ƒ’±!¥$[ç}¦)pÍòÛ»õÖ±¶aâÚz'QÛ†þÍ4tžeèÙ¾Ò\ÏxÜßxœ¾!B`ý›iˆRd˜@ Ée-²Y8Τó ÓÂ×z,›† ]6a‚ª²÷$>u Àh¶—„;TÖyíuš|„A*²¡3X>`B¿ÝÛ2´€…_Ík”^Š4 ¡#ƒÐÃÓ ‘Å~!O†ˆºDñ4ž±{lŠçŒ úÉŒôMuêÔ8úµË>v”(Æz!Ö 3§Nz;ÔpvoUü" ë×jÏYjÖ`ˆ5AæTužG9úµ)4'¤ÕãU9™3›û&ŒóU‰‚«Kãmt –‚‘3µ?<Æ4 ?½&ÊT}Ïk¯“9÷ëˆôë2ÖàqXž.c±Æ,ʇ¦súôÐk> ªÒÉ(Ù!ˆÏz‡Òùÿ/ò½.m\$ša¬¿6j5CŸØ>Ó§G€÷瑼X•7Ô ‰–´ŽK­¿´&pî˜4ªzqal¡ãµ¿¼È‰û§õ.¾éJOüIUÎð)-|gz/-”ÐIÔÉ lº)]Å‘ÓÕùú1Ó¬üô›¯oÿz¡Œ†ô!ÓÉ%4Þªc‹mTù Év: aÕø?ÀÏmº—™>žû|7Rí¨Ê8¢G¶wž“•Í"^Õp%÷ïÑÚ_v°û«§&8cB̤— ÿ¾*g´Š9H¶Ñ8Íd‹ŠD†è;¬ à&g|¹yëµðÒÚÿÒû2„‘I…¤XøìL/7s¼ÐüÒíÈšûÏ7LÒËõ=OïÕD/C ‰ŸÖšy昽Ùþló£Hõݪ¼áS0Ð ‰&혯mU”@½$daT¢bŒÈ÷zÜß4"×+ßOTFóml&¤Û!–Ôýþ9Ó¾ò;ìhzb¶—Ÿ[ñ_÷ñ•j‚ÊÖNV߬GÇalˆºµ¥*ý¿’ ÿ÷·ësíY¢õ7þaþBÆ„€D+´vAn?Vù“Áô¯â‰/MÛóW‹¹•ú™¿èFÉ?«Ê+fàôÝ'7-wN¯¶uÒî ¡'{šWhƒïôKç†}Iù§s>Ô#nzìÔý(öTå ‡þ#:n°i¹ŽX­'¥nàÕÊ¡Nór0-íg:Yó7ê%ÆN}a®wš;ö³ôð S{…Yù^•ŒH:ßßœïo­‰ÿÎ4#Zh¦BĉV=ƒê& ; ]éGª…¯„Dò~žýËzLóC€“wîbe>n«d*ÈeÀÏjÄR:ºÅ°¦9³VzÈã®ØH œÊ÷Œ–k:0 ]çô2Hµƒíè°®S/êPûÚú >ÍŽû¿4Ń™5ælSœXù+’)„¸±’¯ô2æ|ìR`c,©FÑùöW#,Gt¤—êÖ/é…“/–|ªiµIDATü52–ê/Ø~ò3°wÞÈ<`¯â䪟ҙöQÜZµç`1«Õžé‚í‚פ–¥çüÕ«ˆ¦­G>é6Êí¥tPÇÐ 8ý‚~Q($Jþ;Ný±Þ§i‹6Ÿר«8qçã¬ÈBˆ;‘{½Ò8”Úâ&tP‰í¢­ëè”ëÃÔk÷-ZÝ'Z´’ÒA=ûtwXå¿ËŽ–¯ÀWæ½,ä`ZpýÇÞŽÁ7€jG€0!ÕK¯„x‹n-¡¯}ùaÈgµ7l:†b#À0µfszÝD,¥íœâ˜žíÝ#gÏÕpŠ1àÝl¿ÿû,—k4@'ŸÞÏòë·aoš+?((ŒÂXŸ²ai-KiÍàxš$J})dCAzd`{o†T›îçc)Mæìž ëÙWRù5uP¼‚ÁÝ<}ÿÏ²Ø K€SÛ»Yuí7QæjWUý!Û¯–°ôCµí()Á´€rp‹l'MVËÑnÜX³vtÅ[t?¯­Å2g´7t¨[‡–ù¯Ù_aÇ—_^„,~øC˜|ʳD–«»…–•úÁÚq­‚¢Ž@óZkäsÚ0ª5ÏÝ„QŽ<25¸Ö9ž.³eC± \¹Aí=SÆ5‘GñGlO î[à×°—J°7­ºÿu½W|¸n¢Ÿ±]ˆ·AË*½-ãj5+D‰ ymLú‘¤ôJ69ΰÛ%wsÙÛ'JŽ!«tË-}vµPR >ÈÃØ€níc½“í£´ Áyêþgf^¸úa±  ±úC.Íæ±Ä}ÀÄ»N˜$ÚõdR¢U ÁŽëº……A)j·¹+ƒJ¾,‘B•üŵvDÙ©Svò¦¾§Y>ÚZЦ]I  äÁÏÁh¿V÷Ù¾s§pËP !ägè;ø¿8ôãúo²4C4ÊxÝÇWBø9Lñëç)2,-øDifÑKWcEÚ ”¥Ðma)š(MŒ*¹—£ž>³ÒâEÉíkè­ñ4¡ÊëŠÚ¡•9­[½?6ÉHE)à›ñ žº¿6¼gÑÐX`«É¦Ž×cYÿCÝqþ)C¡[¦›,-—j©8“L÷\¿=FõÄNtèqƒ’ÊíÆ‰!Rèë.'7¬ Õ°¶CBŸókq¥PâGòÏÙyê©ùvìÌ H€2¶šÜعÅw3鈥¬²m=Çà&µafÇõ衬Œ‡“ûô”¶ÊÃL©*-Ý/©÷‡µqJ P&íºCPßÃPΓ§v5šàËh`”±Õäú•0䀸˜ÆÚ³ˆá&LÝEØniÝbY­—†™-Ì0( BCm¼ù’¦gbH‚ú6J}‘í§ö4ªà˸0Áæ¤1ãoEð„¸ &>ÎàrDÀ ñŠŸ¢Ô?"²ý‹#s½àBáB"@[M^ÓÙALÞƒ¿„7í [q©žÀPßa÷‰3ÞÚ'ÂJ€*:?求õ oGðF„±Ä% ê´V] N Øƒ2ùsN±§´ÛÑÒχWjpŸÁê~›¤Ã«rˆ5@ˆ&II„Jƒ(MJ©,JdŒ¢ÔŽ!8€ P´1æ8´ÄŸí"ÌFÅ«“á>0X¿Ç Ð!Ftý­”Â=£Ø³^–üªòE\ÄE\ÄE\ÄE\ÄE\ÄE\ÄE\D ÿzœÅ êEIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/dialog-warning.png000066400000000000000000000223351323166163100244450ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœíYçußçûºï>û f€Ù° ˆ$H€XR%[Š9¶£ØåØNU’JœJU*•òC–'CU©<%~̃œÊ+¥r\••¼h)¹"[,Ë%j¡(R$và`¶»u÷wòÐÝ÷ö½sg`fà9S_ÝžïvÝ·Ï9ÿ³|§¿†: : : : : : : : : : zÂIvû7©"|ÃB»s(C8~'‚îö5>Nú{#zÃi<ðQò âãðh‘§Iƒ&Ò䇄r·Ë—üXè‰U„/àqŠéˆðD €*—É1H™ˆQX£ŒƒŠÉ®uÄ=D¹KÈm”Û8îÓd‰o<Éhàíö<*j1¿B?†Ã„ÇæO2øÚYŠçΫ73áê7}þUÄâwðª?·¾û[¬{å„w±Üâóª4ŸT$xb€kxŒP¡ÉBž!7tVû~á3ÎûØ)<Ÿ“¾SHí6*许›_:¢9ó’-Dß‘|ôM ùd$Ç5æ`7Σ¢'RôM,÷(Rd ŸÀó„…ÏD ͳү[>0 jÀ«KÁ5½W½Š šBh°( Bšú&N~“h—ÚŽÓ' Â>† SÀÓÙ‹áÃå³2* ó ˆZnP ð —ìÇ|OÄy,1FSÁ O–)0»};NobhPBC9†˜“Ñ‚¹¢ASmö™âAnUP%þÎ!.Ø—‰ÌÓ8Ž"ŒÑ Ä›OÞýz¢@A˜"GÀÂ$Â1W7¯¸º)(Š«ÝÂØ¦ï4’ƒÂ8¶ÿ vä“„sï-}¯5’6%çšöŠÉ»›·)2G?5…ú“„O–D K5Ñ~˜Á™cá¼9¡¨ Ë×1cŸFì,߃ùë°pl ï/cü™˜µ›†`ÁEÌ `aŒ*%¾†Ýݹ³ôÄ€‚°DaaåhT³—42 ¼›þç0Z€ÚUˆšÖba¨/àÿ£Ø¤¦ T½ËÀ,p„<,‘Ó'(òÄ_Ã2@Ë!`‘ãá’™¦eÛûÔ¿ñÀ…à"Ð(þt!ÔçÁ“˜¡7ÚB  ‹2©‘œÂ2pˆÊO < ŠÐ$2ˆa1³QÕ¿H$6Õfsø3"f¶&LO[*Ë÷ð_ø¯€´ Uí%01 (ƒ4É«>(ðD×ð°T!ÌÉ©pA·´_,ÞÌï€?°Rû³(Ö 0Š=ü¹xÜÄÕ‹–¼q"y†Ø8”¹öd8Ðû^ô*†EòX†P¦ÀÌFus•ø·)˜™Ï?ÞfxжÿOû–îàþ`|Òã —¼‹¨9Šp„ƒ,’׫ûÿþíûÀi< ‚á–Eží! fž-`Çÿ!bK1Ã]¦kF¢˜ÞÌ¿ì8MT“ å 0CÄ8e>»ÿ}}-zÃò†€)ÔÌFKæ<©}°G“;Ü ù)Ã;„Áµ…aé6öä¿[jûû‰–ÌyÄÌb˜D¦Na¿£À¾¾xNãQ¥eËŒrF«f¸õ½?€y Ä_©éš†æ € wâßwœÎ5Ì 6å`†<‡pTÚ·´o@¯b¨PÀgÃ$ÎÌF5û¢ºÄ…°ÇþY¢ý½`?êÑ2‚P½‹ùä†PPˆ–틈™E™"d˜ÊþF}{á\À'O–q„YUyÎÕe€dºG ‡0}g“Ù¾ ãÝzÚŸñ êðOþ'HmŠ€kJ_š—°Ì`§Ÿ ðw÷flö¥è›X| (#˜Äö/Û€„û`f~ãg´Ÿ¤i—) # d?#¨„}Sœj à–äyÔÌb˜"bŸ‚êþ¼—ûò¢YÆÇÑÏŽY Í‹®!•”AR9†-Ž»,´t5¤õ2!ToãüÏmgP@CSr¡¹Ì`Ç£/ïOØw ob9J\¢ýÆÌDU9ÓÒP3ùOÿP›ét3;iÝ‚°ÂAŒ XDúžEúÎÄw+„hÙœvbŽÆÄEŠúæþ ÷•´Š=|úñ˜f44/»ÐãŒÈÀÇ0…SØAºž5Ù~“|vG K×ñNü~' Dä Ì%³xLÒÏþ~›(ÚWÀ›<Š8FQ¦˜£QUžFÒÛ.ØñÏ"ÞP§öÓÅt ›ŽFÝѨ9\Ô²þBXEr‡0ƒ—”‰ÏÕå) äa™â~+Ù71l«Ø£Á–ó4Ì%$!ž¼ˆä%Ú¯ £’©=øê,<4Ít`ƒ" Ãù¼£= K`gÿ ná¯âqBñ]Ã\1¾»Žå–9 ¾ŸŠFö´¦Å>£¦s4jÊñ4ìÃXìèˆékC;(ððòàž4¸"ÔE†Ôw>0,ͳ4×DÈÇ%$å„¢@Ž!æÊ4F˜¢ÈÕýã ì PMŠ=ò OÉꦽ¬Nü´€G†_EücmÛßååוÅ9 ŠÐ(D£¢0ΡQÄý[Шk§¯ Ãò ¼‰ßFM¾5Ѩ‘xQh_A™0À§÷/°/€/àQ¡Œ¡L«šQÙRK3x‘B&äKþ8\øHQ¢.Œ™íª ¸(é·~-éÈ„6°ã¿N«jH!ªÊ †§P¦ñÝO¥c{^TŽ’I´_›ö’:‰o°‚ ¿ŽñgÆ;Úš3Q]H£¦%ŒO@£06©$¨P]ph‡ó˜F!ÔîbG> ¶/s‘˜°f¯ÄµAd‰Ü~(Ùó^”“BÏi“aIU!Ø+cÎ#XZZš¦r†CÃ6ì“h>.kR$ˆÐÐneÆ0†úæÈ?Ï¯Š¢¸¦9ŒãY`š£XÊ|aï;Ù{ú3Ń(“(³aÝ\l¥]U1#¯cüé„áí§;H­´(bgÐÔ£Wí~lk¹ºö#\¡u˜ëãdýB¤zoòwÚѦ‚ Ì!œý†i ‡¨ìýÒ±=+zC–¡¤c6lð2®51‡yÉétúZŽ_;´¹ˆøá¿ØÓ×(‚¨Íl\”Dq3!¦+ì )‰1Åã˜ò±¶¿¯HØäŽY„#¸½_:¶g/ŒÓxä(“‹µµg44£)˜Jq Sþâ’ÄM÷$N6$Ę ¶õN_†ñ®Xô˜EŒèÎ/Hõ:vâ·Ú–GÁ5ÌHäì q®‚C÷véØž€V±Ga“8fƒç4JÐ^†_Áxc+µ35Ù0ŽÏëÔò•ÐŽ¬ß5”=GÖ¸â BÿóñÄ£;„5Î×NâÚË¥c{ò¢¸€GÇ80Eö9ÈPš–•ÊSØâÓm­ÝŒÊ„ƒ„X/lÅý¸Äæ§QAò?I> eÿ³SÈ­‰¥¨¤~oüW‰í@ì º¦ D ûrŒ\"Gy¯–Ží9PÅàgJ½`&ªòRk±˜á‹[i3¼{â§G €õÓÌ_;ì#u];+HäðüE$Ýyô¼®‰Èè«mS 59 Ìà˜¤¾wKÇöÜñe|ÊT°‰ö7í9¤/ΤïY¤p¼7Ó³ÂÐòâé`ëÇÀ¶„$A”šÏh%zÖtöKývô Ô$‹Š(h å°a/‘ìÑÒ±=%ú&–CÓbf\çpI¨es˜¡‹X“#}¿§‡N|K„—OÂÀ–D™ `š$²ù°S :AYH¶5ÀDK˜±Ou>WXã9„Y“ ïÅÒ±=s1­beúѸØ#l˜ Q$%MæVeà9Larõ vÙèÔHˆÍmH ?5Ê}dæ¼ÜJ-ï5»˜í—æ=¼¡—P¿¯•2Š…°n^¤€´Le¯•Žíh{x‰öì«Éé–:Ùfà% ÂJ¤ÿgâÿlµ¶°2ÔšNý¡‘ÃËg&5+™Þ!$ÚÄ„0ã¿Hš]D!ªË³G“2ò=W:¶'<Ódê4G“~Љö×ÌE´Vê ¿€ÉO$¡™)¹U[l?¼‚ ÎKãÚ)_âqÚÿk,a÷¸™"zœW€à>^ÿIš÷Æ ùa,¹°f®xwå6†9ƨëYoho ÀU,ýñ!ḏ *OÇ“- Þfà,¦£z·ÇtmO uqM½}—˜תHC1!Æv‡”]¡`Y:ÏÛÀw0ãŸn­;¤ AMN9LáÁÛ;E#».ªŸÆG#Ì5.á·ÐøELn˜ž°¿"Y“ÀuGæ. sqè‡ËÆÿI'1 ±ýïå´ÊUMF<À«L@1^n&©Jó‚*¯b˜Æc‚&ýœÞE#».|=)õÊ3Û~sÂÕâR/)Ž!ýg0Ôéí€e˜"]Ú z¹ ŽT[@ËûO2ƒ^¤•Äše|:vØûÙ‰€ÜÀ›ø­u&¢†s‘9…2…Ïý{vUZ¥^ ‡™æ"—]ˆG’â·Ãç°¹2Ù™¸NAÈ&f2ÂÐLBÁVÚ7Ãt2É ¯5Hjfºa?l3?[R.!DðJ%LéT H(êÔ†Ëú*0CŒtœÛý¢‘ÝE€´Ô+Ç(”†r*ª3“zÑR<‚TžÁ¸*m OâÿµLAGíl!è`:­ `Øò ¼BÖûÚÌ5)³3I5w gˆ70‡_kÿÖ¦¢PN£LQf„ %¾¾»(°kÐQêeí_æ’:L\è)˜± kVÂo/§l…î M„W ãø¿µ.Pâ¶æBübq*× WBFÃ9ldðÅöD‘bÂ*—fPãÑOßî¢Àî…×ð¨P&-ô åÙ¨.“­¨ªï(R>†‘=C»4ôj¥ÝºÃ²®cÄá•u¶îáš­ÿw›"@z¼®'9 }ÞÖ¹’q$F)ÝÀ޽ˆ{øwñ˜@ÔÃñœxz¸,ðvi1ê]A€V©—kzÎ4rQ]r+Å`F/ãÙ cg×ɺŸèé~¼+)ñJÍò³É L"H]£DGÚ·KÓÓ¾,*H7*$û‡a MÌð˱|Æ2*%â9å0‹ rt÷P`wà4q©×ÊtØ”¹†Œ§ -ƒOa‹ˆ,СÍZ™ÑDÉ @úÔŽt%kD±IRÁ« €‚_j33E×Þ¿U²çNÏKçµwoôÜG ®Ÿ¶ÎXT—³¶¨70Ü¡É×h² (ðØ@¯bÈ·Võš3Îs¡¡ÖÇzë-³fØ'íÔ.Èú 'Ñ/Iý ÐN¥>€W̆~]è’µñÒã½’DÁl¡Š=ßÎ á2ÁÌG°»W:öø`Ÿ|²ª—a:ªëÙ¨ÉpÌÅ =ƒ) #r?£y¬´ñ=í½ëô ºÒµñšO.®Î¤[…&žÃä³(Ò5Ž®‚«ù)€D`‡Ÿ"|ð}æš Úª¾ì¹IŽ»4™ç4M }jñ±Ðc•8½Šá)òxmíä¥VFܰc¯`å#:½úÉ—î~º´6› Ê$„¼Ö¬`{þ?m~1Là¼Ç8­×õ„«÷G÷±¥EìȹX< XâÆÌ Á2Ä‘Ç.àÓOåÊtX×sA“DÀŒ<‡)³Àº“/@ëÉß $~ôÖDDñJ!Á¼ik=$ÏÄßµGô#ydž:^Ú~ŠDà¾B8ÿZý€¾`Y/ùEnâsÇ<h»çëÐcU N!)Œ˜DÌL㡞mñØ”ðF/b¹ÛNødon¯í–³«‡e‚ãUBPÛ‚~E!y(Ä/'9éf.t0¼Û1íž•4Eð&ÁŸ†Ü1È…Ü1÷fY•@äñ¼©ìñ!À;I©WÈ8Ž™`Y/h eÑ8ú±G.aŠˆÍäü5‚Øike“›žzè½üÉ2Ï%_Åÿ{å"%õ9Z Š-%¥`=5:ƒ. Ø ØaðFÀŽ€7v ¼qð¤ï$j@ó=Xú „ב¦ H"˜àš”š úJn€„ÜA˜çË4xL(ðX@ßÄrƒ"–„Iœ9ÚœwÏi’'—\¦o}L?Ø0}‰ógÀ$fqEÝ_Om’&]bF¦™½˜ü² ÆCŒAŒ!ÖXDÈ6À“)ÆÍ”»ZØ!<ˆ%v£ ¸‡~·bfï@ãÇ\︦x30C4÷óV_°¨Ïå*æÛXwøŸe}“ðq¼¤ê‘ €Òz‰S†q"fš zÉÒ}ìÈ3˜Ú7÷íuxràL„¢ ¦?•kÊÉg±­iíA%LkÁ7à ˆ¡|Ú'2yDbÁcä¸Ò©ú—¾TÊı»«‚.ƒ›‡è&Ôç ¼“i·ÁëA‰Œ¥$ÁOÈ}…ÚG×s.$ßXÐ×òý\îà1Ï } E#®bñ(¶ =Õk.ºgF CHyÏ¿–a>@»ÝÍôÑcÛ‚)ÀÛÛØøæ{y(ø‹…Á-zÌÿ¿2ê.h .h .¢ø»Kà ¬A´3¼åc¬A™5[¤]ß·ú±åØCOÞýIk¿æ‚>ë÷qÂXbp,ñ&©(I±G~rL L7êek]À¡ç°úcĸÞL^•ñéF,‚.ÆÈßÍ/éK4QÔcñûƒ=¯×xsF´nùjÙZÌ^mŸÌ¾Òø¹£Ÿ$¼÷D1r¨ÃkÎñZa„÷0Ü>ŽÒ±GsÆq©—2åBóTsAO¦sý¦xS¬àÞo¯Ágºš¬²½ZëµO†ü!—]R°£ùnãçȶÍìo–ñŠ·ð'ž!½8xÊEœB˜Ä0ü8JÇ™¨"œK^áf˜À0ÝøÈ½âB¼4ùf'^ÄÊÀêJ®Çø th£×ç0ÞJÚœb º>37ÓVš?$wâØB+é"lã>Ç1ƒ2Ð÷¨×zt:”°‰ö7ÍÓÁÇZÚß7É{x…6Æäõ¿–@týâÜ€"]¹!ݸFoFÛWjXÿ]üÙç;P ¹ÀÑ(àÙFàÑ¢À#€ÖKœJ  q±GýCwY#LüCïð9<ó=°¬Ôú^Ìܪ)èÖIÌ€ÐÑüA·yhß Ó»¯_€àäG¼J["¤q—×0L㘠A?ŸÆTÓÅ®áQ¤„0Š25ätó!Óšߘ¡ã?À–o­Îèí"B÷>7ÊŠVÚÿÁö5ga#‚Òë»î>šÿÇäžz‰ôÞ¨ƒæ"“á"Ï“xŒP}t¥c;¨"ü9"ð8Œ˜™úw9]Ù1xS°¹¯¶Åo-µÏngÀÅÛ•glAñú.‚9CùdÐÞ;>wz¬¬Ñ—ý¿ùrÇ‹Æ;Chm.ý^êr¥Rá-âˆ`Ž%jªD;½Þз×ðh$«z¦Â%}®9ÏDë„ÏbÌ<^©+¾ß£7ò]÷vJiÖX`äõ¼Þc¿D@6 ¶«Æü]}Ùÿ[Ç„ó}ò§/PûÎWZ‡ Œ7çå¥Ü€ÞÄã•GS:¶£& £Ô+)ó®ÝÑ‹-û†‡?}¯ðíÕ!#&`³¦Úû´þÏ6zŒ»Û¿^öÿ^ÛÁÉÍN`ʇ:®§~G/¿«ð0ŽAéØÎúi©—Æ¥^ÁCy1\`4½áþ‘¹-Ýßó7+  6ê¬mÕáÛ(ã[-ÂðŠg¯tÌ?EË 7ÈâÕÈG)RÚéUÇvLZ¯p³ !fª·õ|êØ`òx3/ã•þjkÌ߬s˜6›ià'ÍË|¦Í² ƒXŸé[a| üo²38ÝáÖoëELR@ª â“ÛÉ¢‘C€ ø8*øñŠžr>Zd0…3ú<â~†-<ì}¶+ « ˆ¥“Ñ–•BÑK¶ÿ[a|«)F¿EñÜÇ;Ì@T¥¯~K®`˜Âc”¥]ulG@Ã0y|qLb˜©ÝÔ—ZÚï•ðfÎá÷õÐþ‚,#º™›2Öví×ë ÁvŸ6VéÞÆŸð±ã';P v[Ïq”hç×Ü{òåV©×8†éú-¹-k%ý:wâ ½…É/®¼°~ßf?SX:ÇTЦ°t-Oõ9Â9ƒä•ütHߥ¹©¤Ž ]ÃߦÕ<ú´o+Á™fŽMÆ•è”.þ" üNkPW§X½%/Méu”;D;W@ºmh½ÂÄö+³µ›úB« ¯Ø?ý<¹Òÿ\] Xås«BÕè s–ÿ&ϽÿU!|Љ ËßÎóÑ—é{µÎ¡µˆÉ'd‹²ºßKÒþÍC·„ïáÔñgμÿƒÖnÛú|á0ß2ñ›Ip„ª^%”«Û+ÛŒ´Š=<úˆ_¨¸£Ô+baºú®¼5ñÓéÍü™_@‚o"^cõµÕ¶šd™•ôÍ}© ¡lxè¥ohÞðvFÛWëëE™ï¥ñç”.½¿=]à-ÿÜ}’uˆÃí¯:¶uéIK½ Ã(S®ÎÉúív±‡8‚7q”Üð··Ïô­ EBÕ¿Émî”û+ÆgÏõúV£Õ¾î`KP|î•hÜádT7Ow¬=¸UǶ$­R¯f²¦Ÿazù=^Õ ½²Gáì/#á_€ W‡Ä­loRX‚»š×þ´ï{íóöº–nZÑ«Q¯H#Ý®ÿ)Å Ÿ@l¡%`—æÞ€ä}ÛyaåÖ [ê%LF ÀúoQ|ù޼@ã.Ç‚EsÃ$y†€ÂV_X¹éƒZ¥^öŠžKïòªF˜4‡]<ÿ+˜è+`Ò‡)ØæØáÕk×jÞpôh˜ºÙíêŸQ<÷*RèkÍh„,ÿÌ}ašˆqÌÖQ`óRóu,EŠÀ(Âd¸hN×ï´‹=¼éaú øß‹÷_ÍîÔöj”ÜDo$"7¹²d½V|¾Ùùà»´íæ1ò]ÊW>Ó‰÷˜jÞ7gÙfé¦@¡0€ÇÂÌâÝ«DÄO²©Pºðk÷‰WúIh«öqÕ Yçû”qÉgß/Õè®\ëÏuÏ5;fæÖ]tµÆl/ÿ)…ç/bJCáÒOÜ뤫‘oqíÁÍ!À5<Û«z5ïË Í{N/8wâ<’k༵ú;á,u÷­Ã„ò'«äÏ47¦ú†~o1º:ã·* [·Œ‰¾Nå~¥cÿ`ŽC›ò2Ž)<†·²öà†@¯bxÐzãa`fé'z¹KJ¯ü:–?Yg õNÔc{­¾^Ÿ)“’&£ÿažÂ³Í5yo|eäßÎS8Ýìœèþ\­o»L_«-ý…g^À î0K?ÕWi,äéßìÚƒG€x ²Œký–œkÞg´öù8¸ñ*?]yìZÚ›Ý^Ñëµn¥;0eÇØ™cèŸ/â ;ŸWJ—ëŒÿ·”.Ö;™»!Ø ZlT€\i|…þð;&yÈPõçr…´€´Hq3¤š j•zÚeÞK?Ò‹)sÄó)½òkØæfb%ܧ}ÙïºûÖCˆžØc¼”ÒǼ’¾ò'«”?Y%š3D,¦¨Ø±ñ» ?;v¯Ïî¾"Ófû²ÛK_%wì—ñÆg ï¼ßºŒåŸê¥ÒQþM Hû6^@º1ˆ_áV‹˼—ß•KÁéê+…ê?Ö>èü1Ý?l#?~­}×Óø🩷ïh¶ß‘;àM„ˆÕ´XWû{¿"lÔt¬‡Qˆ,ÿ ýÿè·ÚïÉŒ \ oémù8Ê#,n¼Œ|]PEÀ'dÇb¦–¢çÒ‹’\‘Ò«¿Šõ¿”@ûs«ŒÝ,Ô¯ÆøµŽ_kµ0y#B°aXú&þáqrÇOwô/ÿT󉳃†>ò{˜d}ø:Ka8\¿¡gÃEÊ©RºôYôáß`s·wŽÁev/†®ÇèhñF¶‡0ôì‹…/1ð«¿Ýá FË”ªïé À Qà‹ëów}˜ÂâS†Àª¾Ç™Ø³¶xƒc”^û¼ÂÿÙ˜¶¯ö¹“Œ_O‹·¢ñ«í¿Ó°QYüv¸Dùâë˜b 18¨}ÀœÇ2H?É" kÓšN ‚ð.%Š8FÂ%2妧tù3èÂ5Œ¹×fèfHYÝQ\o;¥^}›½†µúÖÛ^«o»J±êwŠÌ}‘Êë¿Dóƒ¡WkUÈÆ1€Pd°6(a±äQ**h)o*eL¥€ÄûœˆIDATì¬üõã‡úÀüv`+¦àq Bö»ÅkØCOcŠRÌa*%ԫ䉹©àÈ3†]ÏX; ü<„k|œrbÊ9LÁ`ŠeŒ,Æ¥‰› å6ªåÝÚ½–¶ob~`Cß­õÿF´¿WßN"‚k‚ñ1EA¬ÅY¯…¤ä|",þúwesE¡ ¶,¡TLÎäAkwÑSHcÔo×ñë^ÒfŸk3&`µ}7Âôl?*aÈnç§!xˆ)D¨5à ˜tVfô¶ ø”"q T¦6lÙa‹ÑoÀàç@ ½!{£}«9r½`~'à+ÇnÄ,¬evÂLd·Ç~w÷ØbS °‡©„ ”BŸ€eÜz ·¶P "¤AÄÂB~´zË䛘b©ýîÃoÑÿ¹ã‡ñÛµùµýëý¿Þñ«1r»Â`‡`ò÷¡pŒæ¿ˆñkØ|Sh’\¾ƒ°@Ä æ×_`jM  zˆAªD<ĹûÅ#ú³…·Ÿò¦°(4¿ÿ¿ñŽÿ:þÉÿ6O¼tûZ£>¡´´’<îÎW©ýåç!ð/@l C—©½…ê}à!EjOWÌ\Ö÷–飊㆛ 7 ÃÁOšó…Ó&ŸÇ5}‚ïýÕ¿þ*xChèášm8Âù*n~i'~öß[2ùf¸‚Éy˜œàša¼ñ&W@<ñBrÅêÛâÉûDz ÇG,Rgn}`}ø ߢŽð€X÷nnœàÝf°\žT|цààáêZ qµ&Ѭ+„´‰`–ãP¯àaò—7˜œAó‚ñE½Rývn2ü.ð. sx4øÍTߤÉ Ä«XVPòåc¡ÔoϽP}à„‹ ž«;\=f¼«6pµ:D›rH¨')ÑÃ%L£€æshÑG Z°EaqzþÝÂáæw€·€·QnÑ`‘%‚õì?lÐZ+oáó y½«Ç ”S¨yŠH'—?ðŸjÞÊ5磼.¢áÖ?ƒ)ûÎï·üw¯|¼ñ6F¯#¼ƒð6†w™ç.£,ržp#°¡<€€ê yÅ䱫ˆeûXŽ”gÃwÊGà "9 VË@íð"G£mtìîý¶{EÛýM’šêµÏá "4hÆÞ¾>n¢\G¹…pŸ–øÌƘ» Ò«.às˜"UˆÁ0‚2ˆ¡Œ³9T-V@ÓºÚÈë݈nê¶2›=¾×µÙi!ÝþxiѽD!Â2ÂC,h0GQãáfVÛtÀ¦Šðu,Käð)§„¡ˆG‡Åaðp•±½mÜŒõÖÇÚêØÝOÙoç{ÑN€‡G@„¡P§D•E|HÀon~aé-G쪟Çr‹Å£Œ¡†aXÜF& o“7knËgÚ9Úì5o…>J>ûQn¡Lq#©oú ÜV×ÜvÊFS øùd¬?Øîˆ›¤Ï?æóí6ýAÂh‰}³]¾š: : : : : : Ú_ôÿ…PºãpO‰IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/document-print.png000066400000000000000000000150711323166163100245120ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆðIDATxœí]KŒÇyþªº{^;³;³\-³Cî. I&!réAdˆ%ÈB ßä{ìƒA! ÁG6 [„ (rr‘C V„@† GöÁŽc‡„‚´,  %‹dÌ¥Vûš}Ì£»+‡šš®®®êžÝwçÕ]ÝÓÓ]ÿWÿÿ×_ÕUÀ#Œ0Â#ŒpAô¿€qy©=ð `À:¯ß>XŽ8 ÀÀ3 šªþÀ}ô™v?ÿ¬…q8ÚÚFø38¶¬ôóÏA€€€I'¾ñoœÀ3 ^{íµÛê–0€Ê0p À<€Ç<Æ{iÏ04 „\ð‡ÖöGpSÐ7Ð~þÙÇ8NÆØ a`†w`€†w  CAôÃòÞCC€a(Œ~a˜Þy(àûÃS ½†xOñÎƒÆ A!ðB`Ë‚AuQôrÍÂÐG #†Â¨fÀ÷ýA?V×áû¾ö]¡Ñ|?È÷}”œŸ],üaÓ'€ï3PÊZû€,sß÷AyhM‚NàaM7"|Ÿ&‡I ð°‘ Iø#´À˜ßz u߉áa!A’à…ŸÃØà}@vøT›/ˆll¨MB `½…/¶Ac¨À@)¥|¨‚nã6Ä \Ö\ŒÐ·ƒ¼ ¸L ªÔ|n‹j‚A!,ä UcRûaŒ|€V- üø¾Éð&#:'Ä`Ì‚,tÈŠWÿBàÂö‹ýAcH ‰d(¡0FB>¸Vèyíö¨àåÞ½0µþ€àâÅ‹yÏóþmkkë ‹‹‹Öýû÷©‰Â"Èæ@‚“ >¼ÏB$Ø-!ä@MœðuD¼ÿx<óÌ3ÿpäÈÿðáÃ^.—{ϲ¬¿½xñâÆ®xè+2™ÌW§¦¦¾tïÞ=T«Ud2™v-`Œ‚R• rʵ®ÐF`mðëYû÷Bx!,x è«§r?†Ù‘?d? “ÉØ¹\ããã(—Ë_ZZZú*€7öRÎ;A_ @)K§ÓXZZÂÒÒÖÖÖÚ@€1ÒrúäTÔlÚÊ ˆÀ…@B$R~_™*™´¼o"A x.X¹í!He¬­­!•J!Nc~~”Ò±.wGè»`Y„  l˹ЅàB¥­¦¢L= ø}"ÿõÀ~¨}q@Ó vøøZ"ÈË@”M?ÑWX–ÇqBQÜél>  j¯0²ÕMIäAˆ€,X¡tµŸç‹ý@{ÄzÔ^M}P%ßÇé; ú®lÛ†ïûð<¯ýâmŽ: ! s>‘„8‚¢ÆÊD`j‡3‰áš.ÒÎbýñ¾€¸F”…m÷¿QÖ÷”5c žçµÛüBØGÛ¤”†H '$"„M‰lÓy^ø¹˜† fÁ'GþÔÚDÃ5_Þwœþ'Ûo'”Ò6ëùæ· ’]NÚµ=p“Ñ4@’¨>¿.ŽøAk (1þ¡ßc úî k^ø¼ÆQÛ=lûEŸJ† €6¾`†Éû×5ù:‰ýó}•Bøa `Ûöþ÷,ËŠD¸V±V{Ÿ€R^ëÃ`°©¦ˆš€pëB<…‰zï_5ò~²/ ¾ª cû¿ Ô›¬ö<Ïc4R³„àUP%‚\ÛMö_N’| ©¬þeòvÖ¼lä2êÒ '€8ˆ Úûª­ù;³ÿIÑ@&1a·~€*|5ü+oaÒ÷¿gs`>€ëº’¨WÿbŸ$T¡‡É %ï¼? :……®#ƒÚæ—»Uày\×=8>¥´]ëL€ˆù §/LSPïü…@ ªþdÛ³Pšä êÚüÑÚìóÿ 7‡û‰¾û–e)Í@Õû DürK h9蜿n8qΠªÆãCÀfû šŽ «Q²‰Aʉàûa'*†AðTüoø9ÂÏerM?Ê×ð¡ïÒû¢,†Îxå•WŽø¾ÿgq,j°šªyºë(¥xûí·±°° qE-k0‚‘?a-àC5&gPÝ×ÁäF¿øæŸ©PÊ¿·, W¯^ýá›o¾ùCYC¨FÎSÏ‹T’ÙÑ—_~ùþ®àyÞ‚\ˆBªMù*!jµ!šf hû$àö>èÿ—í h¤ö'ù ÞþGµ€úÁ‡Ü-þ•IA­VKtÕÖ‰š'›(Ïó¼cºW,!gZ©VÐqÂ×åår9äóù¶ðÕf ¨éò~ ì°ý÷}^û)ÌA9åûüÔBmïIÇfõ/ˆ oûÇûº}ÏóËå´~€,hUزÐå}qï– wM€Q;;rœð}W®\ÁÚÚš¦/@:·ÿÌ-‚@ØQD¡þÎÂÀ˜Õþ{ž‡µµ5¼ùæ›°m;Ö4Õz9Oªý „,ÄÉ8–Œ±³{©ñª €7n`{{;b/Ÿ†È Ú ¢>@R0ÐuÉMWËäN~Xða¡«ÍBÏó°½½[·n¡P(Äš€¨ÿÖ3œ“±‘—/_Î6›ÍGEðe·ê_Îw®ëÂuÝöƒÁ°ÊWÛÿ&¨aa.lSo`<ô‚7ùúïþÂÃÃô׋rqÇhâ„.ï‹­åC=zùòåì… ¶wD€f³yšRjë„¿Ÿ€Òð Ï#‚(e­h  kÿëUÿðôÆ@ Bt§]¾&˜„v¤Ûyv³Ù< àÚŽ@)=»AÇiQûR)>®}2ÆðÁï·^˜{õ¢‹W­áAž,`Àƒpp°oŽþ™ ú¢Ö‹s:BˆcþÅO”@ÔA¦BhQF¢ìwRëÕc‰g±SB´ö§¤î‡t: BÆÇÇAã8xýõ޼œî…u/Xÿ>´I-ŽB&wF‰´P( “É P(Àó¼v‰÷e¨²¼§âü€Ž ‡^;%„ªž…‡[(à8êõzDÝ€cWMÒ P¾zÜMˆŠ‘Éd@)E*•ŠKªü&ËÚ£µí޲ðvjtö9N·ï/l]/ð0Aöd-©B6¨}A„Ö¶3\ºtiŽR:щ€wB€L&×uA) ˆÑAr92ÆÍfwDCW·‰K—.ͽôÒK©÷ÕÀ¶m£ý¼ê½ªÈd2h4‘—?è`Œ¡Ùl²Ù¬ñ:!d“°U2É›mÛgtFBÈ] NÒ¦š/k™#„!Ê(®R$‘@£þÅvÀ¨÷ÓÀ²¬…Úù8Õ/@0}„(,Ë2šYðq5^ÝhCÂZ¤ÓéÃÔ¢wŠÅ¢M)…e[   oßö¾Úä#„€PJ¢5²Ùì‘F£1ÒùPJY.—C&›¹(O˜&Í/¬’|Ïkïûðá¹<ضººêúžX÷ŸZ<úù“ç !©'ÿò¯»ú‚k«køÅ/~j Œ ^¯“ßüæ7X8»p´›÷ýŸÿýcÓºsüô§?£”¦lËF½^ïæs ^¯£V«uõžû µZ õz½ëåîØ\ÏM_»öŸ¹óçÿnK>!@¡`}Ba;N×íu£Ñ@³ÙÈšÍf»Œº Ûqà3µZ©¾6ap.zyvÒ¢>Ûéz­ÑhàÊ•+} Ù>lÈd28tèP×Ëݱx® ËB ʲtØ6&¡°m»ëÒl6qóæMlok{&<ŠÅ"¾øÅ/v½ÜEžQ2rNÍ Ô*1ÂzB¡Þ\×íê}÷ \×E£Ñè@H)rNÍ 6)FzbÄ@ô`Œ é…  ”‚%À-1ʃÝ~ñäfˆÑÁÝ„ˆ×hPZc°¬î›€’ÑØh )ªçt ’è¢ìöƒˆQ@#è!µô „ ø “üGÑÁ‰{…°q½ì˜˜˜ÀW¾òT*•®‘‚;wîàg?ûÖÖÖºrO„sÜír·m„OµÛ!Ho|ß÷Ñl6{F€t:S§Ná­·ÞÂââbWï===óçÏã·¿ýmÏz4{õ %#hJò úqo{…ˆtõª>Œ«W¯‚1†Gy¤«÷fŒáÚµk(‹¸{÷nWï- šÉÝ.÷V„  žÓø ”tŸÕjµ§ ”bjjª'÷mõ^ ^¯£Z­vŸ„rÀH$ L0Xv÷M@µZE½^ï™ ˜žžîy?ƒçyxÿý÷{rïf³ÙY2 §žÓj 7‹0¬¯¯£^¯÷,xôhW{Q蕨ÕjX__ïz¹óûPÈL”‘úÝï~wó_ÿû¯wõ!F,~ôO?€OŸ:ý˜œ¯é  9ÆJ¥ˆÃ8ÂC ¿žWó#ð}?G(Å¿ÿøÇ°Gýöû®çáöíÛð|?2+BØ”0ßÇ(p»?À‚ØB2(¡ ÚØGð}Ÿ›D½Ë(,+ Ÿp0üX^^ÆÍ›7aÛ6Μ9ƒB!ïeÛ‘¯Nt¡`i€‡+++øõ¯ÿ gÑlºøÉO~‚çž{cc᥇ZrÔè(Y0Ñ‹ #t|ð¾üå¿Áôô¬¬|†ÙÙY|üñÇxüñÇÛ׈HD–£Ó‚ 0"Àðò,xÃòò67·Q­V1>>Òà¼WT/ËšMw- ЋïáGè.üq¼ûî»8~ü8–——ñÑGáÉ'ÿ*ä¿ñ^X‹ôeGÐh4\ð¼îøÍfü1>ûì³Ñw¶mLMMavv6q!Û¶ñôÓOáÆÈårøÚמkM^)ày¾1|­ÑÍÿ‘ `o ß÷Q­VqúôiŒE¾qWSS^/7 :;ˆ¼u#ßt­éœçyØÜÜħŸ~Š|>Ÿ¨‰)µpîÜZezçyž¨|É>@£áÖîŒNõ<sssX\\Ä·¿ým¼óÎ;ØÜÜ4^ß<ýrÖ-I¾O>ŸÇ³Ï>‹_|'NœÀƒÿàÁܾ}…B=öXDkð.ì&’Ü h6¹ àÓ·íÍÈçó¸~ý:ž{¥Úoøýï×_o¿ý6}ôQll˜×’¾wïîÝ»‡……3xðàSüüç?ÇSO=êw]¯5ЄE¾È‰ ^olÂYcÛ{3ËËËxñÅQ­VGå±¾¾Ž .à7Þˆ]PòîÝ»xúé/crr ¥R úÓ'ØØØƒÄ Æqt>ã© ÇÙýr®ëâÖ­[¸~ýúHø»Ä{g7nà‰'ž0t±m®ëayy ++k¨ÕjH¥R!? Ù&€E>;Ö`àƒR©Ý`sswïÞ|ê7ÎA2ç;¨ßM¾ú꫘››‹Dö>÷¹“øå/…©©)ÂUËK”á^d!¾Å`¬ø>]¦Ôß³Ýi6›í9ìLPk'@°`B°21jƒèŒƒ›ÙÄ›Uõ×x3 äõ«ƒ”Ë3xï½k¡w—  –—øžr¯²JI² Ø ÿ‘·g Ó‘“ ¢\žiOg"¯žœ: E'Й€h€¨ê#@t!‘ ”Ë3±¯Iì‚T~²Ș·P¸®‹j57è‰ÌU °R™i­™~Ê¢êèí¾l ‚cÝó„ŽgO^@/|Ù ˜V «Tf´=’:`cc#±[8Ágçéd tuk‹«¢ÕÕˆÆèëëë¨ÕjÙ.QÇøIaœíשþ¤ØKØãçûª)°,³0--Hpüøq­àÔòêÆçbâž››‹É&à…^¨ï{ÿø¾ï#³²²ZÙíŸnlTI­V·\×}rQÙlGŽ¿³™Èå9‰{K€p+ ŽQõÏÑ#G‘Íff© V«³õõuÏ÷ Œé¾ïܰ}ñâÅäÎ øÖ·^8½Û?SñýïOûàby!ØJåxÄþ‡Õ¾Žæ& JÀ´^ Š@õëjRSPç¨ GŸ81‹;w>A*•B:ÅKT påÊ¿ö´'­ç«‡›LÀØØ2™ ¶··±µµ…¹¹¹¶ú× >Ùû†ÌŽ£k>?ÞMK€ ‚RA"ÂÜÜ––>E.—C6›E­Vkû[ýþ£ç0Ù®C‡µ!Œ1ÌÏŸlks³ÏäDM@Ø螃Ÿ“…-£³@P”Âösá "ø‹aû¾ùù“¸uë&òù<ÆÆÆ066Ö&À^lýnÐs¨¡N±"Ʊcǰ½½ ÆfggaÛ–ÖáÛI ˆ.E£+T5KgaÕf¡ÙÂç‚j<¥* fgg‘N§‘Ëå0>>Žl6‹ÅÅE0Æú>v¢ç˜˜˜‹E LMMamm ®ë¢^¯£R9˲ÂWý€èÂ’ñÍ¿dõ/`2æ¬aáö_Ôø0 (*•ãÈf³Ãøø8&&&P.—±±±)¯^£ç¸uëVè¸T*¡R©`bb¢½h²ã8¨TÊ- `jûëÕ?×ô‹Fÿ:kÉ-0áëÕ>'¥ •JŽã ›Í"ŸÏcbbóóó¸sçN¤¼zžàêÕ«¡ãb±ˆ¹¹9¤R)4 T«U‹ELNŠ´ûÕ¯>`rø€C5DÕã°úRc(×xNˆ`lßg˜œ<„b±ˆL&ƒ|>b±ØöÔòê5úÞ Èår˜ŸŸÇúú:¶¶¶ÍfQ*•”õ‡T°Í!_]Øw'H"JTõ¦±ðxww þ áÝß'Nœ@­VC>ŸÇøø8ÆÇÇñá‡î¿V€ؘ˜˜Àô4_¾f}}ét•J¶-VWk´½o|¯¡,Ù1?Xkµs¡*• >ùä“¶#8==b±Ø÷©ôûN€¹¹9”J¥víO¥R8zôXdµñ¤ O¿›K:ÈÏ¡ùa"=z ÷ïßoû¥R ³³³XY‰„ë{Šž·9DO–ØNŸ>Ýn ”Ë2H(hZ¯pØ„¯Åf)ÇÁ{Y–…rùR©²Ù, …ŠÅ"N:)¯^£ïxâ‰'Édà8N{4Ìôôa å^Á«DÏl"ôôôaB`YÇA&“Á™3gúN€ž›Õ³þÁ~€ ¬®®byyËËËøæ7¿©éîU¿[PJÚA¡ §ÅâÞ}÷]\¿~“““(‹Èçó}Æž@…ÚS–ÍæP*•´Í½ýñ.aø(•JÈfs‘qý~ï¾³%/wêy*•™–àÃÞÿ~Cà#ˆw¤¨TfÚå Ê¥ßØ+Hk£à“ 8RàóÑe[[*fffB6r¿Cöqff:"€(Ç4xÙ:àeM”ÿ®‘dÄÍ©ò‡ìä»ßýî%oÀ €9óÏ?ÿü3”Òóû±Ö› ´ÁÜÜܵï|ç;ÿà>pÀ:xZlyå˜ð;ÜŒ2&Q ¨ª‰qyºsyi›-$á B0;;[0†p™¸0 VMãò’®À$¸NÒþF¨´ €ôÌÌLdヂֻ§ÁËB”Ë&â…®K}ðòyD:VóåÔF—í!íôAÅFÀm˜À.—Ë–­w·¶é:UŸT¦ØmjK¢"I…wªêMû5Û­t#ŸÏÿ ¢Î¨ì3È Ê5ü¦ÛP ^ÎP½9Óo|ð¿%muìÌÎ'™Ýù6tN Lrwìjòð¥KÍV*ß_ý/Ý3@“ª×u’ã—'§:r¨µUì7,‚¹»ŽÀèjº)?N3Äb' ù¦q}–ªURl¿ô&€OÁÕQ~¯4 ù:’Äïq5]>6@ÍWÏyà‚_/faëþO”ûm7S0OF¨ ^—&]ßÉ9:áurNÎÓ Ë$8@œ}ŸžýÿzhÈNKæ¥ÆIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/document-save-as.png000066400000000000000000000304371323166163100247200ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœí}y€E½ÿ§ªú˜™ÝÉÙœ›››€"*‚ O}‚/€€Ê¡ `@A ¢OA‘C à“‡‘‡( "‡AI$$ä"Ù{ÏÑGÕïªêkzfgw'!øË7éícº«»ëó­ïUߪvÒNÚI;i'í¤´“vÒNÚI;i'í¤ôÿ ‘FrôQG_êyîY„q†ae2FSϧ”‚ð·ÁÁÌ9îj"›ËR Û0"W˜¦Su<!Ùl®ÆïÁ–þŸºœ»F÷}”räŒê÷* ÕϋܪX(B¨7$‘ |ŸÃç€@ip÷þæÿ`Ûv»ªgäB„5Æã„’Íã;:n¿iþü‹FÍsæÌ¹{þ›óyPB@’µT­\µ·ßy7ÖmÜ€Û’Í@C<~òÕXTì’äo$ý„èó§½ ©²cÄÁKÛ¯|®8ƒu@ÚÚ_ Þ¶s|Î<íshok‡k(C“\Lž4 „Јwu eìÌ[Ç·Œª Û¶ÑÚÖ n„ÝÖ”‹Ã[ ‚#Uáªä‡Šæ\ì$0‘’8Zbì¼p§^àõïvÏ`ð{K³L&‹l6 ˲*ž»ÀÔiÓN5ŒÉçgD÷…(—˱sc0MsȲb­Ò @¥(«Ý*‡*·ê9U  ðÒ²—Ñ{ß½ ¶ sâ$4ð>Ø»ìšà½Ð…§½&~~C47¥“GÍXTÇ,|v!3@)!œs”JEì»ï¾È7çS )’œT6ö¨ ¥ºRŠ©vNðècû;ºo¸Ý ¢õCÙ܉¾W^w]³vCÛ§N€ÑÚZõHä`m‰€JîR·‹´Ê«“ס£f€dë"„ ŸÏÃ4 Báy Ã@±XªÊ@ªz¬Úë}åºØ¥Ð@:Ïå—^Bÿí·ÀjoGç)§`ËÃÃïï‡ÝÙ «³¶m çæ!ò-{êi`M¹Øõºà!©À¾a$€t3}Dc ™lMÍM°,Œ1Ð![/ @2Rå"+‰ªu­%~NZYjE¼üØ{&R©€žŸ]ª¬ðòúõ˜tæ™(­Z…Þ§žÂÀ¿þ…²e`MMÈM­?ý Ÿx(-@ †¸¢BÌ¥ó ‰oÕéÔCIÝ[厞‹žŸÝâ8ß÷Á}[~矕ßþ6 /¿ úÐC°§NEÓìÙh=ì0ø+—cÓó‹1îì/ŒV¶êˆ~îW{.Ñ „=$‰éã›–…¦¦fôöö)®¯-l*ÔœÚycCOƒpx'Äö¸_žƒŽYµ+Á眃û>6ýñwòÉè¾ûn”Ö¬AqÅ W¬À–@Ëûßñ'œ€•_qú9 ù1±»T³ïvܦ$Bâ¼@ ÉBpîÃ);è}ð}OžSƒ[@„¯êr>ÚG’êå‰uO]„ýfÿ^éƒpÖL  ²/ÆÌ)SзûîX÷ðÃáºèyôQ ,^ŒÎsÎAáÆkP>ã<Ф˜²#Õ‰A/m@Q[ªÖAb[ØBxž‡ôöö T*Ã÷ý!¯«pÒtð6Z‚HYô3lX|=Þ‘¹VÎBëaKÛs}ÐòõÏÃøBÂu‘Ý´ »]tQì½¼Þ^¬¾ê*оX·^ÑÓŽÄQ¶É¶³ÀQ]$¹QÀu=‹ à8’4·¦/²¬Tƒk/•Œÿô¼ñÌ*];“ieaÙLüõ{à†|áy?8æûð=¾ç¡tÏ=Ø÷ž{b® ð9ö{Þ!ˆƒK—bíÕWÃY·6TE‘Ê€õÐT½# é² š×È)nÔÞ$CiÖZht?úOó½–üᓘѺ2hõ–•…ieá”%øŽSB_)‹ónÈ£{ÀÀýÅ".v]”81A”Ö_~9ò¦ L˜!^~+/º(¨®ì"Õñª“X.“;„H{!Jê‰ø —1†(Ïß:f6?+ÁWÀ[v®S‚ëá8E¸~ߺÕÂÚÍaæS¥¾T.c@ˆ ÐîZá©§ëê‚ânׂXò‚?n s@# Ô;ç|Ç’©Öy…•>Â¥.†–<òML%ÿkõ–…ç:pø>·qåÿ|-ŒïsÎáy^,—ñùR Ý@Øún06€¶ÓN X_pŽu?»)hùš†BÐ@#`Ç¢ÒýÒÿ¨^êR ÕE>M+=qÞ²…?Ä+aÙ x>÷=ÙêËE¸¾ÿy0‡ûŸ‰gyžÏóàº.Þ(—qB¡€ ”Â÷¼Š:s)Å›–…EwÞ‰=~ûÛàøÖ{ï·ü 7OÙ5]êáIÞKDhØâ{¤"_-k^þ=2oœ Ó’Æžeg`ÚY!Bð=ŽG^‡[þÏmp]7`ß÷áy¶º.ŽĪD†OÖÛ6\DúÜ9˜qÛm§« ÅÕoTª€H‹o¤ÐÞÀFy©b¿  ÃYê)sÓšg0¸ø3hn2?ß²² „À-¥áç:xqî¸ä6"‚‚ D¶fÎÁ ¯ðb´G€Dƒ |G’ÕŒÀéò áùÞ®‘Y{ššY,Ò8%¾5Êûcîwçq êßYÀUçX TJB “Âdt¦Öå–ƒO¸Ì„a˜0L¦iüâ€bÔAí8 õ<0¦ª‡*ªI„deûÖ¡÷éÿ„|IYü2ÚG)C¹<×)§cQÈÓ¾t7^r=zêxàæyYXÌ•ÏV|¯ù Œ»3@ƒi0˜Œ1Fi ú ­«FÙD;ŠíéF¹õÜÙ-÷bÍ#ŸDgsW ÷M; fXÊÝ+Áå6øøpö×ïÇÖÞxÇÖûQË_{´ÞoË·]œEs&¾Q >²3Ð=îj„â¾ìÈQ½·µ+øofÆlžòbÃŒò îcÅÃ'ajn™r÷$ø¦)}}Ù»çÁœ6ß¼ú1¼²²¯¢Œ$èQf¤¯ó¼,&¶iðe“i Ÿ1b¶£kìµà,Cå!€Ð0xç4#l%°CHˆh(HUFZ±B Ë\þèù˜j>K粬làç»å"¬éçá¦_½ˆ¿>±¶âú¡ô>!À•gg±çÔø¦\kð™‘ÛíWÃ7¦€A»¼‘×2"+m¡ÊýF‚v(#ˆGÿª½X½¯»êÙkÐéý\êüH߾떋ߚvþôØfü|Áó××£÷/ü´ï—ŸÄÀ7 [/EÙÚ‘‰h$Ù¥^,Œ"TÆü«m–v „6#Çø(Ê]ÿò¯1±ï;ªÕg‚.^ßsðÍÎÓðÜk ß¾æ¡Êç©ÃßÿôN>Ò 2RÁg›òç£ß:$û„Ð@ôË.iÙ!}ß ñ¤“Œ†‚b6ŠD é‹m~ãQ´½9–‰¹{œs8N ŽS‚1þx¬í޳æÝ˜ZÆP¢ÿCï"¸è3ˆo(ð) ÁïÉnû¿ÀH¼ÕCå…PÌ ³~bu’4ÕŸF €§3(ÅÒM5š†àÀÖWa¼òdšh,£@ЭKÚÇ uN=ýj¤: ü}gWŸc‚R‚o„àë€OÁ>ëí¹` j ޷滊Šþ€ÐCÕc#A;–¨•jøG¥D”œâf”þõ)ŒË•cî!4èÝMûcÃég^ƒÞ~§¢è¡:y&´7]hÃ6ý8ø‹€_6÷ÂJë[ „Erˆlí ÐùH•á^¤DCu¿*qÇa€ÊH`ýqß+bË“ÇcrvmßO ààÖLXÓ¾„sçýËߨZYÖz¿9 ÜúZšœør&´(ø¾Ù‰åÖ÷!h&û‘üC©hp¼¶è—o™ìù·3Ó|Ýz@Á}løÇç1-³8t÷¬ LÓ’=å|ÒŠì®ßÆ•?Y€Ç¾žZN2Ø]Løé…9LŸŸÉø¾_˜­Xf\—¶Á ‘4TBB'W3‚ŒÀ£¢=ÜDb³¢žÚ¡BÁñáÊçßÔ[¨y]ÿóßÀæ_¥Ø àP¾¾äf_‰_ýæÜuïÂÔ2Ò‚=z!¸ü, ûíR!,ÚòSàSÃÄÓ¥‹ÐGÚÁX Œ0 Æ|0Ó¡^惙>5ä¬)UÂÜÑšhoÎTxH 3w#0Å÷\u¼êÉ ¯ÍÇlãÎÀ×OÀ‘ÛûF<¹p®¸î©e ¥÷¿z‚ÿx¯ìÚ5¨ŒðI±/õ¿É˜Añ\éllöwW}ú ðUÈ–è0—Œó¼¤**w1ÂAþÄ¿“X§Qa݃ØË¿V¦úŽìîW`åzgÏ»½Ê=E…®nÏ9”âÔʮݸÎÁ7 ‚—JŸÆç`LÆ÷ U¾>¥rº;¢Ö”P€V¤¼Åž+ñŒòØ nˆE’R„H± 47-žƒçÀ¶Íª8¬¢ÇŠãO» ê#&[|T°7ÁŸJAi¨ó£Ö¾©DÿJç¼\ú$Ž2ˆLƒS¥jú¼ú"½!1½Œm=€è»h#°­9;·Ô·ã7Ÿ++d-GîÊ2ÌkL>|Ì8~Îá¸é*¤–¿¿Ûàú¯X0 _&s°ø‘.ÞÍâ=xÍ;-Y †!õ:3 0f€LÚ¦ Ã`0 Ì”¿ÅÞ=ù#i^‚>ôœ†K;¨C›ºÙh0Xèí»Å-0—ˆ1ÙÀâ7­Ð×wÊEöšö%|æ¤3еe õVµôþøVùóläìø,ÞÅ[ ³ð|é|0ÃT`S™öŘA•ÑÇTÏ LúhRÄÚJ,¨OÓT;„˜orÅ#/N¸ï ´ø³˜’YËÎé\ŒpJ|4í‡æÙWã‚ó¿„–­K½U­NžœÍqó<ãòž/*öCð]Úg¿ŸfÀTH—èþýXÈWë~©ÿAâ1ÿj™>•æHØñhàHi›L3RªÆc¥è_|¦ÛKRp8N¾9-û݆k¯ùîø…ª÷©Öú9÷píy6fMôÀ &ûó5ø,_°&<Ù!Š¢Xæ@ò%  „‚P"[½2c¿‹¿–T ‘Öß8°cþXX¸Ý»ô2Ì$¿…i7¥àðC~¿_àÞ»oÁü_ü½ê]jéýï|ÞÂûöôÀ ?ÚËG@ Oö~}|ºTM‘n,´ f˜ Œšhù±U¢*R"ƒ*¦ÎnˆØ Ð0ø+Ü@¹×·üÌôo€¥rùL5r×uJAFOþÝ·á™§Å7/[Põºå§{¾pÃ1‡ú |Ÿà3ƒâÙ¾/`“»7˜†xc"”PJAee’!"Vî°Å¾D$f¤ëjÇ0ä&½þµÁŒÂ·b~~Ô×wË%äö™•otáôs¯«Z|-½ÿ±÷ œ3GD\»Ê–Ï ‚¥ýs°ªô~0F ;t´Þ—!_PïS5ø3§˜ò)Z Ý„v,£çŒ^@4Âmˆr¿.` kftÏ…mZ8t:—½Û%pÇâ¸SÏ©YÕ‚=ûïæáÒ/°LÀ4¨JæÐà‡¡ÞÕű´ÿ?¡=8&ñ¨Ö¨ >ʘt #4ú†ùi¿UH„„ iˆhH$°9º(gp=&n8–‰ª8Œ©gAä?€ãýÊNõpqµ`OçX×}ÅDÖÊÝ«ß06•÷Ä[?'[3‘­ŸÁ-þ@Š~f˜`¦)E?¯î©ùò@ÒÔ›ñ|ðVg5Ê]ùú*4·ƒïô£éµ“·»¥»—2€ƒu|ö”3pò©§a݆þªeV³øóYó¿ncL“Wü~o îš A-Ä—‹PF Ôù Ì4Á MIhIùõÖ¡ByÀêUoì@6@#ˆ×]y)(á8þ€à½{«à@óþÈíñ}\øÕs±héúªEVÓû&óqÝy¥``T€ªø>¥c@w¿‰ónÎckßm*¾¯ô»Né¢DºzŠtàG~m¤ƒØ†Gtˆ؇¢F¬Z¹'}hÞk êߘ‚üìëñ£«¾ƒûÿöbÍ2«ùúWœåã»’˜Î—¨¸?ãRÌýQ¯®Ûäýé~}$ö  €ß^à†ŽööQÖÿ¢:;;ñ¾™/âøöWÀáò òûÝ„{} n½ë‰šåU³ø¿~¢ÃÞ‚o²_góL‚yåÿMC¯—ÇĉÑŸÒú©î”ýÛ |M£­ûÆ$„4@ÌêXƒÏ|`El¼¾eeeŸ~¹×qÑôÎ[ðÔ?Æ_õûšeUÓûŸþˆ‡GMð FpÃï'á©—šeÖ–*S‡w‚^>¡'¬R=|D9iNÚÛÖ´#ãó›ðå-†m‡~¾À¡çãÍîy –¯X³¾ö‹šeUÓûÏöpÁ WOƒoÄÁ¿ûñüîéVè)d ˜eRíkÃZì3) ÞfÐØAc2}¸ð ‘ÉØñ¾«Ü½¬™_æ^'žyEÅí$¥¿çT?<°í|ƒ…? þß—´àæûÇ‘­­*Ò'RBÀtëW÷ߎ$ÞÊ©b3FçüiŒi6*p(ð '¢@vÇ §ÿ bÈv’ÒB¼Û\\ž@sŽÔéªf\q÷DcûÐ ŸàC%vh«{ZüÛŠÞ`Pgö4&ޱ©Z€ÈŽ–mGà g|¿bÈv’Òô~sÆÅ_á×Vü®Þ ¾ýËIp=݋Ș=­"#z”ÏOT`èíÙö%q¼*€@à¸÷>‡=§VÀÁíÝ™|2¾zñO°leõ@êý(@¸¸öK³:ÃáÙià”L\pódô °`À‘4ð"*ºO¥u©œ@JÞ¾¢? ·Âößð†Q ¾ÇæÝ: k6™ s_DT€<¦ö)Ué^oW£/¶«x÷Œå˜sàÚØx}Ó´ø%x>Af÷yøßÂÿÞ·lÈòÒŒ¾¹G»8ê`Q|ʾsǼø†j¨[?‰´~AË7ô­ßî-_Ñv5w¿§}äU™Ì‘6€Ã)žù5<ôȳøá-ÏY^šÞŸsˆƒ3Žª ¾aP\{ïX<±´ Qc/6Œ+rL‚Ï`¨îÝ·»Ñ—¤í’8±e3Îýø™Ã¯À—žp‡9õl,]¶ó®|dÈòÒüýƒg;øÆI ðUN_üûžƒ{ËGçeÐ>Â6è,ʤÅOTßþ¶šªå­ í2[x³=ˆ >ñ²Y;>€Ã pãæ`Ý&޳¾ñÇÔ!ÛɇN‚¿Ë$W~‘ö’à³p’&ƒâÉ—špÕ¯Û3ðH°Ó?U-¿¾_¿ý¨!£ƒkµÛppáQ Ñ:†© Ob‡Sò Ç™„SÏ_€¢3ôã$ÁoÏ»¸öË~àëGS¹e¸WÆþ_^cãâŸdÈÖO §§cÊß&tþ;Ñ6ʨ/þ,&wøÁÀÍøŽ¸5®ýn|Ð3h Yf|Ûpqý¹.:Ç!|€ÿæV çß8%‡F»óc‰œ1½Ï( •Ùóï¦óc´­Ü@Z„Ù3ŠjôNåÍ`mGâËÝ‹u[†Ÿs3ü<\}¶‹=§#nð1 f °lá’{#Û’EóXCÜ  Ô3êmC¥sÙ–…l.‡l6Ë´ÀÓz¢br’@(è}èiܹüMãá×? Öœûð}|<ÂO¬õûú‘íè1Ù½=ºYÔ·Y_ÀGß¹ܧ;2^?>€Ãó8ŒÎcðÝkÀóˇ~‰ÊAœ¾sJͱ–Ï(3ô<}BP|ýæV<·lk¤7œ£'öAJU‘LÛúoÝúÆH€$í?}æøflz¶èÇ)œøÜòËÇqÿ“źÊL{Îü„‹£JL+±™¨ÉT:þôÊbÞ½’â\÷Û'צi¶mäóy´µµ!ŸÏÃ4Í¡¬ å¥HJg¢ ÞÄÕ?¼ë×§»b6‡àJ’pß™lí­m5§Òò9áD‡(ÍèØˆ3Ž|U}f5:€£¸{ÆØã}·Þ×[WùI½ä{œy”×ùðµË÷èÊCðR×lˆµäpïpÍC&“Ass3²Ù,(¥R4p€$j¨A¢)Ëô3ðõ‹æIµ@ LË Ã4+÷µ7¢ŒÒr©ŒîÞžXýdi˜0nL¾zôd2üèÙ·Oòà©Å›pùí!ÄÐâ5éï¿kß;Ý—®%Rì§€ÿÔë{âç÷c=±–ž\ CÎÒÝÔÔ0B¹\Þn¢̘1ð=ŒX0Yü{D±mJÁñÂM Îá9î[?A„ùLóæ,BsΪ2€£‘Ù ¯®!øÆu«áó¡ORïOïàÚs}Øf8h#–Ñ£æáyÃ4Ü÷üAAž^4W/™ÃǃmÛhjjBss3,ËÚîzŸ’ð9«ÕN À´1IÕ¼Co5جŒysþ…±cXå¾G[±e°ç_µ¼._ˆ‹þöf?ýª‡19Q|ƒ`c;îZx(Âü½(#D‚1˲ðmÛ•> éTomˆêcÁ*È> NJ‰LŽI§þŒŽîþ.¬ÖÖÅèìÁm3:€£\„ëSŒ]qÞ–¡{ 3t¡ˆƒoP7|ÅÅÄ6^ü¾Rnyüp8¾ ƆnýZôçóyd2éîmg’ó!DÆèýð„p;’šN@)0âûcn ÈÒY¸m\k–ݤ2z2 ‘®[†Ÿ}7.üÁKXÕÕTW¹Q__p—Ÿé`÷)\†s«€_ö,Ìô#è)ä ÝößVàçr9äóy455_êØ5Àjùñv?9*dÔóðÑÌðì-¸|j‹õY=/ŸÀa ¬Ó¸o]· KVµÔU¦"Æ~ª€¿K‚oš46!³Ÿ †Ÿ?ñAlèkZ~-o²Ùl üm­÷““9èm_@2d:øêH.à£QN¶\ÊIDATØxìÌ2Þ¼(Ú­à“3rk&®¹ý5<þbGÝåFEÿI‡qÂG|ÕâÓÁ'„à'Ø¿}l-(]/GîDröƒmøª¢µËgYö}Ç;pØa‡¤ †¤j G÷£ mal¢,™ˆýWŽH~ ¾pû7ØÉ³:É ºK×´ÃÉô‡8‹»ÿ¼÷=3®îr£ÁžÃ÷/âËǸ5[>¥Yº7~º@~èa¨ï{žOMõn(_úùÅ‹ÊCžÆD«Ÿ4hàB@f©5ó”(d>mFòpàÁùŸjé°ºÞ¶=š:€£\„ËM<þ\/æ?ÐQ÷³EÅþ;f–qÉç]˜F|¿O€¿ðõéøÃâw@`­¬¯*eG>zÑî÷k'›ÖCÃ=iHÀ#F ~s˜bŠà=F7{à°ÀRÙþDoëg[fÙw«<þøÇóðÂëWÜÝ>dwðb›ƒ«¾XFÆB~лGfH±¾lý8ÜùÔ DNÒ#‚‘LÞ€d¦/¡T„_à’éþ#«¾Ñ€=&?>¡ÒNUÓ1AР„ú|n`3¨Çß®“D1j;y¯cеöÌÊoŒ àpœÖtepÉ/[c_ÙŠÂ4n×}¹€Žoùð%X×Ý‚ù?>g`LØ ^I­IÐÅO0Êà\À~0Aópê®Q §Ù1]JP…*‚ Ýæ%”s‡CÃ2ïþѧ²MËåš°.÷EŒ¸ÍlìÛwŠØÒgâ[·Á¦Þú;Q¢¾þ5s ˜1±|=/£݃Y\ÿà!({¡¯¶û0™3?Lã†ð"]³õV^àzE3€N4Õ€V½NŒ€íËY–ýhë„™èœ2 «×}îÆ_¡ a“|÷š±ª«¾@ê}Á=\zú öÛ•c÷¢‰œz>~Çc¸ñ¡Ñ=˜ <©ß•Ñ”.5x“R9k'£ð¹Î‚¾úðÊŠJÑëÑ\Ï9œó˜ ;/2¯L¬ ­¾焆 ”Ó2nù†Ž±-ð[?‡Â౸ïO¿Çó+×}ã¨Þ?ÿØ|ä]¾¿"‹WfõpA0ÿoïÅê-íá„Ì+_ÖZ”Ȭž “%Y‘M€F:Ü}ß÷µ"/ñÊŠˆ¾ÄH¨^ ðÏùgšýÙ–O2; ß-À÷Kà^ ¾W‚É<|ü£Æ3K6U3IüO¾¿€?âÖî|b<¿z«ŒíG¡Ô€œ QNÛª»ve¥s%‚6ùmû€Ý× jD@ ¯¡ñš8$T· Øà?2qÆ;óô"¸/Áç^ ¾_‚à%œxô~X±ª …’[³, þA{qÑgÊC‚ÿ¿ŒÃ£Ëw©å“£ydÙ!ø S~›·Oh)-Jã °=@OÚBwéàëý`BÙ¸ÚÖ)  ¾„“;¾W”‹[ ¶¹ZÏššÇ'Û4gUÉZïïÞYÄÎ(Â6é׫ÿ·¸åÏjÆö…®¨äªúÿi˜Í. l%A®Ýp–ä5õìW?&*B@¨}}œ¶K¨‚÷Å2¤øîw¿K³¹-ǘ¶QR H©ðÑC;Ñßß??¾BÄ3qtrÇÄ6?>gùœ_çâÅÁ_ôÅ7š˜6½2ÊSJéË–OÕ”ìrž^mH ˆ ¥ñˆ?-Ôs5²UGšÈ¾qïâ '~¾~VHæÐÿF¡ê2ßÛºòæ±»wøZü{%¥Š!(•@…ƒ9GLBÎòðÇǺbó÷yž‡œUƵsû0¾µ6ø«6|þr žøœ§öç ”»Gä\=crö¬˜¡„Àj[Wx-`¨ýÑ^£¿Bï- |@‚¤èþQ0ê‘>åsrmã"â¾È}ÂK8â fL›àãõ`ù¾ïƒKNíǬNÔKÁI—ZØÒ§pQµõË–sõÁÔiÑ–¡+ž+5 õ?Dœ¶èÕöu‹†Ht ¥Iˆ` õà"儆”B€<0?sœ•ͺ^~¡ H¨Å ³&sÌ=ÆÂò5ÀÝùø¯ƒzpè;Eø¡Åð‹eàÔËL¬Ú£ŸÞ¥«S·)¥0˜ ÞŒV\´Bãú¨Çl$èÑ}Î9DÄ.ˆ>o° dÎy¬ÿ`$4¤ pÿ '¿;?nìmñµÀOìSâa¯™Y|ç¬v Ð ÃgæL‚ïs`î5&½Ý‚ŠäÙ¶ ˲`š&,ËB.—C&“mÛ°-+Hò¬:t[W<êC’ "}òؾ. 2" Óx@HX÷Ã(¦¨…Q1†`_9¹–Öú[¾Úç¾ü,+3² ,fdÐ[Ú”¾ƒ‘ ðàûÿÃðà³4˜ƒO·ø\SÆl6‹l6 ˲ð5ShõPíc“ÚÈ '¤JY×5kÃ9W’]»‚q„âª@¿Kt=Z7°&0ƒkå25Áç¾Z¼2„ï@_¯Ë€2”Ù`FíãZñ¯•=8tïuàßq?Á­´`šLùûaêvGGfΜ ˲`Ûv öµZІT¬:µ"ÝO?áj¥Ç€íç hé#Dت£L$¶…b® B‘8g¸$x ðÇŸ¼W¦)¿‡.¸_÷ÊAKç~Üw"kœ»‚ƒB-PfI0l%²ð[ÄÂןÃÁ{¬Fé¯ ®¸«MYºžxYI€Ö–ttt€G+ƒsŽR©¨êLDê.Ü– x®º|"¬¼€¶qËO»FF¹´ì«DöâL7`ÕÁº¯ Qƒ8Å1Ù|^ïG€Ï]pß…B Å&(³ÀøÔÒ ŸÉ@àH<²j+ÄÀbØ|5¾yÛXd²,û±?!Áø| x²2‹år¨ãÕKE×Ñ O÷#4BZH c:>¡ÏIÛÖ6€¿—jz=%~bg“¥D½=\„ïBpiÄPàÓü@ü3[1@Œe°uKkß(àéç›±dE'L#}’e¡*§V+õ=? ˆ¨Öý=<úúp»l+Уû²7TN=º/ ¤›`î‘’¨&¾ÿÕÏxßÓ}û´LêŤ´xÁîBBøJä€ße&(Õ¢_-ÔFOkÞxO,zKWöÃçÒÍ#4ìß®öµZ©ÔÕÖâ2"¢ÇÄÐq€Fƒž”>2BYùµô4`õ!®û2ô{ªÝ¥¯ ܼ`)>?g:&c¸çÜSî— ÄPßÅ3@©¡@—°Pèó±òõµøû¢XöFÿ°9¶šèŽWh%°iÇ´øŒ2E#l€¡ö«£T~CX$T@€N¢P¥Ì‘RU°¡»x˜ëº(=Üt×2œ~ìLÀ „2Z d>žZ(e Äe&³X(ö ¼¸l=[Ô…•o¦Á³¼:BpôÑGáÿøGX_ ±t©ßæpøá‡7¬/ ¹_Ï19©¥@à &ß=)t°(z| €4péùÇÎ~tIw‹‹_,z¸áÎ×pÖ§¦`Æd5“Gô‹Y„IýOMn¢Ø<÷›x|qÞÜZßøÿÚÏÈkŠé“O9gžuVäü¸^LÛ×ëžžlÙ²e›‚^m?XsP‚{÷*¶@ÊûŒ„RÇtm-]ä8nlòåBÁÅÕ·/ÃŽ›†wî1Fðsè¾g Ô/œ=¿¡ûámœÐÝïŒø¡’T,¤Šiýâ]]]Û mz”„{(ëî¥C„D*ô”>æºnÅìÛ®ëâÇw¼‚“Žž#î¡^™¡8(ú7u Üqëïÿù›g_Ø`î2cæU¦a¼kÄO•|ÈG놻ßhÐcï&”!ÈiÝ@e£¾{ UVŒ.8ýãÓŸziëØj àyæÿê%<³¨ Ÿ>r¯ÍMëêÛ³ø×~zÐ  ýÕ˯ÛeúÌoضµûˆŸ,BÁ¬ÿ& GIž¿~ÈkÖáhI(z—ÊN ð$ŒÉžïò»¯½ãç/Y±q@@*Óu]¾|Õë÷Κ>ã”l&3yäOÒ[e©gÿíF:îc€[ŠÝîh± Ó'´ß´j ¹øoO¿è`LÈaj€¯Ïóœ«V>9sÚ´ÃrÙ\ÛhT‹I½ÝHwÐC>ÉÝÙsضr¹2À…'9þ¡%oNÒ ëõ”ñM[&Ë^öÛ¿>ÿ㥯×ëáxt€ `@¿ïû+W¯^2sÚ´ýrÙ\Õñá±Oyß÷á8NpÕMæ&Ï n5¨Õ®i4e3õ¥ÐDF™ j†—(zØR,}½XrTx’cÖäæUZ³_[ðÀ?ïÑ÷,¡0!%‰f @€õ¾ï‹•«Wo™1uÚ!Û?’‡ÄŠ+**¿šîM1:Ž>mVvòú(¥…­‡:§Ú£ýøãpɲ,!à8@°Z?ùø‡ß³råúÞé3'6/ÉeñÕ{þ¼h!$ÐÑ%Êx€   @3€1ÚÔ:cFÓÔÉÇY¦9”M € ”Jɘ1cXS¾™@}Ì "U©Þ"Q˜þ-1žAJŸ”iY"©æ©I* J«_D¶#A+`ÓÆ n¦Œ6‚ª>¥TpÎ}Îy ÖRJ¿IÐ)S`¸ïww÷^úð“/®‡U·r |”ô²Èy$hfȨcV¤¼$»óÈš3ƸmÛdÒ¤IöÔ©SÇL™2¥¥­­­9›ÍZ¦iŒ1Ê£”R¦×j‡*bŒ1J¡Œ1F¡„ýîB(B)%4Ìe—#ËTe É->!|ι „pBˆÏ9O®=õ»'„ð# Bxœs_Á=Ïó]×åŽãøÎÖ­[ûÖ¬YÓýꫯv/]º´/ $OŦiͪè"€~ ¶ØÚµ0îY»ð ÈÖÛŽP¬G[~´à$EÏãêfBݸ„8ó$êîû>BBˆmF‰1V¢”0ÆL…8¡”2Ã0†„1ƈf u€F˜€B˜êf¦úú@„ǀè–*côBoûx¤yjP9¥TB<.»ò|>çÜ'„Å0>¥ÔW­Žð]×åžçñr¹ì3Æ\ß÷û·nÝÚ›Íf{8Éú©5Î~(¦ÐexjÑvZ @ k.ñÕ z •¢?ía¢¿yˆ3NTФ=xŒYï…BÁèëë³2™L·Â* ,“É•&¦‘#†aÃ0!„†Aä  ¢IeÛê:0•ޤ&Š¢” ¨1 CD‰µd „pÅ$\o+é ûBÁ9çŒ1Ÿs.8çÜu]¡‰pß÷=ß÷˔ҢïûLÔÀŠjQ´Ž£^š£pr£ài]®:.ͨ¶$ÏM“ iUQÑ%¿''ÚDßÓÖ8w8ç§µÖh£"UÎ-èmŽ—½V‹N‚Ÿ¶$_,í%†z©j¢-­â‡»=xÛj]ï¹Û•FÊ]É2j-HÙNÞ»ÚsŒTÿ¥ý6Æê÷z˜i'í¤—þÍ·ÆZDKÄIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/download.png000066400000000000000000000257771323166163100233670ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<+|IDATxÚì} ”]U™îw†;ß[ó˜J¥2‚Q   Úècn»í~¾‡m+¯—ááB í{ mÓ¶í³» vZ„nDÀæ& $1„ ™*•šÇ{îÛß©û¯œñÞªäÖàZõ‡Í>Ó=gïýÏÿþ÷.-—Ëá >}ß'n*+‹_›HDΠc’ah({ ½½ïiMÃW~vÓÚnü‰?0ø«GÿdÁâÓg|·?žŠV6ÔA3th˜\è<Ö±°¾çøÂîc]­îœ&€q„xÂü¯‡ÚÚ£üæä"Y˜q 0`ƒÆ¢i<9”K'9–œûOy‘µÕ¯Ê°jÉœ6·ñºig8x¬+ÞÓ7ÓÔ ÁD4 hæ$ŠÿÀÒã=}8ÜÞ]ÅkÓ0Žp´½ƒC0#tMƒaZ“Jˆê$¶ÉnÛ4Œ3´ïŰ•E4¢SÞÃ4sK^ü7×Ô‚² ×x4ze@/‡'Žtv w ZDCNÓ ³mÓ0þÐh9˜QºNœ° uáÂÓ—ÙH× îÛµ–?W?&†œëÿ9êz»Î¹êçvlÆ;GAÀˆè#04„þ>kšÆ:zlý_×Ë÷ ë ›³ çˆt¢KsÿS×Áÿ¤€ù€4=Ã1jºM@gï0º:û§ `¼¡`Ñœ3¢“¡‘3UÐ˲lŽ„ëš žWÀcÑ #•—ÿóȇùRk:ÀcŠ!ðÛ6MÄ]$OYSGΰ@ ²)4hy) !g×ĦCØÄìòÁ…|„€ Û¡ñÃÐ ûÚ4Lpà5›€œñ+—%zýâßfSŒÔZˆA(¼ï@>-`¤æ[ QNÐaèÓ0a qà*Àr%€SôÛDÂÚ¡ûÅNäÛuA€Æ¨6¬OK€ÉR–ª-…QVÎòH¨"D9SçÁ^ù!† =Æ Ì!:UÀ´˜$@×@GÖÊBîwÖ; Ð ô¹€A:„ éLÝ€€Èj0¦%À„€ÄûF K,z‘Aº_žÉɳÎ7Šáç’ž€Éo숤¡Û MÀÄI1³º K³„hx¸_¬~!Q ãb ºÔ¯RÊDtÓàw¨¦%À„º6¢ 9 ëà}/°*©" <ú_Tƒ®»%@D×Õ{§UÀÄSØ‘?ƒî™Üa È¥û >"p̓Å?<±šBº—0mN(PDó6€eÂr`0+6€GìûÃÀ¢ M^ÐJ,ë¯_J¤Û`Y€]3ŒäCÁœâ¾™À‚óæÈy^ÏË÷D g)¨ŠJÚßœ‚©Má×y)¥}†¦ 83BY˜•¸…£S¢û}I¢vÀåX`[ìp°aG©KlïäòÅbM˜ªÀëùwFóÅ,5–£pIÆÜùÞD‚Tù ñïÉ4<`˜`жx¯¬Bé@?`€µãl)‰À,1çó}IÊ$ò×ô’ÀP®2bšJ ƒ¸¶ ÀQ¬‚‚4” @è~QºØ"Iü¦Ž¨i²¯ Kˆ|–A]Žè¤ç ;%€ˆ?"¾ ÀŒŒêêj$“I^WÄÝ;v¼÷ÔSO­öÙgw’‰øh^ ôHøb*J3/öËTÖÖÖ6^sÍ5ŒÅbˆF£vg_}õUìÙ³ÇF|KK Î=÷\$ ðY%-d€<˜Ã†®ÍˆŒàXW–ïRºfÑ ”Ô/_&°}Èî…ÂÁ.@Ü@·èÏ*äéHÆâH¥R$‡x{÷îŦM›pðàATVVbùòåX¸p!È(ê]«É«€TÞ®Ò§² F`Œ¥±±±‚ƒÀxy__†‡‡±nÝ:ù—\r ”˜ãuû¾€úp‚Xß.H%âHDcö g³œŸ7 ::²´Äê©á8wÒjxJ¨?,È7Ðô€NˆGÑÓÓ#φÖP\ŽE‹aΜ9Ø¿?êëëIö)Õ™$Òe<ö”6¥@SÀJ@J]]]Ò)þÈéwÜqvïÞùóçcÕªUèìì”$Ž|ž½ß‹:zô(U†ÜnZzj ã»êš“#e]€€tMÎ=í†F•âËÈÛ†f"O°D ûS”fÏž{î¹Çîß‚ lF8v옌 €¢ÑpŽéT–B†”šš!¥/ÙA[÷wttp°$º'ÆÁã¸$@UUÏ•ž¬Be{†mÁÔŒ6 ¥¾“ƒå„àåÿ\XÈšä!8ÜNA&톇S±(^{í5›ˆUßí~ÆãñPƒ€µb9rDÆCž!ÄùY!ÖSQhjÕ•aC ös"ò Å Khȶ«¯åÔ³ZþƒºÁéYù9”Hüú »kNí ù®i'(Ü0ù=·Áª‰X ©4dŠø½÷Þ³mž¥K— B ‚k  Ê6ˆ···; @›ª {(USO°SD4;ææÑ68tèÄK{"J%’ÔPU–QÇyŽÔ…#O¤ŒKއ1û9°~l˥ؠg ™ÿ{uj_O%bh¨­Æéu«ðÒK/ñ¥]:”••yUKÐ5Wÿ 3fÌH*0e\§ª ЂD €ÈïêÁÆý¯£Ïêƒúúû”t„†JæöÝÉÚ‰º¹¹ -µ3¡ÉcŽU9:òÇÿª’ƒ\ˆ¾×|¶L`Ç\û#ß“ï³Te*Q‘Nà©M¿E›Þ‘/‡wE2‘€œ³r* Ú‹jbFº‘FaòÍ7ßtIÖ)/XD  ‘Æ~|~õŸaï‘VÛO— u(ÇŽš×sá†,ì=ºº‘çtW,XÓ(”åÚÂÂ3ÀK~„ûÕp%¿Ï.  œÔÑXŽÆUzPš¹«?l#kMÏ×ržÏ-œQY‡öžVl߾ʕNzK ©$toC•/ÏVô OáúŸÞ€ýGbhÐâ ãè#õ0 ©,d†š (_³·k¬©Yó¢E¤qx$€pŸ Žö¹@‚F…$ù×I&`¨òØÆgð«×ž!b ¢†];>—?ŽFu&¶²puÑHmŽÔéT_üðçPÓT ÒNïjª.]U^^ž°´¬ûy8z‹šêð©5ËDÌ;á"Y %ݹš‡ÜE©àšø±ïú&zÂÅ€»Eç6ï¼ñV%ëÏ»Zñ‹u›ñ»ß¯Çš…‚†tsA`ªJ¥Ï£Ê2s1lÚ¿ åérlØÑŠžÞ!üÙågÃ4JÓ‡œcYˆ¥QÓ(&t½FÔ…$…j>71L¸U€’Á ›öâ‘§¶(±_†Ö®Ãè92@8ˆ´R…ƒõñ2Uì?Eƒ)ªGqMËuÈZ:™86nßûÙ‹èB®Äÿºz¡¸‚¬óÇRÀs)žûîkš]Ãwǃ½Èÿ'žß‰üåFÄ’Qä"Àʪ÷ጊe ÇJúx*¤›$°Ì)Ÿ/-ÿKÄÌ8bå6ï:Œoýð9åÓÀ*á¿]ÇZO Lw1¼x<†"D 9a÷ñC 8—´Ýüf+ü·Mˆ—@ÌÂÍþ8.kù8»LCZl€ XÀ”‘ÞFÒ}‘9ֳʛqûù_Guºé:{ZÛqçëp¼»ÿ”¹‡ñÿíGöÛEs ßÇÉ,Z¡N¶ kŸÞ²z±Œ†–ý9.óa‰{pR(áe®)eh ‚AœðNõÎÈ4â® þn{þ[€vï겉à«×¯F5ûé€mðnG«tÝ{õJH÷`?†òaTC"|Ds†Å«æ7 t¶áçÛ^By,ÁÙHg¬Àå½HßS‘V6-°£–tuü¯o`ý†} ùRé(þzåq^ã9¼-"ÆG"ª˜*ªèRS]èÊ}I%zÔ$«ñí5ßD}´™:Ǻûp×Ö£õh§K,ίj@Ì4Ñ¡tnç€*®ºÇ¾ÞaŸ÷qÈÁõ>RÀðéx~Ex}l‡£-ª]޶²ôg‡pzý,[Hß³Ãxàçÿ‰—7ïGY­L:Žo¼ï«8¿i%‚ÆŒöï(Ú³ünв^“öÖåñ2|2õQÔë5HUëèÀ½ÿô"öìñh?{îÌ…¨J¦ p<ˆ*là…ëüBφšWEØõ‰s®~_ó"¤¢1H¿††ñƒG^UvÐA$*u”¥Ó¸óƒ·ã¬ÆåÎqr•¦¦¦$ÇvªJ%€D3gâc±áì†åˆgt¥S‡pß¿¼ŒÝ­mÈi‹ìY9sÒ±dPµ@„{ 7 ±B0ﺣÉh‹êyßnG[û ìÇ[ouâÍ­Çpõ’ãÏϼñXâöIñëŠL p6L’A t¦èuá.˜`¶ðêE«ðÀ5÷"ÛÅsÏ@WÇ0Z[‡¸4ŒObvu *SÉ‘ 7š§yãù8qOŠïœDND±ˆ‰Jì›ùl¤Žã9´ËaÓ–ÃØúæQ|yÍçqÕiWо òëÇL’,Fö”þl`¯Xãú·_|[·nåâÇ‚ ÏwwwSMÐFPzv~x­ò “xü·»ÐÕi¡ýˆa¥A&/ à‰ ú‹B,rMVÍ«­GÄÔaÁB_§‰þ.Ï¿º[·Æ­—|מõG\#HiÆBB(ŠtzCL'ß²e ûíU¾pðT‘ZH8átg(Ú_yå›^ýu® ”{Р؃áØÿgVeþáÓßEJ«Â£OlAg{ƒí)ä¬ßR[ƒd4»Ç¨'ƒ´€ù¹g0¹E}ƒ€œî ¬^E¿Ûm»Žà[—Wœaç2•‹H#°ÿ\ÆýD8ÏñáâY® &Ñx愌óT–¦#NÇœ%Ò~øa"Ó^6µaÃûº8X\1Kï@“ø¼oiucY~ôé{QmÀOÖ¾Šö¶a]5€eØk©®FÀ¶J!ÒèÚÚýz÷Ýwm"ð‚,ŒyðÁ©îôÁúõëyÍI0Þp0‹^Šù³Ô@Y«)…8»]âÇžþù6E«,a¬^½š+hI)p€, ã=.'òCwðªLVàOõè7ð·¬Çç?õ~ÌšQƒ¡ô†…fÅ}û޵q^Áïþ®ð¥b ªí\ûÇ6D{«1Ømª‰«pðH/î¿ê.,ŸyZ T£àš?îÀþq<8"-n½õVlÛ¶ ]t‘-ýÉûä™ÄxÌ襞 »âsôñ/¿ür\xá…D¬}îR¿,£b˜XÀÉQN(‹§ñƒkÿ·šJ]‚û~oï=†hw=´l¦©£©ª’Fš{N¿ø¼¿¿p6®,ƒL"nSO¬§Né}÷=¼Néí|ïÊobIÝ|"9´½\òNo‡’àwÞášAa/^¼W_}5% >xvÕxƒôRç¨Æ§Èw‰9ˆ H ZàŠÚ`¤{‚®[¾}Å×qöŒåøÁ£ë±í­ƒˆu×AÏÆh¬,§Þ&"‹ˆúpƒ°*“DYjdìã= èîÈáÿþó³èéÌážÝ‚æL9–}£”c¼m•¥à!¯ ä9Ï÷°o¾ñ“h 71dªHCŠ¢àD¨Zò#’Â0‡Ë ¼ª!«ø,í–ìP·\xV7¯TiV/`Ûï"ÝÓˆÈPÒ¶ê+2n^xѤ(ÄÇGÜKË@¦» džqïƒÏ ×Åÿ5jb•D˜´…ÇBä>â¥Ô£F_kkk‘ x£a`ÒmÍ“ šòNl8ÀwΪ§øã~á")G@[€9ù |[ƒÉ pC˜ 7i’dáv ®°öÅÇç_3§«%VO+Æ_r6"0‘‹¶ß×Ý?€BÀ@OU:‰¸•DýÀl{ç°Bþo13Þˆ¿Xr%ßMä±Âé4ðãú‚tQk|žj@â jÝ? BªçïÂb$ Š¥ƒbSÊ Ì+„be´OG7'è9á~!)<—k®{$Œ5Mç"Oã§ë~…ìpý«`j a‰Tö²´  ÁÈ5þ©\fÍÇëʨ¼ëŸ~ƒyé\5çCÐ,8 =/Ò%ì”Ù+n-‰…½½UcÀ ¢|Üï?§ ˜dðçÑûÂýb0‘›èú…é}§Ž•"×ù.uÀ÷½æYÀ …‡žQÄñ¹O¬DT‹àÝÄð+ƒCÞmèu”§c¨D5Z²ó±i×qÜý“'±$3×,¾y+Ÿí A: ¿/Ç.{À‘ K7ˆˆÛåñ¾—û½ç4’K¾>@/õzZ«ÅÄ?ËñãÇaŒõ‡Yþ^/@ï#9±Ë˜Â¼D>9s [·?^» Ö<ÌË-B&£›x"ÄkhÈ(ä×i Xœ[Š;‡qËbA¤®=—È'Qy‰PÚãÕÿAmsö‹ÆŸ,™€ª p_DHd±äÁ ½”€²RJÔéb½†tJöÏÎóÿ½ËãÐÂw1šH`™›i§Z.įֽŒ¿{ô4æãtí æÚ)窵H+‚hÑ›±L?[vdñ¥û~„eɹX™^L—E$U0Òý¥K›@C2W Ï4œi_M-ÀŸ š*¢û ¥DŽHAÞgÂ2eB‹èYh4¬ˆ4±Â[2ø/-á—ÏýÃCnûì•H˜1¼ C¹a,4çã´È9xæµCøÂ÷ïÃÊÊÅ8«zßÇ÷È»Y|ú½ˆŠðõ‰v甆ž~zT¯A6À©lc–2VjHãçD¾Ë cÜ;Ôuô§HùŠ 2Å-FŽâ7Xä5eêpõÜ‹ñ‹ŸE_ÿ þÏÿ.ˆÅÑnµcIô<¬}~¾ü·ßÇu˱´j.CNå{)Q„kÅ]=”Ë/Ça„"ÈäVr쿨é_˜-ÀßL)@м¹€£ð8 ‚|r(¬ÐÎÚ2ˆÞ÷Jr?ßÏšÈâûYˆ¼Æ²Z\§ º—7¾‰¾ó}ÔXáÌÄuxøém¸ù¾û𑦕8«a1Õ Ãìe¾KÒÕø!Örî$ ŸT P‰ü½Šd·Té{¨ê }U(†ßõ\w¥hZÏàS /ÄœŠ‚Dçw¨¢øNß#D%íbð‘ aêï±[(Ìä{è)E¸õŽ"˜Àíb&Û 4Ô\vr*€÷e€Äºö€ÿ7|¾ qQ¢K©_‰4¾[Ï"–9ú3g_ŽÎþn{[™eµ^-mqMk’@Ö/â¥R{¯ kKä¸ èœTJmÞ¼Ù˜JÀˆBÑ9`^Q&„$8äùý$á@!ŸûÆØC]°Ñæ¬ùN!.e#°íBÄ^¤ 8‘誤ïÒÎîwÓÎò€Æ2%¼Å)£QNNáq1ñ/Ç2üp¼S\sp˜['@dñô ‚&k¼ïõOÑÌwùT+”D°KÌ 1òå÷!†¹|KúÎßã~KnAj’m€ðyî XDÈ.ØN" ØG|¸M ÜÍZÖÑ 2ˆ,r¸èmZÚÔã.ÄóØü--¶QˆGÜJ!*¯®Ä»ò‹ÌˆR¢ˆpºÁÅT@ØÎ¡Ú¤ª),"Î9`Dfdr³ `1iàC˜¨É)PÀ÷s`I¼Ç™4±æé-Hqª#qóxζñ>Ÿ—÷y>/Æ~B`6¤ˆÉý‚*€v–Óõž´¹o @éɘ³»ŽÕó €ˆ G» @ø1‘ REþØŵ ˆÜÎ÷ŠÏjfÉb#U¸]D|‡ÿÂýÒ¶ÓÛŽ0@˜L VÎ P±=ò)f)V…›Èä´Âˆ/n_HÍP3‘Å$ lA¤7„ëD¾ WæhSHFO g²#ˆ´C”ïv¾/ŒÄ#ñÀäKYBq䋈½I‰‘æî°¿Ó1g‰@¦gsº™Rß+äNK›A ¢‹Ig-Kß¼ú¿Ø{X‰ºŒJ8x²$€©æªS>䇂¸Wd‘Ô¹$бKp$‘¨˜pÊÂoRÇ3 ÁÞ—@ mJ"×ÀŠIºp?‹$ÂS%Ò>˜0逹€EïE 9R–ˆ‹îGòØ ð÷2KH8IŽ>YBBî X ñ¢¶„€cêw¦b–’¨³Da`FSlè¥;$:Q¬jž)6@%A2΢–§ÂõrO-Èý( µX8ëúÖ[o¹r'%Àç;‹ìä¥ÓZ—N+Þ|ÿqñ\‚ð9~ÿ;‹õ'èÝìu½³0 Gø1]Út©<³Taà¼nSG¨“ÅòI@û€ké+n¤.Z…báX/Ç5þHàtó(ÕŽô°0î/vÌh —&ßpæž$!HPGüm&AÒx“…§BÁ׊« "(t]lz ¢ÒùAS¿£B¼œsÖu’$@ø¶0ª³28Vä{“'¥P0a’‰“Œȳã%ä¹Ñr¿ÔAcĈ$ ‰×Ù/º™bÐ#¾ø1‰*´gऩ¥³£,Q¶±Ó #Ò©œê€«…é›sßºŠ§&‘=6î÷?+\O¢¥Žwº|GWE’MI”0¡Èm¶[LÞ­mGC¡sTäø[n¹…›FRbÚÏ]sÍ5¼OIã4"%hL¶0 Ê8‰;€œN.Ÿ?>E›dÁ2’G䇻gÅ‘_4~À²k×.ŠLZë´ØJ©%[XÚ+Ù¿l£¯¦h'Ç áö“Î3b¦Ú\¹r¥$¹òûl‡ÏEåìk)b橦ƒ+c$ÃíÌ=’Tl/ÒÆ®ûß ;"¤­Phu‰@2‚Â6i ª åðŸ aȺI–B›K‹¡í[0 F3!Ñ· Á/] '‚ðÚŸ›J Å#€ŽÜÀ’Ìš§¢5Zé¥'†±Fýˆ.t×¥ç~²Ãïï‹€àbÂÜ@oˆ ÄhŽj`,H')0ö¼Á∔gJÅñ£%Æ0õ¤O‚ð{*R— ›Àya\(KºÆW܆»_£NÁž$`Â.ã—SÇɯ}íkKî¾ûî·ˆ‡É’†rñ eÝk ÊLÄÆ0÷ý÷ßÿNØú€ “üàC=„Ï~ö³˜†‰ƒÇ\²¤\Bn(bÓž|òIº%ölß4Œ?0¸Æ?ÀQŠíãÍSÍ?±víZÙ”I¦nCÄòôÓOSÏ2æÍ—`<€b’!r ƒRœ¬á<>,Œê1ÔÊ Ïçô-s ø»ñ°dƯ«¿ ,”ÅÊСNG1•K _‘h¤æL”(4hý›¦)K°$ÀRtq¤Ú債= «V­’ß”ˆd¿ÁØ:çä`ò˜ÈfÈ•A#†y»xr€K>¯ÀonëÛ†·—¾žŠ ÄÆ1{Ël,7—í?ƒC çA²Â<Ü„IÉތֽkà(Õ“)9}K Âwž"8ß!RFr ×äºë>C²¥„7ÚÞÀÖÕ[a-´ðƒó…) }¨W½¼‰8/u^¡1“Mµ ªc±Ñ&Ô ÐPÌz¶5—Œœb@¿ÆX¸ìÀ@Å# ‚Ç,²ñ“ «È23A¶¸RA ƒ+kH„%åþ½3÷šaáž,N©ÿõ?¯ñ9Iô(¨fµÌÂÁþƒøï5 .–C×0ððA`Vë,&‚Ø“W! ©çaÀ_ þAM¬Ûi(,Ökй¯;¢;pS'À^Úúæ}͸¶ó2ìÞ3æq<Œ·¸3K ¶ C2_G”ˆ¢ˆš†ÿ_̵¬4ÄÐÜÛÅîD7ÅOè®ôú›]¹.u[„Ö¢àRÅ>æŽH $Í )Ò^8L&7u*çd’Äü³yÛÀôq ‹×,»K­ÃÃFõæïóÔ3yEµKü7ˆñ²¥f²I(Ý ¶Z_ °Êú´H|°Ækæ q[C®ó\xí轓HÇËÉdRoÇ–žTŽâìyñg¢ã.!bϲÅrñrô;w=ↅÑ$ íS¢¨Èæ,ç:"íVÛbˆxB< â*’< %}b.|E€í×óŒ`¢Apdè¹íÏÄ5Y_9†ˆìÔl­KÄ:i ±¤‡4Jrß´™ü#r”-ÈÝÓ"ôúˆ¶ü¬¥í‹Ó1b~x„FŒÊÎ:Îÿ³ì8â ñ‰ø!õiÅÝ«FÞ#ÿ_¿&MŒmíØ¿£k²SKݨ2>þ²U1Ve1i€°AÞœYYí Íz21Á$Zû8–³:¾)))AC&óœý\òg~}ÝØ!ôh$¿$S#/›|Ç®ìó”çößðÜ‘íbµ8D¼‚Àž°¥¤<0ùL¶Ù²œ—Aµ¼€;@Ë"V’|nÙÐ(®²Þ~¢°ÅX¬ÍÑ[B”m *œÊf9óc®ó÷ À#µÅj²u“é!˜Â…Ï'I¾C`¯}v£2"‚É—Àÿ‹Œ“(ŸM¶ýÞEtnû´­Á/¯LÀ­s;Ê™Ÿã?IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/edit-select.png000066400000000000000000000023051323166163100237400ustar00rootroot00000000000000‰PNG  IHDR00Wù‡sRGB®ÎébKGDÿÿÿ ½§“ pHYsÃÃpMBtIMEÙ /¢EIDATxÚí˜KHcgÇϵ¡#îÜêJ¨‹n»(ņRÄwfQJ)”.ÚPT|\t1ÎVãf‘.JÇe|€TP‹Z5Z“˜ûõœË9pûÁlìpï Í?ß½W£ÿß=ç|@)JQŠÿatww×Þ…‚GFOOÏï¹\®& }¤µ.,,,@QEKK‹^__·püC2QTÑÜܬ)æçç­ÖÖÖm†(.‰¹¹9ÝÖÖ–dˆâØÛÛ³ÇÙÙYÝÞÞþ†!Š`ssS ÄÄÄ„îèèXw"ÿ1àþþúúú ¡¡ás„ˆã¬DþPJÙc¡P°!îîî`ww†‡‡¡®®îYggç+†ð‚t{{ ;;;066µµµ±®®®— á_€|>O²A,Ë";“““PSSó šÿ!ü @†ËÊÊ ü«œR©ìïïÃôô4D£Ñc±Øˆ/´Ö`+ ’ƹ¾¾†ÃÃC˜™™H$2Œ?ù€L‹œ0”ËËK8==%{¦„øÖ—fDôóóós¸¸¸PSSS³ó"†á5€r˜ÆHF æV´Ða¼B†g¾™…œfEN)§³³3Àí·Â)Vc£Çâ ¿4±ÈÌ€óž (ÔäjttTãÔ›@ˆO|€MjBÈK£½rK9UVVª¡¡!Ífß ÄÇ^—ãf&äç”55TWW«Sn²··7 Œàû½DSÎ,Ñ3S´¤EÎþœ…ဳDä^ÊEj_${¦ŠŠ [ýýý Ÿ·,..Þy ’yór/’ß¡=’½B§Óé_–——_³/3 Y 7,ÓòŒ®©öaii ŽŽŽ’+++ãðõ7±’<IùІÎY>‡akkKoll¤VWWŸÀ‡dž}\2‘·+fó=§ºO$êàààk6\@)’›= ¦i—)kÝ;Áhëà,ÉŠý|{{û€ßv•ãú×nÐbô~©õ)™5Ï022B¦m9!2™ WPŽºGeÂr € •ã)ë+¼¬ cA, Ù9x:88hŸÖ¤7nnn(;±Ù,*Íc¥ÝZ‰É„Â!‚Š¢>àQôdmmí<'ÆÇÇíÆ•Þ¸ºº¢Ïž²á4g O@no%4ÿSýEâñø÷Xë¿ò‰ ªªªàøøX#ÈŸ ón;­¸ôªPQÎD™ñ·¿œöÉ‹úúúÏpÿCgåCŒï’Éä[H¡²^s” €â±ÐÔÔôåÉÉɱù[Ð^(6ä1`À…Ž%‹”âÒÉ8òàö: yî¶Ø˜ÙWAÇÌRI÷ 2{µ™³Àˆw CgÍ«]x4Xθv — =ðØr’&·‚3ä06kÚV)JQŠ÷ÿ²‘,¾g°âIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/go-next.png000066400000000000000000000233021323166163100231170ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœí}y¸]U•çoísî“—÷È“È%|b7 ¶åPt•sc¡  –@wÛVU[(âðI}­RŽXQ ƒ 6J¡Î 2"$„ $„$¼Ì/oîpö^ýÇϹ÷¾w#I^®Þõ¾ýî9ûL{ï5ýÖÚûÜ 4¨A jPƒÔ 5¨A jPƒÔ 5¨A jPƒþ̉&»/‡®½ãÉw-YxÌ§ŽŸ;íµÃc¥xÓŽ>Þ°c`ëæîþŸílÜчM;ú±é¥¬Þ°·'_ÄeÏÿpùO&»½G3‰ÉnÀÁÒ©—Ý5-IhoÍ—0šO/&hk‰ÑÞ£­9BK(“Œäž/¸ã†ùËîjìv­Tw0Ø?üå±|鸑±"†F‹É£h MÐ-1cx¸©°J eé¿·ÒèS'.¿õ5“Ýö£‘êNš"œ?l?<<†á1 "1šs@SLØ×7–%°LÀ²¥’“’D>±dÙ­ÿ àºt{‡‹¢ÉnÀÁҜ׼ç– :Úrhk˜Ú#nè욆Ù3:0{fšb…g6ìE)If 0ÇLê]Ç,}ú´éKÏþUïú{G'»/GÕÉ£g`ÏïèÁ®ýC˜7·§Ÿ|,F¨ » JMm8ûmÿÝü!œõ–ã¡T lÜË8IÞ­T²fñ²ï¾u²ûr4PÝ™ÃcÏúkŒç~üècô£ðš"Â+§ ¬^·»æ?PL$¡ˆÄ×X|Õƒž™L^&—êÎhMNÀª¨M9Á‚D"© •.c%‰½%,Z4¿ùî‡ðº“ç‚Yšk°, –¥+vLßôØñçܸx²û5YTŸÀ¬XI0¥DBÉÊeçP{ ßþôÙøÜåo³– 8)ž©VŸðÞ?8Ù}› ª;KãÓµo€$‘PRAV)Ã…Ïõäqæ–âþo_‚cçv@©Ì %X•¦*Uºõø÷^ÿƒßsÓÔIî᥺–  $˜µPÌJA±ÒuAQÊ)^ìËc$jÂ_ù.>ûTs½v P¬’ó‹bì™Åç¬8c²ûy¤¨î@) ¥@–Àœ Qìü¶X<–¾Ñ6ì/à’s^•ל‡Ž¶X»•€¥Tr|"KöWý%ä êN $ (V€LHUÕÿW,J¢”$ظomÇLÃ}×o}ýñÆ%”ÀJ2É1ÿïqgßðÛï¹iÞdwùpRÝ €öÿ P%(%‘(6€P»¢¤š°ì,`Ë<>ûÑw⫟x7b(—3€”'‹üÚEçÜxÖd÷ûpQý æš$J™Â)S¯˜uAPX••|’`ÝîAœ°hî»áRœ|Â,(•@qh¼1]ÉäÞãßwã·½óþæÉîÿ¡¦ú%Á,M4 ‘H†R¬^¥j½âT‘‰//õŽ {¸„ë>÷~|üƒo2Q»VŠ ’ÿ©Z·¯Z´ìæ“&{ %Õ€%`€ – ,Ù•¨T‘UJ%(ÅÉ'XÛ=€·üÕ«ñ£¯^„93Ú¡”4!§¤z «âS'œsóe“= ‡ŠêN¼PN¬°…™u þœK¨¡lÝ?ŒaXyÍXöö¥_°ÔI$©ZÁ¥‹–Ýôãc/¾¥s²ÇãåR @âÒ¹`¨*%0ÿe ±Êyº0úGŠX·s½÷ |û3‡Öf+å'—drN<Âk–,[ùÆÉ“—Cu'0@Çî%Éå迚@(éŠÂÄ‘L•DJlÜ5€æŽvüè_/ÄN™§±»DÔBEÉï{Ûç±ì®º›ZêPØ`+I2͘ÿjš>Aq®#(J)ô aÓÞA\yéßà³—½„ĸ¢,e –W/Ž ¿=~ÙÊ…“=>Kõ'&k“¾-&R±.¬ÊJ%ïίZ‚ÂD …DáÙî>wÜ\ÜyÍyX´`ŠB°¤zsÑ3‹Ï»ã}“=FCõ)6ßoAV[em%´¾hw`1€r᥶l¬ÄÎÃØÞŸÇµ.yÏÉëà ˜¹ Pÿoñù·­˜wÖŠ¶É«Z¨î@§‚¥‹’’ôŒÍšðŠŒ./6 T*múÃQÙS1Æ E¬Ù~ozÝ"\ÕÛqLGìÛ0_Ö>¥íÉ—ßyÔ/D­;°Ð&‚Š24ùs ¥B6+¸ f˜âCJ„÷` Q¸þªwàí¯_`ÂS½R ŠORJ>±xùí;š'•ŽÚ†U£®“Ïa°²ÜÁw|{ò~-XªGµtÝ¥¾ŠÍ‘‰êõÒ4cÑÜNtïÀ¿¿Åëg@ t«Òßo¹ûÃûkî袺³6È&+&6”³f`…Tr¨²É÷æ½ü8»zwŸZ<`q‚TŒ;ûkm Wž‰Su!\·ðY$rÏ,9ÿö¿™ìáËRýY€W¿‡Ùp™™qÓ÷¯CÿH!uUé—ë´åSº¢Òqæ2ÍOÝÓ|,™×…§7ìÅõ÷<fB` 1ýëÔÎÑÏ­þÎ奻|X©&8æŒËOŠ8þ ` ˆÌÅ» ³M€©3õDzp81T'aÈ&VÊ$W¬ê ¥”û„AýÖôk ¥·oøÞ·0”/Ét©Z«0Ðnpª.¨Ïãð¼ð:Æì®v´Å×ÞþGtïCÊ%V1« ¶üèâªù‘¢ ³W]§^¶0¢èIN¸)ëb=Ãm÷ÚÏZ¦I@1à˜ï + LׂÁ X!`¼ãÝïD"•y–~žpØb[Öë¦÷bŽ!Üg_§{¤$€¡Ñ† Î~Ë hŠ€ Ûû‘{A\|ÌÒsº{Ÿ»gíÄl:|4!ˆ„ø2ÀÙ‚a;¦èÑòþ¬ôÊLÞ„ 5ÌæŒvCeë¤ù`(È&A²Ç=å¥êŸ ûØ3/u,s«àüð˜Å®@¡”àÙmûðúSæà_.= SÛcØ ƒHݶä¼ÛW.úÀ퇷5Ñ„ÀP2wj[sšé¦¸:s•ó™J¹}0ÌeglR'4õ6᣷-v)¸Éåƒ%Š¥ÄåùSëÊ2‚™ÐÏÜÇï‡…Ó ÒµÑ/6e¥§¡˜,«—N(¶íÀP>/^~þjé ÀX/f†‚¼ˆµzÉy·Ÿ~øØ\&ÄÓO¿Œõ‰Úǯùù— ˜QJ4³‹‰Ž}õÀsêX"ÐéU©‚9F(I}ŽR i4&1uRš˜]±öæ:tæ/8f{áÍŸ@Ó…!!—+Ç ìÜ¿µ<œ©¬UÒ»'ÌéD÷Þ!\Ïz$2K`|vóI[¿‚«¯¶=;ì4±œö¶»ç ¸ó—«AD æ³¼ÀnÃoH ÑgZE`€ (ÝÜì~JªvrÌ_æ¬ËÓ;\áx`Òý'ïŽáÐSÛš1§³+~²/ì‚Ã/ºß¿ŽsôÁ ·_´»¼'‡ž&vÎÌk³U*ÉTºÕš¾0C¦T°m§ZY9 Ϭ<˜RÆ…Ø,\èÓBßlÚ‚b˜B`håE¥ A1A*]”"(ƒ;ÃÔû}÷Éd!жtnš™„2Ÿ6/Z~ÆA^ÃcØÔ݃ËÞûj\ðÖãü0øo“¯Y|þmï>\L©†D§´ PJH†4%5PnµÉ·nÁˆ4æÞÕ…àK1”EÖh)#*¨7÷ ³`?YÃ5yXÐú{(2ûadfhø’žwÉ)˜Ù‘C€ f2«ûŸ»ò›Ç^|KËä €yºóùbÉ­¯—*\sïThž„Ùh€dÌ;Ͱ‘móÂjT€ŸÒE a0ç#µ]­„ë2€çzþ™žáð–M™ñRð‘ì<ƒ²‚ÁŒ}ýÃx©§ÿ¸üdüí©³5P31ñ?䯢ÇŸ·òÕ“'Z œ(“ JÓ¥ìWäX­§_C­I¹/`©bŸÎ©–h怡Ü~Øé:U¥¸ #Ø‚`¢ˆÍµ·C¦>xŽbÏxÛ/{e͹²‘+`-I:Ê(•$Ö¿¸¯=± {ÿ«ÐÒÁEŖ0ø©%箼ô屺2Õ€”­Y»í󬄫`@•—n«)ö/£.2„»µTë ¬Ö9óï?—@9‹^>Ýk`öýµÁ=éÂÖ*P–ðÛÌf´… =ŠƒO l½T^ÀRnÀ¸ÑÄ„®;öö£oxŸX~N>¶#´m üÅç­üñ îè:¢àãw­†;ÿ®à?Ûiúh<`ñ§ JÒº6Zm*p2À~Ûïs–·YSriÍE°p ¥a^ Ø_{_¯ñ¡;cDz–0x‡Á '8-¬ùB‚ç¶íÁÛ_?xë+!È÷Š™Ïi’É3‡r!jM 0ìe)1‰ƒÒþ_¥·S³tÞ׆`O…õÁ6 ÒJÀðÚj0C°ÍVP쾫Ë+„ð‚«Bá4u^îµüpðLk¥,“< û L»C0&—,æ±–"8¸Ë­;{A¢ˆÿ}î«ðŠé-¡5X¨ˆ\tþ­WŠ…¨µ‡¡KÒ™;§Éì%;œ2õ¦8íÆÙcæ{S˜ü x åÒbƒÐ´‡š-Î<¸¾…Úk,Oýv†ùæ9ÒX,+@:ã¨÷¥µ\Èà gÝì¸PÊ5JöÀyp8çwìÅûÏœ·>ËûKp…Ï/ŽÆ|¹ Q* $bómH+ý°±šÍà hJ3¾ÓÊ 0Óq½ñËæS3 uò„A w¾­+sõá=Ýýü>È|zc£-¬ʸ(NLY¯ý~í@6rÐîÃ~¯ÆÊk¸(U*…çwìÅŒiŒKÏ:S[„SHVüFA¼fÑù·¾ÿð €í ˜Í×±¤’?¦ƒÁ$zŸ…×þlT†cZTΰ ¢0wàVüº\½vÅåÝaQ^Ûu Öã Å Øví¶¹ gÙRŸú:B.À…ÄNy‚ ´”àø—Uzú†±c÷>\ø¶ù8mI¡:¡øîEçÝúÝ?e!jm`-%)Ë3]™ V!àû´>4½)¿oñòf=œh ›CÁ¾õï•Ì~™ù·Ú Û# üù©¢¦*¸ŸbŸKHg}&QVÁ#é}/D!–)ÃhŠc,Y8 gwâí§ÏÁ4Ñgð†™1Uò#m-M«/»åµ#ñ„ü˜”ŠÚ@ø1$À`Á PÂ^b3'À`"ÐÙ}b 3GÀf®!X=cͳ®±æ]çÿís‰ƒù×^M•ê2ó®„Ø `-ùóœ ³L!çì5Þ?ÛXËé-ƒwAÔa­ŠÍƒ8ÁShŠ#;¿ Ó;Ú108‚§Ö¾€ëŸÜ„±bA3?jA®óXˆ\«Ñ~C<¾è¼›>µåGþ¦W“ê4¡XõaÒ¶/c€0þF¢Aš¹Dl®a?Pv†Çð@ ë†?NÖ_›û™cî0Ø3+lvÕ=ï’ü¯nŽ©¡Û²cÀŒ+LMôX†ÐéeÀ¦”]R(µN»He§ÆÍ9S[1Ö4D ôöá‘U›°fý6¼Íj*3¹¦’1ä{6 ž2¹)³ÌšjfI_?aÙ-o%Ü|ñD Q'Ë Öv7‘‰éIJêNBûÅÚ@mò…Nœ ãt8¼³‡n PšÕÊ®&óvÀ ±†8©l’0‘pb 'XzÝ^ |5Ј0 /0Š`$t9T²~Fèê¬5çbÌ™>mMFÇJèÞ}?xl=zz[•žxK;nJ¡ÔÿäØZ§ŠrF€Õ»ôìâe·\´ùîK~U»»Ó"1$:^…ÐõBR@†á€2ÓºBû(BÁŒõ땲SÇÆø3Ï@†ÿ¤­‘gw­Õ®¸ ß ûö:å0´…'w_ íxpx+,–Ñ🡦[íÏåætMA  Eôöã÷oÄK»{.6!kÛ‚)v&3eìöýð%cýÚ¹í3CÜÖ¥ÃpÐlÅêÞÓ×;I®ª´µ6@¤% zVˆX”bH6A‡*‚Œ™#‚0ªªÈÈŽuD3 …%d&»Æÿ[Æh™0@ÆsÈèàAœòA~ÓZBh¾9`²9UyÿîMx f0¦µ7££½ ÅR‚B¾„þ¡Q<øÄfôD¸ŠÈ ½g´ÙNËiÆ „Ê(YÄà®h뜎YÇ¡¤SÕÌÿÜß½áøe+Þ¹õîË¡¨Íf²G09éNGÝø1tBlü41ÀZˆmað¶@™Î°0ÇI˜wPd½’cq†¡Õ{ãL7̶«‡÷íÖô[ F ¼BA°±^èÑÚ#)JJ …"^|©Ý»{Q2ï/è<‰ °’f¸f¶e1 ,@з°&,¤Åv¸w £C˜uÂk‘/èÈ‚ÿRâZ—‡ãQ“ °æ$3d"¡E Lf²5a „¶©ÂA*‚ ¡)v&Ý}L°˜PKg¬vžùúšpòD D$eÖugŽÛc)Ï„Öf–\ŒR¢P,• Kšá[¶÷`ßaý…ìã{ëÖ˜Ä&"6¸7\ñdƒ!2ŠåÝ«ë¬a“bÁ9 £ý؇¶ŽY+ÀËp°`H¬@Äú]<%ÁDˆŒ™Œ`…!"Ÿî³Ö~f@Ø„ JŽŒÉ& èO²(ÏÔ1±‘3J=‹á²2`[Þ#¿‘=…Œ är‘ (©$ R굎JJìëÉc``ÔE ÛXY×dBØÔ2¸`©œ _‰tŸ öù¾U1¥ ¨lÃb ² ›gè Â@f`[w¶¼° ­-ÍhmkAKs3ZZ›ÐÜÜ‚æ¦,XƒB](Çp᢭‚Í@ 0Rî ž7ûdoâø™  Â?ÃõDê¶ÚïPvæR)Œ ‘/•üÄ•+†á¤ „ÐÉmÚ`×2Ú5ŽÌœbn™¹ÇçÛã>ERÉÌQEë×:µ ÓgÏÁÀP^·Oï³çtXJJèïÂP4†(Î!ŽcDqŒ(ŠÅ1šššÐÜÔ„æ–šššÐçkÎ!Ž#ÄQÅZ»¢qÄ !Gzžëѽ¿…1›Y{P¨ –p³ƒ0™;i'f`€–^¥#%#I #M÷4˜3X€=°Ë&™4iQF@mTâ·zðVƪy!8:8àêB~ïëHfÍ>ÇÌY€þ¡< …’nƒ¢Ç¨%þDöüƒ ¡!"×­YB (É($ È„(!Š"ˆ(B$„ÐÛB!@¶NøUÆ‚ÈÃàÓ¢Ô6\&‚þ#©ÃkÃ.sÇ à¤„‚P z2Ê#yëÛ½¶ KÒû|3~éÏÖÁí{+–5ûå=nniÁ¼W.G­Øk°ˆ”búÆŒymŸ:$a`Ç©‡[Iwè$èÆÚ"4Cݶ0‚0?<Þ ~Àlx4ì¦Rü˜1`ƒ‘ôgp NmT£PÓÃq “ÅJ[v> :m5>Ãì _Ž8êš9³æ-@ïÀ{¬V/Ùvß'¹½Êu5†Ú 0‹ M „–€(½jµa¼Ûv…Ê­@FK,ã³ïx~T9ìOOWUe¸G Ù;pÐÚn4œ+ûütR§Ü¿SŠáÞ…Tj^ÇX¸p¢æ6tïéGR’ædq_‘K¿ççŸ~y©`ýº—xVˆ"¿Å+~ºs©D ™ŠÌK$Â1=d¸ðŒ·–iA(Ó:d¡Y°È&žwQMûk"£é}¾>æ„ d|àó³ˆ><'Œû T±]Ó:1wáôö¡gÿ~ƒ]hLˆøŠí|òúZzQƒ‚&‘Ǿ+^¼+¨$Fû ƒµÆ#Íð`[×ÚA¶Â€ óÇ“ÎØôJÚ_ÁH¤ú_éž)Ÿ€µ®ÝäW}4ÒTcí?™ péØàÊ,HmgL™›HŸï‹~ˆß¶ûãw!d€nºõ¶øÕLv8²Ïç,º'èdO(é†:Ÿ_æÜ«w¨½½ sÎÇàà6oé6Ëä˜Yˆ‹ ê“Ûülþ`ºS3„•ê(žÐgã Âý,0¬¤ùá9¨$ágøü éã0× …¾.kÊ“TîžÖ€¾JBà´Û[,‹‘Â$5ÛK˜5w6:¦wâÅ­{000jÝï>RÑ%Ý¿¾úþªC5.1/kóÕÌe`îÊë³ÌμT*ªYá˜î1œP %x(S2ÜÒ³jÐZZAx¹¢œdÀŸ9G™¯KdA_™X€‡•œ JƒU™ZZš0gÁŒŒ±níV÷5˜~‘Äñ÷þæê}5ݨÕ`4ÐÑífPdÞZ* B†—‘e~ bÜsÊ…@?Ê6ü»Q»êL/ë|FåÙ‹E*-@$=²wãB©¿2ÏlV¢®™]˜1³[·î¾½ýZy úôøõZz1Õ mÞœ"á¦:aÒ¼ÙÁt¬qæ;`Þ8ŒÍº‘qV‹üvø´àáìZíêà?1ê+3©f²ÃA¥ú®}~à¥çì´»,3–Ávœ‹1gþ ”‰§ÿ¸ …¼Éá(Ú "¹|çï¾¼¦RÓ–. t L™V¸(iäq²Ì&* ûDYB(‹Ìý|fô•÷à `3NT ¢Ïïyôצ€È!¦š,€O`(ˆàe#‚À-ÁƒEðYFVf¼0GY»ÖܽóísÙü/ÝcµÞ Aæ¸Óü@ã`WùÙ¥@Ÿ{J ÕÜcúÂNسO=²I1±|^Dò»Yñð­*-?4t™@ ÿXFÀᲪ`ÈD†qå ÂçRÇ‚iáPÌ*5¼Ìç—…ƒÐ ·ŒÏDþ`³Š'c\ZÕe":f¶cÊô¬{b-vmÛí†Â÷›ãÖv?òõ±Šb:ˆ0Pw0×ւŧŒ\.Ö Br9ÄQŒ8#ŠL‰sˆ¢q!1¢Ø¬ˆbé)à(òZé©a‘€YZF†dI¡ÐW>V.ÝKÀU²–ù)VqÆï[än‰!ðÓ>Ë:¥rXªΈ›#tÍ›†áÁ~<ôï#?jÛ.z ü?ö?ù»jãÉ¡¡Z`7€¹ct`Oüô^DM1ò€O’@n*ô}FÇTèìkAÁçt ^t–E¹k`"b…öiXöOŸÁ¾þ]e¶Œ÷mI³_·Ì,GƒÏîÙƒ–…ÙÉ·¨Ó.õÊ€Š0Äó¤kÚºZÐ9·Ï=±[׿4P<¬(ù@ï“·¼T ‡‡&¢‡À|>°RXÿ‡Çá}ZhŠ)UON}ô?†YÞÆdæŠõ0Œ×õæ{‚èí)Ó𾄈@:uÚOöíS4ð³u°¯ž;wá};…¡0‡&miRd*¢X s~J2ßÝóK õ Ú3ŠDÑzVßôT’›#@ •ø“*Æ;~$1ú`p)˜Da_8^ ¤ žÎB=µöÕjÊÅ  ôš×^²QIú9–IÙ$Ó~Ë\Ûz‹æC"ö¾?p•Ü‹ÝožcÚ‚©Øüô:lxb­^¦€¶’hZÞóÔM«ÆÿÃM¾>¶ë÷/Aª3¸À`ú¨e®Õ`¿ ·‚Öž§œo­”ˆw/\‘½œàøtŠC‘Q °ð‰$!‚y…lnÁæÂ<Ò¡føœoxÏNÁÿL?LE$0e^+ZgçððO~u¬†4ïUBÐíQaê)&™ù@ °°óÏ8û0·¥&jžµ”CÍfh iÉšnk%BdâÅ.°Zæ"+§ZØ ¿¬Û¹€ò›•QÜaÊü6toÚ‚§ó¨ïÀ`…þHÄíùãÊ;Íh¼|ª1 8š(ˆÖ£oÆG—›igœÌ©Bpà?vmIDAT|Z™MÈW)ƒ˜¾™'†7j-3sÈuFxâg¿ÂÎMÛE#"/ïY½rÇ¡—Gu( 6éOÉ{â4ˆ«@¡U€#!Ìði,cëÆÓv{(jhž×„žÝÝxü¿Da$oâ ”HD×ô®9ñ_€#÷-àµR}  ù-Ìâ  Ó€ 6G9ÿÊ“=öõ7ÿf€ÿâ‰êÜ·OŠºZæ´bõÏ-«Ö@/€ÀÛ(Â…½Ïüà‘CÑåÃAõ'ö¤ß34ªì"=ÎWdŸEú~µ›Õv“i´‰žjðÞÑ$ÍÎad¸¿¹î6 ÷ôCÏ\1ˆè‡QqÊe=›n:¤ý?ÄT¾“û?ôÿšØ×ÛóRsùÔÔuâíX÷ë±þ×A)•c}¬oÝ]+]‡ÕŸøì@%€œðY;}N% |•„IWÒ9ŒZ–‰Q,À3J¹¿½nìØ û΀'ÑÔt^ÿÚ»_<4=üTà^×Z-¡ã~ HÙbÓÏðsùãeñ¾ 3ƒÛ°°ÛŸX…Õwý;d"a"ˆ„ˆ¾6°ñÔ«ŽF 7ÕŸ^ LbgÜÓͧŸÆ5kõx"æ³Bi–¦7áá7c×Ú:ÕI§"Š.ìßø³ŸÂNª?pê€ÀÀTb(ÙØ/ÈTÃx–,ÖSÍ„ÂÂVìÙ¼ ]»Åá ô@ Š~Ëä’¾Í T¹ÍQOõ'.aÏö‰ 4Œó¬uß4Æ'A`¯ò [ò]µ`žºùVlyðáŽ8þÄÀæn<,]<‚TŸÌܨÈSi–Â7Â9üJç¥Vºçb ¾"Â@ß~<|Å—0¼w¿žcDψæÖs6ülóaêà¥:;¯¿˜!Y-Ä(c° óÜ‹­US¸f2 ŒÑ©„â xö®cý=÷‚Û¥hŠEtÝÈ©Ç\»ï–G¤ŸG€êOœÐ^<•ƒ@3!ä×éÙ05ÇxT$Ð3'B¾Iá¡+?ƒ¾­/‚ÌDCì¦}hdóo…­Gª£G†êO,# /%镵Õ6H ·b™H‡#N›ýÑ6ÂÀâ.¼ðË_áéïÝY’.gÀ ûcÙzÑàæ_ôÁN1ª;p 5M$PƸHÀÛ}ÿû—Z &Ø3C ?{ ý?_Àž§ž6Á…£‘WoøßŽ|/ÕÀ¦m :“0 ž^£—6ùáïµì9n*v=»«>ñU”†‡`‚{EÏF">whÛƒhß&êNìÛ>V©è!Êøõ ôL·?*ÁØÕE[4 O^û5l{àne@’„¸~tæØ?cõê²oÔús¤º ˆ÷ƒI 潦‡?ߪX¡˜#l{E+úzöáÑåW`tß^¸Éa¦½"]<²íà¨Z²qx©þÀ¤ú*­½g?Ze~sG*ý+gûÚ}'γ+¾‡?¼+˜P˜£r(^4´íñžIéÓ$Rý €Í ^ÿ|t¿¼•Hý»…RJ”ˆðÂÜÃ"Á×\Š_„YùF‰Oí|ìºCö¾uQý €|2€B±hnµ^©so;aÿ¢.lúé½X{ý (™Ø Á„u¹(wþðŽGjþF­?Gª?psÀXÏ0}Å<âB¢!€b›#tÏŽŸÖŒG¯¸{ÿø ìªOÒ@٥V¯ú‹zãQý ì (©°yåÀ÷ßÐÖ=€D–0<5wµcýw`Ów!Éç=ó™öp$>œï~ü?Ð=Éý8Jhü‰ô£Zæ¿Áæû`_6™uÚÂÌ¥K‘óèßüö?ý T’¤¦Ž tŽä‡†v­þ‹zãQÝ @ó‚7ösg˜Ë÷ïv…³=n{ + »VýYgôþTªá·ƒ." °¯qÙ`2Å.­e…×5˜_êNÀtf²p × àÞ!$J@øFa®<­¸çÉ¿h”?½ìߟ?Ò”ÌZº*–¥A´Ôi»y Qѽ‰ó‹Ý݆ݻëjædPÝaCÔ²ðMÿ•I¼›XMaÆÖ4©äþÁîÇþ,§mÔ 5¨A jPƒÔ 5¨A jPƒÔ 5èO§ÿ©p” 2ÐIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/go-previous.png000066400000000000000000000241701323166163100240210ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœí}yœUï÷wªîÒ{§“•„l ! ‹OApaX| õÍÌç‰Ë >yÊ8Î3ŽoyŽâè Û ¨àEÀAv! ÙºÓôzûÞî{«ÎïýqÖª{; ¤ÓpùÜܪSË­:ßßïû[Ωj .u©K]êR—ºÔ¥.u©K]êR—ºÔ¥.u©K]êòšè ˜ râÇnlÝ:õÏm?û¨ym —ΛB-Ùʦ]ýOnîìÿÒ§Þ³ú®‰¾Æ—+áD_À¡.KÞ{Ë»JønûìÜ´Ž–,Ú[r˜Ò’ÃÒyS2!"@wþ¯kúíÖžâ»ÖöŒ½}½*b¢/àP•¹komXzÑMW1¢–£iù И Д ј1RŽP‰0P©+@ YzáV4Pñq\ù0˱ŒP(Œ"2²! €þ¡††G0T,c¸TF©T^Ø[._>Ñ×~ RW€„0-YûƒK£(þ½”ÑrŽ+à8Çt÷ "r 0 E J(”"ŠedC\4Ñwp R´,Z{ÝtƵ×ÇÌgA2X}77†¸ðíKpú G¢­)âh»ûz0T(a PÄðð†‡‹Äm}*u°xí5oeôH9 ƒYâ¼Ó—â󗜆èeô‘Ãò£‚±÷=¾ Ú¶{ŠO>B}]+À©§ÞnŸú—ã8þ¤€K #Ÿ ñí8«–Ïßc”ãJâØ¾ mÚÜó»A PO¾¬úu« ÏûÎâmØx3âx ³TtÏ ü™o|ú)ƒg{Ëî NžCféf¨®“BŽ|×w>À±üsÔ¢ü½³Àøü‡OÅ;ßr,¶ D(VÊcžƒY¢,cÀ0¹û!+¯+Xzîµ-•`ô»RVÞ –€”` þ3[ñÝu磡¥Ïô””^:¬-DËÈ®P]Y|ÞÕ'–ãÒÍr!¤s Cý8w%.½èìаsOqÌsp _A¤€Ä“’^ À´ð¿^}YW¾eX2 ÁoiÊà›Ÿ}'-˜çzŠˆ´ÙïÃèÝY™"0G H"ÔƒÀCL?÷ÚÙ¡¸ê&æèTgõ1XJœvüøÂ¥g¡·<Ó54öIX޹‰qIÄŒÉXW{Í*À¢ó¾sN\ާ"Ž-ø!ë>ñV¼ù„exaO#•X°fÏ©}H¤ŒAƒ!Œ­,‡ª¼æ`Ñ™wædö¯É8ú¤$È’c°Œ±t~þõÓïg²xjgÿ˜˜ó8ÞÜGDG`IÉz8ѲhíuËeüÒ-ñ –>ø—œ¿s¶ô14PPŒcõãq“˃ª£ÄI ¯8ò¼ë.aY¾±lP~>K‰iíy\ñwgbúaxjgbY ë>ܼ·SõqB2XÆ`D¢Î!óÿêúöpX~ãÊy,%˜#è½ãMóññ÷Ÿ†ÝCelÜ5 6½û°íO*gbUˆADê¼u8¸²díú“åptÇÑ<–¤Œ)‘Ëþéoß‚Ëçcãî”#gâ¦d?~ÌGµc¿I°ŠX§€u8H²öÖ`~N¢ò9ŽãY¥xà+OÅ?^r:Šxvû^4™¯jjëBªµ†Æ°ôKÁª3À«/ ×®Ÿ„£7pÿËXQ¾ŒAˆð¡óWâí§-ÝC(–# µ«Ó«z¿©Ú`©*Õ«%fŸ˜œ¸Î¯®,¾à¦wÉïq,§@G÷Ì1fOÍâŸ>ôVä›ñÌö^°Ô”OV’B€ïOm¥$øµuÁ5JH@ª:T/½*2ûœ«›š¿–—03¤¶zpŒ³ß4Ÿ³ ;û†ÑÙÝn|žu>1V¯ÚT“¢†¤ÕeÅi—H’v,`?‹CNyXzáÍ+$â[ y9ƒ©¬®µ‘ð©‹NÂó¦cÃÎ~Ä–ŠM¤¯­ß¦5õ{Ø­œÂ›´›GXý‚BÇf$°î^AaZ|áM—J_pžµå2ÇXµ¤Z»¥ 6îØ«0Àúz .<6°Z t F9ÀºËã$¬ëD¤2z ðÊÈ¢µ×M'qãµ|Ž`„ã¯Ï^Œã‡­Ý(G:+ ™5˜Ÿt•Ç üÔ©¼•*×_3+¨V³d¬ý?¡>ô È’÷Þx:3¯x¶þ3røÛó‡6lßkƒ{PjÚWmư®×;ô|÷P5‘gÆô½sÅÄÊ@§€¢¼lY}ÉÕ™¡þÆ/2ËÿÉ`a€g½qλ3·Hð¹$ù¡Žã?zøxý?a °èâ„o1äû}«Ïg ¼åp,^0ÛzI ÒéˆA,`€ Æ_\N¸²Ÿ¢5i {ûØñ|ûŸïÚ½†qF‰*,=ÀÊ’a Ä„c ˜Ú…T6¡Bu Aé‰`?­¾V· â¯û~\mB`É7Ï‘¼Y‚ù¾~áŒ.|ÇbT¤ÄÖÎ>¥s€t`GÚ§3±Rˆ;WÀÚ×§êäïi5û:_;’M‰UÛñ±Êôõ(z×±‡ìí‘€ SY2 ̲JfHUO€Ð¨šÛ Výž­SŒ ¼ß~êxXÜÄuÝ:±ø¹…ÂÿfpÆôŽo[='­˜®¾*±J݈´{¾ÝL¿6VOYìã˜Þ÷ƒÈÞ½e Œ)鱂cN‡:Ú¯}t»ÚÍüïh³×tZ¢ª–šûª [D„ó?ü¯ ¥Øûèw÷yCŽzß ³¢çy=Ÿá[ýÔ&µg,@cS[»z5¨Æò  ä¸ÞÌÆ…Eൿ7 ²Í|ðõï3ܹ|ðmðµo`0žx±Ûئuc†!TF’ôßlö±mÒžËî«dÒH–ªÍßî} ')†?-=( °ø½7œUøzO·à3cÕ¢œ~Âáè.aO_ÁY+9¶662<êab €H¨‹@æ8•6˜²Yk³§ðÚ,ˆ€¦â”«€Å×¶ê]Õ·ôÚ8± `-ÖLQשô¶Iöº‡t0iT ê)CR $B<»ëÞ—¼ª 0ÿ¯®ÏgŠÁW˜åÇT$¤.®1œõÆé˜uX :÷XkVÔ®5ÀR(,¥2d‚ÂÉäñU›ç÷¡e(f1»²HüTmIjÛ6ÓÑîwý¨ÜêAŠdÊ’¡­ Ô²zÃÒg÷ÑiL¸¦ f€Å¬? %ÜÂÄÇúZ9†ÀÛOœƒrcwßHMÐÖìo¤-ž½6wC=C¦Ñ|-!ö „lõÑ*‘úµZŸ“%ű¬©›/ò„sHÏåª7û˜íæüÒá+;d©Ã×צKÞ³þƒ|%Æ„A8ey#–.lGßà°“ÁÚ"5ªB¨@Çx:K¸1ëãˆeÚ‡vže:"0.`, Y+Á¿ö$÷iƯúÖÀxÞÏ-›íP@§}¼U À¿–Â@x×5>øÀ+¬ó.ºiJ.ޝ‘ÌçùVßÑ œ±f 2îÞ!¤*`¬òz¡Ó'&@@êI–ªgX[|"='í2Œÿ&Õ9Îø)a̰Vž ˆÍ`²†D<àïèý¸ã»íoªsøŸÛú!m´>ý{La>Ò[¶70C»˜uAŒá±ÐAvKÖ®?YÆÑM̘gôÌxÃ!Ž[:…âJe†°”/UP§=;˜íàõH‚´&¨²e’² dÐóñÈ®ûÖoì^„Õ“¿d”¡fß¹dÍS@ ¸RpÒú-û´ï)@šÞýec÷Ò·xYåÿ™UÅ2 „*‘KSE< °öÖ`QPú')ùs`L/ä²§,oBG{}EãDˆIB)`I‚¹8@ܲ$kå¾Ñš]Ò–fb—)À²‡ö v¨×Ò¿Íô[Ë…çÛíÇcåëý8À¥‹vÙn—rdÃ@Í‚ÿ*+ÀµëçAé&–8ÙY=0·#Æêemˆ¢C% ²Ö/…öì ]<ó;"å ^ÜŠ …~/ɧ.L#kŒ™tG;6p¬À€ž ’à8Í«š Òþ¸:#/XÐ`»ÅnƒÛfÀ6~ß9{JX½Û(4ðfŒÃe™LA@ W[O^¶,zï·äkXr»>1VÌpøŒf”J#‰Ÿ'`á[?[ª'©4A uÙæQ;Sõ3.@ *Ð^Æ`ðp™€~d+ hÚ`/»€^6Ù°ÀœÊ}ÁÄШúV;°>Ðf–ÊSç ã«}· &ÀPåaÕ– ú|WÁ.KȆ¡7öñ*1Àìs®nllÌ’ÿ»oõí¬\C6+P(Žx]E6ÚWÏÑ›TNBÀhƒ„®Ú_IPèzÞ\ _²íh÷¿q¦A˜ ¦Þàç˜æ(r Ç,°±Š¹ Ÿ%8Á* ç“æ9?.¥θi‚@8+–HEùRjW‘¦~}N ÙL ¯U¦.jl9 X¼öú• Ü/³A1N«`áìFH£\1Á‘‡4ýK†ÞÜ=˜ñ|Õf&ÓH aP4óô½ÝóÕ®”ŽïáæÀÑ»0‹h;„;ƒ×i $ΜèÔ¤ ðrç’t~Çæüžr°¥zßï«Ó;š÷(>µ_lF”õþR22Ø#û©L‹.¸îRâr@æLgä‚ Žš´µdQ®TjIB€b†B Œ’°ÆMD !µ¡)¦B‘ŽúmÔf-Çú\IžoHÞ¯q RDb‰¢]çµS„À¶Ç¤Wùµì`èÙ0#[š.5‘A3 ‘ Ý=˜›’©ÔOÍg0ìbögݘËf Ãͯ€¨7h^ÿ}Žù/ÈjôaM£8rN¡ Ä‘~8"¥q$«€Ž˜ÁRåõ IDBa§ƒ>ëõ…K©\!$³fí’º®`ùßQ½ybÇš`›LG;EHÔŽ­¤:Q“éëf&=ë6ްq;n1“RÔx€öíÒÞÐ=Øw2å6 øù¿ÔnA"— `ÝÎ~X?0Ž,^{ý[%Ëž¡ÂBÆ8bJSÛ33¢¸öÚg=WŽABÿ6=^¡­JèžtÅ Tù`—™f]/té FIÍVà3;à ˆdý¿+§Ý‰»Öd4hÒ>uJ$ÀFõþˆ«êm´&PJÈ|Sè!ëßýÔÐY‚™Í¤¿³™ÉI°/“V_ru¦¿7ü²”Ñ'FZ²eÌ? È„*6ìãG EûÒl ÁZ!ÀŠ–…¢qR ¡n Bݼ®´i+[BƒM›dbÕYÂZ(C0A‚]îÏTÅð&ðƒQª´ß÷ïIaB7Ò¹ÂçÃLDñ\ÈZ¶mÕ ïCeÖí‡TLdÖ¥QÉz_JÉÈeCíî’J·/©R€…k¯nëßü¿PåÅ\˜ÞXÄ´¶ǵOf~”`ëKb¤¡C©:’IÙ1k%†ÞYù~ÒJ Úìœ[ÉÓÏÊ_ªbŽHìË$<@½ý 3øÖ>†å§»ÑƤð•Éãz}€±D3ò(íÃÆç/í¬ÜѼaßÏkÊ—.ðëÌlÀ‚ÿr‚@’ô@ñY2„ò9œ¦š5ìè=¦P>`UÇ™1š˜Õûöô>,Ü ¯ëóÀƶ0L^{€²]öüº¬&h¤Ôb!dï Æ­Úñí2\Ðæh_‡µ6P”Zkظ?Ø„¹ëy¶ É‚îF«Í fMkÃüÙSUð€9.€å{Ìxu6“ASPB>Dc›}rTÔ-ôÀ„”Ò”ü•RÁzÔKHaâ^!$,4ÐF9 C!ØÑ9(Eí¤j ¬ EÚ=X—ÁБ2¼œßŸ¼¾3ð{ÌÆ€›k˜4{z‰ŸÒAOîpHNظ­(&Ý3n/¶Œ ]€2A€¹³Ú0væÏêÀpqO>¿ ×üð>¯¤-÷þ Àjžµ^‰ÂFû³™ˆÀÂuˆXÝ \7º>ÀÚ2t¹˜YÅ‚TÖ$ôù5¦ÜX¿¿œøÖè 7(lkùäâ€ÚâEu>ò¶8*·`ØÄ¨ƒ ˜SÆiR/–°iŸ¹G5ä=µ½ ³¦µbö´̘ڂí½xúO;qÃíâ¥=2Æ‘ ficû3Ò@–ò‡€ü ‘(76"–ˆË -¥¦ÐÓ´˜Az¦ 4+öaN Aʺ¥ÞGH‚ԥߕðôäZo·J3?#1 ¤bÝñäæºHÞºw¤•Áê›ÃM çXBøªT×Þ»ª¥bp ÷VIÏvf £­3¦4bæÔfÌìhÆ@¡„·õà—nÀÓ/ìÄàÐ0d#Žc•*3Â@³‹Æ“j ò§IÇ|’”Œ={ íyLo¸AdƒôXJ:Q#†„4í°¯€fs ]&µ`›Î6õRÏþpuu[Ç'×™f´ÐTÕßo0“Eôˆ¹øÁ‚^ÜP½>—q!fÖ›ÎHN=OY½éW}¯6Ð 3!Ÿ ÐёÔæ¦¶5`jkÃ¥2^êìÃïŸÜ†ç7w¡·¿ —t=nB¬b)&‰ ¼k^l½ã“ý«/¹ú/öì*^Nàÿ!%‹ž½G²hÉçÑß¹QTF[kZZšÐÜ”ô´”RS8¤B!ÁÂÞ=×¢4³DÀQà|«þ'Áú1 ¥ld"}ųXç|ª²ÇÉ€N[£zžÀ¨ °À¹A"k~.ô°7 6þ²\àëˆ_¡TXK4®A+QC.Ds>ƒÖÆ,Ú›³èhÍ! B×Þ!töðܦnlÝÕ‹Á¡¤[NÖÒ…)n%>BF _~}÷C·àœ+®óìÂP #%ÂŒ9KPìï–͛Q‰" 464 µ¥ím-hikBsSÙ0TþÖ/Š,)ÐU±Ø¹†Ô7¥2è|Þ– ¤Š ÀPÕEÒ©gÚ0„Gõtøüª?” –¥À´e>P²q+vlpê¹s€€| Ÿ МÑÒAKCˆæ†£e‰þ¡ôôñü–^ìèBOßâH­@—zŽƒH¹FÖÖNd¶É”fü—“ú²å??}ÏÌ3¿´2‹ðZ@žU;ºÐÑ>oXÝ-zý}ƒ.¢X,¡{Ï@rùŸESc-Íhin@cSšs9䲄ٙ0„ÔS³ÒzZåP1 Š0.@ƒd./`¾>$€@B@BdBB BA!€l Й€ÍHÉ­HŒ–cŒVb”Fctö–04\ÆàpÃ¥2âXïz@K©˜¤‹TÚŠ… ¥ÔÄÚ¯K7cªÐJ)„Ǻ-´þø3À——îúÌ·ç½ýòß0¢›!åŠÒè(6oíÆÌ‡á¸¦bÓ†(J@‹U!–g¯Tb F0\ª §·„–9‚ @Èd3hÈ7 ŸËèOù\Ù\ˆ†Œ@& ‘ÉȆ/BÕ™‚ œÐ$H µÒxþJ_ÔùúiáX2¢ŠD$ƒ2FIŒV$JåårŒ¸æP­ZOj$!Õ éw‚AÒóã|céÆÊÔV¤¾è±–W|Ùv÷eÏÎ?u݉QW@ÊK%ˆvuíEss–¯<Ý];°s[§«­&/©ѵ=¯AˆcFi¤ŒÑrŒB±Œ"œ’\@XKvŸ P,a,ÜmSÖ#Hµ L\“§.˜ƒŽ!ájð¬‹Ì:…‘ªÞM0¥-SÒ6¡¡¡s?˜šÉL›Ýf-=ÕÚ m¡ÐCÐûŸðû¶Þ·ndÇ=ë>ŽXœÍ,»¥”Æsw¢yÊL{ü±hnj4—§:1¥­ð”@m5h®V›ÛfÎk:²Ö~ l݉޲ § "¥8Bˆ@)ŽR8@NÁýÉsPúœúúýkäÚk߯¨²jß­ŽÉ®f=T÷‰_ö "vÜ»îÎ(ŽóÝ€DÇØôâNtî.àèãÞ€9G̲§ )g`n Õ7Nnû˜ŠÚ“¶ha;_/{ %XÃûˆ pë>¡ÚµXf1×'ö­˜¦¢éØÞr-«·%H››P… Uq”޹^ €Ý÷¬ëÞuƒ%>Å2aHìíéÇSOmAû´i8ú¸eÈåóUôŸ¹æ²Ólxû§®eU,`;ÝY™ŽœÅRX·ØuÇAZy|¥ÒçvŒã+‚4\ŸÀݯ¯à®Ï’mðúÞ¹ý\€­îÇ;_‘WÄtþæK_¢r¤|,Q-ãé'7aw÷ ŽY}›=mßš[ëÿ„…¤™ÁëHóo_Š`,Rvp.!í ôÔwÒMhê7@§¨},ëGëM*2RJ¯Ÿ™¨ÙS†KÍ}v¶òþ¯Ø;‚vÞûµ's¢iW3b3vmßÇÿ°ÓgMDzcŽD&zôïk1¼7©ì­š%_9`Š9öXÛoÕ j@’.AxÊà@WV¸u_ìñ Ôû`*ÈÁï•”“ôþO(<שw¤ƒ@3¥lþ=کŨb³Í‚ì@ÝAf_öÔ΄ánÒ*…ÝÃ}“;Þ1Rëñ‹±*=ì˜öÝAЬ"x S›êǰnw!IñïÉs{Î\?E<ù?`¶AÂ`ÆX&Šœw=ôͯ æ?Q¥‚§y?ü8_: sÌ„ÉëGÚÿ©ªïªÀ­ ~’Zív¿=AË•k6¼´/QOð-},ªeÝc*©9.}ÿ@­û¯î'½_ ¦U±W OÊ‹";¼úY‘_É’¯×54ìÞ±¿þɯ0*KX²z!òMù*ÍöeßÝP½wzɸ•$(^»ï«=Kí<êMÆ )FòÎ[}Yû`„Ä9¼HœvúÉ8íŒÿ‚•Çýç¾’²ãᯗüÍôã?xWeÇHq¿ûÅØ¿t>Vž²ÃØÛÕ`'>½¨ylõ ’¨‹)ÒQUvJAS€¸¢ÎÐã =kWºçøÍ´:÷æQ·žO`5ûWêc$›7žš·Ÿ²z#ªý=÷pHûìi»GpØôà ƒýꂃþ¢ÈžG¯¹µãø¿~X°¸ §ÀÖ ›±gçnœðö7aÁ1ó°ëÅnp4>}7ÒÝçf3Ë#1ûOà€ÈQjj–OЖÅmß¹[Ÿx*ùô)_̾òØ€C¿CÐîI¿IÔìËæïúçry=»™)ÞÝ1N|ã ("G¦Ï˜¦††ÎñºoBÞÚûèõÛ¼yÚê¿ùsü9Ù¡Á!üúGwcÙªåXñ¦ã±wÛ†ö Ûcü²fâÞkŠWñÊâÉG«Ý\Ö3}Ìi …T@T½°Á(]›·`צM|ac &ïQ5ûG%…¾‚Ôj7ãÈ\¿¯¨~§–W(àÄ“VaÊÔ©˜2µÓg0|Y4ïyìº/B„§0äfH Žb<ÿèÓ¸ç¦;ï1û¨Y‘†Þ.i›pó}Ìíô­d4ìöa]3¯¬¦ÛXìoÐ<°ßO€.#IDATi¬Ýà/±íIÏÎU-ä‘ 0Ì}±ÓTx¯3/”fÆî®ntuíFOw7zvw£422BR|f<öÏQ¼ŠRÚõÇÍ'_Ç™Ê<–rÀ(†±éÉçÑОǑ«–"‰Dn„Mçán¬Ÿ¼vý&¿&ŸJóÆÊÛ“¡ëQUºÿl>3ƒ¦äðد޾Î.}˜Í+•'¨Þºú [¤Ò¨á_ÿÝCµ¬Þ§BfF¹\AC6W,Ž>²·gÏÏ߯ñúÿÏ ¡^q™¶òÅ2ú¿DÜ®,‚1cÁ\œ²ö,p)@ÿK½ºhØJÓ‚šuûä>µkú~Îo£=Œ|«NM‘R"XІïýãǰùÁ=Úýì!Õ§ãÉ„ÿ½_ö<±þfdÂc<ăÁèÚ¼wüÛµèÞ½³Ž›ƒlS6"°”YMãÖ0<àPM÷å›(>Ö“ Žeâ;±Ìêi&{Rݹ_rÈ]qßcë·õ>¹ô"ñÏ`YK”‹%Üw˸ÿG·£mYZçu(ÿíûq/°ûÏå{Ó¶ô‡Í\=­ÎßsøqœTû—Gû“Q9P²Nö>yËçà4&l5¯ZÙòÇgñã¯|£Ý˜zìL¹Œxµu÷qyµ5VÖo@º1¤ 6Ô#K“{‡¬(é{âÖÃró "úwó€áp_?~þÍkðè=?GëŠéh˜Ùê¥vIjg[\IFð2eù‰™»1CÆš býIgFÞÜ¿Éɇ´Àž× õ=së…„à¿1ÈX2žýÕý¸ãË_ÅhÓZ—Ï¢¶¥ËäÇ÷õÖ—K?õ‹-ø& Tëqr]JÄ €t"5 Á&éö‡ë‘Í®ð(0}»ºpû.Ç3Üæ5³ÚœbgùÎÚ}%ð¬Ù·òX)‚e€Œ`]€-ò`R*Á¤Qxê¶-ƒVŸD +ˆ8ŠñÈ¿ÿ?»âkˆç„È/™zR$×öÒs5µ§”Â(ƒ]7JÖê |®+ÀAur`ãO?#‚à­ ÚÉ`€€® /â?>õYlÞò4òkæB4ç½i_±bÀOûtå'£~÷¬žÚ?NîOÐAà䘔  ¤ÃOï ãèh¢àv1¢‘îûÆUøÕUWGw \Ø‘Uó-ߥƒ~z§ÖÇ^V €•¼É%“V oó/†^¸ë݇P0%ÿ­ý·]úIì.v!³f.ÏxJ°ÎÒãå›T0Ñû.`jÀ¤V#›ïþŽÈ5®"O˜–áÞ>ü쳟ÇÃÿq3pÂ\ˆ9µsù”Ÿ—~Á'•¦Ûc‚+éßlòšP|þ§/Öt¬a\ ‚Tó7ÏýçÏpûÇ?‰þÖ2äʹàLPÓû [7»BQ?M4.@˜?ô8ùÀ^C ¸í¶xxó¯?‰ ½ƒ!:IgýÛ¶ãö]Šç~ûKÈ“‚k©òë¾u»Ü?™Æ©õÈ0‘?¾;©äµ¥Z†_øÍ/Â¸á ºPS¼¤ŒñèÕ×àÎÏ\†ÒâvÄÇÌAL°Víû÷$#¸6cýfÿ¤Þ`fçL> xM* ·øÒg !>Æ@Ñ´÷<ý,~|ñû±yÓ3¨œºrJcu´oßÍ㥇µFØ.¤ý~"û’׬)¼ôÀ·Â »š(xÚÔì+¥øç/âþ+¾Œ‘“棲l6$ô@PÕ¨_uh¾°²„ïš<òšWÚz߆âôÒjâ›ÅfÞïö{ïÇOÞs!º£^Œ¾å(ÈÆ\ª0'Ø í.Ì´4àæ÷O.y](à±Ç*Åm~\d‚³Á´[5Fz{ñ‹^Š'¾-*o;ñ‘3’YB: ôª‚É™}“|àõ¤Z†·þö®+o`î²sð˜±ñ¶á΋?€Áé!â7/ƒÌ†UA L2›¹@õÁ I%C»Û3²ëá3‰Ä'†žy?¸};~vñû°ñwBžsxÎT[JfêÛ½Œ‘ê•ÀÉ(¥¿û·L9‘ Ï[–qŒ?^u~ù‘¢|Ì àMK CÕîÓ,Õßü‰£Jröï$“×µ@aۃώΌW !¾E:@ ìyvþß»×bÛs#|÷‰ £æººA,!­ˆvwééÝ“H&ß¿Š’›{Ò™Ëë˜x¦ÿ¸Xûâ…XõÑKqØšU»@£‚yÓP|nöüì'èÜø"¶mÙŽHÆÙþФêÓIu±CZf¯žVáà þKè¹&Ï pÌYoÜ5Çc´¹عÑö—0´mº¶nÇî®n¶>0©útŸ :Ô¤<ÔYŒ ;o[çîáT€2†âeaæ”6dP6ÙÒ QFˈK£(†KŽ›ÿe¢ïá@äuŒ%£»ùKœÐS¦‚„âÑQT†ÁA ›µ¶#ÛÞ†¦Žvä6Oôu¨Ô`RîzôÙÑYñ®Q$%PDe`<018nmCÐÚÎd0T(Þ<Ñ×| RwãIg§Œ‡vÞ´Ï»½¥©iNÉ…¹|>È6äæ ;:пi ž»ÿ¡„;ÿ==cüu­CS&UÀ2ÑÂÌ4÷¨3:sÔûrÓŽ/‹°}ûÎ]»»žxúæ‘müj¢¯¯.u©K]êR—ºÔ¥.u©K]êR—ºÔ¥.u©K]jËÿD͉?ÅWBjIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/help-contents.png000066400000000000000000000237111323166163100243250ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÙ &ÏÙþ IDATxÚí}[Œ%ÇyÞ÷W÷¹Ìœ¹íÌÞ¹K.——]ФiѲHÊ¢V´¢ÄQYH¢ A”ÈHÞ„<$O $p Ø@ ²"$Òƒe9V;²bI)J„dR¤DŠâr—ËÛ^¸×¹ž9×îª?}9UÕÕ—33»s‚°sNwuwuý÷ïÿ«xo{o{o{o{o{o{oûÿq£ºÎgü Çãk®PÚñMö» ¯ýè¸ýnqê¯þƒ{€™!¥"fÃó¼~(9”¬¢ƒÌéÉ¢ÄA°’ဥHÅ~3€X1ÀQ×B©X1PLJ¥ýaVP¡¡ ”ëé3)2xß.i]3X†¡P<ê ‡Á@Ôk]¡=°”Ä2m£$³R fVý®>¸AÀJ4š%ük2ôÿûõçÿë•Ib€ÏøÊNt¦VoŸùW_¯ OÄ„6ÏdXÚo%cžˆøB‚4j«1KrŽJ®§B€9s$Ì{ëm”‚biô‹ÁÚ=£ÿž 9–œ¯B°RZ¢cJ1”TH˜>¹¦  ƒÚ«Wûíî¿}õ;¿ÿï'¦œp¨Õjá3Ÿù æçç£ ¥Dé÷ûÙÓèÖab8B)…Ù;ƒ?½!(i¬É È<ÎÌèFƒlßGÅDïTðØ¡¡*ž~ Èâ¡ëUÊdy[»'Çð†/°ˆËaoùò'žÿ¿ý¶Ëþ6Ï À!øüç?S§N¥ND)ØûtÂèû„…Çu¢]Ó¾§ÞN¿–½/ï¿}o!˜Bc²OÿnŸ£‰}o½ßQ{ 3€’ø;ÿúO°B1®ÐÏbý·ì:<”|ùð‡?Œ™™!Œw ï“Gx»]2ÈB(¥Œvɽ“6úuôO5ILÓ̰q<µÓJÇìkÛ¦F×qýÚRJ£_J)xž‡Ù)€cÍ븶R‡ßZ3°Á‹K;a¶Ëu[¤”Qìcöþä­V3SÅ6ÒÅžçT»ÕNÿn3cBý¸Í8D”^S¿VrO"‚”2#ýIÝ®1ÂLöõó´ÕC܇§ÿèYÌ{Âo ” “ÀéöÊ+¯àÁ,T£y*úý¾SZ]纨è^y_dŠ\Œ¥›(×s”™›é’~¸žÍ>ïèá½µ) ×. ¹tHP0 p(áÞ¯}ík8zô¨s ò°Èv'Ò¤Ÿ«ÛP]ÚtUkK´~—¯“h&Ýléí‰G쨷"Gµ¿jOw`fggñꫯâ‹_ü">ùÉO¢Ñhj€2IuÙn tu©ªkðóˆV$ÑeŽ¥ËþÛš"OÊóÆÀ¥ ìë,̵°9ôÀ2bŒb"LÀÚÚNž<‰_|O=õæææJÕ¡=hÓÓÓé÷aü8„ðR;¯´8?/ž•2€R àÕ§²8?ìR*4~{õ„ F’õ0PJÂݟép•¦Õç‚€Z} *€Y„€``0, ê-p½¾# °]àËþ!ø¾»îº óóóð³’éuTJÀ$#X1‚|˜À`HõU*…ŠÚ±~}מ3Á-dh UÔf³½Ž3/?7\_Ûø{g¾ó{< Ífa¦ÄÍs–t'+#¤ÌhLÏâw¾þ [¯^qaE¦#óð5ì›Tã×C¼~MF2ðàè+å\ßxt2N3Îa x:¾ÏCÃÅ8¿¢ÐFÉðUÀ9Ï–3è4ÚË<úIÚ³ÚEöÏ ¼ý³§®žyãô=gþôwÚ»eŒ¾ ‡C!Ðh4 -à"Àp8LŸä“0Ç0 ñ?ïâ¯üÒ4NðqáF€+íˆ ž<âM¡Õ8¾ÏÇ›×\Q>§­KÀéË©£æ·/zøÅ»ú'a”w„‹ûbl÷öÝ{êÀýµ¹ß8ó§øêV (nF†I)•j‚DÝK)Ó}ajßnò0TÀ÷^ëc(§N6ÑjD]„ŒgΠbIyäxž°Ç‡F"ó§y´ºª$B?Î]|ܵßˈgæúé¸/Ú ûb$ë®·ænÿ•Úvhµ]PEj~ˆÕð®cç¯ÝWxòt5ÀbKàñ{éPž¾à|ìÝ‚gU:Ð2–7#þ?8+¢¼ÿv¤;‡àyl•üò¶I³ÓU³~. ÛN8í÷óoqi%ćŽ7°w&êúÙ+Ú=Ï#¼ïpm,‚Û×'Ê'¸‹ —VBHø°w†n Á3®Q{¢4ÀVR¿Fž;†ð̹V{ §N41]'(^8€8q°†©ºSº·î¡ \Ýf=ø4†ý. 8wÍV¡ŠÁq¤?qóCLÂÓgP*Ž |ÂÅU‰+ï;TSoÏC¿Þ! °4# ¶ª/òbÚe°› n…øzòÃy®ð ¤0ž>;ÀLSàCÇ£Èà…ó˜¢Ø|ºF…ö{'=tÅŒw×¢hdï,Á÷n:Á~ ] eÕºJ ãeö{­«ðÌÙŽîñðKGjXë(¼u=„'€ûn«W'øxè}Ææá ¥–wS ncÛÝnš¨G®ˆ Øoå"ûûã·†xàH ·/ÕðòÅaܹ×C«NÕ¾CÛ•µ(¡³ØŠPB·Ã6Á©ÐL[*ëçºêñª†ê8@©Ãì[7$^:àÑã5LÕ ¯] !ÜwÈ¿¥!Y?ˆ´Rê T v!Ásùf«`ö-HmÕög´I“ìžW/‡˜›xüî:¾wf€cK>n_òðÚÕÝAÓ·-Öpd±ŽÛöÔ°§åaOËG£FhÖd’Ñ2V;!Ö:—V\X pu=H³|×7óS{¦åNä°VMîÐ õ=MR½Ýd€ÒP'|Y=]ÚNx +ŸçÞâñ{xäÎ:^»à—Ôpò ßÉ"¥:á¡Û§ð+Ǧqâð(ÑTmk¿:…Ó—úxé|/½ÓÇj‡±Ð",M \ßä1 înTøü]1œp_/Û¶kû ™(pÑ(þ£7|ôD ûfV»Œ£{|œ½ª"ÜÀþ9{`ºw&5wk5>p|8>Þñ“7»8ónRË]™–ìÁ­çÆì¬œ— ´'‰”MÎHÀbçmdüð\€ž¨£ÝW bœ8(ðúUà/à#'g *{o¨ðîjˆËkn´C4j„™¦‡Ã 5ܱ·?ª?ÙÂã'[xåBÿó'¸´VVç•n]æÿÙþ͉ԶôW)ã6L•Ü5ý€ñã7‡xüî:¤b.„(÷Ð ÔéZxá‚ÄçžXÄݧâù~n³Ó(|ë¥ <ýj¡d·®Ñ~„Šñóó=üü|Gkøôc{p׺±ZMŸûؾû‹6¾ñÜzj N•ø=Ù6w›*ƒ@y’¼ v1OÝ'|ú±%Ý9lž!C€ó7ü§oßÀº=I³¢‡~q%Äï~ó:>öÀ þƯÎCOJf<üúûf°ÖÇŸZA(y,é¦¢ð… ·K³›’ °A <[ŸË<ž·e Ýóÿôã{qòp¡‚xˆjžy¿³—øÝ?¿¿R žÌ<ù‹M|á»Ë°gk%¿8:…üÑÅ(m\ å!–0€˜‡»Íש3´5 ýÓ-à¾ÃÍô÷PF¥Ù‰€k!¾ð½åÈ,T&x^r'Ú^¹ØÇ—ž^1ÎUÉzqÃoŸÂßüà|9ÁmbSžˆÞDj€q˜Ày®ð·„¡?xd 99“96 #BÔ¼hŽÁ—žZF/ ‹Nw!|/¿ÓÇw_Ù4Ž(ŽÎO˜à‰ûfðàÑf1Áo æw 5@Q)Xžê×CG!¼±1tAÀ§]ÈåÒ@FZàÜÕ.,•Ž‚âçÒ.óÍŸµ±Ú Ì#ÑÉ5óÑÔ|±5‚“>ÖÛËÜ”\@Õ°¯è¢ÖCÿSØ?ŸïÓ†ñä‘noˆ™†ØÁ)Kð 2¾ýóMÃp%Z yüÅ–‡_»wz §ê¡ñn˜€*ià*É !ü±R¢àƒÇ§K;H Q#@žp¶ó¼R‚ëND8©9~y›TŒcû£YEöbµœ¯Î·ê¡Bƹ+f*Ñɉæ|ÞS—àvšy°Û TŪ®¿£…VõÐ÷ÎFÙ»*ÛtÃÇ÷/ Õî=èOðŠú[×Íõ\ZàÞC\‚çס¨š( P&ýya`¦Sž7–‡>?-J ­Žžý Üs°…†Žî¡ñ^Ña»¶‘ÍB*6æâ æ³äG<á0£=1 UY¬!Ë,ÞXº¯‹U×*”ÀýG§±9`ì›ö¶hgB2Mwœë0%Ým w9:*¬îPl¸£%ae5UÀ ÄÇC_í¨J#’´`f§|ÞãáÜ Â±½Ó ‘«Î·â¡’£¥Oÿö=wÍw!Áõ̉ÔUo*fo,ýF;Ć…ç—1Bûf ¯_U8q¨{åÅ'U¶©:9;¢´ß¨±ž †É '†Õ¯Ïõ4þ'ùƒŠ:øÙ;½±P³K+!ί0Í\\eܳ_À¶&UîrØ.ø¹á8"Xëȱž7v›ÆšPšJQAììÉW6K—fÕ·ÞîáÊz´tìí‹„¨¼ûνb¤a*ÜõãîÜ{'ZàÂòp,‚Û¹(ÝÝf€N J`ìåeá¶Ã¶ÜQøÑëÕr#×6BüàLLÀÛËŒ¥iÂ\ƒpi Ä88?>Áu‡­U8y¨^؇^À¸¶ŽEð춯Ào \¶>€]N!ã‡dßx~ïÜ(ήt$¾ðä*‚0’¸õ>°ÒîXІâÍeÂâ´ÀÂ4mÙCÿЉ)x^±!úËs}„J¡îCðŒ¸1ÑÉ ")Ïs Ppѯ8ÿñ/–ñôéNÆ ß(|ó¥6þÝÿºŽëmÓw:¿Â˜ª1öÏF)çn(žšõñ=ôFp*æML€ž9ÓÁ $4ëÎ…MPqÒè¶—ŠÛÑ’°<§.ëqqÈèùÁ«q`$Ñþäù üqt±†éºÀZWââJ­Ð¿ $pµM¸mXíF9ƒó«À±%Âס•ŠyJTøÇœÁÜT±\={¶‹m !€ù&à T%5On 1ØmȨð²…!DNY®Ñ&^"¦ Áó¶AÀ8wuh´ ‚½´ÆXl‡ç «@w\]gܱHxsÙ1¡Åqïƒó>>z_±ô·{ ßz¹¡’*šYܨá p.Œ“áøÿ•dÍ$y¸AÞ1ÆÄMÚ¾‡îR©ÌÀÅUÂÞÅð¬õvŸqdŽAŒB‡MàïþÚ\nÉxõÙ ô†œÞwêè\ûÜŸˆyb (éSædœÄ¤,\#öNÜe¿W:QXxÛkóÿ#c»w– =ô¿öð,Ž.Õ QÈo¿ÜÁ¹+C£k’C 4¼|‚ç£[b×@v9€EAöªÛn&ðÆ$8m‰àæØF÷¿° Ì4€ù©’÷î:0Óf›nýƒÇ§ðÑû¦ ÃÖÞîã;¯tœ>ê>¥éé"ow§KÄÄÍþ¢Ü@™ý·M@5‚ckwHY/®o/^¼Ø¸´ 쟦jæEïØ[ǧ+„Ï^âÔçÜ[qT±TóÉÑÏüt8ñîAœgÿ‹²ùY@=ŒÜ9‚–”eü àZ›fœåô@¨—V ‡æ_D6|Ï´À?:5¿`O¿;Ä—¿¿¥`ÞÛêç êÄ(© Ò@ &NŒSý›g„ç—ªóí`è™ñ´æH¼»NXl¦ë£S†¸Ñ!šfö‰…Âïå C|ùûëÆåçEê\q´Óù·«ÓˆxדAÒ•*Ë ¸^¢`¯TuI—-¼àÒî=àðCˆ7@? ü“Ss¸mO~ýó=|å‡ëÑ«î¨Ð¥{Šàû(œ`éßÉHóv0×Ë–ì6~}ºÄÚy‚»‚‡Ë€}3dø>9‹{5ÌÌ¡ê}ã'›øÆO6ÓÜî*dJ¸”ÑÓä™”L*ÜÛ>ív ¬²4l8XøõŒÃV åc(ã#liªSW6n[`lö ½¸÷`99•Î6J0„$ÁóÕnàÌå¡{y‹²)*b:‰ò £s{· 0縤ßdžòÙÁùã²u‚»˜­Ý>çW7~óÑÙ´E ѢÖÿåéu\Y—ÎV]ôAJ ^B˜‹‡€ÉWÁy’]ºTkÞrò.$°¢to—à®s®´ Ç¿ýH {Z¦~–Š°Ò ñûß]ÇJW¿€£qÈ€GÑÿÂÇPr81À• ¨ :µˆç•®àÜ[C¯rY²²w!{xøØ“!™Ë›ðô:š¾D-'©SFðŒg­€šp.Âh:p„ÞÄ0@ô›·F H×¢—î wùõûgÀˆ0€PELÐ*üÁÓë¸ÑVhÖ€¥áú&´¬cuuyWE¯ÓQ\µŸ»l\h Kú]ëe®#|ÃCß ‚ë nÛãã# (Áð#„?úq7â÷ 6K-`¹K¥ö;gh‚ˆAœßSµ>1 0ÞÌŸüÊàÈ”xÆŠíªóJÞBÃöØÝÍ‘ãÇ€OÀOßîáÕKÑÿ^­²0-SÃcܾ·T„º UEsÛt»iËÅç1C‘–ÐW©¼¬j.Ö_ Ruc£­î>ÖÔ4a¥£ðü›˜rÔ}n£w Î5y‹‹>˜˜BÑ:Æ^mЛ°Ã<»â'oeð<&IÞz3N%7˜¿|G#³¦à·^îbµ,M+xŽù‹ý(³7ÝÀø3Œ¬9E€W-hìz;3H-œ-ñy¯†J~!2Îû·’½ï°YÝ{y=Ä o @ 4|ÆÞÆõ6Gk}ÂB“Z”a,w9²7wùºiôƒPNŒÐÑÀ"įÊ‘¢¤IHµC×$ÜXÀFÚp·µÜÎôÀ (ntê0;ÅÎ~nô _¡é³£ËåÅ.@Þ+¢/ÿy›‹DÞ”0°ŒØö¾y„²p [uœ`´Ý±TC³6:·7d¼t>HUz( ËÂbK!ÑŠáÆ³°1˜kF߇!U»?U×y–áÿùûn=Ámýö½5£Á‹oâuþF[?Ú}Ââ㺊°|½Ì@»Ç˜i2˜)]¶®ÀªÑö‰¼i@P‘‹–ˆ!2_‡Q™à[\ŠÂ188oBÒ¿¸8t^¬=$Ô|`išq½CðF°Ùfš A„¡ÜÁ3€áNÐî¦Í Ò ¬;‚eï +<Úªý.ôº+® 3À0d¼½ä†d«½#˜Ÿb§ýf"l£ àš—utò_ç¢Ùd­Î²[ Àyöܶ÷É›ÄÇ©¾Õ··}s^ÚîÜÕJ8mLXëE/škªŒÃ˜ aðÔ<“àö½©; &€ÇµÿBg. ãí¨J§1.F øñÿÅYê°I&lô ó ‰P½ÀUÕLÕ F(©:¤msî$ù®0°t%<© ÎÝ"ÁK NZ sß•uYÉC†À& ÌÔŠ Ã0ÛŒ1G³Æsr!æ ª Öm{柇¸ `{àm=/$#¶½ÂØC§¬h'MÌÐOŠ’”Àà0#%»oªÌöÍCüòþ³‘(–ªÀ‘¦5mi¬0Tí¥m“K)Íþ±ÁkçAÿ¶W K$ Å ¥tiWQœG‘JOÞ)£D&ñS ÖlÉŸæ‘Pý‰ÒU†È›(j¦…ㇷ…9Yóuï?•&•ý™ìx0úÙ¬ ˆq…)nުǑ QFºÉfŒÄ£çhÎ?Å!+³Ããל}²©˜¢ÉÈÞ5?Àýfó#x4±³ˆLˆl-ŸÕ¦†ÈúôIÛþP"›y/øãs׺ ™¤OBƒ†)“Á3ÂE[¹-¤e­¥>×(ݯXM„ (}\ŽŸRªd&‘0Ôtâm3"Mš„ˆ¦IˆÕ.›a§æ#ùJàʚ̧rÁvmCŽÂDµ+ÍùÓ#©q›4Û¤°Šò Í1L/(pÔ v& ´kl•oÿ®Õj¥•ÁÌYè7K86`a¨Î4fà|ß‹­¾¿|a€C Óc1ÁzOáݵÐÒ6:Šëè?HRé¶¡e§&ÓÐKfˆšG¯ЦˆÙ }©y=s—Â!e=Ô³5œzÝq=IDATê¨mlFRíƳg»Ä;Æöôé.¤ä(i¥K7Gò!Fì©K8¸‚_;¼4ÂRH¯=q På]Aùj_gн~F†¶ÆÀŽb•AÅD1boÓ„°ÒH¡í®Ä×ÿr#K¯púÝa´N@ê“ð({ M•³ òèŒ /H™BÇ5`™ä·…jbLÀ8¯‰¯´~ yVÎÙ¼&.O[¦éTÖìiÒ“æ”ÔhA ðÂ[QTõ·>8‡©:9™@1ðìÙþìÅM¨xš¸±²™Ð ÕF‡YO#°œÖ´¦Ìam2à9Ýæ»4€ýÝŽ2¦I^#`Mµrr@#›FDŒ,Ù·r1ïϸ—5k”eL¶g')÷Œå<³âÖtñE¤3ÛÆ¼)¥ì+¥š‰èŒí5§ÏÅ †¬#˜I°äÅÖp„e¹h\^î`T³Å0c1Ó“‡Óo`‹AÈ¢ò(—Áa÷i$ílÙ>a<êwdL;…â öm3Åw÷¬Ðö )å;RÊz¨K¾KäI¿çy&¨ƒg©ˆÈÆŒ"Ê‘QVv8žvÞA/ÕÒ¦‚e˜†K®muŸ8›ULú×_¹8÷\ÆeýÖ÷sÈ#¶çØoü‡§Ðíº J´‚çy†chÌ'Ц…qÆÒÇf!7ÖÏWÙ¦ÏÇÙ,œÍ¶ïæôI4Ï€MÜžÓ„ÜS×l{5ªŠ:Þ[¿Œî•ÓgÌ;^ö;þFx¿€Š˜Ácæou:¿îûÑâz¶÷¯;a¦f"¿!Ù†›Ëäx~«°ðU›TPãï~6¦Ž¡äínÆ!”Ý3ñw¤æ}ºÛr ³ü‚õ+í7~ð¥ Y@\YòIÛøšRS–’Ó÷ÙûØsNç·Ã0ül³ÙܧÙü!3³¦xuuõÆ`0XB’RR¬ö“´r¨”’ó¯üù>†(öveµªh†* ™¼Z3?r§œØCw<• áxÁ›½¶M‚€Fó:ýÚ”J'#º¸QO Ȱïûõ—^ú³ÿðoöšÊWš©‚ãzÎ[šÒ‹5‚-ñy¦@TØ'ôÉJ´Vý^´Ïõ?Ov©ºEvZò¢ÿeûŠ¾ë¿•ÃÆË ûòÚ„ñ®2®Mhß"tÕïU?ãw«/W ã1D&Qc~äßCëÜJaÜNnºdÛDµJ¾“ã{Ѿ*¢Ê3—Ó%µºj-Ú§lœóÝ&°K•ïÁ&qËSûeD§(c†q¤šsT6—ÇÎ#ùÛßþ/âÓÔ2©YIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/list-add.png000066400000000000000000000242071323166163100232440ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœíy”%W}ß?¿[oëez¦G3-HBZ@ ‰ cy9‹^°pŽ}’ò‘×ä$çx3˜8ÈÇŽMl“`lbì`;€à%d6À ’ìÑ2B+£]3Óݯ»ß{Uuùã.u«Þë™–hÍøÙó;§^Õ«ºUuïý}ËýÝ¥à¢StŠNÑ):EÿINvž)ºòϾB2}­ /¸DDEè ‚ˆ àö·wç"rXà.ƒ|Êfå‡ÿê÷Þz²ËôLÐ?-ìÃ<ÿ’3~x{oç›_°ëE.öv1*×ylýa[˜'‡3,×kÌ—qæ3×ÞÆ®Þéœ>s&»zgÐÉ:¬KÝqä+o½ä3Ÿ{ï¾}Ø“]Ô­¢2¸âg½$“ì7_sá^þ¢Ó_ÊJ¾Ì“ƒÇ9<|œÃÃ'Ü~ð¯~K™0¿‚1Ðɺœ1{6»º§³³»‹ÝÝììíb±»‹™Ö_}òoîûÄÃòú}ן?ÙeÞ ÊNv¶‚.ûý=oÚÑ[üÃ_ô[g½øŒo °…-(µ¤°9…-)mÁ‘áXUD=Q‰’Б{fÎb¡³“mEÚÛYè,²­½ƒ½Ó¹ê´ï¸haï¿1ßóÈã·üÎý_>i…Þ"šz<ïwwÿÒ™sg¿ó]/ý½ìÊÝWSÚœRKò2§$ ÀjAi Zû:¨ÅsÞ=Ä¡Œž5w ílï,²ÐÞÁBÛí·u.Ýq…œ?{é«F×Ý?ûÕß¹÷'±øß0M5.}ß®7-ôßùŸ®|gÍCKZt[=J[PªÓE9ŠZ`½ðÀÊ׈–O¼ hUž³ð\ÇüÎ" lkï`»× íEÖ‹UD ;;»_,×=òØm¿÷àÔjs²3ðtéâ÷ï~i+ë¾ëõ—ü;fZ³¬ Ò­‘Ñ3³Ìfs̶æ™kmc.s{PP·Ã‚*¨*ÖVûÂZPa&›g&›e.›g6›c&›c6›GUYÍWX+VØÙ9—ùêw½æÏ/éI®Ž§MÓ €} û›ß¼ç[;³fŽþp™~Þgy´Äòp™ù¶cølk޹Ö<³~+Ê XU, ¨${¥°%sžá½ÌÝ;ãÕÏ—Ý6Zfµè³£uZvÉöçÿ¯}û¦³.§2Ó½óGNëíÙ{ÆÌÙ,WX-³<\ŠŒCfZ³QòçZóÌeÛ<ç2Ç¶Ž‚Q9`&Ça6›cuÔgu´Âj¾ßÕÏûì™9뢇^þŠëOj¥‹•á2Ó£—ué·µ¥CÛt8­·›ùÖ6FvĶÎv.Þù<ÎX8‹W¿‰ßÊûïÌ··qZçtòrĬqê?3mV†OÒÏ—YÍû¬æ}úù «ù2«Ã>Ýlîg€›Nx]|ƒ4u8ïî¾²Óê\˜—CVòº¦GW:´¥MGºn3=:Òe¡·ƒ] »1bÈpö޳p¢~<Úô(µdym‰ž™ufÆ«}§ VG+¬}òrxî+?véÞ¿êŽÛžé:ØJš:˜²ü ¬ WèxæwL‡®éÒÉzQ,t˜™e]—8R<¡Ñí)"×Á¦ÞÓ13<·w Ïš¿Œþš³û«Å ý‘cz?_a-_¡_¬°Z¸s…µß œÀ3J/[Ë×Xn9õß5=·Ïfè˜.]Ó¥7ê±s~'}{˜‡óƒ|‘BGOé5ëv•¿[û3ºfŽm=¬-õY.;ÁX¡Ÿ÷ݹ¼Ö^ ¼í™)ø3CSçšÂ\¼­½þ°Ïj¾ì˜’;GÐ9ƒËlë-Ðɺ<2º‡kŸcX)­>­íÀÚçhgm–Ë£<1x4jþhÙ;„}Ö —E.:ÙõóTiê4@©åŽNÖcY®Ð6]ºƒ.éxsÐe[w;C]ãŽõ¿¡°ù7ô¾#Å#ŒtCk÷óßo{;Ýl†¹öé"J-X/WɤM¡£Å-*æ £©€¢½£ëG¥?ZaTYå±õGÙÞÙÎÎÞ.^~þw0´}Eÿ~_ÁKÁi3§£†ºÎ°` neA„™oø…'˜¦%ä2Š]·ÃrĨ±4<Ê!¾·ÿCì^ÜA©›ñø7ñN7°¨ë8Ū`Ä„4š4*§‡¦)Æø >ˆ Ö‚Bas¬ÝXJwPRóšQÅ™ÊASUõZÀý={!–R·ˆ%šìüûø XED<·p'’¦¡?'î4UꙂ¢ª[‹õïu&€:Œ†´ÑÔÀZœÔ㫼:;vìVù¨g2¨x) ŒœÒ'Œ|å«¥R ( tïnPÏXëÇëÞ/ˆsþŒ¸N¦éSÓ \Pj^·ú¶V¤/Oµ¾%´’9eNE¦ŠSÇÞ&‹ºÿ¢Ž [m@=øÀÙ„Ø2P{ Ï8[œjýÀç`šÃÀ»EN ª&MNE­$~±e fú‚S€ª7WѤ9¤Ò5 ÔnU+@ƒ_‚g~t?Å«´ÂtÑÔ ªád@oôýªÓ¨²…N uZeÌÑKÀ‡w§Œ¦¨—À&÷I}ݺPpxzö¯¼RĹ²5ï;‘4uHã>uþ;† ÕÈßc†‚§­“[ƒ/¡!Ð¤Šµ¾€·FÉNµNÙŠ êC±a_¨~ï³£A'?¾$÷Äñ¢)ðâ•Êþo‘Å9¡4uHµzš4 ›4ˆ¿/umKÔ„cj~¶âE'ž¦à»^E•L*ˆÇl<e`Ã,‚ b‡Peq¤„é¡©@ôÄ5ô;¨g€4BÁM–T2ºYfŸ"IóàÌhÒ,œ2š>øJeû¡2©‰ˆ8Mæ„ñ›z¡Óañ½¾ýŸŽª<Õ xæ)´$´ËR‡  | æ¬9z*¼¯Þ9îK(>ixøT(øPhò5¤ºf‹`+X¢‰YÁû¦¦…&hƒ)¡©@Œû§Ò- 3´ž¸&ì2ñðøïôê_}+,Lô@ŸFN2MbÇKˆÕ˜Z9Îh’DÆTøæ_©”ZÆV@úÐQoú0uÝ2’¶Á£j&òYI„l î›ÑNè5anc J`¾u!âi£©@肚Ýcž žÂ‚¹©Î;%F+ Òhä? ðÁ~°sÕUW]ü‘C¹ú3~æ¥w/ݽ÷ñþcç.åK £Ñ¨ël³$ ñ“'üýñX%‰çK\´)¤!NºÀ׳x>7¤ŸàjM¤]þd &ÓÆ…irbÁ!L{ƒä;GðÊ÷œ©qÉ9?yĈ`Œ+¹_–tb‰ĸ%wLœ÷ Æ`Âz†Æí»­Þ`¶5·´Ø9íþ³æÏÿêU{^ôéo?ó¿Ü#"Åæ8éhÓ¸ì²Ë:ïÿƒ÷¿à³+Ÿ}ÓÛo{û+[}lÏÊp…ÌdÌuÜÒ)G󣶈Q1g‚ƒÍöuæ…'SÕeá#iâU H¤>ÕÂé¼&Ã¥ B&P#¶ : MAãmq­Ð,4Š X+ã'”¤aäà¸ú³¨pb{æ+H­’e-ºÒëuÍL1{Ž ¿úó}êMßúð% —ÿéHû7udþ–Íð6sà 7Ì^óÆk~æãG>þ†‡ûïQ”^«G^ää&'ÏrЬŽ&‚ é+.iJK$•Øž×d‘¦àñ5¯±³'¤KPä÷Íf¡ÆÐ-ÔæìLböq4·jó£)â4 ®þ­ÑCLT ‹µÆ!‹@©Ê¬¡|X¬T…vÖ£mº´¤C[ºt¤–öÌV^ÿÑû?ðÝûýä»_xúµ7ŠÈq'FæÆoܶû;vßthýÐäšg½V¼tLÏ[9y™SØ‚¼ÌÑRcƃíueó]µ0(ÊäTBËHów©)hzš±g%¦ Y05-[Á×Iµ@ðq4u$Õûδ¤CË8 Ë#»Nn‡ävÈ#k÷ÿÇÿq×[÷šT¶‰Ñë[¹eîÐò¡w¬çë­ÁhÀ 0ÈÝ6*FÌ´fèµznŸõèe= [T†R‰€ˆRìrL“j«Õ’m$C°5ÞVv\äÑë•ð‚8ƒÇ1? çv·iÕ4Ô0^hs›[jÖV™±UBS3î}~ÔjòÞªÈî16¶t4Û3­Ê«Ë¥/mY©|¯ö»Òu¾˜uÓås;bd‡Œì õØà¡Ò/Ïn7üå o\-]¸ž¯3,‡‘ùƒÂm™dó[næÃ„ù¡’fû‡sšž§y>08TÌ kúŵý0ø{J[RjÆ™ž,Ø¸çØ›UM@Åð ñ¬60;é;[(h(³ViB·u¢üI7´ß:¤Sùmã|Ä0*ŒÊ¡gþ€‘Ž–Vó•‹ß{ëo¾a¯ÇL€ªfÏþgÿÔL{†-ÚÒŽû`Ú¦M¯íZ‚°÷Œ½¼èœ‘—yÅtOuõ˜xà•Æ›|½ÊOõW»2áÜ+Ÿw·÷¿R™€pE?¤ñ¢Ì…|çE¯bu´ïm>#ä#d'æKBþÝMa=Âúž¸l}UÖFZqÏp¸È0]{ÈÛþ…1´Ã õŒtDnÎèLJ+?üF³|cåÞõk»®ÒBÿv¾=϶Î6·µýÖuûùî< Î[ kUî+¹íÈßr÷ò5¦„"oÄìI¶àÂm—²wñd’ùèÁˆÁø½`È$ CFæ#xƒ»/·6w&-!ŒiÝ^DÈ|ÚñœÖÿµM‡þh…ÛŸü­?Ì \c¤ë ì:C»ÊÀ®3²ë uA¹ÊˆëöÈÞ÷¿øÖ¿OË8¦÷_×kõ*©§]í½h™츀W^ú î:z€ß÷a\y€¡Œ×¤l°OŽ+ä§ŽZÕ ”䨥O+#|ð¡:{urs<†4SmL—oçàò÷Gk»Êæ'é«ÔÇZ¿¯:Vß|zÙ F2zÆñ¢›u8gþ|®Þó­Üþøí¼ãSïäU½šÿð­?Í—ûË«G*  #rœë0ú*Ù÷ÇÀlgöÚµÑZdx[ÜÖRo¤E×t¹ö9/ç¶'¿ÂÜù»™\—›5§áüäNÆM¿òçцjõ×’ö¡šJ!]¸âÃБEãr>É$$—Ó]eMÐúùpF‰K€ÆøDjëÃ}*áõ÷TO]-WAaE—9kîY|Ë/C­ðæ¿z vç_‚…xôýaŸŸ~ñó@ÿ.F^寢YpÀèµÀÛÓâÀˆ¹8ÓŒA1 M¢¤ÍºY§eZ\uæUÌvføÈßÿ1GÖO–ò´íÞh¦iŸ.ðõXEhvIÂüœo’6{Oñ-°I1ckš–5œ3ÒI¢èÐÆKãkÏ×*½ \°ð¾eÏ5Œòœw}ñ&þòà'Æêô=_zo|á8cöî\º…a9 ×#9§P]sP0X[\Ü,ÛVóÕ(î‹EÉúhål™¹Öóíy¶u·±xÉ"¯âÁþýãµµÙÆµO[õžÑq€•ª×ô8Q÷*ÁP4€ „š§z_šÏ †ŽVw{¦µóá8J°ÛîÑ?‘ºÖÐDêã½-iñ¼ÅËyá®oáèp‰ÿ¶ÿ7øw2‰\ÏJ©%_xà œÆi<±þ(C]c¨ëäv@Áˆ’«–V–°³Y¾1”EÙó¹v_Ü( Vu•'Ë'] ßwÙ÷±4Xª¦^¥?I¤¨mh!‘xÏ—Ð¥¤?H»‹‰$’;‚ˆÇ®†Ó4Ô¼@÷ê*£)ou;F©ä§ªµ& 7J´&šÀÛûT{KÜ(óRýÔ|˜% Ѷ†ëTê—º“8™*æÕÏRi™_gtKhK‡½§]Éå;ŸÏ|{;Ÿþúͼãsïä®Ãwo\·€¢”©"áÝ’öžŽ?ncl\”Z2,G..-É=DzõŒ§/Ñš¨WY•IHÕƒë0Á/ÖHå4^|€Z‡D£‹9˜Œ˜ö¸ò_½)Ox¦V‡5Ƈk©‡Îüù|Óâ\¼ãy<°|¸ý|èÎ0(î‹f¡ “ês‚(µÄjMTýÍ‹0 ÅÇîÒŸîÕÍ»w.Ǩ´ _;ŸH~MúIÀ†—ªŒ†ÊW‰î_RWc:£–PÄæ¹IÕPûŸ”-5•òTÿ\áümqÉöË8ÛsÈË‚¿yøsü×/ý*w{iwŒO›»:Îô Ȫ[QC-Vp<޽ @CÝÕ‚†Þ¶²BùS¥&W´bzªâà‹d ªšÃ£ ’çz'OB1 Þˆ—¤2ÞÔ\„$ƒUÁc6år‘ަF•–isáüÅ\´ýRΛ¿µb¯<þeþàÀÿfÿÃû)¬ Ê²Z@›ñbßUJÈpªA›Åd3 Ý{PXë÷”×àI2>fóÃHM4A¬‰ö=œ—„ãÓFðÙNÏŽÿ¯r²QÁg+{Ѩ—‡Ý]œ7!çÌϳæÎcix”[žø;Þ÷ïå¶Ço¡ L—P­Ê5žÖ»¿õ6‰J[:sÜ4’ì©òžÒñ}mü·qVíd ° •¦Þxö©Ô4a=S“•{z8®M!ÐĬŒÝ}ìbÔ<…¹öçÍ]À³æžÍY³çÒ6ìßËm…ß¾õ]Ü}ô®D½ƒ‘jô“HµðtX{Òå/@uó+µtó´µQ‡ðL@ ¥Îü临åñ}€cd:e]º)Á1lì'<0ȺŒUÖºrl”Jâ1$Z)ÚÎô‘^µoï,rFïlΞ;3gÎa®=ÏC«ppé>rÏ9ðÄß3²#×ó¨ éöå0¾9kjËÚi’«Ê¬5–;Ølªk²QBž– ˆP߬µØ0êfì¥cÇI!ƒÌ§j=ªz¿wCë$q½*—ñó¡ÐaJš ½£`¾K=›AClkogOïLvÏœÉiÝ=ìêífXydí!­ÜÇ'ø(ž¼Ü¬NþŒ¸UÃkýìâÍNjÆR ¢u?¦É² Àà´±c 5ù5“´Nj½Û± ’ñ¿Ò8®6‰‰5SURUYeºŠ*z)òçÆ›„îZ;ë°£}‹Ý,vv³»·‡ÅîiŒÊ!®=Ä¡µûÙÿèg¹géNVFKî^#XŸãßîïÞcƒvò 3HÄ©í@h,ñ¬3<…ñ®©YuˆE§:üÙ” @o÷Y8¼v˜õÁ™,õ—™éôh·ÛãMÓÿÉùšŠkhˆ˜y=k‚·4‘NƒvtOc±³ÈöÎ"Û;;Yho'“ŒÜæ>ÉáÑã|íȾ°þW<°zÃ2ùº˜¤1N}„ÎÁS%J}ˆØ:æW=••Ý'i•$àŽÒ_Äf0Óî±2:šd×e2]ÏÐ?e½yï$ p8³)õi³ðÀÃxÉE/áË÷ÜŠÅ’µ2fº=zí.½nN»M·Ý¡Ýj3ÓîÑiuhw»d"X[F/¼êáóö‘º‰jTÄK[0 Š‘Œ™l†ÙÖ,3íð‰ØYf[sÞfŸßé©A¹ÆjÞçà‘<±þ(1*‡„.è WBžjëþJ¥=ó•ުúS ¢VrŠÍ;d #ßÄõfØŸ™ŒK÷\Äþ#õʺi’·›÷@¹8sâÛ¼9Øï~~è?Äu—^LJïø0eYÒ¬Ò®Â*Õ„‡”“Y–1Û™¡ÛêÐmw˜mÍ2ß™AQZ&£—u)(˜Éz´L›™VÏ ¸ð£eZ&£--÷, ëëÃ5lù0kå*ýb…•áŠS°Ü  ©¦W‰xFHr¯•KÊlÅ9pI_¤¨‚ä§¶?h/ñщ•D+DÍ5õÌñw_òjÈ\:@X*/Œ ®d?úw§€—×JÖhî—¶äÝ7¿›Ÿ}ÕÏÒmwùÐíb´‰ïò•¶deاŸƒø9s ƒj›Œ²xܼ6ù\Êt‘ ÌÁ TÇ@\ˆ*Ôyþ¨£ÆX=pÿ)$Þ‘hÀc2|#Rèd^{ñkøþ+®ãcü.¥±,Á™uß60N#Ѐ忿£Æ¿Ë)¹…÷›ìÃæ=žËϺœ7^óFZÝ䨷CšÚ馗 >ÎÇ,l£IÆOLÓ6¤8HÞ#·pïÊ]5°4¥>Å3;VHr¬ÀyóÏáâí{]Ù’hŸBÒ¹£ÞPÔªŸœRõüÙÆæ&®TÿKëÏŽ­÷ /ý¢Âbo—í¾”™nÆ'ý_î[986ÁÔ˜0™Ô Æ9¡FuëöÚˆ É︓œ‹) ®n„nÖ劳¯àÂÝÒÉ:5”>UJX0®Ž£ŸÆË«;Eª{^rÑ5êÝ·ïýÀD­qLHòOÿòœ`×à9|ñ¾Ïù)_R¥“ˆúÿ¨Úas 'Éw(CõŒ¨™L•G7ñã‘Õ¹gù.,9cª2Eæ;PˆÆpן~çí—4ë|£8ÀAx_Ìø1š…Ã|Èþ{÷³ÿÞýõñíÍ}`ÚFÿ“Ê —ªs¾²ãåŠá±¢CbvÖæ¬ç.ÔM„·¸Be¢‰ @ýý(¨Zþö/òÇ·üaÅTã_gÒgÕ÷HãzìŸ÷Ú,ó瘟qe1Y’6Hp–š6ª4RuöÄjÁïˆùÅIŒž¼¬‘áýÀ­cçS¦ÖÆýSSSAÐLußB}¦ýxÕÆ}±ßxf¸7´ÕÔ dQ?j¸ÚRÆ3æ?H¢%2“h # êÛÙÁök½ü1•‰h†Éýé=Íÿõç5,ÔÞß%É;'eÈýüÝŸ~û0&`áǀʳ;Vfc ǺAšÒ6¬Éé(’§ç}jëmi”ùãSçpC'4ÙÜäÌjfPÕçŸfÓ4õú ¬JÆ P&eT{‡¦ïÑÚÎ9“ç*Œ,æ&G‚±°Ù/ñY„ŸH·Zéj¥œð¿¹M’þ Ñ$­Ž=S“óÉq¸Ý§³Ö÷'v´Ù*¨OÝG¨µ0ܸ¥úúÈX-&ùH1VOþ` ï‰ÄG %ž|½Î@ÒW'Ú ^Mî9*×ü»|±™í@Ç^ÙîF~xdžÒ<‰ž(ÝÒ6ÀPcp üT•®q¼µæ^]ú›1‚I[f܆T“S6*~³Œ“Š]©,·¯1Ä™ôåˆIkŒ&Æ â0°TBµŠý©åÿüw¼¯™”Ž¿´á¯ðsn@È«BL(iS¢'¢é'<…-­z?ÏP!™³Àâ¦PWc ƒ6‰o°qÂÄóPÍ œXŒç¡ºP‰ë†2ÑTýµ´“»ôÞœ¢ò „¡Uù·ñê»Þ:žÓ:mnmË_å&„ï@80VâZAÛFŽáFš#ÙG-vµëuU˜‚ˆ=•ÁŸ@ˆÍ¾Í¡Ä¡œq¥´¥}2ôsƒ¼×4SóžäÞTú7¬ÏøV¿÷¯ “JšÌÕ¯¢¼üß}ðw&^±böx« ø ¦v>ð@Ðà„gÕøï:`BÐS¼µ 2IDATåÁ7m¶™þQÓô­ZÓ(©p PIM@BA øŸºô· "üµÉRq"5±*Ž7hêŠHò? £sØý˜ÅÆ+I”ìÔ/hÆêÚ!ñH^©óñ1‡ÓAS¸Â=•×ïÒc€ê³±3$uS¿ÀH=Lìv©%•)jtÆ‘154•o6Æ»¥u& 6ÒÖÂP+Z˜y„•Ç« š\›š>¤ÍB¿¯·Š´2QCŒa&1«+H›’|ˆº¡æŸÊàÍŒ4}ð4^ßUKÁZ§®Y?¨–ˆc’ ‰œÃtQ0i¸9¼SÓÿ§|€E¾¢ÀÀW·¬›­Æ© ºè¸êŽa㨠*Ÿ¢©Iª›š'¦ƒ¦iX¸fÕ©.léwÜ`(V8¦Òu3QyuÆ7Ë4"O!‚'TCŦŒ¦®!þâc(Z0nòªŸ¢å[¢†R±êÃ;ê¥Û=ÏD Þú¾€tYÚF €bÊhú„IÓsÏÜèÂÏ],ýŠá%n•nQ÷YyQK© Ö_CC»IÂH‚ñÚ$ÌgHƒ€©bÓØœ>xŠÑ?¤Ž …ÒŽiV¥*¨­ A«O語©ž« @ƒ"¯VCñ`Ko’©3¤M'š²ï4³UKa#XMØ ûúcTÅß$ƒµŠ1Ö¯ ƒQîAJõ†N;m¦PL) ê òÓãÒ–ä6|ÀÂ%N™]k“8†‚±Jf±‚xC°–˜0¸Ö3I5ËgÚhzà+ßI}] Xµeé&XˆûÆg¦5U»z‡0ó 7Ö’ƒ›t9.ò‘ÿ}õq“ü‰ÎS(ý0ÍH)NŒÊœ¢´ÿù5Æ-Ê ŠƒU%³BiÜÞx„©c)C×óœ°ø—ÄùwÚTSEÓ €FÓ/u-–¼,)¬uL7‚UÈŒ85/ŠQ¡Çô±©cé³ÖÚC÷AŒ„ñÑö§<Ÿ>þO!6ªp©þ[kÉmAQ–c°*dá›}!Ưõ¿8H¤öXUX/F¨¦­…ʤá4†‚¦ ¨¶(ÿ"Z2, òÒbTýºn¤odº­æLœ Jîä9%• IŸNåïh:ã5ž4 ­ZFENnK25ØÀtÕ¤¯Ÿ(ùa1ˆŠ±U`_Öò‘–h™øeOIÆú5‘14}dŸnøh ¸!a£ŠÒb=ƒŒÆNõT?Ð4þA¬ç#? RF§€høSCÓظ¦%ô”äç6ì»IÔ}*ùÒxhì$RglŒHú:Piƒi£é@Sò…zŸ¦øV@¡¥­¤=ŽøaLê'á)ôü©ÄTQâ¥jÄ1æÓ§¦a6ß)ÀPh ¥ÓAÚSG¯âUÝ¡«,?q”‘¢ ŠœŽfU3P’Å©ÓüL!ýÓ@ú_ý—Èü7 ~É­¸Då7´:P ð ãü†eN‹ H šgŠÇ…M#F‰¦Ào¹Íiå-’>ÝP"(ŽEÉh ³Ì’Ëk,j-¥q«s €U$TtpŒ'þ£¤é€aá4`C Ë!Q§€I{ÿÇÆ—¹ýžÞé<»u.K­£¬k í€A1$—‘EVbµ@{zd KzBhúz²3_ؤ¾ò•œ™!.t•nÅ„ÿÅäãYf9ÏœKn ×Þ›Ö%z׉¨‚­¤é@‡O×ß`~Ø÷Wût‡]zÒCJÙ˜ÑÍÍ_“R˜a†o^¸šyæ\”Ñ?¿ÂúX€Ÿ.*ò×'²*¶‚¦Ïÿÿs¡‚³‚‚•þ ½^Ùö¬Öm6ç¤õ²Ïž6{¾‰vÙfy¸ä¦ •Ö]tó}+B0P¶äO¶¶°ÏýÑ «Å*kŃÒ}£7—œClf±&¿÷‰Ÿ_½àDVÃVÐôi€6¿Œå·jç6j¥ïÊÁú8€â$:Œç «zû{æ:óØ‘«oŠq{ }: ­Ÿù‚o=MŸ°ƒ÷Ðâ@ô2ÆÂtË@“kjãlºJrìÓ/t¶a2÷o@gŽB˜EÆáž›_ùÞ] [AÓ €}X ?F‹œ Æ6ÓØ' P£ PüêܦÈlg–V«íFen-×€ ñnÅoÀ­Í›ge÷'oÞwsqÂëa h:ð+ÜLÆOÑbœñ©FH€¡ 4BrN<0æ{ÛȲ “Ä$3•)çúÎD Ë{?{è-~òdTÁVÐôà—¹‰6ï qk‚¡ÑaËsBIT|dˆ?IDATxœí›[¬Õy€¿¹íË9ûØÆp¸˜ÛÁÎ1"ŒDˆ ”¦%´QÚ> ¡(P"5jÔ‡¦)IÕbà¡•¢$ä%  ‰<Ø©EŠÄ5´Ã7ÄvlŸÚ5ØpŽÏ9û>{fõaŸÙ¬½öZ3{;–ªJÿ'fÖZÿºÌúÿõ¯fÏAAAAAAAAAAAAAAAAAAAAAAþ/ñ&­ðì³Ï–vîܹýÔO~rÓû¿øÅ­õC‡®kŸ:uEgeeCÜ锳ÕzãiN'¶|oýPÚµ)ë9ÊRb–6;ÔËÍxFž®›q¸ŒÂ·Èe ÓkK›Š3@oÓfH.%噆5 C‚M›ffj5‚™ü™ /<Ý|ó¿Õî»ïû^­¶1Çü‡zhê/o»ío›‡}¹yòäˆâ»kktëu'O’ÄñPå"Åge.cgu›ùº¼o”g׿JÎS²Ù†¹âõ<Ó(ŠŒÄµÊ]íúQDtñÅÓÓå{µZß6l ¼ì²ÿ ¯½ö‰Ê=÷ìòéz?ºèJ6ÛÔj*سȘmÙîUÛHŸiŠW­â•Ëåg‡—B³Ä¿þõ}é7¿9¥”úó¼¸Ài÷Þ{¯ÛÒÒ?¶ëõ{¢Z /Š(EA¥2P~¶úƒ8¦Ûh¤éÐMê7b[ѺŒmòÍ•mÖ5 !aØ]šíè}emØV·o¤Áî̶l÷¡×µµ¯°rÈéù^š¢|Ÿ´\&¨VЧ\F•Ëý6;h6INŸ¾·õõ¯VJýçyV'ì4€û£èOëGþU4=†xQ„†DÓÓ#î?ˆc”RC7¤cæÙb[EOfW;Y:›P}uëc3W¤9~}›°¹~}Å*CFW:YÛ¸mù)ým sùů{´ÙÄkµ ÝFµZÄ|ð7Üwß^`·m}[æ{ûöM7Nœx¤×j…½výHº]‚j•°R!¨Vû¡R¡×ëõ§Ý\v˜7¢ç§YW½¢#SCÞlßì;5d³4FŒ<ÓðÍöaøžÍqÙî@õzýU_©@µÚwýÕ*ªÛEµÛ¤ívß ô ŒÛ¥Þxc -ó“û÷5^[û3åûxa¾xAA@X©€ç¡Ò”4MQiÊʱc´––ƒ5qåéûz^,`N‚¼GWûyiݳèef,b“3e]ã³=½Øò@{JذàŠ+𧦦¦ð¦§ñJ%h6¡ÙÄ[?ÓjõÏkkçwŸþÔ®ÅÅ×lý¡” žœ›;T«sQ­F83C´~”ffˆj5J6T*t×Öèu:l¼òJTšÒ‹ã‘ý¿3À)S*Wa…×ë[Sž2Š”læÛÚ±)À³ôoÊZëå]*è=Š_.ãÏÌàw:¨ÕUh4 ^ǯ×am om ¯ÑÀoµ~»ñرmŒÄOÎÎ~¢«Ô\†Eýý_?Z-¼(âük®aîŽ;Âøƒh9‚êv'RŠM®¨,/,Y5‰‰æ3Ž·3½XÞµ«®¼(¢¶sg_¥½åe:/½D¼¸HÒjáu»Ðnã­oÙµ×jA½¾u ~o3ü—Þþˆ¬--ÝíW*¨uåëGzaÈÆ­[ùØwÒ8p€÷v尿¸ˆj·Q76–U×E+ÒV—œk[Ú•gcEÛζXÃLç•¥@åŠ+ð*VŽç¥ÇçÊ»îâæ¯} µgñéÓ¨V :T¦øv{N[-|øŠ œšº#n6ñ¢ˆØP¼ŸËeæn¿Õ·ÞâøSO//[g‹üÍ(×u­×1ËMleã(v\åë²çÎwä£+¿tùåœ÷éOÓó<þãñÇy÷ç?'N8@§^ç– ûöÛ­úV ÕnB»‚;€Ðû1Ï÷·« n·G=@«aÈE;wRªVYüñé.-9÷}Û¤MbE”'g–k .ÖË•åúœãyTççÙxë­t{=ÞøÞ÷8øÜs#ÆoþàÜxÿý”¶m£ûË_¢Z­þ6¬+¾Ý† @¥év³›è6›Ä1I’àµZ««ÓÓ”j5J33TÎ;ö‰4­Á’9)gkf»¦Œq èw5†³5Û–1Dµë¯gæSŸ¢½²Â›ßù‡Ÿž„Qƒö€4Iøï½{ùئMÄÇãÕëý£Ùì{ƒN¿×ë?ÁÁfsL#&I%XÒëA¯G§Ñ ýðÃÁ€·á ôVV/L\î2Ï̉)Ê?ÛÀðl¶ ]nÅk ·l¡vÓMLíØÁêáÃìýÖ·8þê«Å»b€ÖÊ ©Rį¿nýY@% ªfß#`¾ÔÐ_Z d”"i4œQ´5ÀxÆà*³‘çÎVùfÓ̳>W]¿\¦zà Lí܉¿q#ï¿ø"¯?ú(ˇ*~(æZŸ-Ps~óæÄù*Øö–lðÖ*IHº]T:îO?“an ¦Ø`Öµ¶É™ÔÆytË3åûDssLíÜIõÚki;Æ‘§ŸæÈž=t»Ý¡_³³ë‰(#í¯î‘qš¯šm‹Ñê\!™4í»”1ž§óVµ­¼È#¸p)3¯³ ]@Èaø>åíÛ)_wåùyÒ8æÃW^aÿc±rð ) ­xó‰Êö„¥£ÒÖŠ7W¼KñVЯõtŽi6Æ õò³qÕ®>'‰ôüqØ!¢ˆÊÇ?NyÇ¢ùyÒFƒ•½{9úÃrêÕWI•ú%ÒT8ä+]G¥©Õ˜÷5‘°ÂP‡izÖ 3iD® ÂÕ÷8A©+ gg‰æç‰¶m#¼ê*zËˬíÝËéï~—¥·ÞB­+]ÿµ0oÕ›ã²ÉÁ ÀŒm’8 ÷‹ Ýõë[A:¦)7O~REç)sE³U˜Š÷7n$šŸ'ܺ•pn¯T¢}ø0+¯½ÆÒ#°öÎ;C{±mÅç­ú"ן‘Å6”ë¥p€ðeé¡­ I c€¢G qcƒ¼€ï\I^¾I°y3Áå—^uáÜþÌ #GhîßÏê“O²¶°@ÇV¥ç­xמ?.z0~Î=€y yÇS@‘ò'!o¿µ•AñäÉz€¿iÁe—\z)Á%—à_tªÝ¦»¸HëàAšÏþæÍ›7ãoÞ ¾OÚéœ>M|ò$ñ›oïÙC÷wH›Í‘1êßöe^Î|LÖ•Ÿ)ÞüîÐì«p}LQ©Dï½÷œq€¶[f;6° \b{Èâ‚÷`ë-·°ß>¼4% ª• Õry`år™RQªT(•J„å2¡çõ­Õò=€M¹¹eA€_©àOOLO÷ÏSSøµZ?6ɶ§õ­*­×é®®Ò[X >~œøèÑþϧ¸•a^ëÏù¦¡fŠÏä]AŸ ÀøJ·\²mÝ^d¹â`ɬ>úk ¼«à³1=½¸w/ŸøÒ—Ø~÷Ýܳ‡$Ih6t¡´Úµ„A@¹ZíD©D©Z¥T©à+…ïû„å2t»„Õ*AT*øž÷Ñûmσ èߘçõ¿~9sǤkk$gÎÐûðCü$r¿ã^úÙDW¾¹úMןñŸ ÅëÛòü]wQ;s†ú‚3PÖÆüŽÙ–ͼàÁízGzCŠþžóŸO<Á~ãDå2wïîèhFš$têuzŒþýi’Ã+¸†ñ"n—˜×¶ýÔ¤Hù¶1QocàÖK%®ùüç¹á³Ÿ¥õØc¨u£×ǘÅGZÞ‹f{#ý=×ǰ/Y¿‘dýp}µÒÿ‰©²~m[ùfÚ•—Wî¤]¯2ÿfU´ó`{,Ö·F}nÌ#É9›GÏ‘Î΀«€ós÷í!\w±ñEõ~wÁ»1l7•Ÿ]Ûn^Ÿ}²lØ\UÑ*ñ-×¶Õnæ¹¶].ÏXô¾leyy¦Š<—~,íÛ”êZ ƒøÍ¥p5Ö§µþIO»B—1œMž²´mû~KžY×%c‹ÚÍûÄ"«—™åf}=ÏúSº%oœöÇ©——NáÛ–êvèÂÓ¼=ÉÀ\lÐól¸0elJ0•j› ó•µMÞ5®?b˜uóî¿HY®¾Íz.[`‡–oKk÷ðæeð¯–æíðpN¾ tmï$Àµ*lCN][¶¶Ì6ô|³Ì|¿á’µQäE\y“L^žgIÛêyÐõá!Ïq+Ö<‹·Ã)œ§Ô¼•a+7-#OG¿©¼H=/¦°µ_‰»ò\}†oèyfWÞ8Ç„m}ùJø)œð",Üån-ÚË!߰乬֤È@²k—¢ód\íŒcã¤'‘ñ-isÜf ik+;|{ü‹å–äÀKðÜÀ©þHAPôÇM[ÚT´¹o™2¶Õž¥‹”j“§-câÆZõE tåeJ4Û°=Á˜O+¦Gq¤; ¾²þ™ àexãx)…O*˜ÍÛ\ûjž»·)´|Xöá7¼ØƒÝ7®?¶ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ðÿ‹ÿî\ù`¤:_„IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/pixmaps.qrc000066400000000000000000000020541323166163100232210ustar00rootroot00000000000000 help-contents.png application-exit.png arrow-down.png arrow-left.png arrow-right.png arrow-up.png clear-right.png configure.png dialog-information.png dialog-warning.png document-print.png document-save-as.png download.png go-next.png go-previous.png list-add.png list-remove.png qstardict.png qstardict-disabled.png search-filter.png speaker.png view-refresh.png dialog-close.png system-search.png edit-select.png computer.png plugin.png qstardict-qstardict-1.3/qstardict/pixmaps/plugin.png000066400000000000000000000021551323166163100230370ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î<êIDATxÚ¥”Kh\UÇÿß¹w™¤fBlÓ¢´5˜˜D›GÓغ)]Tê¢ntãBQW"(¸Qº¬Ò•®´+| ÜEŒD)R’TcS‡¤™Éd&3wîëÜs>ÏÍ8383…ÿËŸïžïÜó»ÿs.\bf쥾ŸíÓå™O<•M:X µåâü|E^üøñÅ5t“ïéç¾™½¶˜ÿEý"ß®¬ñri…ç7æõK?Añz›Š:Ä„¦˜±Ï&Öëüýﯾrl**„sëo-‡”J¥&ÞÛ<ù`v_ŒuE™µñºÁ¬™që®Fo²²é4®ÿºôÁÆë7_±TMi™76„:½¼\]ñ)‘H§¤Òi1þkF¤8®Í^6#h_‡(áϼßë|—¿JÌ ªçë5Ö×'<êè‰JX†µ·bw߉‹kŽÊ}±Þo7{€cøÖNÅÏEaêx-P 67Œí†L¥„‘¾“v{€H! #'Twå6"·^dÌ"&òÁv0¢H«Û;[Â‘Š †º€¹®ÿsC¦ˆÑÛ‘8X(_ýÙ×ÃÙ\˜¸Áì„wJê2®ç¿nÿÑ7>¤ÿ'ù¯¨ýõ#IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/qstardict-disabled.png000066400000000000000000000120621323166163100253020ustar00rootroot00000000000000‰PNG  IHDR€€i7©@sRGB®ÎébKGDÿ‡Ì¿ pHYs × ×B(›xtIMEØ ´É×¶IDATxÚí[Œ,ÇYÇÕsÙûž=ö¹ûøBŽ 'ÜEBáùd%‚ !Ä )D‰PÌå$Þ"å%¡ ¤ YJò+ „#Çö!¶cŸË®ÏÎÎîܺ«xèššºöôÌ´Ÿp¯vw¦»ª»ê«¯þßÿûêÒðÞñÞñÞñÿù5Òü‡HúL0`ÄÉå쉫 („Úã|,QªÌ®ÿ1‘ùX)´òLI •T(9,ÓY¡@ÁXHP&ev L„TÅIg,ÊOª|†R9*/ïÙñvñåï½ÝŒ~“¿››Îä©Nf*«¬j+$ …¢…ð®(@ZyÊâØ×¥É1ý=e–S!MJ…@0ápÐûóoüåêØà.mò[ì™â âBÁÅ%6úÜ©‹ …bdª5=†ÞwÅÈ;“kE›cŠà.2Qð6ÝüàÉgÿužÚs®ˆKð‡|DWN˜j ó;ýÁJƒ“Zè¶'HçæÈ¬ö˜ÞUYO±ï ô§ÌÊ‘ žbBNÑÞý$+ à'~ž]§šÂ6Óǹ‚éâ—ç2}eV©™IO!m…ŸvP´L·*–N)õ]Zl{¼ÎŠüôü.0Ok˜º-‚tô9‰´ÄÐ2…·«Ö6Ÿ¥%ÎLçÇúžéï™i[PNežØ¶´~‚ç¹H;è0Ë€yÌRUÿïÈ ƒ-"ገä›ýŸ¡ŽÂ+Oí :„}ÇY׸L›>§“ÕpZül):A±fUÌŒ Ï:L¦õg&@eÒΪ‘YUtï+¬<²™¹¢œÏ‚‹t€ë'« `v¸Ægù8ë ¦wN»‚B@S³À술í§wË­±E4M™YúbkÆ´ØC$J6Òîòc<Ïר Ôzª¢k´PŒ¹B ÈÀ8•½·c}·iꮹ¿²ž"Í·nÄvÛOêRè2 PÖó–€x…+\¡¥)G)o…¤0Pä\åi}eZ0i0Z8Ø^2;iˆ†Ä€¤pD( ™Â<¿Ð"UæìŒå:‡âˆžøÐ'¾ù¥@0ç5rS…Áééñ&/³Å Ń췹©‹•¬Qj·ågiSpÀØê±ÜvN?Õ:í¾ø·kÏ|ýhe €1™Vte4Æ(222M?¿Ëû9Ï-zÀ`³¼Mo *:æZÜÙ¬àÄœðÐùöǾþ…ª4Y}¿I’ShÍ)È‚ädH^¤àQÖ€œk(àáDQ…gÌÜknçʦ¹ËÅ9MœÍ­µ£ôÂ!Áˆ>ä2¥ñ¿ÀjV@8×ú]¶—ªøì8®&€ p™Cˆ AŸ—ØæG5*ìj9¯âþq‡!‚ÓKVÜœÍW€ro—yí„ÇÝöy•3<ÀËät¸o¡ŠÏÃîÜF©:«ŽÔ»ú"ð g·z‹ÜÏ99¯—¬WñÙÕ}à”WÈÊö^,ki€ëöŠYõãWÙça¶ hqy.ìůîSÐÒ8°XÅÍõ£†4 A(»/q£tQüÅEÃâ+¾¤œ¢µpÅM ÊF1 ]u¿0ŠkH¥Å‡î[Ò˜õ˜ Œ-¨_ñiºÖ¸Ī/,6',ggšfÂ56¸ üÁy:K3Å;À­+n*0XMãX/ûãYPÀ®qpÌ-2.W?éCÆd–,f i3Ïøè=^å~Îð:9ç¢8PÚÞA±•(êVFrLÆæ\îïO÷ß5_ÀG€¬²m&¼Ì6’{X_ИMϣجàžË5Í`üÇ-H6G)\G ¨‹éŠc26jW\ ýU Â#"býã7€]6–0…Á 2ÂjaŠ¢ p1€¨?PÚnsSãÀbÆlzö‘èB‰gÑ€ùÀÕ€ªûÜ࣋êÁ€Â¹ j@š 1‡¸éß`Â…$6~ ÈôÊ2„j% È’îp–@¼Š’[ìpjÉ‚‘žTZ^ã àôS«6¦0à2k U|–r@[»U5¬‡jØ B8f°®RÞDð`±»X‡äÚ§¨ñ¤aC]€D<Èåõ1½Ï1íŠAuî!m£os´h´ªd<BD ‹ñô›@·¦s䟡X«]’«  ˆÄÜ)KÓ[-‚éCzHZÜ»%°6·èG ÑHPÊ®m·i1d‡ú˜nÎŽ‘‰8󢦰¶/¡ˆÂc}LŸp—=nqVÏÄZ,Ê3¤[uŽç•¤MmI¹#ù¡KœªøŽ# ¾úÚeÂ[lqDAAF¤ÅÛ•>c&[§c&h%ǃòFPª¦§¶ÅX`ò‹üR§HÆäô¹Ã›\ç-ŠÓiöi~7 úAgš¬*€qÊsÌ æ}¼oa?}Èk¼È7x‹6gƒäTS¤¢Qœ¬*€AÈbWñÜa·ßaÏ|{€³úSŸ—œTë´ÙcOƒÛ:ðã¾Ê7iq!¨¤bL':ƒd_ ]ׄ<@x …Û¼`ªzƒÏð×lQŽþ¾l1f œç1çªIºÊU~•æ[œ±Dhèвæ.‰ØÀD3PVÒ¬è?2K´ÂiN'ˆÙç€6÷³O6ç¸Ã˜_åYÖy‚_Ð.Ó%þ€ó9nz³M9Ýj¶ÛŒ/àÏž^r»ÆâÛ)P²G‹œ}ÎÐf“ ÜÇÿÂS{VúMøŽùÖåIÂ[ V¾ªd:(î/pKpáůœÖ熌صrßË3VÊŸµd•kGŸ¤ŽA’#³+ZaùŒ`G§<Áž°Å¹i¾­óS–-`áÀ" ^“ fsãÂ*@•Ì; Ù¦«Sѵ‚%Êqž>ÈÈ1Î2~÷&BbÂüð#C±ÉSõGzD4â;ä”áy=68¶-K¢‹™BdC HÔ ˜(µ(Œ¥Â'ŒË3âó|›+z1§£7èJßmþÈàÂT8 >aÄò³BW*Áñ-K}$ñ¤ÞŠ¥¤¾Ÿãm6é¤f•sÄØNoâîù燞„W}åE‹JŸ´g™3û¸ãì Wè\ðk<Î9“î˜gù »–8JìW´Í>bQ=h`;½ßþÛJꃙòzdynŸ3<®¯üœ™%—ømk.s›u¶ØcKNàë¾ÉWÈy Ø‹N ÉÉŒà–#Ùíº@Dâ¯)è£ÀG£s…ÛüJå“x•çx–Þ‚EEJP Èônsüé7‚D—GÄB#qŒPfæêcˆbÄ}îð2¯ÒC°ÍCz'á鶉Êk[I¹µªtìæ¢! 7ËÅÚÔ$ÍËã^¾È?Õ0z]=ÕE"Øf[Ï/ÎÆËD0F"ͦÍ^çœ4fBÒ#"š ¢Uܲüøj÷HDª§’WmÄ)ÌŽÓ³«¢ÆØð]`ê L÷o´wγfdÁì¡ÆÆ+£¢ÊG‚B)¯KZWˆˆ)Øz7÷B¿Ô³Ï8úE:ñB‹$ €²˜¹I=":Naß}”5¢Óêääz'q©Rn„_訌òÞ$#¼ÕÄGz çâ¼JV¼ÎU¦\»Ó”Õ,·SŸîý/­W ( óžêÀYü»ˆV)›~KÇØ¡lÐJïŸY•Wú%Ów<ÙRVšÝ´½ë3=5‡j‹À$ð§[èçFõ§j?{UV¡Å"S uw…¥*é±]©Sœ!½pb»"ÿ-ÍË4 -‚©L_¢!MH[Eá(Žë)ÿ.¦âÕQÌ1Ö1Ñbu\—=¹[ 7í¯ŒØ]@Uôs• ;*áðÎbN5¸L‚;þ¬Î7×°Þ)QX]¡p Ë>}õIú'žçoD<7Ñm\˜¶–æõfÊ\+ô7™l³]„…—‘ó)QÕ«µT`>ú÷²ï SùÂX,*$’>»oôªC㪂Uû~@p½Êõr¦nazþ¬KÍ2§çù£¾2¼P}­ç¨ˆôs\Ð6}¢¶-ý“•Ÿ‹×ŠGJ3(-&Å•zŽŽŠàx<”-ÏA&ÜçÔgJ[|u7ç¼Õk ÓU(»Ú-óYÿ_+)toŸ‘ ‚BOL*‚Áq¿ÝUeœ(>ÜË© ÆŒÔ2Ï1·¿Ï)¾ KZmmG®Zê™ã'ÛË (ßéU®Ô+Ì\Í“ääl•ðêN›K§ŽÑœíc}—££ç?ͺSÝÂû‘äåàQ¬õÝo¿¾ö»g% 5VJ"™¨Í;ýÃìbKZBÀD>§¼‰iÑ ,ÒGg÷ý!6t)@(UÄzqYñŽ ‡]T®&ÿù·ÏƒDå-°£m«Òv7È‚OYdwM}—jÕº*Q1ꥂ_ÿ“òè++‚O…ãÉç³ÍBãì 3#‹þýP±²‚š‹S‚E"?Eôo} ",4¡Oh#áýuwßÍ*wâLªõ“Þ'›’JËÍ\SU ¯¾=;‘áÂØœ"©ñ¶v÷{]¢_ãø?]4ó‡Õê\IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/qstardict.icns000066400000000000000000002171761323166163100237220ustar00rootroot00000000000000icns~is32æ‚‚!&’¢¡¤¤£¢Ÿ§‚+"k}`ehpced"7mG?ANI@N.>YnOTX[OZ' DKNTGDYPY%!G\žšˆ…SV^' (SH±‘WŸ­Nf%.YH«€QVËq_-1\Mµˆ]a¾\*3aM«…GhÒih L5 `XÀ q´[q6%Yc~{k[dk 8(WSNPOV`Xd/$SSXXZXWW_ ;=<=>?AAC  &’Ž©©¬«¯˜+!‰¦”•›•’š>m¤‡……Œ‹•T s–‘–Š›E x‹‘‰‡–‹œ@"|’µµ§©‘ŸA (…‹Ã³¹ÄŠ¥@.ŠÁª‘‘Øž¡F1ŽÆ¯—˜Ï§Ÿ>3‘‘îۛ¦2L5!““Ì»žÅ³•¬26&𦦧žš›¨28)‹‘Ž’™¡1/%Œ”•–—–˜”¡, ktqsstvuwŠ%’Œ€ ŸžŸ™¤u )%-/0€/-/&‰  ‚  f[T€\ (™[x.ŒF¸*1™M¥A3ŒI¿5¬q#˜P6$?7>€ 8&  /" ‚ €s8mk ÿìùôôóóñóëø<¤ÿ÷ÿþÿÿÿþÿ÷ÿm ÿöÿýþþþýÿõÿv¡ÿ÷ÿþÿÿÿþÿöÿo ÿ÷ÿþÿÿÿþÿöÿjŸÿ÷ÿþÿÿÿþÿ÷ÿdÿ÷ÿþÿÿÿþÿ÷ÿ^ÿ÷ÿþÿÿÿþÿ÷ÿXÿ÷ÿþÿÿÿþÿøÿRÿ÷ÿþÿÿÿþÿøÿLœÿ÷ÿþÿÿÿþÿùÿFšÿöÿþÿÿÿþÿùÿBšÿõÿýþþþýÿøÿ= “ÿöÿþÿÿÿÿÿûÿ6kúäñíîîîîîéê7il32 ΢ (=5631/-+)&$"‚ ¼ÇÆÈÍÎÎÒÐÔÓ€Õ ×Ö××ÙÖÜÇ0„j~||ƒ•˜•˜™™ššœ››žŸŸ Ÿ9‡pmwFPKJKFbTCGDDEAV-ƒ  WiyUCJHKHRlK€NQMP1ƒ CUvmDKHHKD\YFLJLIT/ƒ  KE]ƒRHLJLLMb€NPLU4ƒ IMDnyGPMNPLZZLQQNW&MKOFoUHNKLNQ_QQSOX  NMOSVvTUWYUMZZPUP[ ƒ# $PONG?YbAE>MYS]TVR\ ƒ& &ROU¥´³·¯ª iFVZYVT^!ƒ"* )TO[_Åño† é³OY\YU`!‚%,,VP\9®æDbUI[ôÀMa[Wa"‚)/0WR^I¸îPgfnQ|ÿTcVd#‚-24YS`D¶ëO[a]d^ö¾LgXe#‚037[UaH·ìQaYgcXæÚQfZg&‚34:\VcI¸íRbZ^nSåÞSg[f‚55<^XdL¸ìTc^ZeeðËRh^c‚75>_ZfL¹íUe\i`tÿ—[h`e‚:6Aa[hP¸êYh^[MÔå_gedf€=7 Ca\gK¹îTce}Ôålghefh€ ?6 D_\c§Ñß²·»Ã \beggeh€ A7! F\[\d_\febSQecacecf€ C7!#HYYZWZ]YZ\be]^``aac€ F8"%IVVWXXW€Z XX[\]]^^`€ E5!%HSSTSUVW€XYY[Z]€ :+BQPQQRR€STUUVV€WV € -!9LJLKLLMMNN€OPQPTG…  1MIKKJKLL€M€NPNS>„ ƒ„ ¢ 3QHJFEDB@>=;966400(‚¼ÆÆÇÑÔÔØ×ÚÚÜÝÜÞ€ßâßåÓe‚ j~||ƒŸŸ€¡ ¢¤¤£¥¦§§©¦aƒ¡¤…Œˆˆ‰…–ƒ†ƒ‚„~•Iƒ  ’›¦…ŠˆŠˆŸ‹Œ‰–Zƒ †¤ž…‰ˆˆŠ†”’‡Š‰Œ…—Uƒ  $‹…•¬Žˆ‹Š‹‹Œ˜€Œˆ˜\ƒ'‹‹†Ÿ¦ˆŽ‹Ž‹””‹Ž‰™C+‰‡ ‰ŒŠ‹—ޑЛ6/Š’¥‘“”‘Œ””Ž“‹œ8ƒ"3ŒŽ‡‘—„‡ƒŽ•—”7ƒ%6‘‰±ÄÃÁ¼º·–…”Žž7ƒ") :”“ŒÑ𕪥¶æÃ‡—•– 8‚%, =•Œ™Âè‘‹‹óˈ›–¢8‚). A—™†É툟›¢Ÿÿ¢’œ£9‚-1G˜›…Ç눘™–žổ ‘¤8‚03Jšœ†È쉜•žéà‰¡’¦<‚33Lœ‘ˆÉ슖˜¤Šçã‹¡”£-‚54O’žŠÉ쌞˜–Ÿ•ðÕ¡˜ž‚74 Qž“ŸŠÉ팟—Ÿ›ÿ²— ™Ÿ‚:5 TŸ”¡ŽÉ颙›…Ýç’¡Ÿ€=6!VŸ•Ÿ†É™¤Ùå—¡ŸŸž € ?6"Xœ—”±Öá½ÁÄ˸žŸ  € A6#Z›•–—“™˜—Ÿ››œžœž€ C6#\™’—”—™–——œ—™šš›š€F7$!^—”““’”••””€—˜™—š€E4#!^•Ž‘‘’‘’’“”•–”š€:*X”ŒŽ€‘’’€“””’€  . O…Љ‰Š€‹ŒŒ‹’|ƒ ! J”ˆŽ‹€ŒŽ‘Œ—m„&ƒ#„$%#'“† !1))&$"  ‚ ¼ÇÆÈÌËÌÎÍÑЀÑÓÑÓÒÔÑ×Á… j~{}€Ž‘€“”•”•ˆ  ‚ ƒ  ƒ€† Œ†   –  …‹ †Š   ‹$…‹'–ŸŸœœ–€+‹!* "µô3:G‚ì‰%- –ãò¯ˆ)0 ¡î QÿL…-3 œëü§…05 žìáч25 žíÝׇ56 ì ô·…77 ží 5ÿi…:7!! œêÅâ†<8## žî :Ëà$„ ?8%$—ÇÛ ¦­·u‡ @8'&  ˆ  C8)(„ ‰E9,+Œ D6,*„Š 9,%$“  -"• –“l8mk?¦•˜”™•••“’‘ŠŠ‰…‡ˆX³ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿó¾ÿðùõööööööööööööööööööñ Âÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿhÂÿøÿýþþþþþþþþþþþþþþþýÿõÿu Áÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿk Àÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿg ¿ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿ` ¿ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ[¾ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿU¾ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿP¼ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿJ¹ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿD¹ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿ?¹ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ9¸ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿ4¸ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿ.¸ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿ(¸ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ$·ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú ·ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö·ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿò´ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿï´ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿì´ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿé³ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿå ³ÿ÷ÿýþþþþþþþþþþþþþþýÿûÿá­ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÜ ‚ÿîü÷øøøøùùùùùùùùùø÷úôÿÕcÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿÓ'lwv{„…‡ˆ‰‰‰‰ˆ‡…ƒ|uwC it32NPÿÿÿÿ˜VVURQPSO‚LK€JECBB?AA€@<::€;:8443122€100..+'€%$&€(%"‚³cddcbbaa``__^^]\[^_^^]\ZZYYXX€WYYXXWWVVTSSRQPPOOQRQPPO€N MLJHGFEDEGD7*¡ gwwxxwoo€n€oldcpuvokkmnlc‚b€aUUƒVT…KF…>7…2(‰%,=0 |¼½½¾¿¿€À ÁÁÂÂÃÄÅÆÇÇÈÈÉÊËÌÌÍÍÎπΠÏÐÐÑÑÒÓÓÔÔÕÖØ‚ÙÚÛÜÝÜÝÝÞ߀àáââãâãä䂿 çééÝÜ7%%&6  ºÊËÌÍÎÎÏÐÐÒÓÓ€Õ ×רØÙÚÚÜÜÝààâá€â ääæèèéêéêê€ë€ìêëêêéé€ëê€éè€ëêèëêêéç€êW!%%) ºÈÈ€ÉÊÊ€ËÌÈÈÉÎÏÏÐÎÌÍÍÎÏÏÒ€ÔÓ€Ô€Ø ÙÙרÙÙÚÛÝÝÞ€ÜÝÞààâ€àââã€å äååæçééêéé€ê€ëìíîî…#%% ¼¼½€¾€¿€ÀÁÁÂÂÃÀÃÄÄÅÆÆ‚ÇÈȀɀÊˀ̀ΠÏÎÎÏÏÐÑÒÒÑ€Ò ÓÔÔÕÕÔÕÕÖׂ؀٠ÚÛÛÜÛÜ£%&Ÿ5¬¬®®€¯€°±²²³´´µ· ¶·¸¹¹º¼ºº»¼€½¾½½¾ÀÀ‚ÁÃÃÄÄÃÄÅÅÆÇÈÈÉÈÈÉÊÊËËÊÊÌÍÍÎÍÌÎÏÏÐÏÎÏÀ!%Ÿ E—Ÿ€ €¡€¢ ££¤¤£¦¦§§¨¦¥¦¨€©¨©ª©©€«ƒ¬­€¯°¯¯€°±±°²²³³ƒ´¶¶·¶¶··¹¸¸¹¹ºº¹ºº»¼+ % (‚€)++)'†%!"$‡%$#''((„)‚'+ƒ-ƒ,1/./1$!#$  '6987554542//€-,(C¸¶·¶¶µ³³²±°®¬€­#¬¬ªª¨¨¥£¡ Ÿžž›™™˜•’‘ŒŒ‹ˆ‡††„‚€~{zyxwvuutrqmkkji]6' „„ ’¤z€]¤¤\‚WV‚W‚V€U€V€UWz€{]UTT€UƒTSS„TSTTUUTXnN'Ÿ   K”¢]EEL™¤£_EEŠFˆGP€{P…HˆIˆJK`QŸ€ERœœPEE[¢¤–H‡F‹GHH[€sI€HˆIˆJƒK`Ÿ EEY¡‘IFFp¤¤mƒFŠG…Hh}[‡IˆJ‡KJŸ €€F c£†GFG†¤œJFŠGˆHIJs~vJ‚IˆJˆK€LMŸ  Fo¤vFFM¤u‡GˆHƒIS}|_I‡JˆK…LKŸ  ‚F}£gGGo¤ N‚GˆH‡IJj|wLƒJˆK‡LMMNž   FG Hˆ¡[GI—£xG‡HˆI‚JOy{`JJˆK‡LƒMNž   ƒGJšQGd¤ŸPƒHˆI‡Jb{wN…K†L‰Mž   ƒG HP˜’KHŒ¢zHHˆIˆJ€KMtyaK†LˆMNPž   GGƒHXž…IY¡R…IˆJ…KZyuO…LˆM…NOž   †H`¢wI€ {I‡JˆK€LmxbLˆMˆNOOž   HƒIj£gRœœU†JˆK„LUwtP‡M‡NƒOMž   ˆItŸ[tž}‚JˆK‡LMMgvc‚MˆN‡OMž    „I‚Jƒ˜V”›UˆK†L„MRvtPˆNˆO€PUž   €I†JL‰lœ}„K†LˆMNeuc„NˆO„PUž   ‡J€KP‹šXK‡LˆM‚NQsrPNNˆO†PQQUž  ‚J†KT”†›~„LˆM‡Nata…O‡PƒQŸ  JˆK€L\™˜™YLLˆM‡NOQppP€O‡P‡QŸ  …K…Ld™™€…MˆN†Oar_†PˆQ€RŸ  K†LMm™–\€MˆNˆOPPQooQ€PˆQ…RŸ  †L†Mu—‡NˆO„P^q^‡QˆRSŸ  ‚LˆMNNO–]‚NˆO†P€QlmƒQˆR‚SŸ   LˆM„NRN‡O‡P„Q]q\QˆR†SŸ ! …M‡NOOk•eƒO‡PˆQRmj…R‡STTUŸ!"  !€MˆNƒOPˆ‘[O‡PˆQ‚R^p[RRˆS„TŸ"#  #‡NˆOd“ŠV‚PˆQˆRlg†S‡TUŸ#$! $ƒNˆO‚P‚‘‚RˆQˆRS^nXS‡T‚UŸ$%" %NNˆO†P^‘Œx„QˆR†Slc†T‡UŸ%&#  '…O‡P‚Q{‰nQQˆRˆSTT^mWTˆU€VŸ''$! (O‡P†QYŽsƒe…R‡S…TjbˆU„VŸ ((%" )‡PˆQ€Rt‹_…\RRˆS‡TUU`kWƒUˆVŸ )(%" *‚PƒQCHˆQ SkaXhTPKMHAAFN‡TƒUVj`UU‡V‚WŸ  +)&#  +P‡Q>šÝ ÛÕÑů‘lUMCNTˆUVai…V…WXŸ !,*'$!-…Q€R?¼–ÿ÷Ø«iNFT‚U‚VWi^€VˆWXXŸ "-+(%! .Q„R?‰‚ÌêÿóƒÌÍÕÙéùƒÿþÚ”QDU†V`h‡WƒXŸ #.,)%" !/ˆRGGJ:Ëÿá€K bfKL`WRVq¢Õú‚ÿåLN‚V€WXi]‚W‡XŸ $0-)&# !1ƒRˆSBËÿáSTT\‰jUZ~^UOEL_­ð‚ÿÏcG…Wbe‡X‚YŸ $1-*&# "2RRˆSTBËÿáT€Uq…YU`}[€VRE[¹ýÿî}G‚WXXZi\‚X…YZž &2.+'$ ! #4†S…TBËÿáT€UW„sVVfyWVSH‡òÿùŽF„XbcXˆYZYž'3/,($!# $6‚S†T€UCËÿáTVi‡_VVlsƒWGsíÿú‹HXYY\i[ƒY„Zž(40,)%!# $7S†T„UCËÿáT‚V}z€WskƒWHlõÿörLƒYcbYYˆZž*51-*&"% %7ƒTˆUDËÿáT€V WW`…fWWYwdW‚XH’‚ÿæWV‚Y\h[…Z€[Zž*52.*'#%  &8TTˆUVDËÿáTƒWq€ZXX\z`‚XYLÌ‚ÿ´JY‚Zd`Z…[ž+62.+'#%  ':†U…VDËÿáT‚WX[€s€X_y\‚YRiûÿùiU‚Z]f\†[\[ž-73/+'#% !(950,'#* '0L‚YˆZ[GËÿáV[[†\€]h|f‚]mWÍ‚ÿÊJ^„_c€_`až(8=:51+'#*  (0LYˆZ‚[GËÿáW„\…]py`^_YÌ‚ÿÊK…_a„`fž)8>950,'#* !)0 M„Z‡[GËÿáW€\ˆ]^`wt_^OÒ‚ÿÃJ€_‡`€ajž *:>:51,(#+ !)1 M€Zˆ[€\HËÿáW‡]ƒ^czm^€_TÖ‚ÿ¾H†`„aŸ *:?:61,(#* ")2!N‡[„\HËÿáW‚]ˆ^_gyh€_Uä‚ÿ¥N‚`ˆaŸ +;?:61-(#* "*2!Nƒ[†\]]IËÿáW]ˆ^ƒ_lyd__Wò‚ÿŠSˆa‚bŸ +@;61-(#* #,4$O€\ˆ]€^IËÿáW‡_‡`duV½‚ÿÔYf‡bƒcŸ .>@;62-(#, $,5%P‡]„^IËÿáXƒ_‡`‚agaä‚ÿœRlf‚b‡cŸ /@@<72-)$- %-5&P‚]ˆ^_IËÿáX__‡`†aYv‚ÿûb`ckh‡cdŸ/@A<72.)$, %-6'P]ˆ^‚_IËÿáY„`ˆa€bO‚ÿËR€cjh‚c…dŸ0AA<73.)$+ %.6(Q…^†_IËÿáY€`ˆaƒb\føÿýr[€cdhh†d€eŸ 0BA=82.)$, %.6)Q^ˆ_``JËÿáY‡a‡bOÅ‚ÿÁQ€c€dhie€d„eŸ 2CA<73.)$+ &.7)R‡_„`JËÿáYƒaˆbccQ†þÿîd_„dgi†edŸ!3DB=83.)$+ '08*Uƒ_‡`aKËÿáYaaˆb‚cTlñÿûƒ\ne€deghfefŸ"3DB=83.)$- '08+U__‡`‚aKËÿáY…b†cShåÿþ Pgqm…efh…fŸ"4FB>94/*%/ (09,U„_`aa`€aKËÿáYbˆcbOtèÿþ¥Odehql‚e€fgƒfggŸ#5FC>94/*%/ (0:,U^ƒ_`_``€aKËÿáY€b…cddcSTž÷ÿø–Pc€eiqj‡f‚ghŸ$6GC>94/*%. (2:-V^__^^_^_ƒ`JËÿáYaƒbcZNVŒß‚ÿâyPdee€fjpj‚f†ghŸ$6IC>94/*$/ *2;.Uƒ^‚_V€LMM6ËÿáHƒNLKPWZz¹é‚ÿô®XTeffefioiˆg€hž%7HC>94/*%/ *294/*%.!*3<0V…]__^H¼—ÿíÉŠXO^€cddc€dehkhffggffƒgž'9ID?:4/*%."*4<1U\]]\]]^^€]G³÷ïîçÚιkXPSaccb€cdc€deegkg‚ef€gfgž':JD?:50*%1"+4>2U„\]]\\TO„TˆUZUWUOKS\€a„bccbb„deig‚efgž(:JE@:50+%2",4>3U\[\\]]\\]\]†^__``__`__†abbccbbƒcddehfd‚fž);ID?;4/*%3#,6>4T[[Z€[\\[€\€]\\]ƒ^__€^__``__`aa`€abb€ab€cbb€cdgfdeedfž)KE@;50+#4$-7@8SZY‚Z[ZZ[…\]]\]]^^]]‚^‡_``aa``aa†b€cež,?KF@;60+"3%.8A9TYXX€YZYƒZ†[ƒ\]\\]†^„_`a€`aa``aaƒbdž,@LFA<61+!3%/8B;TWW€XYYXXYZZYY„Z…[\\]]\\]\€]ƒ^€_``_aa`aabaacž-@KFA<50+!5&/9B;TWXWXXYYXX‚YZYYZˆ[\\]]\\]^^]]‚^_``__``a`až.BLFA;60+ 9&/9B=SVƒWXWWXX„YZZYYZ„[\\[[\\]]\]]^^]]€^ƒ_``_``cž/BLGA<61+:'1:D>R‡VWWXXWXXW€X€YXXYY†Z[ZZ[‚\]\€]^^]]^^ƒ_dž0CLGA<61+:'1:D?RTU…VWVV…W€XYXYYXYYZYYZZ…[„\ƒ]ƒ^ež0DMGB<71+;'1:DAR€T‰UVW€V€WXXWW…XYYZZ€YZZYYZZƒ[†\ƒ]až1EMHB<71,=(1<…Q…R…S€TSS€TUUTTU‡V€WXXWXXYYXX€YZY]ž +…?@??Œ@…ABA†@?4. ¢   ,+Ž,†+,‹./..†/.--‰14ÿÿÿÿ‰ÿÿÿÿ˜ jjifeeiedc„b ]XWWUY[YXXVTT€RQMKKJKLLKJJKKIIF@€?;@€A>=9850775³†ˆˆ€‡††…„‚€‚ƒ‚‚€}€|€{||{ zxwvvuuttssutr€poomkii€hidSE¡ gwwxxwoo€n€o ldcƒ‘‘ŒŠŠ€ŒŒ‹†…†~…xt…pk…ib‰`ddO |¼½½¾¿¿€À ÁÁÂÂÃÄÅÆÇÇÈÈÉÊËÌÌÍÍÎπΠÏÐÐÑÑÒÓÓÔÔÕÖØ‚ÙÚÛÜÝÜÝÝÞ߀àáââãâãä䂿 çééáÞ_``aa  ºÊËÌÍÎÎÏÐÐÒÓÓ€Õ ×רØÙÚÚÜÜÝààâá€â ääæèèéêéêê€ë€ìêëêêéé€ëê€éè€ëêèëêêéç€êhU``b ºÈÈ€ÉÊÊ€ËÌÈÈÉÎÏÏÐÎÌÍÍÎÏÏÒ€ÔÓ€Ô€Ø ÙÙרÙÙÚÛÝÝÞ€ÜÝÞààâ€àââã€å äååæçééêéé€ê€ëìíîî“<\`_ ¼¼½€¾€¿€ÀÁÁÂÂÃÀÃÄÄÅÆÆ‚ÇÈȀɀÊˀ̀ΠÏÎÎÏÏÐÑÒÒÑ€Ò ÓÔÔÕÕÔÕÕÖׂ؀٠ÚÛÛÜÛÜ­AL_aŸ5¬¬®®€¯€°±²²³´´µ· ¶·¸¹¹º¼ºº»¼€½¾½½¾ÀÀ‚ÁÃÃÄÄÃÄÅÅÆÇÈÈÉÈÈÉÊÊËËÊÊÌÍÍÎÍÌÎÏÏÐÏÎÏÄGLW`Ÿ E—Ÿ€ €¡€¢ ££¤¤£¦¦§§¨¦¥¦¨€©¨©ª©©€«ƒ¬­€¯°¯¯€°±±°²²³³ƒ´¶¶·¶¶··¹¸¸¹¹ºº¹ºº»¼UOT_ (‚€EHHGE„CBA>>‚D„CAGG€H‚GHFEKƒLJI JPLKLLEDJZ  '6987554542//€-,(DÏÎÏ€ÎÍÌÊÉÉÈÇÇÈ€ÇÆÆÄÄÁ¿¾¼¼»º¹¹¸µ³±¯­­¬€ª ©¨§¦££¢ Ÿžžœ€› 𙕓“‘ƒUD „„ µÀ§••”³ÀÀ«•’’†‘„‘€‘¦©§•†ƒ€…’¡pNŸ   ˆ¶¾“††Š¹ÀÀ•ˆ†Œ‡©ª§‰ˆ‹‰‚Š—uŸ€ †Ž»»††“¿À·‡ƒ†‡ˆˆ”ª©£…ˆ‹‰‡Š”Ÿ ††’½µ‰†† ÀÀž†‡…ˆœ©¨”€ˆ‹‰ŠŠ‹‹Ÿ €€†˜À­€†®À»Š‹‡‰ˆ‰¢©£Š‰‰ŠŠƒ‹Ÿ †ŸÀ¥‡‡‹¼À£‡‡Œˆ‰‰©¨—„‰‹Š‡‹Ÿ †‡©À›‡‡ À½‹‚‡Œˆ„‰¨¤‹‰‰‹Š‹‹ž  ƒ‡®½“‡ˆ·À¦‡‹ˆ‰‰‹¦§—‰ŠŠ‹‚Œž   ƒ‡Š´º‡™¿½‡ˆ‹‰€Š˜§¤ŒƒŠ‹‹†Œž   ƒ‡ˆ¸µ‹ˆ±¾¦ƒˆ‹‰„Š‹£¦—ŠŠ‹‹‰ŒŽž   ‡‡ƒˆ’½­ˆ“¿¼ˆ‹‰‰Š“¦¤ˆ‹ŒŒŽž   †ˆ—¾¤ˆª¾¨‡‰‹Š‹ ¦˜„‹ŒŒ‚Žž   †ˆ‰À›Žº¼‚‰‹Š…‹¥£‹ŒŒ‡‘ž   ˆ„‰¢½”£¼¨‰‹ŠŠ‹›¥™‰Œ‹‘ž    ‰‰«¸‘¶»‘†Š‹‹Œ¤¤Ž„Œ‹Ž’ž   "‡‰ŠŠ‹°²Ÿ»©‚Š‹‹†Œ™¤˜€ŒŠ†Žˆž   $ƒ‰„Š´«±º’‹‹ŠŒŽ£¡ŽˆŠŽ•ž  %‰ŠŠ·®»ª‡‹ŒŒ€™£˜„‹Ž€Ÿ  'ˆŠ‹”¹¹º“‹ŒŒ…¢¡Ž‹Ž„Ÿ  )„І‹šº¹ªŒŒŠ—£—ˆŽ‰Ÿ  +ŠŠ‹‹ŒŸ¹¸”‡Œ‹€Ž¡¡ƒŽ‹‘Ÿ  -‰‹ƒŒ¤¸«ƒŒŠ†Ž—¢–ŽŽ‹ƒŸ  /…‹ˆŒª·•ŒŠ‹ŽŸŸ‡ˆŸ   1‹ŒŒ³«‡‹Ž—¡•ƒŒŸ ! 4‹Œƒž·›‚‹Ž†ŸžŒ‘Ÿ!"  7‡Œˆ¯´”ŠŽ‹—¢•‰…‘Ÿ"#  :ƒŒ‹Žš¶±’…Ž‹‚ž…‰‘Ÿ#$! <ŒŒŠ„Ž«µ¬€Ž‹†— “€Š‘€’Ÿ$%" >ˆˆŽ–´²§‰‹‘Ÿš‰‘ƒ’“Ÿ%&#  A„‹Ž§°© „Œ‘— “„‘ˆ’Ÿ''$! C€‹Žƒ”³¢¬šŒ…‘’ž™€‘Š’““Ÿ ((%" D‰Ž‰¤±˜®–‰Š‘—Ÿ“ˆ’‚“’Ÿ )(%" F…Ž€vb†noop}xr|pmkmllqzˆ‰‘‚’Ÿ˜„’‡“Ÿ  +)&#  HŽ„mšÝ ÛÕÑŲ™ygmr‡‘†’™ž“’’Š“”Ÿ !,*'$!Jˆm¼–ÿ÷دvkw‡’“Ÿ˜ˆ“‚”Ÿ "-+(%! L†n‰‚ÌêÿóƒÌÍÕÙéùƒÿþÚšgu‘’‚“™„“†”Ÿ #.,)%" !N‚ƒ|jpRËÿá^pp~€ppysjh}§Õú‚ÿå—g……“”ž–““Š”Ÿ $0-)&# !PŒ‘kËÿán‘‘•°ž’•©—’‡vmn°ð‚ÿÏqv…“šœŠ”••Ÿ $1-*&# "R‰‚‘kËÿán€’¢­”’˜ª•€’‹ql»ýÿî†m’““”–ž–…”ƒ•ž &2.+'$ ! #T…†‘kËÿán€’“®£’’›§‚“Œiòÿù•m„”𛀔ˆ•ž'3/,($!# $V€‹‘kËÿán’ž¯˜““Ÿ¢’‚“s}íÿú’rƒ”–ž–‰•–ž(40,)%!# $XŠ‘’kËÿán’€“’©¨““’£Ÿ€“€”xvõÿö|}””•›™…•–—ž*51-*&"% %Y†‘…’kËÿáo‚“˜®œ““”§›ƒ”r˜‚ÿæk‚•––••†–—ž*52.*'#%  &[‚‘‰’kËÿáoƒ“¢¬–””–¨™‚”“iÍ‚ÿ¶qƒ•›™‰–ž+62.+'#%  ']‹’€“lËÿáo€“€”–«£€”—§–€”••‰wûÿùwŒ•–—›…–€—–ž-73/+'#% !(a‡’„“lËÿáo„”›®š€”œ¥–‚•nÈ‚ÿÂsƒ–›˜€–…—ž .840,($ & ")bƒ’ˆ“lËÿáo…”¦ª–€•Ÿ¢‚•ˆƒ‚ÿ÷l”‚–šœ‡—–ž /951-)%!'#*h’‹“””mËÿáo‚”€•˜«¢•¢Ÿ••€–lè‚ÿ›~–—–œ™„—˜˜™ž"0:62.)%!(#+lˆ“ƒ”mËÿáo”…•­š••––¤œ–rÁ‚ÿÐqƒ—šš€—„˜ž#2;63.*&")%,n„“‡”mËÿáp‡•¥¨–—¥›€–‚“‚ÿïk„—œ™…˜™ž#2;73/*&")%-p€“‹”mËÿápƒ•–˜©¢–˜¥™——‘rƒÿu—‚˜›™…˜šž%4<83/+&")&.rŠ”•mËÿáp••†– œªœ––——𥙗—jó‚ÿ…ƒ˜™›˜‚™ž%5=84/+'")'.t†”…•mËÿápˆ–—¡©š—œ¤˜—må‚ÿ§{„˜œš…™ž&6=840+'"('.v‚”‰•mËÿáp„–ƒ—¦§‚—œ£™qׂÿ½s˜€™››…™ž&7=940+'#)'/x”Š•€–nËÿáp€–‡—™©¡—˜ž¢qÒ‚ÿÃs…™œ™€š™ž'7>950,'#* '0z‡•„–nËÿáqŠ—˜žªž‚˜ wÍ‚ÿÊq…™›„šžž(8=:51+'#*  (0zƒ•ˆ–nËÿáq…—„˜¢¨™‚˜yÌ‚ÿÊr‚™€š›„š™ž)8>950,'#* !)0 z••‹–—oËÿáq—ˆ˜™¦¥˜™qÒ‚ÿÃt™Šš››•ž *:>:51,(#+ !)1 {ˆ–ƒ—oËÿáqŒ˜™œ¨¡™sÖ‚ÿ¾t‡šƒ›Ÿ *:?:61,(#* ")2!{„–‡—oËÿáqˆ˜ƒ™¨ž€™oä‚ÿ©|ƒš‡›Ÿ +;?:61-(#* "*2!{€–‹—pËÿáq„˜ˆ™ §œšškò‚ÿ“…ššŠ›œŸ +@;61-(#* #,4$|—Š˜pËÿáq…™‰šœ§{¿‚ÿÔvž€›ŠœŸ .>@;62-(#, $,5%|Œ˜™™pËÿáq™Šš›žuä‚ÿ¢¡ŸŠœžŸ /@@<72-)$- %-5&}ˆ˜ƒ™pËÿárŠš…›‚ÿûq˜œ¡Ÿ…œƒŸ/@A<72.)$, %-6'}„˜‡™pËÿár†š‰›tÄ‚ÿËu€œ žœœˆŸ0AA<73.)$+ %.6(}˜˜‹™šqËÿár‚šŠ›œœ’tøÿý~€œ  ˆžŸ 0BA=82.)$, %.6)~‰™‚šqËÿár‹›ƒœoÆ‚ÿÃrƒ Ÿƒ‚žŸ 2CA<73.)$+ &.7)…™†šqËÿár‡›†œ|Žþÿîs–„ž Ÿ…žŸŸ!3DB=83.)$+ '08*…™ŠšrËÿárƒ›‰œ„wñÿûŠ„¢‚€žŸ …žŸŸ"3DB=83.)$- '08+†Šš›rËÿár››Œœƒuåÿþ¤sŸ¥¡†žŸžŸŸ"4FB>94/*%/ (09,†€™š™™šš™š„›rËÿás‰œ€›v~èÿþ©nœžŸ¤¢†ž„ŸžŸ#5FC>94/*%/ (0:,…˜™™˜˜šš™™„š›rËÿás…œ‚œƒj£÷ÿø›o›€ž ¥¡€žŠŸŸ$6GC>94/*%. (2:-†‚™šš™™šš€™š››qËÿár›‚œœvl“ß‚ÿâ‚v‚ž¡¥¡‰Ÿ  ŸŸ$6IC>94/*$/ *2;.‡™™˜˜™˜˜™Œ‚{SËÿá\€| }}|xwsqj…ºé‚ÿô°k…žžŸ ¤¡„Ÿ„ ž%7HC>94/*%/ *294/*%.!*3<0‡——˜™™˜˜™u¼—ÿíÊ’kv•‚žž‚ žŸ¡¡ŸžŸŸžžŸ ¡ž'9ID?:4/*%."*4<1‡—˜˜——˜——€˜t³÷ ïîçÚλ˜wmt…›ƒœœœž€žŸ¢Ÿ‚ž‚Ÿžž':JD?:50*%1"+4>2‡…—€˜Šagnkorsw…“…›œœœ‚ž¡žŸŸžžŸŸžž(:JE@:50+%2",4>3‡€–—˜˜——˜˜——ƒ˜™˜˜„™†š››š›ˆœ€žŸ€žžžž¡ž);ID?;4/*%3#,6>4‡ƒ–——–—˜˜——…˜™š…™šš™š››šš„›œœœžœžžžŸž)KE@;50+#4$-7@8‡”†• ––••–—––——––ƒ—‹˜‚™ šš™™š™™››šš„›‚œŸž,?KF@;60+"3%.8A9ˆ•””••””ƒ•––••–••–‰—€˜™™˜˜™™˜˜ƒ™šš™™š„›œœ››žž,@LFA<61+!3%/8B;‰““”““”•””ˆ•Š–‚— ˜˜——˜˜——™˜˜…™š››‚š›œž-@KFA<50+!5&/9B;‰“””““…”ˆ•–—––——–—˜˜——‚˜™˜…™š››šš››ž.BLFA;60+ 9&/9B=ˆ…“””“‹”• ––••––••——–…—˜——‚˜‡™€šŸž/BLGA<61+:'1:D>‰ƒ’…“ ””““””“”••””•”• ––••––••–—––„—…˜™™˜˜‚™š›ž0CLGA<61+:'1:D?‰’‘‘‡’“’’“””““””““”•””••”‚•€–••––••–„—…˜™™˜˜ž0DMGB<71+;'1:DAŠ‚‘’’‘‘’““’’€“ ’’““’“””““””““”••””‚•‰–„—˜˜——˜˜žž1EMHB<71,=(1<‹ŽŽŽŽ‘‘‘‘€‘’’‘‘’‘‘’““’’“”““…”…•¢ž +€=<6544€3200.++€-+)&&$€ !""!!€ ´€MLKKJJIIHHGGFEDHIHHGGFFE€C€B€ACCBBAA@?>==<;::99;;:998€7 6642210/020'¡ gwwxxwoo€n€oldcc€e ff]WWZ[[\[XN‚L€J…<:….(……‰& |¼½½¾¿¿€À ÁÁÂÂÃÄÅÆÇÇÈÈÉÊËÌÌÍÍÎπΠÏÐÐÑÑÒÓÓÔÔÕÖØ‚ÙÚÛÜÝÜÝÝÞ߀àáââãâãä䂿 çééÛÚ  ºÊËÌÍÎÎÏÐÐÒÓÓ€Õ ×רØÙÚÚÜÜÝààâá€â ääæèèéêéêê€ë€ìêëêêéé€ëê€éè€ëêèëêêéç€êM€ ºÈÈ€ÉÊÊ€ËÌÈÈÉÎÏÏÐÎÌÍÍÎÏÏÒ€ÔÓ€Ô€Ø ÙÙרÙÙÚÛÝÝÞ€ÜÝÞààâ€àââã€å äååæçééêéé€ê€ëìíîî}¤¼¼½€¾€¿€ÀÁÁÂÂÃÀÃÄÄÅÆÆ‚ÇÈȀɀÊˀ̀ΠÏÎÎÏÏÐÑÒÒÑ€Ò ÓÔÔÕÕÔÕÕÖׂ؀ÙÚÛÛÜÛÜ£5¬¬®®€¯€°±²²³´´µ· ¶·¸¹¹º¼ºº»¼€½¾½½¾ÀÀ‚ÁÃÃÄÄÃÄÅÅÆÇÈÈÉÈÈÉÊÊËËÊÊÌÍÍÎÍÌÎÏÏÐÏÎϾ£ E—Ÿ€ €¡€¢ ££¤¤£¦¦§§¨¦¥¦¨€©¨©ª©©€«ƒ¬­€¯°¯¯€°±±°²²³³ƒ´¶¶·¶¶··¹¸¸¹¹ºº¹ºº»¼£(‚€€  †‚„ ƒ ‚ ‰€£ '6987554542//€-,(>•”žœœš•˜—••’‘‘ދЇ†‚€€+}|{yyvqmmkkiihgfba`^\XXWVUQOONLJIIGDC@>>=<1¡„… !! €ƒ‚ƒ€ ‚ƒ€ƒ5#    Æ Ÿ€ ÈŸ ë €ê ê é  é   é   é   é   é   é   é    é   é   é  é  é  é  é  é  é   é ! é!"  é"#  é#$! é$%" é%&#  é''$! é ((%" é )(%" ‰&Ž+)!Æ  +)&#  ‰šÝ ÛÕÑÅ«†Z< À !,*'$!‰¼–ÿ÷ئW&½ "-+(%! ‰‰‚ÌêÿóƒÌÍÕÙéùƒÿþÚ‹3» #.,)%" !‰‚Ëÿá2ƒ$0=`›Õú‚ÿå‡$º $0-)&# !Ž Ëÿá.‰J¨ð‚ÿÎN¸ $1-*&# "Ž Ëÿá.‹C¶ýÿîq¶ &2.+'$ ! #Ž Ëÿá.|òÿù…µ'3/,($!# $Ž Ëÿá.Žcíÿú ´(40,)%!# $ Ž Ëÿá.^õÿöa³*51-*&"% %Ž Ëÿá. ‰‚ÿæ:³*52.*'#%  &Ž Ëÿá.‘!Ì‚ÿ¯²+62.+'#%  'Ž Ëÿá.’VûÿùU²-73/+'#% !( Ž Ëÿá.’Æ‚ÿ¾± .840,($ & ") Ž Ëÿá.“h‚ÿ÷B± /951-)%!'#* Ž Ëÿá.“0è‚ÿˆ±"0:62.)%!(#+Ž Ëÿá.“ ¿‚ÿа#2;63.*&")%,Ž Ëÿá.”}‚ÿï6°#2;73/*&")%-Ž Ëÿá.”PƒÿS°%4<83/+&")&.Ž Ëÿá.”9ó‚ÿy°%5=84/+'")'.Ž Ëÿá.”-å‚ÿ›°&6=840+'"('.Ž Ëÿá.”!ׂÿ»°&7=940+'#)'/Ž Ëÿá.”Ò‚ÿï'7>950,'#* '0Ž Ëÿá.”Í‚ÿÊ ¯(8=:51+'#*  (0Ž Ëÿá.”Ì‚ÿÊ ¯)8>950,'#* !)0 Ž Ëÿá.”Ò‚ÿï *:>:51,(#+ !)1 Ž Ëÿá.” Ö‚ÿ¾° *:?:61,(#* ")2!Ž Ëÿá.”,ä‚ÿž° +;?:61-(#* "*2!Ž Ëÿá.”7ò‚ÿ|° +@;61-(#* #,4$ Ž Ëÿá.“»‚ÿÔ° .>@;62-(#, $,5% Ž Ëÿá.“.ä‚ÿ’± /@@<72-)$- %-5& Ž Ëÿá.“a‚ÿûG±/@A<72.)$, %-6' Ž Ëÿá.’À‚ÿʱ0AA<73.)$+ %.6( Ž Ëÿá.’Oøÿý^² 0BA=82.)$, %.6) Ž Ëÿá.‘Âÿ¿² 2CA<73.)$+ &.7)Ž Ëÿá.zþÿîE³!3DB=83.)$+ '08*Ž Ëÿá.Wñÿût³"3DB=83.)$- '08+Ž Ëÿá.ŽQåÿþ˜´"4FB>94/*%/ (09,Ž Ëÿá. bèÿþŸµ#5FC>94/*%/ (0:,Ž Ëÿá.Œ.–÷ÿøŒ¶$6GC>94/*%. (2:-Ž Ëÿá.‰2ß‚ÿâh ·$6IC>94/*$/ *2;.ŽËÿá&„)=h¶é‚ÿô©6¸%7HC>94/*%/ *294/*%.!*3<0‰¼—ÿíÉ|8 »'9ID?:4/*%."*4<1‰³÷ ïîçÚηƒV4¾':JD?:50*%1"+4>2‰36:10$Â(:JE@:50+%2",4>3ç);ID?;4/*%3#,6>4ç)KE@;50+#4$-7@8ç,?KF@;60+"3%.8A9ç,@LFA<61+!3%/8B;ç-@KFA<50+!5&/9B;ç.BLFA;60+ 9&/9B=ç/BLGA<61+:'1:D>ç0CLGA<61+:'1:D?ç0DMGB<71+;'1:DAç1EMHB<71,=(1<ç +™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿá‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿisÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿisÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿómÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿákÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿákÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´kÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´kÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\Zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]ZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿOZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿNZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö Øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò  "%(¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ*(%"  !#&),/fþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò?2/,)&#!  "%'*-0…êÿÿÿùøøø÷ãÔíîîïïêçýýûûûûûûûûûûûûûûûûûùøøøøøøøøøøøøøøø÷÷÷÷÷÷÷÷öóòòòòòòòòòòòòòððððððððððìçº<30-*'%"   #%(+-0258:<==>?@@ABBCDDEFFGGHIIJJKKLLMMMNNNNNOOOOOONNNNNMMMLLKKJJIIHGGFFEDDCBBA@@?>==<:8520-+(%#   !$&(*,.02468:<<==>>??@@@AABBBCCCCCDDDDDDDDDDDDDDCCCCCBBBAA@@@??>>==<<:86420.,*(&$!  !"#%&'()+,-./0012233444555555554443322100/.-,+)('&%#"!   ic08=þ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ =ÿ“ÏÁ,]ȾC‰†$R¥R†[Ãj°Þ+]\g¯SÆ0Ñ<įZÌÿw»ô·ƒ6í[¹±^ÛéYi¾a¿ƒ=ÏÀp)Øõ•¼:G´6B|¯Àbù ·khŸ’1`ØœÇÚ,)Ù#÷çIpšŸ=Ì¿8z¯ÒÙÏÀôMÖÁ` '*Vñ¸û8utlúÃxu]sòûä‹Lu½cÞbçy¶Ñ£ŽÓÑTy±XÙ긗½ÇàY´¢ÔHTfoMwïž9ƒè­AõNÜ* …=“é63[¹Å×·S€ŒèA/÷ròú¬ Ý xl\Û|ª!4ú—è ,UÍm tœÓÓŽ«q¹Ú"òoö>ë5ÇÓÞÜ߃7tú©C"³ß£¼B”_ åÝŸ÷qV+~gKÃí‡Ú3ê$ã9Lž“Ûl¥åÕd‹bžTð?ÝògÙ{):7«gÕl;–4?_ Amf§®ÛâRÀ›"êpfû~»žZm¤DV°‘ûKTÑtA7£Áõ Áõ @|å$ã9a`—ˆ­0TTÏ7B €£¹):7«gÕ<úRsbÎòLàž´ILQSïYYL#Oˆçõ@ià$µ<º6˜ÑwZ¸HX˦ÁYŠÍýI¥ðÇàÉ‚Ä?à†ž TºÁ‹b–ˆîu¶©Ö¬xr7ÆT½º0à¿)ÛçEyÀNÂ"f~ü›i6¾^°L‹RN°FÄÚ×üüv^íd¥é4ÔåwÕØ«îßò`_Üî/þÈUn3c„Îdd õ8ÈÍPÄ£u®…:g}ƒTúã&\QñHt5Þ”ø¨ê‹>· +Ó_˜s‡heq$# ϸ#‹_ž{:¾©}Qöf'§nMÆ>¦éfêâã•GÛå}°~|ºFn§·¿鬡žÃ¹$"Ùý,¥,*|ÁòúéR©bRÍRM­ãÛRFñHü$ 9wíÅ x ¡÷!üç Û=ÿ@çÇà´öÀ“ÝÉ»òËÊRûÚá7“¼Tþ¦¸T>pCŠ˜.:™H¨Þ-.³þ–¬ÿ$ãK€µC—áøÐ(mÒ«‚ëªÑ%Ù2+ ðDÁP#Ìýhü‰Aÿ:?ÕÏ1úƒ£flAXS&ô¤QÖú¹‚~í´L}tã2ølË•HE|*ØQî½ç{(ý­–£;¯T»ÐFñ9êÝHMGöÚ8Å•·™ÎÑ´›LÆ"GËâd Ãí4ƒê0õ€•ÿ=ªbWw×k˜SATüƒuw©9‚(}œÙD‰Y•ÚÔþú—Úƒ‰©…pÚš7±ÁDƒî èÔÑÌwÚÖLmÀÿM wàµVg”5ØËÅ.¯*Ã¥”b=1ýuöîΔy6jvôk55ˆ%™jÀ«Ž–*¾|aôý‚…Ò[ˆêhsÂJa-ýϧ”1ÕþÇàoti(wGÿ‰kUïzçu5Š“æÖ¶aPå½AAãëCüqÒénO„n„"bTÆçPÍrûd=Ë+Þy•«Ú)†K©, ›­ÙkÁÒ­!}£nµâ¬$_÷Q­¯§ÅA,EP"jBÕ›†xã~ôïS&9¾F¢U›Þ‘ø¡®dý‘¹:V3輸ÂÂëË’qGÇávÇábAöÕ€µŸ:¾9–i¾Aᕦn1;°QÀXŒèURëêàÃx„ìaÙ4R7.þ ›(?KDÆè;”²hjØ(öxXCrGÚàÄ•§ÅôW×ÇGSÍDé5ð? 30ùà¼ÚFÅ~d4j¹̶–93ÎD)ƨ*iÇjQ¥Óƒ·á:!Ë&Q‹¤¤¹á~c)†œ¢Ó|õµøCyn‰¡öâ—lÔŸ!” .ô„?=ás…÷áa±)|ü臌|¥…ùÍá^‚zæ6àl»"­T_"äi¡ƒp²8¦’€HR½«áÙvôà!‰´àa8–8§ÖÅ©¹²fïæÌ1•éûSVíÐ~/ɱ† CépÝøT„AE}ùùnû¼œe*àù­U"›BpÖŠró"9)€BõNy+²“vüöxôFVuÎÛ nN¢‹Úuˆ5æOÝKÆúXëÔ–t>ûa|ñÈÓUq2JÇDàøvfzöˆø¨ìÚÝ/µ- Q—+TÏZ=KÔp<ѬšÃí¥cð¤aøP`»½}/õQQN"´àí`;uk?u0U–†w,&$tª@Qa¹.eë‡Ø)‰±ä×ÂÖV¤Þë7´›|ÕÃqÛ´¥¢]¤:VÄÌiˆÑÜ@ô1dp°; ýSÖäda¹d*ù³e“âP„îR·Ê{<î3¸âMê›Ô¡¡òE!œ•CY\²F@R3!ð}%FiMÉò`%P0­|)°*ß ú³|¤òùà÷·àjô4h”çQÉ…S†¤!•™1ÕÛ&/þu§5`ßå¦që=5¥¯8û”<ÍÆW¿hüLÄ8æÅ3TèmøPZÃê`:‡Ó‚ÞRÀí31a[}u©?_“[‹N8HÒ4-øO¤°(¨Í# é¿ÁN{(ë?z·{ü²°Ð{\sœƒ£;WŽºQ¨1°b¥äAÜ¢Öì²zÅ**/‡ô2\D-6´ ¸§ÁÚU–AcQ¥°üªBÑc›,<•ä F‘àJà^#†ô^ ½MÒ¼Ú«©Sí¥šØ,þ<´[rçUØ~çx?¤TÒb|‚ç©EâFŸßU‚û oÁõP0û^ }MÀ»{LdÍB¶XåÎïž$°|Äš?ÏN2Ø:Y¿—Â1¸`Lc°;7µ¸”xÈI’»òGåg)×Ì0f˜z×~NÇJœ‚y¸:½BS-¯á@ãbè +á7ËžÓF¼dia$Þuš[˜Áã¾gñO¥=‰0©V½’jB„º¡kÉ '„IÛ2£~”`ÔÍÔí+?–?³ú’½*àO¯cö‡®©¿Z ¹øÄ“J„™ö$m(ÿdà3›¦v‘pJü9 NÕÂÝ«š(«æÝt¹a³\Ëà‡<Å«4“L9AXcÁ» Wì^C]*öééÁÐyÕÞ³ÄDXÿ'$ËÓ|·®Z™pOW=3½ã¬˜ÈØ?ÏZ»InWb„i§D–)äf‰·N&¬ƒùŽ€ò‹(å³tƒ\4‡%GðIþË‚PëØÄoZ"”"a«o+o·ám°ºÍàs_TÇà·µjµ·•(Þí2Þ¨uKÕúÓÑd¬€mŲ <•ŽK{¢MÐNË4kÑsdÐxÑ„—Î jŸ51!„á.…º«ÜšP*e`±ºA÷+ƒé„LÉ]^ÒÁ&º?t¢±úÛþ,aü²åD2R‚}‰Ò·悪œò×[ÔQJ=P{ oâ`¡[BWZ;“Ö«W„>t©to&Kpºc¡Ž†AÏž2¿´ÖÏ(-‡\ª-¹¹6Ìi1k¦£–ÌyFl•Wæ€`x¯i«_QRk¹Ke¬@Ö_T`Í.tó,ûÔ]¹ édµï®_ õö"­¥Z–ÇáÑL~o·_@ä’9ê@°ŠFÕ‚/AföîeºÙ~·ˆ)û…‡–ž˜Þ=J' £½Å)âNÈ·µLiúéb«¡ôiý2ðLNÈGÛØ1ì÷Œ œšþ `•£`Õ–x-KgN/&Ñ«­+eõŠæÃãEHû‘›Ñ+?œÜ‘ÀîA]óq¿´j– -§õ/±‰:DÕ5ù_ç×óUIïšfbn­õøƒ4 ­Æ¾ÄL²•sM:ná3ËÔª¶Ùö’wzÏvb]v-?äLJ ÙlÎí YgO8†ˆü¥T6ö¼ÃY~h—ÈEDÞUi±¾óbíý#Äd_ßþUøaæZªŒ1„87s¹Z­©Â\H)oŽp¥ÒÅÁN”ZÕUZÞ`'hh»Š}®…çí«†¼œu°È‘›£=W’~Ò’¾Èì[„º!IåÝ®åhp(MoYŸŠØBfç²9Ž•2sZ~ÃêLJkôØÔ±^\ÄÉ'>ž3è\OxyÍ3ÉÑá7ïZ€ÁÏʸZBx‡:¦6WÐ-×$kM^Ŧ5'$¥íqÖà kƒ×¢m°3¶«×‹@/!c#,?›ÆÒü±µj5Ü+÷#~½EÝO4}ƒ e¢)̸#–…ps* ²pT¹%…˜R +Y&´<ÿNóèÚ˜á+žÑ|.?ìÁh±{¯ ¨lj ¯ ÷kµõˆ:ÿn›EÈßa‘2iÀY[Xà”¤¡}€yu¯ø¸¾‘ËgzÁ»¡eQ|¼ÎQÌ2- Ø?ÌLDúƒ»Ñ9â"ÞUs†6n¡Ú·•æ˜ÒEçœO8îI7gƯÝt§¨Rýõ±òrÆâÈ‘ËNrîÕ@ª‘>Fh´à¬ž†úXfÖ9óùj6SóŽŠ—ï¿<ÎOë½Ìùô÷4É*“èùÍžÊÿi!] ‘äåÏ*›'‰Pú¡*0hLÅØö•±Î¡±Î‰œ6n°°J8\‘Œ1³ã=ò./*<;Mímå#ÁJ½²•Ò¡Í¡Ÿ‡5W6þíß+>ª* § mAV Ñ ¼Ž¥ƒ»!A»”¤º’•HrTëÁË’JIÂ|Ä ±è·8¢Aê B½öþWl]žãÃ*muX ¹Œ ™eÑŽ{þACÃä§& öÔœ=àé2cÊ’³»8ô¯í¢¶ŸéÊŠwG’x`ÂdDøˆ¼ž§ôô†”[h(aÅÂYì/‘4Ÿ@‡K6ô?J†̧ZP~Xþo h7¢ªþÐHHw ±E—t9àq}úó6t‘*0›Ld¼³IÈâø6zØŠ+yÉG¸Ú-_lóü /?l*5‡ D/#wgÜ—áÒÑ%Ê|ÈüH1t›,'Å—8>eµöŒ:ŸñõnfÂ|Ü"ß5ÐèZO†(c÷° t4‹M·Îïr=sÈÈÇî²Îøwpi¨[Ìùï3šï_œ¡íª¿žÉ$†‰'aYùô'4"’®‡"U™c+ˆ8…ê’ñÓÆÕ;)Jò@§ï“+Î0Mkq™6³O…ؾ!â—R¢¹#–†ê¼xh’¤xÝNœ3£SõÿyçM6ÐNì9°µ’oc#¯qœ+¸QÎõ“âùîTµ!±upå#~ÃÅ1° ªK(¶tr‡aþ­¹ôP3EÉÁî/hÉÎÞ[ΑªšWi3fߘ‘ÐBDЈ€Fër•ÓÓâ»Íb«¢û{eví9†1¡›†C#¦Éó¾`€ž£¦ ‚.ïDºu‰š©z˜4B.ÃíÖˆ}º¯·K€êœZÇé°×Zæè6|‚ JJìTu:§¾šøÝUͰÁkjzoÐ¥_Ô[܆œ©_ ¾ú$=Ú1Λð“@Jh\²Ç:ôM„Åš=ÇÙr°:8H›í'\¼×JÚÏk™D\„[¬×Aö ÿ_ÛqÖ¢T±dKdÁoÓzØùB”,aK ¤Ípí`qTÂcLT¡à Ú?…§\±^ê9Þ(þ lf+·;yR² Ú@1=:Z'”¥ÌƒþB_’À¹î( ‘û€ƒ0ùÁ`ç¥錇[+Ý_¹Ó”Q°^T-pƒÒ]ÑX¸U¯¼Ÿ¬1ƒH,L_Yº?º^©éž/ 1ì.± ¶˜IýRMž’+16SËæsždr£¡î˜ÞX²Ö-ÔšyY ‘-­ÊÓŒ¹Æ O¡÷óžôëp,"îD=”ïÂÎjéˆ)®•„ÊÑõuú:»/û fý R¿ãˆºþnÏ.Ũg ñT²ŠŸ‘TG É¨Ñ–Ïi=n{Špëíî+ßp«V¢ôbíÛÂz/¸RIîñM^ºÏíϸu âP2ü1)XãŠ_8ÏeT?Œ÷ÿ9¿¥+ØqZ ^Þœ®îW)é¨aò)H‰øQ¥TÈYü³TïôM]qI¹½x½ŠØgCt[*0}p–ž‰…­MBˆ¶nOˆš&\û\š²AbÔd[®ú†åuÖÅ«9Žâ/eÜl;$])ÿa*ö%|Võ«gØXÓ•Œfn³ÚU§òÇcê‘îÛOõðå«ùù1[˜ËÅ{K : {–"ôèÆöBI:TÞÌ]½/îJétµ?/×Vñx.Þèóuꉆ‰¡kƒ”T+s%\¿NFJ^€Ä˜‰ÏCm=F(ñü~Pdeà æ7¾b/‘>x3œü2$ëG7õé;ÔÔ¬ÙIÎÓ(%»š†I—E"á÷“Éi[„ì«f2Ñ™øña†E¦7‘:  ÏÇï—Šh± €ò©p~`ü¦3\™Vl§ ÌõFü’Žg¦ž täÑøp ž0äÊÏ\6Zöµó†b³]ˆ§>–$–qH–΄Fæ^]љÄÊi†´&‘æ‡Õ¼w*öi|^Ö[¯½›ZôñÆÌ¨ý›œ’ÐÇ¢êÎQˆ>£›ö ¥dçÔîÖø•ó5=í?y)®º`*01wÊIø9P…a¢I—eõr¡#ƒMµ4¼³ÁõiüV‘Aõh°éc§æsм°t"H±Ì-ÿ;E.«öF ‹¿²þ®ôdã…´ï>EZø"Ï0R¢ü„®[)y¼«ƒ›g‡¦°éùIôâ§Úã׸XÞ®ÿOÓ² çã]n>"`žsËzš$.–Ù1M£›% ûOPØcçï÷x¶·,®úÒ± uµNºo¡B/”°œ©¡¹\=*ÂÉ’­ÅÏKƦiz¯[®xYÎÚñ9è¿Þ”œëS/ ¯ÛB7)ñ¤‘ÛÕli M¹ößzg þ¾Ó£z·pÖJ]•(¾ _½7MGŽ"¹:ÕÁž¿ru“nÙÅY¼ÎÝ‚—l°° ;„H}º ‘<ôÓoúø §egÐã>0æÊ ÝJÚ³œH-ã”}(ê‡Òæ¾Å›âfÊð·9åË󞉡å^˜z˜S,kù¯[ [«Íë³¼T]ô(Ô©Ãtwºñ‰yJꊚP€ÄÝ¢Û5eSÖJ;o7´À^@NÖv%ûÍ5˜¶Í\п‹¶›ShÍ´;öÅíI¶ÛòÇ‹(š*,¬7| }Ká1þ ßÊj¹AyÝkoâÅþ²§5ÃtG˜I!êˆ!jÚ2^4CÓ™EÓž KJܺsˆðG§CÞë¥üøuVHz`>TΠÁ˜[¬ÔªN í!`µéQ)‚ÎjÅ/Í)–7oqð“°R°*­ }»¢ì·è†ëÚ _9²r h>Aðý˜” -h·|~``¢4yêG(Ö„!°ñYàø'«DZù-®JßÑÛà¦åuµSùU4òb÷‘Õ&ËŽ:BækÏêÞ:Sç„ß7”w±úø •€y[ˆU„pø;€Š¥6)VF6q“/øû»h3mÔ‚åï4Ï«>¯UÅÎT0J¸Á<\Eí6•ªgRÚ U»€x ?gù;ñšÎ]û=uÛ‘Üån bâèù**äj‰¿`9ÕÏ)AÝk&èúEóý'è?+jbåÿpÐÇá]GáOCítäß&èH‡²Ä³o d…³Ÿxs½Ý — J„Mb«®ÑÖ¿—–] ÂZž*¾êP*(m:#ÿE±“N÷ÕçN •Œg1#ƒp =á*ªÇOÂð1¼ö Q¢#yŠ É‚Žù"ƒ^¨²÷“MOJ*ÀÆ”q\Û “Wä 7CÉ~3ò–ê5êJJê»EÊüÛ̱ ·ª¬IèùVÔnS”óå¬è6¬_ íN¹x¤œrÌL¸7˜AòBäùšõŸçCWr¯Ï'U€™½Îw.F—9‘H)ÈœÄ/ìhî Òîšïѳ@låõW”ÕùlÙÖÖy})“Ö‘Ve˜ß45oxá”9GàÆ¯§“ÈÖOâ Ãï†BÉ¿“qØ`é8tFcnW5.ÂòAÅq¯8àï7}ŒeTëN—üp‡.ÑÐr†èR]X02 úö§~ô]Ô„þ}äÒ€ÍÐXG—ðI_(H¸"3Õ”Î1vzzl«’y–8sÄÀ‰(ÑðY¡á·ÿ {=ó·”.ŠÎ©0>‘%_žÎˆ|cÒ0“ _18 Ûe éPÍÆw‡bS┪˜ çîÿYžÝØ#Ì¥ˆJÐçðÓ›íÒ/á¡ßÃD³øi?ðÕëí¯¿†’aûn/Û Ÿ¶¡ý¶øñ¿Rú¨¼»ñô$ò¦Ñ¢]¯Ñ)ø^†’ë”kù„æÇõ$ô”¬œ)À®¥à$Ã"Þ`m&ƒÂu”ÀCu™ª2ó§3< ³ü€÷˜²ÁR4·[Ç+ !:«=cþ´Æ}tñ}·²w–ù F‚š£¦L;TA&’ãǵ¯rO¾§„·«½‡´E~1Ïß$2õøŽ{ö…4Íåmô¾,·¾W›¤S½dŠýîÜL z!>¿â¾Ýw’~c’•Læ¥ý„8&šdȺŒ©3ôè†åD7¬3"•¥7Ès)…€d Ü ÉZâëñÑbƒïÒ  ÏT®ú´îøÝ„õmáô488]h ÷û¹§I#!xdË·rE c—ùíòu[ ýyõéDÌU%fÁâ˲ñ¿ø@'˜¸Û1É‘„LÇœ³Wô•Ëd4¤ˆ°+LJýB>ó„ë …Ãz¯iq¢óµ|y ¦à†B€ƒb‹ÇŠ{g½mx]ȤX¹ÆpÒûÌ¢Vå\›Š7ئ­Î¨Üá ÜÖ¡ä‰÷YdWÙt­RP+ÛºzÊIíœ'%yTñ“r÷ì$ô¿âÏvü ]¸l·sE!â2ŸiÀ1RB¸yzOáp_ßE£_Ÿ¶>½ÑÃ1öÌû* ê]z»«v|bäpõ¤Ö Pi$“Æ{ƒÝ]ãu“R/¨Nš×îÍÙx{͉Qà “Yõzö¬{æ"` 2L›(,£§vu|hú CSÏïq+À™†ü$ÞD5‘ì‹a1ÏŠf Ñex ÆÒNXæ™&E'öY‚ËÌó«ÞZ6¯ØÝ!|A üotÜ.9Ù¼ïàíöÌ33á0S¨{D"Í¥°Á…(`w;ík0©k%©A¨çzpÕƒŠ%éäÂâVž~RŽ…7ô§Ú³ aˆ—!" ¯™Bıñ€ÈìÑ2ŠNØ4u}5MT´G)?€ŠÛ.ŽõP]\XÀOzÇLSøA>s„ãî% ; 83èdzmˆóß_v½x"鞊w…!:£·ˆ’¿¨qÀÿ{Tqµ|#z{Ÿ†èFʉ´9h¹Þ#¿ˆ¶éPÄÂ7buHWú­Q,wïÕ‹ó6Áe«ð/—†~¥£ ôR(ëí]?/#œÄ÷Åë@ ÏÌ÷ßÍp6»Lºéw¦CKñí¥âv÷{)ϲ®Ù¼¾qSIàcd1â·¨ÔVrçëd`÷|à³Ú´¨1Œ€Q|ÆCÜ̧_ĸþ¶¦aq›‹CxñíxGGvå!Òß÷®·Kü¾aï3°uMÓУÊ^ŽËZî ‹éÖT@ûñ'ôJ”kpGœFc¡ŠØ¤}N¯†ƒ0VY8±PÁžÄpœzÅËdžë]¯òšOnc_;NÑTxš2öf&J®w qÉv ·ÍU{+!²a!ÜÙhŸyÂß"nm*Y”WŠÕ½`Öå/Ü\JX8ð¦©ø tGÿ7ÞHñ`l8ÿ @¢ œÅ&ŸY5ÁÃéäÐ8Œ…ÞW»q.Ò kgø"˜È#PŸ-œÝí¡áÉBBT‚mLÚ¥´ÞúïûBÆ|bP(4¡ÆL»Œ9#mØ~œÏo"¿#øaíÊ}œ$‰;©éÇò„lUÔ`ÈŽQçÎa”.qrÁŒ6t^sažÞÒxÅ“gåB"î‚!­NoFg_)æ ñ–iCtcTr&„jahÕ-¡ÔË tS{ çõŠ”®ß— v4P¦®Õa+Ø®x@k®ÚŽáI¢êÛµácwBœÚºØµa˜$UŠ\Šú|ª$î’Bëùídz¸Í¨n 4îÙŒûà”ß>F6‡îÅßaFð©Gÿ…$æ³ ´ð‹T>+×+¨$¹ _8Ãk­|džÞ¾%@ ŸÒÅÈ#Ù+y,p! k¥Ö?j©kÄàÀ©eªÇ4/!ÍYGÿ$¥Ø†<˜ýé“*öí7uN)c)ñøÔl*ÅmÑŽÙ0é-ÜCÏk|FùU¿ ¨g Œö.-%;èzkÔ“k¯¼ùh}i_¥‚¯¼….:_{€Göð‹êæ€0ÞSocTkMe˜œ Ì:'  |ê+%öX·i] j‚]N±R &HÐá> ó§“À†ÉÚÀVDÙ©uÝ8ÜÏ»f§Ôs˜ås½˜¼Ø¯Egh‰ùâ¨)›¯d ôŽþȲx gë$àôWèÆ{!¥WÚ¬’Ûxò¿&¹‡¶×E#ºD`Aî‰ý ý¸+ Ç%FÞbâܲèFؼ¶¯Ðë!f¾÷œ åMB”pêË ºÊnL£6°äºçÏ_Ûû¤w!òÆ®OûžCa–'Âú‹…s"HÍóîÏœ--²N¦…ÝÁmÒYm!‘!]Êâqo/¥Ã){]Áʨ¨eo: ^ï2µž˜-Éȇ<2tæqçouÑtð…êí†à(~ð?\Zªï:^ÖÛ¶nùLox=ž¡¡’÷ð/XbÒÿ•´÷`ÿ{®ë ¡Ã˜H·Á·îŠ hõh]T+ÃÍïÚñiŽ‘]ÞÙåÃUVrdz,°¿AJ8•Ô{(÷ð/Ô™by ô²ÿ0;À ºîW׈\Òî4à¡ðU±œq)[°[Í–[j0$•Ð Tÿ Cµ4©`ž>âÉ ÛÖX™ f—ñŽHñ‡Qñ?ÞÇÝ!.¢ÑTjìéÕ} …½A:Yκþ&ð©< Rïed(” ¯~Éö;è–U| ê]èȈ㭶Vr‘O‘P—õC«ÍMu›ž)¤#•xñêî“åP“f3,|ÕùŠßj¼ÈdO>ðƒsé[4zp–álÔ³›wNl%$2ŒU»E—ÿP+Ë/ÍO_ŒT›àmÐ0Jž=Æâ«¤é¼YöÛ‹;碂8œàîiQxlÒæI ©q"9²S¨PÏ‘^ /,}çܯŒ áÒ>oÛ=6ÅKáÛüxq6×ÊJD„‰ÅÜ[ŽFòDõ*D§÷$hº\åg€cMœ¿3¯Vú7€ýLŸ»™øGìd!+­¸Þ×u˜Q†„™­êôrhDMkr€¹¶:ñЦÑ6aüã_¬HIAM'Ý!›˜©Hÿý t*¶_üYÑê>OÇ|˜xÌxªþÝ6+"×Óm–‚»ó²qËWË]¡õñ®V¿¨ÖÀ5ý€TÑ—¦m2…áf˜«Ž €k ?ÎãBÙÏcz8µ¢ÀIþÆé¡ÖMbŽNE@i&TÁÎT óJÙæ)ižRuå à7'ŽÔ‹&䯼öŸ\³¤•J:V¹ÚO1æ)qD-årʆUGÓšJœnÀù™„!l¡ˆ°:ÄC¶¯cv ¯cÇÌÐãm—øjÐ})·²Ê9Ð^ÿd/²=)ôýjÚ ÌQ ÓM)¹7GLã|æH>_go‰ERB.Ö±í¼ñ>ÚRî¿´ §\Y°õ&ÖÇzgÜTá¡PñƒˆD"òÏ™%„¦Â™ƒˆÀz=¿çãöÔß¶úý´í½1ûjûêÒëêx¾­Âú¨«ê½'Ï\ý·ô_ˆÃVú!)$ËŽhí|ºã [Ô[Ìþc‡pÅO»°ÉK’O Ü»·¨¨à*u*º9ýCêŒdá§JIƒx¯ÝpLR9UqË›ÖpÙýÄæn­F Šë‚1@UÈîVêUä÷hd‰SPøiEÛ)vûøA‰¾©} Á©ƒÞ¹®öÑ ¯C{ 2T}Ù?\Nú䬯Ì"ãÇžÍôó¶. )óçaÑYh»ûG°ü ·Þû„c™û66›û­ÈÓ7é3â^¿AuTÎr¡Ç!¼ÌðEK‘ÃCjÙÝ·Ž¥äÈŽ¥7àwR¾††BlÌÊC­akh÷%þÍ~s¤Q@rݪ}ëåÛl˜Ñ>òÍ H@X°)¸ëó°À0pžmâ«‚:…§²QÒ뺜Íot½uxÁÀéð…ï-æk}§Ÿ’˜7& ;uÛ Wê"oˆkÉ@n1~¹n+B.£E¹êãˆü¥.ØéwlÕ³Y@R ‘(ò}àÉ•IÜ¥6nilÕÃÐ D¤¦ª½jsò*Ìi&¤Gë K¹ÁôßVü*«–ýG)HëcÜBc|æß'cÿLÔã `¹"Œ('AŠ©†7ðìˆ\Z`Û6¹–Œ—ÜÓÌfqµPo„;7|æTÑmEßϺÌoÒ°|]ÙónÔÖWЇçO¸t6“Ã¥hŸXé¶¿Ç8Ýt ‚²ö ¥þ޳„LçpÅ5ؽ8 Ü~ ¿'7׃ä4â¬]’_éÞZ+:‡³)’F›œ°•ô¶çLÿHGð–îI±‡Ahõª¤Šd†k¸Ø…”AÀì(ewªrm Ù申˜sŒÞï—ëÀ1Ú…úmWîÈýÖ1öO””^Þb„,Ÿ[±z2B®¯9÷·êpF?ýoº‘ªc´z¸·f 1à_qTTöñ¦È¬¨™fùûEVØÍÍÏe)Åh5Úü̞ʼnZ*ÏayÔ¼5ÍQØzTæàÀ‰}bqï\h܇ÍJ©^$Ùß­‡¤þ¢}v«%¶Bó@Zä@­Eó§%“ º>U9#ÒôÇyCT¸ËC#,©ìþ-û’ý€Žˆd1SÐäúöÂ9èc»þÕ*M…ÓÈ€{¾¸w1mêù:T¹ÄivïóVrƒmYa¥Qëônær6±Rû…×ÚòÏÅ‘Cöxf•ÿBì°DÁò¾°üÞåíà·*Ôì‡5Ò?’I›²ªòÖ<Â>}r€q,NÖ×àÒçÃÉs·SyP ¤D—ÅpúGÆÎîÜxÁh’(v¾+ñ˜`24jA«:„”¸*Õ|*3„W. õÈå)ƈm7ßtº‚?ðò¢d7FС¿¯æ©!н…´sÞsDWˆz¿­R†ÉC軼©`=¦9ºµ5|°Ürç†õ­Xhãq±†‹Ž!i|Ÿ‘&‰"bê[i8FšŒlè¼iõŸÐ..M€iC¿ü†¥AGPÃWz½ð¼’ûG‘Ÿ4“Æ@V_¾Ó¡–Öéb¿ð;F• R|L^;kxz§¸Œ1ˆ‰Z–…íññ=íÎ&ë™(‹O`ã$Š †”±|ðEÊYôhrøYôÛÔüì¿èîèdtBt‡¦«ÊC 6…ûÄİgéß ì@‘¦LòÅ U¡`:’Þ'‰%{ÿ‡œ¬%³@°ìÛ•^c¦ínë,`â¬_ q<’i©É· ¼ûªo¤]ÝA´‘*RòOΕœ1l™¬Uá˜vb슴úÔ/ÁPèþ7_÷<´U?Ýs†eúáDÛ 2ò6Ï…ØwÁ—Ã+¶£@´5Ñ¢ël0ˆ›H…Xùø«©€ªNÖY[g­0²Í™–ù³Ý Kõ&ËæìE²èý6äþ8^}ÈîêÜWƒ"¾î9ØÍˆAp{Œ9ýhv•,¡›¹ _´£ZjÖiZ’&sÉ] §WW~q<’عZm#WÂM‹‚žs.¸Ý OùáHàÇ:Òá{dèõ{-Ð ·q®¹÷˜2ŽuÍ3Dµ%Û¤0 {d¿N0«“°óŸ"XMpÜÍ}» 0¿é)|YôAÄp{xP,›¡ŸO*ª¬t Aó<2øý)õ"oW^ÒûËÂÃc²µ8¯ V<Ö5O»’ˆoÛ÷ˆð‘qb·(°¾i:ÍnX™{@ bhge©yIbÄès8ß™_'»¥À9Æ,šÿz}ÈE:)ƒöb×1JI>Nþ³Ë!ñaš¹‡û_KmοjÖN³µ-€¶Õwñ™eî¡«þ-KS¬ .Y— RRáJ:ƒÒí&¶pãøÝÕ?´!8H ¥ÊVOhkc:5ô¶5k¬E FŒlû·£t0Þî ™z‚ÇmÞÊ…±¸g7¨å_ËÝ,l· \_ÃëŒ؆˿ìw,WUæûœÄ}e\ûN ½— ?¾YVö(ÍÀLW,=šÐNÀ…ŽÆyoÝÀ®H~™dÅ‹ô"¾âK6¶˜ØIœ•dœ´P-Ñ ÁÈøµ¶-å¾oY˜Ñ+<È+V4]€Ð=’\ªÊJ&Gç?Cãp‘×e8ßDäê‹>P—®`×|>Œb3²=W4ò(â!øS(Kˆÿ-z$Ïð ì{ëdö8NjÚån2íàÛhjÒëO½âh¾;Û—Êkvéî®ËeS•‹d¡÷<ÜT+ýÈO¶UèOÙ Ã%·uYÆwÔ€ËМ(­.CÝf2Ú9V¸ÛLGÀ8å`NzŠ”GQ¡eœîÛõ|ÙéãÔ¹Ìþ>ÐÓÝWçÆï6A Òï þHՈɽá|úcõ]÷Ï{ýWVÏ«?I?>€üýÀüú;óï[ä³~}ºô_Sg±âÁaó‰­4› ¦€ÓÔ[HÕ’½¬²ñ^ñTsAÍ'ê ¶[Cõ-A3(-’ºw¤¬/ y½¡CÐB@rÈNSžTŠ+EÙ5¢¼ú7¨éLă’jt!ç6Øõÿe;4¡ŸR¶ÜÄIc)ýl[ùç7M¿‘?:áéäô‡]¥Ç.åu ç7rÜ¿ñr6òÁ¤Ñ1m“&xÒªñèÛ£[­¥I°»¯é¡-¦Ð;ÙËZg/½6(Ïß›Ák‹Ÿ(!¼}$<6Êó/ÏNCtY|(V”“M½øzÏcÖ¿Ûu":;Ð"ÿ|†ŽQâ9…Ï:‹I.hX}ýÈ&u!ë“þïsÙÑa˜ùÇÈ·Q¶Rrº.zæ&€4ÊMòlEë³Ñm9§i”±OGW, ÊäºÙ”ÑOøÀ«Ê`éÎAÊE©¤æ‹s.xé*t ±ÎcsW—/æ-ŸH®d98©Ó}cé|OÊ>и¡j ¡DîaÉYÍëÝD•N›Ÿ¹Eñ'náè¶”[AupŠ‹{ŠBí vØî‚I‡É(èä9c› äµ8€†á‹Ó Ð1æ&½â˜ó1þ:ŒÓP¾oC’”Û¾ò_õ'î¿q³ÂÌ…gV^oßôZæLòiÐDñPÄ$€%ü¦˜9¶`b‚Û14…LÁ°ÕMî'#*°¬vóy÷­jN¹§¶Re„‹u…‡(–vyK[ERãÌgAL[šÜl®JØX^#!ì ‹Á³¾`ç Üy`Ê8䪊WÓ©%w>)  DúàDß¹a”>A½¨V¦ü¹f`‚DÌN±m?ÅmŽSytÁ}ËÆ­‹Ÿ>¼f@9_6…»íÔ~kñ`UWö†J, i¿HFIèï:É©ëub­³©‹mñ´`S9wi$xÕ7òC¥ìd`´]jJÕ#P+ÿ7™Ài¯L]ò>«r«ôv¥Ó: L&ÇÉ)‚ñ O¯âÛn?‚T:´Hx¬—u†2°\Ç!©,¡÷>\Ï7ðõ_pM@¾N® l º‰RHûV¨Û0"¥/Ð4ª¹á™oBñä^ZsØ@SA£ü†¢Jf¢ö_T4Àã68WYÌý2²¨ÍçZSùd%Sk¬è:båñ@Æ ¾«¶j&%(è»¶óÒ9E~ºvä‡ýu8Åó)$×?´ Ãâ‡[ Hí"¶”m”¾<Ô¿Ä«ª *±âšo j#ÓLÒ. :"錿­hç3ŠI4ÙN—Ù‹&A€%ïã4o S](‹ º˜+/qîö=ŽÇal`‰X¡­mJØæêÄNkJfPpKô™‰Bçdòs\/ %×+Íàa ù GiŒ­ÖhUQ³…^\ãν#PE ¶²Œö§‡ß¨Juöy܇¼ñw<>e~GRÚ¯Ë:îãö1ó뿚uœ¤ Œ6¼¹˜AÐÚ´ã¸;í¯¢Á·ZÀÙs3)s"L|ûæAºû ~(¤¼º%Ë$ÙBP]ÓªhCì*žÍXüñU¤ X Áæ¹–¨Œ*̓æ™öq¡°ˆôøQ½÷=^à—ˆ^(¶ôìuÁÇßA2AÓ¹¾…ã³3hÍUÒ™u#hrí6V¢x¥íwïz‚.ØÆá(‡ÑûcñBz.^ p3¨´•Á+F/§ÅÊçžH£Â‹FF?o³’¯zí™oéæê*?¶Úç]Ô"j èІE%À>F“Z¤¡_†j£’Y`(‹nmÅ$G*#È~%€ûˆÞ·5»)06Q½ÌWnö}Tdð>DZÉc@KîáKÇ|rïè»ëL!6.·ÙBt–{X…éàŽ‘è³(ÙÝ^}+%U³ ‡âø‘¨4Eé åöÿmö¤œþwÚ¹}ª·ÚÛ‡í+ý¨—Ôq}Iñ寞Š<à©n^)‰Îü¬' øn´¾¯=P’Œã[(û´aZÆ3’gHOÉ<»®bÅ7ã?9_–5Sö,UF÷€ÙÅ´±B<$PsÊÇiOÖÁD³ýŠ ãÔÿr¤X9®nW§{†4À,ž”ÆaPÐOn#¯˜%FV½‚ïÖ AÛoB´ázãîn þÈãqAl¢Õœ•ÄÏ|nÚF{4Wpþ®¬çVÿ+#.ÙïR–/­ ~}Ris@™·üx”ÊŒwÕ$91CV ±³Á¦L²°HµÍ ¼cQW‡¸ÀåoÞ2›å›wiöÝÏ· óÇRîS*‚£"µºK¯^«á^‚©ìIí›P*šòÃßò"_“µ‰\ùÍ‘Lx“Vo¹ññQ’Ϊ팈Ԣ:Ú͈g#϶Î…aJó²ø²[$ôvCPéò—÷ߛ޳ø©9ÃNH*ñ1N}ˆÖy#ædj¿ÏˆE;%‚‘(Lz³„Ô@fw‹ž`lÀ s ¿îk–qº<øuÙx‚4j͸lj٠"j¥U*\ÞTj ‚™¨ËïÊ8ÐtýðÍš’xahj{óÉT, yéz.é#[ ¾íVXå t-«ïYoÚ¡Ègo£d‡ÙšÑÛüچќÒïS(AJÒtgšdc¹´«ƒir ï¹Nßc{H¹ð ú~ÞÖ‡øæuÔ\i4U4$÷)nÔ3ÀèŠ: - =ÈJù–îLo©BÆvù‹R 5htMáFµJÂÀèÜà•Íu§‘¨3q$Ð0¼(…ß j(â £ÓE+šçAÝàb¤)òrÁKñë>íp×S‡¬—òyë—êÇV†SûÿUߦ Eg@+FØ®¬VÔñÖ+(òÁÐÒÎ[sÛ­ó®¾ÏHýé»ð–¸Õß6Œ·t¬”Ö~ù¿à(RèÙaì"Ã:-J‡EÃ¥ûavOäÑb\!¥N”zðÉ£6µ^BæëŒôóDT qß`¤8ÌØx&B«VÉߺ˜§4£òN`]¥O·ßS¼¢J›v¿4ðmöIDäÏ)ý7XA,, ¨@h?.;qº§ˆÑ\h •ŒJ§¦ÌÌ,aRq–QḨ;Ø~Ѹ(Œ3‰wT/#®§O,VíÿÙic09@P jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ?cÿ“ÏÁ¼Àl¼¸ „Ýf;Mº†á •E§î?ÁXé㺱H5sBj†8œC Ï-¥;Š’uà÷µ€€=ÛÆ½]À¢;»°^’ÏÀp„ 8‹0ïòªéõg®@´ŒÛ09~óÝ$ÇÚ,„ ;±¬Vå±øY€®Ñ£ö…Óu;ÏÁtPT©Øë0…õˆvxCþ ^®!0g§ýÕýö"ùjÀºf\¬L=\ßætßz‡;VYõ}wÁÍÖ”MpD¢?Z˺ïlPâ(³A=1±Õs„1U˜jŠ4Çà[´ªÔL•ÔG’‘y.aƒÌô>3]j‚4© Bâ¥Æe½H‡>o*4ªã…Æ~‹N0Ž‚ÂìÕÕÊn²N¾þ“Áîpœ©cFN½†n¢%ԣȴ6¼é|rÜßœ™è»¬žÜG.ÊH§ÂCÜC{ÄÒ0Ô%äk|TïB™JÃí‡Ú5ê‚þñþΕ:i¼^æ`*‹?U×CÞ„"îïš$z†Ñ’«=¬™|§ hpIÈø)‰ƒ-°ð’·÷?·q“ЂR×ä“Áõ Áõ À|å@‚þ÷<"R(ôÒ¯@¡›ælä:„"îïš$z‹žÌÚßÝÙGBd&Ã\“p/MÕóÏ®´i®h3×Ï]K…Ãí ÀrÔ2‚ˆE6_þà߯2¦êjÔN ¡y8$ž— ?œ¤ƒ9ĽùXq´î‹ôkœÌGr§Ù‰À˜‘³šVo‚+K[°m(‡#–™W³ ¤ð<ÍhrÇàÏ‚¼?ðÉ&º`„ë5ÁbuÍ* â'ºðáÈÝstàÿ;Ž~ÖÛçEyhDÞ ¥OÞhev0¬!¡º”k½­ªµÇ¿?O”Q1R° "ú¸s¶¸Ã±.Ö‚¸¸¿û+Ôe%½› š°<ÂxäZ×±zÜd \dOß4,eNbÔ¤Rº8¬Å¨‹ëâ<´d‹@ Álgé_˜Î’†Î¯ª_T}—k[¦mIK_ÑaȽ‡äê+J¦çVO‡•˜Hý*êéüw«÷ŸÄŠ@ö 9¦AÊGÎñ6Í­ãÛš3Ç®.€Låß·ôê±sëDš…@A¶{ÿÏÇà´öÈЯ’!]Ñ•¾›FÏ3ϰLml掵ÃQ Ì4×[àõ ŽÏ7rôŽü).´êÀäÑw_ £cÊ×snJÝ«È- ´IºL‹Zè+ûì ö‚ •4o¢þT hßC¯ÍˆKÓŠyÀپ깂}â²KÄA òYeðÙ”ÑaÊŠœœâwNóƫ蠶xkwù ìÏ—ùB2¢öÒ}²ÐÃöÄ][¤Š>-:í:0fµj,dÃí5ƒê1õÑ87o-ɘ¸i¼ö¢^áÑDÇî´åÐ7W¨b‰!e$­c£#Ú„9UÑá´ 4oc„Èmè(äÚU­gaòñkÈü6Á¬J7ÿ£}ô,/Ñݤ+¬‹Rœa£¿®úCå‘ÐÖ–6Ë×v³KŽ`ÛëV4®&Xi‰÷ŽÉ& ×ãÛhÖñ½ „·3å¸G…'ä[Çàm„i8Ç<`Ô;h¿ Ä¡µxýýœ–ˆ$¼räsö$q¿„Z$c×K_ú|#sæˆáæ`üù²tz¤=Ë%Çéžg룣‰ W²S“ð§kÁÒ„0‚F˽z°-ò)kõÚÈþ¾M•îM¬ÛêÇU¥ÿ ‚ä-Uú $2"Bn½m~#G[œ q}IÑ&¯:nB1)ÇávÇádAöÖ íg8Ù<4Œg§±¤ÿ{Z~¬' z1²¥W®ªk_y<ïjhåɰ¤†unùk{ø‚Ú´Àú/gŸE‹ŸUa ÉkƒVŸäª÷ô¼ ;tIúùyá{RÈþx/Äv…±_Y…"× ó³)?ƒl•­êÙuó1õãÖÞ ˆ½¯ ÑY2ŒXµ%%Ï óL4å›à7äè*’I:Ëz8jÛ%u™òEÞ‡ç¼.p¾ü,6%/Ÿ‘ýñ”¯£8»=óŽ®OË»oÆT:W|¡êzêµQ|‹‘¦† ÂÈâšJ!Jö>¯‡eÛÓ€†&ÒÂçéi}™l“ðX´ÊJ;ãàùu8… z’ŽPA£yRèúí½™:ܘžÐÞP?ñÇ]a9ôµÕìé U"›Tß‘%Ê‹Ž”÷«k²We&íùä¿ÊNwÅß>NCæ¥j¨È^<·±D ÆúXëÔ–t>ûa|­c4¢À‰‡öMD2.ŸîÑ›[¥ö¥¡#ê2ç‰Nßã5.ØÀ]ýµÄÔ1V_joXªÍóŽE¼«¬bè±%Žù ”ȇ¾vßd, ßtéFsòð(6}ÔÛñ猪‚IŸç[Û£Ž]¬Ä™^Ã㙯êgxmݾ€tp!½[y%½´¼é8b/ÕˆíH•Ö£f§8aýpˆÚô=;!&*2?TT &%Bg:ÞCïò3x¤R;y,Ï —2*á" ^ÎT©oVÇÊqÎòú„Öå[(k4À4@q#ôé8’¯€4‹ãÀ~aóiñ¨ø­P=hõ1£q'¾i¥Ãí¥£ð¤¡øPÀíÅJ†69Ðù >7e%ó{N©mqº:øîC–F×HBÏ“5Ïp‹‡Ø)‰² =Pp…üœ[üUd·"×ÇnÐJ–‰w¹ôxâZì0:¢èbÈá`vú§®úOÆUÏÙ~&NXBo)[‡e=›ŽÃc9œR‹û^dÄw“U ÜþÑ\@R3!ð}%Qñ®ð«Ô§Üã§ 0ÚU Z ÓשZú;å j¸èéŠeÂj«›%ƒÓ†¢K ~q¡{¦°&.¡õw3Yè§ÿNÖ2[¥úyÅVn ø’Èíb™ªt6ü'öIÒa¯*U{NOn ¬WÕéùƒÎÆDKFÚÕJÀÜW­QìGT”t g–©¡*Ò½¥ýu#¬ü!êÝì;ò2€ñ¼õõ„Ÿ1OžæbFÕ+-£6½¤h;Ôƒ÷ÅW\÷õÈ•k€+E’#}µ´b/‹¸|U*Û´5¤EªdR ¨‹¬*kè‚.C««¤ZG+÷Œ|*o:®.ês‡ÁneO¶–k`³øo@KºMÃwÝ"Œ•Øsâg»*Ò0Ÿñš”^$iýõX/ºÁõP0û^ }NíÂçòû¥šÊøÂS¤6A© mLŒ“_„«Á ÀÀ–Œ‚óâjØ¥¿÷ç­2gd0¦/+£è³yevyJ)]£Òú§ žn¯@O}d4fñP ËÉ{9F_/ûMñ‘¤bª7`ȽLà!„tK{:SØ“ •kÙ&¤!XKª±ð«Ôºù¾fWÊ ¨N1,RúÀ¿ãm‹ší[‰¾â8¬ã1òÊ^Âkg7!*HÞ柰‚”gú¾Þ€¸PºÎß~ŸÔÜG9ÒmûgÃÒòví\ÑEX76ñXA5JÃs¹ê€Œ)±ºÕi™1@È€%ì5Ò¯nžœÑñ¼á5£rÆ­–+.(L˜IÉÊþHB'®á@ç ö'#buÑ6 Íô:8T…ŸHå’2G+J­Æ‹'¡OGüŠftnÆŠ~±Æz²Ðk†ä[­x!´K³+‹ºùóÏjÖ‡¬ÅØëh …Ölšú‡Ç๵nµ í…È‹…KgÊÓ/ƒ DROB«¾Q`¹Ú ÓÁà¬E‰ðNË4wõqm!ãF_8)¬ †ý%ºè[ ê½É«Z̰Hý›kfh÷¹\L BedI™I™Ÿ„í¯˜щܜ)Âoªp÷®pbÌáÒ²¦N!Ù Ÿ¡XÖзfr8{¬šJô†Ãô¿ü…û9ÊëGrzÕjð‡ÐZvSzy®Ë¦:èdùã+úS‰Ûœ“þíŸj¼4³-æ~|£K@ЙWׯ°¥ï¤xLfb¡ß{_ô£‚¢Fšº$’¢ŒœR x2[–+CËÒ‰®_µLá"¯ãøS›þWð£1ü(áJÿïð}Ãö¸~×?Ú©ûY@ö˜R°Å™OÅÚ¶a1Äs©”ç¾6r¡Ê³ŠH¥'{Ï;Ž,-bˆŒ‡Ú(®Ñ9>z„ c=ð· Œ¾ÆóòÝr"ÏT'¤“$Íì-odðê³û&·ƒ Ö¬ä, U sCü]ókôý—U¼Û…À™ î1gÐa5hÛdÎæPÃ>Áçn© KUAíô.À]`„¥s»™^‹“º9è„Z³ö¦¯Ñ<èÒñøúèÝfhƒß~‚·œ+ÅvHgh±ù+‘•â‚YÝÜ.,çjí—"ËßÞK¤’咽*ŒïÄkÍ2Înó‹¡…#»›¼çt&y ¿Ï™¬Ir§Õ£¤Œ±[ר@§«Á.1µ~¢²„ `#j]'<{³©6œ ,V$ÖÙ/+NÆ‚ ŽDo¨‚¼]=ÞØs¶Sœi1¼ùê iɦ§^‹›~¤ŸuXd«,ôŽ$##ÕÚ3³ZÖV±â@çJí¼]ï©ÖsëÇlòTÝC «{ûŽé¦ð«rkÁ§$ùÎÐ. -C}Uó —¥jEªìËr”4üþqØ•±Ò£ñàG¹{š µ(-©«ŸÑ$¤xÌ*Ò>ሴ$L¯“m{l Sìù${vÊ€Ù«Hs L;dªâiû·¸èl´VåqÜ{h“ 0íÌnÕ6`0­®õ§¯!¼Ä{_DDÓ~ÂXÁ\ãeàJæ+ ÆCJ—çÔ€W©Õ]FÓÆ`o&É¿ºˆŒ= êŽcoHñ¹ô¸œÊ>©Vcâø¬að}$Áu“3pÊ=kÇŸt¾F§tr« H)D PMšÍÀ’"íÐrAyëÈžJ®~_—ô ¡E6Jc¶V$ë|¿‘בà ù—ñ¡îÏé„ ßßÛÁ§1ÖéÅZL~ù¹Ïz3 ,1|*‰Éj¢÷åµ€|"~„êMØìM7qHÙÓasÔ¦Y.ÌrìºK+f:)13M”ØÙ~ 9Iñ±~ Ua˜áû€ÊïÃõ*ðT¬oÛ>”[ÜEêŽùý Ây­2 y⦪sÇnC| ~8ö!€Æë©‘>ÙàÞ^û—Ešá²0UQ ;ùƒTÞ—¥QaÒPÃ1U­Çú^UÈ-TÊѾ—F;³h™Œ§>¨y—MIéúð ÇhÄJ+³%ÛËG[—©GÊì‹ñâIÈK{´ŒVø1‘“UË·“¨ÎÚ§VóiÏQß¼“ ¥Ä±QÒOÐz²ë¼y\½4øΫ]t%÷j–0e}@°ísØïø–V;EØeA¥;El}|U&uØ—™ëóþä’^gõv*ú”þ£p¿7lîM–íR°ßDwZ󲃱–7åŽÞ½d§)üD5Zíïx2Ïཅ™ß\¤¿ÿÚQ5¦ñï>6éb—”4ÊÒ«î“7´¢ÁYMîòBztÊÓ¬Œû EÝ)dÔ‡ì[×Nôä‚¡8œ³Ôå²öV÷È!¨ k£ÏjÑ‚®’è@ ¹‰fvù$Ý Ê±\ÖU›MËÙb¸Ò>«˜“z–qMŽoÀÄ{Vsºúœ&ÛâÄ&1Eò—˜ü)³ÂÖA>öv‡×Äý2î¦]#z'¨T¿Qâ‡8'†]ö; •¬U?ç…›—2%¡¶†.÷xFSCᣓ«fU`jÊä– %l[bÚëŸÐ¾Ë’˜9è¦#̇OûßaO-SéÛ¡Å¿’²qm|÷þ›ýÕ§¬Òë8ª\±ÒÇ @" MoÐxó‚yó</HÎÁN(“ J›šu“‘j\éõÑvö‘„á%»ì`=ìº3œKO:žÃ¡ª·ŸŠòl$åœÉ·*Ú'~d–¼ g¤áûV¿k×íHý®~Ô¯ÛD~ÓOÚå‡íGý­×Ô[ûY€øGuqÓéòVväå~UQK·tEB´Q·J’ådßmÅUœðÛ‡ÈÔ°]ô\U©i¦ó ³“Åt,h| 0?\Ä&JÙžÎ5,â*$QO:¯9Ù–Ôã‘/£¨÷ŸPž¤ªU…P`˜€œ4”ŠŽÔÈw€<°ZÏMò¿â 5ºJšfS1µ­'~ï/HJÕN$i¶0ðc°>=¡(eÌ/õܴ瘴p¦EnèŸ÷¡ó»ÑxwüPÕgä‚GGà|)}ÕŒŸÿUu@ö‘ãRfɯýc£®Àî WÉ!“UR¿ûu™I¨3ƒ^wê9`€G\„'lÂŽ¶Éå*Ø¿‘»V'…!ùdÈ„º_²È«(ô5Íe£*â™Àˆålæ°G5…¥ã?–Âjž@ø3\ÃkJ³æp± {yeÒ—5”Ñ´AÕ†'1Ù44TÉÜÛ0µ‰ía 2*Sî²"@bè>fÞR«¡+i›©ÊªÅn!…dˆ*ü!'!½È£ÈsZ›×°{«°ÑdL^‚ž^|F&YÔŠÙì¹þ§s'?|Ã5·9øŽ_„v¢ÉÛÚ  Ú ÏÉ›=·OóÈ§Š ¢%—•uZ"¬÷ïeS­Ðs?R”´l”ò‘<« HÑ… ¢D”ˆe`·ˆ]y.ò-t e ´š}£ÿi•¬ÒNeÍøáUÚÞ¥L‡$vøU&ÑÓ²-å‘ö″¢{zúË/é{»$ïãÔøV¬1,A¶Oß -#æõô笛™9UÓ­&šªñCì0¤Q³ù¸^RwGbÃŽauŒ2Åxr¦Õî`¶†|¯¤"|']¼OgÆ:øI9«½=ùÊ‘ã.ö?ÑiYGPšÅÉü·opN &®Ô*g>^”›¹ÑÆXŠË?cÖ¨`=±MÀ²r‚z­äÀðí¤~ò3Ùâå+•—j®NIϪÇkïháçHé¡ïUQBg‹Âß“2î-šØ<œ·õ¹ œuÐI¦ÍËÃú.: …èUÐh2-G»âü¦NËrf3d ‡Õ»[ríÂònàýI_©·õ!þ¦œ©õ:ß:«ç°`ýGß©~ùÕþ¥à÷ê¹ù•ãæ¼K )ˆ1Ê=Ê ›æ\t>ά¦çä&pR¡ÐhüË!RÛ:éýN·;êͰ¬]î/Ë7 ýÍ[ùRQ¡Å¢ìA7¬RÐ÷ŸPþ)"Ä4jÅS'¡Xtõ›6}Ýu6Ê*QóÙ_ñpÆê˜?ÏD¢™É‘ÚÞCi G_Ù¼¡$.Ö„XtÿùÓZB‡ùZýurJUSx ù¹è*(Ê~QBºÉÑXKÔt-~zìo†jÈ•[ËùJ%Êmdz-kLuWf™Òoc‚sðTz‘‘µ­V0ö“»÷¶ûž žÜÂVÜE].$ï»|uzO–Ŧ–iJ\+ï—âf6›_ë®êG{™ÎGÏÑ:•“ùõ%ßÝm·ãªlatbÑ€Õî.àè]°œùùœÿ8B¨ ¥YlÛH³)ã³ØÊ¨Á-òœ {šÛ˜ÒÅ & º:'9£¯HlføL²­yÀ!?Sz«4lp‰Ë'dNÕþTšÅ‚#.wŽ¡“ìæù«Ë2{‹Þø Ïî©6úᬠÏ^´'ç$óyºèõÊtç¢H­%¦ÓÊ5*Aks,¬¥ÿAëEjÜÞùâyêwiùÐ)ÚM:òÓ¨Ž’Ú¤Q÷1LZWçÕ㟊’JºS.–‰èÚ,F­½ƒ©ìýO]çCp KOÕ†éWv]ƒ‘ü7ê= >¹mÕô8Ëù3ÄÊÕ™4J*YU¸ñžwÔ)­^ƒ…_‹)„¤âL­w®p»¡!£®Ð…™Ûý†g͈1n#^w.øú½@9_þæî  ôù†J %•5}pHÌ‹¬ò¼º—¥‹.HÂ|9ÂͶ‰ÚWÑáÞ§JAÇÜ44 ^­¸E¸qÆtï¢vZjO÷ðð×yú„Ä”cÒ¦< ÞJ·èò 5÷6×'. ]˜•1;ïM-ˆ³ÏŸ§ý%`Íèhêü€Ë&ÃÑ™ˆÞøU&ÞÅáÇ Ý(ë[îª&Â×áF²£SW4q¥%[°mäf{µ©OëþÿE¹\¼ÉÎzÚ1aª—1²©zÄTؘC(“þ 4ñ‰ZSnÿAnë³1R“q-ɪ݄ÿÈåã.ö?ÚiÍ­Ë}«“—îJ°»vÐÎò7g3æP²t¶ü;]ºâßv²r‚ x¦8{ÉÞ¹Ûº¿ˆÃõ, ×ÜYFšÝ|œÇ‡;¦<¤›šÝH7ö7üé_jŒ¶ãÚ)æÑ³X¯ÝØáVyHPƒÅP<Ø}9L¯©GÌ(ÛÅþ9õKÆí™eºÈÐÚšâu”’Ñ#§‘öªCOs%Zd‡:⣩ó¯>$ @}èõóÖ!*¯wиY€|X.F‹^*UÌ”ºÿa|ñ¹Z×ñÓ–~.âÂ9¨šò Òâaq뼄—•L#¥“××£ª½ Æ1à"¾)h:û}.'YÚnÙ^ù)HÕ–~8gTpxÉ7FäOðÓ›öéÿ‡ÃD‘?ÃIÿa«Êýµ÷ü4þÛ‹ûtmCþÛ|ñ¿Rú¨¼»ñô$ò¦Ñ¢]¯Ñ)ø^†’ë”kù„æÇõ$ô”¬œ)À®¥à$Ã"Þ`m&ƒÂu”ÀCu™ª2ó§3< ³ü€÷˜²ÁR4·[Ç+ !:«=cþ´Æ}tñ}·²w–ù F‚š£¦L;TA&’ãǵ¯rO¾§„·«½‡´E~1Ïß$2õøŽ{ö…4Íåmô¾,·¾W›¤S½dŠýîÜL z!>¿â¾Ýw’~c’•Læ¥ý„8&šdȺŒ©3ôè†åD7¬3"•¥7Ès)…€d Ü ÉZâëñÑbƒïÒ  ÏT®ú´îøÝ„õmáô488]h ÷û¹§I#!xdË·rE c—ùíòu[ ýyõéDÌU%fÁâ˲ñ¿ø@'˜¸Û1É‘„LÇœ³Wô•Ëd4¤ˆ°+LJýB>ó„ë …Ãz¯iq¢óµ|y ¦à†B€ƒb‹ÇŠ{g½mx]ȤX¹ÆpÒûÌ¢Vå\›Š7ئ­Î¨Üá ÜÖ¡ä‰÷YdWÙt­RP+ÛºzÊIíœ'%yTñ“r÷ì$ô¿âÏvü ]¸l·sE!â2ŸiÀ1RB¸yzOáp_ßE£_Ÿ¶>½ÑÃ1öÌû* ê]z»«v|bäpõ¤Ö Pi$“Æ{ƒÝ]ãu“R/¨Nš×îÍÙx{͉Qà “Yõzö¬{æ"` 2L›(,£§vu|hú CSÏïq+À™†ü$ÞD5‘ì‹a1ÏŠf Ñex ÆÒNXæ™&E'öY‚ËÌó«ÞZ6¯ØÝ!|A üotÜ.9Ù¼ïàíöÌ33á0S¨{D"Í¥°Á…(`w;ík0©k%©A¨çzpÕƒŠ%éäÂâVž~RŽ…7ô§Ú³ aˆ—!" ¯™Bıñ€ÈìÑ2ŠNØ4u}5MT´G)?€ŠÛ.ŽõP]\XÀOzÇLSøA>s„ãî% ; 83èdzmˆóß_v½x"鞊w…!:£·ˆ’¿¨qÀÿ{Tqµ|#z{Ÿ†èFʉ´9h¹Þ#¿ˆ¶éPÄÂ7buHWú­Q,wïÕ‹ó6Áe«ð/—†~¥£ ôR(ëí]?/#œÄ÷Åë@ ÏÌ÷ßÍp6»Lºéw¦CKñí¥âv÷{)ϲ®Ù¼¾qSIàcd1â·¨ÔVrçëd`÷|à³Ú´¨1Œ€Q|ÆCÜ̧_ĸþ¶¦aq›‹CxñíxGGvå!Òß÷®·Kü¾aï3°uMÓУÊ^ŽËZî ‹éÖT@ûñ'ôJ”kpGœFc¡ŠØ¤}N¯†ƒ0VY8±PÁžÄpœzÅËdžë]¯òšOnc_;NÑTxš2öf&J®w qÉv ·ÍU{+!²a!ÜÙhŸyÂß"nm*Y”WŠÕ½`Öå/Ü\JX8ð¦©ø tGÿ7ÞHñ`l8ÿ @¢ œÅ&ŸY5ÁÃéäÐ8Œ…ÞW»q.Ò kgø"˜È#PŸ-œÝí¡áÉBBT‚mLÚ¥´ÞúïûBÆ|bP(4¡ÆL»Œ9#mØ~œÏo"¿#øaíÊ}œ$‰;©éÇò„lUÔ`ÈŽQçÎa”.qrÁŒ6t^sažÞÒxÅ“gåB"î‚!­NoFg_)æ ñ–iCtcTr&„jahÕ-¡ÔË tS{ çõŠ”®ß— v4P¦®Õa+Ø®x@k®ÚŽáI¢êÛµácwBœÚºØµa˜$UŠ\Šú|ª$î’Bëùídz¸Í¨n 4îÙŒûà”ß>F6‡îÅßaFð©Gÿ…$æ³ ´ð‹T>+×+¨$¹ _8Ãk­|džÞ¾%@ ŸÒÅÈ#Ù+y,p! k¥Ö?j©kÄàÀ©eªÇ4/!ÍYGÿ$¥Ø†<˜ýé“*öí7uN)c)ñøÔl*ÅmÑŽÙ0é-ÜCÏk|FùU¿ ¨g Œö.-%;èzkÔ“k¯¼ùh}i_¥‚¯¼….:_{€Göð‹êæ€0ÞSocTkMe˜œ Ì:'  |ê+%öX·i] j‚]N±R &HÐá> ó§“À†ÉÚÀVDÙ©uÝ8ÜÏ»f§Ôs˜ås½˜¼Ø¯Egh‰ùâ¨)›¯d ôŽþȲx gë$àôWèÆ{!¥WÚ¬’Ûxò¿&¹‡¶×E#ºD`Aî‰ý ý¸+ Ç%FÞbâܲèFؼ¶¯Ðë!f¾÷œ åMB”pêË ºÊnL£6°äºçÏ_Ûû¤w!òÆ®OûžCa–'Âú‹…s"HÍóîÏœ--²N¦…ÝÁmÒYm!‘!]Êâqo/¥Ã){]Áʨ¨eo: ^ï2µž˜-Éȇ<2tæqçouÑtð…êí†à(~ð?\Zªï:^ÖÛ¶nùLox=ž¡¡’÷ð/XbÒÿ•´÷`ÿ{®ë ¡Ã˜H·Á·îŠ hõh]T+ÃÍïÚñiŽ‘]ÞÙåÃUVrdz,°¿AJ8•Ô{(÷ð/Ô™by ô²ÿ0;À ºîW׈\Òî4à¡ðU±œq)[°[Í–[j0$•Ð Tÿ Cµ4©`ž>âÉ ÛÖX™ f—ñŽHñ‡Qñ?ÞÇÝ!.¢ÑTjìéÕ} …½A:Yκþ&ð©< Rïed(” ¯~Éö;è–U| ê]èȈ㭶Vr‘O‘P—õC«ÍMu›ž)¤#•xñêî“åP“f3,|ÕùŠßj¼ÈdO>ðƒsé[4zp–álÔ³›wNl%$2ŒU»E—ÿP+Ë/ÍO_ŒT›àmÐ0Jž=Æâ«¤é¼YöÛ‹;碂8œàîiQxlÒæI ©q"9²S¨PÏ‘^ /,}çܯŒ áÒ>oÛ=6ÅKáÛüxq6×ÊJD„‰ÅÜ[ŽFòDõ*D§÷$hº\åg€cMœ¿3¯Vú7€ýLŸ»™øGìd!+­¸Þ×u˜Q†„™­êôrhDMkr€¹¶:ñЦÑ6aüã_¬HIAM'Ý!›˜©Hÿý t*¶_üYÑê>OÇ|˜xÌxªþÝ6+"×Óm–‚»ó²qËWË]¡õñ®V¿¨ÖÀ5ý€TÑ—¦m2…áf˜«Ž €k ?ÎãBÙÏcz8µ¢ÀIþÆé¡ÖMbŽNE@i&TÁÎT óJÙæ)ižRuå à7'ŽÔ‹&䯼öŸ\³¤•J:V¹ÚO1æ)qD-årʆUGÓšJœnÀù™„!l¡ˆ°:ÄC¶¯cv ¯cÇÌÐãm—øjÐ})·²Ê9Ð^ÿd/²=)ôýjÚ ÌQ ÓM)¹7GLã|æH>_go‰ERB.Ö±í¼ñ>ÚRî¿´ §\Y°õ&ÖÇzgÜTá¡PñƒˆD"òÏ™%„¦Â™ƒˆÀz=¿çäGöÔßÛ}/í ¿Ûz"?¶¯¿V—+õòÍ H@X°)¸ëó°À0pžmâ«‚:…§²QÒ뺜Íot½uxÁÀéð…ï-æk}§Ÿ’˜7& ;uÛ Wê"oˆkÉ@n1~¹n+B.£E¹êãˆü¥.ØéwlÕ³Y@R ‘(ò}àÉ•IÜ¥6nilÕÃÐ D¤¦ª½jsò*Ìi&¤Gë K¹ÁôßVü*«–ýG)HëcÜBc|æß'cÿLÔã `¹"Œ('AŠ©†7ðìˆ\Z`Û6¹–Œ—ÜÓÌfqµPo„;7|æTÑmEßϺÌoÒ°|]ÙónÔÖWЇçO¸t6“Ã¥hŸXé¶¿Ç8Ýt ‚²ö ¥þ޳„LçpÅ5ؽ8 Ü~ ¿'7׃ä4â¬]’_éÞZ+:‡³)’F›œ°•ô¶çLÿHGð–îI±‡Ahõª¤Šd†k¸Ø…”AÀì(ewªrm Ù申˜sŒÞï—ëÀ1Ú…úmWîÈýÖ1öO””^Þb„,Ÿ[±z2B®¯9÷·êpF?ýoº‘ªc´z¸·f 1à_qTTöñ¦È¬¨™fùûEVØÍÍÏe)Åh5Úü̞ʼnZ*ÏayÔ¼5ÍQØzTæàÀ‰}bqï\h܇ÍJ©^$Ùß­‡¤þ¢}v«%¶Bó@Zä@­Eó§%“ º>U9#ÒôÇyCT¸ËC#,©ìþ-û’ý€Žˆd1SÐäúöÂ9èc»þÕ*M…ÓÈ€{¾¸w1mêù:T¹ÄivïóVrƒmYa¥Qëônær6±Rû…×ÚòÏÅ‘Cöxf•ÿBì°DÁò¾°üÞåíà·*Ôì‡5Ò?’I›²ªòÖ<Â>}r€q,NÖ×àÒçÃÉs·SyP ¤D—ÅpúGÆÎîÜxÁh’(v¾+ñ˜`24jA«:„”¸*Õ|*3„W. õÈå)ƈm7ßtº‚?ðò¢d7FС¿¯æ©!н…´sÞsDWˆz¿­R†ÉC軼©`=¦9ºµ5|°Ürç†õ­Xhãq±†‹Ž!i|Ÿ‘&‰"bê[i8FšŒlè¼iõŸÐ..M€iC¿ü†¥AGPÃWz½ð¼’ûG‘Ÿ4“Æ@V_¾Ó¡–Öéb¿ð;F• R|L^;kxz§¸Œ1ˆ‰Z–…íññ=íÎ&ë™(‹O`ã$Š †”±|ðEÊYôhrøYôÛÔüì¿èîèdtBt‡¦«ÊC 6…ûÄİgéß ì@‘¦LòÅ U¡`:’Þ'‰%{ÿ‡œ¬%³@°ìÛ•^c¦ínë,`â¬_ q<’i©É· ¼ûªo¤]ÝA´‘*RòOΕœ1l™¬Uá˜vb슴úÔ/ÁPèþ7_÷<´U?Ýs†eúáDÛ 2ò6Ï…ØwÁ—Ã+¶£@´5Ñ¢ël0ˆ›H…Xùø«©€ªNÖY[g­0²Í™–ù³Ý Kõ&ËæìE²èý6äþ8^}ÈîêÜWƒ"¾î9ØÍˆAp{Œ9ýhv•,¡›¹ _´£ZjÖiZ’&sÉ] §WW~q<’عZm#WÂM‹‚žs.¸Ý OùáHàÇ:Òá{dèõ{-Ð ·q®¹÷˜2ŽuÍ3Dµ%Û¤0 {d¿N0«“°óŸ"XMpÜÍ}» 0¿é)|YôAÄp{xP,›¡ŸO*ª¬t Aó<2øý)õ"oW^ÒûËÂÃc²µ8¯ V<Ö5O»’ˆoÛ÷ˆð‘qb·(°¾i:ÍnX™{@ bhge©yIbÄès8ß™_'»¥À9Æ,šÿz}ÈE:)ƒöb×1JI>Nþ³Ë!ñaš¹‡û_KmοjÖN³µ-€¶Õwñ™eî¡«þ-KS¬ .Y— RRáJ:ƒÒí&¶pãøÝÕ?´!8H ¥ÊVOhkc:5ô¶5k¬E FŒlû·£t0Þî ™z‚ÇmÞÊ…±¸g7¨å_ËÝ,l· \_ÃëŒ؆˿ìw,WUæûœÄ}e\ûN ½— ?¾YVö(ÍÀLW,=šÐNÀ…ŽÆyoÝÀ®H~™dÅ‹ô"¾âK6¶˜ØIœ•dœ´P-Ñ ÁÈøµ¶-å¾oY˜Ñ+<È+V4]€Ð=’\ªÊJ&Gç?Cãp‘×e8ßDäê‹>P—®`×|>Œb3²=W4ò(â!øS(Kˆÿ-z$Ïð ì{ëdö8NjÚån2íàÛhjÒëO½âh¾;Û—Êkvéî®ËeS•‹d¡÷<ÜT+ýÈO¶UèOÙ Ã%·uYÆwÔ€ËМ(­.CÝf2Ú9V¸ÛLGÀ8å`NzŠ”GQ¡eœîÛõ|ÙéãÔ¹Ìþ>ÐÓÝWçÆï6A Òï þHՈɽäBüúcú®õ~{ßú® dAüú·ùúH¿Ÿ@Ÿ¢ Èüú;ù÷ª¿%›üûtô_Sg±âÁaó‰­4› ¦€ÓÔ[HÕ’½¬²ñ^ñTsAÍ'ê ¶[Cõ-A3(-’ºw¤¬/ y½¡CÐB@rÈNSžTŠ+EÙ5¢¼ú7¨éLă’jt!ç6Øõÿe;4¡ŸR¶ÜÄIc)ýl[ùç7M¿‘?:áéäô‡]¥Ç.åu ç7rÜ¿ñr6òÁ¤Ñ1m“&xÒªñèÛ£[­¥I°»¯é¡-¦Ð;ÙËZg/½6(Ïß›Ák‹Ÿ(!¼}$<6Êó/ÏNCtY|(V”“M½øzÏcÖ¿Ûu":;Ð"ÿ|†ŽQâ9…Ï:‹I.hX}ýÈ&u!ë“þïsÙÑa˜ùÇÈ·Q¶Rrº.zæ&€4ÊMòlEë³Ñm9§i”±OGW, ÊäºÙ”ÑOøÀ«Ê`éÎAÊE©¤æ‹s.xé*t ±ÎcsW—/æ-ŸH®d98©Ó}cé|OÊ>и¡j ¡DîaÉYÍëÝD•N›Ÿ¹Eñ'náè¶”[AupŠ‹{ŠBí vØî‚I‡É(èä9c› äµ8€†á‹Ó Ð1æ&½â˜ó1þ:ŒÓP¾oC’”Û¾ò_õ'î¿q³ÂÌ…gV^oßôZæLòiÐDñPÄ$€%ü¦˜9¶`b‚Û14…LÁ°ÕMî'#*°¬vóy÷­jN¹§¶Re„‹u…‡(–vyK[ERãÌgAL[šÜl®JØX^#!ì ‹Á³¾`ç Üy`Ê8䪊WÓ©%w>)  DúàDß¹a”>A½¨V¦ü¹f`‚DÌN±m?ÅmŽSytÁ}ËÆ­‹Ÿ>¼f@9_6…»íÔ~kñ`UWö†J, i¿HFIèï:É©ëub­³©‹mñ´`S9wi$xÕ7òC¥ìd`´]jJÕ#P+ÿ7™Ài¯L]ò>«r«ôv¥Ó: L&ÇÉ)‚ñ O¯âÛn?‚T:´Hx¬—u†2°\Ç!©,¡÷>\Ï7ðõ_pM@¾N® l º‰RHûV¨Û0"¥/Ð4ª¹á™oBñä^ZsØ@SA£ü†¢Jf¢ö_T4Àã68WYÌý2²¨ÍçZSùd%Sk¬è:båñ@Æ ¾«¶j&%(è»¶óÒ9E~ºvä‡ýu8Åó)$×?´ Ãâ‡[ Hí"¶”m”¾<Ô¿Ä«ª *±âšo j#ÓLÒ. :"錿­hç3ŠI4ÙN—Ù‹&A€%ïã4o S](‹ º˜+/qîö=ŽÇal`‰X¡­mJØæêÄNkJfPpKô™‰Bçdòs\/ %×+Íàa ù GiŒ­ÖhUQ³…^\ãν#PE ¶²Œö§‡ß¨Juöy܇¼ñw<>e~GRÚ¯Ë:îãö1ó뿚uœ¤ Œ6¼¹˜AÐÚ´ã¸;í¯¢Á·ZÀÙs3)s"L|ûæAºû ~(¤¼º%Ë$ÙBP]ÓªhCì*žÍXüñU¤ X Áæ¹–¨Œ*̓æ™öq¡°ˆôøQ½÷=^à—ˆ^(¶ôìuÁÇßA2AÓ¹¾…ã³3hÍUÒ™u#hrí6V¢x¥íwïz‚.ØÆá(‡ÑûcñBz.^ p3¨´•Á+F/§ÅÊçžH£Â‹FF?o³’¯zí™oéæê*?¶Úç]Ô"j èІE%À>F“Z¤¡_†j£’Y`(‹nmÅ$G*#È~%€ûˆÞ·5»)06Q½ÌWnö}Tdð>DZÉc@KîáKÇ|rïè»ëL!6.·ÙBt–{X…éàŽ‘è³(ÙÝ^}+%U³ ‡âø‘¨4Eé äKöÿA5_µ#þ ÈŸàw~ÕÅ~Õ]û[A‘í+þÔE~£ú’ñ寞Š<à©n^)‰Îü¬' øn´¾¯=P’Œã[(û´aZÆ3’gHOÉ<»®bÅ7ã?9_–5Sö,UF÷€ÙÅ´±B<$PsÊÇiOÖÁD³ýŠ ãÔÿr¤X9®nW§{†4À,ž”ÆaPÐOn#¯˜%FV½‚ïÖ AÛoB´ázãîn þÈãqAl¢Õœ•ÄÏ|nÚF{4Wpþ®¬çVÿ+#.ÙïR–/­ ~}Ris@™·üx”ÊŒwÕ$91CV ±³Á¦L²°HµÍ ¼cQW‡¸ÀåoÞ2›å›wiöÝÏ· óÇRîS*‚£"µºK¯^«á^‚©ìIí›P*šòÃßò"_“µ‰\ùÍ‘Lx“Vo¹ññQ’Ϊ팈Ԣ:Ú͈g#϶Î…aJó²ø²[$ôvCPéò—÷ߛ޳ø©9ÃNH*ñ1N}ˆÖy#ædj¿ÏˆE;%‚‘(Lz³„Ô@fw‹ž`lÀ s ¿îk–qº<øuÙx‚4j͸lj٠"j¥U*\ÞTj ‚™¨ËïÊ8ÐtýðÍš’xahj{óÉT, yéz.é#[ ¾íVXå t-«ïYoÚ¡Ègo£d‡ÙšÑÛüچќÒïS(AJÒtgšdc¹´«ƒir ï¹Nßc{H¹ð ú~ÞÖ‡øæuÔ\i4U4$÷)nÔ3ÀèŠ: - =ÈJù–îLo©BÆvù‹R 5htMáFµJÂÀèÜà•Íu§‘¨3q$Ð0¼(…ß j(â £ÓE+šçAÝàb¤)òrÁKñë>íp×S‡¬—òyë—êÇV†SûÿUߦ Eg@+FØ®¬VÔñÖ+(òÁÐÒÎ[sÛ­ó®¾ÏHýé»ð–¸Õß6Œ·t¬”Ö~ù¿à(RèÙaì"Ã:-J‡EÃ¥ûavOäÑb\!¥N”zðÉ£6µ^BæëŒôóDT qß`¤8ÌØx&B«VÉߺ˜§4£òN`]¥O·ßS¼¢J›v¿4ðmöIDäÏ)ý7XA,, ¨@h?.;qº§ˆÑ\h •ŒJ§¦ÌÌ,aRq–QḨ;Ø~Ѹ(Œ3‰wT/#®§O,VíÿÙicnV Bþqstardict-qstardict-1.3/qstardict/pixmaps/qstardict.ico000066400000000000000000000410761323166163100235320ustar00rootroot00000000000000@@ (B(@€   !"####"!    %*/358;>@ABCDEFGHHIIIJJIIIHHGFEDCBA@>;853/*%   $*< Ûÿþüû íö ÷ö =&øe5þe6ýe6ýe6ýc6ýc6ýb5ýb5ýb5ýb5üb5üb5üb5üc5üe7üe7üe7üe7ûf7ûf7ûe7ûe7úe7øe8øf8øe8øe8øe8øf9øg9øf9øf9øf9øf9ö`6è2h0*$  rÿÿÿÿ ÿÿ ÿÿÿU6ÿ†Fÿ†Gÿ†Fÿ‡Gÿ‡Hÿ‡HÿˆHÿˆHÿˆHÿˆHÿˆHÿˆIÿˆIÿˆIÿˆJÿ‰Jÿ‰Jÿ‰Jÿ‰Jÿ‰Jÿ‰JÿŠKÿŠJÿŠJÿŠKÿŠLÿŠLÿŠLÿ‹Lÿ‹Lÿ‹Lÿ‹Mÿ‹MÿŒMÿŒNÿyEï"  ˆ"""ÿ&&&ÿ ÿÿÿÿÿÿ###ÿX9ÿˆHÿˆJÿˆIÿ‰JÿˆJÿˆJÿ‰Jÿ‰Jÿ‰JÿŠJÿŠJÿŠKÿŠKÿŠKÿŠLÿŠLÿ‹Lÿ‹LÿŠLÿŒLÿ‹LÿŒMÿŒNÿŒMÿŒNÿŒNÿŒNÿŒNÿŒNÿŒNÿOÿOÿŽPÿŽPÿŽPÿPû ¼'''ÿ,,,ÿ%%%ÿÿÿÿÿÿ(((ÿ[=ÿŠKÿŠKÿŠKÿŠLÿŠLÿŠLÿ‹Lÿ‹Lÿ‹LÿŒLÿ‹LÿŒNÿŒMÿŒNÿŒNÿŒNÿŒNÿŒNÿŒOÿŒOÿOÿPÿPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽQÿŽRÿŽRÿRÿRÿRÿRÿSýî,,,ÿ333ÿ+++ÿ###ÿÿ ÿÿ ÿ...ÿ^@ÿ‹LÿŒNÿŒLÿŒNÿŒNÿŒNÿŒNÿŒNÿŒOÿŒOÿOÿPÿPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽQÿŽQÿŽQÿRÿRÿRÿRÿRÿSÿRÿSÿTÿTÿTÿ‘Tÿ‘Tÿ‘Tÿ’Uÿÿ111ÿ:::ÿ000ÿ(((ÿÿ%%%ÿÿ$$$ÿ444ÿ`CÿNÿOÿOÿPÿPÿPÿŽPÿŽPÿŽPÿŽPÿŽPÿQÿRÿRÿRÿRÿRÿRÿSÿTÿRÿTÿTÿ‘Tÿ‘Tÿ‘Tÿ’Tÿ’Uÿ’Uÿ’Vÿ’Vÿ’Vÿ“Vÿ’Vÿ“Vÿ“Wÿ _ .ÿ555ÿ@@@ÿ666ÿ,,,ÿÿ'''ÿÿ(((ÿ888ÿcFÿŽPÿŽQÿŽQÿŽQÿRÿRÿRÿRÿRÿRÿRÿSÿTÿRÿTÿ‘Tÿ‘Tÿ‘Tÿ’Uÿ’Uÿ’Uÿ’Vÿ’Vÿ’Vÿ’Vÿ“Vÿ“Wÿ“Wÿ“Wÿ“Xÿ”Xÿ”Xÿ”Xÿ”Yÿ”Xÿ•Xÿ^.ÿ999ÿFFFÿ<<<ÿ111ÿ!!!ÿ***ÿÿ+++ÿ>>>ÿ!fHÿRÿRÿTÿRÿRÿTÿTÿ‘TÿTÿ‘Tÿ‘Tÿ‘Uÿ‘Uÿ’Uÿ’Uÿ’Vÿ’Vÿ“Vÿ“Vÿ“Wÿ“Wÿ“Wÿ”Xÿ”Xÿ”Xÿ”Xÿ”Yÿ”Yÿ•Xÿ•Zÿ•Zÿ•Zÿ–Zÿ–[ÿ–[ÿ–[ÿš`-ÿ:::ÿJJJÿ???ÿ444ÿ$$$ÿ+++ÿÿ,,,ÿ@@@ÿ"fJÿTÿTÿ‘Tÿ‘Tÿ‘Uÿ’Uÿ’Uÿ’Uÿ’Vÿ’Vÿ’Vÿ“Vÿ’Vÿ“Wÿ“Wÿ”Xÿ“Xÿ”Xÿ”Xÿ”Xÿ”Zÿ”Xÿ•Yÿ•Yÿ–Yÿ–Zÿ–[ÿ–[ÿ–[ÿ–\ÿ–[ÿ—\ÿ—\ÿ˜\ÿ—\ÿ˜]ÿžb!-ÿ999ÿJJJÿ>>>ÿ444ÿ%%%ÿ)))ÿÿ,,,ÿ???ÿ"dHÿ’Uÿ’Vÿ’Vÿ’Vÿ’Vÿ’Vÿ“Wÿ“Vÿ“Wÿ”Xÿ”Wÿ”Xÿ”Xÿ”Xÿ”Xÿ”Yÿ•Zÿ•Yÿ•Zÿ•Zÿ–Zÿ–Zÿ–[ÿ–[ÿ–\ÿ–\ÿ—\ÿ˜\ÿ˜\ÿ˜\ÿ˜^ÿ˜]ÿ˜^ÿ˜^ÿ™^ÿ™^ÿœd'-ÿ777ÿIIIÿ>>>ÿ333ÿ&&&ÿ(((ÿÿ***ÿ>>>ÿ bHÿ“Vÿ“Vÿ”Xÿ“Xÿ”Wÿ”Xÿ”Xÿ”Xÿ”Xÿ”Yÿ”Yÿ”Yÿ•Zÿ•Zÿ–Zÿ–Zÿ–[ÿ–[ÿ–[ÿ–\ÿ—\ÿ—\ÿ˜\ÿ—]ÿ˜]ÿ˜\ÿ˜^ÿ˜^ÿ˜^ÿ™^ÿ™_ÿ™_ÿš_ÿš`ÿš`ÿš`ÿb.-ÿ666ÿIIIÿ>>>ÿ333ÿ&&&ÿ&&&ÿÿ***ÿ===ÿ aGÿ”Xÿ”Xÿ”Yÿ”Yÿ•Yÿ•Yÿ•Zÿ•Zÿ•Zÿ•Zÿ–Zÿ–Zÿ–[ÿ–\ÿ–\ÿ–\ÿ—\ÿ—]ÿ˜\ÿ˜]ÿ˜^ÿ˜]ÿ˜^ÿ˜^ÿ™^ÿ™^ÿ™_ÿ™`ÿš`ÿš`ÿš`ÿ›`ÿš`ÿšaÿœbÿ›bÿd4-ÿ444ÿHHHÿ===ÿ222ÿ'''ÿ&&&ÿÿ(((ÿ;;;ÿ_Eÿ•Zÿ•Yÿ•Zÿ–Zÿ–Zÿ–[ÿ–[ÿ–[ÿ–\ÿ—\ÿ—\ÿ—\ÿ—\ÿ—]ÿ˜]ÿ˜]ÿ˜^ÿ˜^ÿ˜^ÿ˜^ÿ˜^ÿ™_ÿš_ÿš`ÿš`ÿš`ÿš`ÿšaÿš`ÿœaÿ›bÿœbÿ›bÿœbÿœcÿcÿžd8- ÿ222ÿGGGÿ===ÿ222ÿ'''ÿ&&&ÿÿ(((ÿ:::ÿ^Dÿ–[ÿ–Zÿ–[ÿ–\ÿ–[ÿ–\ÿ—\ÿ—\ÿ—\ÿ˜]ÿ˜]ÿ˜^ÿ˜^ÿ™^ÿ™^ÿ™^ÿ™_ÿ™`ÿ™_ÿš`ÿš`ÿš`ÿš`ÿš`ÿšbÿ›aÿ›aÿœbÿœbÿœbÿœcÿdÿdÿdÿdÿdÿŸf=. ÿ111ÿGGGÿ===ÿ222ÿ(((ÿ&&&ÿÿ'''ÿ999ÿ]Dÿ–\ÿ—\ÿ—\ÿ—\ÿ˜\ÿ”Zÿ~WÿXÿ€Yÿ€Yÿ€Zÿ€Zÿ€Zÿ€Zÿ€Zÿ‚[ÿ„[ÿ†YÿŒWÿ˜`ÿ›aÿ›bÿ›bÿœbÿœbÿœbÿœcÿœdÿœdÿdÿžfÿžfÿždÿždÿžfÿžfÿŸgA. ÿ000ÿFFFÿ<<<ÿ222ÿ(((ÿ###ÿÿ&&&ÿ888ÿ\Cÿ—]ÿ˜]ÿ˜]ÿ˜^ÿ˜^ÿ†RÿÙÙÙÿûûûÿûûûÿûûûÿûûûÿûûûÿûûûÿûûûÿûûûÿùùùÿõõõÿêêêÿÎÔÒÿž´¬ÿV•~ÿ†[ÿšbÿœcÿdÿcÿdÿdÿžeÿŸhÿ hÿžfÿžfÿžfÿŸgÿŸgÿŸgE0 ÿ...ÿFFFÿ<<<ÿ222ÿ'''ÿ$$$ÿÿ%%%ÿ777ÿ[Bÿ˜^ÿ˜^ÿ˜^ÿ™^ÿ™_ÿWÿB†lÿN’xÿN†qÿêêêÿÿÿÿÿöööÿ[Ž{ÿN“yÿN”yÿT–~ÿižŠÿ­¢ÿÇÏÌÿúúúÿÿÿÿÿçèèÿ|¢”ÿ‰\ÿeÿžeÿždÿžfÿ jÿ jÿŸfÿŸgÿŸgÿ gÿ gÿ hÿ¡hK5 ÿ,,,ÿEEEÿ<<<ÿ222ÿ(((ÿ$$$ÿÿ$$$ÿ666ÿYAÿ™^ÿ™_ÿ™_ÿš_ÿš_ÿš`ÿš`ÿš`ÿ†Vÿåååÿÿÿÿÿðððÿ‡]ÿœbÿœbÿœbÿœcÿcÿ\ÿ,ˆfÿ¨»´ÿýýýÿÿÿÿÿÐ×Ôÿ,‡fÿdÿžfÿ¡jÿ¡jÿžfÿŸfÿŸfÿŸfÿŸgÿŸgÿ gÿŸhQ6ÿ+++ÿDDDÿ;;;ÿ111ÿ'''ÿ###ÿÿ###ÿ444ÿY@ÿš_ÿš`ÿš`ÿš`ÿš`ÿš`ÿ›`ÿ›aÿ†Vÿåååÿÿÿÿÿðððÿ‡^ÿœbÿœbÿœbÿœcÿœcÿœcÿœcÿ’^ÿg˜†ÿøøøÿÿÿÿÿæéèÿ0ˆiÿ iÿ¡lÿžeÿžeÿžeÿžfÿžgÿžfÿŸfÿŸfÿŸfW6ÿ***ÿBBBÿ:::ÿ000ÿ&&&ÿ"""ÿÿ"""ÿ333ÿV>ÿ™_ÿ™_ÿš_ÿš`ÿš`ÿš`ÿš`ÿš`ÿ†Vÿåååÿÿÿÿÿðððÿ†]ÿ›aÿ›bÿ›bÿœbÿœbÿœbÿœbÿœbÿ–_ÿrœÿÿÿÿÿÿÿÿÿ×ÜÛÿŒcÿdÿdÿdÿžeÿ gÿžeÿžeÿžeÿžfÿŸe]6ÿ(((ÿAAAÿ:::ÿ000ÿ&&&ÿ"""ÿÿ!!!ÿ222ÿS=ÿ˜^ÿ™^ÿ™^ÿ™^ÿ™_ÿ™_ÿš_ÿš_ÿ†Tÿåååÿÿÿÿÿðððÿ†]ÿš`ÿšaÿ›aÿ›aÿ›aÿ›bÿ›bÿœbÿœbÿŽ\ÿÂÌÈÿÿÿÿÿÿÿÿÿŒ¬ ÿ™aÿœcÿžeÿŸgÿdÿdÿdÿždÿžeÿžec6ÿ&&&ÿ@@@ÿ:::ÿ000ÿ&&&ÿ"""ÿÿ ÿ111ÿR;ÿ˜]ÿ˜^ÿ˜^ÿ˜^ÿ˜^ÿ™^ÿ™^ÿ™^ÿ„Tÿåååÿÿÿÿÿðððÿ†\ÿš`ÿš`ÿš`ÿš`ÿš`ÿšaÿ›aÿ›aÿ›aÿ›bÿL’xÿÿÿÿÿÿÿÿÿñññÿ†^ÿeÿžgÿœcÿœcÿœcÿdÿdÿdÿdi6ÿ%%%ÿ???ÿ888ÿ///ÿ&&&ÿ!!!ÿÿ ÿ000ÿP:ÿ˜\ÿ˜]ÿ˜]ÿ˜]ÿ˜]ÿ˜^ÿ˜^ÿ˜^ÿ„Tÿåååÿÿÿÿÿðððÿ…[ÿ™_ÿ™_ÿš_ÿš`ÿš`ÿš`ÿš`ÿš`ÿš`ÿ›bÿ eÿçèèÿÿÿÿÿÿÿÿÿ`›‡ÿžfÿœbÿœbÿœbÿœbÿœcÿœcÿœcÿcp6ÿ###ÿ>>>ÿ999ÿ///ÿ&&&ÿ ÿÿÿ///ÿO9ÿ—\ÿ—\ÿ—\ÿ—\ÿ˜\ÿ˜]ÿ˜]ÿ˜]ÿ„Sÿåååÿÿÿÿÿðððÿ…Zÿ™^ÿ™^ÿ™^ÿ™_ÿ™_ÿ™_ÿš_ÿš`ÿš`ÿ¢oÿ—aÿ±ÀºÿÿÿÿÿÿÿÿÿŸµ­ÿ™`ÿ›aÿ›bÿ›bÿœbÿœbÿœbÿœbÿœbv6ÿ"""ÿ===ÿ888ÿ///ÿ&&&ÿ ÿÿÿ...ÿN8ÿ–[ÿ–[ÿ–[ÿ—\ÿ—\ÿ—\ÿ—\ÿ—\ÿƒRÿåååÿÿÿÿÿðððÿ„Zÿ˜^ÿ˜^ÿ˜^ÿ˜^ÿ˜^ÿ™^ÿ™^ÿ™_ÿ kÿžiÿš_ÿެ ÿÿÿÿÿÿÿÿÿÆÎËÿXÿš`ÿš`ÿ›aÿ›aÿ›aÿ›bÿ›bÿ›a|6ÿ!!!ÿ<<<ÿ777ÿ...ÿ%%%ÿ ÿ ÿÿ---ÿM6ÿ–Zÿ–Zÿ–Zÿ–[ÿ–[ÿ–[ÿ–[ÿ–\ÿƒRÿåååÿÿÿÿÿðððÿ„Zÿ˜\ÿ˜]ÿ˜]ÿ˜]ÿ˜]ÿ˜^ÿ˜^ÿfÿ¢nÿ™^ÿ™^ÿx£“ÿÿÿÿÿÿÿÿÿàààÿ‡Tÿš`ÿš`ÿš`ÿš`ÿš`ÿš`ÿ›aÿ›a‚7ÿ ÿ:::ÿ777ÿ...ÿ%%%ÿ ÿ ÿÿ,,,ÿL5ÿ•Yÿ•Zÿ•Zÿ–Zÿ–Zÿ–Zÿ–Zÿ–Zÿ‚Qÿåååÿÿÿÿÿðððÿ„Yÿ—\ÿ—\ÿ—\ÿ—\ÿ˜\ÿ˜]ÿš`ÿ¤sÿ˜^ÿ˜^ÿšbÿq¢’ÿÿÿÿÿÿÿÿÿäääÿ…Tÿ™_ÿ™_ÿš_ÿš`ÿš`ÿš`ÿš`ÿš`ˆ7ÿÿ:::ÿ666ÿ...ÿ%%%ÿÿ ÿÿ+++ÿJ4ÿ”Xÿ”Yÿ•Yÿ•Yÿ•Yÿ•Zÿ•Zÿ–Zÿ‚PÿåååÿÿÿÿÿðððÿƒXÿ–[ÿ–[ÿ–[ÿ—\ÿ—\ÿ—\ÿ¤rÿšaÿ˜\ÿ™_ÿŸjÿx£’ÿÿÿÿÿÿÿÿÿßàßÿ†Sÿ˜^ÿ™^ÿ™^ÿ›bÿ™_ÿ™_ÿš_ÿ™_Ž7ÿÿ888ÿ666ÿ---ÿ$$$ÿÿ ÿÿ***ÿH2ÿ”Xÿ”Xÿ”Xÿ”Xÿ”Xÿ”Yÿ•Yÿ•YÿPÿåååÿÿÿÿÿðððÿƒXÿ–Zÿ–Zÿ–Zÿ–[ÿ–[ÿ kÿgÿ—\ÿ˜]ÿ kÿ—\ÿ¬¡ÿÿÿÿÿÿÿÿÿÄÍÊÿŒVÿ˜]ÿ˜^ÿ˜^ÿšbÿ˜^ÿ™^ÿ™^ÿ™_–7ÿÿ666ÿ555ÿ,,,ÿ$$$ÿÿ ÿÿ)))ÿE0ÿ“Wÿ“Wÿ”Wÿ”Xÿ”Xÿ”Xÿ”Xÿ”Xÿ€Oÿåååÿÿÿÿÿðððÿ‚Xÿ•Zÿ•Zÿ•Zÿ–Zÿšaÿ¢qÿ–Zÿ–[ÿŸjÿ—\ÿWÿ³Á»ÿÿÿÿÿÿÿÿÿž´«ÿ•[ÿ˜\ÿ˜]ÿš`ÿ˜^ÿ˜]ÿ˜^ÿ˜^ÿ˜^œ7ÿÿ444ÿ444ÿ+++ÿ###ÿÿ ÿÿ'''ÿB.ÿ“Vÿ“Vÿ“Vÿ“Wÿ“Wÿ“Wÿ”Wÿ”Xÿ€Nÿåååÿÿÿÿÿðððÿ‚Wÿ”Yÿ”Yÿ•Yÿ–Zÿ¦vÿ–\ÿ•ZÿŸjÿ—]ÿ–Zÿ‚Tÿéêêÿÿÿÿÿÿÿÿÿ\–€ÿ—\ÿ—\ÿ—\ÿšbÿ—\ÿ—\ÿ˜]ÿ˜]ÿ˜]¢8ÿÿ222ÿ222ÿ***ÿ"""ÿÿ ÿÿ%%%ÿ=+ÿ’Vÿ’Vÿ’Vÿ’Vÿ’Vÿ“Vÿ“Vÿ“Wÿ€Nÿåååÿÿÿÿÿðððÿ‚Vÿ”Xÿ”Xÿ”Xÿ¡nÿœdÿ”Yÿgÿ˜_ÿ•Zÿ•ZÿQwÿÿÿÿÿÿÿÿÿíîíÿ‚Vÿ–[ÿ–[ÿ˜_ÿ˜^ÿ–\ÿ—\ÿ—\ÿ—\ÿ—\¨9ÿÿ000ÿ000ÿ)))ÿ!!!ÿÿÿÿ###ÿ:(ÿ’Tÿ’Uÿ’Uÿ’Uÿ’Uÿ’Vÿ’Vÿ’VÿMÿåååÿÿÿÿÿðððÿVÿ“Wÿ”Wÿ˜_ÿ¤sÿ”Xÿšcÿšcÿ”Xÿ”Xÿ†TÿÇÐÌÿÿÿÿÿÿÿÿÿƒ¦˜ÿ“Xÿ–Zÿ–Zÿšbÿ–[ÿ–Zÿ–[ÿ–[ÿ–[ÿ–[®:ÿÿ///ÿ...ÿ(((ÿ ÿÿÿÿ"""ÿ8'ÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ’Uÿ’Uÿ’Uÿ~Lÿåååÿÿÿÿÿðððÿ€Uÿ“Vÿ“Vÿ¦wÿ•[ÿ—^ÿgÿ”Wÿ”XÿTÿzÿÿÿÿÿÿÿÿÿÏÖÓÿƒTÿ•Yÿ•Yÿ—\ÿ˜`ÿ•Zÿ–Zÿ–Zÿ–Zÿ–Zÿ–Z´:ÿÿ,,,ÿ---ÿ&&&ÿÿÿÿÿ ÿ6&ÿSÿSÿSÿTÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ~Lÿåååÿÿÿÿÿðððÿ€Uÿ’VÿœfÿŸlÿ•ZÿŸlÿ“Vÿ“Vÿ‡RÿvœÿúúúÿÿÿÿÿÞâàÿ&\ÿ”Xÿ”Xÿ”Xÿšbÿ•Yÿ•Yÿ•Yÿ•Yÿ•Zÿ•Zÿ•Z»:ÿÿ***ÿ+++ÿ$$$ÿÿÿÿÿÿ3$ÿRÿRÿRÿSÿSÿSÿSÿTÿ~Kÿåååÿÿÿÿÿðððÿ€Tÿ’Vÿ§zÿ“Wÿ nÿUÿ‚Oÿ>†iÿºÆÁÿþþþÿÿÿÿÿÂËÈÿ!Xÿ“Wÿ“Wÿ”Wÿ–[ÿ™`ÿ”Xÿ”Xÿ”Xÿ”Xÿ”Yÿ”Yÿ•YÁ:ÿÿ(((ÿ***ÿ###ÿÿÿÿÿÿ1"ÿRÿRÿRÿRÿRÿ‚JÿaŒzÿrž‹ÿr–‡ÿíííÿÿÿÿÿôôôÿxšŒÿr¢‘ÿr¢’ÿu£”ÿ†¨›ÿ¥·°ÿÜÞÝÿþþþÿÿÿÿÿÙÜÛÿh–‚ÿ „Qÿ’Vÿ“Vÿ“Vÿ“Vÿšbÿ”Xÿ“Wÿ”Wÿ”Xÿ”Xÿ”Xÿ”Xÿ”XÇ@ÿÿ&&&ÿ(((ÿ"""ÿÿÿÿÿÿ. ÿŽQÿŽQÿQÿQÿRÿ~HÿÌÌÌÿîîîÿîîîÿîîîÿîîîÿîîîÿîîîÿîîîÿîîîÿîîîÿéééÿÜÝÜÿ¸Ä¿ÿ‹©œÿ@ˆiÿ Oÿ‘Uÿ’Uÿ’Uÿ’Vÿ’Vÿ”Yÿšbÿ’Vÿ“Vÿ“Vÿ“Wÿ“Wÿ“Wÿ”Wÿ”XÍBÿÿ###ÿ&&&ÿ ÿÿÿÿÿÿ ,ÿŽPÿŽPÿŽPÿŽPÿŽPÿˆNÿ|Oÿ~Qÿ~Qÿ~Qÿ~QÿRÿoÿŒgÿ„Zÿ~Pÿ ~OÿJÿˆNÿTÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ’Tÿ’Uÿšcÿ”Xÿ’Uÿ’Vÿ’Vÿ’Vÿ’Vÿ“Vÿ“Vÿ“VÓBÿ ÿ!!!ÿ%%%ÿÿÿÿÿÿÿ *ÿOÿOÿŽPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽQÿQÿ–^ÿ¬‚ÿjÿRÿRÿRÿRÿRÿRÿSÿSÿSÿTÿ‘Tÿ‘Tÿ“Vÿšdÿ‘Tÿ‘Tÿ’Uÿ’Uÿ’Uÿ’Uÿ’Vÿ’Vÿ’VÚDÿ ÿÿ###ÿÿÿÿÿÿÿ (ÿŒNÿNÿNÿOÿOÿOÿŽOÿŽPÿŽPÿŽPÿŽPÿª€ÿ¥vÿŽQÿQÿQÿQÿRÿRÿRÿRÿRÿRÿRÿSÿSÿšcÿ”XÿTÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ‘Tÿ’Uÿ’Uÿ’UàEÿ ÿÿ!!!ÿÿÿÿÿ ÿÿ %ÿŒNÿŒNÿŒNÿŒNÿŒNÿNÿNÿOÿOÿOÿ™cÿ¬‚ÿQÿŽPÿŽPÿŽPÿŽPÿŽQÿQÿQÿQÿRÿRÿRÿRÿ’UÿœhÿRÿSÿSÿSÿSÿTÿ‘Tÿ‘Tÿ‘Tÿ‘TæFÿ ÿÿ ÿÿÿÿÿ ÿÿ "ÿŒMÿŒMÿŒMÿŒMÿŒNÿŒNÿŒNÿŒNÿŒNÿPÿ­„ÿTÿOÿOÿŽOÿŽPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽQÿŽQÿQÿQÿšcÿ”ZÿRÿRÿRÿRÿRÿSÿSÿSÿSÿTìFÿÿÿÿÿÿÿÿ ÿÿ ÿ‹Lÿ‹Lÿ‹Lÿ‹LÿŒMÿŒMÿŒMÿŒMÿŒNÿ¤vÿ¡pÿŒNÿŒNÿNÿNÿOÿOÿOÿŽOÿŽPÿŽPÿŽPÿŽPÿŽPÿTÿžjÿQÿQÿQÿRÿRÿRÿRÿRÿRÿRÿSòFÿÿÿÿÿÿÿÿ ÿÿ ÿŠKÿŠKÿŠLÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ nÿµ’ÿŽQÿŒMÿŒNÿŒNÿŒNÿŒNÿŒNÿNÿNÿOÿOÿOÿOÿŽPÿšeÿ•\ÿŽPÿŽPÿŽPÿŽPÿŽQÿQÿQÿRÿRÿRÿRøGÿÿÿÿÿÿÿÿÿÿ ÿŠJÿŠJÿŠKÿŠKÿŠKÿŠKÿŠLÿšdÿ·”ÿ oÿ‹Lÿ‹LÿŒLÿŒMÿŒMÿŒMÿŒMÿŒNÿŒNÿŒNÿŒNÿŒNÿNÿTÿ mÿOÿOÿŽPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽPÿŽQÿQÿQÿHÿÿÿÿÿÿÿÿÿÿÿ‰Jÿ‰Jÿ‰JÿŠJÿŠJÿŠJÿ”\ÿ¬‚ÿ´ÿŒNÿŠLÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹LÿŒMÿŒMÿŒMÿŒMÿŒNÿŒNÿœhÿ•]ÿŒNÿNÿNÿOÿOÿOÿŽOÿŽPÿŽPÿŽPÿŽPÿŽPÿŽUHÿÿÿÿÿÿ ÿÿÿ ÿÿˆIÿˆIÿ‰Iÿ‰Iÿ‰JÿTÿ­…ÿªÿŸnÿŠJÿŠJÿŠKÿŠKÿŠKÿŠKÿŠLÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹LÿŒMÿUÿ¢qÿŒNÿŒNÿŒNÿŒNÿŒNÿŒNÿNÿNÿOÿOÿOÿŽOÿŽPÿ‘P Hÿÿÿÿÿ ÿ ÿÿÿ ÿÿˆHÿˆHÿˆHÿˆHÿŒNÿ°Šÿ—`ÿ·•ÿŠLÿ‰Jÿ‰JÿŠJÿŠJÿŠJÿŠJÿŠKÿŠKÿŠKÿŠKÿŠLÿ‹Lÿ‹LÿŸlÿ•\ÿ‹LÿŒMÿŒMÿŒMÿŒMÿŒNÿŒNÿŒNÿŒNÿŒNÿNÿNÿOÿNLÿÿ ÿÿÿ ÿ ÿÿÿ ÿ ÿ‡GÿˆHÿˆHÿ‰Jÿ¯ˆÿ’Xÿ°ŠÿžlÿˆIÿˆIÿ‰Iÿ‰Iÿ‰Jÿ‰Jÿ‰Jÿ‰JÿŠJÿŠJÿŠJÿŠKÿŠKÿ“Zÿ¢rÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹LÿŒMÿŒMÿŒMÿŒMÿŒNÿŒNÿŒNÿŒNÿŽPLÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ‡Gÿ‡Gÿ‡Gÿªÿ˜cÿ˜cÿ¸˜ÿ‰JÿˆHÿˆHÿˆHÿˆHÿˆIÿˆIÿ‰Iÿ‰Iÿ‰Jÿ‰Jÿ‰Jÿ‰JÿŠKÿ£tÿ”\ÿŠKÿŠKÿŠKÿŠKÿŠLÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹LÿŒLÿŒMÿŒMÿŒMÿŒNMÿÿÿ ÿ ÿÿÿÿÿÿ ÿ†Fÿ†Fÿ¤vÿ¢rÿˆHÿ·•ÿœjÿ‡Gÿ‡Gÿ‡GÿˆHÿˆHÿˆHÿˆHÿˆHÿˆHÿˆHÿˆIÿˆIÿ‰Iÿ˜aÿ£tÿŠJÿ‰JÿŠJÿŠJÿŠJÿŠKÿŠKÿŠKÿŠKÿŠLÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹Lÿ‹L&Nÿÿÿ ÿÿÿÿÿÿÿ ÿ†Fÿ›iÿ«ÿ†Fÿ¥xÿ¶”ÿˆGÿ‡Fÿ‡Fÿ‡Gÿ‡Gÿ‡Gÿ‡Gÿ‡GÿˆHÿˆHÿˆHÿˆHÿˆHÿQÿ§{ÿ’YÿˆIÿ‰Iÿ‰Iÿ‰Jÿ‰Jÿ‰JÿŠJÿŠJÿŠJÿŠJÿŠKÿŠKÿŠKÿŠKÿ‹Lÿ‹K,Nÿÿÿ ÿÿÿÿÿÿÿ ÿ”^ÿ²ŽÿˆHÿ—aÿÀ£ÿ–`ÿ†Fÿ†Fÿ†Fÿ†Fÿ†Fÿ‡Fÿ‡Fÿ‡Gÿ‡Gÿ‡Gÿ‡Gÿ‡Gÿ‰Jÿ¤vÿ oÿˆHÿˆHÿˆHÿˆHÿˆIÿˆIÿ‰Iÿ‰Iÿ‰Jÿ‰Jÿ‰JÿŠJÿŠJÿŠJÿŠJÿPÿ…Y0Oÿ ÿÿÿÿÿÿÿÿÿÿLÄ©ÿ\¶‘ÿ^±‰ÿNæÿOÀ¢ÿX®„ÿT¬‚ÿT¬‚ÿS¬ÿR¬€ÿQª€ÿN¨}ÿL¦{ÿJ¦zÿJ¦yÿH¦yÿG¥wÿD£vÿ>§}ÿ:¬†ÿ>¡sÿ=žpÿ;žoÿ9nÿ7œlÿ4›kÿ4™iÿ2˜hÿ/—gÿ.–fÿ,–eÿ,•dÿ*•cÿ'’`ÿ&‘_ÿ$\ÿrMÎN'Pÿ###ÿSSSÿZZZÿZZZÿZZZÿ[[[ÿ\\\ÿ\\\ÿ```ÿ\b_ÿZwhÿYwhÿVufÿXvgÿXvgÿXvgÿYvgÿWtfÿXxhÿXxhÿYxhÿYxhÿZxjÿZyjÿZxiÿZxiÿ[|lÿ\|lÿ]|mÿ^}nÿ_}nÿ_~nÿ^|nÿ_}nÿaqÿ`€pÿc‚rÿd‚sÿd‚sÿd‚sÿdsÿd‚sÿf…vÿg„uÿ9hOÿL!ÿ\$YBÿ‹‹‹ÿµµµÿ¶¶¶ÿ···ÿ¸¸¸ÿ¸¸¸ÿ¹¹¹ÿºººÿ»»»ÿ»»»ÿ¼¼¼ÿ½½½ÿ¾¾¾ÿ¿¿¿ÿÀÀÀÿÁÁÁÿÁÁÁÿÂÂÂÿÃÃÃÿÄÄÄÿÄÄÄÿÅÅÅÿÆÆÆÿÆÆÆÿÈÈÈÿÉÉÉÿÉÉÉÿÉÉÉÿËËËÿÌÌÌÿÌÌÌÿÍÍÍÿÎÎÎÿÎÎÎÿÏÏÏÿÐÐÐÿÐÐÐÿÒÒÒÿÒÒÒÿÓÓÓÿÓÓÓÿÕÕÕÿÖÖÖÿÕÕÕÿW~fÿT ÿa&\:ÿÂÂÂÿÊÊÊÿËËËÿÌÌÌÿÎÎÎÿÏÏÏÿÎÎÎÿÐÐÐÿÓÓÓÿÔÔÔÿÓÓÓÿÔÔÔÿÖÖÖÿÚÚÚÿÛÛÛÿÚÚÚÿÛÛÛÿÜÜÜÿßßßÿáááÿáááÿáááÿâââÿãããÿäääÿäääÿãããÿäääÿåååÿåååÿåååÿæææÿçççÿçççÿçççÿèèèÿèèèÿéééÿéééÿêêêÿéééÿéééÿêêêÿìììÿ2cEÿ_$ÿ`'bøjjjÿšššÿ›››ÿ™™™ÿ———ÿ˜˜˜ÿ˜˜˜ÿ˜˜˜ÿ”””ÿ–¨ÿ–¬Ÿÿ˜­ ÿ’ªœÿ’«›ÿ”¬ÿ”­žÿ‘«›ÿª˜ÿª˜ÿŽª™ÿŽ«™ÿ‡¨”ÿˆ©•ÿˆ©•ÿ‰ª–ÿ…¨“ÿƒ¨’ÿ„¨’ÿ„¨’ÿƒ¨’ÿ~¦ÿ~¦ÿ~§Žÿ¨ÿz¥Šÿy¥Šÿy¦Šÿy¦Šÿw¥ˆÿs£†ÿs£†ÿs£†ÿt¤‡ÿm ÿ`*ÿ b-þ\4?oöûöôîìæäÜKy]ðJx\ñHwZñGxZìDvWëCuVêBtVêAsTê@qSê@oRæ?nQæ>pQäÕ,_@Ò,aAÍ,`AÌ)]>Ì(]=Ì'[;Ë%X8Ç$V7Å"U6Ä$W7ºM1bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqstardict-qstardict-1.3/qstardict/pixmaps/qstardict.png000066400000000000000000000217371323166163100235460ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ {Xo IDATxÚí}{$Gyç/«º{ºçÙ³;³«Yí®V¬v‘V>„ì;„OÆØÆ@ |Áù!cÂç;|º;‡y„ξ?cs¶ãøA„Á|p6ÆÆ’ÀX–Á»z°Þ‡ö¥}ÍÎ§_U•ßý‘UÝYY™YÕÓ5švœ*¢£««²«²òûòû~ßïËÌ^Ú^Ú^Ú^Ú^Ú^Ú^ÚþÜXN×y'€ÿàæðš«¸t¾À“~7´¤ßm{¶;÷üð«œnÁéø~Ð (ˆDÝ?$]Ìó:œ{Ô!…Np ðဈ@¢j>çÄy@ˆq§["îsÇçÄoæwÏDÄ<󀘸çâšAÀït§^Ég §È:ëU3 ÄÂ÷q“Ûž×áÎksWî}~ñ[¸’—r¸Æø¸rlJù=åB×/¯z»‹EæD‚è‰V´gQ»ÆŽóH'ÄÇuÇÁë•íÊ¢÷›‡J@\h[·„¤XNXý= <¼Ÿ\WõžŽã€Q¤¤á9N .É>¼?çœsG÷ZƒÃGm¹ù¿f«K¿ú¯,~p,@À)s£££¸ÿþûQ­VÅ…ë>\«ÕJ4nt>ê5­V D„‰}@qÜA÷t¸Óöšðy'lT,ª:c8hv ˜á‰ÄÞ;Vo¯Yœƒ£Ù©[Úó;hùMk™¶×„Ö×´5Ú5<è«ÁG eLc_[l¼å©/\øÒV[€»ÌÀ»ßýn¼îu¯ë –1ÛW¯–“?ºó1­µ”S•Ìv=Û=ÇIÓÕ—ˆ´ÏbªCT>:æ8ŽöÑñzk ~ü—¾Kì<Ú~ ìd¡ºmî]¶\G;¯}ík199i¦üÀº‡öMÿ‰Ž¹®Û=&7¾\ÎqœØt‚ÒY¢ÈëÎÅ\dÞcfœâf=ªk×í(×w]7vMù<ç®ëb¢"¼é¾Êa\½~…1Q¶æ,LçáU€‘˜ù ÀÖã£}ß÷»ûÅb1V.ò…:ep]7Ñð&¡ …Äñèºêµe…‘¡žw'v^þŸZ¯ Œ÷ˆ.×C­¯\Ï;n»ýé1¾p €øCÏ=÷n¿ýv­IMÛo·Û Ü`R"B¥)›©G묇, “«2ÕQ½š{0ÕQç2öÌíƒS:+@y;ÀœXTµe °+ꕟþô§ñàƒjÍyÚCš„¨úGÙªådë£S@Y ºú™\‘ê³Óðˆ|B¨n0ú3ÆpãΛà”Ä=ýP¨ 1 0 8vì>úÑâ¾ûîC¹\îËÈ ùMÕ%D ¡‚3Y@:߬²NÁt½^­›§è6ÕÔËe#ìbz~0­NN£ÞYJh³Õ.`ee‡ÂÑ£Gñè£vÁ ÍT«&tdd¤ Šjü*nxyNˆ¡8qp€sKÔJâ㞈›Kj¨Çbæ¿ò8–(”©›þÏÎ ¥aKqëå0}S "yÍbÉ÷!ƃív N  Òp0Y@ Ü|ó͘ššê RF¶‘À£c@’Á÷}ÌïÞ÷}øíàD`l‘6ààää 2…¸ P('.„Ä"b‡Båš!î#€çN>ˆóp‘ùAðt‰" îƒx¯¾¼Kê $mî÷âBqÉYÍPC£rÄAAD<üôœAØA¯ ¹¸O½¶ŽãOŸí¬./ßüa|v(Êå2|ßï ×fzÕHÞÊÀ‡>=‚mcM|çòv¼°4iþÅÞÌNæùÅ)œ¼Z…tºçezX÷pjÔ†‘Ì eF¸y¶‰’Kð8Ãù¥´<Ùœ#voXîÍ$VR½©è(Nì°z½‚SÂŽ©}8ûäÒÂñÓÏ8þ—¨m• ˆÕ¬ÓéÀqœ˜9—ã\Ù'v:®_>‘ßó½¾üL?xphçu¼pí:®„øÕcÀ›c#ÀþÙUœ¾ºŠ…zÚÌ6Þ¾s8¼(ºÀžm ðõ'Ñ&wí\fi<ÿ(?³›J&„}j1ê…ÀÍ;’×H\ßrCk]2Ô{±vS{i N<¨p›™×Q®6ôÜE¿N¤å¢Çà{W<üb 8z. C*À†Ý ÀK~º «:pE¤0Z¶¿x×)÷Õæ ­­T+O.+‚-¼IÄÍë>øõ:ðõ“À¶1à_¿¬×Ç.ç—B>úF "Ñòxš%>¨·EÙù)…}‘¹®\ÀßJ ›ÈÂÏ„õÊÄÏ¿°üã`ÏvàðÞ^D÷÷Ï —P.·íÚ<«=œœ]ߥ"0;‘"pUØ}œ)gI¼>”À$|MS'ÙpǮǀÛç›fÄáŽ<}A½m)lŽÀu’j¶…u€&×ÉwhžVOw@™åflé]Sª×”ø`††ûÖiàâðÝû™qñßW€Zp]àÖùþž€ Ì,pÝá‹K@À6™qÞ}¦Þ§6T ‹¤*‚£o ðõSÀr¸ç 0ZÑÀ‘ó#ààN R¼wgõß ! Ü9!"ƒÌþÛ"pfx²MøPXÌÚûM bßß{H€¿ Ë™» ¸u׋’-Öq`û˜°e¸Í|¨§]¡Q€¬ÂWGî$£»ÿnyÀc'€ñ²p  ±ùhñÅ É8—VÄþÌDªn¢À“,&š[©,@ççu®£Yªÿ^iBèÆiàŽÝÀÊ:pfQ€±—Ï÷!ðúZ ¨wĽcV`®*æ Û¦@9 ÐEvܰAøß'ίØ-Bħ/¾/¢„ñRFçØ®¬ˆTͱжìϨ˜ÜÅêÐ@Uà:A›„ÌÍà¿Ã8s øöyà5ûü§ñP‡v½¸!YËVÉq€íãÙ„‹b‹èý[Ídúðßß¹ \XLáù% Ña¬¼A†mƒ}±.ZdzL¸ƒÜ™@b–ÙÖb€Ì!  $Ê9ýûÅ8 ¬¶€»nV€8tCvJ5ÀæÀòº8µ}t¨_b6¶6 °À¬T°úGÊdí9D‚v`vXn€8QÎF©æØ®­‹È`ª"ÜÁ \Z=1`h\€š L›#`² ½YAý!t/¾qJø`/åo¹!#ÖBX ±Àôèà\Z=?÷êÿìrvÿϺٵøÅ–<ñ¼ÇÌWC+N©æ†ÐW€Z˜ÁÛõ›A1‡& ìçcúŸÀl „¾Ò¾u.l¸"N£TóD蜫ë DJ0×o«k}« /X×óõÂà}a xö¢8¾c˜*ohRÌ•–°@ÕÑ$¡Õ×oTLÀÌÿ¿h@Ÿñ³L°˜ÀAÛÙëbƒ5´©ƒ3˜: TQ‡#9à Í FƒE¹‡ƒšÿÈ °¸"E³ãÂç&ð ŠYk 0:U [:«À Ý^s¨9”`#„PÌ8ù!tðÌE‘±{ÙŽþžGè¸ÚÔðX±gqSCûŠl¦?6mÜe¹"ô€ W03ìœÌ‡úͪ˜ë-Àçbðj.—êè0¬ =ÌþÂÍ¡_\£Œ_± A^£q2)æj (ÂÁ*,Ã3eTL‚aʰäLà/ v\Ê¡VÀqÄ(bãøÁ¼º«µE–r¼œ{ª5T. K. ÍjDQÀf ôkuÁÕ€WÌ „ž ˜°­µWÌ*Øõô³½Õ À³¸S ب ›È¡ŸZvk´$h⾞¡Ç±@GäÆFrÈŸ">¨YI ´”b•r7¡×ÚÀÕš†#ŽHõ%ð>›L¯µ„â¹NN9 lDpî Ж J~F° ýôuaŠëmÁÌŒåÐuŠÙð„â•rp=9ņ¹ç²€ÁÔ\À&#ô¶\Zn˜N]öÍ£#ù"tí½ h´E4à8ºÑúëƒ*@!o õ~Ó¢YÒÂ6&P÷cí2P¼v *ãÅtm†’š€ãÏœœ}«ø‡Ç[pšhc(¶Q¬åI TÉh µ•V`´ TŠÀ¤`,Ã!h@6ýÑ}3€&ÐÖ Ñæ5·¿æ½¸÷Þ{syÎ9:|ßG½^ÇÕë—pþòIœ<û,ΜG«tâ9ŒÍJ£ÙëmÍŽ° O²¡,“(í6øJaƒ*@'+ l#ƒ<€“mŸ¼¿ÿ~ìß¿›½µZ-œ;wÏ;ŠGþþ ¸xáI´ÆObri-—î1 \“Zå&Xf³ÒÝmlµ4³ðY¢€øäP–­7H#‡Ž9Ò]§XÞöìÙƒÙÙÙØ±z½ŽãÇ­Q¹\F¡P@µZEµZE©Ô›oV.—qðàA`f!É“zcÆú–«>ØMbÙýN88–ÄÐîŽ œk4=àôúßâÙ'?Ï>¾ÛÙmxó¿ùIÜûºÀÔToUü¹¹9üÜ»þîyê øÈ'?€ «_BõF3F# ×6(^FBWƒ5†'¶>püáÉN;Ù¶„dPBÇv Æ ÌO KàÀùe`ïvÑCGÆ€éÝÀès¨Ýø%üÁ×Þ~ñmxèá¿I¬vvçß…ÿOàÕÕÿ‚•“q)ŒeË÷+lpüÃÖSÁ1A««}™–Œ±Y.ÌYàiÛ¥U‘0š›×jt€…U`϶xãÊÀôþ6Zû¾Šßþü;ñ¿ó~ÔjqBnzz¿øžá ‡ÄòÉ)#1Ű#ÅqôÏ%¤*‰IðÚ1–äNj¯ÉbЛWpqEŒˆÒ¶+-‘BÞ=%H¹|a˜ºu]øuüÒ‡KKK±k—J%üçŸy^àÝX9=j¼wÇVÆíƒ’Þ¥AC£i   $¢ƒ0M—÷DŽ´ \¯‹ž?_ÏÿS¿uÿ«Þäá9ïðþ_ÿy4ñ¨¬X,âÿ>Ü:úvÔ˜¶ž 8âfPâ¤&lù€RQ|Ú|Ó‚Ë1%`”ÛÌTÁ+˜à…eÁÕËã/­Š\~l–‘t‰ênŽSþŸácŸúHâ6•JïýOÿcKw#ðõ•j{bÀˆÃúË:æÂÜæíÒr™ÂGgãï§te›ž70Wë±pU°‹ËÀŽ ºé¶é›xèÛ€#G$ÎíÚµ ÷¿ñ}¨Ÿ«jëÉI +ºý%¡ NåfldO—Ç ÌÜÙðR ½Þ}5œå»K2û>J°kRšÿ/+¦”öÁÇ>ûÝ·¡ÈÛëïý!ì-½ÝwM)õlû@Éé f6ò«·x†7TÀ4'À†øuÊãXf d3“Y„®Ã€pzLäï£kv`qØeXrd8ß|GŽ|+q«R©„·¿ñgѸ<¥5çÑjõ…4þV+@êˆ Ý'íu,ÖI “$ÎÕÛbÇ\5žº]o  ¸c\EüÅWôk7ßõª»Qm¿àú{·)\ñ4#Î#œ+̪i¡£[Ê„XVçž ÈnçR¸òØìx¼ìrèy·&/RžN-<………$ûX.ãîÃßÚÕä? 1Óˆ¡È¸ƒ[î\™À,ëØ~wß V þFãXfê¦ Ýrñ d·I+…^¬‹lÞ¸f Ézé8Ž?¦½ï¿zÕµúz2ÀãBé¬ÄP¸¹Ã2$L7)ÄÖÃuçâ‹JeBYžÕ¨úPk WpäÓ¢ÿÄØÂÉŠˆ äK•ªMüÃÓho»wï^T:{U al#†ºLà MíÙiQ€VQÊ „õY€åBMv< Ükb!ˆ’ÂU¦€“gžÑÞ¯Z­bÛèðÛñÞ-÷pŸ’‚ÑÕÓaCž È j#ƒ>˜À,¦25»–‚38.×€Ér/*ˆ ù\_r1´\…°ÖZ@½®Ÿ¾¿oþ´×Íu x2ÔÔÖ“†$…úU_õf㘓Ï:º¬7†3š°Ôk qÅô±~ñö±ÐMÜ:ÖÖôLíÜÎýè4ìy 0Å ;¨ãôu½_}£ö:[ÈÚ€åJCp;&ôtn­*ð‚Evìƒß²÷pNék"q ¶Hä¦`€¬ÓÀ´I nh‹$"àWrD¨Z¡¦/FúT+@€&Nøà¶‰P°)OòðÇ19©_æòâY”Ê–Ûlæòà›¡6€—Æÿg"‹ú¸”.ÍUາ-_„Ó1fÀ ÉYÇ3*ÀÅ«§Q¬˜çfª¼÷od‹¬°lúEè,G&°O×Së­  ¹Œ—v`bbB{ßsN 2™Îõ§¼ï(°ÅùÑ ¤£cºˆ@«Hý |£ö>§¬ãrS„ˆÕQ ¹¼lïmÚ[®­­a¹qÅrßWËv†Î¨.@ö÷²"dáAè%‚42eID®8õ¼ú°~¦ò /¼ª\@ÑøfÍõÄäËŒ—òÁ!\1Ê(mÚgãs§‚û}C˜ü_y(™[ \ú†# ÖGY«W€yï><ðÓ&žÙ÷}üî~­éG±m\€?2D< 'Ýp@YîÍ0øˆà\‰ –±µåéáF̰IÝ2¦˜u—\¹Ì0³úVüÂý­õKDø?ú1Yø8Ææ}¸.P.ØëÉId–âzò²Ú›fY B;B(4ƒö’öÞ|}9KýÚùppíÄ8nòÞ‰¼ç÷177—þg>÷Çøóo~3/_'±0TÁM_©è 4Ö3‡YAy¸²Á~™CYøD’ çŠºÊæ1ÜïÇŒo„P’³r`—ïÀ[î~~ôGÞ‰r9Îë¶Ûm|üSÁCÏþ&fn¿ÒãH•‹áŒàÀ\J©[ó7 X5ÆÀÄ-G|f)þŸ¤ïh ÖXY&õ"‹ê)×TÝ€€Æ*P_A¹qî>ø&¼í'~ ûöíÓR½¿ÿ‰âXýO0sGL©{. S [Þç}†¸½ {àžÚãMkÉ€ÚãU·A’WÒ$M‘à5 ±œl£kçÍõòÕJ£Ú†÷"E#|n{ûæoÃ=ß÷fÜyø•رcGâzëëëxèá¿Æg¿ò›ð羉ÙCaý(tO’T}P¸(Aøü¬¦Iâà´¸_çëMed B\Aÿd¶k Àí…ŸÃá;_7Å·tkbI·ŸýÑ_Em=ɦ–Ü ÊåQŒV1]FµZÅÜÜœqx×òò2âoñg_þ],—ǶÛëp‹=¼ÂkĤ¼AÛ  ðwøJÏʤN W–|/ämþÓÜ€n< Ž 4‚ Ä"*ü†{ß”y­àB¡€7ÿпÝð3/--áÔó§ðµ'¾ˆ£ÇFsìLÝ²Ž™rÜ5Eð…)@’;‰ b×ðøŸuJ‚ÐúP(€-¶8´I"D~ðÈô³Ð2p÷åÍf­V.ì(Z­ˆívµZ õz‹×pìùÄÉ3Ïàzã4Z#ÏÃ^ÆäÀ˜ZO¹þ\Â,îÒ¢aæÄEt@¡ü‰ìž€`<Ÿ`°§àmËÀF›ëºÖ%äâ‰#¥×(ˆ?:=±øÃÏüW¿ÒÊ7lÅ‘¼  §@àn¶ ¿°‚òd€Ên RäwP&ê©T0r[ŽìÖ¤H& \ºêF Éøk¨¢€T‚éãëµ™X@¥+“@å®#±7¾qŒô×T£ÙãIsOdjŠÍ'CŒ)QD3’”€+þ?täY.@r@þÝ5ñÊÄ5 5Ô£¸Y%…']DŒ'`Ü QŠôDOUxx–äàc‚ÐÕ!ÚOPúê{ÿXRA(¤‚.¹¹h’ˆTÎ@¶åàÔ°OV5ˆ MÊJëbÑ©€SÏ$DB”ÂÌèÚª"‘¦çªnÊdˆ4Öˆ$´Ïž™Šß”ÅɯáªÿÖ¹ ÃD椉±±5ÑAÔÀ1¡“Ƭʂç=z9aaH£P7EdP:Xއh0ñÌq~døA Íß›¾ÅRóHð»\5ájÊÑK*ãæ‹84܃ÎI”lÒχn †ø:[µNºx—Œ¦9ù Ù”0ж0„i¢hü²gJOíúVEˆL£ r¦ó·jM¸µSJx)!¨®3•v–ñôª[ …Šfê¹ÞóøCmt  ß6Ð àú%y_§Šù'{¤q”»3$GîÝÄz”o—¡#Kn!é‰zÀN +Iƒd¥$>„Bt4¯Ú룷‰d4* [é pļ@ŠÀIÓ*Ū ™t(Õ ÈÊ(‡m¤Á Ò5™´R ž 1`d}h,€Ü{U“¯þ. ‰·l¨`’tïE'==ÌHq Š¿6a,YˆÜ ™Ë9Ið©ZUÕŠÉŠA0L5X297à‡ÚÀŸÎèB?ù}ƒÝl äohúîòRï‹ü7zwÁ«LÅ]SÌ| ép)\„¬À,9ö `þàï È]²ŽHg)Žú™Þ&TÁ ‰JÂOôÂ-’…¨#™Ô8œ)î’n@ [UÅ K8HЃÖƒ¿-dÓA ‰ì±…‰iÀÉ«<OúI$*BñÒ†{*DÙ•1¥>dO è8‚nªÀŽ0E½?êÅŽãh•‹|¿ü?“°6%£]ã’ãêfŠ˜i˜¾(`Ì`|(Eˆ¤Ï\Ê>>‘eäIzXnw}8²ëro–-€lòUS/c€H9ärà¹0¦kMnÀD%r,é¢RƱ!_¯ŸPº´úôs D?Ý,˜’ " 0=+„|;`$ÜȤËJ Z‚ Ê¿eÀ(‡VŒógËû›¢@Ó¹…D"HÃ× É¿“9öY,C}cÑÓGëµ|‰TNsÎ×8瓲ÈàO¼lŒ.€4á–ÉìÊH^éÝjÂ'†q¤òűTéìLID‘%Äcº$Ê`’Ù‚ÉÖ€øÌà€»"aG=Yƒj ‚Çè¸êebÆ Ï’&Äb¤•ÈÂF»¢èt*Á 0{½U7EdP’­Vß÷Ÿ$­“ÿSIDAT¢»ˆ¾ïƒ1¸,dÙÜ«. R¢°HëIc¢åøXÛë20iF"†ÅM¶$ )£×˜,ƒFÒêc;ß³z~^ ™ðwžçÅz±ÚÛuþ_Žòÿ‚ è6 qñ‰æKtg˳†e³ª;® óð“8Þ“ÔóÒï®;ʉ•¥>ÿÞ5¸Z¿è]½É"œ'ÊÑÐXß”}¾jT,ùyYT ЄBº˜"_SÖŽ˜¾Å<ôCÍLƒJHu~¦Ô‡ ÃÑÒÜ4ép’SÉlx€8A‹s^Ž|¸Ú«eЧÒÀ²ð£—NiÂ25„£¤0Á-×óÖHAƒÔ¡cL‘r hæùé(líø‡ðo#eÇ¡}ž§„¯E†«|ùxç‚ 8(‡rÏ—-€ïû‰@îý®ëÆIØ£˧zkTÊN+“©›ÂFi*XBˆFŠOsÌdÁÂÖuøv†%#ÏÕßòqÊ¢&a»šã±ßNçX¤²_×@‘Up]75Ć•!ž‚M€,%„3˜l„.)C†”›I¢Ÿ PÖH!©×G+¤(v«Ô.ã€)ÀÓ~'”¢ ¾`Q›2¸Dô7ëëëo)ÄkŽtü$ìèÕêœó.má†hëÔÅúûýe¤$“®ÍYL»)/cH9[# ÈcÛ= J½Mc|`ý:ÐYAíô7ðe‹pƒ”‡˜ ’Q㊑#$_[#sSò¹o®¯¯ÿšïû?S©Tf%î¿CD$YZ^^¾Ön·WÇÙ Í~”Vö8çÁÔ³Øj½Y¤„8RP3sÃwôé…K¶Ì” Ò¢QÙ¥DÖ­P ŸÏ6YDX;Ï-á™§ÿ ¿ MÉäs pË9¹Œ1‚f¡5Ðõx“+p2“ߦ.}”ußvL÷mKgõÈ:OnûN;fÛ—s23• Â^OYÂÄ8wáô±ŸõÓ¯p7*𠎥/…È¢$¼ÏOÐǾ¯ü7S—ç&÷lY˜FXÊ>ÓìÛŽe±Yž9M˜º^›0­†c\éݦ}.qJÁ”ç&°aÜLf?MèÌ iÊÐO¯&ƒÉ¦”óÈŸÉ|ûSUT uCžIEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/search-filter.png000066400000000000000000000220101323166163100242610ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× "'M³ : IDATxÚí}il×µæ¹÷ÖÖÙMRÜdRKdÚ’"[Šb;q^â-˜8/{@Hò øÙ€3™qæÇà ÌÌCà yx@`3Iü y‰%kuÆŽmŶ¢(ZËR$KfdѶVJ$%RdïÝUuëÞ3?XÕ.«IʶD6Ý(ôíÃf/u¾{Îwι j÷ß¿!„X"„XB)m‘R6Bšq¢“ÒI)m€FBHÔé£9䄸D)½HFÄ1Jé("ŽÀ(œ¶mû̶mÛʵrOÉ\ûB<ð@²¬›ñzBÈ!İ‚1¶R¾’Ífr¹\S.—k- -RÊ"¦€½‡ ‹ÅRˆˆ®âÑUvB"„ P±ˆHΞ=ëY5ÌL% X‡÷Œj ˜‰Œ1Æ‘sÎÅ«¯¾ú±S§Ný;)å]”Ò•€ð"!ä‰ 6ìpŸÏm|ó›ßü–®ëÿB)ý˜a#]]]o¬\¹òݦ¦&DT=Å» SQM¥RM===küÀñ»?Ÿ/œ8q¢Ïqe`` ¡¿¿?>00ˆ\¼xQBÐd2 Š¢€ÇÇq µµ’É$ Â… Àqœ«˲ ˲ŒÑÑÑÖûÁ“Éä@kkëé®®®Ó7ÝtÓ»wß}÷Yà àõmÛ&š¦+GQˆmÛ0::J:::à­·ÞÂ[o½ÚÚÚþ«eY›gÝx#Ú×Å y÷úã¿«Êô½{÷v\¸p¡]‘Z¸p!cŒçEŽŽŽŠÂ9畾MMM‹ÅàÒ¥K0:: ï}µkÓ¤”êØØØâ±±±Å}}}wïܹ}ôQ«¹¹¹wÙ²e¯ß}÷ݯßu×]¼l'!„xfŸRJ„ˆTU%B8}ú4ADòÈ#@¡Pð|Ïþq˜Þwß}Ï$‰Å_ÿú×Í›ÀôƒážóûeCCC Û¶m»þõ×__tñâÅÿ{3Æàºë®ƒÅ‹Â @QQ¶‚²R©ÃÃÃ0ΡæN‹D"ýþÆ7¾ñì—¾ô¥ó~2èEš¦UÈ ”ÒÉf³üÛßþ6ضm›úüóÏoÈårÅçž{îg_ûÚ×Ö%“É_644ôÝ{ï½› à ~¦ó€òÇ?þqÑ‹/¾¸òøñãÝRJ:¿ ÐÞÞ±Xl‚¢§º8çËå \ž“:™L&_½ùæ›7ÿèG?Ú‰Dl/ ë:BpplÛæBçàÁƒ|pp•Ëåÿˆ_ß¿ÿº³gÏþyVÐÝݽôá‡þ‡·Þzë?QJÍO|â[–/_~¾Z¸wðàÁöÇüÎsçÎ-ü#š››”RB€Çœ=+áï{Ös~Í]ÂË·ÝvÛÿüÉO~r@JÉu]¯XpÊå2ß´iÓjDü5"¶Ÿ;wî?îß¿ÿ%(Ï*|ðÁ¾ð…/$öîÝ{_:^›H$úV­Zõ§åË—_ðƒàÑGýÔŽ;>7“ÿm²¥¥åßžzê©eŒÙ^2hãÆkJ¥Ò? !þ~ßØØøÃ7¶f³ÙœøPÂ%Ã0šî½÷ÞÈÇ?þñ7ñÂÈÈÈÇÏœ9óù¾¾¾UétZ‰F£…Ç{ì¶—_~ù/ ª·ðY*•nyþùçôôôÛ½{÷ºlllìÕR©tšRšD"cëÖ­þþ÷¿ŸÎϵj y衇þúuëd ÜóBCµP(ÄO:µäâÅ‹‹GGG»ÊårÒûçB¡ÆÆÆ P(@±X¬»Zm”RˆF£H$*ÊN¥RÇÁ—ˆD"¯566¾ºlÙ²ý{÷îM 5 bŽ1–¥”f>ÿùÏ_¼çž{ÌO~ò“7Àáëû)âoѼãŽ;nooo—d "Æãqóæ›o~÷¦›n: ªeY‘ÁÁÁ¶áááÖË—//hllléîîŽøk¥R …”Ëe(‹Íf¡P(€eY•k¶G²®ë`Äb1H¥Rà¦n¡¡¡¢Ñ(¸5/SUõ톆†cÍÍÍ'®¿þú·,Xöò{öìinÕu=£ªªI)5׬Y“]±b…øâ¿¸Î}˜ßÿÃ=zôÐöíÛW=üðÃ1/×ï‚C B¨ë:_²dÉÅ¥K—ŽÀ»ˆ¨Z–Ne³Ù†t:I …H4ÕÚÚÚhss3D"0 eü뛦 …B2™ ¤ÓiƒÑÑQ°mÇ|>RJ°, J¥À$—ã¥_u]]×+á&c c‹Å C4­|¾aàz*!©›€â¶mç !#‘H¤?™LžÓ4m`ñâÅï¤R©lpŽ€—2Ž;¶4‰˜Œ1Ë0 sñâÅùÏ|æ3V?Ëd2)8ù¡²Î{D,Y²¤íÁ¼ïöÛoP¥ì‹ˆ“daYBï5^©W¡‹Å¸mÛQDÔÇÑ5MSb±5 ƒêºN¢ÑhE9ž Ö „`š&X–UÉÀxÚmÂëLÓô’IX,±\. ˲ι-„(@AQ”|,»ÇGc±ØÅT*5hFy¦¥`DäŒ1î8Žxê©§zŠÅ"¥”æ4MË´··§ï¹çž‘H$Â×­[·|xxø ŒÏw˜›àÌ™3—^z饾µk×ö躮%˜Pöuóÿd81,ÖHOOO§;€D"Ã$`|‘7I„¹s¨”RŠqí:…BA:Ž#!BîtpI)• =¥hš&E1…œRj !²ˆh9ŽS望0ó™A@!ÁRp5™‚ìܹ³‹sn†‘ÓuÝŠÇãæwÞ™Çãð³Ÿý¬9›ÍŽ|ØÊ¿*Ø¿ÿ‹O?ýôÒû￟V«ý‡Éªe¡P('“É„ã8DUU¦i¥”RÆu¡”·¾ÞÄQDdRJôÞGRJá­ B8RJ&¥äŽã8î,$*¥$ÅbÑB "Ún=øˆ[ÕÚ?L3 (ûÛßþ–¼páB»®ë9MÓìh4Z^½zuF×u8pà@‡eYû¯ I½JÜß|óÍg:¤yµÿÀ(•ù”¥Óéüxጂ”R2Ƽ›=ѧ…TÈÞ[f ^m¾rù@D½.зVø+yA™”²ªÌ«ýûe¹\Nëíí]ªëºe†ÇÍžžž|WW—ðÐC­L§Ó¯Z”rµÞøØ±c;vìøk.—SÜph’©Ÿ0úe¥Rɶm›»¥Sé ¿r§R¼O)•G—¸UàýÍ{oJ)!„Tx‚ÿüŒ¦_ FE&„ ûöí[J)•‘HÄŽF£V[[[qùòå%€ßüæ7­CCCý`×öîÝûÊ–-[Òž2=…ƒoÞ€_2Š'È2™L‘¾7‹d’2§ ˜oð~÷ÿýÖ€RJÁøÔ›—èSÞ¤‘ !³‚2¿UrðàÁÎR©u•o¦R)sùòåyÎ9)—Ël÷î݉l6{újêèªeöíÛ·yÏž=ä @PU–Éd ÞèBH×dW”íÁ† }ŸbüVšzÀòéÅAL' ò‡øÐÐP›®ëV$±­+Vd¢Ñ(üøÇ?¾~hhè/W=Quµ?````ô…^ØqæÌß›E9Éß|w¨Œs.ŠÅ¢I)¥B$ïµ)A"³Ò¬¸<Äb*Ê šú+‘¹¥··w‰ªª<ÚñxÜ^´hQ.•J €'žxbáÙ³g^ ÖÍpäÈ‘ÃÛ·o?nÛ6õÏ †€®Â«ÊÓét‘RJ|SÊ‚J¬ÎLßóÛ0‘×Mp#$Hô¼ttàC®ˆøe‡^FíH$bµ··ç»ººL—ñ7ìÙ³'[,/]“TõµJ™¾ôÒK›·lÙ’ž*柉,“É”3ûnTà¥x‰…Lòã¾÷žóG»_véÒ¥øàà`«ªª<‰X‰DÂZ²dI–1†BòÓŸþtQ__ߟ®i±êZ~ØÉ“'Gvîܹùĉdª˜:ÙÈÈHÑ]9$CSõÑÕUÓáÞ¨wý¾§@¬ó_IÀ4MåwÞY¤ë:7 Ã2 Ã^¸pa.JBY¿~}ÇÑ£G÷»™ÅkÖ¸ÆíÕW_=nÆÎ¶¶¶¿onnöŒ*1¿·4Ì?­ÜŸ9,•JV©T²#‘ˆî8ŽT…úGePÉÕ\A`OŠ\3^Éçñ2‚•¾K'Èz{{BÐ0 K×uÞÒÒRH&“6ÀîÝ»“{÷î}'ŸÏ_¾æåêÙ(¡îÚµë¥-[¶¼)„ a ¢dÐ$ÙØØXÇ×UKo ¹wùF|U _‚)éIñ}˜,`ˆkùÚËå²áš~ÞÐÐPîèè(œ={ÖØ¾}{qpp°o6t1k“3·oßþ¶nÝz©ZÌHM’¥Óé’”9çÂ[Dêá#¨è ¦™Ž6Á%¸.à}Çücccñ‘‘‘f]×¹®ëv4µº»»sŒ1ò«_ý*Þ××·g¶ôÀ`örÎߌÅbŸZ´h‘A¡î÷a.0§÷dÞ뤔Ô0 M×uEQJÞóÄçÏÔŽ>¾éíH‚ !¥Ë/{¼™ŽãØîÿI·¶!a|ò”2Î9íëëëbŒqMÓʆa˜]]]c†aØ„|ì±Çšÿüç??{-âý¹6 …¹… ~jÁ‚Š«\OéÔ]l:Aæ{¤ˆH BQ…úH\5LÈBúr8>˜¥)„p8ç¶eY%!„ã¤_?T†ˆøöÛo/BOù­­­éÆÆÆ2àöíÛ_yå•?•J¥ìlê@Ynýë_ßnnnÞÖÜÜümmmB "¨ å\.g9Ž#@êºîwÄ} s~—à$˜w¨–ðçÂêü.\X`Y–®ëzQÓ4ÇËMMM¦”’¼ñƉݻw¹8Û÷ŸÁh§N:M)m¾é¦›–¸Œž,A¨ªªªb†âÎ Z',Nõ¢ o®"zn@!çÜ.—ËE)¥pW?£kæ½Ð T–Ëå"ƒƒƒ-Š¢XªªZÑh´´páÂ4!DŒŒŒ(ëׯ¿tìØ±sáÞÏ ¼õÖ[o!V­]»v"RBˆßï³0 ŽãÆÆF¨ ˆé!% o‚ˆßTÌ¿”…\a …—¨J7:~EÆ9§gΜédŒ9ªªZº®—ÛÚÚÒš¦qÛ¶ÉÏþsûÀ/Ì•û>§–hmÞ¼ù_vìØÑLüê"˲¸iš‚s.‚‘@Hx +1,qéÒ¥ŸN&“j€Tx'“RMÓTEQ˜®ë4ûûG¿·©oÄWò¾ú‚tÇ6MÓ¶,ËœIÌ?00ÐBUU[Ó4³¥¥%£(ŠsäÈõ™gžyùäÉ“gæâ½ž“8þüEQ Ë–-»%‰„%ƒ&BD$ÑhTUU•ùÝ@H=¥B¼Gé”RJÛ¶¹mÛ¦mÛ¦´c~ÀË—/7𦩩ªj«ªj555e5M³úûûÕ'Ÿ|òбcÇŽÌÕûŸÚ¶­1ƬH$RN$…]»vÉgŸ}öÉS§N]¬¥{ZSèïï/pÎuttÜÙÒÒÒÌ""QÆU…zÇÌø¢ð€ŸÏÿ j$¿ÿ‘!cè,Ç!‹Q årY–J%V,E¹\V¼)àRJ!¥TlÛ.sΉ¢(4"cLjš&Ü„ÔPÍ·h½-^ãñ8¨ªJ(¥Ô¶m´, 8çhYZ–%-Ëòæ8œs›1ÆcBUU ¥”ÕP#Í¡·¾_QÐ4­²·/c -ËEQPUU©ëºäœKEQ„eYÞdÑʬoƘV@Yð­ð¹‡ÊÆÎÞfÓî±´àÛ.nÒB0OǨ,úîØ".LVu/€:j·˜ Û64Œ@V]T@ EàÛTbª6ý‹Iƒ›AùwcŒÕP+Íq8˜Ú¿Å S¾?A¿? Ìçóû<…˩܀_á![¿‘ù~Ìݼ€{ ÄLϦ› 0ŸA0oàÅÿà›:! ³Á½‡ê¨Œ¦ÉLâ]Æë ÖÌ`/˜©”Õˆ ? ¨ ö"OÿWl@BF}ÝÔýßà±òtªs„¦ ýGÒ„OTÀÜ%€Þön“¶›A`×𪼠€Ú²a§Ž„)¦PxÔªþ½<@ÈF‘Sf§Š ꨡHЭ眨(9Dù¡§|Õ-@íF3Î^A} €Š&m*j*BÎ òçÈ•œJU@ÍYRÏÌÓæq?œj^@XèVç5Ø8禅Á{D¦Ì@•“>먭ÑOü`&3‚ªUÈb5‚0P¥60e > Æc ÝbÐPø¤<@HV°ò:Î9« FšÿìÁ)F}èh¯V ( z5Ôüy€©8€?Lùóõj` 5D$ã{<“I³‚Ô_EVj•.L>x²¬š¨G5ƼÝÀÂþ6UðQ ç=–„§ CAPçµ €ika#»ž˜ÍqœÊÞÀP½XUùasE‘uÔX$à ”UX‰IDATáýÎöú±X̪ ó¾¢gâ‚¥àùÎ_H)AJI¼tpØ&~…Ï`upÔ  @)儽áà´y¿¬>#¨ÆZp]À4`ÊZ@= ¨Q7PåÀè ,ÌÒ×÷˜Q€ÿ´qOùÓeëëæ_8ÝêàIþ¾ÊZ:j- ˜nèt[ÆÔ£€|&ÒÄ8ÂòèÓ}ÝÔZs«þ%âÕ^3´uÔšR¢¢(Xm‡*¤qR&Гի5ÔE‘ît®Š˜j~àt«ƒëy€Ú$‚a1¿Sz‡ ÿ«Ïª=+(áNbüõµó€¸~;lŸÀIæ¿ÊÎàõ( V£! KýVùAY}ŸÀÚÏ€ªªÞ©!a[Á€ŸéK))"2)%•R*îsêb¾FóñÄšË墱XŒÙ¶­BT)%CD2åË#…DJI…ÌqÕqéN(¥Žãç\‹EÃ0õcãfêû,–ç«ià9€$$=:´fÍš²ã8"ªŽã(nœ?ÕDPâZ*„PÇ¡ˆÈ,Ë ìܹ³V@ƽÐwI÷ò?ŸÊõ̹;W¾Kåôƒý0Ä=@J×õÎÕ«Wº««kÁ 7ÜкzõêæîîîHCCƒÆ#¶mÎ9Ú¶-³Ù¬H§Óv.—s†††òÙl6[¼xñbþäÉ“.\8ì*=í@¡ d™w Ÿü# ¢èàó™^ WùîcƒÛÂÔsÿ!d´úÉc ²sŸuÍ* žé%Bžã|va#œM!›ª_ 0½8ØPv_Ý÷=ªß?}Ì€¢û¶ûžÞûkî½›N¡3í‹Ù²Ê,)¦Õþ6ÕëK®²,w”– âZÃUžê{Žé^e÷ÿ îÅÝÏÐCÈ|ï#Ýßìý-Ø>ÿpB.ëZ€àZ ¸eÛt—w«ýmºÑ‹®™Îù¢ú”¯ú@>åpxȨžj¤‹ ûÞ3ýý׌@Θ©‰¿¼€Ty„@Ä0ˆ00 «¼÷ëï§s ™(€LAÉ4 *™„„…S)~:„°Ñ<ë÷Ë«?œMÌÕ𔄀 ZüïW>„(~*_;•»‚ À&½p¶]kx?¿Ì %Q@¯¨Ö¯Ùöÿ¹™>·Ïžc–IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/speaker.png000066400000000000000000000344441323166163100232010ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ IDATxœí½w˜dWyçÿ97T®®ÎÝ3Ý“g4Êi„ I£€D`06²¼k[6¬ÆáŽòÚwm¯÷Yl,¯Ãb0`lËFƒ¤APBaF£Éyz:‡êêÊ÷Þs~Ü\]=eaúçÎU]u¾ßó}ßsÎ{NÁ²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²ýP˜x#ÿ¸:|]ÍN3³0#Þ²Óz#?Ë«½êP ѽæ,v1B­U¨ÕB©U(µZ¡€¨<( ¼Mª¨P‚Ó &L(ÅÈiÝÑFkÈG;×>qôÕþÜ?¬öŠ  Ô‡u{¬ô6‰ý.¡¸L u)J@Rî3Èx×Âså_<­{Pþ=¡1­”:"”:‚PÇ0Ø•žvîíª¼ÒïóÃf/‹JÝ®ÙcÝ ’¨÷ ¥úBP] cÀ¶€{& +!M›û‘ã4¤RPr¯ÀyÞ–Ú?6¾pèå|¿&{IP£ïÍX¢ñ1”úP›T¬6Ÿø%h ºò./¡j1Tì¹È= ©ê¤Ròy…õ’¿Ío<<ùR¾ïƒ”ºÚ°ÆŸõ{ ºU Dù_ ô¥ou‘g‚Ã6$ˆ)Pvä)òók?v&ßý?»½(šã7½)ïy±ŠØZë—^)JeÁ¡Ã03§˜Ÿw(–4êŽ#lÛB…n†N"i`è:é´A>¯ÓÙ¡Ñ]PtwÙôt6AÈÈ'l¿•,mLÙ(iŸTØ;må|¾{Óè7ΰ¼þÓÙi `Ýø«JÉ?¥/-÷‹<üX““#%æ‹ÓXY„PB€¦Ƕ¥®GîiZ‚T¦\®“®Î ½ÝÃ+l†ª^€µ!%- yBIëqeñ¿ ç?ñr òÕÚ@©­¦5Ö{ÈŸYTë•l â$ (–ÿ~OC‡Æ©—Ç xžn¢›]Fš‘GÓ 4-‰Ð\`6¨B8(UUG9sHYBgI¢hF–\nˆÞžC+4Ö¯®Ð‘k¼„"PHÙTJÖ))r çöž³'_Yñ¾ùm”BXc7| ä­‹Á_\ë'¦ÿ|W‰#"T#GOt‘H­ÁL­ÂL­"‘BÓ³!ÜMhB‹ !Ð4 ]Ó½cšp{ìŽ3‡´§ö8Žu ÛEÙc(ÕhA:3L_?kÖl^[$™´—úÚ‘W P)« ©Ï+Äçº6Ï|ñ•õ›Ó•„5výï*¥~¿Uò•òý® HñµoÔyðÁ¼Z F¢—dîRù 0SCq€OºwMÓ4tCG×Ý͈놎¦i@ ¥J)¤ãШP¯À®¦Ù8„U?ŠRvì{ aëXÃÐP/ço®1Ø[>ƒ"HYÇq*§4ä·5!?ݱyaú—ú›Èb°F¯¿ÁQê^AìÖ(¾Z“üéÿ™`jìˆ |r˜d畤²›1 Í«Á‹3aÍfI¥R†i˜è††t¡#4’ ¡¹N)žËš 4¡¡kš®c蚦¡iÛqpl‡f£Jy~•Ò³Ô«»hÔö{¾>´Tf%C+‡8{ƒÃºá9¿ƒ©¥dÂs¥¤]©IÕ|ZÁôœSº÷Õã°à*õa}áèø‰dÒ\ÙVò=__®(~ïŽR«Œ£y…Id6¢ë†n`ºn€çó9zû{èêꤣ#‡a˜4­&Õj «acY–e GJ4¡a Ãн÷sÀÐ4Є÷ÑÜXÄU7Ðu]ÓÑt ]×P µêsS;Y(î¤Zz‚fc$VÉT?«V­åÂsê¬èŸ÷ %®þNŽUVŽS? Ñÿ¸ÿ¼âß¿†ø¼æ|Ë“;/ùãþÁÎ߈K~¼æ+¿}û)f§N %7`®C7r† ¾î ™L³~Ãj†W­ ›É23;Ëìì<óÅy*å¶m/é|°u] ȤëZHÃÀ4t ÓÄôÈ¡éšçÐ4á©‚û:MhºŽt$µZ™©}Lí \|”ze?ÑÖB6¿–õëØrN‘Ž|-VL"(.wïØ»~BIþ¶ç‚Ò‰P:`LÜ~;Ú/|ä­•|G:Fù>ðîwRH¾üOe}h7$/FË]áÖxÝpÛïºA:“æ¼óÏaã¦õ”Ê=z’‰±©8àK¸?Ð5èˆïwãÍ#ƒBwÝ@H MÓ— „»wßÓ}½¦¹$C@µRcvæc'îenz;õò¾°`„A_ÿ9\x^’Íë&ü‹A±EU±4›åI qgÏ¥O A<y›øÞWûçò«Îýïí$ß?¯V%¿þéç±µ5ˆô•è~-]5<ÄU×¼J¹Ê »÷3=5{zÀOC7øóÞ»%0Ôuï\ `èºKM H ë" ‚𚌡[1 ÝU<µ¨VªŒ¼ÀÉcwSœùV}4(¤tfˆ³6 ³õ¼iÒéf¤ôQ28v«±0«Ðþªÿ¢Òo¿~0¾|J!vÞ³zò‚‹×õº`˘äû*ð¥Zà‘GƱÒïÅÐð†apée[Ùú–-<½sû÷BÓÜBnx4ê_êz´æ1Ðã.Á]ó\FèÿuOþ5÷\Óš×Ò ”B—h¦ibFÄ@i¾Ìñ£sòÈ¿°0ó]¤rA×µ+WË—Ôéë.ùEèíB2ØÍ:FyRóO¶ÿìõõ¥˜øòñöËÞqöë×÷³ü0øÕÏg®¶Ì1ÙßzéÞzÅåÜs÷·˜›™®ë^t~ºÚ¿|ßmº÷^-$0t¯ækAÍ×"ÏøàûDÉà=«i@ØU-„À0  —ØA«Âv9ÂÁ=_ezìë4}Uýçqé%‚µ+f %6ðÉ`5ªØêˆÔÌß]±åÍ,jÞ•Í&‰ƒ/cà;ޤ\ѱE}{Ûºõ«yÇ•oãž»¿ÅäÄtÐ6÷7À %*p'׃{ÑÁ$Jz-é¶ ¤ò7…Tî5¤BJ÷÷c{ÇÒÿûDŽýs‰ôÞÏUƒD"‰i&¨×ëÔj5¬f)%¦i°výfnxßïsó~—s·~–\çå€brüy¾ù»øÊײì;2à–ÒÿR $f2Mª£gØÐÄÿ}2»gò™Î-¯ ª/Á4à­FBkßïrŸ°iÈ1p5McÛõWóð÷eôÔXxOº ÅHK¹%мR2V*”” ð€t[+R…À†Û{½O)²¸ŸÑ}R¡$“)t]DzmªÕ*µZÇv@AWW'W¼ó'¸åÇîâÒwþ3½7€0(Îà;îäËwå8|¼V"¥Hfò"ÓÑuŽ-íÇÇžÌÞ=úÔÊÌëï‹›lÂòƒïON;4Õ@Øû¦—\rR*žyzWP2¢î¦^ðÈ}W’ TÀß¿æz Kéà(éÕhÜSÁ5ÿº •Ã'¦wÏïð9—4š¦‘0$IjõÕj•f³‰tRé$]²÷ôË\uÓ·è]ñ!4-Åüܾ½ýY¾úïNŒvzÍhŸMä ݉d6ÿ^)çGÇŸ*|æõz)Ó€Çv#ÿ<ú4 °)|%ˆÕRGzÀ»òï“#PÇ @ô_Öðˆz8Q°# ûÏ8!1ï=5Mb³Ù¤R©P¯7pM6l:÷|ø¯xû ÿA×ÀûèLŽïæÎ¯çþ‡‡h4´EP¤s9ò]ÝëlUúÔã¹?qLªå…*!øÞ @“t4Ö¨•+™›c¾XôjW¼öGÝ”ž œlßbîsŽãxà*鸛ŠÖp'׉ž{à)é±Á5} |p¿•-çÁ²,Êå µZÛ¶Ñ4M›/âÝ?ò¹ìš'ßu5R58xàI¾ø/UvîîÀUV]×(ôõ&dâ?œ>qrg×…¯'øà`vf²ß‰ „d ¯€’Íf©T«Aí÷ýn)¢÷é$1ZÈ„N ÇÚ ¶Pœ VpkqÔ58 n,€݉œ;Ž÷þ¡Ç%‚i&0M˲XXX V«á8š¦±ùÜ·pãþž³/¾ƒdöl¬æ ?ñ,_ùZÓ‹Õ ›¥ÐÛ½J6Ožx¬ãŽ×—Š#S¥6à‡@ Éù›+Aiš Z©µ?æüšßBŽ3»•¾+Ž¿ÉÀHG¢"ÇQbHljŽ%O ÚË{?é´ÄW$ÇÀ4$ &¥ÒFéH’É$[/×½ç.†6~Ýèb~n?ÿö£<ðØJlGĈ é]}½ ÃÔ>~ì{éƒGžïx} xªY·™Ÿ«.¾{¼õüJP£ëõ™LÆkfɸˆ^A.X+Ø­‰ºé„¾ß k«ã„rÁ•yÇ UÀ%ÃqÂûN té¹›ˆÂDŸ“Òz–©TÃ0¨T+”JX–K„|!ÏÛ¯þy.»ö_éè}7J6Ù·w'ÿp'œ+ÄÕE®³ƒ\wa£˜™?|â±ÂG^s(x`ld~IðArÞæ*é´…’Šéé:»:=¿o~EÛà1‚DTàt@ŸNlÒüÚéÕH' …{Ýq\×áƒ\ó" ¶ÓºÉðØvKï¾í]·mWþÓ© Ai~…rÛ²PJ14¼ž«®ÿ3ÖŸÿ$’ë¨UNqÏ·±ýÑa\1 cƒDÒ¤kEV:öWŽ=’û¥Ð^3Ðä{€sìàŒ´†.Ùö¶9¤”ŒŽ‘ÍfH&“¡5§¢*Ðrm pµ ­:„ÀÈ0( Žƒ>ï_s|"$Šøü¨ô·¾Î«ù®„Dð7) Ó$“IãØ6Åâ<µZ )%fÂà‹oäÒk¾BWÿOŠûžäËw¥™šKGZ` MƒîÁÝL&>|dGúØ¡çrý¯ô»vÐøà6nl6UÝ=iræ"ðýqå@ƒo=Øe;\xÑ”Ëe&&&Ýa×–¾þpÎïósþ„´û÷b=ïf…‡Þ<Ãø+£ÝõÑ[ŠØ¿ €ÍRåõ7(éî‰^ó[@*¸g&A¹\¡Ñh ëét†¡·â¨s¨,ì¡^=ÊÞý „¹Š}e7Áųd:‰n…Útõã¿õ‰Âƒÿëïjñl–Wh:À·p‹eI†×v´¥È¦NŽ™œK“ÍfY»v /¼°7¾&‘¡ÝöjØbÒˆ–{*HqË"A¦oþ±ŠÀCP x‚JÜßäÒ÷4MÃ4Mš¥…@ éî Yoß:2…k(—+Ô«»95Á©É l\WC×dð}Œ„A*“NÌÎÌìWoËM~öó¯JâàÆ«Øojü·r¹™Z1”#•Öhß-ÉúÕU©©"·¼ÿ½<ùē؎«å­5Ÿ`<>BÁ™m!¢m“yCõPñ<>ÐVD?¯Ë»/|b¨ð­ç‚þ¼€×¿S– ¦i"„F©4O­^Ã4L2Ù,=}—S·†©–ža~î{v³f•I&eßG34rù¬^.–oþäI­ú욯ÊdàžXØÆŠËË M֬Ϸ¥Èf,Kñì Ö¯_O:“áĉ“/ZãÃpøLþùd o—Ìü/bÆnÇäÝO ^$B¿øà¢Ü.h?†‰t€U„–û~¤¦é$“Ijõ:Åù¢—éì&´t÷n@—RY8L­²ŸÝû%Ý]}ôtÕƒï#4A¶#+ªåê%¿ô±Ä•þÅæ?¼2ø £K]ò€59^e|´B;ðÝÒ“¼ïú :;ê<ôÐÃ\ñ¶ËÝBkðIé÷¼9‹¯GÂÙÚ¶›¶íc¶ƒíØA¤n;v0Ú­Q¾íov,Ê·½ˆÞŽFÿv¸Ù-­ÿ9Û¶ÝmÑû;‘ÕF*EG¾@:fb|‚âìŽttÕÚÍl¼àíú ¶Uâ›ß>Ì#OõåŽR }C½hº¶íà™§^i A÷îzÙlcÅeóÅë6äb1øJ) C24Påî{áÜóÎ!™H2rêT[ù]ƒ%xiŸ}Q°­ä¤r‡7i=ŒÖv9)_T\|éuD\€l „CÓîÞ4MLÓdzzŠjµJ:•BéTŠ\áBêÍ^j匜:Åtq›7TÃï& ›ÏЬ[+Ç÷‹~üÓö_ßqÎK*LÏôèÉ®â)4~®^s’š&èéO.ß?^ÑW§TÑxè± ?ú‘±óɧ±l;âëÛìip³sNçûÛØR-Ÿ+Pá+¢Ÿò"²!¸¸ …7*(¼A.þ"‘°Œ\_4béÄ-KMhd2YæKóÌÎÌJ¦Ü”8à _X¥Î¢Q~ŽÉ‰£æü³±ÖL&—Ʊe=ÉOÿÞOwýÍŸ~±IX<3‹àk;¨¼Šk§'¬N‘Ji´‚ïÔy›æÙñ¨A*3Ìú ëÙ·o›à¯„¹ü@Ûxàň "µ!z-pÑZ‹|_îƒN¤vljРx4G;=bx5?W-½ -dñÇK²™F±±QI·GQ¹|?JßBma/ÅÙƒ86Äç4Ñ|á‚t6…c;ùR½úÿ´}ÇKU½õÂ-Wñ„|P)úf¦¬Û K©e”P×$çl,ò¥;«Üxã{˜žžfffÖK‰s0c*à·Ç½À.T…ÅMÃ3%B[‹mÞ‹]N¨€Á^…÷Ü"áwK;‹y‡CÌáq{¥ð¯‡hŠTÚM:9rÓ01L!élÊÜB£r”ù¹=ì;4ÀçÚè>r š »àL‹|îKö¿ÿû±†îim¾¾ûƒÛxŭפ&mEÿŠDPZ*BPä³M†gø×{úаë¹çi6›1 ÝòŽE |ÿvûþv5½ì¥,¬¹!xÁK”Ûß­ý2RËÝGZü»4Á³Q Û‘"žqäI8W3I$ÜÚâäQ4]'™H¡P¤SY0/¤YŸfaîYöêcËùŽ«ž²frêÕFÏä!㽟û’õ7§‡=´EøÚŒÞr :põÌŒE.— Ð)ïg» ôÔ°c:±–Ë.»”]»žw1[2ø‹ª±gÛÙR>?ìä9½)ézDÚù¾Djy«ìû*!’/ó‹À'rKS‹f)yàG”ÀOqó_cš ’É4ÇŽAJI:•A)H$’(ý,«DiîiödËù6šW†A¶#Ce¾ºâ?‘xÛ_~©ùå/™%póóˆ^æf¥X95Ѥ«;A6Ç"ðýãõ«æy~÷݃×10ÐÏ¡C‡ÛÖtŸ‚q2ÀéIðr:}ÿ‰ Tô­ À À_¤2æïcß"ý~ÖRÔuøAa7áþ(§išd39Ž?L£Ñ$—sûeIôMXV‰ùé§9t|˜‹/hý_A¶anr~ç~6—þ‹/6¶¿Xñ,I€{îA¾ÿjîS‚[m[eççlz{ ’ibàGÓÇÏß4ÎŽ‡NpÎımÆÆÆ)@hDBIòrÍq*wH¶Z«P©Vi4H¥Ð„ÑKŸ¸¸ ËÖ / x^| "ñþy,3*žM> “Uüg7Ï¡%ŸQ×uòÙOW¡‹ŽŽ<šÐÑt¯wR‹ì5&ô0¨õ涺2´´Aïå˜;ÙÐýx1ŠŸ”ª”¢\Y`×óÏ0<´šÁÁ!ЦeQ*-°0ñEêå§xÇÛ/àšŵךZ¥Éè‘Éf¾»óü ïœ:¸ÔgXR|»û»»åÜTZ4k6…‚A2É"ðA!œ·ñ<ÔäÊ«?ÊØØóó󱈟˜ "a´¨Áé R)ÅÈ臎¢Z«!„æ¥j%‚”-Ãëp1 w B£Ñl0??ÏØøcãã4õà¿ Gд“aÍ—„µ:ê¤ 3“T«ß—¡*´ —K%QN˜œêÏ]“WtÝ$—ÍóÂÞ]¤’)R© þ “fžC£v˜c‡ÑÛ¿‚þžFPA̤@è ÅòÝñöŸ-Õ2xQx$xâ}×dÏBYçʆlV#™Ž»€èñÙkwñøÓo¿òÇ852B©´}A!J„6$p‰°4 Žœ`vn&ÈãO$ÁLŸèæƒof >š7mÌ‘ÅR‘“#'˜ž™&aš¤Ó©62OÌ×Ç\/ÿ-{ß÷;^>£rÂXÀMJ‰^ Ü4·h³aš$Ì$Ïï~†®Î—¨(”˜©ó¨—Ÿgï¾Y¶\˜%•^Ë@Î¥(ÍT²Åãé³>÷¥Æ¿½lüd¿õõÊÀª[…,uÏÎI Í •ÔIe/ŠŽÁÃpÓÐS<·ÇáÒ+>ÊÈÈ¥……°Ukú‰ 9³ˆ -$ð[åÊS˜ ü$¦™Œ á©€ÀwEFÄåh¬×ê5Nž:ɨĉD’L:Ôúö:ñv}Ø´ AÓÑU0^âçÆ’ic1€Ÿ«¨‚y©téH^Øû<ƒƒ+ƒÀÙ‘fú,*s±ÿHoÝjÈ2Lžœ=ÿSŸèøÞç¾P?ö² pçÔ7}ì.äì/krV›š¶I˜iL#A:Ó À÷‚ç ú^·âY®rÑecfzŠÙ¹¹ðFäÞgM«„}ºß*`jz é5ÂÍMÐLxà'¦×çnÄf3^ŒáO‘ ªA½^ãÄÈqŠóstvt¡k:a¢klQ)ãòïNl8ËIÅ¿X£Š?ÉÌç LNM0rêƒ+‘~¿†Ha˜ƒÌN<@Ý^ͦuõ B醎nbaºü_üç·öž1¾µý‰Ò57}Â1œ× YdbªAÂÌ ‘'“u×iöÁôª2Ô»›Ññξ২T*LMNµõùDÏB„®+Ì/”0 3?™Là' ¦ÙVüÙÆÁ" z¥Ò<‡Ä4tä ‘–A(ïߎ‡>=J†0c9®Ñþ€03Ù}}Ùì¸äêêìeß°m‡ÎBWcèfÒ±9vè9Î=·›\Ö ¾O*›¤4[IµôúÏ}©q×Ë&ÀÏÞö NUÞmXGW Ybjªî. ÅéL!"‘­¯@a?Õùçè^ñ“˜‰£§FÃŽÚ,R–s î¥X% RÉ$ÉD‚dÂÝ'"›ix0½-‚ÚïeæDc !Â~ï 8¶ÃÉS'¨TÊ ô Äw¢ ¯ÑXÀQÉøjQíŽNT‰‚¼‡÷:€\&Ï“;cÅàJL3ôgéuÔvqä¸é¹¿ÿDÌ$™<9{þ/ýZß_ÿÕßU‚UÕ_2î¼óNµmÛuXÉ-ÿUsF Í™cf¶ŽBa›H¤*èZ3¾¯ Ù12âÛ4µ÷1´j'ŽÇ‘Ò<¤DPàUl¯]7Hú àžL&½k‘À[ˆ47ƒÜÄ ?"$B<ïÀajfŠS£'Xµr º®‡B*ZëCb¸5?2]MEÁM28NØ-ì]w"q€¯ ~™ô•ÀÛ› ÌD"¦±Ú¡UkÓ.ÚMÍbZX(qjl„ ë6¹¯÷ÞÓm‹­YQh·´û™Â@jÑ=¯@×u^Ø»‹õë6¹â5UÍÔ*JÓ’íèeÕÊPtC§QkЦeÇ?6ÿ^Þñö+¿e$Œw;æÙƒš}ŒzÍâÄñ1W £8]ŸCµEî@)è-"É#¤:?L¾£Ÿñ±Q×ϵ,ú,‚–@—{]d3YÉD\ ’¡[0½åäü&`üùLŠÖxïÆu%Ý À÷çs4ÏIDAT!Ì—ŠXv“•+†Ï¸¬|…ˆâtçgB„B¡‹ÃG÷c…B—«`R↠IN=ÎUo#ÒĦÉÔ©¹áßú…5òÙ/íWD€;vXÛ®½þ^¡q«4×g•Þ‡ÖØ”6GŽR($H¤ß ]›Šï«BÊœgEînê«Y»q“Ôë~"¤ZbïT†I.›óÀO‘H$I%#͈ j~ÔßËXÔ›$£y}î6:vŠ•ƒÃd³¹Ó–Q ø5P¡$Æ> b{ï;ì?¸‡ ëΊ¹¡÷Qšz„Mótv:A³ÛLšÌM–5 ™üË/×ïEøÎw¾S¼nÛ ÷!Ô+c %“g¡5€lpjdšzc–þÁ·£X…ÆÐŒ»ÅPדèòyò½Di¦§¦ZZíIÐl4Èfrärù@Ü–A*ˆLÓ jõG{ú"¾Ø‘ógþħ‹Ùaò¨m3_*²qÃYñ å_;à[A޽ÔñRDÈç:xaÏsôv÷‘L&#¤ucòB‰-ç[±¾… R¬žõ×ÿlÿé+&ÀöíÛ'n¸þºG|-o:© Ö „3O±¸À©‘£ ­> -ñ4,ã‹‚C¥ —žf¨óšrCkÞÉÌÌ,z-ò—»”¢\)Ñ‘ï Ÿï éŸðš…~SP÷š~~a†r™pÚRããÀGÀ÷΋ÅYÖ­ÙH*™:#ÿïM‡×ÚÖþ‰ÜäTEq~–jµBoOD„ÞÉìÄ3\ûN!€À0uÆNÌfç—:?ûªàþû¿sâ†ë¯Û¥àCˆ¤.S#h"ìõ÷í£#¯èè¹ô FPª¶È%€b¨ë)Òú.2]ïÇLt033©qÀ‹Ö‹ÅYr¹<]]ø~Ph&šî- 4Óâ“@e,ÝÛ¶í ì€ 6¶m‘Ëåƒþ³ÖZßîZÛÚy&ÞrÉzäØ!Ö¬^¸.÷A£6ÊÛ/sH˜2èv×Mƒ™±F*1ñªàþû¿sືíDñ„fªä&”9„hBÉ&'OŒ23}áµ[02ÛJ¡ì“¡¬EÅlrŽá®{@è[q ÕZƒry!(6ó I*ÅôÌJIV®$™tcT*̉N'Õno>íø¹ý¶7?ÀÛ î;Žå½Æ%@G¾Àª¡5§-—v ýŒ”À‹Q‚éíÒ›¼ê5'¦Éž½Ï³zÕ"B÷û­è›eh…ŒƒµJÙT¹W•Ûï{àÐu7^û0J|HaôBú"°GÁ.²Pª°÷…gèíMQ軑<ì1¤Sô¾,12ôå÷0XØÆºû.d®8G³Ù6øÏ•õÙ¹Y¦g¦è$ŸË“0hºømÛ±±lÛ›üÜn·YÁ±[±û+Z±jQ9¼Xð¢-‚ ‡1|ØOàn !8vü0=Ý=$ɘP¤)dŽrîf'X ‡ÊB#óª`û}¿áúm÷)ø EKBz BèÐ8Ž’Gdnæ «×]L²ã=h‰!dãJÆ›ŒJ®Y¬ìzŒÎÌs˜Ù«IeVPœ›Å‘N$’ôÕ@Q®T8px?ŽíÐ×ß’ Ëv·,Ë;¶"çÞfùϸ÷£@[¶m¹×¬Î;ûB Kg†€ÇóZgTÅW?qb®`|bŒT*C6“ §®K‰”‚áÁ Îß춬|7`;Šùɲùšàþû»áúkîRˆë€>„€ä:HŸ Íp(çxþ™‡éÈ7麎DÇ»@8Ã(å,ê;H'J¬î~€\ršŽþëÐ<¥ù¢Û^<èÐŽ²ïÀ¤T䳨ŽMÓ²°,‹¦Õ `YØ–!‚¹éí£×\ð³Ù<—o½Úu-aA¯^d !ìõ“‹à´¢eŸ$c㣤S)²Ù\ÌHépöºYÎÞèÎLöUÀ±%3%í5#€K‚ç®ÛvÃW„[@l@Ï!r[A˜(O Ž>Ä‘ý°jõ}ï%U¸iÏâ4N,r JAGfŒá·I' ½W‚–¦4_ôúî šx h4œÀ‘=ßbåÐ=+o¢sÕO‘¸ ÇZ Y>ë^õß*aTYYxš5ÝÛIŠ\çdsƒ4š U–|Qáøüè¸|XkÃ<?écx*^»• ¯· cñ@+ø‘k‘€p||)%‹–ºÛ¸ºÈGo9tGó*ÇŽÉfÓÿç5'À5×^s-¨›ü‚L¥S¤¼uùŸßµ›±‰ f‚\ÎUƒ >0ûÙK@+@s%Ìgyò‘opxïÝôõå麮á[éú(J9ÔK/àÿ>`¤G¢'{œ5];èëxžDj-=›0YšÍ&ÍF#^û#côA6O›}«dG·v÷Ú{6PvàG¤ß#C±8ÇÌì4+‡BÄÀO&šüÆÏí¥#ïDàª@¥Ô¤8]•uÖÞóÚ+À¶k.WJÝä‚4ê zz{èì*pøÐaJ¥¦§¦)-”è,tº“7ðûÁ"1ˆÈnEèiTs%-Šs3<õè=<ÿä—éîÔè]ù6òýï¢{õÇÐŒ,õò!+òË 2¤Œ2+ O³®ç;äÒs¤3ëèìYO"™¡i5h4ê*Äð;i|7à·<z›V@~‹[h¶W……ÓÓSôõ `¦¸àkÂâ×oÛϦµÕX÷¯¯ãÇKØÊx|øÝÖß¾æ¸úÚkV¡ÔúÁW³Ù$“I“H$éííe÷îŽCµRelt €|GÍûyX„æ"w1ˆ$Ø“(iQ^(ñôã÷òä÷þŽ\¦JßÊ-äz®¤{õÇHu\€´+4k'ƒ…óÂŽÎô8«ºg}Ïv’f‰Tf5Ý”ãxs Ø‚áìŸH.à-7Fp"¨@þ#«–·„/B˶(ç(—ËtºH˜fd[‡LªÁ¯Ý¶-çzã&‘Q@4ª6# è…ŽËþæËÕòkO€«®n Ô/û=d ¨,”ééí!“vŸ8~ì8nNœÃìÌ,ãS¤Ó)2YwÑ„:$†=×k%ëÔë5v?û0ßÿw`£»§—|Ï¥t ÜHað4½ƒf}ÇZˆâ˜ºsc¬í}‚ýÛɧf1Ó+éîÝ@gÁm[;ŽÛ_ÊüDM›V€jC†X+ šqtšÖ@ ýŽC­V£²°€TŠ|.Ìlòkþ›gø½_ÚǺUµðþ^Ç÷ÏrbÂøÞu·–þ¢]Y¼&vûïÿÎ1©ÔšhÐ50Ð.÷|ã›9rÄ[TJ ›ìíëcÓÆ d²™ÅÁ˜_`•}8¥'PÖ$Ñaå›Ïæ×~ˆÕ›n@h ”lRž}œÒØP™{ åø‘1á>:+ÉÛæ«ÝžØÊtù\šÎ ¦¤\)S­U¨U+ÁÀT[ó{&+/F {ÃãÅ›;2i!máå5øù JJVTø‘›Nrõå³Þ/¢i¸Eݽ+ý'*±œÛÿ¶ÙõÈ#,x_õµ·ß»ýwþ‡TòÓщ6¬#Î`YwýÛ×=u*Bw¯k+V¬`ýúu$SÉ ‹hJ)dí²ü ²~4(h¥ “ÍðÎwnã‚­ï&[Ø€’޽@uö Ê3S›¼ßŒ‘ãÈõÉâJŽLla¶ºž¦Ý¦g©7êT«ejµÍfÃë6¶ÝÃ¥ ö-šÔdýzÙ»ÑiôJáŽSØVî«„&$goœå]WŽó¶­ðQÐý™ÂÂ%ÄÜdƒÑ“uþô òçþý>'XAäõQ€Û?s–­´½J)-:Þ0 6lX®4ê ¾q÷78é-:þæ ;{ÇÐu†‡‡Y»n ¦i.M«„ªìBV÷ œp¶’6nØÀeo½’5/ÇLv¡¤…´¨Ÿ¦V|’ÆÂÀŠÁS…V"øç–crt|#ã³k™«¬¤áô‚(  ·i뺎Fгh;Ž´ÝŸ¾QngŽB ”ÆíŠnÐôFýÁ­ž®Vϳõ¼.½h†BÞ&^ÛÝûpÞŒ'4榌œhò¿ÿξûkª[¢Ø¼.øíßýÌ—¥âVÕ]§ÓiÖ­[ã²Ý¶¹ïÛ÷q`ÿ &DX Ã4bõšU^\K*w@ U;„ªîF5F×à+ùçl`ë[ÞÂК‹1(§‰´ËÔö`UöaÕ#ù¶*ÐöÜ#‰7ËŒJ-ÍølÅrÅr •, µ µºÀ²MK£Þt¶BJGY¤ÌšpH¥,º;êtêt¬è¯²qÍ9«åo !ð¡ìk #u•ü嬧U…«îÛE%ŠËëF€OßþéÂf·R*'"›Í°zõª`Jô÷¾û=žyú™P b{ºÆŠƒ¬Y»†L:³¨ó&l³+”]DÕ êÁž#:¨¤!8çìÕ\tñ… ­:ÃÌ£d)›Ø ìÚ!ìÆ1¤=Ø‹ÜC;2œ a^×E /„F½¢=Ùà›ßU|÷çiGrãŽL·âòºà3¿õÿý¶Têâ5ÖÝr¹CC+Q^fÏÞ={ØñÀ¬–?¢Sº|2 ô÷±jõj …ön!:§¿9…ªDÔ£d%¦ C+{¸èµ¬Y½š|Ç +ϲ‰tj8ÍQ¤5Ž’Ó çÂ~Á^Jy⾿Y‡ÉQ›]ûÿøïM‹»í4·îØA¹&¯+n»í6³«§óûRÉKÜÞW#A&“fhxp—a-‹Ü÷í{~ N€8)ò¹,+‡†\1€®k§%‚”ÕCkGY'Àv :Ú’0tÁæ³ú8û¬• ô“NÒv­œÊ)¢ÔBÑ´2šÖDõº*‚»Ü³F££§Ž(îü¦¤\¡ŒâÓ÷?Μ&Eåu%À¯ýö¯­OK¥:Ãä _žH$Z‰¦ëø£uO>ñ$O=þ$ uZø{C7XÑÏŠÁtòíÝB )pæ qÑ< öd¬%·× s6t°vu}=YrÙ4ºn"¦ç6UEhUt½¦Y†ƒ™XLŠWƒ$V&'ÇGà»ß‡Ý{ làó¢Éí÷îdìÅðxÝ ð©_ÿÔÍÀ×”R‰h߀òšLš&$Iy‘´dnvŽÇ}”cGŽz… µˆíÕ!“I308@©Tº-â ;J”¬#¬ °Çö$šÍ6Џ ‰„`ýÚ4kW&éêÔȤ S!”ƒc[(Ùi¡&fÒD7t SC7º¡Ðt÷WØtM‚.ЄƒÐšpPBG! 5‹™ÙyÆ'Nž‚g÷À‰‘@±jJñ¯šä~ëqöœ)o~õ7>y«ãð%¥”ˆö„%…ÝÝ]BH)åчajr*$€ÁÏΟNrùýý}tuuë-¥1R8u4gÊ%ƒ=ƒPóî S$÷ÓO[‹’¤³C0<Š\V'“ÒI¥ RIÓL é&†‘pJFè¡a+ Ë8Ž Ö°)/Ô˜œ©qøÈ<‡7­Êô‚/X5þyûNæ_*o>ù©Oþ7©ä_,E© 3A__f"v:‡b×s»˜šœú |"œ‰:¤R)zz{èêì$‰Œ6+Ûªƒßq#ÐdÍ)"Ta—AVƒŒßV÷±H=Z¯ŸÉ3îþ€ìP’Ž`ǽ½¸ÌŸÎÞPüâ§~ùg•ãü_¥Ð¿ÜB¥Üß+îê숭œ111ÁÞÝ{8zÔí\DŸ‘±jUÓ4Éçóäó9òù©t m‘ Õ”D¨*È BV¼}¥š › n)ÝžÇEÍ”RªI¡š/8²þ}%9 Kö×Þû³¯fù¿áøÄ¯üâ{±å?*¥rmcòŽ5¡‘/äÉårÁ¨œ¯ ÕJ•û÷süØqJÅbH„—¡š¦‘ÏçÉdÓ¤Rnþ‚™0c]·²u„ñ•šbLi|G îÃÑ¿vçw¶m¶½Úö¦ À'>ù‰-ÒR_WJ­ Ð.½Z¡k:Ù|–l&ëö¿øíS*Î3rò$###ggAˆö8uˆîÓé”7íÜ]€Ò0MtÝ%Œ&„/¾D¨5bا”Ú¯!ö*¥=}çwžqàöjÚ›†ÿøÇ»!?¯¤zLùf—B²Ù étM®kðzo´°Z©23=ÃÜì ³s³,çQ¨—­f"…™J¡é†(lǶ-] lY¿Þ®©Z—`qº}B%J_ýêWg8í´‘×ßÞTðLüôÏßvRý‰R²C¶€¾”2˜þÚÉ"HžŒ.µ¦”²lJ%jÕ Õjz½F³^ÇrÜ!܇aè^-74#‘D7MwR…G.Ûv°l”¼{×SOÞòâ_íÍgoFð3?ó3ÃŽ’)Qïk­ù§U¥0tƒD2IÂ4šÖ’\Ñš¼qNk&Nûgýß vÛm¢"nØýÔã÷¿ÑeörìMKß~ê§ê]ŽT¦”:·Ú*C´9)†®+kÞ/,´Ï¼‰dúDâ GJlË*nÙvl‘'àá]O=qå\L/ÛÞô¸úö«¡#«oUÈßTJµH"ÍÆrQŸBküàv­zͽ€ I„þOÓ{]ÖѾ`^3´-Ï~ÿûÇÞØzùöAßn¿ývmßÁƒVð+R:—/"AK³1üE¯–¦e;Wy¶aâª#Q0'7ì~≧Þèry%öE€¨}ø£Ý"¥ü9¤üˆT²k©žÄx¬@{7±ˆDÞ•’K€'¤²?º{çÎÃot9¼Rû%€o·Ýv›99;{’òÃnRJžNú£Ê Oã&âs\â ÔI[É?èÉfÿ~ÇŽöýÝ_ û'@‹‰›Þ÷¾-šPÛ¤W*)/“J .4ž‘ôÏ+%·+Ô—tÛþ;wZoô—|5í?Ùµ7ß¼FÀ98Îy(µÞ!ýJÊ>%•©”êJÕ•’5%Õ¼RŒ*%G”b—|¦H<ùŸ¥¶/Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û²-Û.ûÿº,L®V/IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/system-search.png000066400000000000000000000144631323166163100243350ustar00rootroot00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<°IDATxÚí[ x”åµ>3óÏLfIf²Mö,²±%,a}°Š\p¹­HK\®ÚÚVm¯õÚzUÔzïÕjÕ.ŠWäi‘ÛVÄ…­²´  BBB ²¯“d’ÌšYï{¾‡ÿéÐ$¨·û´÷ËóñÏüó/ß9ç=ç¼çü?ŠP(DÿÈCIÿàC¢«<žzê©¢ëÜnwŠB¡È&  °A¯×· ïüùÏ~–®â¸ª.p÷ÝwçÍž=»¦°°P2™LŠÈÈHâa·ÛÉf³…zzz‚{÷îøòË/7ü]"ÎOII‘&Ož¬ßEد8t誻»{.vý}*Àï÷''&&*$iôÛÆÆÆ²;¤ÒØÃ‚ɵþÍÁ+V¨Ö­[wE…êtºl³ÙLðýQgLL Y,–Éc¬kætĉƒƒƒYS X¹råªY³f¹! kÕªU·Ñ(ã{ßû^*¬¿¾O@`ÔɈ_ràÀb"ŠÁ”.­±sÒ† J_}õÕ÷ß~ûís¯¿þú¿aŸêK‚ø¹n¸áû˜B™Û¶m îØ±ã¹M›6ñé›ßüæõ ¯.Z´(eÚ´iªèèh’ï‰íhq‚vïÞíïïïïJOO çWcwüóÏ?\gÍwÞ©R*•ôá‡êëë7ßÿýwQàKQÀêÕ«×ß~ûíwÍœ9S/C¹¢¢"ôÞ{ïuB3×åçç+ÆßyŽ/èØ±cÁ®®.OSSÓ@NNNâ²eËdÄ+áøñã¡?þøw>úè*¾ÔUUÀ׿þõûà÷/-^¼XX„gø÷ÚŸ*´ü}ŒµŒ@L0ŸU*}ðÁ#GŽü+Rç‹W-öeóçÏqîܹ*ŸÏ7BH €¿‹ýòwyŒ%8„’·|Þ§NFÈaª¸¸¸gá*¥WMè«ðg‰áõz Jà…ó~¶ºf Àç!eÊìPžBxÙåöï߀õoؼyó®/…aq•Xh0Ü?æ‡CXóüùób›––Æ{¬H?j€wHhiiáý#¬Ï[.ž’’’Ž}iL°¯¯ïg ,ÐÈ>)û'GçÆÆFá ¨øÂ…3Àa߈ wˆêííåcØòòÊ™>}º¿=ÿ¥(€¹?,{3‚ÖøÂêŒùs¸rdó6Ü—yŽš /U|q|øµf¤| 5ˆò‹®u˜lJí%þíBá²¼¸¸8 gßOƒ\Û³õxÑ,DZ_Žüííí¡ÖÖÖ~g©ÙÊJÄEjjª“F hãØ"+÷‹kNš4)âèÑ£ß ¢7¿(.UbL5à­»pá‚–y P†û5À).€µYÁ‡Ç3 (0Áë—Ÿ={öXRÂÜÐÕQþ¼ˆp$N~ÂI~ÐÖ2Tr'i”qÏ=÷LCj­@×H’ÝJ&[P^øuYXyŠï>ÂÀyì~eK_zé¥?þµpG®}díÚµ†0–'[hÔà&×áÇÔÕÕaý‡ÆžÇúõë?¹ï¾ûþ ”ò/#?®Ç3ÂÂ×!îɆ‘ïô©Âü ¥üµA0€9„ þ‚‚ŽESG-Z09+¸ñ‹_|jÁòË_þò§¨þÜ8GŽöá~?Rø‘™ç81Y ÄéL3y‘÷6ÃK[«ÕÚHŸq€ 6Áßó…¬ú¬€+®ŠÆ- BÓ*ÜäSs·‚N'9Žp×à®/3»é3dˆChÿ9ï{}$î{Fh#„0®X8)ÊqKƒÐ~½2TA²vu3íóTU­Xy+w{™ ±_. Ï8øX¤F!|ý¹zn°Ðô©S;TKjA²ŠJŠYÐ1'¯y<à•SÑhÍŒcÇ„¯ž8qüR@ÒR%½ú«WèñuO°5¸ÊËB8P]Q“|Ì3Ï<“ÁÂ#UÒ››6 ØóiÁ@ˆrr²iNy9>ã{hd™,öbŒ'êÃŒ—[ø°ÂÚo¿µ…’S“©d¥³ªºZXjÆ´éâ{¼ÅÂù:âÇ?þ1“•oÐÆ~ô£MhéØçíƒCäq{è“S'©¢òÐàÐ5¤Å{¿õ-RkÔ— !»cÿ¸)EÇ’]»víœã9 Jè ¨ñ@CyêT-Yr'­ß&ÊÙi€kSS3Už¨$ö娏8BÑ¢wXñä“OÖ?öØcOÐ(ã‰'žXrµ2##CÀ¿…PÕé*}0O^‡ðÿ„x •LœHÜ·æ/\@h“ñ›#>àÓìç5¡åðw¾óÆüܼLÀS?¢Æ&XÆ3 ÈJC.ÐÍ7ÝDkn¿]N]LiƒrVŒg‘î¶jН‚ ÿ ¶°¢ ¤`}÷}ëÛÔÕÝEi©idíí…•ýd0(';‡ÊçÌõ5 ªOŸn~å•W2¯ZG}{)ÚdÚ¡Óý€¡×îowØIßg}êu:á¿&L ††FaM€F@%‚\˜ÝOÁøž# ¬än”ÉÇñwQ?°§¦¤ŠŠ0 Ô¸\n² Øh™%¨”‚ ¾ÆÑã?üÂ";¶lI©»Øôí³çÎ~£ºº*½tF©²tÆ ^$[€NcööõXŘ£€¹yytÇw°€œ…{T p6\l€²ôTTT„1Elõz(¦ž~ò)†¼nÇŽ Á„²““’hÚ´©”—7Q(êãÃ3ÏðMÊË?›71÷¿“RS}ýõ×›Þݲõ¡úóõÏttvJÔÖÞNk׬ᅱP¾šZZ[©þô‹'<ì—¬žÎÂ,”JqqEȾ ´È2>š<¹±"–Š &Ókë×ó9âúò4™MÜa‘¢ Yhâ ÀŠA:6ÚJMKZ¢UJÅÝ_]±â­¿Êê.»ã½nyp Ð L©ää$<¸¨¤ý@û=u…õKKË(à÷³ „DB`'à+ÁM§x"œ‘™Ex¨âÓ"`ïáÙüæfVž°|xñ“˜Hy¹¹´mûºxñ"¯<Zhñâk¨|n9557ãš&Œ \ó÷Ûß}¿|ùÍ7ÞÿFÀÎíÛ_P*Uj3q“fÌØØzl%öû°nq,|þ"wjø7îäÈ“‡ Ôé ‚eç@ ¥R¢F”‘™Iu5§${Yàpës!'”ÖÔÒL)ÉÉ"ÓÈLj#ô&Ùò”ˆcJžâ:Cû½7ÞxãúÏM…î?xÎÜ„À•°h=!è‰æÄÀôTÐÒ°  ³±e¹æGúŸ//aEרHh|PVfYà*&ƒÖ§¾^+‚\`D)mŽ6ÓEä}Î0: i5üž¬ ¾¯P|$ßHžà"E#Ÿßù>·TjåË ¹)À‘=¾xˆ41¹K89b(3õE³R7‚(„‰2™àŸ|à­¡yåsáÇYsfÍÂqJHL" ¦%ê|¥‚.4Ð0ЄôÇÆ¡Ð4ª=s†"1P:*üO6˜!*6î¹ÏåÕ'«;ö}|q'üþhÅQæã¬}@´Ÿýöò†Ç¥]Ø]2¥  ®RÔ˜&“™‚<žEù` )p‰ºž;wŽNœ¬"§ÓAˆô’’áëBÉp¾Òe°ß/b@tL4Íž5“ ‹ŠÙ`|~@Ò¨3A²Ú>St¸ß³cX!â·¢Âs1õ¼ÔŸÓñÍä|`g‡|ÈóØ/÷ÿ0ÅgAi!ˆçÃeXÒ)Wà˜ Ÿ‘Þ‰‡Á3€¬àÂñ°ž¸ÏX- &QPh6gÎ>©:LîQ JÎç—••©€»˜l~ªðÌ=åÐG—_hl Îó1Ð&r7Ga}›­||ˆƒ·¿*Àckû# ÃVcåÈJ`Aè«Óh5‚Ö¶¶Ài)l}øw³Èï½Önr»œ|+jTÈcÈe²è O).fÅ=ƒa ¾˜¥ø /TÐÂE‹î+$zŠÁrE¸îŸ667*Y“™él-ÁòQ˜˜M½ðm#“ê“ú˜°°ðB8‡Ý) 'âÁ¥ç„rÝÎÁH kòqíˆäíH{l™ ßàúkÒŒøÝI!ü¹=n2âûX³AÀ&ù^Œ.V˜,¸0€˜aʘ7o½óÎÖ¸Kü£…ÅÅëÆT^H(©;sf¥P½ü…WI’X¬V£ZFJ„pZ®Âð»‹K_æÿ€£XûªP>0ù»Ò"=Šï’Pâ‡h— r¤TIºl4Ÿ‡`¨ø0áÓr—Ù£—É‘,8ŸŽþÌ©S ´òø‰Ç]Ï{p‰ªÑ @Çåw ´\v²0H?¹ùÀݾGrÁ½Q²3é AqW`>.]zʱ‚ý[Áè`¿ÌÈ`%ˆë`¡E#.„1ôq aÐb-C²€¢Ge*0YÈ*8.:ˆ8Ï#ssr±?]ì¦ëŠâ¢¢7ˆ¨3x™ЮþÚÐÀ`>çÔ_½ò+:‹¨Ì Å;}¢¼5À2\û÷á÷F(¦Ïý¢ÍÑbjä(M!V¬ÀOz½Œî XK*IN[äœ\Þi–ëyŸß'“,ùÈ4tçv‰›ß¹v hä´õ‘o¨“”>=Å¢pIÍBàÉM§à?-¡CG¡9 [QÏPcŸd¶ÆÂ1é኎ãß.JZ%ä2Vnsãƒ,¼ [ééiìr¢æ°‚K@`®ü8Ò 4rânF,á`|ÝW¾BYé×Ó@w‡Ý¤²#Û S™£ TpóR *5Ôaí£ßny[T”Ë–-'<Ê~€ˆ„T@üÀbæÆ7ÞX÷›ÍoR9ÚM g—QÍÁÈÑÝN4Œ 8«U„OÜ^Å‚âŸäøPØtê xaäà¸øx–Gœ›› Ð\\Ó`4‚Ìè¥ÆJ[¶|™nǶí¬F ¢õBšZ2…áÌq†-Í:øZBÀ>¼Shù’k©©öõµ^À:ÝX'2¤ÄD9­‚rr"H–MGFkiïBí²Ÿ•ž¢7öá­ìlü¶Õþ½·… Ú3@•x›©|.XZõ»I9ì"…[¯[lC^é5*ÊÏL£%‹æ3Çgº*bÈ×¥Ú?°Í¢Ã‡Ó‡(š2Á÷e…aS±Þ'„šá9ðnzóM¢ìœâaÄ1œ*« ‘þ óéÐέp :w y1ýæAjl%ì“‚^LÖë¡huˆþùº…T—Þ°q#Õ®ù‰@€Yožô‹/<ÇìnzQYk+H íÔ Ö[Z|×ðäÀ¦Vf›9‘"k*Ââ©Û6D]°p!n¯ÂdCøºº³ »9tÛêÛ8`‰7E0PvüûÖw¶îÄc·=~ŸwÙ¤À ^‘ wÁ ñ> M™2…ð‘ÑÅ>Î Ùcqù,:õánX™F"¬U cHdШ°S `ËSâÇgJf¬|¬’®[;E×:S¯6üV:v²b}{G;­Y½šNì~‡tªeÅèDÕáš Z\~l ’|D¸&P  öY©þL-¥ê$:ÑÖHY(okjkH«ÖîFªótË-·Þ":š¸¼¾D[ƒMèõýD®5.\¨ö /CËXøÈaZqË ?*`íªS§8«²¿‹ÉM7ÝHGì¥)I&²9…Q0}¤…åµ LF&#CDÖ "è:éHe%u[mT”ŸOGÑ?øÓ¡?½&Y{¬"?Ã’zcPsô…Ïã‚ÁúHSˆ±@ßå½Emo˜žKmƒnJ2ª©Çï°¹­•˜¨þ¶nÝJÛ·ok±ûš|©ˆöòîù³f•ú¡ýÎ_°à¡&ñITD¤ž‘À,€†îm Z41™nd„öÁX¬S‰Ï*R3ßóøÈ3„Ú®Ps±<Îa2käðy˜£p€-RN.ðvvu©ÌœFCuÇÈ U’$‚ž‚JÒã)Ú e4pJõ@”9F4t¨è:¬`dJÏ˦ŸmØFÝ!=õ¸B‚­Í,›ù[Pe螬PÀ†&I_P¡Ø7;›iìÁ¬--WiTñH<ÐÝ»{ÏžGY©9™Ô__Ez5 ãÌ›œN9)r¢}>4h#çà ÜAƒÔ§ƒ!%rxýTÕÚ ÅCqœÝ v…™ê»9¨ú¤kÄä$£ÅE#µ*áS&l{úÈ6(¡ÇEæØJ‹O  Ø€\lí³‰|cL£À[’*lI¤ºµw¬] øèsŽƒ¶`ƒùç±eËÍÞ}|áS¸SŠ„Hîé|K5¶uSb\4e"}ÚQTiŒ‘Ôe³Á`>\3£Ô”aÎÈ%ÞK!×0#•3•¤(˜4ÉÕÕÝ£›=c ù/§¼8=û•.&¡ \A´È-â'‚¡Ùf¹,ÙÜ^j¦6E4 ‡˜ÑyÐ<ÕÑ8ôÿO„r†ªú‰NÙT6s¦h†–Ï+Ÿ%žÐŒóàkΚ=»¼©¹IÐínµ…†#D]Àå„hÅ[»¨­îR¡uôvÓ°Ó!‱jWjûýÂH‘F£kÉÒës/ë ®{pyËîßwè ¿’¦ó9(hYš¡‡_±OÁp¨ ³ºüÔîôSMŸŸ¬ªhš·d9“œÐ„ÌÌ÷Ö[/Ñ8ð‚öçNžú)SJ]àFW™Ã4Ã"Q"àÀäMxÄšéG`;eõÐñ.uúÕTR:›jkj†o[³&í‘G±ŽhŠ>ôÐC–ÚšÚÖ^k©Ô¶}Áø€ *JT£”¨iÐKÍ(Bk¢©sæS2*½}{÷u•ãe]…qï½÷æžüää¡Ä¤D‹Ù…ò¼‰"ÝV²¨<”e rÃRVw€º\hˆè¢iâ¬ÔÕ‡–žµïLYqÙµO¿ðtû»Â<ð@¹ºs¿özæã…‚s&š%Üu ˜#óóÐÙ3uv¥¤ú ˜Þ³ô% ¼©þZj?°$X"ËJKhˆ.•ÁhLë ²¥©©2/?ÿ¼¤Õü¹Ÿ Þ¾jUn¿ÃQÖÞÚ>¾_0ìõ5ëú7*+ñÆÂßθnzI žãxïÔ"âUJé\jzju”.ꓖΖ3x«ÜOcŒÿÿßãô>þÈBü¢F%;IEND®B`‚qstardict-qstardict-1.3/qstardict/pixmaps/view-refresh.png000066400000000000000000000057041323166163100241520ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× '`'äö DIDATxÚí{pTÕÇ¿ßs7 ›|t2¼ŒÑ*uò‡¯ /% &VƒU'>‘ZjtÔfš©Fê#%–‚ X¥Ö1‚€ yø­þA­ŒðÅ Ø’Çîýõ +I6÷îÝ{wÏ'sf'›ÝÍ9ç÷½¿ó;¿sîY@£Ñh4F£Ñh4F£Ñh4F£Ñh4&^¸ac®}ñ¥Xo¦O[úÕP %J€-€xâúÚ,š²¬oŸ-€¸¸êS”ÏW&¦”0€Zñqí‹BVBÆ8lü à†i ©J! âùˆ?Õ*!¡„&ÊÀØò´¾GÂõµY¦`5Y$4q#€¢š_BB™%d§‰×o. ÌJiÚÜq$ÿ Óú * ³@›9žPTc$$%•„DÊt7*Ö‚¼ÄÄÄ÷(òl2~âu/ŸË`Œ\õ) IIe¾ËäÙ̯‹ ®OŒZ<—ߪàoÜ\@Sœ òzî1ÿÖÛÛ[‹ ó{µ¢äAù*QÌä_ÓäŸMµæˆG½‚÷PTc$%%•pÓrm ww÷V`Ãü-€‘|Ó–,Ó4WÈrgGñ€îï^Ÿÿ4@Ѱ1Èóûýe€D*ȳ›z ·u?—÷¥€Õ«þÆÍ€TôZ&¯‚%]Ï^Y­óñI*ˆªä7­Á¢mIÚX`\QMJWÀ_‰äÀHvò?ÍPÂÕ]ë¯8 `1$$*A  ì ùÔìîjwÅžœþŠ'7tì£2ç][Ь`ÿ‚miFЬÄ[«}‚ý¡ã¢cU¹ûµlà”[6Àd%è©õþf¡qiǺ܃Zv‰wÖ¤;(£wòäÝ£ǦG{-!¦vƼiK–ý{þaXy*ÿ@{çù$VÙ<Lš²P{ƒDTb-e­Uy<Éû¯Èzv®ôð+3ýë5óº´p Hl­Ê+T@!ÁýÄÿ ðþ Sæl;Ù{‡ñsfOȸUÒR•·ÉHôgBP Î{­Ío¤’+â¤bÐ" ¿„ZrðÏ9‡«sKÌ Hîü~„>¨€Öä½Gpáwï±®ŸŽ]¸õ2-€(p¨*gKÛÑ R  cè^dîz¡¬°«bªZÑbÃüÐá§ò*DIpÓƒÊ$>HbÏÿç†QóÒÚF¦I°sf±pÛî°Å0ä܃«¯Ø®=€—fkr_UÀf[ò"…zð ¬°#4‰_è!À£œöëí˜jñcÌÞž¤1mOç´ià5/ ð¼€Jð÷^¤‡’Øgn²%01E Àƒ|Õ¿ã÷‹¡ŽÁ'+Š2Y À£xk({qZž¨vZÈ ‘®gÄO ›RT“Ø:.õ^àŒ0¦'‡Mò•ž h]3ûˆ×`@¾±aI'ày´Žõ, wÂ)ÀhBJ’|2À•ÞsÒÒê<;5†)¶â0/í¶í§zOF‹ Iï{#­Ï«$ Àa/Ù_‘!Óú‰Ô!Ï €äQXÜ6e—ê5`RRmðGca`ýÔ,eŽõ\¨Ì±VA¶ô]ô=€uÌð\fX€bù–'dzMdZNÛÐwÑ€ÉÝV÷Ê*2Ûs³2Ûê-Cîö¼HÕlÃÊØä %;&yÅöJvL"1Ùú¦Õì}(³ÙŽ•1QäñßžºR™ÞúzÿÀ #hüñ¢¤Ø3Þ_I± 7šÇûÎÛØ·*¿•äûCÝ;€˜:~QÝ,·¿¿ŽœjÃn€÷÷­Šü äά ö| îw»p¿Cž]}æ°Ñ–ûè.›XZWèVãO,­+„ÂeöÜ.ÌÆ˜@ʨ–zÏå[ŒQqúÝ;n3þéwïPPaÓ­â‡÷Yl iùü^©¡5/òmŸô­r›’ƒ¾U ÇÛqdÁš¦åÎáØŽ ùŒ¥Ž9‘≋ëïp‹ñ'/®¿ƒ@±]‡E(Ê3ŽÍXí¨»ê?a××°…DøËÏ+flަñ'ÝÕp%)/®*»>«˜éXêÛÙ= Øx¸’¡”/RšÑ׳ÖisDåæÐŒÅ³„òZäÅÆB¿ÿô±Y¶$SÎZR—cÀxP 9«³pöîÇsêâBpöÒú¿üU$ÿ‡@>¸Îô…6~V>{_XÞ²×Æ« q5 ·üYd{CžßóèÌë¢a‡¨ ³ôÍ3CFðCc¨¢{¾‘Od7 ´˜`gÿ8(„0Æ3@fr)³êŠCFÈ8ï“'²Ä• céësÙŠø=§@h"·ùñœíѪ@Ô;þÜ¥ qo”}Ð ÕqUðuÎÝoLRýù³bÔüŸšÂÙÍœþ¹k"·õД{Ï0ÉWü<ÆŒÿo%2·iEÎ7®ŠDÜØSé‹ÞMMÑ] bFŒ¸ý†ÞîWí]ya»ÛªæÊ#bö®¼°ý´€\.`9@‰ð—6E²ˆ€å§är7ßµàûL]öfž@þ `ŒÇ®û‚7}\ž½ÕÍ•tý!Q—goõù‚ÓnðÌ Üàó§¹Ýøžð'xƒ{ߘA%œËÓ‡Ûƒ{”|üðôW½#V‘¾h[’?r»÷ï’jí‘Gzº:«ö®ÌíñRzvfÊò¦Dö*†p£äØJ¹$}¶iù”^/öc ¬Â §-{ûÓCx-ì8”j`Ž€ò2žý ü’·ûg)Þ%¦–a'.o1ª×˜Ì dÀóltM@>°Á ÚCõ_,Ï鎕>‹éuøsï«“ IçC™ç(Q™2r:ú¿V~4þw_'€VÿH³IÙS5÷±çý]ÍjF£Ñh4F£Ñh4Çaµ%ܶŠÅ¿kX¬¨'ÃlËpÛ)aþMø]Ü(ºÀÀC}ÎnQXÂpŒ-a>çi0 CÓAQØ!»Œ-Ãx­«@‡ÃÈ`íìJªÄ¡GËø2þp ì„h†bìá<òV½#ð¹"¿)”{¥p…Å“<7˜€bf¶åõ!`¨C‚Õi DÀK¸bˆF`Ю<@4ƒ?OáŠ"Æí7)nòg(³«SB²`ðHæ†+ˆ¸NE«‘ȺÊÃå¿k0¸í"M‹%IEND®B`‚qstardict-qstardict-1.3/qstardict/pluginmanager.cpp000066400000000000000000000373111323166163100227110ustar00rootroot00000000000000/* The code is adpted from QtNote project Copyright (C) 2010-2016 Sergey Ili'nykh This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Contacts: E-Mail: rion4ik@gmail.com XMPP: rion@jabber.ru */ /* Algo for plugins search. ------------------------ Plugins priority: 1) Directories for plugin search have priority To choose between plugins with same ID. AppInfo::appPluginsDirs() return directories in priority order (most prioretized first) If there are two plugins with the same id in some directory, the one with more recent modification time will be choosen. 2) Plugins have load priority To decide which plugin to load first. We have few different states of plugins 1) Discovered plugins: All files which look like suitable plugins. In this case for example we can have 2 or more copies of the same plugin and only one of them should become available. All of this data will be cached. 2) Available plugins Plugins ready to be loaded. All of them have unique ID. All not suitable dups by prioriry or other means are removed. This list of plugins could be available to other code as priority sorted list. 3) Enabled plugins Subset of available plugins which are supposed to be loaded. 4) Loaded plugins Successfully loaded plugins Compilation mode: AppInfo::appPluginsDirs() can return different set of directories depending on compilation options 1) DEVEL This could be set as qmake param. It's developer's mode. In this mode plugins search works differently. Only just compiled plugins' directories added to search, so only they will be loaded. 2) Normal mode In normal mode we have two directories for search. One in ~/local/share/QStarDict/plugins and another one is /usr/lib/QStarDict/plugins. The directories could have different paths dependeing on user and system settings. Algo: 1) Iterate over all plugins' directories and find all suitable plugins. 2) Cache this data in order they were found 3) Iterate over cache and make a list of "available" plugins. In other words make do not add tot the list plugins with already known ID from previous iterations. 4) Sort "available" list according to priority set by user. 5) Save the list to settings for future use. 6) Iterate over sorted "available" list check which plugin is enabled and load it. 7) emit "pluginLoaded" signal for each loaded plugin. Business rules: 1) Each plugin should know its priority as was discovered. 2) Plugins are not expected to heavily iteract with application on load, since we can load a plugin just to update metadata. */ #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) # include #endif #include #include "appinfo.h" #include "pluginmanager.h" #include "../plugins/pluginserver.h" namespace QStarDict { class PluginServerImpl : public QObject, public PluginServer { Q_OBJECT Q_INTERFACES(QStarDict::PluginServer) PluginManager *pm; public: PluginServerImpl(PluginManager *parent) : QObject(parent), pm(parent) { } const PluginMetadata &metadata(const QString &pluginId) const { return pm->pluginDesc(pluginId)->metadata; } /** * Return a directory that contains plugin's data. */ QString configDir(const QString &pluginId) const { QString path = AppInfo::configDir() + QLatin1String("/pluginsdata/") + metadata(pluginId).name; if (! QDir::root().exists(path)) QDir::root().mkpath(path); return path; } QString idForPlugin(QObject *instance) const { auto data = pm->findPluginInstance(instance); if (data) { return data->metadata.id; } return QString(); } }; class PluginsIterator { QDir currentDir; QStringList pluginsDirs; QStringList plugins; QStringList::const_iterator pluginsDirsIt; QStringList::const_iterator pluginsIt; public: PluginsIterator() { pluginsDirs = AppInfo::appPluginsDirs(); pluginsDirsIt = pluginsDirs.constBegin(); findDirWithPlugins(); } void next() { if (pluginsIt != plugins.constEnd()) { pluginsIt++; } if (pluginsIt == plugins.constEnd() && pluginsDirsIt != pluginsDirs.constEnd()) { pluginsDirsIt++; findDirWithPlugins(); } } inline bool isFinished() const { return pluginsIt == plugins.constEnd() && pluginsDirsIt == pluginsDirs.constEnd(); } inline QString fileName() const { if (pluginsIt != plugins.constEnd()) { return QFileInfo(currentDir.filePath(*pluginsIt)).canonicalFilePath(); } return QString(); } private: void findDirWithPlugins() { while (pluginsDirsIt != pluginsDirs.constEnd()) { currentDir = QDir(*pluginsDirsIt); if (currentDir.isReadable()) { plugins.clear(); foreach(const QString &file, currentDir.entryList(QDir::Files, QDir::Time)) { if (QLibrary::isLibrary(file)) { plugins.append(file); } } if (!plugins.isEmpty()) { pluginsIt = plugins.constBegin(); return; } } pluginsDirsIt++; } pluginsIt = plugins.constEnd(); } }; PluginManager::PluginManager() { pluginServer = new PluginServerImpl(this); QDir(iconsCacheDir()).mkpath(QLatin1String(".")); updateMetadata(); } PluginManager::~PluginManager() { /* QHashIterator it(plugins); while (it.hasNext()) { auto item = it.next(); if (item.value()->isLoaded()) { item.value()->unload(); } } */ } void PluginManager::loadPlugins() { QSettings s; QStringList prioritizedList = s.value("plugins-priority").toStringList(); QMutableStringListIterator it(prioritizedList); while (it.hasNext()) { QString id = it.next(); if (id.isEmpty() || !plugins.contains(id)) { it.remove(); } } // now prioritizedList comprises only known plugin // and any not previously prioritized prioritizedList += (plugins.keys().toSet() - prioritizedList.toSet()).toList(); s.setValue("plugins-priority", prioritizedList); /* * now we have fully prioritized list. */ QStringListIterator it2(prioritizedList); while (it2.hasNext()) { Plugin::Ptr pd = plugins[it2.next()]; if (!pd->isEnabled() || pd->isLoaded()) { continue; } pd->load(); } } QString PluginManager::iconsCacheDir() { return AppInfo::cacheDir() + QLatin1String("/plugin-icons"); } void PluginManager::setEnabled(const QString &pluginId, bool enabled) { QSettings s; auto pd = plugins.value(pluginId); if (!pd) { return; } pd->setEnabled(enabled); s.beginGroup("plugins"); s.beginGroup(pluginId); s.setValue("state", (int)pd->state); if (enabled) { if (!pd->isLoaded()) { if (pd->load() != LE_NoError) { emit pluginLoaded(pd->metadata.id); } } } else if (pd->isLoaded()) { if (!pd->unload()) { qWarning("Failed to unload %s: %s", qPrintable(pd->loader->fileName()), qPrintable(pd->loader->errorString())); } } } QStringList PluginManager::availablePlugins() const { return QSettings().value("plugins-priority").toStringList(); } QStringList PluginManager::loadedPlugins() const { QStringList ret; foreach (const QString &pluginId, plugins.keys()) { auto ptr = plugins.value(pluginId); if (ptr->isLoaded()) { ret.append(pluginId); } } return ret; } void PluginManager::setLoadedPlugins(const QStringList &pluginIds) { QSet ps = QSet::fromList(pluginIds); QMutableHashIterator i(plugins); while(i.hasNext()) { auto p = i.next(); setEnabled(p.key(), ps.contains(p.key())); } } PluginManager::Plugin::Ptr PluginManager::findPluginInstance(QObject *instance) const { foreach (const QString &pluginId, plugins.keys()) { auto ptr = plugins.value(pluginId); if (ptr->isLoaded() && ptr->loader->instance() == instance) { return ptr; } } return PluginManager::Plugin::Ptr(); } void PluginManager::updateMetadata() { QSettings s; QSettings metaCache(AppInfo::cacheDir() + QLatin1String("/pluginsmeta.ini"), QSettings::IniFormat); //decltype(plugins) tmpPlugins; QHash file2data; // read metadata cache int size = metaCache.beginReadArray("list"); for (int i = 0; i < size; ++i) { metaCache.setArrayIndex(i); QString fileName = metaCache.value("filename", QString()).toString(); if (fileName.isEmpty()) { break; } Plugin::Ptr pd(new Plugin); //tmpPlugins[pluginId] = pd; file2data[fileName] = pd; pd->state = metaCache.value("state").toUInt(); pd->state &= ~Plugin::Exist; // reset it until we sure it exists pd->modifyTime = QDateTime::fromTime_t(metaCache.value("lastModify").toUInt()); // if 0 then we have staled cache. it's ok pd->metadata.id = metaCache.value("id").toString(); pd->metadata.name = metaCache.value("name").toString(); pd->metadata.description = metaCache.value("description").toString(); pd->metadata.authors = metaCache.value("authors").toStringList(); pd->metadata.features = metaCache.value("features").toStringList(); pd->metadata.version = metaCache.value("version").toUInt(); pd->metadata.extra = metaCache.value("extra").toMap(); pd->metadata.icon = QIcon(iconsCacheDir() + '/' + pd->metadata.id + QLatin1String(".png")); //pd->metadata.extra = s.value("extra").(); } metaCache.endArray(); lastError = LE_NoError; metaCache.beginWriteArray("list"); int cacheIndex = 0; PluginsIterator it; while (!it.isFinished()) { metaCache.setArrayIndex(cacheIndex); QString fileName = it.fileName(); it.next(); Plugin::Ptr pd = file2data.value(fileName); bool isnew = pd.isNull(); if (isnew) { pd = Plugin::Ptr(new Plugin); pd->state |= Plugin::Exist; } pd->pluginServer = pluginServer; pd->loader = new QPluginLoader(fileName); if (isnew || (!pd->isLoaded() && pd->modifyTime != QFileInfo(pd->loader->fileName()).lastModified())) { // have to update metadata cache pd->modifyTime = QFileInfo(fileName).lastModified(); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) lastError = pd->load(); if (lastError != LE_NoError) { // new cache pd->state &= ~(Plugin::Valid | Plugin::Enabled); continue; // we were unable to do anything with this "plugin" } auto qnp = pd->castInstance(); PluginMetadata md = qnp->metadata(); // FIXME it's qt4 only if (md.id.isEmpty() || md.name.isEmpty()) { pd->unload(); qDebug("QStarDict plugin %s did not set metadata id or name. ignore it", qPrintable(fileName)); lastError = LE_Metadata; pd->state &= ~(Plugin::Valid | Plugin::Enabled); // mark invalid and disable continue; } pd->metadata = md; pd->cacheIcon(); #else auto js = pd->loader->metaData().value(QLatin1String("MetaData")).toObject(); QString id = js.value(QLatin1String("id")).toString(); QString name = js.value(QLatin1String("name")).toString(); if (id.isEmpty() || name.isEmpty()) { pd->unload(); qDebug("QStarDict plugin %s did not set metadata id or name. ignore it", qPrintable(fileName)); lastError = LE_Metadata; pd->state &= ~(Plugin::Valid | Plugin::Enabled); // mark invalid and disable continue; } pd->metadata.id = id; pd->metadata.name = name; pd->metadata.description = js.value(QLatin1String("description")).toString(); pd->metadata.authors = js.value(QLatin1String("authors")).toString().split(';'); pd->metadata.features = js.value(QLatin1String("features")).toString().split(';'); pd->metadata.version = js.value(QLatin1String("version")).toString(); // extra? #endif if (isnew) { pd->setEnabled(pd->metadata.features.contains("defenable")); } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) if (!pd->isEnabled()) { pd->unload(); } #endif pd->state |= Plugin::Valid; metaCache.setValue("id", pd->metadata.id); metaCache.setValue("state", (int)pd->state); metaCache.setValue("filename", pd->loader->fileName()); metaCache.setValue("lastModify", pd->modifyTime.toTime_t()); metaCache.setValue("name", pd->metadata.name); metaCache.setValue("description", pd->metadata.description); metaCache.setValue("authors", pd->metadata.authors); metaCache.setValue("features", pd->metadata.features); metaCache.setValue("version", pd->metadata.version); metaCache.setValue("extra", pd->metadata.extra); cacheIndex++; } plugins.insert(pd->metadata.id, pd); } metaCache.endArray(); } void PluginManager::Plugin::cacheIcon() { if (!metadata.icon.isNull()) { QFileInfo fi(PluginManager::iconsCacheDir() + '/' + metadata.id + QLatin1String(".png")); if (!fi.exists() || fi.lastModified() < modifyTime) { metadata.icon.pixmap(16, 16).save(fi.filePath()); } } } PluginManager::LoadError PluginManager::Plugin::load() { if (isLoaded()) { return LE_NoError; } #ifdef DEVEL qDebug("Loading plugin: %s", qPrintable(loader->fileName())); #endif QObject *plugin = loader->instance(); if (!plugin) { qDebug("failed to load %s : %s", qPrintable(loader->fileName()), qPrintable(loader->errorString())); return LE_NotPlugin; } BasePlugin *qnp = qobject_cast(plugin); if (!qnp) { loader->unload(); qDebug("not QStarDict plugin %s. ignore it", qPrintable(loader->fileName())); return LE_Abi; } qnp->qsd = pluginServer; #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) metadata.icon = qnp->pluginIcon(); cacheIcon(); #endif return LE_NoError; } bool PluginManager::Plugin::unload() { QString fileName = loader->fileName(); if (loader->unload()) { delete loader; // probably Qt bug but "instance" method does't work after unload. So recreate loader. loader = new QPluginLoader(fileName); return true; } qWarning("Failed to unload plugin: %s", qPrintable(metadata.name)); return false; } } // namespace QtNote #include "pluginmanager.moc" qstardict-qstardict-1.3/qstardict/pluginmanager.h000066400000000000000000000062741323166163100223620ustar00rootroot00000000000000#ifndef PLUGINMANAGER_H #define PLUGINMANAGER_H #include #include #include #include #include #include "../plugins/baseplugin.h" namespace QStarDict { class PluginServerImpl; class PluginManager : public QObject { Q_OBJECT public: enum LoadError { LE_NoError = 0, LE_NotPlugin, LE_Abi, LE_Metadata, }; enum PluginFeature { FirstFeature = 0x1, RegularPlugin = FirstFeature, DEIntegration = 0x2, TrayIcon = 0x4, GlobalShortcuts = 0x8, Notifications = 010, LastFeature = 020 }; Q_DECLARE_FLAGS(PluginFeatures, PluginFeature) class Plugin { public: typedef QSharedPointer Ptr; enum State : quint8 { Exist = 1, /* used during plugins search */ Valid = 2, Enabled = 4 }; Plugin() : loader(0), pluginServer(0), state(0) {} QPluginLoader *loader; PluginServerImpl *pluginServer; uint state; QDateTime modifyTime; // modification time of plugin library (outdated metadata check) PluginMetadata metadata; inline bool isEnabled() const { return state & Enabled; } inline void setEnabled(bool enabled) { if (enabled) state |= Enabled; else state &= ~Enabled; } inline bool isLoaded() const { return loader? loader->isLoaded() : false; } LoadError load(); bool unload(); void cacheIcon(); template inline T* castInstance() { QObject *o = isLoaded()? loader->instance() : 0; return o? qobject_cast(o) : 0; } }; explicit PluginManager(); ~PluginManager(); inline QObject *plugin(const QString &pluginId) const { auto pd = plugins.value(pluginId); return (pd && pd->isLoaded())? pd->loader->instance() : 0; } template inline T *plugin(const QString &pluginId) const { // invalid pluginId could come from DictCore. so check it first auto pd = plugins.value(pluginId); return (pd && pd->isLoaded())? pd->castInstance() : 0; } void loadPlugins(); inline bool isEnabled(const QString &pluginId) const { auto pd = plugins.value(pluginId); return pd? pd->isEnabled() : false; } inline bool isLoaded(const QString &pluginId) const { auto pd = plugins.value(pluginId); return pd? pd->isLoaded() : false; } void setEnabled(const QString &pluginId, bool enabled); inline int pluginsCount() const { return plugins.size(); } QStringList availablePlugins() const; QStringList loadedPlugins() const; void setLoadedPlugins(const QStringList &pluginIds); Plugin::Ptr pluginDesc(const QString &pluginId) const { return plugins.value(pluginId); } Plugin::Ptr findPluginInstance(QObject *instance) const; signals: void pluginLoaded(const QString &); public slots: private: LoadError lastError; PluginServerImpl *pluginServer; QHash plugins; void updateMetadata(); static QString iconsCacheDir(); }; } #endif // PLUGINMANAGER_H qstardict-qstardict-1.3/qstardict/pluginsmodel.cpp000066400000000000000000000133201323166163100225540ustar00rootroot00000000000000/* The code is adpted from QtNote project Copyright (C) 2010-2016 Sergey Ili'nykh This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Contacts: E-Mail: rion4ik@gmail.com XMPP: rion@jabber.ru */ #include #include #include "pluginsmodel.h" #include "dictcore.h" #include "application.h" #include "pluginmanager.h" #include "util.h" namespace QStarDict { PluginsModel::PluginsModel(LoadType lt, PluginManager *pmanager) : QAbstractTableModel(pmanager), pmanager(pmanager) { pluginIds = pmanager->availablePlugins(); QMutableStringListIterator it(pluginIds); while (it.hasNext()) { auto &md = pmanager->pluginDesc(it.next())->metadata; if (lt == JustDict && !md.features.contains("dict")) { it.remove(); } if (lt == ExceptDict && md.features.contains("dict")) { it.remove(); } } QPixmap pix(":/icons/configure.png"); settingIcon = QIcon(pix); QTransform transform; transform.rotate(45); pix.transformed(transform, Qt::SmoothTransformation); settingIcon.addPixmap(pix.transformed(transform), QIcon::Active); } int PluginsModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) { return 0; } return pluginIds.count(); } int PluginsModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) { return 0; } return 4; } QVariant PluginsModel::data(const QModelIndex &index, int role) const { QString pluginId = pluginIds[index.row()]; if (role == IdRole) { return pluginId; } if (index.column() == 0) { switch (role) { case Qt::CheckStateRole: return pmanager->pluginDesc(pluginId)->isEnabled()? Qt::Checked : Qt::Unchecked; case Qt::DisplayRole: return pmanager->pluginDesc(pluginId)->metadata.name; case Qt::DecorationRole: { auto &md = pmanager->pluginDesc(pluginId)->metadata; QIcon icon = md.icon; if (icon.isNull()) { if (md.features.contains("dict")) { icon = QIcon(":/icons/qstardict.png"); } else if (md.features.contains("de")) { icon = QIcon(":/icons/computer.png"); } else { icon = QIcon(":/icons/plugin.png"); } } return icon; } case Qt::ToolTipRole: { auto pd = pmanager->pluginDesc(pluginId); QString ret = pd->metadata.description + QLatin1String("

    ") + tr("Filename: %1").arg(pd->loader->fileName()) + "

    " + tr("Status: %1").arg( pd->state & PluginManager::Plugin::Valid? pd->isLoaded()? tr("Loaded") : tr("Not Loaded") : tr("Invalid") ); return ret; } case Qt::FontRole: { QFont f; // application default font. may by not what we expect auto pd = pmanager->pluginDesc(pluginId); if (pd->isLoaded()) { f.setBold(true); } return f; } case Qt::ForegroundRole: { QColor color = qApp->palette().color(QPalette::Foreground); // mey be not what we expect auto pd = pmanager->pluginDesc(pluginId); if (!(pd->state & PluginManager::Plugin::Valid)) { color.setAlpha(128); } return color; } } } else if (index.column() == 1) { // version if (role == Qt::DisplayRole) { return pmanager->pluginDesc(pluginId)->metadata.version; } } else if (index.column() == 2) { // settings button // options button if (role == Qt::DecorationRole && pmanager->plugin(pluginId)) { return settingIcon; } } else if (index.column() == 3) { // settings button // options button if (role == Qt::DecorationRole) { return QIcon(":/icons/dialog-information.png"); } } return QVariant(); } bool PluginsModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.column() == 0 && role == Qt::CheckStateRole) { Qt::CheckState cs = (Qt::CheckState)value.value(); pmanager->setEnabled(pluginIds[index.row()], cs == Qt::Checked); emit dataChanged(index, index); emit loadedListChanged(); return true; } return false; } Qt::ItemFlags PluginsModel::flags(const QModelIndex &index) const { if (index.column() == 0) { return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable; } return QAbstractTableModel::flags(index); } QString PluginsModel::pluginId(int row) const { return pluginIds.at(row); } QStringList PluginsModel::loadedPlugins() { QStringList ret; foreach (const QString &id, pluginIds) { if (pmanager->isLoaded(id)) { ret << id; } } return ret; } } // namespace QStarDict qstardict-qstardict-1.3/qstardict/pluginsmodel.h000066400000000000000000000020751323166163100222260ustar00rootroot00000000000000#ifndef QSTARDICT_PLUGINSMODEL_H #define QSTARDICT_PLUGINSMODEL_H #include #include #include namespace QStarDict { class PluginManager; class PluginsModel : public QAbstractTableModel { Q_OBJECT PluginManager *pmanager; QStringList pluginIds; // by priority QIcon settingIcon; public: enum LoadType { All, JustDict, ExceptDict }; enum Roles { IdRole = Qt::UserRole }; PluginsModel(LoadType lt, PluginManager *pmanager); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); Qt::ItemFlags flags(const QModelIndex &index) const; QStringList loadedPlugins(); QString pluginId(int row) const; signals: void loadedListChanged(); }; } // namespace QStarDict #endif // QSTARDICT_PLUGINSMODEL_H qstardict-qstardict-1.3/qstardict/pluginsview.cpp000066400000000000000000000121271323166163100224320ustar00rootroot00000000000000/***************************************************************************** * pluginsview.cpp - Code adapted from QtNote project * * Copyright (C) 2016 Sergey Il'inykh * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include #include #include #include "application.h" #include "pluginsview.h" namespace QStarDict { class ButtonDelegate : public QStyledItemDelegate { Q_OBJECT enum ButtonRoles { ButtonRole = Qt::UserRole + 1 }; QModelIndex sunken; public: explicit ButtonDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) { } // painting void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QStyleOptionViewItemV4 opt = option; #else QStyleOptionViewItem opt = option; #endif initStyleOption(&opt, index); if (opt.icon.isNull()) { return; } painter->save(); if (opt.state & QStyle::State_Selected) { painter->setPen(QPen(Qt::NoPen)); if (opt.state & QStyle::State_Active) { painter->setBrush(QBrush(QPalette().highlight())); } else { painter->setBrush(QBrush(QPalette().color(QPalette::Inactive, QPalette::Highlight))); } painter->drawRect(opt.rect); } QStyleOptionButton buttonOption; buttonOption.icon = opt.icon; buttonOption.iconSize = option.decorationSize; buttonOption.text = opt.text; buttonOption.features = QStyleOptionButton::Flat; buttonOption.rect = opt.rect; buttonOption.state = QStyle::State_Enabled; if (index == sunken) { buttonOption.state |= QStyle::State_Sunken; } if (option.state & QStyle::State_MouseOver) { buttonOption.state |= (QStyle::State_Active | QStyle::State_MouseOver); } QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter); painter->restore(); } bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { Q_UNUSED(model); Q_UNUSED(option); if(!(event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease)) { return true; } sunken = QModelIndex(); if( event->type() == QEvent::MouseButtonPress) { sunken = index; } return true; } }; PluginsView::PluginsView(QWidget *parent) : QTableView(parent) { verticalHeader()->hide(); horizontalHeader()->hide(); //setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::NoSelection); setEditTriggers(NoEditTriggers); setShowGrid(false); } void PluginsView::configureColumns() { ButtonDelegate *btnsDelegate = new ButtonDelegate(); setItemDelegateForColumn(2, btnsDelegate); setItemDelegateForColumn(3, btnsDelegate); #if QT_VERSION >= 0x050000 horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents); #else horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents); horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents); horizontalHeader()->setResizeMode(3, QHeaderView::ResizeToContents); #endif } } // namespace QStarDict #include "pluginsview.moc" qstardict-qstardict-1.3/qstardict/pluginsview.h000066400000000000000000000032771323166163100221050ustar00rootroot00000000000000/***************************************************************************** * pluginsview.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007-2016 Alexander Rodin, Sergey Il'inykh * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef QSTARDICT_PLUGINSVIEW_H #define QSTARDICT_PLUGINSVIEW_H #include namespace QStarDict { class PluginsView : public QTableView { Q_OBJECT public: PluginsView(QWidget *parent = 0); void configureColumns(); }; } // namespace QStarDict #endif // QSTARDICT_PLUGINSVIEW_H qstardict-qstardict-1.3/qstardict/popupwindow.cpp000066400000000000000000000113421323166163100224470ustar00rootroot00000000000000/***************************************************************************** * popupwindow.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "popupwindow.h" #include #include #include #include #include #include "dictwidget.h" #include "keyboard.h" #include "selection.h" #include "application.h" #include "speaker.h" namespace QStarDict { PopupWindow::PopupWindow(QWidget *parent) : ResizablePopup(parent) { m_dict = 0; translationView = new DictWidget(this); translationView->setFrameStyle(QFrame::NoFrame); translationView->setDict(m_dict); translationView->setMouseTracking(true); QGridLayout *mainLayout = new QGridLayout(this); mainLayout->setMargin(0); mainLayout->addWidget(translationView); m_selection = new Selection(this); connect(m_selection, SIGNAL(changed(const QString&)), this, SLOT(selectionChanged(const QString&))); loadSettings(); } PopupWindow::~PopupWindow() { saveSettings(); } void PopupWindow::loadSettings() { QSettings config; setScan(config.value("PopupWindow/scan", true).toBool()); setModifierKey(config.value("PopupWindow/modifierKey", 0).toInt()); setShowIfNotFound(config.value("PopupWindow/showIfNotFound", false).toBool()); setWindowOpacity(config.value("PopupWindow/opacity", 1.0).toDouble()); setTimeoutBeforeHide(config.value("PopupWindow/timeoutBeforeHide", 500).toInt()); setDefaultSize(config.value("PopupWindow/defaultSize", QSize(320, 240)).toSize()); setPronounceWord(config.value("PopupWindow/pronounceWord", true).toBool()); setDefaultStyleSheet(config.value("PopupWindow/defaultStyleSheet", defaultStyleSheet()).toString()); } void PopupWindow::saveSettings() { QSettings config; config.setValue("PopupWindow/scan", isScan()); config.setValue("PopupWindow/modifierKey", m_modifierKey); config.setValue("PopupWindow/showIfNotFound", m_showIfNotFound); config.setValue("PopupWindow/opacity", windowOpacity()); config.setValue("PopupWindow/timeoutBeforeHide", timeoutBeforeHide()); config.setValue("PopupWindow/defaultSize", defaultSize()); config.setValue("PopupWindow/pronounceWord", pronounceWord()); config.setValue("PopupWindow/defaultStyleSheet", defaultStyleSheet()); } void PopupWindow::setScan(bool scan) { m_selection->setScan(scan); emit scanChanged(scan); } bool PopupWindow::isScan() const { return m_selection->isScan(); } void PopupWindow::setDict(DictCore *dict) { translationView->setDict(dict); m_dict = dict; } void PopupWindow::selectionChanged(const QString &text) { if (m_modifierKey && ! Keyboard::activeModifiers().testFlag(static_cast(m_modifierKey))) return; showTranslation(text); } void PopupWindow::showTranslation(const QString &text) { QString simpl = text.simplified(); simpl.remove(QRegExp("[&%-/+?\\*#!:\\(\\)\\[\\]]+")); if (simpl.isEmpty()) return; bool isFound = m_dict->isTranslatable(simpl); if (m_showIfNotFound || isFound) { translationView->translate(simpl); translationView->clearHistory(); popup(); if (isFound && m_pronounceWord) Application::instance()->speaker()->speak(simpl); } } void PopupWindow::showClipboardTranslation() { showTranslation(Application::clipboard()->text(QClipboard::Selection)); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/popupwindow.h000066400000000000000000000107111323166163100221130ustar00rootroot00000000000000/***************************************************************************** * popupwindow.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef POPUPWINDOW_H #define POPUPWINDOW_H #include "resizablepopup.h" #include "dictcore.h" #include "dictwidget.h" namespace QStarDict { class DictWidget; class Selection; /** * The PopupWindow is a window that scan selection and pop-up * when needed. */ class PopupWindow: public ResizablePopup { Q_OBJECT public: /** * Construct new PopupWindow. */ PopupWindow(QWidget *parent = 0); /** * Destructor. */ ~PopupWindow(); /** * Return true if scanning enabled, otherwise return false. */ bool isScan() const; /** * Return modifier key. The modifiers are from * Qt::KeyboardModifier enum. */ int modifierKey() const { return m_modifierKey; } /** * Set behaviour for not found in dictionary words. */ bool showIfNotFound() const { return m_showIfNotFound; } /** * Set the dictionary. */ void setDict(DictCore *dict); /** * Returns the dictionary. */ DictCore* dict() const { return m_dict; } /** * Return true if shown words will be pronounced, othewise * return false. */ bool pronounceWord() const { return m_pronounceWord; } void setDefaultStyleSheet(const QString &css) { translationView->setDefaultStyleSheet(css); } QString defaultStyleSheet() const { return translationView->defaultStyleSheet(); } public slots: /** * Enable or disable scanning of selection. */ void setScan(bool scan); /** * Set modifier key. If key not is 0 then popup will be shown * only if key is pressed. */ void setModifierKey(int key) { m_modifierKey = key; } /** * Set beahivour for words that not in dictionaris. * If true then popup will be shown with text "No found", otherwise * popup will not be shown. */ void setShowIfNotFound(bool mode) { m_showIfNotFound = mode; } /** * Popup with translation of text. */ void showTranslation(const QString &text); /** * Popup with translation of current clipboard contents. */ void showClipboardTranslation(); /** * If prounounceWord is true shown words will be prounounced. */ void setPronounceWord(bool pronounceWord) { m_pronounceWord = pronounceWord; } void saveSettings(); private slots: void selectionChanged(const QString &text); signals: void scanChanged(bool scan); private: void loadSettings(); DictWidget *translationView; DictCore* m_dict; int m_modifierKey; bool m_showIfNotFound; Selection *m_selection; bool m_pronounceWord; }; } #endif // POPUPWINDOW_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/qstardict.desktop000066400000000000000000000004351323166163100227420ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Comment=QStarDict is Qt version of StarDict Exec=qstardict GenericName=Dictionary Icon=qstardict Name=QStarDict Type=Application Categories=Qt;Dictionary;Utility; Name[ru]=QStarDict GenericName[ru]=Словарь Name[tr]=QStarDict GenericName[tr]=Sözlük qstardict-qstardict-1.3/qstardict/qstardict.png000066400000000000000000000217221323166163100220570ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× "5¾ Ñr IDATxÚí}{$Gyç/«º{ºçÙ³;³«Yí®V¬v‘V>„ì;„OÆØÆ@ |Áù!cÂç;|º;‡y„ξ?cs¶ãøA„Á|p6ÆÆ’ÀX–Á»z°Þ‡ö¥}ÍÎ§_U•ßý‘UÝYY™YÕÓ5švœ*¢£««²«²òûòû~ßïËÌ^Ú^Ú^Ú^Ú^Ú^Ú^ÚþÜXN×y'€ÿàæðš«¸t¾À“~7´¤ßm{¶;÷üð«œnÁéø~Ð (ˆDÝ?$]Ìó:œ{Ô!…Np ðဈ@¢j>çÄy@ˆq§["îsÇçÄoæwÏDÄ<󀘸çâšAÀït§^Ég §È:ëU3 ÄÂ÷q“Ûž×áÎksWî}~ñ[¸’—r¸Æø¸rlJù=åB×/¯z»‹EæD‚è‰V´gQ»ÆŽóH'ÄÇuÇÁë•íÊ¢÷›‡J@\h[·„¤XNXý= <¼Ÿ\WõžŽã€Q¤¤á9N .É>¼?çœsG÷ZƒÃGm¹ù¿f«K¿ú¯,~p,@À)s£££¸ÿþûQ­VÅ…ë>\«ÕJ4nt>ê5­V D„‰}@qÜA÷t¸Óöšðy'lT,ª:c8hv ˜á‰ÄÞ;Vo¯Yœƒ£Ù©[Úó;hùMk™¶×„Ö×´5Ú5<è«ÁG eLc_[l¼å©/\øÒV[€»ÌÀ»ßýn¼îu¯ë –1ÛW¯–“?ºó1­µ”S•Ìv=Û=ÇIÓÕ—ˆ´ÏbªCT>:æ8ŽöÑñzk ~ü—¾Kì<Ú~ ìd¡ºmî]¶\G;¯}ík199i¦üÀº‡öMÿ‰Ž¹®Û=&7¾\ÎqœØt‚ÒY¢ÈëÎÅ\dÞcfœâf=ªk×í(×w]7vMù<ç®ëb¢"¼é¾Êa\½~…1Q¶æ,LçáU€‘˜ù ÀÖã£}ß÷»ûÅb1V.ò…:ep]7Ñð&¡ …Äñèºêµe…‘¡žw'v^þŸZ¯ Œ÷ˆ.×C­¯\Ï;n»ýé1¾p €øCÏ=÷n¿ýv­IMÛo·Û Ü`R"B¥)›©G묇, “«2ÕQ½š{0ÕQç2öÌíƒS:+@y;ÀœXTµe °+ꕟþô§ñàƒjÍyÚCš„¨úGÙªådë£S@Y ºú™\‘ê³Óðˆ|B¨n0ú3ÆpãΛà”Ä=ýP¨ 1 0 8vì>úÑâ¾ûîC¹\îËÈ ùMÕ%D ¡‚3Y@:߬²NÁt½^­›§è6ÕÔËe#ìbz~0­NN£ÞYJh³Õ.`ee‡ÂÑ£Gñè£vÁ ÍT«&tdd¤ Šjü*nxyNˆ¡8qp€sKÔJâ㞈›Kj¨Çbæ¿ò8–(”©›þÏÎ ¥aKqëå0}S "yÍbÉ÷!ƃív N  Òp0Y@ Ü|ó͘ššê RF¶‘À£c@’Á÷}ÌïÞ÷}øíàD`l‘6ààää 2…¸ P('.„Ä"b‡Båš!î#€çN>ˆóp‘ùAðt‰" îƒx¯¾¼Kê $mî÷âBqÉYÍPC£rÄAAD<üôœAØA¯ ¹¸O½¶ŽãOŸí¬./ßüa|v(Êå2|ßï ×fzÕHÞÊÀ‡>=‚mcM|çòv¼°4iþÅÞÌNæùÅ)œ¼Z…tºçezX÷pjÔ†‘Ì eF¸y¶‰’Kð8Ãù¥´<Ùœ#voXîÍ$VR½©è(Nì°z½‚SÂŽ©}8ûäÒÂñÓÏ8þ—¨m• ˆÕ¬ÓéÀqœ˜9—ã\Ù'v:®_>‘ßó½¾üL?xphçu¼pí:®„øÕcÀ›c#ÀþÙUœ¾ºŠ…zÚÌ6Þ¾s8¼(ºÀžm ðõ'Ñ&wí\fi<ÿ(?³›J&„}j1ê…ÀÍ;’×H\ßrCk]2Ô{±vS{i N<¨p›™×Q®6ôÜE¿N¤å¢Çà{W<üb 8z. C*À†Ý ÀK~º «:pE¤0Z¶¿x×)÷Õæ ­­T+O.+‚-¼IÄÍë>øõ:ðõ“À¶1à_¿¬×Ç.ç—B>úF "Ñòxš%>¨·EÙù)…}‘¹®\ÀßJ ›ÈÂÏ„õÊÄÏ¿°üã`ÏvàðÞ^D÷÷Ï —P.·íÚ<«=œœ]ߥ"0;‘"pUØ}œ)gI¼>”À$|MS'ÙpǮǀÛç›fÄáŽ<}A½m)lŽÀu’j¶…u€&×ÉwhžVOw@™åflé]Sª×”ø`††ûÖiàâðÝû™qñßW€Zp]àÖùþž€ Ì,pÝá‹K@À6™qÞ}¦Þ§6T ‹¤*‚£o ðõSÀr¸ç 0ZÑÀ‘ó#ààN R¼wgõß ! Ü9!"ƒÌþÛ"pfx²MøPXÌÚûM bßß{H€¿ Ë™» ¸u׋’-Öq`û˜°e¸Í|¨§]¡Q€¬ÂWGî$£»ÿnyÀc'€ñ²p  ±ùhñÅ É8—VÄþÌDªn¢À“,&š[©,@ççu®£Yªÿ^iBèÆiàŽÝÀÊ:pfQ€±—Ï÷!ðúZ ¨wĽcV`®*æ Û¦@9 ÐEvܰAøß'ίØ-Bħ/¾/¢„ñRFçØ®¬ˆTͱжìϨ˜ÜÅêÐ@Uà:A›„ÌÍà¿Ã8s øöyà5ûü§ñP‡v½¸!YËVÉq€íãÙ„‹b‹èý[Ídúðßß¹ \XLáù% Ña¬¼A†mƒ}±.ZdzL¸ƒÜ™@b–ÙÖb€Ì!  $Ê9ýûÅ8 ¬¶€»nV€8tCvJ5ÀæÀòº8µ}t¨_b6¶6 °À¬T°úGÊdí9D‚v`vXn€8QÎF©æØ®­‹È`ª"ÜÁ \Z=1`h\€š L›#`² ½YAý!t/¾qJø`/åo¹!#ÖBX ±Àôèà\Z=?÷êÿìrvÿϺٵøÅ–<ñ¼ÇÌWC+N©æ†ÐW€Z˜ÁÛõ›A1‡& ìçcúŸÀl „¾Ò¾u.l¸"N£TóD蜫ë DJ0×o«k}« /X×óõÂà}a xö¢8¾c˜*ohRÌ•–°@ÕÑ$¡Õ×oTLÀÌÿ¿h@Ÿñ³L°˜ÀAÛÙëbƒ5´©ƒ3˜: TQ‡#9à Í FƒE¹‡ƒšÿÈ °¸"E³ãÂç&ð ŠYk 0:U [:«À Ý^s¨9”`#„PÌ8ù!tðÌE‘±{ÙŽþžGè¸ÚÔðX±gqSCûŠl¦?6mÜe¹"ô€ W03ìœÌ‡úͪ˜ë-Àçbðj.—êè0¬ =ÌþÂÍ¡_\£Œ_± A^£q2)æj (ÂÁ*,Ã3eTL‚aʰäLà/ v\Ê¡VÀqÄ(bãøÁ¼º«µE–r¼œ{ª5T. K. ÍjDQÀf ôkuÁÕ€WÌ „ž ˜°­µWÌ*Øõô³½Õ À³¸S ب ›È¡ŸZvk´$h⾞¡Ç±@GäÆFrÈŸ">¨YI ´”b•r7¡×ÚÀÕš†#ŽHõ%ð>›L¯µ„â¹NN9 lDpî Ж J~F° ýôuaŠëmÁÌŒåÐuŠÙð„â•rp=9ņ¹ç²€ÁÔ\À&#ô¶\Zn˜N]öÍ£#ù"tí½ h´E4à8ºÑúëƒ*@!o õ~Ó¢YÒÂ6&P÷cí2P¼v *ãÅtm†’š€ãÏœœ}«ø‡Ç[pšhc(¶Q¬åI TÉh µ•V`´ TŠÀ¤`,Ã!h@6ýÑ}3€&ÐÖ Ñæ5·¿æ½¸÷Þ{syÎ9:|ßG½^ÇÕë—pþòIœ<û,ΜG«tâ9ŒÍJ£ÙëmÍŽ° O²¡,“(í6øJaƒ*@'+ l#ƒ<€“mŸ¼¿ÿ~ìß¿›½µZ-œ;wÏ;ŠGþþ ¸xáI´ÆObri-—î1 \“Zå&Xf³ÒÝmlµ4³ðY¢€øäP–­7H#‡Ž9Ò]§XÞöìÙƒÙÙÙØ±z½ŽãÇ­Q¹\F¡P@µZEµZE©Ô›oV.—qðàA`f!É“zcÆú–«>ØMbÙýN88–ÄÐîŽ œk4=àôúßâÙ'?Ï>¾ÛÙmxó¿ùIÜûºÀÔToUü¹¹9üÜ»þîyê øÈ'?€ «_BõF3F# ×6(^FBWƒ5†'¶>püáÉN;Ù¶„dPBÇv Æ ÌO KàÀùe`ïvÑCGÆ€éÝÀès¨Ýø%üÁ×Þ~ñmxèá¿I¬vvçß…ÿOàÕÕÿ‚•“q)ŒeË÷+lpüÃÖSÁ1A««}™–Œ±Y.ÌYàiÛ¥U‘0š›×jt€…U`϶xãÊÀôþ6Zû¾Šßþü;ñ¿ó~ÔjqBnzz¿øžá ‡ÄòÉ)#1Ű#ÅqôÏ%¤*‰IðÚ1–äNj¯ÉbЛWpqEŒˆÒ¶+-‘BÞ=%H¹|a˜ºu]øuüÒ‡KKK±k—J%üçŸy^àÝX9=j¼wÇVÆíƒ’Þ¥AC£i   $¢ƒ0M—÷DŽ´ \¯‹ž?_ÏÿS¿uÿ«Þäá9ïðþ_ÿy4ñ¨¬X,âÿ>Ü:úvÔ˜¶ž 8âfPâ¤&lù€RQ|Ú|Ó‚Ë1%`”ÛÌTÁ+˜à…eÁÕËã/­Š\~l–‘t‰ênŽSþŸácŸúHâ6•JïýOÿcKw#ðõ•j{bÀˆÃúË:æÂÜæíÒr™ÂGgãï§te›ž70Wë±pU°‹ËÀŽ ºé¶é›xèÛ€#G$ÎíÚµ ÷¿ñ}¨Ÿ«jëÉI +ºý%¡ NåfldO—Ç ÌÜÙðR ½Þ}5œå»K2û>J°kRšÿ/+¦”öÁÇ>ûÝ·¡ÈÛëïý!ì-½ÝwM)õlû@Éé f6ò«·x†7TÀ4'À†øuÊãXf d3“Y„®Ã€pzLäï£kv`qØeXrd8ß|GŽ|+q«R©„·¿ñgѸ<¥5çÑjõ…4þV+@êˆ Ý'íu,ÖI “$ÎÕÛbÇ\5žº]o  ¸c\EüÅWôk7ßõª»Qm¿àú{·)\ñ4#Î#œ+̪i¡£[Ê„XVçž ÈnçR¸òØìx¼ìrèy·&/RžN-<………$ûX.ãîÃßÚÕä? 1Óˆ¡È¸ƒ[î\™À,ëØ~wß V þFãXfê¦ Ýrñ d·I+…^¬‹lÞ¸f Ézé8Ž?¦½ï¿zÕµúz2ÀãBé¬ÄP¸¹Ã2$L7)ÄÖÃuçâ‹JeBYžÕ¨úPk WpäÓ¢ÿÄØÂÉŠˆ äK•ªMüÃÓho»wï^T:{U al#†ºLà MíÙiQ€VQÊ „õY€åBMv< Ükb!ˆ’ÂU¦€“gžÑÞ¯Z­bÛèðÛñÞ-÷pŸ’‚ÑÕÓaCž È j#ƒ>˜À,¦25»–‚38.×€Ér/*ˆ ù\_r1´\…°ÖZ@½®Ÿ¾¿oþ´×Íu x2ÔÔÖ“†$…úU_õf㘓Ï:º¬7†3š°Ôk qÅô±~ñö±ÐMÜ:ÖÖôLíÜÎýè4ìy 0Å ;¨ãôu½_}£ö:[ÈÚ€åJCp;&ôtn­*ð‚Evìƒß²÷pNék"q ¶Hä¦`€¬ÓÀ´I nh‹$"àWrD¨Z¡¦/FúT+@€&Nøà¶‰P°)OòðÇ19©_æòâY”Ê–Ûlæòà›¡6€—Æÿg"‹ú¸”.ÍUາ-_„Ó1fÀ ÉYÇ3*ÀÅ«§Q¬˜çfª¼÷od‹¬°lúEè,G&°O×Së­  ¹Œ—v`bbB{ßsN 2™Îõ§¼ï(°ÅùÑ ¤£cºˆ@«Hý |£ö>§¬ãrS„ˆÕQ ¹¼lïmÚ[®­­a¹qÅrßWËv†Î¨.@ö÷²"dáAè%‚42eID®8õ¼ú°~¦ò /¼ª\@ÑøfÍõÄäËŒ—òÁ!\1Ê(mÚgãs§‚û}C˜ü_y(™[ \ú†# ÖGY«W€yï><ðÓ&žÙ÷}üî~­éG±m\€?2D< 'Ýp@YîÍ0øˆà\‰ –±µåéáF̰IÝ2¦˜u—\¹Ì0³úVüÂý­õKDø?ú1Yø8Ææ}¸.P.ØëÉId–âzò²Ú›fY B;B(4ƒö’öÞ|}9KýÚùppíÄ8nòÞ‰¼ç÷177—þg>÷Çøóo~3/_'±0TÁM_©è 4Ö3‡YAy¸²Á~™CYøD’ çŠºÊæ1ÜïÇŒo„P’³r`—ïÀ[î~~ôGÞ‰r9Îë¶Ûm|üSÁCÏþ&fn¿ÒãH•‹áŒàÀ\J©[ó7 X5ÆÀÄ-G|f)þŸ¤ïh ÖXY&õ"‹ê)×TÝ€€Æ*P_A¹qî>ø&¼í'~ ûöíÓR½¿ÿ‰âXýO0sGL©{. S [Þç}†¸½ {àžÚãMkÉ€ÚãU·A’WÒ$M‘à5 ±œl£kçÍõòÕJ£Ú†÷"E#|n{ûæoÃ=ß÷fÜyø•رcGâzëëëxèá¿Æg¿ò›ð羉ÙCaý(tO’T}P¸(Aøü¬¦Iâà´¸_çëMed B\Aÿd¶k Àí…ŸÃá;_7Å·tkbI·ŸýÑ_Em=ɦ–Ü ÊåQŒV1]FµZÅÜÜœqx×òò2âoñg_þ],—ǶÛëp‹=¼ÂkĤ¼AÛ  ðwøJÏʤN W–|/ämþÓÜ€n< Ž 4‚ Ä"*ü†{ß”y­àB¡€7ÿпÝð3/--áÔó§ðµ'¾ˆ£ÇFsìLÝ²Ž™rÜ5Eð…)@’;‰ b×ðøŸuJ‚ÐúP(€-¶8´I"D~ðÈô³Ð2p÷åÍf­V.ì(Z­ˆívµZ õz‹×pìùÄÉ3Ïàzã4Z#ÏÃ^ÆäÀ˜ZO¹þ\Â,îÒ¢aæÄEt@¡ü‰ìž€`<Ÿ`°§àmËÀF›ëºÖ%äâ‰#¥×(ˆ?:=±øÃÏüW¿ÒÊ7lÅ‘¼  §@àn¶ ¿°‚òd€Ên RäwP&ê©T0r[ŽìÖ¤H& \ºêF Éøk¨¢€T‚éãëµ™X@¥+“@å®#±7¾qŒô×T£ÙãIsOdjŠÍ'CŒ)QD3’”€+þ?täY.@r@þÝ5ñÊÄ5 5Ô£¸Y%…']DŒ'`Ü QŠôDOUxx–äàc‚ÐÕ!ÚOPúê{ÿXRA(¤‚.¹¹h’ˆTÎ@¶åàÔ°OV5ˆ MÊJëbÑ©€SÏ$DB”ÂÌèÚª"‘¦çªnÊdˆ4Öˆ$´Ïž™Šß”ÅɯáªÿÖ¹ ÃD椉±±5ÑAÔÀ1¡“Ƭʂç=z9aaH£P7EdP:Xއh0ñÌq~døA Íß›¾ÅRóHð»\5ájÊÑK*ãæ‹84܃ÎI”lÒχn †ø:[µNºx—Œ¦9ù Ù”0ж0„i¢hü²gJOíúVEˆL£ r¦ó·jM¸µSJx)!¨®3•v–ñôª[ …Šfê¹ÞóøCmt  ß6Ð àú%y_§Šù'{¤q”»3$GîÝÄz”o—¡#Kn!é‰zÀN +Iƒd¥$>„Bt4¯Ú룷‰d4* [é pļ@ŠÀIÓ*Ū ™t(Õ ÈÊ(‡m¤Á Ò5™´R ž 1`d}h,€Ü{U“¯þ. ‰·l¨`’tïE'==ÌHq Š¿6a,YˆÜ ™Ë9Ið©ZUÕŠÉŠA0L5X297à‡ÚÀŸÎèB?ù}ƒÝl äohúîòRï‹ü7zwÁ«LÅ]SÌ| ép)\„¬À,9ö `þàï È]²ŽHg)Žú™Þ&TÁ ‰JÂOôÂ-’…¨#™Ô8œ)î’n@ [UÅ K8HЃÖƒ¿-dÓA ‰ì±…‰iÀÉ«<OúI$*BñÒ†{*DÙ•1¥>dO è8‚nªÀŽ0E½?êÅŽãh•‹|¿ü?“°6%£]ã’ãêfŠ˜i˜¾(`Ì`|(Eˆ¤Ï\Ê>>‘eäIzXnw}8²ëro–-€lòUS/c€H9ärà¹0¦kMnÀD%r,é¢RƱ!_¯ŸPº´úôs D?Ý,˜’ " 0=+„|;`$ÜȤËJ Z‚ Ê¿eÀ(‡VŒógËû›¢@Ó¹…D"HÃ× É¿“9öY,C}cÑÓGëµ|‰TNsÎ×8瓲ÈàO¼lŒ.€4á–ÉìÊH^éÝjÂ'†q¤òűTéìLID‘%Äcº$Ê`’Ù‚ÉÖ€øÌà€»"aG=Yƒj ‚Çè¸êebÆ Ï’&Äb¤•ÈÂF»¢èt*Á 0{½U7EdP’­Vß÷Ÿ$­“ÿSIDAT¢»ˆ¾ïƒ1¸,dÙÜ«. R¢°HëIc¢åøXÛë20iF"†ÅM¶$ )£×˜,ƒFÒêc;ß³z~^ ™ðwžçÅz±ÚÛuþ_Žòÿ‚ è6 qñ‰æKtg˳†e³ª;® óð“8Þ“ÔóÒï®;ʉ•¥>ÿÞ5¸Z¿è]½É"œ'ÊÑÐXß”}¾jT,ùyYT ЄBº˜"_SÖŽ˜¾Å<ôCÍLƒJHu~¦Ô‡ ÃÑÒÜ4ép’SÉlx€8A‹s^Ž|¸Ú«eЧÒÀ²ð£—NiÂ25„£¤0Á-×óÖHAƒÔ¡cL‘r hæùé(líø‡ðo#eÇ¡}ž§„¯E†«|ùxç‚ 8(‡rÏ—-€ïû‰@îý®ëÆIØ£˧zkTÊN+“©›ÂFi*XBˆFŠOsÌdÁÂÖuøv†%#ÏÕßòqÊ¢&a»šã±ßNçX¤²_×@‘Up]75Ć•!ž‚M€,%„3˜l„.)C†”›I¢Ÿ PÖH!©×G+¤(v«Ô.ã€)ÀÓ~'”¢ ¾`Q›2¸Dô7ëëëo)ÄkŽtü$ìèÕêœó.má†hëÔÅúûýe¤$“®ÍYL»)/cH9[# ÈcÛ= J½Mc|`ý:ÐYAíô7ðe‹pƒ”‡˜ ’Q㊑#$_[#sSò¹o®¯¯ÿšïû?S©Tf%î¿CD$YZ^^¾Ön·WÇÙ Í~”Vö8çÁÔ³Øj½Y¤„8RP3sÃwôé…K¶Ì” Ò¢QÙ¥DÖ­P ŸÏ6YDX;Ï-á™§ÿ ¿ MÉäs pË9¹Œ1‚f¡5Ðõx“+p2“ߦ.}”ußvL÷mKgõÈ:OnûN;fÛ—s23• Â^OYÂÄ8wáô±ŸõÓ¯p7*𠎥/…È¢$¼ÏOÐǾ¯ü7S—ç&÷lY˜FXÊ>ÓìÛŽe±Yž9M˜º^›0­†c\éݦ}.qJÁ”ç&°aÜLf?MèÌ iÊÐO¯&ƒÉ¦”óÈŸÉ|ûSUT uCžIEND®B`‚qstardict-qstardict-1.3/qstardict/qstardict.pro000066400000000000000000000077261323166163100221030ustar00rootroot00000000000000############################################################################# # qstardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = app TARGET = qstardict macx { TARGET = QStarDict } include(../qstardict.pri) FORMS += \ cssedit.ui \ mainwindow.ui \ settingsdialog.ui \ dictbrowsersearch.ui HEADERS += \ application.h \ cssedit.h \ dictbrowser.h \ dictcore.h \ ../plugins/dictplugin.h \ ../plugins/baseplugin.h \ ../plugins/trayplugin.h \ ../plugins/pluginserver.h \ ../plugins/metadata.h \ dictwidget.h \ keyboard.h \ mainwindow.h \ popupwindow.h \ resizablepopup.h \ selection.h \ settingsdialog.h \ speaker.h \ trayicon.h \ dictbrowsersearch.h \ pluginsview.h \ pluginsmodel.h \ pluginmanager.h \ appinfo.h \ util.h unix:isEmpty(NO_DBUS):HEADERS += \ dbusadaptor.h SOURCES += \ application.cpp \ cssedit.cpp \ dictbrowser.cpp \ dictcore.cpp \ dictwidget.cpp \ keyboard.cpp \ main.cpp \ mainwindow.cpp \ popupwindow.cpp \ resizablepopup.cpp \ selection.cpp \ settingsdialog.cpp \ speaker.cpp \ trayicon.cpp \ dictbrowsersearch.cpp \ pluginsview.cpp \ pluginsmodel.cpp \ pluginmanager.cpp \ appinfo.cpp \ util.cpp unix:isEmpty(NO_DBUS):SOURCES += \ dbusadaptor.cpp # From https://github.com/hluk/CopyQ/tree/92ec805b41bd097cbe523c08e320e3d32fc1c511 unix | win32 { DEFINES += BUILD_QXT_GUI QXT_DIR = .. INCLUDEPATH += $$QXT_DIR HEADERS += $$QXT_DIR/qxt/qxtglobal.h SOURCES += $$QXT_DIR/qxt/qxtglobal.cpp HEADERS += $$QXT_DIR/qxt/qxtglobalshortcut.h HEADERS += $$QXT_DIR/qxt/qxtglobalshortcut_p.h SOURCES += $$QXT_DIR/qxt/qxtglobalshortcut.cpp unix:!macx: SOURCES += $$QXT_DIR/qxt/qxtglobalshortcut_x11.cpp macx: SOURCES += $$QXT_DIR/qxt/qxtglobalshortcut_mac.cpp win32: SOURCES += $$QXT_DIR/qxt/qxtglobalshortcut_win.cpp greaterThan(QT_MAJOR_VERSION, 4): unix { QT += gui-private } } RESOURCES += \ pixmaps/pixmaps.qrc win32:RC_FILE += \ qstardict.rc DISTFILES += \ qstardict.png \ qstardict.desktop target.path = $$BIN_DIR INSTALLS += target # translations *has* go after current target (mac required) isEmpty(NO_TRANSLATIONS):include("translations/translations.pri") unix:!macx { desktop_icon.files = qstardict.png desktop_icon.path = $$INSTALL_PREFIX/share/pixmaps desktop_icon.files = qstardict.svg desktop_icon.path = $$INSTALL_PREFIX/share/icons/hicolor/scalable/apps desktop_file.files = qstardict.desktop desktop_file.path = $$INSTALL_PREFIX/share/applications INSTALLS += desktop_icon desktop_file } macx { ICON = pixmaps/qstardict.icns } qstardict-qstardict-1.3/qstardict/qstardict.rc000066400000000000000000000001101323166163100216630ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "pixmaps/qstardict.ico" qstardict-qstardict-1.3/qstardict/qstardict.svg000066400000000000000000002715211323166163100220760ustar00rootroot00000000000000 qstardict-qstardict-1.3/qstardict/resizablepopup.cpp000066400000000000000000000211531323166163100231210ustar00rootroot00000000000000/***************************************************************************** * resizablepopup.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "resizablepopup.h" #include #include #include #include #include namespace { const int CornerSize = 10; } namespace QStarDict { ResizablePopup::ResizablePopup(QWidget *parent) : QFrame(parent, Qt::Popup) { m_isMoving = false; m_resizeDirection = None; m_timeoutBeforeHide = 0; m_timerCloseId = 0; m_timerResizeId = 0; m_isPopuped = false; setMouseTracking(true); setLineWidth(1); setMidLineWidth(2); setFrameStyle(QFrame::Box); setFrameShadow(QFrame::Raised); } void ResizablePopup::popup() { if (m_defaultSize != size()) resize(m_defaultSize); QPoint newPosition = QCursor::pos() - QPoint(30, 30); if (newPosition.x() < 0) newPosition.setX(0); else if (newPosition.x() + width() > QApplication::desktop()->width()) newPosition.setX(QApplication::desktop()->width() - width()); if (newPosition.y() < 0) newPosition.setY(0); else if (newPosition.y() + height() > QApplication::desktop()->height()) newPosition.setY(QApplication::desktop()->height() - height()); move(newPosition); show(); m_isPopuped = true; } void ResizablePopup::enterEvent(QEvent*) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } } void ResizablePopup::leaveEvent(QEvent*) { if (geometry().contains(QCursor::pos())) return; if (m_resizeDirection) return; if (m_timeoutBeforeHide < 0) return; if (m_timeoutBeforeHide == 0) { m_isPopuped = false; hide(); } else if (! m_timerCloseId) m_timerCloseId = startTimer(m_timeoutBeforeHide); } void ResizablePopup::mouseMoveEvent(QMouseEvent *event) { Qt::CursorShape cursorShape = Qt::ArrowCursor; if ((event->x() >= 0 && event->x() < CornerSize && event->y() >= 0 && event->y() < CornerSize) || (event->x() < width() && event->x() >= width() - CornerSize && event->y() < height() && event->y() >= height() - CornerSize)) cursorShape = Qt::SizeFDiagCursor; else if ((event->x() < width() && event->x() >= width() - CornerSize && event->y() >= 0 && event->y() < CornerSize) || (event->x() >= 0 && event->x() < CornerSize && event->y() < height() && event->y() >= height() - CornerSize)) cursorShape = Qt::SizeBDiagCursor; else if ((event->x() >= 0 && event->x() < frameWidth()) || (event->x() < width() && event->x() >= width() - frameWidth())) cursorShape = Qt::SizeHorCursor; else if ((event->y() >= 0 && event->y() < frameWidth()) || (event->y() < height() && event->y() >= height() - frameWidth())) cursorShape = Qt::SizeVerCursor; if (cursor().shape() != cursorShape) setCursor(cursorShape); else if (event->buttons().testFlag(Qt::LeftButton)) { if (m_isMoving) move(pos() + (event->globalPos() - m_oldCursorPos)); m_oldCursorPos = event->globalPos(); return; } m_isMoving = false; } void ResizablePopup::mousePressEvent(QMouseEvent *event) { if (! geometry().contains(event->globalPos())) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } m_isPopuped = false; hide(); return; } if (event->buttons().testFlag(Qt::LeftButton)) { if (event->x() < CornerSize && event->y() < CornerSize) m_resizeDirection = TopLeft; else if (event->x() >= width() - CornerSize && event->y() < CornerSize) m_resizeDirection = TopRight; else if (event->x() < CornerSize && event->y() >= height() - CornerSize) m_resizeDirection = BottomLeft; else if (event->x() >= width() - CornerSize && event->y() >= height() - CornerSize) m_resizeDirection = BottomRight; else if (event->x() < frameWidth()) m_resizeDirection = Left; else if (event->x() >= width() - frameWidth()) m_resizeDirection = Right; else if (event->y() < frameWidth()) m_resizeDirection = Top; else if (event->y() >= height() - frameWidth()) m_resizeDirection = Bottom; else m_resizeDirection = None; if (m_resizeDirection) m_timerResizeId = startTimer(8); } m_isMoving = true; m_oldCursorPos = event->globalPos(); } void ResizablePopup::mouseReleaseEvent(QMouseEvent*) { stopResize(); } void ResizablePopup::mouseDoubleClickEvent(QMouseEvent*) { m_isPopuped = false; if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } hide(); } void ResizablePopup::timerEvent(QTimerEvent *event) { if (event->timerId() == m_timerResizeId) { doResize(); } else if (event->timerId() == m_timerCloseId) { m_isPopuped = false; hide(); killTimer(m_timerCloseId); m_timerCloseId = 0; stopResize(); } } void ResizablePopup::doResize() { if (! QApplication::mouseButtons().testFlag(Qt::LeftButton)) stopResize(); if (m_resizeDirection) { QRect newGeometry = geometry(); switch (m_resizeDirection) { case TopLeft: newGeometry.setTopLeft(QCursor::pos()); break; case TopRight: newGeometry.setTopRight(QCursor::pos()); break; case BottomLeft: newGeometry.setBottomLeft(QCursor::pos()); break; case BottomRight: newGeometry.setBottomRight(QCursor::pos()); break; case Left: newGeometry.setLeft(QCursor::pos().x()); break; case Right: newGeometry.setRight(QCursor::pos().x()); break; case Top: newGeometry.setTop(QCursor::pos().y()); break; case Bottom: newGeometry.setBottom(QCursor::pos().y()); break; default: ; // Nothing } if (newGeometry.width() < minimumSize().width()) { newGeometry.setWidth(width()); newGeometry.moveLeft(geometry().left()); } if (newGeometry.height() < minimumSize().height()) { newGeometry.setHeight(height()); newGeometry.moveTop(geometry().top()); } if (newGeometry != geometry()) setGeometry(newGeometry); } } void ResizablePopup::stopResize() { if (m_resizeDirection) { m_resizeDirection = None; killTimer(m_timerResizeId); m_timerResizeId = 0; } } bool ResizablePopup::event(QEvent *event) { if (event->type() == QEvent::WindowUnblocked && m_isPopuped) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } show(); return true; } else return QFrame::event(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/resizablepopup.h000066400000000000000000000071031323166163100225650ustar00rootroot00000000000000/***************************************************************************** * resizablepopup.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef RESIZABLEPOPUP_H #define RESIZABLEPOPUP_H #include class QEvent; class QMouseEvent; class QTimerEvent; namespace QStarDict { /** * The ResizablePopup widget is a resizable top-level window * without decorations. */ class ResizablePopup: public QFrame { Q_OBJECT public: /** * Construct a ResizablePopup widget. */ ResizablePopup(QWidget *parent = 0); /** * Return timeout before hiding after mouse leaving. */ int timeoutBeforeHide() const { return m_timeoutBeforeHide; } /** * Return a default size of new-shown popup. */ const QSize& defaultSize() const { return m_defaultSize; } public slots: /** * Set timeout before hiding after mouse leaving. */ void setTimeoutBeforeHide(int timeoutBeforeHide) { m_timeoutBeforeHide = timeoutBeforeHide; } /** * Set default size of new-shown popup. */ void setDefaultSize(const QSize &defaultSize) { m_defaultSize = defaultSize; } /** * Show popup under mouse cursor. */ void popup(); protected: void enterEvent(QEvent*); void leaveEvent(QEvent*); void mouseMoveEvent(QMouseEvent*); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseDoubleClickEvent(QMouseEvent*); void timerEvent(QTimerEvent*); bool event(QEvent *event); private: void stopResize(); void doResize(); enum ResizeDirection { None, Top, Bottom, Left, Right, TopLeft, TopRight, BottomLeft, BottomRight }; QPoint m_oldCursorPos; bool m_isMoving; QSize m_defaultSize; ResizeDirection m_resizeDirection; int m_timeoutBeforeHide; int m_timerCloseId; int m_timerResizeId; bool m_isPopuped; }; } #endif // RESIZABLEPOPUP_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/selection.cpp000066400000000000000000000053531323166163100220460ustar00rootroot00000000000000/***************************************************************************** * selection.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "selection.h" #ifdef Q_WS_WIN #include namespace { QString currentSelection() { POINT Point; HWND hWindow; DWORD dwStart, dwEnd; char szWindowText[256]; if (! GetCursorPos(&Point)) return QString(); if( ! (hWindow = WindowFromPoint(Point))) return QString(); SendMessage(hWindow, WM_GETTEXT, 256, (LPARAM)szWindowText); SendMessage(hWindow, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); return QString::fromLocal8Bit(szWindowText); } } #else // Q_WS_WIN #include #include namespace { inline QString currentSelection() { return QApplication::clipboard()->text(QClipboard::Selection); } } #endif // Q_WS_WIN namespace QStarDict { Selection::Selection(QObject *parent) : QObject(parent) { m_scan = false; m_timerId = 0; } void Selection::setScan(bool scan) { if (m_scan == scan) return; m_scan = scan; if (m_scan) { m_lastState = currentSelection(); m_timerId = startTimer(300); } else killTimer(m_timerId); } void Selection::timerEvent(QTimerEvent*) { if (m_lastState != currentSelection()) { m_lastState = currentSelection(); emit changed(m_lastState); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/selection.h000066400000000000000000000044401323166163100215070ustar00rootroot00000000000000/***************************************************************************** * selection.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SELECTION_H #define SELECTION_H #include class QTimerEvent; namespace QStarDict { /** * Mouse selection representation class. */ class Selection: public QObject { Q_OBJECT public: /** * Constructor. */ Selection(QObject *parent = 0); /** * Return scan state. */ bool isScan() const { return m_scan; } public slots: /** * Set scan mode. */ void setScan(bool scan); signals: /** * Emits when selection text is changed. */ void changed(const QString &newText); protected: void timerEvent(QTimerEvent*); private: QString m_lastState; int m_scan; int m_timerId; }; } #endif // SELECTION_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/settingsdialog.cpp000066400000000000000000000344541323166163100231050ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * Copyright (C) 2016 Sergey Il'inykh * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include #include #include #include #include #include #include "dictcore.h" #include "mainwindow.h" #include "popupwindow.h" #include "application.h" #include "speaker.h" #include "trayicon.h" #include "pluginsmodel.h" #include "pluginmanager.h" #include "qxt/qxtglobalshortcut.h" #include "../plugins/pluginserver.h" namespace { int toPercents(double value) { int integralValue = static_cast(value * 100.0); if (value * 100.0 - 0.5 > integralValue) ++integralValue; return integralValue; } } namespace QStarDict { SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) { setupUi(this); Application * const app = Application::instance(); DictCore *dict = app->dictCore(); m_oldPlugins = app->pluginManager()->loadedPlugins(); m_oldDicts = dict->loadedDicts(); m_dictPluginsModel = new PluginsModel(PluginsModel::JustDict, app->pluginManager()); m_miscPluginsModel = new PluginsModel(PluginsModel::ExceptDict, app->pluginManager()); pluginsTableView->setModel(m_dictPluginsModel); miscPluginsView->setModel(m_miscPluginsModel); pluginsTableView->configureColumns(); miscPluginsView->configureColumns(); m_dictsModel = new QStandardItemModel(this); m_dictsModel->setHorizontalHeaderLabels(QStringList() << tr("Enabled") << tr("Name") << tr("Plugin")); loadDictsList(); dictsTableView->setModel(m_dictsModel); dictsTableView->verticalHeader()->hide(); dictsTableView->setColumnWidth(0, 60); dictsTableView->setColumnWidth(1, 200); dictsTableView->setColumnWidth(2, 120); // Load global settings systemTrayBox->setChecked(app->trayIcon()->isVisible()); instantSearchBox->setChecked(app->mainWindow()->isInstantSearch()); speechCmdEdit->setText(app->speaker()->speechCmd()); #ifdef Q_OS_LINUX QFile desktop(QDir::homePath() + "/.config/autostart/qstardict.desktop"); if (desktop.open(QIODevice::ReadOnly) && QString(desktop.readAll()) .contains(QRegExp("\\bhidden\\s*=\\s*false", Qt::CaseInsensitive))) { autostartBox->setChecked(true); } #elif defined(Q_OS_WIN) QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Run", QSettings::NativeFormat); autostartBox->setChecked( reg.contains(QCoreApplication::applicationName())); #else autostartBox->setVisible(false); #endif // Load popup shortcut settings shortcutPopupEdit->setText(app->popupShortcut()->shortcut().toString()); shortcutPopupBox->setChecked(app->popupShortcut()->isEnabled()); // Load popup window settings PopupWindow *popup = app->popupWindow(); useScanBox->setChecked(popup->isScan()); if (popup->modifierKey()) { useScanModifierBox->setChecked(true); QString modifierName; switch (popup->modifierKey()) { case Qt::ShiftModifier: modifierName = "Shift"; break; case Qt::ControlModifier: modifierName = "Control"; break; case Qt::AltModifier: modifierName = "Alt"; break; case Qt::MetaModifier: modifierName = "Win"; break; } modifierKeyBox->setCurrentIndex(modifierKeyBox->findText(modifierName)); } showIfNotFoundBox->setChecked(popup->showIfNotFound()); popupOpacitySpin->setValue(toPercents(popup->windowOpacity())); timeoutBeforeHideSpin->setValue(popup->timeoutBeforeHide() / 1000.0); popupDefaultWidthSpin->setValue(popup->defaultSize().width()); popupDefaultHeightSpin->setValue(popup->defaultSize().height()); pronounceWordBox->setChecked(popup->pronounceWord()); // Load translations CSS QHash cssAliases; cssAliases["body"] = tr("All translation"); cssAliases["font.dict_name"] = tr("Dictionary name"); cssAliases["font.title"] = tr("Title"); cssAliases["font.explanation"] = tr("Explanation"); cssAliases["font.abbreviature"] = tr("Abbreviation"); cssAliases["font.example"] = tr("Example"); cssAliases["font.transcription"] = tr("Transcription"); apperanceCSSEdit->setElementsAliases(cssAliases); apperanceCSSEdit->setCSS(app->mainWindow()->defaultStyleSheet()); connect(m_dictPluginsModel, SIGNAL(loadedListChanged()), SLOT(dictLoadedPluginsChanged())); connect(pluginsTableView, SIGNAL(clicked(QModelIndex)), SLOT(pluginClicked(QModelIndex))); connect(miscPluginsView, SIGNAL(clicked(QModelIndex)), SLOT(pluginClicked(QModelIndex))); } void SettingsDialog::accept() { Application * const app = Application::instance(); // Save dicts and plugins settings DictCore *dict = app->dictCore(); //dict->setLoadedPlugins(m_dictPluginsModel->loadedPlugins() + m_miscPluginsModel->loadedPlugins()); app->trayIcon()->reinit(); QList loadedDicts; int rowCount = m_dictsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_dictsModel->item(i, 0)->checkState() == Qt::Checked) loadedDicts << DictCore::Dictionary(m_dictsModel->item(i, 2)->text(), m_dictsModel->item(i, 1)->text()); dict->setLoadedDicts(loadedDicts); // Save global settings app->trayIcon()->setVisible(systemTrayBox->isChecked()); app->mainWindow()->setInstantSearch(instantSearchBox->isChecked()); app->speaker()->setSpeechCmd(speechCmdEdit->text()); #ifdef Q_OS_LINUX QDir home = QDir::home(); if (!home.exists(".config/autostart")) { home.mkpath(".config/autostart"); } QFile desktopFile(QSTARDICT_INSTALL_PREFIX "/share/applications/qstardict.desktop"); if (desktopFile.open(QIODevice::ReadOnly)) { QByteArray contents = desktopFile.readAll(); QFile f(home.absolutePath() + "/.config/autostart/qstardict.desktop"); if (f.open(QIODevice::WriteOnly | QIODevice::Text)) { f.write(contents.trimmed()); f.write(QString("\nHidden=%1").arg(autostartBox->isChecked()? "false\n":"true\n").toUtf8()); } } #elif defined(Q_OS_WIN) QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Run", QSettings::NativeFormat); if(autostartBox->isChecked()) reg.setValue(QCoreApplication::applicationName(), '"' + QDir::toNativeSeparators(QCoreApplication:: applicationFilePath()) + '"'); else reg.remove(QCoreApplication::applicationName()); #endif // Save popup shortcut settings app->popupShortcut()->setShortcut(QKeySequence(shortcutPopupEdit->text())); app->popupShortcut()->setEnabled(shortcutPopupBox->isChecked()); // Save popup window settings PopupWindow *popup = app->popupWindow(); popup->setScan(useScanBox->isChecked()); int modifierKey = 0; if (useScanModifierBox->isChecked()) { if (modifierKeyBox->currentText() == "Shift") modifierKey = Qt::ShiftModifier; else if (modifierKeyBox->currentText() == "Control") modifierKey = Qt::ControlModifier; else if (modifierKeyBox->currentText() == "Alt") modifierKey = Qt::AltModifier; else if (modifierKeyBox->currentText() == "Win") modifierKey = Qt::MetaModifier; } popup->setShowIfNotFound(showIfNotFoundBox->isChecked()); popup->setModifierKey(modifierKey); popup->setWindowOpacity(popupOpacitySpin->value() / 100.0); popup->setTimeoutBeforeHide(static_cast(timeoutBeforeHideSpin->value() * 1000.0)); popup->setDefaultSize(QSize(popupDefaultWidthSpin->value(), popupDefaultHeightSpin->value())); popup->setPronounceWord(pronounceWordBox->isChecked()); // Save translations CSS app->mainWindow()->setDefaultStyleSheet(apperanceCSSEdit->css()); app->popupWindow()->setDefaultStyleSheet(apperanceCSSEdit->css()); if (! app->trayIcon()->isVisible()) app->mainWindow()->show(); app->mainWindow()->reload(); app->dictCore()->saveSettings(); app->mainWindow()->saveSettings(); app->trayIcon()->saveSettings(); app->popupWindow()->saveSettings(); QDialog::accept(); } void SettingsDialog::reject() { DictCore *dict = Application::instance()->dictCore(); Application::instance()->pluginManager()->setLoadedPlugins(m_oldPlugins); dict->setLoadedDicts(m_oldDicts); QDialog::reject(); } void SettingsDialog::loadDictsList() { int i; QList loadedDicts = Application::instance()->dictCore()->loadedDicts(); m_dictsModel->setRowCount(0); for (i = 0; i < loadedDicts.size(); ++i) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(Qt::Checked); m_dictsModel->setItem(i, 0, item); m_dictsModel->setItem(i, 1, new QStandardItem(loadedDicts[i].name())); m_dictsModel->setItem(i, 2, new QStandardItem(loadedDicts[i].plugin())); } QList dicts = Application::instance()->dictCore()->availableDicts(); for (QList::const_iterator iter = dicts.begin(); iter != dicts.end(); ++iter) { if (! loadedDicts.contains(*iter)) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(Qt::Unchecked); m_dictsModel->setItem(i, 0, item); m_dictsModel->setItem(i, 1, new QStandardItem(iter->name())); m_dictsModel->setItem(i, 2, new QStandardItem(iter->plugin())); ++i; } } } void SettingsDialog::on_dictsMoveUpButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow > 0) { m_dictsModel->insertRow(currentRow - 1, m_dictsModel->takeRow(currentRow)); dictsTableView->selectRow(currentRow - 1); } } void SettingsDialog::on_dictsMoveDownButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow < m_dictsModel->rowCount() - 1) { m_dictsModel->insertRow(currentRow + 1, m_dictsModel->takeRow(currentRow)); dictsTableView->selectRow(currentRow + 1); } } void SettingsDialog::on_dictsShowInfoButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow == -1) return; QString dict = m_dictsModel->item(currentRow, 1)->text(); QString plugin = m_dictsModel->item(currentRow, 2)->text(); DictPlugin::DictInfo info = Application::instance()->pluginManager()->plugin(plugin)->dictInfo(dict); QMessageBox::information(this, tr("Information about dictionary \"%1\"").arg(dict), tr("Name: %1
    ").arg(dict) + tr("Plugin: %1
    ").arg(plugin) + tr("Author: %1
    ").arg(info.author()) + tr("Words count: %1
    ").arg((info.wordsCount() == -1) ? tr("unknown") : QString::number(info.wordsCount())) + tr("Description: %1").arg(info.description())); } void SettingsDialog::pluginClicked(const QModelIndex &index) { QString id = index.data(PluginsModel::IdRole).toString(); if (index.column() == 2) {// settings auto plugin = Application::instance()->pluginManager()->plugin(id); if (plugin && plugin->execSettingsDialog(this) == QDialog::Accepted) { Application::instance()->dictCore()->reloadDicts(); loadDictsList(); } } if (index.column() == 3) { auto pm = Application::instance()->pluginManager(); DictPlugin *dplugin = pm->plugin(id); const PluginMetadata &md = pm->pluginDesc(id)->metadata; QStringList authors = md.authors; QMessageBox::information(this, tr("Information about %1 plugin").arg(md.name), tr("Name: %1
    ").arg(md.name) + tr("Version: %1
    ").arg(md.version) + tr("Authors: %1
    ").arg(authors.replaceInStrings("<", "<").replaceInStrings(">", ">").join(tr("
    "))) + (dplugin? tr("Can search similar words: %1
    ").arg(dplugin->features().testFlag(DictPlugin::SearchSimilar) ? tr("yes") : tr("no")) : "") + tr("Description: %1").arg(md.description)); } } void SettingsDialog::dictLoadedPluginsChanged() { DictCore *dict = Application::instance()->dictCore(); Application::instance()->pluginManager()->setLoadedPlugins(m_dictPluginsModel->loadedPlugins() + m_miscPluginsModel->loadedPlugins()); dict->reloadDicts(); loadDictsList(); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/settingsdialog.h000066400000000000000000000051051323166163100225410ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" #include "dictcore.h" class QStandardItemModel; class QStandardItem; namespace QStarDict { class MainWindow; class PluginsModel; /** * The settings dialog. */ class SettingsDialog: public QDialog, private Ui::SettingsDialog { Q_OBJECT public: /** * Construct new SettingsDialog widget with parent MainWindow. */ SettingsDialog(QWidget *parent = 0); void accept(); void reject(); private slots: void on_dictsMoveUpButton_clicked(); void on_dictsMoveDownButton_clicked(); void on_dictsShowInfoButton_clicked(); private slots: void loadDictsList(); void dictLoadedPluginsChanged(); void pluginClicked(const QModelIndex &index); private: QStringList m_oldPlugins; QList m_oldDicts; QStandardItemModel *m_dictsModel; PluginsModel *m_dictPluginsModel; PluginsModel *m_miscPluginsModel; }; } #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/settingsdialog.ui000066400000000000000000000556631323166163100227450ustar00rootroot00000000000000 QStarDict::SettingsDialog 0 0 530 516 QStarDict Settings 9 9 9 9 6 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false 0 Global settings Use system tray Start with system Instant search 6 0 0 0 0 Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Qt::Vertical 426 318 Dictionaries Dictionaries QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false Move up Up :/icons/arrow-up.png:/icons/arrow-up.png Move down Down :/icons/arrow-down.png:/icons/arrow-down.png Show information about dictionary Show info :/icons/dialog-information.png:/icons/dialog-information.png Qt::Horizontal 40 20 16777215 196 Plugins Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft QAbstractItemView::NoEditTriggers false Popup window 9 9 9 9 6 Behavior 9 9 9 9 6 true Show translation popup by shortcut 6 0 0 0 0 Pronounce the word 6 0 0 0 0 Timeout before hide after mouse over Don't hide sec 1 0.000000000000000 10.000000000000000 0.100000000000000 0.500000000000000 6 0 0 0 0 true Show only if modifier pressed false Alt Control Shift Win Scan selection true Show if word not found Apperance 9 9 9 9 6 6 0 0 0 0 Opacity % 1 100 100 6 0 0 0 0 Default width 96 9999 320 6 0 0 0 0 Default height 96 9999 240 Qt::Vertical 20 101 Apperance Misc Other Plugins Qt::NoPen false QStarDict::CSSEdit QWidget
    cssedit.h
    1
    QStarDict::PluginsView QTableView
    pluginsview.h
    instantSearchBox speechCmdEdit buttonBox tabWidget dictsTableView dictsMoveUpButton dictsMoveDownButton dictsShowInfoButton pluginsTableView useScanBox showIfNotFoundBox useScanModifierBox modifierKeyBox timeoutBeforeHideSpin pronounceWordBox popupDefaultWidthSpin popupDefaultHeightSpin popupOpacitySpin buttonBox accepted() QStarDict::SettingsDialog accept() 339 488 410 299 buttonBox rejected() QStarDict::SettingsDialog reject() 415 488 410 299 useScanModifierBox toggled(bool) modifierKeyBox setEnabled(bool) 188 216 433 217 shortcutPopupBox toggled(bool) shortcutPopupEdit setEnabled(bool) 125 145 135 175
    qstardict-qstardict-1.3/qstardict/speaker.cpp000066400000000000000000000045521323166163100215130ustar00rootroot00000000000000/***************************************************************************** * speaker.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "speaker.h" #include #include namespace QStarDict { Speaker::Speaker() { m_speechProcess = new QProcess; QSettings settings; m_speechCmd = settings.value("Speaker/speechCmd", "festival --tts").toString(); } Speaker::~Speaker() { QSettings settings; settings.setValue("Speaker/speechCmd", m_speechCmd); delete m_speechProcess; } void Speaker::speak(const QString &word) { if (m_speechCmd.isEmpty()) return; if (m_speechProcess->state() != QProcess::NotRunning) m_speechProcess->kill(); QString s = m_speechCmd; s.replace("%s", word); m_speechProcess->start(s, QIODevice::WriteOnly); if (! m_speechProcess->waitForStarted()) return; if (! m_speechCmd.contains("%s")) { m_speechProcess->write(word.toUtf8()); m_speechProcess->closeWriteChannel(); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/speaker.h000066400000000000000000000036471323166163100211640ustar00rootroot00000000000000/***************************************************************************** * speaker.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SPEAKER_H #define SPEAKER_H #include class QProcess; namespace QStarDict { class Speaker { public: Speaker(); virtual ~Speaker(); void speak(const QString &word); void setSpeechCmd(const QString &cmd) { m_speechCmd = cmd; } const QString &speechCmd() const { return m_speechCmd; } private: QString m_speechCmd; QProcess *m_speechProcess; }; } #endif // SPEAKER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/qstardict/translations/000077500000000000000000000000001323166163100220705ustar00rootroot00000000000000qstardict-qstardict-1.3/qstardict/translations/qstardict-bg_BG.ts000066400000000000000000000627471323166163100254140ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Запази превода HTML files (*.html, *.htm) Text files (*.txt) Search ТърÑи HTML files (*.html *.htm) Error Грешка Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Запази във файл Speak &word Prin&t translation QStarDict::MainWindow Ctrl+T About QStarDict За QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 ÐлекÑандър Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box ИзчиÑти полето за търÑене Clear ИзчиÑти Fuzzy query ÐеÑÑно търÑене Search ТърÑи Words list ЛиÑÑ‚ Ñ Ð´ÑƒÐ¼Ð¸ &File &Файл &Help &Помощ &Settings &ÐаÑтройки &Quit &Изход Ctrl+Q Ctrl+Q &About &За QStarDict About &Qt За &Qt &Configure QStarDict &ÐаÑтройка на QStarDict &Scan &Сканираща чаÑÑ‚ QStarDict &Help F1 QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings ÐаÑтройки на QStarDict Show information about dictionary Global settings Start with system Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Речници Move up Up Ðагоре Move down Down Ðадолу Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Главен прозорец Behavior Поведение Show translation popup by shortcut Pronounce the word Timeout before hide after mouse over Време, преди да Ñе Ñкрие, Ñлед поÑочване Ñ Ð¼Ð¸ÑˆÐºÐ°Ñ‚Ð° Don't hide Ðе крий sec Ñекунди Show only if modifier pressed Покажи, Ñамо ако модификатора е натиÑнат Alt Alt Control Control Shift Shift Win Win Scan selection Селективно Ñканиране Show if word not found Покажи, ако дума не е намерена Apperance Изглед Opacity ÐепрозрачноÑÑ‚ % % Default width Подразбираща Ñе ширина Default height Подразбираща Ñе виÑочина <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканираща чаÑÑ‚ &Configure QStarDict &ÐаÑтройка на QStarDict &Quit &Изход QStarDict: scanning is %1 enabled disabled qstardict-qstardict-1.3/qstardict/translations/qstardict-cs_CZ.ts000066400000000000000000000621521323166163100254430ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Uložit pÅ™eklad HTML files (*.html, *.htm) Text files (*.txt) Search Vyhledat HTML files (*.html *.htm) Error Chyba Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Uložit do souboru Speak &word Prin&t translation QStarDict::MainWindow Ctrl+T About QStarDict O aplikaci QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Vymazat pole pro vyhledávání Clear Vymazat Fuzzy query Fuzzy query Search Vyhledat Words list Seznam slov &File &Soubor &Help &NápovÄ›da &Settings &Nastavení &Quit &Konec Ctrl+Q Ctrl+Q &About &О aplikaci QStarDict About &Qt О &verzi Qt &Configure QStarDict &Nastavení QStarDict &Scan &Vyhledávat QStarDict &Help F1 QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Nastavení QStarDict Show information about dictionary Global settings Start with system Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Slovníky Move up Up Nahoru Move down Down Dolu Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Plovoucí okno Behavior Chování Show translation popup by shortcut Pronounce the word Vyslovit Timeout before hide after mouse over Za jakou dobu se zavÅ™e okno s pÅ™ekladem potom co kurzor opustí výbÄ›r Don't hide Neschovávat sec sek Show only if modifier pressed Zobrazit pouze pÅ™i stistku klávesy Alt Alt Control Control Shift Shift Win Win Scan selection Vyhledat výbÄ›r Show if word not found Zobrazit pokud se slovo nenajde Apperance Vzhled Opacity Sytost % % Default width Výchozí šířka Default height Výchozí výška <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Vyhledávat &Configure QStarDict &Nastavení QStarDict &Quit &Konec QStarDict: scanning is %1 enabled disabled qstardict-qstardict-1.3/qstardict/translations/qstardict-de_DE.ts000066400000000000000000000610671323166163100254060ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Vorschau Element Element Foreground Vordergrund Background Hintergrund Select element Element wählen Click to select color Klicken zur Farbauswahl #000000 #000000 Font Schriftart Size Größe Select font Schriftart wählen Select font size Schriftgröße wählen pt pt Bold Fett B B Italic Kursiv I I Underline Unterstrichen U U QStarDict::DictBrowser The word <b>%1</b> is not found. Das Wort <b>%1</b> wurde nicht gefunden. QStarDict::DictWidget Save translation Übersetzung speichern HTML files (*.html, *.htm) HTML-Dateien (*.html, *.htm) Text files (*.txt) Textdateien (*.txt) Search Suche HTML files (*.html *.htm) Error Fehler Cannot save translation as %1 Kann Übersetzung nicht als %1 speichern Go to &previous translation Gehe zur &nächsten Übersetzung Go to &next translation Gehe zur &vorherigen Übersetzung &Save to file In &Datei speichern Speak &word &Wort aussprechen Prin&t translation Übersetzung &drucken QStarDict::MainWindow Ctrl+T About QStarDict Über QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Qt-Version von StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Das Suchfeld leeren Clear Löschen Fuzzy query Ungenaue Suche Search Suche Words list Wörterliste &File &Datei &Help &Hilfe &Settings &Einstellungen &Quit &Beenden Ctrl+Q Strg+Q &About Über Q&StarDict About &Qt Über &Qt &Configure QStarDict QStarDict &konfigurieren &Scan &Scannen QStarDict &Help QStarDict &Hilfe F1 F1 QStarDict::SettingsDialog Enabled Aktiviert Name Name Plugin Plugin Information about dictionary "%1" Informationen zum Wörterbuch "%1" <b>Name:</b> %1<br> <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>Plugin:</b> %1<br> unknown unbekannt <b>Description:</b> %1 <b>Beschreibung:</b> %1 Information about %1 plugin Informationen zum Plugin "%1" <b>Version:</b> %1<br> <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <b>Autoren:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Kann ähnliche Wörter suchen:</b> %1<br> yes ja no nein QStarDict Settings QStarDicts Einstellungen Show information about dictionary Informationen zum Wörterbuch anzeigen Global settings Globale Einstellungen Start with system Instant search Sofortsuche Pronounce words using this command: Folgendes Kommando zur Aussprache verwenden: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Geben Sie das Kommando für das Ausspracheprogramm ein.<br>Falls das Kommando "%s" enthält, wird dies durch das Wort ersetzt, andernfalls wird das Wort auf die stdin des Sprachprozesses geschrieben. Dictionaries Wörterbücher Move up Nach oben Up Auf Move down Nach unten Down Ab Show info Informationen anzeigen Plugins Plugins Show information about plugin Informationen zum Plugin anzeigen Info Info Configure plugin Plugin konfigurieren Configure Konfigurieren Popup window Popup-Fenster Behavior Verhalten Show translation popup by shortcut Pronounce the word Spreche das Wort Timeout before hide after mouse over Zeitdauer bis zum Verschwinden nach Mouse Over Don't hide Nicht verstecken sec Sek. Show only if modifier pressed Nur zeigen falls Taste gedrückt Alt Alt Control Strg Shift Umschalt Win Win Scan selection Auswahl scannen Show if word not found Anzeigen falls Wort nicht gefunden Apperance Erscheinungsbild Opacity Opazität % % Default width Standardbreite Default height Standardhöhe <b>Author:</b> %1<br> <b>Autor:</b> %1<br> <b>Words count:</b> %1<br> <b>Enthaltene Wörter:</b> %1<br> All translation Alle Übersetzungen Dictionary name Wörterbuchname Title Titel Explanation Erläuterung Abbreviation Abkürzung Example Beispiel Transcription Abschrift Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Scannen &Configure QStarDict QStarDict &konfigurieren &Quit &Beenden QStarDict: scanning is %1 QStarDict: Scannen ist %1 enabled aktiviert disabled deaktiviert qstardict-qstardict-1.3/qstardict/translations/qstardict-es_ES.ts000066400000000000000000000604171323166163100254420ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. La palabra <b>%1</b> no ha sido encontrada. QStarDict::DictWidget Go to &previous translation Go to &next translation &Save to file &Guardar al archivo Prin&t translation &Imprimir Speak &word Pronunciar &palabra Search Buscar Save translation HTML files (*.html *.htm) HTML files (*.html, *.htm) Text files (*.txt) Error Error Cannot save translation as %1 QStarDict::MainWindow Ctrl+T About QStarDict Acerca de QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Limpiar el cuadro de búsqueda Clear Borrar Fuzzy query Search Buscar Words list &File &Archivo &Help &Ayuda &Settings &Configuración &Quit &Salir Ctrl+Q Ctrl+S &About &Acerca de About &Qt Acerca de &Qt &Configure QStarDict &Configurar QStarDict &Scan &Explorar QStarDict &Help QStarDict &Ayuda F1 F1 QStarDict::SettingsDialog Enabled Name Plugin Extension All translation Dictionary name Nombre del diccionario Title Título Explanation Explicación Abbreviation Abreviación Example Ejemplo Transcription Transcripción Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>Author:</b> %1<br> <b>Words count:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Configuración de QStarDict Global settings Configuraciones Generales Start with system Instant search Pronounce words using this command: Pronunciar palabras usando este comando: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Move up Subir Up Arriba Move down Bajar Down Abajo Show information about dictionary Mostrar información sobre el diccionario Show info Mostrar info Plugins Extensiones Show information about plugin Mostrar información sobre la extensión Info Info Configure plugin Configurar extensión Configure Configurar Popup window Ventana emergente Behavior Comportamiento Show translation popup by shortcut Pronounce the word Pronunciar la palabra Timeout before hide after mouse over Tiempo de espera antes de esconder el puntero del ratón Don't hide No ocultar sec seg Show only if modifier pressed Mostrar solo si el modificador está presionado Alt Alt Control Control Shift Shift Win Win Scan selection Escanear la selección Show if word not found Mostrar si la palabra no es encontrada Apperance Apariencia Opacity % % Default width Ancho predeterminado Default height Altura predeterminada Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Explorar &Configure QStarDict &Configurar QStarDict &Quit &Salir QStarDict: scanning is %1 enabled disabled qstardict-qstardict-1.3/qstardict/translations/qstardict-fr_FR.ts000066400000000000000000000616701323166163100254440ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Aperçu Element Élément Foreground Premier-plan Background Arrière-plan Select element Veuillez choisir un élément Click to select color Veuillez choisir une couleur #000000 Font Police Size Taille Select font Veuillez choisir une police Select font size Veuillez choisir une taille de police pt pt Bold Gras B G Italic Italique I I Underline Souligné U S QStarDict::DictBrowser The word <b>%1</b> is not found. Le mot <b>%1</b> est introuvable. QStarDict::DictWidget Save translation Sauvegarder la traduction HTML files (*.html, *.htm) fichier HTML (*.html, *.htm) Text files (*.txt) Fichiers textes (*.txt) Search Rechercher HTML files (*.html *.htm) Error Erreur Cannot save translation as %1 Écriture du fichier %1 impossible Go to &previous translation Page &précédente Go to &next translation Page &suivante &Save to file &Enregistrer sous... Speak &word &Prononcer le mot Prin&t translation &Imprimer la page QStarDict::MainWindow Ctrl+T About QStarDict à propos de QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - clone de StarDict pour Qt<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Alexandre Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Effacer Clear Effacer Fuzzy query Chercher les mots ressemblant Search Rechercher Words list Mots semblables &File &Fichier &Help &Aide &Settings &Configuration &Quit &Quitter Ctrl+Q Ctrl+Q &About À &propos About &Qt À &propos de &Qt &Configure QStarDict &Configurer QStarDict &Scan &Traduction au survol QStarDict &Help F1 QStarDict::SettingsDialog Enabled Activé Name Nom Plugin Extension Information about dictionary "%1" Information à propos du dictionnaire "%1" <b>Name:</b> %1<br> <b>Nom :</b> %1 <br> <b>Plugin:</b> %1<br> <b>Extension :</b> %1 <br> unknown inconnu <b>Description:</b> %1 <b>Description :</b> %1 Information about %1 plugin Information à propos de l'extension %1 <b>Version:</b> %1<br> <b>Version :</b> %1 <br> <b>Authors:</b> %1<br> <b>Auteurs :</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>Support des mots ressemblants :</b> %1<br> yes oui no non QStarDict Settings Configuration de QStarDict Show information about dictionary Afficher les information à propos du dictionnaire Global settings Paramètres généraux Start with system Instant search Recherche à la saisie Pronounce words using this command: Prononcer les mots en lançant la commande : Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Veuillez entrer la commande à executer pour la prononciation des mots. <br>Si la commande contient la chaine de caractère "%s", celle-ci sera remplacée par le mot à prononcer sinon le mot sera envoyé à la sortie standard du processus lancé (stdin). Dictionaries Dictionnaires Move up Monter Up Haut Move down Descendre Down Bas Show info Afficher les informations Plugins Extensions Show information about plugin Afficher les informations à propos de l'extension Info Informations Configure plugin Configurer l'extension Configure Configurer Popup window Traduction au survol Behavior Comportement Show translation popup by shortcut Pronounce the word Prononcer le mot Timeout before hide after mouse over durée à attendre avant de masquer la traduction Don't hide Ne pas masquer sec sec Show only if modifier pressed Afficher seulement si la touche suivante est enfoncée Alt Alt Control Control Shift Shift Win Win Scan selection Traduire les éléments sélectionnés Show if word not found Avertir si le mot est introuvable Apperance Apparence Opacity Opacité % % Default width Largeur par défaut Default height Hauteur par défaut <b>Author:</b> %1<br> <b>Auteur :</b> %1<br> <b>Words count:</b> %1<br> <b>Nombre de mots :</b> %1<br> All translation Style par défaut Dictionary name Nom du dictionnaire Title Titre Explanation Explication Abbreviation Abréviation Example Exemple Transcription Transcription Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Traduction au survol &Configure QStarDict &Configurer QStarDict &Quit &Quitter QStarDict: scanning is %1 L'option "traduction au survol" est %1 enabled activée disabled désactivée qstardict-qstardict-1.3/qstardict/translations/qstardict-he_IL.ts000066400000000000000000000610411323166163100254160ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview תצוגה מקדימה Element ×למנט Foreground רקע קדמי Background רקע ×חורי Select element בחר ×למנט Click to select color הקלק כדי לברור צבע #000000 Font גופן Size מידה Select font בחר גופן Select font size בחר מידת גופן pt points? Bold בולט B Italic נטוי I Underline קו תחתון U QStarDict::DictBrowser The word <b>%1</b> is not found. המילה <b>%1</b> ××™× ×” נמצ×ת. QStarDict::DictWidget Save translation שמור ×ª×¨×’×•× HTML files (*.html, *.htm) קבצי HTML â€(‎*.html, *.htm) Text files (*.txt) קבצי תמליל (‎*.txt) Search חפש HTML files (*.html *.htm) קבצי HTML â€(‎*.html *.htm) Error שגי××” Cannot save translation as %1 Go to &previous translation לך ×ל ×ª×¨×’×•× &×§×•×“× Go to &next translation לך ×ל ×ª×¨×’×•× &×‘× &Save to file &שמור ×ל קובץ Speak &word ×מור &מילה Prin&t translation ×”&דפס ×ª×¨×’×•× QStarDict::MainWindow Ctrl+T About QStarDict ×ודות QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> â€<b>QStarDict %1 </b> - גרס×ת Qt של StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> זכויות ×™×•×¦×¨×™× (C)†2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict %1 - QStarDict Clear the search box טהר ×ת תיבת החיפוש Clear טהר Fuzzy query ש××™×œ×ª× ×ž×˜×•×©×˜×©×ª Search חפש Words list רשימת מילה &File &קובץ &Help &עזרה &Settings &הגדרות &Quit ×™&צי××” Ctrl+Q &About &×ודות About &Qt ×ודות &Qt &Configure QStarDict &הגדר ×ת QStarDict &Scan &סרוק QStarDict &Help &עזרת QStarDict F1 QStarDict::SettingsDialog Enabled Name ×©× Plugin תוספת Information about dictionary "%1" מידע ×ודות מילון "%1" <b>Name:</b> %1<br> <b>ש×:</b> %1<br> <b>Plugin:</b> %1<br> <b>תוספת:</b> %1<br> unknown ×œ× ×™×“×•×¢×” <b>Description:</b> %1 <b>תי×ור:</b> %1 Information about %1 plugin מידע ×ודות תוספת %1 <b>Version:</b> %1<br> <b>גרס×:</b> %1<br> <b>Authors:</b> %1<br> <b>מחברי×:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes כן no ×œ× QStarDict Settings הגדרות QStarDict Show information about dictionary הצג מידע ×וודות מילון Global settings הגדרות גלובליות Start with system Instant search חיפוש מיידי Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries מילוניפ Move up ×”×–×– מעלה Up מעלה Move down ×”×–×– מטה Down מטה Show info הצג מידע Plugins תוספות Show information about plugin הצג מידע ×וודות תוספת Info מידע Configure plugin הגדר תוספת Configure הגדר Popup window חלון מוקפץ Behavior התנהגות Show translation popup by shortcut Pronounce the word השמע ×ת המילה Timeout before hide after mouse over Don't hide ×ל תסתיר sec Show only if modifier pressed Alt Control Shift Win Scan selection סרוק בחירה Show if word not found הצג ×× ×ž×™×œ×” ×œ× × ×ž×¦××” Apperance הופעה Opacity ×טימות % Default width רוחב משתמט Default height גובה משתמט <b>Author:</b> %1<br> <b>מחבר:</b> %1<br> <b>Words count:</b> %1<br> <b>ספירת מילי×:</b> %1<br> All translation כל ×”×ª×¨×’×•× Dictionary name ×©× ×ž×™×œ×•×Ÿ Title כותרת Explanation הסבר Abbreviation קיצור Example ×“×•×’×ž× Transcription תעתיק Use system tray השתמש במגש מערכת QStarDict::TrayIcon QStarDict &Scan &סרוק &Configure QStarDict &הגדר ×ת QStarDict &Quit ×™&צי××” QStarDict: scanning is %1 QStarDict: סריקה ×”×™× ×” %1 enabled מ×ופשרת disabled מנוטרלת qstardict-qstardict-1.3/qstardict/translations/qstardict-it_IT.ts000066400000000000000000000610751323166163100254550ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Anteprima Element Elemento Foreground Primo piano Background Sfondo Select element Seleziona elementi Click to select color Click per selezionare il colore #000000 #000000 Font Carattere Size Dimensione Select font Seleziona carattere Select font size Seleziona dimensione carattere pt pt Bold Grassetto B B Italic Corsivo I I Underline Sottolineato U U QStarDict::DictBrowser The word <b>%1</b> is not found. La parola <b>%1</b> non è stata trovata. QStarDict::DictWidget Save translation Salva la traduzione HTML files (*.html, *.htm) File HTML (*.html, *.htm) Text files (*.txt) File di testo (*.txt) Search Cerca HTML files (*.html *.htm) Error Errore Cannot save translation as %1 Non posso salvare la traduzione come %1 Go to &previous translation Vai alla traduzione &precedente Go to &next translation Vai alla traduzione s&uccessiva &Save to file &Salva come Speak &word Pronuncia f&rase Prin&t translation S&tampa traduzione QStarDict::MainWindow Ctrl+T About QStarDict Informazioni su QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Versione Qt di StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Cancella la ricerca Clear Cancella Fuzzy query Fuzzy query Search Cerca Words list Lista delle Frasi &File &File &Help &Aiuto &Settings &Impostazioni &Quit &Esci Ctrl+Q Ctrl+Q &About I&nformazioni su About &Qt Informazioni su &Qt &Configure QStarDict C&onfigura QStarDict &Scan &Cerca QStarDict &Help &Aiuto QStarDict F1 F1 QStarDict::SettingsDialog Enabled Attivato Name Nome Plugin Estensione Information about dictionary "%1" Informazione sul dizionario "%1" <b>Name:</b> %1<br> <b>Nome:</b> %1<br> <b>Plugin:</b> %1<br> <b>Estensione:</b> %1<br> unknown ignoto <b>Description:</b> %1 <b>Descrizione:</b> %1 Information about %1 plugin Informazione sull'estensione %1 <b>Version:</b> %1<br> <b>Versione:</b> %1<br> <b>Authors:</b> %1<br> <b>Autori:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Puoi cercare parole simili:</b> %1<br> yes si no no QStarDict Settings Impostazioni QStarDict Show information about dictionary Mostra informazioni sul dizionario Global settings Impostazioni globali Start with system Instant search Ricerca istantanea Pronounce words using this command: Pronuncia le parole usando questo comando: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Inserisci il comando per il programma di pronuncia.<br>Se il comando contiene "%s" la parola verrà sostituita, altrimenti la parola sarà scritta nello stdin del processo di pronuncia. Dictionaries Dizionari Move up Sposta in su Up Su Move down Sposta in giù Down Giù Show info Mostra informazioni Plugins Estensioni Show information about plugin Mostra informazioni sull'estensione Info Informazioni Configure plugin Configura estensione Configure Configura Popup window Finestra di popup Behavior Comportamento Show translation popup by shortcut Pronounce the word Pronuncia la parola Timeout before hide after mouse over Tempo di scomparsa dopo aver mosso il mouse Don't hide Non nascondere sec sec Show only if modifier pressed Mostra solo se si preme Alt Alt Control Control Shift Shift Win Win Scan selection Cerca selezione Show if word not found Mostra se la parola non viene trovata Apperance Aspetto Opacity Opacità % % Default width Ampiezza di default Default height Altezza di default <b>Author:</b> %1<br> <b>Autore:</b> %1<br> <b>Words count:</b> %1<br> <b>Conto parole:</b> %1<br> All translation Tutta la traduzione Dictionary name Nome del dizionario Title Titolo Explanation Spiegazione Abbreviation Abbreviazione Example Esempio Transcription Trascrizione Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Cerca &Configure QStarDict &Configura QStarDict &Quit &Esci QStarDict: scanning is %1 QStarDict: la ricerca è %1 enabled abilitato disabled disabilitato qstardict-qstardict-1.3/qstardict/translations/qstardict-lt_LT.ts000066400000000000000000000612021323166163100254530ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview PeržiÅ«ra Element Elementas Foreground Priekinis planas Background Fonas Select element Pasirinkite elementÄ… Click to select color Pasirinkite spalvÄ… #000000 #000000 Font Å riftas Size Dydis Select font Pasirinkite Å¡riftÄ… Select font size Pasirinkite Å¡rifto dydį pt taÅ¡kai Bold Pusjuodis B J Italic Kursyvas I K Underline Pabraukimas U P QStarDict::DictBrowser The word <b>%1</b> is not found. Žodis <b>%1</b> nerastas. QStarDict::DictWidget Save translation Ä®raÅ¡yti vertimÄ… HTML files (*.html, *.htm) HTML rinkmenos (*.html, *.htm) Text files (*.txt) Teksto rinkmenos (*.txt) Search IeÅ¡koti HTML files (*.html *.htm) Error Klaida Cannot save translation as %1 Vertimo nepavyko įraÅ¡yti į %1 Go to &previous translation &Ankstesnis vertimas Go to &next translation &Tolesnis vertimas &Save to file Ä®&raÅ¡yti į rinkmenÄ… Speak &word IÅ¡&tarti žodį Prin&t translation &Spausdinti puslapį QStarDict::MainWindow Ctrl+T About QStarDict Apie QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - StarDict versija Qt sÄ…sajai<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> AutorinÄ—s teisÄ—s (C) 2007-2009 Alexandre Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box IÅ¡valyti paieÅ¡kos laukelį Clear IÅ¡valyti Fuzzy query ApytikslÄ— paieÅ¡ka Search IeÅ¡koti Words list Žodžių sÄ…raÅ¡as &File &Rinkmena &Help &Pagalba &Settings &Nuostatos &Quit &Baigti Ctrl+Q Vald+Q &About &Apie About &Qt Apie &Qt &Configure QStarDict &KonfigÅ«ruoti QStarDict &Scan &Peržvelgimas QStarDict &Help QStarDict &pagalba F1 F1 QStarDict::SettingsDialog Enabled Ä®galinta Name Pavadinimas Plugin Papildinys Information about dictionary "%1" „%1“ – informacijÄ… apie žodynÄ… <b>Name:</b> %1<br> <b>Pavadinimas :</b> %1 <br> <b>Plugin:</b> %1<br> <b>PlÄ—tinys :</b> %1 <br> unknown nežinoma <b>Description:</b> %1 <b>ApraÅ¡ymas :</b> %1 Information about %1 plugin %1 – informacija apie papildinį <b>Version:</b> %1<br> <b>Versija :</b> %1 <br> <b>Authors:</b> %1<br> <b>Autoriai :</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Palaikoma panaÅ¡ių žožių paieÅ¡ka:</b> %1<br> yes taip no ne QStarDict Settings QStarDict nuostatos Show information about dictionary Rodyti informacijÄ… apie žodynÄ… Global settings Bendros nuostatos Start with system Instant search IeÅ¡koti vedant Pronounce words using this command: Žodžių tarimui naudoti komandÄ…: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Ä®veskite komandÄ…, naudojamÄ… žodžių iÅ¡tarimui.<br>Jei komanda turi reiÅ¡kinį „%s“, jis bus pakeistas iÅ¡tarsimu žodžiu, preiÅ¡ingu atveju žodis bus priraÅ¡ytas komandos gale (stdin). Dictionaries Žodynai Move up Kelti aukÅ¡tyn Up AukÅ¡tyn Move down Nuleisti žemyn Down Žemyn Show info Rodyti informacijÄ… Plugins Papildiniai Show information about plugin Rodyti informacijÄ… apie papildinį Info Informacija Configure plugin konfigÅ«ruoti papildinį Configure KonfigÅ«ruoti Popup window IÅ¡kylantis langas Behavior Elgsena Show translation popup by shortcut Pronounce the word IÅ¡tarti žodį Timeout before hide after mouse over Lango rodymo laikas po to, kai jį palieka pelÄ— Don't hide NeslÄ—pti sec s Show only if modifier pressed Rodyti tik nuspaudus modifikavimo klavišą Alt Alt Control Vald Shift Lyg2 Win Win Scan selection Peržvelgti pažymÄ—tus tekstus Show if word not found Rodyti ir neradus žodžio Apperance IÅ¡vaizda Opacity Dengiamumas % % Default width Numatytasis plotis Default height Numatytasis aukÅ¡tis <b>Author:</b> %1<br> <b>Autorius :</b> %1<br> <b>Words count:</b> %1<br> <b>Žodžių skaiÄius:</b> %1<br> All translation Numatytasis stilius Dictionary name Žodyno pavadinimas Title AntraÅ¡tÄ— Explanation ApibÅ«dinimas Abbreviation Santrumpa Example Pavyzdys Transcription Transkripcija Use system tray Naudoti sistemos dÄ—klÄ… QStarDict::TrayIcon QStarDict QStarDict &Scan &Peržvelgimas &Configure QStarDict &KonfigÅ«ruoti QStarDict &Quit &Baigti QStarDict: scanning is %1 Peržvelgimo parinktis: %1 enabled įgalinta disabled uždrausta qstardict-qstardict-1.3/qstardict/translations/qstardict-pl_PL.ts000066400000000000000000000616101323166163100254460ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview PodglÄ…d Element Element Foreground Pierwszy plan Background TÅ‚o Select element Wybierz element Click to select color Kliknij by wybrać kolor #000000 Font Czcionka Size Rozmiar Select font Wybierz czcionkÄ™ Select font size Wybierz rozmiar czionki pt Bold Pogrubiona B Italic PochyÅ‚a I Underline PodkreÅ›lona U QStarDict::DictBrowser The word <b>%1</b> is not found. SÅ‚owo <b>%1</b> nie zostaÅ‚o znalezione. QStarDict::DictWidget Save translation Zapisz tÅ‚umaczenie HTML files (*.html, *.htm) Pliki HTML (*.html, *.htm) Text files (*.txt) Pliki tekstowe (*.txt) Search Szukaj HTML files (*.html *.htm) Error Błąd Cannot save translation as %1 Nie mogÄ™ zapisać tÅ‚umaczenia jako %1 Go to &previous translation Idź do &poprzedniego tÅ‚umaczenia Go to &next translation Idź do &nastÄ™pnego tÅ‚umaczenia &Save to file &Zapisz do pliku Speak &word Wymów sÅ‚o&wo Prin&t translation Drukuj &tÅ‚umaczenie QStarDict::MainWindow Ctrl+T About QStarDict O QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - StarDict wersja QT<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Wyczyść okienko wyszukiwania Clear Wyczyść Fuzzy query MÄ™tne zapytanie Search Szukaj Words list Lista słów &File &Plik &Help &Pomoc &Settings &Ustawienia &Quit &Zamknij Ctrl+Q Ctrl+Q &About &O QStarDict About &Qt O &Qt &Configure QStarDict &Konfiguruj QStarDict &Scan &Skanuj Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> {2007-2009 ?} QStarDict &Help F1 QStarDict::SettingsDialog Enabled Włączone Name Nazwa Plugin Wtyczka Information about dictionary "%1" Informacja o sÅ‚owniku "%1" <b>Name:</b> %1<br> <b>ImiÄ™:</b> %1<br> <b>Plugin:</b> %1<br> <b>Wtyczka:</b> %1<br> unknown nieznany <b>Description:</b> %1 <b>Opis:</b> %1 Information about %1 plugin InformacjÄ™ o wtyczce %1 <b>Version:</b> %1<br> <b>Wersja:</b> %1<br> <b>Authors:</b> %1<br> <b>Autorzy:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Może wyszukać podobne sÅ‚owa:</b> %1<br> yes tak no nie QStarDict Settings Ustawienia QStarDict Show information about dictionary Pokaż informacje o sÅ‚owniku Global settings Globalne opcje Start with system Instant search BÅ‚yskawiczne szukanie Pronounce words using this command: Wymów sÅ‚owo używajÄ…c tego polecenia: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Wpisz komendÄ™ dla syntezatora mowy.<br>JeÅ›li komenda zawiera "%s" to bÄ™dzie ona zastÄ…piona sÅ‚owem lub sÅ‚owo zostanie zapisane do stdin procesu mówienia. Dictionaries SÅ‚owniki Move up PrzesuÅ„ w górÄ™ Up Góra Move down PrzesuÅ„ w dół Down Dół Show info Pokaż info Plugins Wtyczki Show information about plugin Pokaż informacje o wtyczce Info Info Configure plugin Konfiguruj wtyczkÄ™ Configure Konfiguruj Popup window Okno popup Behavior Zachowanie Show translation popup by shortcut Pronounce the word Wymów sÅ‚owo Timeout before hide after mouse over Opóźnienie zanim ukryje po najechaniu myszkÄ… Don't hide Nie ukrywaj sec sec Show only if modifier pressed Pokaż tylko jeÅ›li modyfikator zostanie naciÅ›niÄ™ty Alt Alt Control Control Shift Shift Win Win Scan selection Skanuj zaznaczenie Show if word not found Pokaż jeÅ›li sÅ‚owo nie zostaÅ‚o znalezione Apperance WyglÄ…d Opacity Nieprzezroczystość % % Default width DomyÅ›lna szerokość Default height DomyÅ›lna wysokość <b>Author:</b> %1<br> <b>Autor:</b> %1<br> <b>Words count:</b> %1<br> <b>Ilość słów:</b> %1<br> All translation Wszystkie tÅ‚umaczenia Dictionary name Nazwa sÅ‚ownika Title TytuÅ‚ Explanation WytÅ‚umaczenie Abbreviation Skrót Example PrzykÅ‚ad Transcription Transkrypcja Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Skanuj &Configure QStarDict &Konfiguruj QStarDict &Quit &Zamknij QStarDict: scanning is %1 enabled włączone disabled wyłączone qstardict-qstardict-1.3/qstardict/translations/qstardict-pt_BR.ts000066400000000000000000000616471323166163100254600ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Salvar tradução HTML files (*.html, *.htm) Text files (*.txt) Search Buscar HTML files (*.html *.htm) Error Erro Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Salvar para arquivo Speak &word Prin&t translation QStarDict::MainWindow Ctrl+T About QStarDict Sobre QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict %1 - QStarDict Clear the search box Limpar caixa de Busca Clear Limpar Fuzzy query Fuzzy Consulta Search Buscar Words list Lista de Palavras &File &Arquivo &Help &Ajuda &Settings &Configurações &Quit &Sair Ctrl+Q Ctrl+Q &About &Sobre About &Qt Sobre Qt &Configure QStarDict &Configurar QStarDict &Scan &Busca QStarDict &Help F1 QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Configurações QStarDict Show information about dictionary Global settings Start with system Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Dicionários Move up Up Cima Move down Down Baixo Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Janela Popup Behavior Comportamento Show translation popup by shortcut Pronounce the word Pronúciar esta palavra Timeout before hide after mouse over Esperar antes esconder depois de passar o mouse sobre Don't hide Não Esconder sec seg Show only if modifier pressed Mostrar somente com modificador pressionando Alt Alt Control Control Shift Shift Win Win Scan selection Buscar Seleção Show if word not found Mostrar as palavras não encontradas Apperance Aparencia Opacity Opacidade % % Default width Largura padrão Default height Altura Padrão <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription Use system tray QStarDict::TrayIcon QStarDict &Scan &Busca &Configure QStarDict &Configurar QStarDict &Quit &Sair QStarDict: scanning is %1 enabled disabled qstardict-qstardict-1.3/qstardict/translations/qstardict-ru_RU.ts000066400000000000000000000641451323166163100255020ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Предварительный проÑмотр Element Элемент Foreground Цвет шрифта Background Цвет фона Select element Выберите Ñлемент Click to select color Ðажмите чтобы выбрать Ñлемент #000000 #000000 Font Шрифт Size Размер Select font Выберите шрифт Select font size Выберите размер шрифта pt пт Bold Жирный B Ж Italic КурÑив I К Underline Подчеркнутый U П QStarDict::DictBrowser The word <b>%1</b> is not found. Слово <b>%1</b> не найдено. QStarDict::DictWidget Save translation Сохранить перевод HTML files (*.html, *.htm) HTML-файлы (*.html, *.htm) Text files (*.txt) ТекÑтовые файлы (*.txt) Search ПоиÑк HTML files (*.html *.htm) Файлы HTML (*.html *.htm) Error Ошибка Cannot save translation as %1 Ðевозможно Ñохранить перевод как %1 Go to &previous translation Перейти к &предыдущему переводу Go to &next translation Перейти к &Ñледующему переводу &Save to file &Сохранить в файл Speak &word П&роизнеÑти Ñлово Prin&t translation Ðапечата&ть перевод QStarDict::MainWindow Ctrl+T Ctrl+T About QStarDict О программе QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Qt-верÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 ÐлекÑандр Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box ОчиÑтить Ñтроку поиÑка Clear ОчиÑтить Fuzzy query Ðеточный Ð·Ð°Ð¿Ñ€Ð¾Ñ Search ПоиÑк Words list СпиÑок Ñлов &File &Файл &Help &Справка &Settings &ÐаÑтройки &Quit &Выход Ctrl+Q Ctrl+Q &About &О программе QStarDict About &Qt О &библиотеке Qt &Configure QStarDict &ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ &Scan &Сканировать QStarDict &Help &Справка по QStarDict F1 QStarDict::SettingsDialog Enabled Включен Name Ðазвание Plugin Плагин Information about dictionary "%1" Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñловаре "%1" <b>Name:</b> %1<br> <b>Ðазвание:</b> %1<br> <b>Plugin:</b> %1<br> <b>Плагин:</b> %1<br> unknown неизвеÑтно <b>Description:</b> %1 <b>ОпиÑание:</b> %1 Information about %1 plugin Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ плагине %1 <b>Version:</b> %1<br> <b>ВерÑиÑ:</b> %1<br> <b>Authors:</b> %1<br> <b>Ðвторы:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>ВозможноÑть иÑкать похожие Ñлова:</b> %1<br> yes еÑть no нет QStarDict Settings ÐаÑтройки QStarDict Show information about dictionary Показать информацию о Ñловаре Global settings Общие наÑтройки Start with system ЗапуÑкатьÑÑ Ð²Ð¼ÐµÑте Ñ ÑиÑтемой Instant search ПоиÑк при наборе Pronounce words using this command: ПроизноÑить Ñлова, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñƒ: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Введите команду Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка программы.<br>ЕÑли команда Ñодержит выражение "%s", оно будет заменено на Ñлово; иначе Ñлово будет запиÑано в Ñтандартный поток ввода процеÑÑа. Dictionaries Словари Move up ПеремеÑтить вверх Up Вверх Move down ПеремеÑтить вниз Down Вниз Show info Показывать информацию Plugins Плагины Show information about plugin Показать информацию о плагине Info Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Configure plugin ÐаÑтроить плагин Configure ÐаÑтроить Popup window Ð’Ñплывающее окно Behavior Поведение Show translation popup by shortcut Показывать вÑплывающее окно по горÑчей клавише Pronounce the word ПроизноÑить Ñлово Timeout before hide after mouse over Задержка перед Ñкрытием поÑле Ð¾Ñ‚Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸ Don't hide Ðе Ñкрывать sec Ñек Show only if modifier pressed Показывать только еÑли нажата клавиша-модификатор Alt Alt Control Control Shift Shift Win Win Scan selection Сканировать выделение Show if word not found Показывать еÑли Ñлово не найдено Apperance Внешний вид Opacity ÐепрозрачноÑть % % Default width Ширина по умолчанию Default height Ð’Ñ‹Ñота по умолчанию <b>Author:</b> %1<br> <b>Ðвтор:</b> %1<br> <b>Words count:</b> %1<br> <b>КоличеÑтво Ñлов:</b> %1<br> All translation ВеÑÑŒ перевод Dictionary name Ðазвание ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Title Заголовок Explanation ПоÑÑнение Abbreviation Ðббревиатура Example Пример ÑƒÐ¿Ð¾Ñ‚Ñ€ÐµÐ±Ð»ÐµÐ½Ð¸Ñ Ñлова Transcription ТранÑÐºÑ€Ð¸Ð¿Ñ†Ð¸Ñ Use system tray ИÑпользовать значок в ÑиÑтемном трее QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканировать &Configure QStarDict &ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ &Quit &Выход QStarDict: scanning is %1 QStarDict: Ñканирование %1 enabled включено disabled выключено qstardict-qstardict-1.3/qstardict/translations/qstardict-ua_UA.ts000066400000000000000000000663711323166163100254430ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Попередній переглÑд Element Елемент Foreground Передній план Background Задній план Select element Вибір елемента Click to select color Клік Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ кольору #000000 Font Шрифт Size Розмір Select font Вибір шрифту Select font size Вибір розміру шрифту pt Bold Жирний B Italic КурÑив I Underline ПідкреÑлений U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Зберегти переклад HTML files (*.html, *.htm) Text files (*.txt) Search Пошук HTML files (*.html *.htm) Error Помилка Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Зберегти в файл Speak &word Prin&t translation QStarDict::MainWindow Ctrl+T About QStarDict Про програму QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 ÐлекÑандр Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict Clear the search box ОчиÑтити Ñ€Ñдок пошуку Clear ПочиÑтити Fuzzy query Ðечiткий запит Search Пошук Words list СпиÑок Ñлiв &File &Файл &Help &Довiдка &Settings &ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Quit &Вихiд Ctrl+Q Ctrl+Q &About &Про програму QStarDict About &Qt Про &бiблiотеку Qt &Configure QStarDict &КонфiгурацiÑ &Scan &Сканувати QStarDict &Help F1 QStarDict::SettingsDialog Enabled Включено Name Ім'Ñ Plugin Плагін Information about dictionary "%1" Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñловник "%1" <b>Name:</b> %1<br> <b>Ім'Ñ:</b> %1<br> <b>Plugin:</b> %1<br> <b>Плагін:</b> %1<br> unknown невідомо <b>Description:</b> %1 <b>ОпиÑ:</b> %1 Information about %1 plugin Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ %1 плагін <b>Version:</b> %1<br> <b>ВерÑÑ–Ñ:</b> %1<br> <b>Authors:</b> %1<br> <b>Ðвтори:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>Шукати подібні Ñлова:</b> %1<br> yes Так no ÐÑ– QStarDict Settings ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ QStarDict Show information about dictionary Показати інформацію про Ñловник Global settings Глобальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Start with system Instant search Миттєвий пошук Pronounce words using this command: ВимовлÑти Ñлова, викориÑтовуючи цю команду: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Введіть команду Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ð¾Ð²Ð½Ð¾Ñ— програми. <br>Якщо команда міÑтить "%s" це буде замінено Ñловом, інaкше Ñлово буде запиÑано на stdin. Dictionaries Словники Move up Перейти вверх Up Уверх Move down Перейти вниз Down Вниз Show info Показати інформацію Plugins Плагіни Show information about plugin Показати інформацію про плагін Info Інфо Configure plugin Ðалаштувати плагін Configure ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Popup window Ð’iкно повiÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Behavior Поведiнка Show translation popup by shortcut Pronounce the word Вимовити Ñлово Timeout before hide after mouse over Затримка Ð¿Ñ€Ð¸Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿iÑÐ»Ñ "втечi" мишi з вiкна переклада Don't hide Ðе приховувати sec Ñек Show only if modifier pressed Показувати Ñ‚iльки Ñкщо натиÑнута клавiша-модифiкатор Alt Alt Control Control Shift Shift Win Win Scan selection Сканувати видiÐ»ÐµÐ½Ð½Ñ Show if word not found Показувати, Ñкщо Ñлово не знайдено Apperance Зовнiшнiй виглÑд Opacity ÐепрозорiÑть % % Default width Ширина за замовчуваннÑм Default height ВиÑота за замовчуваннÑм <b>Author:</b> %1<br> <b>Ðвтор:</b> %1<br> <b>Words count:</b> %1<br> <b>КількіÑть Ñлів:</b> %1<br> All translation Ð’ÑÑ– переклади Dictionary name Ім'Ñ Ñловника Title Заголовок Explanation ÐŸÑ€Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Abbreviation Ðбревіатури Example Приклад Transcription ТранÑÐºÑ€Ð¸Ð¿Ñ†Ñ–Ñ Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканувати &Configure QStarDict &КонфiгурацiÑ &Quit &Вихiд QStarDict: scanning is %1 enabled disabled qstardict-qstardict-1.3/qstardict/translations/qstardict-zh_CN.ts000066400000000000000000000603161323166163100254430ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview 预览 Element 元素 Foreground 剿™¯ Background 背景 Select element 选择元素 Click to select color 点击以选择 #000000 #000000 Font 字体 Size å¤§å° Select font 选择字体 Select font size é€‰æ‹©å­—ä½“å¤§å° pt pt Bold 黑体 B B Italic 斜体 I I Underline 下划线 U U QStarDict::DictBrowser The word <b>%1</b> is not found. 找ä¸åˆ°å•è¯ <b>%1</b> QStarDict::DictWidget Save translation ä¿å­˜ç¿»è¯‘ HTML files (*.html, *.htm) HTML文件(*.html, *.htm) Text files (*.txt) 文本文件 Search æœç´¢ HTML files (*.html *.htm) Error 错误 Cannot save translation as %1 ä¸èƒ½å°†ç¿»è¯‘ä¿å­˜ä¸º %1 Go to &previous translation å‰å¾€å‰ä¸€ç¿»è¯‘ (&p) Go to &next translation å‰å¾€åŽä¸€ç¿»è¯‘ (&n) &Save to file ä¿å­˜åˆ°æ–‡ä»¶(&S) Speak &word 读出å•è¯(&w) Prin&t translation 打å°ç¿»è¯‘(&t) QStarDict::MainWindow Ctrl+T About QStarDict 关于 QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> ç‰ˆæƒ (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box 清除æœç´¢æ¡† Clear 清除 Fuzzy query 模糊查询 Search æœç´¢ Words list è¯æ±‡åˆ—表 &File 文件(&F) &Help 帮助(&H) &Settings 设置(&S) &Quit 离开(&Q) Ctrl+Q Ctrl+Q &About 关于(&A) About &Qt 关于Qt(&Q) &Configure QStarDict 设置(&C) &Scan å–è¯(&S) Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> ç‰ˆæƒ (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> {2007-2009 ?} QStarDict &Help 帮助(&H) F1 QStarDict::SettingsDialog Enabled å¯ç”¨ Name åç§° Plugin æ’ä»¶ Information about dictionary "%1" å­—å…¸"%1" çš„ä¿¡æ¯ <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>æ’件:</b> %1<br> unknown 未知 <b>Description:</b> %1 <b>æè¿°ï¼š</b> %1 Information about %1 plugin 关于æ’ä»¶ %1 çš„ä¿¡æ¯ <b>Version:</b> %1<br> <b>版本:</b> %1<br> <b>Authors:</b> %1<br> <b>作者:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>å¯ä»¥æœç´¢ç›¸ä¼¼å•è¯ï¼š</b> %1<br> yes 是 no å¦ QStarDict Settings QStarDict 设置 Show information about dictionary æ˜¾ç¤ºå­—å…¸ä¿¡æ¯ Global settings 全局设置 Use system tray Start with system Instant search 峿œ Pronounce words using this command: 使用如下命令å‘音 Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries å­—å…¸ Move up 上移 Up 上 Move down 下移 Down 下 Show info æ˜¾ç¤ºä¿¡æ¯ Plugins æ’ä»¶ Show information about plugin 显示æ’ä»¶ä¿¡æ¯ Info ä¿¡æ¯ Configure plugin 设定æ’ä»¶ Configure 设定 Popup window å¼¹å‡ºçª—å£ Behavior 行为 Show translation popup by shortcut Pronounce the word å•è¯å‘音 Timeout before hide after mouse over 鼠标悬åœéšè—è¶…æ—¶ Don't hide ä¸éšè— sec ç§’ Show only if modifier pressed 显示,仅当按下 Alt Alt Control Control Shift Shift Win Win Scan selection 选择区å–è¯ Show if word not found å½“æœªæ‰¾åˆ°è¯æ—¶æ˜¾ç¤º Apperance 外观 Opacity ä¸é€æ˜Žåº¦ % % Default width 默认宽度 Default height 默认高度 <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation 所有的翻译 Dictionary name å­—å…¸åç§° Title 标题 Explanation Abbreviation 缩写 Example ä¾‹å­ Transcription QStarDict::TrayIcon QStarDict QStarDict &Scan å–è¯(&S) &Configure QStarDict 设置 QStarDict(&C) &Quit 离开(&Q) QStarDict: scanning is %1 enabled disabled qstardict-qstardict-1.3/qstardict/translations/qstardict-zh_TW.ts000066400000000000000000000371461323166163100255020ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview é è¦½ Element 元素 Foreground 剿™¯ Background 背景 Select element é¸å–元素 Click to select color 點é¸è‰²å½© #000000 #000000 Font å­—åž‹ Size å¤§å° Select font é¸å–å­—åž‹ Select font size é¸å–å­—åž‹å¤§å° pt pt Bold ç²—é«” B B Italic 斜體 I I Underline 底線 U U QStarDict::DictBrowser The word <b>%1</b> is not found. 找ä¸åˆ°å–®å­— <b>%1</b> QStarDict::DictWidget Save translation 儲存翻譯 HTML files (*.html, *.htm) HTML檔案(*.html, *.htm) Text files (*.txt) 文字檔 Error 錯誤 Cannot save translation as %1 無法將翻譯儲存為 %1 Go to &previous translation å‰ä¸€å€‹ç¿»è­¯ (&p) Go to &next translation 後一個翻譯 (&n) &Save to file 儲存到檔案(&S) Speak &word 讀出單字 (&w) Prin&t translation 列å°ç¿»è­¯(&t) HTML files (*.html *.htm) Search æœå°‹ QStarDict::MainWindow About QStarDict 關於 QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> 版權 (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box 清除æœå°‹æ¡† Clear 清除 Fuzzy query 模糊查詢 Search æœå°‹ Words list 字彙清單 &File 檔案(&F) &Help 說明(&H) &Settings &設定 &Quit 離開(&Q) Ctrl+Q Ctrl+Q &About 關於(&A) About &Qt 關於 Qt &Configure QStarDict 設定 QStarDict(&C) &Scan å–詞(&S) QStarDict &Help QStarDict 說明(&H) F1 Ctrl+T QStarDict::SettingsDialog Enabled 啟用 Name å稱 Plugin å¤–æŽ›ç¨‹å¼ Information about dictionary "%1" å­—å…¸"%1" 的資訊 <b>Name:</b> %1<br> <b>å­—å…¸å稱:</b> %1<br> <b>Plugin:</b> %1<br> <b>外掛程å¼ï¼š</b> %1<br> unknown 未知 <b>Description:</b> %1 <b>說明:</b> %1 Information about %1 plugin é—œæ–¼å¤–æŽ›ç¨‹å¼ %1 的資訊 <b>Version:</b> %1<br> <b>版本:</b> %1<br> <b>Authors:</b> %1<br> <b>作者:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>å¯ä»¥æœå°‹ç›¸ä¼¼å–®å­—:</b> %1<br> yes 是 no å¦ QStarDict Settings QStarDict 設定 Show information about dictionary 顯示字典資訊 Global settings 全域設定 Instant search 峿™‚æœå°‹ Pronounce words using this command: 使用如下指令發音 Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries å­—å…¸ Move up 上移 Up 上 Move down 下移 Down 下 Show info 顯示資訊 Plugins å¤–æŽ›ç¨‹å¼ Show information about plugin 顯示外掛程å¼è³‡è¨Š Info 資訊 Configure plugin è¨­å®šå¤–æŽ›ç¨‹å¼ Configure 設定 Popup window 快顯視窗 Behavior 行為 Pronounce the word 單字發音 Timeout before hide after mouse over 滑鼠懸åœéš±è—逾時 Don't hide ä¸éš±è— sec ç§’ Show only if modifier pressed 顯示,僅當按下 Alt Alt Control Control Shift Shift Win Win Scan selection é¸å–å€å–詞 Show if word not found 當未找到字時顯示 Apperance 外觀 Opacity ä¸é€æ˜Žåº¦ % % Default width é è¨­å¯¬åº¦ Default height é è¨­é«˜åº¦ <b>Author:</b> %1<br> <b>作者:</b> %1<br> <b>Words count:</b> %1<br> <b>單字數:</b> %1<br> All translation 所有的翻譯 Dictionary name å­—å…¸å稱 Title 標題 Explanation Abbreviation 縮寫 Example 範例 Transcription Use system tray Start with system Show translation popup by shortcut QStarDict::TrayIcon QStarDict QStarDict &Scan å–詞(&S) &Configure QStarDict 設定 QStarDict(&C) &Quit 離開(&Q) QStarDict: scanning is %1 QStarDict: å–詞已%1 enabled 啟用 disabled åœç”¨ qstardict-qstardict-1.3/qstardict/translations/translations.pri000066400000000000000000000056571323166163100253420ustar00rootroot00000000000000############################################################################# # translations.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008-2009 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TRANSLATIONS += \ translations/qstardict-bg_BG.ts \ translations/qstardict-cs_CZ.ts \ translations/qstardict-de_DE.ts \ translations/qstardict-es_ES.ts \ translations/qstardict-fr_FR.ts \ translations/qstardict-it_IT.ts \ translations/qstardict-lt_LT.ts \ translations/qstardict-pl_PL.ts \ translations/qstardict-pt_BR.ts \ translations/qstardict-ru_RU.ts \ translations/qstardict-ua_UA.ts \ translations/qstardict-zh_CN.ts \ translations/qstardict-zh_TW.ts # from https://github.com/Arora/arora/blob/e310d632e9f6c135c376576d2d466af03fd219ee/src/locale/locale.pri isEmpty(QMAKE_LRELEASE) { win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease unix { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt4 } } else { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } } # from https://github.com/Arora/arora/blob/e310d632e9f6c135c376576d2d466af03fd219ee/src/locale/locale.pri updateqm.input = TRANSLATIONS updateqm.output = translations/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE -silent ${QMAKE_FILE_IN} -qm translations/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm isEmpty(NO_TRANSLATIONS) { translations.CONFIG += no_check_exist for(t, TRANSLATIONS) { t ~= "s/^(.+).ts$/\\1.qm" translations.files += $$t DISTFILES += $$t # For what? } translations.path = $$TRANSLATIONS_DIR INSTALLS += translations } qstardict-qstardict-1.3/qstardict/trayicon.cpp000066400000000000000000000205511323166163100217060ustar00rootroot00000000000000/***************************************************************************** * trayicon.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "trayicon.h" #include #include #include #include #include "application.h" #include "mainwindow.h" #include "popupwindow.h" #include "settingsdialog.h" #include "pluginmanager.h" namespace QStarDict { TrayIconDefaultImpl::TrayIconDefaultImpl(QObject *parent) : QObject(parent), sti(0), associatedWidget(0), actionMainWindow(0) { } TrayIconDefaultImpl::~TrayIconDefaultImpl() { uninitTray(); } TrayIconPlugin::TrayCompat TrayIconDefaultImpl::isDECompatible() { return TrayIconPlugin::CompatFallback; } void TrayIconDefaultImpl::initTray() { sti = new QSystemTrayIcon(this); actionMainWindow = new QAction(tr("Show &main window"), sti); connect(sti, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(on_activated(QSystemTrayIcon::ActivationReason))); } void TrayIconDefaultImpl::uninitTray() { if (sti) { sti->hide(); delete sti->contextMenu(); sti->setParent(0); delete sti; sti = 0; } } TrayIconPlugin::Features TrayIconDefaultImpl::features() const { return ClipoardTranslate; } void TrayIconDefaultImpl::setContextMenu(QMenu *menu) { menu->insertAction(menu->actions()[0], actionMainWindow); QAction *actionQuit = new QAction(QIcon(":/icons/application-exit.png"), tr("&Quit"), menu); connect(actionQuit, SIGNAL(triggered()), Application::instance(), SLOT(quit())); menu->addAction(actionQuit); sti->setContextMenu(menu); } void TrayIconDefaultImpl::setMainWindow(QWidget *w) { associatedWidget = w; connect(actionMainWindow, SIGNAL(triggered(bool)), w, SLOT(show())); } void TrayIconDefaultImpl::setScanEnabled(bool enabled) { QIcon icon(enabled ? ":/icons/qstardict.png" : ":/icons/qstardict-disabled.png"); sti->setIcon(icon); sti->setToolTip(tr("QStarDict: scanning is %1").arg(enabled ? tr("enabled") : tr("disabled"))); } void TrayIconDefaultImpl::setVisible(bool visible) { sti->setVisible(visible); } bool TrayIconDefaultImpl::isVisible() const { return sti->isVisible(); } void TrayIconDefaultImpl::on_activated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: associatedWidget->setVisible(!associatedWidget->isVisible()); break; case QSystemTrayIcon::MiddleClick: emit translateClipboard(); break; default: ; // nothing } } TrayIcon::TrayIcon(QObject *parent) : QObject(parent), _mainWindow(0), _trayImpl(0) { _initTrayTimer = new QTimer(this); _initTrayTimer->setSingleShot(true); _initTrayTimer->setInterval(100); connect(_initTrayTimer, SIGNAL(timeout()), SLOT(reinit())); connect(Application::instance()->pluginManager(), SIGNAL(pluginLoaded(QString)), SLOT(on_pluginLoaded(QString))); _defaultTrayImpl = new TrayIconDefaultImpl(this); reinit(); } TrayIcon::~TrayIcon() { saveSettings(); } void TrayIcon::reinit() { if (_trayImpl) { qobject_cast(_trayImpl)->uninitTray(); } _trayCandidat.clear(); _trayFallbackCandidat.clear(); foreach (const QString &plugin, Application::instance()->pluginManager()->loadedPlugins()) { auto tip = Application::instance()->pluginManager()->plugin(plugin); if (tip) { QObject *o = Application::instance()->pluginManager()->plugin(plugin); connect(o, SIGNAL(destroyed(QObject*)), SLOT(on_trayImplDestroyed(QObject*)), Qt::UniqueConnection); switch (tip->isDECompatible()) { case TrayIconPlugin::CompatFull: _trayCandidat.append(o); break; case TrayIconPlugin::CompatFallback: _trayFallbackCandidat.append(o); break; case TrayIconPlugin::CompatNone: default: break; } } } _trayFallbackCandidat.append(_defaultTrayImpl); QMenu *trayMenu = new QMenu(tr("QStarDict")); QAction *actionScan = new QAction(QIcon(":/icons/edit-select.png"), tr("&Scan"), trayMenu); actionScan->setCheckable(true); actionScan->setChecked(Application::instance()->popupWindow()->isScan()); connect(actionScan, SIGNAL(toggled(bool)), Application::instance()->popupWindow(), SLOT(setScan(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), actionScan, SLOT(setChecked(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), SLOT(setScanEnabled(bool))); trayMenu->addAction(actionScan); QAction *actionSettings = new QAction(QIcon(":/icons/configure.png"), tr("&Configure QStarDict"), trayMenu); connect(actionSettings, SIGNAL(triggered()), SLOT(on_actionSettings_triggered())); trayMenu->addAction(actionSettings); if (_trayCandidat.count()) { _trayImpl = _trayCandidat[0]; } else { _trayImpl = _trayFallbackCandidat[0]; } TrayIconPlugin *tip = qobject_cast(_trayImpl); tip->initTray(); tip->setContextMenu(trayMenu); if (_mainWindow) { tip->setMainWindow(_mainWindow); } setScanEnabled(Application::instance()->popupWindow()->isScan()); if (tip->features() & TrayIconPlugin::ClipoardTranslate) { connect(_trayImpl, SIGNAL(translateClipboard()), SLOT(translateClipboard())); } loadSettings(); } void TrayIcon::on_pluginLoaded(const QString &pluginId) { auto p = Application::instance()->pluginManager()->plugin(pluginId); if (p && p->isDECompatible()) { // it could be better alternative. start reinit _initTrayTimer->start(); } } void TrayIcon::on_trayImplDestroyed(QObject *o) { _trayCandidat.removeOne(o); _trayFallbackCandidat.removeOne(o); if (o == _trayImpl) { _trayImpl = 0; _initTrayTimer->start(); } } void TrayIcon::translateClipboard() { Application::instance()->popupWindow()->showTranslation(Application::clipboard()->text(QClipboard::Selection)); } void TrayIcon::on_actionSettings_triggered() { SettingsDialog dialog(Application::instance()->mainWindow()); dialog.exec(); } void TrayIcon::setScanEnabled(bool enabled) { qobject_cast(_trayImpl)->setScanEnabled(enabled); } void TrayIcon::saveSettings() { QSettings config; config.setValue("TrayIcon/visible", isVisible()); } void TrayIcon::setMainWindow(QWidget *w) { _mainWindow = w; qobject_cast(_trayImpl)->setMainWindow(w); } void TrayIcon::setVisible(bool visible) { qobject_cast(_trayImpl)->setVisible(visible); } bool TrayIcon::isVisible() const { return qobject_cast(_trayImpl)->isVisible(); } void TrayIcon::loadSettings() { QSettings config; qobject_cast(_trayImpl)->setVisible(config.value("TrayIcon/visible", true).toBool()); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-qstardict-1.3/qstardict/trayicon.h000066400000000000000000000060221323166163100213500ustar00rootroot00000000000000/***************************************************************************** * trayicon.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef TRAYICON_H #define TRAYICON_H #include #include "../plugins/trayplugin.h" class QAction; class QTimer; namespace QStarDict { class TrayIconDefaultImpl : public QObject, public TrayIconPlugin { Q_OBJECT Q_INTERFACES(QStarDict::TrayIconPlugin) QSystemTrayIcon *sti; QWidget *associatedWidget; QAction *actionMainWindow; public: TrayIconDefaultImpl(QObject *parent); ~TrayIconDefaultImpl(); TrayCompat isDECompatible(); void initTray(); void uninitTray(); Features features() const; void setContextMenu(QMenu *menu); void setMainWindow(QWidget *w); void setScanEnabled(bool enabled); void setVisible(bool visible); bool isVisible() const; signals: void translateClipboard(); private slots: void on_activated(QSystemTrayIcon::ActivationReason reason); }; class TrayIcon: public QObject { Q_OBJECT public: TrayIcon(QObject *parent = 0); virtual ~TrayIcon(); void saveSettings(); void setMainWindow(QWidget *w); void setVisible(bool visible); bool isVisible() const; public slots: void reinit(); private slots: void on_actionSettings_triggered(); void setScanEnabled(bool enabled); void on_trayImplDestroyed(QObject *o); void translateClipboard(); void on_pluginLoaded(const QString &pluginId); private: void loadSettings(); QWidget *_mainWindow; QObject *_trayImpl; QObject *_defaultTrayImpl; QTimer *_initTrayTimer; QObjectList _trayCandidat; QObjectList _trayFallbackCandidat; }; } #endif // TRAYICON_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-qstardict-1.3/qstardict/util.cpp000066400000000000000000000001041323166163100210230ustar00rootroot00000000000000#include "util.h" namespace QStarDict { } // namespace QStarDict qstardict-qstardict-1.3/qstardict/util.h000066400000000000000000000007171323166163100205020ustar00rootroot00000000000000#ifndef QSTARDICT_UTIL_H #define QSTARDICT_UTIL_H #include #if QT_VERSION < QT_VERSION_CHECK(5,0,0) # include #else # include #endif namespace QStarDict { class Util { public: static inline QString htmlEscape(const QString &text) { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) return Qt::escape(text); #else return text.toHtmlEscaped(); #endif } }; } // namespace QStarDict #endif // QSTARDICT_UTIL_H qstardict-qstardict-1.3/qxt/000077500000000000000000000000001323166163100161655ustar00rootroot00000000000000qstardict-qstardict-1.3/qxt/AUTHORS000066400000000000000000000010331323166163100172320ustar00rootroot00000000000000== main developers == Arvid Picciani Adam Higerd J-P Nurmi Benjamin Zeller == contributors == Gabriel Assis Bezerra Scott Aron Bloom Lawrence Holtsclaw Marcin Jakubowski Dominique Leducq Marcus Lindblom Konstantin Molchanov Thomas Mueller Bjørn Erik Nilsen Kaleb Pederson Matthew Schnee André Somers Alex Unden Chris Vickery Benjamin Wohlwend thanks everyone not named for all the patches, bug reports, beta tests, and the free beer :-) qstardict-qstardict-1.3/qxt/COPYING000066400000000000000000000035111323166163100172200ustar00rootroot00000000000000/**************************************************************************** ** 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. ** ** *****************************************************************************/ qstardict-qstardict-1.3/qxt/FROM000066400000000000000000000003001323166163100166440ustar00rootroot00000000000000qstardict/qtx directory is updated using update.sh script from the upstream repository. It is updated this way because using it as a submodule is incompatible with Github automatic releases. qstardict-qstardict-1.3/qxt/patch-1-x11.patch000066400000000000000000000011401323166163100210460ustar00rootroot00000000000000Only in .: patch-x11.patch diff -u ./qxtglobalshortcut_x11.cpp ../qxt-1/qxtglobalshortcut_x11.cpp --- ./qxtglobalshortcut_x11.cpp 2016-12-07 00:54:54.000000000 +0300 +++ ../qxt-1/qxtglobalshortcut_x11.cpp 2016-12-07 00:54:43.000000000 +0300 @@ -30,7 +30,6 @@ *****************************************************************************/ #include -#include #if QT_VERSION < QT_VERSION_CHECK(5,0,0) # include #else @@ -38,6 +37,7 @@ # include # include #endif +#include namespace { qstardict-qstardict-1.3/qxt/qxtglobal.cpp000066400000000000000000000206671323166163100207010ustar00rootroot00000000000000 /**************************************************************************** ** 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 "qxtglobal.h" /*! \headerfile \title Global Qxt Declarations \inmodule QxtCore \brief The header provides basic declarations and is included by all other Qxt headers. */ /*! \macro QXT_VERSION \relates This macro expands a numeric value of the form 0xMMNNPP (MM = major, NN = minor, PP = patch) that specifies Qxt's version number. For example, if you compile your application against Qxt 0.4.0, the QXT_VERSION macro will expand to 0x000400. You can use QXT_VERSION to use the latest Qt features where available. For example: \code #if QXT_VERSION >= 0x000400 qxtTabWidget->setTabMovementMode(QxtTabWidget::InPlaceMovement); #endif \endcode \sa QXT_VERSION_STR, qxtVersion() */ /*! \macro QXT_VERSION_STR \relates This macro expands to a string that specifies Qxt's version number (for example, "0.4.0"). This is the version against which the application is compiled. \sa qxtVersion(), QXT_VERSION */ /*! \relates Returns the version number of Qxt at run-time as a string (for example, "0.4.0"). This may be a different version than the version the application was compiled against. \sa QXT_VERSION_STR */ const char * qxtVersion() { return QXT_VERSION_STR; } /*! \headerfile \title The Qxt private implementation \inmodule QxtCore \brief The header provides tools for hiding details of a class. Application code generally doesn't have to be concerned about hiding its implementation details, but when writing library code it is important to maintain a constant interface, both source and binary. Maintaining a constant source interface is easy enough, but keeping the binary interface constant means moving implementation details into a private class. The PIMPL, or d-pointer, idiom is a common method of implementing this separation. QxtPimpl offers a convenient way to connect the public and private sides of your class. \section1 Getting Started Before you declare the public class, you need to make a forward declaration of the private class. The private class must have the same name as the public class, followed by the word Private. For example, a class named MyTest would declare the private class with: \code class MyTestPrivate; \endcode \section1 The Public Class Generally, you shouldn't keep any data members in the public class without a good reason. Functions that are part of the public interface should be declared in the public class, and functions that need to be available to subclasses (for calling or overriding) should be in the protected section of the public class. To connect the private class to the public class, include the QXT_DECLARE_PRIVATE macro in the private section of the public class. In the example above, the private class is connected as follows: \code private: QXT_DECLARE_PRIVATE(MyTest) \endcode Additionally, you must include the QXT_INIT_PRIVATE macro in the public class's constructor. Continuing with the MyTest example, your constructor might look like this: \code MyTest::MyTest() { // initialization QXT_INIT_PRIVATE(MyTest); } \endcode \section1 The Private Class As mentioned above, data members should usually be kept in the private class. This allows the memory layout of the private class to change without breaking binary compatibility for the public class. Functions that exist only as implementation details, or functions that need access to private data members, should be implemented here. To define the private class, inherit from the template QxtPrivate class, and include the QXT_DECLARE_PUBLIC macro in its public section. The template parameter should be the name of the public class. For example: \code class MyTestPrivate : public QxtPrivate { public: MyTestPrivate(); QXT_DECLARE_PUBLIC(MyTest) }; \endcode \section1 Accessing Private Members Use the qxt_d() function (actually a function-like object) from functions in the public class to access the private class. Similarly, functions in the private class can invoke functions in the public class by using the qxt_p() function (this one's actually a function). For example, assume that MyTest has methods named getFoobar and doBaz(), and MyTestPrivate has a member named foobar and a method named doQuux(). The code might resemble this example: \code int MyTest::getFoobar() { return qxt_d().foobar; } void MyTestPrivate::doQuux() { qxt_p().doBaz(foobar); } \endcode */ /*! * \macro QXT_DECLARE_PRIVATE(PUB) * \relates * Declares that a public class has a related private class. * * This shuold be put in the private section of the public class. The * parameter \a PUB must be the name of the public class. */ /*! * \macro QXT_DECLARE_PUBLIC(PUB) * \relates * Declares that a private class has a related public class named \a PUB. * * This may be put anywhere in the declaration of the private class. The parameter is the name of the public class. */ /*! * \macro QXT_INIT_PRIVATE(PUB) * \relates * Initializes resources owned by the private class. * * This should be called from the public class's constructor, * before qxt_d() is used for the first time. The parameter \a PUB must be * the name of the public class. */ /*! * \macro QXT_D(PUB) * \relates * Returns a reference in the current scope named "d" to the private class * associated with the public class \a PUB. * * This function is only available in a class using QXT_DECLARE_PRIVATE(). */ /*! * \macro QXT_P(PUB) * \relates * Creates a reference in the current scope named "q" to the public class * named \a PUB. * * This macro only works in a class using QXT_DECLARE_PUBLIC(). */ /*! * \fn QxtPrivate& PUB::qxt_d() * \relates * Returns a reference to the private class. * * This function is only available in a class using \a QXT_DECLARE_PRIVATE. */ /*! * \fn const QxtPrivate& PUB::qxt_d() const * \relates * Returns a const reference to the private class. * * This function is only available in a class using \a QXT_DECLARE_PRIVATE. * This overload will be automatically used in const functions. */ /*! * \fn PUB& QxtPrivate::qxt_p() * \relates * Returns a reference to the public class. * * This function is only available in a class using QXT_DECLARE_PUBLIC(). */ /*! * \fn const PUB& QxtPrivate::qxt_p() const * \relates * Returns a const reference to the public class. * * This function is only available in a class using QXT_DECLARE_PUBLIC(). * This overload will be automatically used in const functions. */ qstardict-qstardict-1.3/qxt/qxtglobal.h000066400000000000000000000156171323166163100203450ustar00rootroot00000000000000 /**************************************************************************** ** 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 QXTGLOBAL_H #define QXTGLOBAL_H #include #define QXT_VERSION 0x000700 #define QXT_VERSION_STR "0.7.0" //--------------------------global macros------------------------------ #ifndef QXT_NO_MACROS #ifndef _countof #define _countof(x) (sizeof(x)/sizeof(*x)) #endif #endif // QXT_NO_MACROS //--------------------------export macros------------------------------ #define QXT_DLLEXPORT DO_NOT_USE_THIS_ANYMORE #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_CORE) # define QXT_CORE_EXPORT Q_DECL_EXPORT # else # define QXT_CORE_EXPORT Q_DECL_IMPORT # endif #else # define QXT_CORE_EXPORT #endif // BUILD_QXT_CORE #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_GUI) # define QXT_GUI_EXPORT Q_DECL_EXPORT # else # define QXT_GUI_EXPORT Q_DECL_IMPORT # endif #else # define QXT_GUI_EXPORT #endif // BUILD_QXT_GUI #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_NETWORK) # define QXT_NETWORK_EXPORT Q_DECL_EXPORT # else # define QXT_NETWORK_EXPORT Q_DECL_IMPORT # endif #else # define QXT_NETWORK_EXPORT #endif // BUILD_QXT_NETWORK #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_SQL) # define QXT_SQL_EXPORT Q_DECL_EXPORT # else # define QXT_SQL_EXPORT Q_DECL_IMPORT # endif #else # define QXT_SQL_EXPORT #endif // BUILD_QXT_SQL #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_WEB) # define QXT_WEB_EXPORT Q_DECL_EXPORT # else # define QXT_WEB_EXPORT Q_DECL_IMPORT # endif #else # define QXT_WEB_EXPORT #endif // BUILD_QXT_WEB #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_BERKELEY) # define QXT_BERKELEY_EXPORT Q_DECL_EXPORT # else # define QXT_BERKELEY_EXPORT Q_DECL_IMPORT # endif #else # define QXT_BERKELEY_EXPORT #endif // BUILD_QXT_BERKELEY #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_ZEROCONF) # define QXT_ZEROCONF_EXPORT Q_DECL_EXPORT # else # define QXT_ZEROCONF_EXPORT Q_DECL_IMPORT # endif #else # define QXT_ZEROCONF_EXPORT #endif // QXT_ZEROCONF_EXPORT #if defined(BUILD_QXT_CORE) || defined(BUILD_QXT_GUI) || defined(BUILD_QXT_SQL) || defined(BUILD_QXT_NETWORK) || defined(BUILD_QXT_WEB) || defined(BUILD_QXT_BERKELEY) || defined(BUILD_QXT_ZEROCONF) # define BUILD_QXT #endif QXT_CORE_EXPORT const char* qxtVersion(); #ifndef QT_BEGIN_NAMESPACE #define QT_BEGIN_NAMESPACE #endif #ifndef QT_END_NAMESPACE #define QT_END_NAMESPACE #endif #ifndef QT_FORWARD_DECLARE_CLASS #define QT_FORWARD_DECLARE_CLASS(Class) class Class; #endif /**************************************************************************** ** This file is derived from code bearing the following notice: ** The sole author of this file, Adam Higerd, has explicitly disclaimed all ** copyright interest and protection for the content within. This file has ** been placed in the public domain according to United States copyright ** statute and case law. In jurisdictions where this public domain dedication ** is not legally recognized, anyone who receives a copy of this file is ** permitted to use, modify, duplicate, and redistribute this file, in whole ** or in part, with no restrictions or conditions. In these jurisdictions, ** this file shall be copyright (C) 2006-2008 by Adam Higerd. ****************************************************************************/ #define QXT_DECLARE_PRIVATE(PUB) friend class PUB##Private; QxtPrivateInterface qxt_d; #define QXT_DECLARE_PUBLIC(PUB) friend class PUB; #define QXT_INIT_PRIVATE(PUB) qxt_d.setPublic(this); #define QXT_D(PUB) PUB##Private& d = qxt_d() #define QXT_P(PUB) PUB& p = qxt_p() template class QxtPrivate { public: virtual ~QxtPrivate() {} inline void QXT_setPublic(PUB* pub) { qxt_p_ptr = pub; } protected: inline PUB& qxt_p() { return *qxt_p_ptr; } inline const PUB& qxt_p() const { return *qxt_p_ptr; } inline PUB* qxt_ptr() { return qxt_p_ptr; } inline const PUB* qxt_ptr() const { return qxt_p_ptr; } private: PUB* qxt_p_ptr; }; template class QxtPrivateInterface { friend class QxtPrivate; public: QxtPrivateInterface() { pvt = new PVT; } ~QxtPrivateInterface() { delete pvt; } inline void setPublic(PUB* pub) { pvt->QXT_setPublic(pub); } inline PVT& operator()() { return *static_cast(pvt); } inline const PVT& operator()() const { return *static_cast(pvt); } inline PVT * operator->() { return static_cast(pvt); } inline const PVT * operator->() const { return static_cast(pvt); } private: QxtPrivateInterface(const QxtPrivateInterface&) { } QxtPrivateInterface& operator=(const QxtPrivateInterface&) { } QxtPrivate* pvt; }; #endif // QXT_GLOBAL qstardict-qstardict-1.3/qxt/qxtglobalshortcut.cpp000066400000000000000000000170031323166163100224630ustar00rootroot00000000000000#include "qxtglobalshortcut.h" /**************************************************************************** ** 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 #ifndef Q_OS_MAC int QxtGlobalShortcutPrivate::ref = 0; # if QT_VERSION < QT_VERSION_CHECK(5,0,0) QAbstractEventDispatcher::EventFilter QxtGlobalShortcutPrivate::prevEventFilter = 0; # endif #endif // Q_OS_MAC QHash, QxtGlobalShortcut*> QxtGlobalShortcutPrivate::shortcuts; QxtGlobalShortcutPrivate::QxtGlobalShortcutPrivate() : enabled(true), key(Qt::Key(0)), mods(Qt::NoModifier) { #ifndef Q_OS_MAC if (ref == 0) { # if QT_VERSION < QT_VERSION_CHECK(5,0,0) prevEventFilter = QAbstractEventDispatcher::instance()->setEventFilter(eventFilter); # else QAbstractEventDispatcher::instance()->installNativeEventFilter(this); #endif } ++ref; #endif // Q_OS_MAC } QxtGlobalShortcutPrivate::~QxtGlobalShortcutPrivate() { #ifndef Q_OS_MAC --ref; if (ref == 0) { QAbstractEventDispatcher *ed = QAbstractEventDispatcher::instance(); if (ed != 0) { # if QT_VERSION < QT_VERSION_CHECK(5,0,0) ed->setEventFilter(prevEventFilter); # else ed->removeNativeEventFilter(this); # endif } } #endif // Q_OS_MAC } bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut) { 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(qMakePair(nativeKey, nativeMods), &qxt_p()); else qWarning() << "QxtGlobalShortcut failed to register:" << QKeySequence(key + mods).toString(); return res; } bool QxtGlobalShortcutPrivate::unsetShortcut() { bool res = false; const quint32 nativeKey = nativeKeycode(key); const quint32 nativeMods = nativeModifiers(mods); if (shortcuts.value(qMakePair(nativeKey, nativeMods)) == &qxt_p()) res = unregisterShortcut(nativeKey, nativeMods); if (res) shortcuts.remove(qMakePair(nativeKey, nativeMods)); else qWarning() << "QxtGlobalShortcut failed to unregister:" << QKeySequence(key + mods).toString(); key = Qt::Key(0); mods = Qt::KeyboardModifiers(0); return res; } void QxtGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods) { QxtGlobalShortcut* shortcut = shortcuts.value(qMakePair(nativeKey, nativeMods)); if (shortcut && shortcut->isEnabled()) emit shortcut->activated(); } /*! \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) { QXT_INIT_PRIVATE(QxtGlobalShortcut); } /*! Constructs a new QxtGlobalShortcut with \a shortcut and \a parent. */ QxtGlobalShortcut::QxtGlobalShortcut(const QKeySequence& shortcut, QObject* parent) : QObject(parent) { QXT_INIT_PRIVATE(QxtGlobalShortcut); setShortcut(shortcut); } /*! Destructs the QxtGlobalShortcut. */ QxtGlobalShortcut::~QxtGlobalShortcut() { if (qxt_d().key != 0) qxt_d().unsetShortcut(); } /*! \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 { return QKeySequence(qxt_d().key | qxt_d().mods); } bool QxtGlobalShortcut::setShortcut(const QKeySequence& shortcut) { if (qxt_d().key != 0) qxt_d().unsetShortcut(); return qxt_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 { return qxt_d().enabled; } void QxtGlobalShortcut::setEnabled(bool enabled) { qxt_d().enabled = enabled; } /*! Sets the shortcut \a disabled. \sa enabled */ void QxtGlobalShortcut::setDisabled(bool disabled) { qxt_d().enabled = !disabled; } qstardict-qstardict-1.3/qxt/qxtglobalshortcut.h000066400000000000000000000053551323166163100221370ustar00rootroot00000000000000#ifndef QXTGLOBALSHORTCUT_H /**************************************************************************** ** 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. ** ** *****************************************************************************/ #define QXTGLOBALSHORTCUT_H #include "qxtglobal.h" #include #include class QxtGlobalShortcutPrivate; class QXT_GUI_EXPORT QxtGlobalShortcut : public QObject { Q_OBJECT QXT_DECLARE_PRIVATE(QxtGlobalShortcut) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut) public: explicit QxtGlobalShortcut(QObject* parent = 0); explicit QxtGlobalShortcut(const QKeySequence& shortcut, QObject* parent = 0); virtual ~QxtGlobalShortcut(); QKeySequence shortcut() const; bool setShortcut(const QKeySequence& shortcut); bool isEnabled() const; public Q_SLOTS: void setEnabled(bool enabled = true); void setDisabled(bool disabled = true); Q_SIGNALS: void activated(); }; #endif // QXTGLOBALSHORTCUT_H qstardict-qstardict-1.3/qxt/qxtglobalshortcut_mac.cpp000066400000000000000000000217051323166163100233070ustar00rootroot00000000000000#include /**************************************************************************** ** 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 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; } 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); } qstardict-qstardict-1.3/qxt/qxtglobalshortcut_p.h000066400000000000000000000066541323166163100224610ustar00rootroot00000000000000#ifndef QXTGLOBALSHORTCUT_P_H /**************************************************************************** ** 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. ** ** *****************************************************************************/ #define QXTGLOBALSHORTCUT_P_H #include "qxtglobalshortcut.h" #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) #include #endif class QxtGlobalShortcutPrivate : public QxtPrivate #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) && !defined(Q_OS_MAC) ,public QAbstractNativeEventFilter #endif { public: QXT_DECLARE_PUBLIC(QxtGlobalShortcut) QxtGlobalShortcutPrivate(); ~QxtGlobalShortcutPrivate(); bool enabled; Qt::Key key; Qt::KeyboardModifiers mods; bool setShortcut(const QKeySequence& shortcut); bool unsetShortcut(); static bool error; #ifndef Q_OS_MAC static int ref; #if QT_VERSION < QT_VERSION_CHECK(5,0,0) static QAbstractEventDispatcher::EventFilter prevEventFilter; static bool eventFilter(void* message); #else virtual bool nativeEventFilter(const QByteArray & eventType, void * message, long * result); #endif // QT_VERSION < QT_VERSION_CHECK(5,0,0) #endif // Q_OS_MAC static void 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 qstardict-qstardict-1.3/qxt/qxtglobalshortcut_win.cpp000066400000000000000000000164201323166163100233420ustar00rootroot00000000000000#include "qxtglobalshortcut_p.h" /**************************************************************************** ** 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 #if QT_VERSION < QT_VERSION_CHECK(5,0,0) bool QxtGlobalShortcutPrivate::eventFilter(void* message) { #else bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType, void * message, long * result) { Q_UNUSED(eventType); Q_UNUSED(result); #endif 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); } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) return prevEventFilter ? prevEventFilter(message) : false; #else return false; #endif } 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); } qstardict-qstardict-1.3/qxt/qxtglobalshortcut_x11.cpp000066400000000000000000000174241323166163100231630ustar00rootroot00000000000000#include "qxtglobalshortcut_p.h" /**************************************************************************** ** 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 #if QT_VERSION < QT_VERSION_CHECK(5,0,0) # include #else # include # include # include #endif #include namespace { const QVector maskModifiers = QVector() << 0 << Mod2Mask << LockMask << (Mod2Mask | LockMask); typedef int (*X11ErrorHandler)(Display *display, XErrorEvent *event); class QxtX11ErrorHandler { public: static bool error; static int qxtX11ErrorHandler(Display *display, XErrorEvent *event) { Q_UNUSED(display); switch (event->error_code) { case BadAccess: case BadValue: case BadWindow: if (event->request_code == 33 /* X_GrabKey */ || event->request_code == 34 /* X_UngrabKey */) { error = true; //TODO: //char errstr[256]; //XGetErrorText(dpy, err->error_code, errstr, 256); } } return 0; } QxtX11ErrorHandler() { error = false; m_previousErrorHandler = XSetErrorHandler(qxtX11ErrorHandler); } ~QxtX11ErrorHandler() { XSetErrorHandler(m_previousErrorHandler); } private: X11ErrorHandler m_previousErrorHandler; }; bool QxtX11ErrorHandler::error = false; class QxtX11Data { public: QxtX11Data() { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) m_display = QX11Info::display(); #else QPlatformNativeInterface *native = qApp->platformNativeInterface(); void *display = native->nativeResourceForScreen(QByteArray("display"), QGuiApplication::primaryScreen()); m_display = reinterpret_cast(display); #endif } bool isValid() { return m_display != 0; } Display *display() { Q_ASSERT(isValid()); return m_display; } Window rootWindow() { return DefaultRootWindow(display()); } bool grabKey(quint32 keycode, quint32 modifiers, Window window) { QxtX11ErrorHandler errorHandler; for (int i = 0; !errorHandler.error && i < maskModifiers.size(); ++i) { XGrabKey(display(), keycode, modifiers | maskModifiers[i], window, True, GrabModeAsync, GrabModeAsync); } if (errorHandler.error) { ungrabKey(keycode, modifiers, window); return false; } return true; } bool ungrabKey(quint32 keycode, quint32 modifiers, Window window) { QxtX11ErrorHandler errorHandler; foreach (quint32 maskMods, maskModifiers) { XUngrabKey(display(), keycode, modifiers | maskMods, window); } return !errorHandler.error; } private: Display *m_display; }; } // namespace #if QT_VERSION < QT_VERSION_CHECK(5,0,0) bool QxtGlobalShortcutPrivate::eventFilter(void *message) { XEvent *event = static_cast(message); if (event->type == KeyPress) { XKeyEvent *key = reinterpret_cast(event); unsigned int keycode = key->keycode; unsigned int keystate = key->state; #else bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType, void *message, long *result) { Q_UNUSED(result); xcb_key_press_event_t *kev = 0; if (eventType == "xcb_generic_event_t") { xcb_generic_event_t *ev = static_cast(message); if ((ev->response_type & 127) == XCB_KEY_PRESS) kev = static_cast(message); } if (kev != 0) { unsigned int keycode = kev->detail; unsigned int keystate = 0; if(kev->state & XCB_MOD_MASK_1) keystate |= Mod1Mask; if(kev->state & XCB_MOD_MASK_CONTROL) keystate |= ControlMask; if(kev->state & XCB_MOD_MASK_4) keystate |= Mod4Mask; if(kev->state & XCB_MOD_MASK_SHIFT) keystate |= ShiftMask; #endif activateShortcut(keycode, // Mod1Mask == Alt, Mod4Mask == Meta keystate & (ShiftMask | ControlMask | Mod1Mask | Mod4Mask)); } #if QT_VERSION < QT_VERSION_CHECK(5,0,0) return prevEventFilter ? prevEventFilter(message) : false; #else return false; #endif } quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) { // ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask quint32 native = 0; if (modifiers & Qt::ShiftModifier) native |= ShiftMask; if (modifiers & Qt::ControlModifier) native |= ControlMask; if (modifiers & Qt::AltModifier) native |= Mod1Mask; if (modifiers & Qt::MetaModifier) native |= Mod4Mask; // TODO: resolve these? //if (modifiers & Qt::MetaModifier) //if (modifiers & Qt::KeypadModifier) //if (modifiers & Qt::GroupSwitchModifier) return native; } quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key) { QxtX11Data x11; if (!x11.isValid()) return 0; KeySym keysym = XStringToKeysym(QKeySequence(key).toString().toLatin1().data()); if (keysym == NoSymbol) keysym = static_cast(key); return XKeysymToKeycode(x11.display(), keysym); } bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods) { QxtX11Data x11; return x11.isValid() && x11.grabKey(nativeKey, nativeMods, x11.rootWindow()); } bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods) { QxtX11Data x11; return x11.isValid() && x11.ungrabKey(nativeKey, nativeMods, x11.rootWindow()); } qstardict-qstardict-1.3/qxt/update.sh000077500000000000000000000004531323166163100200100ustar00rootroot00000000000000#!/bin/sh git clone https://bitbucket.org/libqxt/libqxt || (cd libqxt && git pull && cd ..) || exit 1 for i in AUTHORS COPYING src/core/qxtglobal.* src/widgets/{win,mac,x11,}/qxtglobalshortcut*; do for j in libqxt/$i; do echo "cp $j ." cp $j . done done cat *.patch | patch